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)
This commit is contained in:
+143
@@ -0,0 +1,143 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user