feat(reader): Gitea client + config + board orchestrator

closes board-viewer-gitea-reader

- src/gitea.ts: HTTP client (getFile, getLatestCommitIso, rawUrl); DI'd fetch
- src/reader.ts: readBoard(client, repos) → TaskRecord[]
- src/config.ts: TOML config loader with board_viewer_repos whitelist
- 25 tests total (9 parser incl. 3 real-repo fixtures, 7 gitea, 5 reader, 4 config)
- emoji contract 🔴🟡🔵🟢 (open/in_progress/paused/blocked/done)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
vitya
2026-05-22 12:48:37 +03:00
parent 1c7e372abf
commit d093693795
14 changed files with 2543 additions and 15 deletions

View File

@@ -9,19 +9,18 @@ _Updated: 2026-05-22_
---
## [board-viewer-gitea-reader] — Gitea API reader → normalized task structure
**Status:** ready
**Where I stopped:** разблокирована (pointers done); реализация не начата. Это первая импл-таска, остальные impl-таски зависят от её типов.
**Next action:** TDD по контракту в `board-viewer-gitea-reader.md`.
## 🟢 [board-viewer-gitea-reader] — Gitea API reader → normalized task structure
**Status:** done
**Where I stopped:** TaskRecord контракт реализован (parser+gitea+reader+config); 25 тестов; typecheck clean. Тесты используют 3 реальных STATUS.md fixture'а.
**Next action:** разблокировать html-render — потребляет `readBoard(client, repos) → TaskRecord[]`.
**Branch:** master
---
## ⚪ [board-viewer-html-render] — render 5-col kanban from normalized structure
**Status:** ready
**Where I stopped:** ждёт `board-viewer-gitea-reader` (использует его типы).
**Next action:** после ready-стейта reader'а TDD по контракту в `board-viewer-html-render.md`.
**Blocker:** board-viewer-gitea-reader
**Where I stopped:** reader готов, импортируется `TaskRecord` из `src/reader.ts`. Импл не начата.
**Next action:** TDD по контракту в `board-viewer-html-render.md`.
**Branch:** master
---