feat: gstack-sprint-dashboard — in-flight branch/stage visibility#2095
Open
m3dcodie wants to merge 7 commits into
Open
feat: gstack-sprint-dashboard — in-flight branch/stage visibility#2095m3dcodie wants to merge 7 commits into
m3dcodie wants to merge 7 commits into
Conversation
Read-only CLI that renders a self-contained HTML sprint board from gstack's own on-disk state (timeline.jsonl, analytics/*.jsonl, CHANGELOG.md, TODOS.md, git, gh pr list). No new instrumentation. Fills a gap /retro (backward-looking) and /landing-report (VERSION-queue-scoped) don't cover: what stage is each in-flight branch at right now, across a whole project. Design doc + 3-round adversarial review (10/10): /office-hours session. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Header stats: current version, in-flight branch count, ships this month, avg days/release, P1 backlog open, open decisions — all derived from existing state (VERSION, CHANGELOG.md, TODOS.md, decisions.active.json via gstack-decision-search). Pipeline board: replaces the single "latest stage" badge with all 7 stages as columns (office-hours/spec/plan-review/implement/review/ ship/canary), ticking every stage a branch's history has passed through, not just the latest. Canary added as a stage after ship. Shared computeBranchStageData/getChangelogVersions/getBacklogCounts helpers so the header stats and the existing widgets parse each source file once, not twice. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
spawn()'s ENOENT for a missing binary surfaces via the async 'error' event, not a synchronous throw — the prior try/catch never caught it, crashing the whole process when xdg-open isn't installed (the normal case on WSL, which has no desktop environment). WSL also now hands off to explorer.exe via WSL interop (wslpath -w to get a Windows-style path) instead of trying xdg-open at all. Verified against a real WSL2 box: the prior code crashed on `-- open`, this one opens the file in the user's actual Windows browser. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Merging to
After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here |
Extracts the monolithic sprint dashboard into lib/dashboard-data.ts and lib/dashboard-cli.ts, adds terminal-first output (compact default, --full), and keeps --web for HTML. Adds /dashboard skill, routing rules, tests, and proactive suggestions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
bin/gstack-sprint-dashboardis a read-only CLI that renders a sprint board from gstack's own on-disk state — no new instrumentation, no new user input.The gap:
/retrois backward-looking (what shipped),/landing-reportis VERSION-queue-scoped (what's claimed by open PRs). Neither answers "what is in-flight right now, and what stage is each branch at?" — the gap is acute when running several parallel Conductor sprints.What shipped:
/dashboardskill — slash-command discoverable; compact terminal by default,--fullfor all sections,--webto open the HTML board in a browsergstack-dash-onelinerbefore every skill invocation (disk-only, 3s timeout, silent on error):lib/dashboard-data.ts) — typed loaders and assemblers shared by CLI and HTML rendererslib/dashboard-cli.ts) — oneliner (~80 chars), compact (~30 lines), full (~80 lines)Pipeline columns: office-hours → spec → plan-review → implement → review → ship → canary
Every widget degrades gracefully when its source file doesn't exist.
CLI — full view (
/dashboard --full)CLI — compact view (
/dashboard, default)HTML board — screenshot
Engineering notes
Data layer extraction.
lib/dashboard-data.tsis shared by CLI and HTML renderers. Compact mode skipsghcalls for speed; full/web enables them. PR lookup is a single batchedgh pr list --json number,state,headRefName --limit 100call.Bugs caught during eng review:
loadBacklogregex matched all###headings (140 total) instead of only### P0:–### P4:(36). Fixed.inFlightCountused all-timelatestStage— stale branches (200+ days) counted as in-flight. Fixed to usestagesReached.size > 0which respects the 90-day window.loadPrDatawas O(N) serialghcalls. Batched to one call.xdg-openENOENT is async, bypassing try/catch. Fixed withchild.on("error")+explorer.exehandoff.Test coverage: 51 unit tests across
test/dashboard-data.test.tsandtest/dashboard-cli.test.ts.Test plan
bun testpasses (784 pass, 0 fail)cmd.exe— unverified. Sameexplorer.execode path should cover it.Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com