mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
Compare commits
2 Commits
48b10349ec
...
1ae4b14d24
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ae4b14d24 | |||
| 0d4ecd1c23 |
@@ -1,8 +1,14 @@
|
||||
# VESTI — Статус
|
||||
|
||||
Обновлено: 2026-09-18 (активны: extract-post-sources, manual-direction, post-translate)
|
||||
Обновлено: 2026-09-20 (активны: post-translate, archive-navigation, extract-post-sources-остаток, rich-repost-card-аудит)
|
||||
<!--
|
||||
История обновлений:
|
||||
2026-09-20 — Приняты в контекст незакоммиченные наработки (проверена реализация):
|
||||
extract-post-sources (backend: sources/extract.py, _post_sources, POST /sources/add-from-post),
|
||||
manual-direction (impl_reclassify пишет manual_direction без LLM, select в selected.html),
|
||||
crawler-очередь (crawler/worker.py ThreadPoolExecutor, crawl_sources.py, /crawlers + crawlers.html).
|
||||
Код в HEAD (кроме untracked: worker.py, crawl_sources.py, extract.py, crawlers.html, CONTEXT.md, docs/).
|
||||
Не коммитил (по указанию пользователя). Добавлены задачи: выполненные и планируемые.
|
||||
2026-09-18 — post-translate: кнопка «🌐 Перевести» в карточках кандидатов и отобранных.
|
||||
Перевод на русский локальной моделью (qwen3:8b-nothink), результат в
|
||||
posts.translated_text (колонка добавляется идемпотентно при старте).
|
||||
@@ -40,6 +46,12 @@
|
||||
-->
|
||||
|
||||
## Текущее состояние
|
||||
- **ПРИНЯТЫ В КОНТЕКСТ НЕЗАКОММИЧЕННЫЕ НАРАБОТКИ** (2026-09-20, проверена реализация):
|
||||
- **extract-post-sources** — backend готов и в HEAD: `sources/extract.py` (extract_sources_from_text: Telegram-каналы + сайты, дедуп, лимит 5), `_post_sources` в app.py, `POST /sources/add-from-post`. **Остаток**: блок «Источники из поста» в candidates.html/selected.html НЕ добавлен (задача 4 в tasks.md открыта). Change валиден.
|
||||
- **manual-direction** — готов и в HEAD: `post_reclassify` принимает `manual_direction`, `impl_reclassify` пишет его в БД без LLM; select направлений в selected.html. Change валиден. (Пост 1086 → tech, проверено автором.)
|
||||
- **crawler-очередь** — worker.py (ThreadPoolExecutor, атомарный claim по posts, LLM-семафор к Ollama) + crawl_sources.py (фаза 1: сбор кандидатов) + страница /crawlers (статус alive/dead, очередь, кнопки «Запустить воркер»/«Сбросить dead»). **Файлы UNTRACKED** (worker.py, crawl_sources.py, crawlers.html, sources/extract.py, CONTEXT.md, docs/) — не коммитил (указание пользователя).
|
||||
- **archive-navigation** — ТОЛЬКО ПЛАН (proposal/design/tasks + CONTEXT.md глоссарий): дерево годов/месяцев в /published, роут /published с year/month/page, пагинация по 10, правая колонка sticky, collapse на мобильных. Реализация НЕ начата (все задачи `[ ]`, /published — плоский список).
|
||||
- **rich-repost-card** — tasks 0/13 (не начат), хотя формат публикации уже живёт в publisher/card.py. Требует аудита: проставить статус/закрыть или доделать.
|
||||
- **post-translate — В РАЗРАБОТКЕ** (2026-09-18): в карточках кандидатов и отобранных появилась кнопка **«🌐 Перевести»** — переводит пост на русский локальной моделью (qwen3:8b-nothink, Ollama). Результат сохраняется в `posts.translated_text` (новые посты — колонка добавляется при старте веба), кнопка после перевода скрывается, вместо неё — закладка «Перевод» рядом с «Оригинал» (активна по умолчанию, переключение без перезагрузки на vanilla JS). Повторный клик токены не тратит. Ошибки модели — редирект с `?error=translate:...`. Тест e2e на реальной модели пройден (пост 123: «Kali Purple Essential Training»).
|
||||
- **keep-bulk-checkboxes — ЗААРХИВИРОВАН И ЗАПУШЕН** (2026-09-17, коммит c8fe5f7): проверки массового выбора постов сохраняются между перезагрузками страницы при навигации по постам. Отметки хранятся в sessionStorage браузера (`vesti_bulk_candidates` / `vesti_bulk_selected`); при открытии поста (?selected=N) восстановленные чекбоксы остаются отмеченными, badge sel-count пересчитывается; при submit bulk-формы (Отобрать/Отклонить/Обработать/Опубликовать) отметки очищаются. Изоляция /candidates и /selected независимыми ключами. Попутно исправлен скрытый баг: чекбоксы лежат вне `<form>` (атрибут form="bulk-form") → селектор `#bulk-form input[name="ids"]` не находил их; заменён на глобальный `input[name="ids"]`. Изменены только web/templates/candidates.html и selected.html (frontend, рестарт не нужен).
|
||||
- **address-field-enhancement — ЗААРХИВИРОВАН** (2026-09-16). Сделано и в проде: форма добавления источника — одно поле Address. Для telegram: `https://t.me/mknewsru` → slug=`mknewsru`, название «Мой Компьютер» (Telethon get_entity); для rss: `https://lwn.net/headlines/rss` → slug=`lwn`, название «LWN.net» (feedparser). Кнопка «🔎 Найти» в форме. direction — datalist из реальных значений (DIRECTIONS + БД), свободный ввод остаётся. БД не менялась (address — только UI-концепция, в yaml по-прежнему url/channel/feed_url).
|
||||
@@ -118,6 +130,10 @@ vesti-web (:8400) ──HTTP POST──▶ publisher-service (:8410) ──Bot A
|
||||
- [x] Тест e2e (dry-run): approve с dirs [linux,ai] → /published с distributed_dirs
|
||||
|
||||
## В работе / Следующие шаги
|
||||
- [ ] **archive-navigation** (2026-09-20, план готов): дерево годов/месяцев в /published — роут с year/month/page, `_archive_tree(conn)` GROUP BY, шаблон col-lg-3 sticky, collapse на мобильных, пагинация по 10 (tasks.md — 8 задач)
|
||||
- [ ] **extract-post-sources — остаток**: блок «Источники из поста» в candidates.html/selected.html (backend готов, шаблоны нет)
|
||||
- [ ] **rich-repost-card — аудит**: tasks 0/13, формат уже в publisher/card.py — проставить статус/закрыть или доделать
|
||||
- [ ] **Коммит незакоммиченных наработок** (ждёт решения пользователя): worker.py, crawl_sources.py, crawlers.html, sources/extract.py, CONTEXT.md, docs/, openspec changes, правки classifier/config/backup.sh/card.py/.env.example/AGENT*.md
|
||||
- [x] Бэкфилл своего канала @dedinit (задача 2.3) — **ЗАВЕРШЁН** (2026-09-10): fetched=1040, max_post_id=1092, 846 постов is_own=1 в БД
|
||||
- [x] publisher: медиа при Docker-запуске — **исправлено**: compose маунтит ../../media/media:/srv/publisher/media:ro
|
||||
- [x] systemd vesti-web.service + cron per-source + тихий watchdog — **юнит установлен** (подхватится при перезагрузке); **cron**: vesti-crawler-all-sources (`*/30`, тихий) + vesti-watchdog (`*/15`, Telegram при проблемах)
|
||||
|
||||
@@ -85,4 +85,9 @@
|
||||
| 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) | 🔵 открыта | (идея зафиксирована; спроектировать change; увязать с chronicle Фазой 2) |
|
||||
| 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) | 🔵 открыта | (ждёт решения пользователя: коммитить или автор сам) |
|
||||
@@ -0,0 +1,9 @@
|
||||
# tasks
|
||||
|
||||
- [x] sources/extract.py: extract_sources_from_text (TG + сайты, дедуп, лимит 5)
|
||||
- [x] web/app.py: helper _post_sources + передача post_sources в candidates/selected
|
||||
- [x] web/app.py: POST /sources/add-from-post
|
||||
- [ ] web/templates/candidates.html + selected.html: блок «Источники из поста» (НЕ реализовано — шаблонный блок отсутствует)
|
||||
- [x] openspec validate extract-post-sources — чисто
|
||||
- [ ] Рестарт vesti-web, ручная проверка на посте с ссылками
|
||||
- [ ] Обновить TODO.md
|
||||
@@ -0,0 +1,8 @@
|
||||
# tasks
|
||||
|
||||
- [x] Создан OpenSpec change manual-direction (proposal/design/tasks)
|
||||
- [x] web/app.py: post_reclassify принимает manual_direction, impl_reclassify пишет его в БД без LLM
|
||||
- [x] web/templates/selected.html: select направлений в форме reclassify
|
||||
- [x] openspec validate manual-direction — чисто
|
||||
- [ ] Перезапуск vesti-web, ручная проверка: выбор направления → бейдж направления у поста
|
||||
- [ ] Обновить STATUS.md / TODO.md
|
||||
Reference in New Issue
Block a user