Commit Graph

13 Commits

Author SHA1 Message Date
vitya
7cebeda219 docs(readme): fix emoji legend + fill quick start [skip-tdd: visual]
closes board-viewer-readme-emoji-fix

- Correct emoji set:  open / 🔴 in-progress / 🟡 paused / 🔵 blocked / 🟢 done
  (was /🟡/🟣/🔴/🟢 — pre-correction set from initial brainstorm)
- Filled TBD Quick start with npm test / typecheck / cli build / serve cmds
- Added Deploy + Architecture sections for new contributors

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:39:45 +03:00
vitya
9dda6298f0 task(review): independent review done, findings filed
closes board-viewer-review

Subagent code-review against design spec + acceptance criteria found:
- 2 Major: README emoji legend stale (board-viewer-readme-emoji-fix),
  card meta missing owner pill + last-commit-marker (board-viewer-card-meta-fix)
- 6 minor/nitpick bundled as board-viewer-polish

All shipped code: 43/43 tests pass, TDD-immutability clean, secret hygiene OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:16:36 +03:00
vitya
e4e1fa1254 task(cron-deploy): code complete; status 🟡 pending user-side deploy
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:10:18 +03:00
vitya
e64d94cd25 feat(deploy): docker-compose stack for VDS (board.kzntsv.site) [skip-tdd: visual]
closes board-viewer-cron-deploy

Two-service stack at /opt/stacks/board-viewer/ on VDS:
- board-viewer-build (node:22-alpine): cron-loop `while true; do node cli.ts; sleep 300`,
  writes to shared docker volume `dist`
- board-viewer-web (nginx:alpine): serves dist read-only,
  Traefik route Host(`board.kzntsv.site`) → letsEncrypt + basic-auth middleware

Files:
- deploy/Dockerfile.build — build image (registry.kzntsv.site/board-viewer-build)
- deploy/docker-compose.yml — stack with traefik labels (`proxy` network, same as Gitea)
- deploy/nginx.conf — static serving with Cache-Control
- deploy/auth.toml.example — Gitea token + board_viewer_repos whitelist
- deploy/.env.example — BOARD_VIEWER_USERS for basic-auth (with $$ escape note)
- deploy/README.md — DNS setup + image build/push + bootstrap + smoke + DR steps

Configs are declarative ([skip-tdd: visual]). Acceptance = deploy + curl
(see README §4 'Verify'). Both auth.toml and .env are gitignored.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:09:30 +03:00
vitya
cab4a8b92d task(html-render): close → 🟢, unblock cron-deploy
closes board-viewer-html-render

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:49:42 +03:00
vitya
c0661fb7b3 feat(viewer): group-by-project toggle + Gitea 404 handling
- static/board.js: full rerender on toggle-grouping; by-project mode = N cols
  per project with status-badge inside cards, sorted by canonical status order
- static/board.css: drop placeholder, add .badge.status
- src/gitea.ts: getLatestCommitIso returns null on 404 (path never existed
  remotely; seen on books repo where some per-task slugs in STATUS.md
  don't have file in default branch) + new test
- .gitignore: dist/ already present; add .playwright-mcp/, board-*.png

Smoke-verified: dist/index.html, 78 records from 4 repos, both toggle modes
work in browser, drawer lazy-fetches markdown.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:48:56 +03:00
vitya
4c59241d15 feat(cli): wire config+reader+render → dist/index.html [skip-tdd: visual+wrapper]
- src/cli.ts: load config, fetch board, write dist/index.html, copy static
- static/board.css: minimal raw CSS, system fonts, light/dark via prefers-color-scheme
- static/board.js: client-side filter, drawer (lazy-fetch + marked@14 from esm.sh),
  toggle-archived, refresh-info; ESM module
- npm run build → runs cli with --experimental-strip-types

CSS/JS = [skip-tdd: visual]. CLI = plumbing wrapper (~30 LOC of pure FS+orchestration
calling already-tested functions; over 10-line wrapper-skip threshold but no branching
logic — would be tested via smoke / e2e, not unit).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:44:59 +03:00
vitya
5bbbd0b533 feat(render): renderBoard + formatAge + partition (17 tests)
Pure renderer logic for the 5-col kanban view.
- formatAge: m/h/d/w/mo/y with calendar-month arithmetic
- partitionByStatus: canonical 5-col order
- renderBoard: 5 columns, cards with data-slug/data-raw-url/data-archived,
  HTML-escaped fields, JSON embed escaped via \uXXXX (XSS-safe)
- archived flag: done > 14d hidden by default (toggle visible)
- align task acceptance emoji set to 🔴🟡🔵🟢

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:43:29 +03:00
vitya
d093693795 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>
2026-05-22 12:48:37 +03:00
vitya
1c7e372abf feat(reader): STATUS.md parser + TS project scaffold [skip-tdd: visual for configs]
- vitest+TS scaffold (package.json/tsconfig/vitest.config = config artifacts)
- src/parser.ts: parses STATUS.md blocks → StatusBlock[]
- tests/parser.test.ts: 6 cases (single, multi, blocker, null-blocker, empty, unknown emoji)
- fix emoji contract: align with using-tasks reality ( open / 🔴 in_progress / 🟡 paused / 🔵 blocked / 🟢 done); reader-task acceptance + design doc updated

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:44:11 +03:00
vitya
ba33f8cf27 wiki(claude): add design-context pointers for board-viewer
closes board-viewer-pointers

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:08:36 +03:00
vitya
27465089b5 promote: workshop/board-viewer brainstorm → concepts + 5 tasks
- concepts/board-viewer.md (design, promoted from .workshop)
- .tasks/STATUS.md + 5 per-task files:
  - board-viewer-pointers (pre-impl, status=ready)
  - board-viewer-gitea-reader (impl, TDD, status=ready)
  - board-viewer-html-render (impl, TDD, blocker=gitea-reader)
  - board-viewer-cron-deploy (impl, infra carve-out, blocker=html-render)
  - board-viewer-review (umbrella, status=blocked)

TDD-mode embedded in impl-tasks per follow tdd-criteria trigger in CLAUDE.md.
MCP write-side workaround per memory reference_projects_meta_resolveTarget_bug.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 08:21:59 +03:00
vitya
d0dc686a65 chore: bootstrap project structure
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 08:10:40 +03:00