- 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)
7.2 KiB
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» для хранения писем
Пользователь хочет: хранить данные в ФС, чтобы использовать локальную нейросеть как инструмент в обычных скриптах, без облака и трат.
Что сделать:
- Сравнить текущий подход (email.md в YYYY/MM/UID/ + SQLite FTS5-индекс) с Maildir
- Оценить: производительность, инкрементальность, устойчивость, совместимость, возможность LLM-анализа (grep/find/без БД)
- Вывод: остаться на текущем или мигрировать (с обоснованием)
Критерии готовности:
- Документ
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).
Что сделать:
- Поставить Radicale (docker или systemd) — CalDAV на 5232
- Создать календарь «Личный», «Рабочий» + коллекцию задач (VTODO)
- Поставить Vikunja (docker, postgres) — трекер на 8080
- Настроить пользователей/проекты
Критерии готовности:
- 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-совместимое
Что сделать:
- Убедиться, что Radicale доступен снаружи (caddy reverse proxy, домен cal.nixg.ru) + TLS
- Настроить DAVx5 на телефоне (логин/пароль Radicale, URL cal.nixg.ru)
- Проверить двустороннюю синхронизацию (создать событие на телефоне → видно в Radicale → в веб-UI)
Критерий готовности:
- Событие, созданное на Android, появляется в Radicale (и наоборот)
- Задача создаётся на телефоне → видна в трекере
Задача 1 (приоритет №4): Веб-интерфейс ассистента
Список писем с полями:
- Дата
- Адресант
- Назначенные тэги
- Папка (для перемещения)
Кнопка создания задачи в трекере:
Стек: FastAPI + SQLite FTS5 + Jinja2 (или React) — локально.
Что сделать:
- FastAPI-приложение: GET / (список писем), GET /email/ (детали), POST /email//move (перемещение в папку), POST /email//tag
- Интеграция с трекером: POST /tasks (создание задачи в Vikunja API)
- Страница авторизации (см. Задача 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-цикл
- change
email-storage-analysis(Задача 4) — быстрый, влияет на архитектуру - change
local-calendar-tasks(Задача 2) — Radicale + Vikunja - change
android-sync(Задача 3) — DAVx5 + caddy + домен - change
email-webui(Задача 1) — FastAPI + UI - change
email-webui-auth(Задача 7) - change
email-api(Задача 6) — интеграция с Vikunja
Каждый — через openspec new change <name> → proposal/specs/design/tasks →
validate → archive.