Google Calendar

История изменений

История выпусков CLI Google Календаря: новые возможности, изменения и исправления.

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

0.1.1 — 29.10.2026

Исправлено

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

0.1.0 — 29.10.2026

Добавлено

  • gcal <profile> session start | status | end входит в Google через браузер с доступом к Календарю только на чтение. Пока используется ваш собственный клиент Google OAuth (--client-file или GCAL_GOOGLE_CLIENT_ID и GCAL_GOOGLE_CLIENT_SECRET); как его создать, описано в настройках. Вход хранится в системном хранилище ключей или, с --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 не сохраняет ни одного введённого вами слова.