- 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>
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>