--- name: gcal description: 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. metadata: origin: task t-261008155436-a658e9, messages m-516173943/m-516173944 requires: 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