66 lines
4.2 KiB
Markdown
66 lines
4.2 KiB
Markdown
---
|
||
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
|