# История изменений (/ru/docs/gcal/changelog)

Заметные изменения в `@wirecat/gcal-cli`. По одному разделу на версию, новые сверху.

## 0.1.1 — 29.10.2026 [#011--29102026]

### Исправлено [#исправлено]

- **Заголовок руководства для агента (`skills/gcal-cli/SKILL.md`) снова корректный YAML.** Его `description`
  содержал `Calendar: sync`, что парсер YAML читает как вложенное отображение, поэтому строгие загрузчики навыков и
  индекс навыков на сайте WireCat отклоняли файл. Текст не изменился, кроме тире вместо этого двоеточия.

## 0.1.0 — 29.10.2026 [#010--29102026]

### Добавлено [#добавлено]

- **`gcal <profile> session start | status | end` входит в Google через браузер с доступом к Календарю только на
  чтение.** Пока используется ваш собственный клиент Google OAuth (`--client-file` или `GCAL_GOOGLE_CLIENT_ID` и
  `GCAL_GOOGLE_CLIENT_SECRET`); как его создать, описано в [настройках](/llms.mdx/docs/ru/gcal/configuration/content.md#your-own-google-client).
  Вход хранится в системном хранилище ключей или, с `--credential-storage file`, в личном файле (права 600) там, где
  хранилище ключей не работает. `session status --check` спрашивает у Google, действует ли вход. `--grant write`
  дополнительно запрашивает `calendar.events`, нужный для записи событий, а `--grant sharing` — `calendar.acls`,
  нужный для управления доступом. `gcal session list` выводит профили на этом компьютере, у каждого `signed_in`,
  `account` и `credential_storage`; ни одна команда не выбирает профиль за вас.
- **`gcal <profile> sync` копирует ваши календари в локальное хранилище WireCat, и команды чтения работают без
  сети.** `calendars list | sync | unsync`, `events list | show`, `search`, `people list | link` и
  `links review | resolve` — общие календарные команды WireCat, поэтому другие инструменты WireCat видят те же
  события и тех же людей. Первая синхронизация читает ваши собственные календари от года назад до трёх месяцев
  вперёд; каждая следующая просит у Google только изменения. Повторения повторяющегося события сохраняются по
  отдельности, включая отменённые. `sync --embed` дополнительно индексирует события для поиска по смыслу. Каждый
  ответ перечисляет в `untrusted` поля, которые написал отправитель приглашения, чтобы агент читал их как данные.
- **Большая синхронизация продолжается за несколько запусков.** `sync` сама останавливается до истечения лимита
  времени (15 минут в терминале, 45 секунд через MCP; `--timeout` его меняет, `--max-pages <n>` дополнительно
  уменьшает число запросов к Google) и сохраняет результат после каждой страницы. Частичный ответ содержит
  `state: "partial"`, сколько уже сделано, и команду для следующего запуска. `--rescan` начинает все календари
  заново. `gcal <profile> status` показывает ход синхронизации каждого календаря, `partial` или `complete`, и сколько
  времени прошло с последнего продвижения.
- **`gcal <profile> calendars busy` показывает, когда календари и люди заняты**, по ответу Google о
  занятости, который говорит когда, но никогда — чем. `--duration-minutes` выводит промежутки, свободные у всех, в
  пределах `--hours` (по умолчанию 09:00-17:00), с понедельника по пятницу; те, кого Google не показывает,
  перечислены в `unknown`. Ничего не сохраняется.
- **`gcal <profile> search --backend server <words>` использует собственный поиск Google Календаря** по
  синхронизируемым календарям. Он только читает, ничего не сохраняет и находит события и за пределами
  синхронизированного периода. По умолчанию используется `--backend archive`, локальное хранилище.
- **`gcal <profile> events create | update | delete | respond` меняют Google Календарь после
  `session start --grant write`.** Без этого права запись завершается с `permission_error` и называет нужный флаг.
  Изменение отправляет синхронизированную версию, поэтому событие, изменённое в Google с тех пор, даёт
  `event.conflict` и никогда не перезаписывается. Создание, ответ на которое потерялся, заканчивается
  `outcome_unknown` с ID; при повторе с этим ID событие находится. `events create --repeat <rule>` создаёт
  повторяющееся событие, а `events update --series --repeat <rule>` меняет его правило. Новые даты делают событие со
  временем событием на весь день, а новое время делает событие на весь день событием со временем, сохраняя ссылку
  Meet и файлы Drive. `respond` меняет только ваш собственный ответ. Запись доступна и как инструменты MCP, с теми же
  параметрами, что в командной строке.
- **`gcal api list | show | call` и отдельная команда `gcal <profile> api <method>` для каждого метода дают доступ ко
  всем методам Google Calendar API v3**, которые gcal может обслужить. Они созданы из описания API от Google, и
  каждый ответ сверяется с ним. Уведомления Google об изменениях (`watch`, `channels.stop`) не предлагаются: им
  нужен публичный веб-адрес.
- **У каждой команды и каждого метода Google Календаря есть ключ разрешения**, например `events.create` или
  `api.calendar.events.insert`. Изменение сначала спрашивает (`--yes` в скрипте), в том числе открытие доступа к
  календарю и передача его другому аккаунту; через MCP отвечать некому, поэтому `ask` позволяет агенту выполнить
  его. Три ключа стоят в `deny`, пока вы их не разрешите: `events.notify` (Google рассылает письма участникам),
  `events.delete.series` (удаление всех повторений повторяющегося события) и `sharing.notify` (Google отправляет
  письмо человеку, которому открыт календарь). Команды `api` проверяют те же ключи, что и запись событий, а запись
  события проверяет ещё и ключ своего метода Google, поэтому `permissions.api readonly` останавливает и то и другое.
  Очистка календаря (`calendars.clear`) запрещена и никогда не предлагается через MCP, как и `api call`.
  `--dry-run` выводит все ключи, которые проверяет вызов, с их уровнями. Ключ, не называющий ни одного метода,
  отклоняется, а `gcal doctor` показывает такие ключи, сохранённые в файле.
- **Код доступа, PIN и пароль встречи никогда не покидают Google.** Они никогда не сохраняются: ссылка для
  подключения хранится без строки запроса, а строка описания или места события, где упоминается код доступа,
  пароль или PIN, отбрасывается. Команды `api` тоже удаляют их из каждого ответа с событием, в терминале и через
  MCP.
- **`gcal <profile> mcp serve` предоставляет команды профиля агенту**, а `mcp add claude-code | codex`,
  `mcp config`, `mcp check`, `mcp revoke` и `mcp server start | stop | status` настраивают это.
  `--profiles <names|all>` обслуживает несколько профилей; профиль никогда не выбирается сам, поэтому
  `gcal mcp serve` без профиля выводит их список и останавливается. Сервер сообщает агенту, какой текст написали
  другие люди, а управляющие символы в ответе показываются явно, поэтому текст приглашения ничего не может скрыть от
  агента.
- **`gcal --help` показывает, что умеет gcal и с чего начать, а `gcal guide` даёт пошаговые сценарии**: настройка,
  доступ для агента, поиск времени. `gcal skill install` добавляет навык инструмента для Claude Code, Codex,
  Gemini CLI, OpenClaw и Hermes Agent.
- **`gcal doctor` показывает, что настроено, без сети и без хранилища ключей**: версию, пути, хранилище, клиент OAuth,
  блокировку профиля и файлы входа.
- **`gcal <profile> runs list | show` показывает сохранённые запуски gcal**, включая вход и выход: успешные — 7
  дней, неудачные — 30. Секреты скрыты; `config set record_input false` не сохраняет ни одного введённого вами
  слова.
