mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 18:05:03 +00:00
0999424baa
- _fetch_candidates: жёсткое status='new' только при пустом status; явный статус (rejected/published) — единственный фильтр статуса → ?status=rejected больше не даёт пустой список - формы approve/reclassify/rewrite/reject/comment: скрытые поля group_by/direction/own/q — контекст страницы - POST-роуты: редирект через _cand_back() сохраняет группировку и фильтры (reject → ?status=rejected&group_by=...; approve → ?status=published&...)
73 lines
15 KiB
Markdown
73 lines
15 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-08 | openspec archive web-изменений + own-content-hub + publisher-service (после подтверждения) | 🔵 открыта | |
|
||
| 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-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-13 | Контент-стратегия: не перепубликовать чужие новости, а публиковать переписанные от себя (персональный контент, добавление ценности). Связано с «переписать новость под себя» в интерфейсе кандидатов — нужна генерация пересказа через LLM + редактирование перед публикацией | 🔵 открыта | (идея, проработать) |
|
||
| 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-13 | Фан-аут направлений → каналы (в т.ч. fediverse-каналы по направлениям) | 🔵 открыта | (расширение публикации) |
|
||
| 2026-09-13 | Отдельная страница управления источниками новостей: отображение / добавление / удаление / редактирование, фильтр по типу источника (Telegram, RSS, почтовая рассылка, прямые новости с сайтов, Twitter и т.п.) | 🔵 открыта | (зафиксирована, проработать) |
|
||
| 2026-09-14 | Метрики: добавить инсайты — сколько в день новых постов получено / одобрено / опубликовано, по аналогии с существующими карточками метрик; плюс за неделю и месяц (итого 9 карточек: день/неделя/месяц × новые/одобрено/опубликовано) | 🔵 открыта | (задача на потом, просто зафиксировать) | |