T-6S37-sdf-active-work-view
Status: closed/done · Impact: high · Complexity: large
Give SDF its first real screen: the “active work, locally and on
Git/GitHub” view — tasks, leases, worktrees, PR verdicts — consumed from
the existing sanctioned data plane (GET /api/state). Reaching parity here
is the gate that authorizes the T-QT7X excision.
| Location | Role today |
|---|---|
apps/sdlc/lib/services/dashboard/server.ts | Bun/Hono server: GET /api/state, POST /api/refresh |
apps/sdlc/lib/services/dashboard/contract.ts | zod contract (DashboardState) — source for the typed client |
packages/ts/dashboard-client/ | generated typed client (createDashboardClient({baseUrl}).getState()) |
apps/dashboard/src/ | Vue SPA rendering the same view (manual reload only, no filter) — the ideas donor |
apps/sdf/src-nuxt/ is the scaffold shell from T-WDXJ with no views.
Proposed
Section titled “Proposed”An SDF active-work page with four cross-linked panels (tasks, leases,
local work, PRs) keyed by basename/task_id, the summary KPI strip, the
established status color language, interval polling, and a text filter
(restoring the two legacy-INDEX_HTML features the SPA dropped). Works in
browser mode against a dev proxy and in the desktop shell, which
supervises the backend via sdlc dashboard start/stop.
Approach
Section titled “Approach”- Consume
@sdlc/dashboard-clientfromsrc-nuxt(a packages/ts API library is the S-0008-sanctioned seam). Relative/apibase in browser; absolutehttp://127.0.0.1:<port>/apiin desktop. - Nuxt dev proxy
/api→127.0.0.1:6174;moon run sdf:devmirrors the olddashboard:devpattern (sdlc dashboard start --port 6174 && nuxt dev), exploiting start’s detach-and-return. - Desktop: on launch, spawn/attach
sdlc dashboard startfor the configured project root (Tauri shell plugin; v1 equivalent ofT-CKC1’s sidecar recommendation), reuse pidfile/registry semantics, stop on exit if we started it. - Port the panels from
apps/dashboard/srccomponents, adding polling (interval setting, default 5s) and text filter across headline/status/file/id; render leaseexpiry_stateandstale_inflightwarnings with the legacy pill treatment. - Storybook stories per panel against fixture DashboardState blobs.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
apps/sdf/src-nuxt/app/ | modify | active-work page, panel components, composables (poll, filter) |
apps/sdf/src-nuxt/package.json | modify | dashboard-client dependency |
apps/sdf/src-tauri/src/ | modify | backend supervise command (spawn/stop sdlc dashboard) |
apps/sdf/moon.yml | modify | dev task starts backend + nuxt dev |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: browser mode (
moon run sdf:dev) renders live tasks, leases, worktrees, and PR verdicts matchingGET /api/statefor this repo. - AC-2: view auto-refreshes on the polling interval and the text filter narrows the task list; both verified in tests and live.
- AC-3: desktop app launches, brings up (or attaches to) the backend, and shows the same data; closing the window stops a backend it started.
- AC-4: no imports from
apps/sdlc/lib/**(S-0008 validator passes).
Out of scope
Section titled “Out of scope”- New data sources or server routes (Phase 5 territory).
- Deleting
apps/dashboard(T-QT7X— immediately after this). - ontogen transports (
T-UBPG); this phase is plain HTTP via the existing client.
Dependencies
Section titled “Dependencies”T-WDXJ(hard): the scaffold this builds in.
Discovery context
Section titled “Discovery context”- Phase 2 of D-0018-sdf-control-plane-app. Feature gaps to restore (polling, filter) identified in the 2026-07-16 research pass against the legacy INDEX_HTML.
Depends on
Section titled “Depends on”T-WDXJ