diff --git a/apps/docs/content/updates/2026-08-06.md b/apps/docs/content/updates/2026-08-07.md similarity index 99% rename from apps/docs/content/updates/2026-08-06.md rename to apps/docs/content/updates/2026-08-07.md index b7e6d61c..b8156a2d 100644 --- a/apps/docs/content/updates/2026-08-06.md +++ b/apps/docs/content/updates/2026-08-07.md @@ -1,5 +1,5 @@ --- -date: '2026-08-06' +date: '2026-08-07' title: 'Вход в CLI через браузер, архивные чаты в списке' --- diff --git a/apps/docs/data/releases.json b/apps/docs/data/releases.json index 0806c13d..68dd0461 100644 --- a/apps/docs/data/releases.json +++ b/apps/docs/data/releases.json @@ -2,7 +2,7 @@ { "product": "sdk", "version": "1.2.0", - "date": "2026-08-06", + "date": "2026-08-07", "changes": [ { "type": "+", @@ -17,7 +17,7 @@ { "product": "cli", "version": "2026.8.1", - "date": "2026-08-06", + "date": "2026-08-07", "changes": [ { "type": "+", @@ -72,7 +72,7 @@ { "product": "n8n", "version": "2.0.18", - "date": "2026-08-06", + "date": "2026-08-07", "changes": [ { "type": "+", diff --git a/apps/docs/public/llms.txt b/apps/docs/public/llms.txt index 0d019812..b2cca251 100644 --- a/apps/docs/public/llms.txt +++ b/apps/docs/public/llms.txt @@ -300,7 +300,7 @@ C#: new PachcaClient("TOKEN") → await client.Messages.CreateMessage - [Получение подписи, ключа и других параметров](https://dev.pachca.com/api/files/uploads.md): POST /uploads ## Обновления -- [06 августа 2026 — Вход в CLI через браузер, архивные чаты в списке](https://dev.pachca.com/updates/2026-08-06.md) +- [07 августа 2026 — Вход в CLI через браузер, архивные чаты в списке](https://dev.pachca.com/updates/2026-08-07.md) - [01 августа 2026 — Проверка имени файла, уточнения в журнале аудита и страница «Права и роли»](https://dev.pachca.com/updates/2026-08-01.md) - [28 июля 2026 — Уточнения в описании API](https://dev.pachca.com/updates/2026-07-28.md) - [24 июля 2026 — Самостоятельные треды и аудит видеозвонков](https://dev.pachca.com/updates/2026-07-24.md) diff --git a/apps/docs/public/updates.md b/apps/docs/public/updates.md index 61173e1b..2c8f368a 100644 --- a/apps/docs/public/updates.md +++ b/apps/docs/public/updates.md @@ -8,7 +8,7 @@ ### Вход в CLI через браузер, архивные чаты в списке -_06 августа 2026_ +_07 августа 2026_ В CLI появился вход через браузер: команда `pachca auth login` вместо выписывания токена в интерфейсе. Токен живёт час, продлевается сам и diff --git a/apps/docs/public/updates/2026-08-06.md b/apps/docs/public/updates/2026-08-07.md similarity index 99% rename from apps/docs/public/updates/2026-08-06.md rename to apps/docs/public/updates/2026-08-07.md index 2e0beea2..6f588a82 100644 --- a/apps/docs/public/updates/2026-08-06.md +++ b/apps/docs/public/updates/2026-08-07.md @@ -2,7 +2,7 @@ # Вход в CLI через браузер, архивные чаты в списке -_06 августа 2026_ +_07 августа 2026_ В CLI появился вход через браузер: команда `pachca auth login` вместо выписывания токена в интерфейсе. Токен живёт час, продлевается сам и diff --git a/apps/docs/public/updates/season/summer-2026.md b/apps/docs/public/updates/season/summer-2026.md index 2f5000f9..7a1f0b71 100644 --- a/apps/docs/public/updates/season/summer-2026.md +++ b/apps/docs/public/updates/season/summer-2026.md @@ -4,7 +4,7 @@ ### Вход в CLI через браузер, архивные чаты в списке -_06 августа 2026_ +_07 августа 2026_ В CLI появился вход через браузер: команда `pachca auth login` вместо выписывания токена в интерфейсе. Токен живёт час, продлевается сам и diff --git a/integrations/n8n/CHANGELOG.md b/integrations/n8n/CHANGELOG.md index 74ff177d..b899793f 100644 --- a/integrations/n8n/CHANGELOG.md +++ b/integrations/n8n/CHANGELOG.md @@ -2,7 +2,7 @@ # Changelog -## 2.0.18 (2026-08-06) +## 2.0.18 (2026-08-07) ### Improvements diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index c311cb5b..6b6ffb07 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 2026.8.1 (6 августа 2026) +## 2026.8.1 (7 августа 2026) - **Добавлено** (auth login): Вход через браузер — без ручной вставки токена. CLI показывает адрес и код, открывает браузер и ждёт подтверждения. Токен такого входа живёт час и продлевается сам перед каждой командой; при параллельных процессах обновляет только один, остальные ждут результат. Флаг `--no-browser` печатает адрес и код, не открывая браузер. `--token` и `PACHCA_TOKEN` работают как раньше — это путь для CI и агентов - **Добавлено** (auth login): Токен хранится в хранилище ключей ОС — Keychain на macOS, Secret Service на Linux, Диспетчер учётных данных на Windows; в файле конфигурации остаются только имя, почта и права. Где хранилища нет (headless-машина, контейнер), CLI сохраняет токен в файл и сообщает об этом при входе. Отказаться от хранилища: флаг `--insecure-storage` или переменная `PACHCA_SECRET_STORE=file` diff --git a/packages/cli/src/data/changelog.json b/packages/cli/src/data/changelog.json index 6353c290..9fe1fe81 100644 --- a/packages/cli/src/data/changelog.json +++ b/packages/cli/src/data/changelog.json @@ -1,7 +1,7 @@ [ { "version": "2026.8.1", - "date": "6 августа 2026", + "date": "7 августа 2026", "changes": [ { "type": "+", diff --git a/scripts/check-changelog-sync.mjs b/scripts/check-changelog-sync.mjs index 042594e5..bdc0fb44 100644 --- a/scripts/check-changelog-sync.mjs +++ b/scripts/check-changelog-sync.mjs @@ -130,6 +130,55 @@ function releasesForProduct(ref, product) { } } +/** + * Whether the release entries declare a release, rather than just fixing the + * metadata of one that already shipped. + * + * A release slipping past midnight is normal: the entry is written on one day + * and merged on the next, and the date then has to be corrected. That correction + * touches no code, so without this the gate would demand a code change for a + * pure date fix — and the only way to satisfy it would be to invent one. + * + * A release is declared when a version appears, disappears, or its list of + * changes is edited. A date moving on a version that was already there is not. + */ +function declaresRelease(before, after) { + const byVersion = (list) => new Map(list.map((r) => [r.version, r])); + const prev = byVersion(before); + const next = byVersion(after); + + if (prev.size !== next.size) return true; + + for (const [version, entry] of next) { + const old = prev.get(version); + if (!old) return true; + if (JSON.stringify(old.changes) !== JSON.stringify(entry.changes)) return true; + } + return false; +} + +/** + * Whether a package's own changelog changed in substance, or only in its dates. + * + * Same reason as `declaresRelease`: a release written on one day and merged on + * the next needs its date corrected, and that correction is not a release. + * Dates are blanked on both sides before comparing — in the CLI's JSON entries + * and in the `## 2.0.18 (2026-08-07)` headings of the n8n changelog. + */ +function contentChangedBeyondDate(base, file) { + const withoutDates = (text) => + text.replace(/"date":\s*"[^"]*"/g, '"date":""').replace(/^(##\s+\S+)\s+\([^)]*\)/gm, '$1'); + + try { + return ( + withoutDates(sh(`git show ${base}:${file}`)) !== withoutDates(sh(`git show HEAD:${file}`)) + ); + } catch { + // A file that is new or gone on either side is a real change. + return true; + } +} + const base = resolveBase(); if (!base) { // Fail closed. Skipping here turned the whole gate into a no-op whenever the @@ -157,10 +206,12 @@ for (const pkg of PACKAGES) { // Editing a generated changelog alone is sync-fixing, not declaring a // release — see the comment on `sourceChangelogs` in the PACKAGES table. const ownChanged = - pkg.sourceChangelogs.length > 0 && changedFiles(base, pkg.sourceChangelogs).length > 0; - const releasesChanged = - JSON.stringify(releasesForProduct(base, pkg.product)) !== - JSON.stringify(releasesForProduct('HEAD', pkg.product)); + pkg.sourceChangelogs.length > 0 && + changedFiles(base, pkg.sourceChangelogs).some((file) => contentChangedBeyondDate(base, file)); + const releasesChanged = declaresRelease( + releasesForProduct(base, pkg.product), + releasesForProduct('HEAD', pkg.product) + ); const changelogWritten = ownChanged || releasesChanged; const changelogTargets = [`${RELEASES} (product "${pkg.product}")`, ...pkg.ownChangelogs].join(