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,60 @@
# Proposal: Убрать Vikunja, задачи через Radicale (VTODO)
## Why
В проекте email-assistant были развёрнуты два сервиса для календаря/задач:
- **Radicale** (CalDAV/CardDAV) — календари Личный/Рабочий/Задачи
- **Vikunja** (трекер задач) — отдельная сущность на :3456, tasks.nixg.ru
Это лишняя сложность: Radicale из коробки поддерживает **VTODO** (задачи через
CalDAV), а календарь «Задачи» в Radicale уже создан. На Android задачи из
CalDAV-VTODO прекрасно синхронизирует **jtx board** (и DAVx5), не требуя
отдельного трекера.
Vikunja добавляет:
- лишний docker-контейнер + PostgreSQL
- отдельный API, токен, админа (не созданы — блокер)
- отдельный домен tasks.nixg.ru (reverse proxy, сертификат)
- дублирование логики «создать задачу» (Vikunja API вместо простого VTODO)
- усложнение чейнджа классификации (обработчик `task` зависел от несуществующего токена)
Убираем Vikunja из проекта. Задачи — через Radicale (VTODO в календаре «Задачи»).
Это упрощает архитектуру, убирает лишнюю сущность, не теряя функциональности.
## What Changes
1. **Обработчик задач переключается на Radicale VTODO** — в чейндже
`email-classification-handlers` обработчик `task` создаёт не задачу в Vikunja,
а **VTODO в календаре «Задачи» Radicale** (CalDAV PUT). Тема письма → SUMMARY,
ссылка на письмо → DESCRIPTION.
2. **Vikunja выводится из эксплуатации** — остановить и удалить контейнеры
`vikunja` и `vikunja-db`, убрать docker-compose.yml, .env (или пометить
deprecated), освободить порт 3456.
3. **tasks.nixg.ru** — если reverse proxy уже настроен, убрать/закомментировать;
если нет — не настраивать. Radicale остаётся единственным CalDAV-сервером.
4. **Обновить документацию** — STATUS.md, TODO.md, design чейнджей убрать Vikunja,
зафиксировать «задачи = Radicale VTODO, jtx board».
5. **TODO/общий список** — задача «Vikunja» закрыта как «не нужна»,
«Caddy tasks.nixg.ru» — отменена.
## Capabilities
### New Capabilities
- `radicale-tasks`: создание задач (VTODO) в Radicale через CalDAV — заменяет
Vikunja для обработчика `task` в email-classification-handlers.
### Modified Capabilities
- (нет) — Vikunja не является capability проекта; это внешний сервис, который
выводится из эксплуатации. Radicale-tasks — новое поведение.
## Impact
- **Docker**: остановить/удалить `vikunja`, `vikunja-db` (compose в
`/opt/hermes/email-assistant/vikunja/`)
- **Скрипты**: `email_handlers.py` (в чейндже classification) — обработчик `task`
→ Radicale VTODO вместо Vikunja API
- **Радикал**: календарь «Задачи» уже существует, туда пишутся VTODO
- **Документация**: STATUS.md, TODO.md, design.md (local-calendar-tasks,
email-classification-handlers) — убрать Vikunja, зафиксировать Radicale VTODO
- **Caddy (если настроен)**: убрать/закомментировать tasks.nixg.ru
- **TODO.md**: закрыть задачи Vikunja (2, 3, 6 — «создать задачу» теперь Radicale)