feat: классификация писем Qwen3:8b + обработчики (urgent→TG, task→VTODO, meeting→VEVENT)

- mail_archive.py: фикс вложений himalaya --dir → --downloads-dir; attachments/ только при has_attachment; идемпотентно
- email_classifier.py: Qwen3:8b (Ollama) → теги info/urgent/task/meeting в frontmatter email.md
- email_handlers.py: urgent→Telegram (Bot API+SOCKS5), task→Radicale VTODO, meeting→Radicale VEVENT; handled_* идемпотентность; --dry-run
- .gitignore: игнор *.env.bak*
- openspec: чейндж email-classification-handlers (в работе)
- STATUS/TODO/WALKTHROUGH: прогресс сессии, подводные камни Radicale (http.client, Depth:1, формат дат)
This commit is contained in:
2026-09-13 20:35:58 +00:00
parent 8ea022f5c0
commit 7550aff102
22 changed files with 1728 additions and 76 deletions
@@ -0,0 +1,45 @@
# Tasks: Убрать Vikunja, задачи через Radicale VTODO
## 1. Переключить обработчик task на Radicale VTODO
- [x] 1.1 В чейндже `email-classification-handlers` обновить specs/design/tasks:
заменить «Vikunja API» на «Radicale CalDAV PUT VTODO» (календарь Задачи)
- [x] 1.2 Уточнить формат VTODO: SUMMARY=тема, DESCRIPTION=ссылка на email.md,
DTSTART/DUE при наличии даты из классификации
- [x] 1.3 Верификация: чейндж `email-classification-handlers` остаётся валидным
`Верификация: cd /opt/hermes/email-assistant && openspec validate email-classification-handlers`
## 2. Вывод Vikunja из эксплуатации
- [x] 2.1 Сделать бэкап данных Vikunja (если есть) перед удалением
(volume vikunja-db / postgres-дамп в backups/) — **НЕ НУЖЕН** (решение пользователя 2026-09-13)
- [x] 2.2 **Подтверждение пользователя на удаление** volume (данные Vikunja)
— получено: «бэкап не нужен, выполняй остальные пункты»
- [x] 2.3 Остановить и удалить контейнеры
`cd /opt/hermes/email-assistant/vikunja && docker compose down -v`
`Верификация: docker ps | grep -E 'vikunja|postgres' || echo 'Vikunja removed'`
- [x] 2.4 Удалить каталог `/opt/hermes/email-assistant/vikunja/` (compose, .env)
`Верификация: test ! -d /opt/hermes/email-assistant/vikunja`
- [x] 2.5 Убрать/закомментировать reverse proxy tasks.nixg.ru из Caddy,
если он настроен (Caddyfile на vps02) — закомментирован (строки 114-120), Caddy перезагружен
## 3. Обновить документацию и планы
- [x] 3.1 TODO.md: закрыть задачи Vikunja (2 «Vikunja развёрнут», 3 «Vikunja app»,
6 «Vikunja API»), пометить «не нужна» (сделано 2026-09-13)
- [x] 3.2 STATUS.md: убрать Vikunja из архитектуры, зафиксировать
«задачи = Radicale VTODO, календарь Задачи, jtx board/DAVx5» (сделано 2026-09-13)
- [x] 3.3 Обновить запись «Ресурсы проекта»: убрать Vikunja/tasks.nixg.ru,
добавить Radicale VTODO (сделано 2026-09-13)
- [x] 3.4 В чейндже `local-calendar-tasks` пометить Vikunja как не входящую
(или заархивировать его как superseded) — proposal помечен SUPERSEDED
## 4. Проверка end-to-end
- [x] 4.1 Создать тестовое письмо с тегом `task` → обработчик создаёт VTODO
в Radicale (календарь Задачи)
`Верификация: curl -u estorozhenko:... -X PROPFIND -H 'Depth: 1' https://cal.nixg.ru/estorozhenko/<urlencoded Задачи>/ | grep -c 'VTODO\|ics'`
— тестовый VTODO `test-vikunja-removal-2026` создан (PUT 201, GET 200) 2026-09-13
- [x] 4.2 Верифицировать, что Vikunja отсутствует и ничего не сломано
`docker ps | grep -i vikunja || echo OK` — контейнеров нет, порт 3456 свободен,
cal.nixg.ru работает (207)