Files
board-viewer/.tasks/board-viewer-whitelist-auto-discovery.md
vitya 768167e376 tasks: + [board-viewer-whitelist-auto-discovery] round2 candidate (zero-maintenance namespaces)
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.
2026-05-22 18:43:08 +03:00

55 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 — РЕШИТЬ ДО ИМПЛА
1. **Schema:** `board_viewer_repos: [...]` остаётся как backward-compat (explicit list)? Или заменяется на `board_viewer_namespaces: ["victor", "cancel_music", "OpeItcLoc03"]`?
- Recommend: **обе**. Namespace-list автодискаверит, explicit-list оверрайдит / включает специальные. Build merge'ит обе.
2. **Filter criteria:** что считать «board-able» репо?
- Recommend: репо имеет файл `.tasks/STATUS.md` на default branch (через `/api/v1/repos/<owner>/<repo>/contents/.tasks/STATUS.md` HEAD-probe). Если 404 — пропустить тихо.
3. **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).
4. **Pagination:** Gitea API limit ~50 репо/page. Сколько у нас всего на org? `OpeItcLoc03` ≥5, `victor` ≥10, `cancel_music` ≥4. Single page достаточно сейчас, но добавить pagination loop на будущее.
5. **Error handling:** API rate-limit, network blip, partial response. Build-контейнер должен сделать best-effort, не crash'нуть entire tick.
6. **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`: merge `board_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`, `hasStatusMd`
- `src/config.ts` — schema: `board_viewer_namespaces?: string[]`, merge logic
- `src/reader.ts` — собрать full repo-list before iterating
- `tests/gitea.test.ts`, `tests/config.test.ts`, `tests/reader.test.ts`
- `deploy/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.
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: .workshop / 2026-05-22 / trigger: user-ux-feedback-round1-followup -->