User: «у меня видны задачи всего из 4 проектов, нет твоих, .common, stostayer.new и пр.» Long-term solution — namespace-list в auth.toml + auto-discovery через /api/v1/orgs/<org>/repos с .tasks/STATUS.md filter. При добавлении нового репо в namespace — виден без edit'а auth.toml. Quick-win (ручное расширение whitelist) — параллельная таска в .admin/[board-viewer-expand-whitelist], ship'ается сегодня без code-change. Design-first — 6 open Q's (schema merge, filter HEAD-probe, API fallback, pagination, error handling, exclusions defer). Не блокер round1 review umbrella — round2 candidate.
4.7 KiB
4.7 KiB
board-viewer-whitelist-auto-discovery
Goal
Текущий board_viewer_repos в auth.toml — explicit list репо. При добавлении нового репо нужен edit + restart. Zero-maintenance подход: хранить list of orgs/users, build-контейнер сам discover'ит репо через Gitea API.
Design open questions — РЕШИТЬ ДО ИМПЛА
- Schema:
board_viewer_repos: [...]остаётся как backward-compat (explicit list)? Или заменяется наboard_viewer_namespaces: ["victor", "cancel_music", "OpeItcLoc03"]?- Recommend: обе. Namespace-list автодискаверит, explicit-list оверрайдит / включает специальные. Build merge'ит обе.
- Filter criteria: что считать «board-able» репо?
- Recommend: репо имеет файл
.tasks/STATUS.mdна default branch (через/api/v1/repos/<owner>/<repo>/contents/.tasks/STATUS.mdHEAD-probe). Если 404 — пропустить тихо.
- Recommend: репо имеет файл
- API endpoint:
/api/v1/orgs/<org>/reposдля org'ов,/api/v1/users/<user>/reposдля users. Какой namespace что — knowable заранее? Или try-both?- Recommend: try org → fall back to user. Кэшировать результат на время сессии build-контейнера (next-tick refresh).
- Pagination: Gitea API limit ~50 репо/page. Сколько у нас всего на org?
OpeItcLoc03≥5,victor≥10,cancel_music≥4. Single page достаточно сейчас, но добавить pagination loop на будущее. - Error handling: API rate-limit, network blip, partial response. Build-контейнер должен сделать best-effort, не crash'нуть entire tick.
- Exclusions: в namespace может быть много not-board-able репо (forks, archives, dotfiles). Filter — только по
.tasks/STATUS.mdсуществованию (см. #2). Может быть нужны явные exclude-patterns (board_viewer_exclude: ["**/legacy-*"])? Recommend: defer пока не появится конкретный кейс.
TDD posture
Mode = TDD. Failing test'ы:
- Unit
gitea.ts.listOrgRepos(org): возвращаетrepo[]для namespace через mock-fetch - Unit
gitea.ts.hasStatusMd(owner, repo): HEAD-probe, true/false - Unit
config.ts: mergeboard_viewer_namespaces+board_viewer_repos→ deduped list - Integration: build-контейнер с namespace-config'ом → reader gets ~N repos
- E2E smoke на dev: namespace=victor → board показывает stostayer.new + books + pilonuxt etc. (те у которых .tasks/STATUS.md)
Key files
src/gitea.ts— новые методыlistOrgRepos,listUserRepos,hasStatusMdsrc/config.ts— schema:board_viewer_namespaces?: string[], merge logicsrc/reader.ts— собрать full repo-list before iteratingtests/gitea.test.ts,tests/config.test.ts,tests/reader.test.tsdeploy/auth.toml.example— пример с обеими опциямиdeploy/README.md— описать обе schema
Pre-impl
- Brainstorm перед коммитом первой строки кода — 6 design-вопросов выше. Single-session с user'ом, если рекомендации принимаются — стартовать impl с design-комментарием в decisions log. Если возникает дилемма —
.workshop/.brainstorm/board-viewer-whitelist-auto-discovery.md.
Acceptance criteria
- Build-контейнер с
board_viewer_namespaces = ["victor", "cancel_music", "OpeItcLoc03"]автоматом подтягивает все репо у которых есть.tasks/STATUS.md - Добавление нового репо в namespace → виден на board без edit'а auth.toml (только next-tick через 5 мин)
- Обратная совместимость: existing
board_viewer_reposвсё ещё работает (merge'ится) - Все тесты pass + новые тесты для namespace-discovery
- Smoke на board.kzntsv.site — видны репо со всех 3 namespace'ов
Notes
- Связано с quick-win ops-таской
~/projects/.admin/.tasks/board-viewer-expand-whitelist.md— пока эта code-таска не сделана, админ edit'ит whitelist руками. - Может быть скомбинирована с round2 UX-фиксами (если они появятся). Не блокер для round1 review umbrella.