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

7.2 KiB
Raw Permalink Blame History

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 <name> → proposal/specs/design/tasks → validate → archive.