simbiot-harness/skills/gcal/SKILL.md

4.2 KiB
Raw Permalink Blame History

name description metadata
gcal Use when Alex asks in TG to schedule a call/meeting ("сделай звонок на X с Владой", "запланируй созвон", "поставь встречу") — creates a Google Calendar event with guest invites in a workday slot (Alex's «3 через 3» cycle), or checks the schedule. Powered by tools/gcal.py.
origin requires
task t-261008155436-a658e9, messages m-516173943/m-516173944 secrets/gcal-service-account.json (service account key; until provided — dry-run/planning only)

gcal: команда из TG → событие в календаре Alex

Одна команда из TG должна решаться одним прогоном этого скилла: интеншн → валидный слот (рабочий день!) → событие с приглашением → ответ в чат.

Шаг 1 — разобрать команду

Из сообщения извлечь:

  • что: тема (по умолчанию «Звонок: <тема/имя гостя>»);
  • когда: день (сегодня/завтра/дата) и время; длительность (по умолчанию 30 мин);
  • кого: email гостей. Известные контакты: Влада — videoprodshema@gmail.com. Email НЕ известен → спросить у Alex ДО создания (угадывать адрес нельзя);
  • время: Alex в Минске (UTC+3). Время из TG трактовать как минское, в инструмент передавать UTC.

Шаг 2 — валидация слота (строго до создания)

./venv/bin/python tools/gcal.py next-workdays        # ближайшие рабочие
./venv/bin/python tools/gcal.py create ... --dry-run # что попадёт в Google

Guard'ы (встроены в create, не обходить):

  1. Только рабочий день — цикл «3 через 3» (docs/alex-schedule.md). Якорь цикла: env GCAL_WORK_ANCHOR (по умолчанию 2026-10-02). Сдвиг цикла Alex сообщил в TG → обновить docs/alex-schedule.md и якорь.
  2. Не позже 2ч до начала (GCAL_MIN_LEAD_MIN=120) — анти-паттерн рекордера (t-261008155708: встречи, созданные <2 мин до старта, не заходятся).

Выходной/поздний слот → НЕ создавать, ответить Alex с ближайшими рабочими днями и попросить подтвердить слот.

Шаг 3 — создать событие

./venv/bin/python tools/gcal.py create \
  --title "Звонок: Влада" --day YYYY-MM-DD --time HH:MM \
  --duration 30 --guests "videoprodshema@gmail.com" --timezone Europe/Minsk

sendUpdates=all — приглашения уходят гостям автоматически. Ответ в чат: ссылка на событие (htmlLink), слот, гости.

Ключ (один раз, если не настроен)

tools/gcal.py check печатает готовность и шаги: Google Cloud → Calendar API → service account → JSON-ключ → дать client_email право «Вносить изменения» на календаре Alex → положить в secrets/gcal-service-account.json (0600). Ключа нет → работать dry-run'ом и попросить Alex прислать ключ (это может сделать только владелец аккаунта).

Критерии качества

  • Слот — рабочий день цикла; иначе отказ с предложением ближайших рабочих
  • До начала ≥2ч (или осознанный --force по явной просьбе Alex)
  • Гости получили приглашения (sendUpdates=all), email не угадан
  • В ответе Alex — время в его зоне (Минск) и ссылка на событие
  • check зелёный; ключ лежит в secrets/ с правами 0600