vitya cfa4572731 tasks: round1 UX feedback — 6 dev-tasks + review umbrella [board-viewer-ux-round1-review]
User первые впечатления после go-live board.kzntsv.site:
- drawer падает TypeError (приватные репо + no browser token; bundle md
  в build-time — единственно верное решение)
- slug не виден на карточке (только в data-attr)
- дата без времени, неясный формат
- owner-pill дублируется (single-owner whitelist → visual noise)
- нет нумерации задач (BV-12 / T-001 shorthand нужен)
- done-tail слишком длинный (нужен render-side cutoff/collapse)

Все 6 — code-impl в board-viewer (не deploy → не в .admin, per workshop §5).
TDD posture везде (project follow tdd-criteria).

Drawer bug = critical (clear-impl: bundle md в build-time, root-cause grounded).
Show-slug + full-datetime = clear-impl, простой TDD-цикл.
Owner-conditional = clear-impl (single vs multi owner branches), 2 fixtures.
Task-numbers + done-cutoff = design-first (4 open questions каждый),
brainstorm если recommendations не пройдут single-session.

+ review umbrella 🔵 blocked-by 6 slug'ами (workshop §4 mandatory).

Ops-handoff (rebuild image + Portainer pull) — отдельная taska в
.admin/[board-viewer-redeploy-ux-round1] (workshop §5).
2026-05-22 18:39:01 +03:00
2026-05-22 08:10:40 +03:00

board-viewer

About

Read-only HTML kanban-viewer над .tasks/*.md + Gitea API. Рендерит 5-колоночную доску ( open / 🔴 in-progress / 🟡 paused / 🔵 blocked / 🟢 done) по агрегированным таскам из всех whitelisted проектов.

Хост: board.kzntsv.site за traefik на VDS. Обновление: cron-тик ~5 мин, перегенерация статической HTML.

Design: .wiki/concepts/board-viewer.md (canonical). Process trace: ~/projects/.workshop/.archive/2026-05-22-board-viewer.md.

Quick start

npm install
npm test                                # 43 tests
npm run typecheck

# Local build (writes ./dist):
node --experimental-strip-types src/cli.ts <path-to-auth.toml>
# auth.toml needs: gitea_url, gitea_token, board_viewer_repos = ["owner/repo", ...]
# See deploy/auth.toml.example for the full shape.

# Then open dist/index.html via any static server, e.g.
( cd dist && python -m http.server 8765 ) &
# → http://localhost:8765/

Deploy

See deploy/README.md — Docker-compose stack on VDS, Traefik route + basic-auth.

Architecture

src/parser.ts   STATUS.md (markdown)            → StatusBlock[]   (pure)
src/gitea.ts    Gitea HTTP API (DI'd fetch)     → file content + last commit ISO + raw URL
src/reader.ts   readBoard(client, repos)        → TaskRecord[]    (orchestrator)
src/render.ts   renderBoard(records, opts)      → HTML string     (pure)
src/cli.ts      load config → reader → render   → dist/index.html + dist/static/
static/         CSS + ESM JS (filter, drawer, toggle-grouping)

Read-only: write-side intentionally absent. Drag-drop blocked on upstream projects-meta bug cluster — see brainstorm trace.

Description
Read-only HTML kanban-viewer over .tasks/*.md + Gitea API
Readme 357 KiB
Languages
TypeScript 73.1%
JavaScript 16.7%
CSS 10.2%