mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 01:50:03 +00:00
93 lines
25 KiB
Markdown
93 lines
25 KiB
Markdown
# TODO — VESTI
|
||
|
||
Формат: | дата | задача | статус | закрыта в |
|
||
|---|---|---|---|
|
||
| 2026-09-08 | Инициализировать OpenSpec-проект /opt/vesti, change tg-crawler-publisher-prototype | ✅ закрыта | сессия старта |
|
||
| 2026-09-14 | Фикс: статус группы при group_by=date брался от первого поста → группы с первым published выглядели опубликованными | ✅ закрыта | change fix-date-group-status |
|
||
| 2026-09-14 | Фикс /published: заголовок перекрывался fixed-top меню; на карточках нет ID поста | ✅ закрыта | change fix-published-page |
|
||
| 2026-09-14 | Кандидаты: в списке не должно быть одобренных/своих постов; при группировке по дате всё показывалось как «свои» | ✅ закрыта | change candidates-only-external-new (в списке только внешние new: is_own=0 AND status='new') |
|
||
| 2026-09-14 | Кандидаты: после reject сбрасывается группировка (date→source), ?status=rejected показывает пустой список | ✅ закрыта | change keep-candidates-context (сохранение group_by/фильтров через скрытые поля + _cand_back; явный статус — единственный фильтр) |
|
||
| 2026-09-08 | Артефакты change: proposal, design, specs (5), tasks | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | PRD.md — требования, архитектура, стек, DoD | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | Каркас проекта: каталоги, venv, requirements.txt | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | Конфиг+БД: config.py, schema.sql (6 таблиц), db.py | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | sources.yaml (8 линукс-каналов), sources.py (синк+запуски) | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | crawler/telegram_crawler.py + auth_telegram.py | ✅ закрыта | сессия старта |
|
||
| 2026-09-08 | Починить telegram-tunnel (SSH-форвард :1080 до VPS01) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Авторизовать Telethon-сессию (@kpa39l, 2FA) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Краулер: собрать первые посты (137 с 8 каналов) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Форварды: дедуп по fwd_from (свой источник → пропуск, чужой → сирота без медиа) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Классификатор: keywords.py + classify.py (Ollama qwen3:8b-nothink, /v1, таймаут) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Бот-публикатор: card.py + bot.py (Bot API, dry-run) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Веб: FastAPI+Bootstrap 5.3+Jinja2+HTMX, :8400, approve/reject+бандл | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | Банк статей: markdown-бандлы с frontmatter + media | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub**: спроектировать change | ✅ закрыта | 2026-09-08 (openspec validate чист) |
|
||
| 2026-09-08 | **own-content-hub**: миграция БД (migrate_own.py) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub**: sources.yaml +dedinit (own:true) | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub**: краулер own-семантика | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub**: классификатор critical + мультинаправления | ✅ закрыта | 2026-09-08 (test linux+ai) |
|
||
| 2026-09-08 | **own-content-hub**: публикатор publish_multi + get_views_multi + карточка с атрибуцией | ✅ закрыта | 2026-09-08 (dry-run 2 направления) |
|
||
| 2026-09-08 | **own-content-hub**: веб «Свои», чекбоксы направлений, distributed_dirs | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub**: бандлы origin:own + source_url + author | ✅ закрыта | 2026-09-08 |
|
||
| 2026-09-08 | **own-content-hub** 2.3: бэкфилл @dedinit (~1092 постов is_own=1) | ✅ закрыта | 2026-09-10 (backfill_dedinit.py, fetched=1040, max_post_id=1092, 846 в БД) |
|
||
| 2026-09-08 | **own-content-hub**: повторный approve-тест после async form | ✅ закрыта | 2026-09-09 (реальный approve 136,137 через publisher-service) |
|
||
| 2026-09-08 | VESTI_BOT_TOKEN (реальная публикация) | ✅ закрыта | 2026-09-09 (тестовый пост message_id=2) |
|
||
| 2026-09-09 | **publisher-service**: OpenSpec change (proposal/design/spec/tasks), validate | ✅ закрыта | 2026-09-09 |
|
||
| 2026-09-09 | **publisher-service**: FastAPI-микросервис services/publisher/ (publish/healthz/views) | ✅ закрыта | 2026-09-09 (healthz ok, реальный publish message_id=2) |
|
||
| 2026-09-09 | **publisher-service**: web переключён на HTTP-клиент (publisher_client.py) | ✅ закрыта | 2026-09-09 |
|
||
| 2026-09-09 | **publisher-service**: Docker (compose up) + healthcheck | ✅ закрыта | 2026-09-09 (vesti-publisher Up healthy, healthz: bot/proxy/channels ok) |
|
||
| 2026-09-09 | Реальный approve через веб (сквозной путь с микросервисом) | ✅ закрыта | 2026-09-09 (посты 136,137 → @dedinit_vesti, tg_message_id 3,4) |
|
||
| 2026-09-09 | Web-фиксы: 500 /candidates (raise RedirectResponse) + tg_message_id для внешних | ✅ закрыта | 2026-09-09 |
|
||
| 2026-09-10 | **Медиа в Docker**: publisher маунт ../../media/media:/srv/publisher/media | ✅ закрыта | 2026-09-10 (контейнер пересобран, healthy) |
|
||
| 2026-09-10 | Веб :8400 перезапущен (после падения); юнит vesti-web.service | ✅ закрыта | 2026-09-10 (запущен; юнит подхватится при перезагрузке — daemon-reload зависает на bigbox) |
|
||
| 2026-09-10 | Cron per-source + тихий watchdog | ✅ закрыта | 2026-09-10 (crawler `*/30`, watchdog `*/15`; no_agent, тихие) |
|
||
| 2026-09-10 | Классификатор по неклассифицированным (870 постов) | ✅ закрыта | 2026-09-10 (обработано 870, классифицировано 391: 389 LLM + 2 словарь; 479 нерелевантных без direction) |
|
||
| 2026-09-10 | PRD v0.2 — актуализация под текущее состояние | ✅ закрыта | 2026-09-10 |
|
||
| 2026-09-11 | Web-замечания пользователя: unpkg/CDN, сырой markdown, даты ISO, ожидание CDN при фильтрации | ✅ закрыта | 2026-09-11 (4 openspec change) |
|
||
| 2026-09-11 | Веб доступен снаружи: vesti.nixg.ru через Caddy VPS02 | ✅ закрыта | 2026-09-11 (reverse_proxy 10.8.0.2:8400, LE-серт) |
|
||
| 2026-09-11 | Change `deexternalize-web-assets`: убраны htmx/unpkg и bootstrap/jsdelivr (bootstrap локален) | ✅ закрыта | 2026-09-11 (0 внешних доменов, approve/reject POST-формами) |
|
||
| 2026-09-11 | Change `web-render-markdown`: markdown-рендер (Python-Markdown, XSS-safe) | ✅ закрыта | 2026-09-11 (фильтр `markdown`, кандидаты+опубликованные) |
|
||
| 2026-09-11 | Change `web-format-datetime`: даты `ЧЧ:ММ ДД.ММ.ГГГГ` вместо ISO | ✅ закрыта | 2026-09-11 (фильтр `dt`, candidates/published/metrics) |
|
||
| 2026-09-11 | Change `web-list-filter-no-js`: фильтрация GET-формами без JS/CDN | ✅ закрыта | 2026-09-11 (кнопка «Применить», без ожидания CDN) |
|
||
| 2026-09-11 | Баг бандлов: двойной слэш `/bundle//opt/vesti/...` в published | ✅ закрыта | 2026-09-11 (create_bundle → относительный путь, 4 строки БД обновлены) |
|
||
| 2026-09-11 | AGENT.MD — правила проекта (все изменения через OpenSpec) | ✅ закрыта | 2026-09-11 |
|
||
| 2026-09-09 | git-репозитории (gitverse истина, gitea зеркало) — /opt/vesti НЕ git-репо | ✅ закрыта | 2026-09-13 (дубликат строки ниже: git init + коммит, gitverse kpa39l/vesti, gitea зеркало 8h) |
|
||
| 2026-09-08 | openspec archive web-изменений + own-content-hub + publisher-service (после подтверждения) | ✅ закрыта | 2026-09-16 (архивированы 14 change-ов: 12 веб/фиксы+crawler-queue + own-content-hub + publisher-service; спеки влиты в openspec/specs) |
|
||
| 2026-09-13 | После перезагрузки не поднялся веб :8400 (юнит vesti-web был disabled) + publisher возвращён с user-юнита на Docker | ✅ закрыта | 2026-09-13 (vesti-web enabled; docker compose up -d --build; vesti-publisher healthy; watchdog переписан на docker-проверку) |
|
||
| 2026-09-13 | Бэкап VESTI на Яндекс.Диск (по аналогии icq/netbox) | ✅ закрыта | 2026-09-13 (backup.sh + backups/ + ЯД vesti-backups, cron root 45 2) |
|
||
| 2026-09-13 | approve → 500 (UnboundLocalError 'dirn' в web/app.py) | ✅ закрыта | 2026-09-13 (change fix-approve-dirn; dirn/lang перенесены до использования; 303 вместо 500) |
|
||
| 2026-09-13 | Медиа в карточках новостей не отображаются | ✅ закрыта | 2026-09-13 (change web-media-preview; роут /media/{filename} + превью img/video в candidates/published; клик → полноразмер в новой вкладке) |
|
||
| 2026-09-13 | Пост без классификации: на карточке значок «?» — понять его роль; если классификации нет — дать возможность вручную указывать/изменять/добавлять направление при анализе | ✅ закрыта | 2026-09-16 (change manual-direction: select направлений в «Отобранных» у «🤖 Обработать моделью»; manual_direction пишется в БД без LLM; проверено: пост 1086 → tech) |
|
||
| 2026-09-13 | git-репозиторий /opt/vesti (gitverse истина, gitea зеркало) | ✅ закрыта | 2026-09-13 (git init + commit; gitverse kpa39l/vesti main; gitea estorozhenko/vesti mirror 8h; .gitignore: backups/media/db/bundles/logs исключены) |
|
||
| 2026-09-13 | Интерфейс кандидатов: разделить окно на 2 панели — слева список кандидатов, справа меню действий с постом (опубликовать / отклонить / переклассифицировать / переписать новость под себя), ниже блок для моего комментария, потом оригинальный пост со всеми медиа | ✅ закрыта | 2026-09-16 (двухпанельный mail-UI: candidates-mail-ui 13.09 + selected-list 15.09 — обработка/переклассификация/переписывание/публикация/комментарий/медиа перенесены в «Отобранные» (пайплайн кандидаты→отобранные→опубликованные); в кандидатах осталось отобрать/отклонить) |
|
||
| 2026-09-13 | Контент-стратегия: не перепубликовать чужие новости, а публиковать переписанные от себя (персональный контент, добавление ценности). Связано с «переписать новость под себя» в интерфейсе кандидатов — нужна генерация пересказа через LLM + редактирование перед публикацией | ✅ закрыта | 2026-09-15 (change rewrite-as-author: textarea редактируема + кнопка сохранения; публикация идёт с пересказом от имени @dedinit) |
|
||
| 2026-09-13 | Извлечение источников новостей из полученных постов (каналы/сайты, откуда пришли новости) — чтобы в следующий раз забирать новости напрямую из источника. ДОПОЛНЕНИЕ: возможно стоит разработать сервис поиска источников в интернете (если источник не указан) и ДООБОГАЩАТЬ карточки кандидатов, но — чтобы не тратить лишние деньги — ТОЛЬКО для одобренных кандидатов. Пайплайн: отбор новостей из списка кандидатов → в «выбранные» → обработка/дообогащение/переписывание при необходимости → публикация | 🔵 открыта | (зафиксирована, проработать) |
|
||
| 2026-09-13 | OpenSpec change `gotosocial-publisher`: proposal/design/tasks/specs/gotosocial-publisher, validate чисто | ✅ закрыта | 2026-09-13 (архивирован как 2026-09-13-gotosocial-publisher, delta влита в specs/gotosocial-publisher/spec.md) |
|
||
| 2026-09-13 | Аккаунт-бот **vesti** на GtS (admin account create, confirmed+approved, admin=0) — публиковать НЕ от kpa39l | ✅ закрыта | 2026-09-13 (авто-подтверждение; токен в .env GT_SOCIAL_ACCESS_TOKEN) |
|
||
| 2026-09-13 | OAuth-приложение vesti-publisher (POST /api/v1/apps, scopes write write:media) + user-токен vesti (вставка в tokens, user_id из users) | ✅ закрыта | 2026-09-13 (client_id=01B09QNDM9YQ2VQVSRXHCVAV6K; verify_credentials → username=vesti) |
|
||
| 2026-09-13 | publisher: модуль gotosocial.py (httpx: post_status/upload_media/verify_credentials/delete_status), config gt_social_*, channels gt:, main.py _publish_gotosocial + healthz + dry_run | ✅ закрыта | 2026-09-13 (реальные тесты: текст, медиа, delete; status_id ULID; канал @vesti@dedinit.ru) |
|
||
| 2026-09-13 | Доки + git + backup по gotosocial-publisher (STATUS/WALKTHROUGH/.env.example; коммиты bf176cc, 6b955aa на gitverse) | ✅ закрыта | 2026-09-13 (backup.sh в фоне — уведомление отдельно) |
|
||
| 2026-09-13 | Пометить аккаунт vesti как bot (PATCH /api/v1/accounts/update_credentials bot:true или actor_type Service) | ✅ закрыта | 2026-09-16 (PATCH update_credentials bot=true, verify: bot=True) |
|
||
| 2026-09-13 | Фан-аут направлений → каналы (в т.ч. fediverse-каналы по направлениям) | 🔵 открыта | (расширение публикации) |
|
||
| 2026-09-13 | Отдельная страница управления источниками новостей: отображение / добавление / удаление / редактирование, фильтр по типу источника (Telegram, RSS, почтовая рассылка, прямые новости с сайтов, Twitter и т.п.) | ✅ закрыта | change sources-admin; /sources + CRUD (add/edit/toggle/delete), yaml — источник истины |
|
||
| 2026-09-14 | Метрики: добавить инсайты — сколько в день новых постов получено / одобрено / опубликовано, по аналогии с существующими карточками метрик; плюс за неделю и месяц (итого 9 карточек: день/неделя/месяц × новые/одобрено/опубликовано) | 🔵 открыта | (задача на потом, просто зафиксировать) |
|
||
| 2026-09-15 | **rss-crawler**: OpenSpec change (proposal/design/tasks/spec), код rss_crawler.py, lwn | ✅ закрыта | change rss-crawler |
|
||
| 2026-09-15 | **rss-crawler**: cron vesti-rss-crawler (каждые 15 мин, no_agent, тихий) | ✅ закрыта | cron fa60bc830843 |
|
||
| 2026-09-15 | **rss-crawler**: собрать первые RSS-посты (15, lwn) | ✅ закрыта | 2026-09-15 |
|
||
| 2026-09-15 | **rss-crawler**: веб-скедулинг RSS (кнопка запуска краулера в админке) | 🔵 открыта | (зафиксирована, проработать) |
|
||
| 2026-09-15 | **crawler-очередь**: отдельная страница /crawlers — статус работы краулеров (alive/dead, last_fetch, ошибки) и размер очереди. Двухфазный сбор: (1) краулеры проходят по источникам и ищут новые кандидаты, (2) найденные кладутся в очередь, (3) воркеры разбирают очередь в несколько потоков | ✅ закрыта | change crawler-queue; /crawlers, worker.py (ThreadPoolExecutor) |
|
||
| 2026-09-15 | Кнопки правой панели: «Обработать моделью / Переписать / Отклонить» — ОДИН ряд НАД полем комментария | ✅ закрыта | change candidates-buttons-order (коммит 562d787) |
|
||
| 2026-09-15 | После «🚫 Отклонить» оставаться на странице кандидатов в текущей группировке (не уходить в отклонённые) | ✅ закрыта | change reject-stay-candidates (коммит 562d787) |
|
||
| 2026-09-15 | Флаг прочитанности: непрочитанные карточки жирные, открытый пост — светло-голубая заливка, дефолтная группировка по дате | ✅ закрыта | change candidates-read-flag (коммит c09dff0) |
|
||
| 2026-09-15 | «✅ Опубликовать» — НИЖЕ поля комментария рядом с «💾 Сохранить комментарий»; оригинальный пост растянут на всю высоту панели | ✅ закрыта | коммит b542e9b |
|
||
| 2026-09-15 | **Пайплайн «Кандидаты → Отобранные → Опубликованные»**: статус selected, /selected отдельный список, в кандидатах только «⭐ Отобрать», вся обработка в отобранных, классификация по кнопке | ✅ закрыта | change selected-list (коммит ae8af8d) |
|
||
| 2026-09-15 | Подготовка своего поста в «Отобранных»: поле «✍️ Мой пост» (rewritten_text всегда видно) рядом с оригиналом — черновик «Переписать» редактируется и публикуется | ✅ закрыта | change selected-list (коммит ae8af8d) |
|
||
| 2026-09-17 | Фикс: при открытии поста (?selected=N) чекбоксы массового выбора на /candidates и /selected сбрасывались, оставался только чекбокс открытого поста. Нужно сохранять отметки при навигации для быстрого массового отказа/отбора | ✅ закрыта | change keep-bulk-checkboxes (sessionStorage vesti_bulk_candidates/vesti_bulk_selected; коммит c8fe5f7, запушен в gitverse; баг-фикс: селектор input[name=ids] вместо #bulk-form input) |
|
||
| 2026-09-18 | Перевод поста на русский в карточках (кандидатов и отобранных): метка «Оригинал» → закладка, кнопка «🌐 Перевести» → закладка «Перевод». Перевод локальной моделью qwen3:8b-nothink, результат в posts.translated_text (идемпотентный ALTER при старте). Повторный клик без вызова модели. call_ollama не подошла (парсит JSON) — прямой запрос к Ollama /v1 | ✅ закрыта | change post-translate (коммит 4a166fa, запушен в gitverse; e2e на реальной модели пройден) |
|
||
| 2026-09-18 | **Кросспостинг личных источников** (идея пользователя): Телеграм (@dedinit, свой канал), fediverse GtS (@kpa39l@social.dedinit.ru), блог dedinit.ru (Hugo) должны обмениваться данными и кросспоститься — написанное в Телеграме появляется в блоге, ВК и fediverse; эпогей — в моих новостных каналах (VESTI). Требуется: система-оркестратор (подобно publisher VESTI), интерфейсы: TG (Telethon/Bot API), VK API (VK.ru — личная страница, нужен токен/подтверждение), GtS Mastodon API (есть токен vesti; для kpa39l — отдельный), Hugo-блог (git+deploy). Обмен данными между источниками (двусторонний), дедуп, не перезаписывать чужое | 🔵 открыта | (идея зафиксирована, спроектировать отдельный change) |
|
||
| 2026-09-18 | **Markdown-редактор по аналогии с Dillinger/StackEdit** — ОТДЕЛЬНЫЙ модуль для встраивания в другие проекты (сначала в VESTI), основа блогоплатформы chronicle (c7e.ru, гипотеза). Требования пользователя: блоки кода с кнопкой «Скопировать»; включение/выключение нумерации строк (копирование без номеров); подсветка синтаксиса по выбранному языку; выделение инлайн-команд в тексте; живой предпросмотр + GFM. Репозиторий: gitverse kpa39l/chronicle.nixg.ru (клон /opt/chronicle.nixg.ru, ветка master) — там это Фаза 2 ROADMAP.md (задачи 2.1–2.5: веб-редактор React/Vue, Monaco Editor, языки Python/JS/Go/Rust/Bash/SQL, темы, кнопка «скопировать», Markdown-режим+WYSIWYG) | ✅ перенесена | 2026-09-20: вынесена в отдельный проект /opt/md-editor (README, ADR, glossary, openspec change md-editor-core) |
|
||
| 2026-09-20 | **Приём незакоммиченных наработок** (проверено реализацию): extract-post-sources — backend (sources/extract.py: TG+сайты, дедуп, лимит 5; _post_sources; POST /sources/add-from-post) + manual-direction (impl_reclassify пишет manual_direction без LLM; select в selected.html) — код в HEAD, валидны. crawler-очередь: worker.py (ThreadPoolExecutor, атомарный claim, LLM-семафор) + crawl_sources.py + страница /crawlers (шаблон crawlers.html) — работают, но файлы UNTRACKED (не коммитил) | ✅ принято | 2026-09-20 (в контекст; код не коммичен — по указанию пользователя) |
|
||
| 2026-09-20 | **archive-navigation** (план, реализация не начата): дерево годов/месяцев в /published (роут /published с year/month/page, _archive_tree, шаблон col-lg-3 sticky, collapse на мобильных, пагинация по 10) | 🔵 открыта | (планируемая) |
|
||
| 2026-09-20 | **extract-post-sources — остаток**: блок «Источники из поста» в candidates.html/selected.html (шаблонный блок не добавлен; backend готов) | 🔵 открыта | (планируемая) |
|
||
| 2026-09-20 | **rich-repost-card — аудит**: tasks 0/13 — не начат, хотя формат уже живёт в publisher/card.py (frontmatter-остаток). Проставить статус/закрыть или доделать | 🔵 открыта | (планируемая) |
|
||
| 2026-09-20 | **Коммит незакоммиченных наработок** vesti (classifier, crawler/, docs/, openspec changes archive-navigation/extract-post-sources/manual-direction, sources/extract.py, web/templates/crawlers.html) | 🔵 открыта | (ждёт решения пользователя: коммитить или автор сам) | |