# 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/ (детали), POST /email//move (перемещение в папку), POST /email//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 ` → proposal/specs/design/tasks → validate → archive.