Files
hermes 757f3413e9 docs: итоги сессии 2026-09-11 — STATUS обновлён, TODO/WALKTHROUGH созданы
- STATUS: дата 2026-09-11, реальные метрики (4884 письма, 81 контакт),
  cron id реальные (5f2305b2bbf8/ea0fd1ab4f93), блок портфеля веб-UI
- TODO.md: журнал задач (2026-07 → 2026-09-11)
- WALKTHROUGH.md: капитанский журнал (Фаза 1.7, Nylas, ФС vs Maildir,
  Radicale развёрнут, блокер с коллекциями)
- PLAN_WEBUI.md: план портфеля (был untracked)
2026-09-11 14:31:06 +00:00

143 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Email Assistant — Расширение: Web UI + Календарь/Задачи + Анализ Maildir
**Дата:** 2026-09-11
**Тип:** Планирование портфеля задач (OpenSpec changes)
**Приоритет:** Задачи 4 → 2 → 3 → 1 → 6 → 7
---
## Контекст
Существующий проект: `/opt/hermes/email-assistant/`
- Архив писем: `/opt/hermes/email/` (email.md с YAML-frontmatter: id, folder, subject,
from, to, date, flags, Message-ID, References, Content-Type + сырое тело)
- Индексация: SQLite FTS5 (`mail_index.db`, ~5.4 MB, 2652 письма)
- LLM: Qwen3:8b через Ollama localhost:11434 (без облака)
- Стэк: Himalaya CLI → Python → SQLite → Ollama → Yandex Disk
- SMTP не настроен (только чтение)
Календаря/трекера задач **нет** (проверено: порты 5232/8008/8080 не заняты —
ни radicale, ни vikunja, ни leantime).
---
## Задача 4 (приоритет №1): Анализ «Файловая система vs Maildir» для хранения писем
**Пользователь хочет:** хранить данные в ФС, чтобы использовать локальную
нейросеть как инструмент в обычных скриптах, без облака и трат.
**Что сделать:**
1. Сравнить текущий подход (email.md в YYYY/MM/UID/ + SQLite FTS5-индекс) с Maildir
2. Оценить: производительность, инкрементальность, устойчивость, совместимость,
возможность LLM-анализа (grep/find/без БД)
3. Вывод: остаться на текущем или мигрировать (с обоснованием)
**Критерии готовности:**
- [ ] Документ `STORAGE_ANALYSIS.md` в корне проекта
- [ ] Сравнение по таблице (ФС vs Maildir vs текущий)
- [ ] Рекомендация с обоснованием
- [ ] Ссылка из README.md
---
## Задача 2 (приоритет №2): Локальный календарь (CalDAV) + Задачи
**Требование:** локальный сервис календаря/задач с нативной синхронизацией
с Android-телефоном.
**Кандидаты (локальные, без облака):**
- **Radicale** (CalDAV + CardDAV, лёгкий, Python, single-user, порт 5232) —
лучший для календаря + задач (VTODO)
- **Vikunja** (задачи + kanban, веб-UI, PostgreSQL, порт 8080) — если нужен
полноценный трекер с веб-интерфейсом
- **Leantime** (проекты/задачи, MySQL, порт 8080) — тяжелее
**Предложение:** Radicale для CalDAV-календаря + задач (нативный CalDAV на
Android через DAVx5/DAVx5), а для **веб-трекера задач** (кнопка из почты)
— **Vikunja** (API + веб-UI).
**Что сделать:**
1. Поставить Radicale (docker или systemd) — CalDAV на 5232
2. Создать календарь «Личный», «Рабочий» + коллекцию задач (VTODO)
3. Поставить Vikunja (docker, postgres) — трекер на 8080
4. Настроить пользователей/проекты
**Критерии готовности:**
- [ ] Radicale отвечает на `curl -X PROPFIND http://127.0.0.1:5232/` → 207
- [ ] Vikunja отвечает на `curl http://127.0.0.1:8080/api/v1/info` → 200
- [ ] Cauerдок в README (порты, логины, пути)
---
## Задача 3 (приоритет №3): Нативная синхронизация с Android
**Стек Android:**
- **DAVx5** (CalDAV/CardDAV-клиент) — синхронизация Radicale
- Android встроенный Google-календарь через DAVx5 bridge
- Задачи: приложение **Tasks.org** / **Vikunja android** / **CalDAV-совместимое**
**Что сделать:**
1. Убедиться, что Radicale доступен снаружи (caddy reverse proxy, домен
cal.nixg.ru) + TLS
2. Настроить DAVx5 на телефоне (логин/пароль Radicale, URL cal.nixg.ru)
3. Проверить двустороннюю синхронизацию (создать событие на телефоне → видно
в Radicale → в веб-UI)
**Критерий готовности:**
- [ ] Событие, созданное на Android, появляется в Radicale (и наоборот)
- [ ] Задача создаётся на телефоне → видна в трекере
---
## Задача 1 (приоритет №4): Веб-интерфейс ассистента
**Список писем** с полями:
- Дата
- Адресант
- Назначенные тэги
- Папка (для перемещения)
**Кнопка создания задачи в трекере:**
**Стек:** FastAPI + SQLite FTS5 + Jinja2 (или React) — локально.
**Что сделать:**
1. FastAPI-приложение: GET / (список писем), GET /email/<id> (детали),
POST /email/<id>/move (перемещение в папку), POST /email/<id>/tag
2. Интеграция с трекером: POST /tasks (создание задачи в Vikunja API)
3. Страница авторизации (см. Задача 7)
**Критерии:**
- [ ] `curl http://127.0.0.1:8085/` → список писем (дата, адресант, тэги, папка)
- [ ] Перемещение письма в папку реально перемещает файл
- [ ] Кнопка «Создать задачу» → POST в Vikunja API → задача создаётся
---
## Задача 6: Кнопка создания задачи в трекере (из веб-UI)
- POST /api/v1/tasks (Vikunja) с данными письма (тема, отправитель, ссылка)
- В веб-UI кнопка «Создать задачу» на каждом письме
---
## Задача 7: Аутентификация веб-интерфейса
- Страница логина (логин/пароль)
- Сессия/токен (FastAPI + JWT или Basic over TLS)
- Reverse proxy: Caddy → TLS (домен mai.nixg.ru или email.nixg.ru)
- Только локальный доступ (127.0.0.1) если не нужен внешний
---
## Порядок OpenSpec-цикл
1. change `email-storage-analysis` (Задача 4) — быстрый, влияет на архитектуру
2. change `local-calendar-tasks` (Задача 2) — Radicale + Vikunja
3. change `android-sync` (Задача 3) — DAVx5 + caddy + домен
4. change `email-webui` (Задача 1) — FastAPI + UI
5. change `email-webui-auth` (Задача 7)
6. change `email-api` (Задача 6) — интеграция с Vikunja
Каждый — через `openspec new change <name>` → proposal/specs/design/tasks →
validate → archive.