feat(voyage): implement dashboard via fleet-grid + fleet-tile with status vocabulary

Step 14 (v4.3 Sesjon 3 — Wave 3) — adds renderDashboard pipeline that
turns a ProjectArtifacts struct (produced by loadProjectDirectory in
Step 13) into a fleet-grid of fleet-tiles, one per artifact-type
(brief / plan / review / research / progress).

Status vocabulary: complete, in-progress, blocked, missing, stale
Severity mapping: missing → critical, blocked → high, in-progress
+ stale → medium, complete → low. Severity drives DS color tokens
via [data-severity] attribute selectors.

When loadProjectDirectory completes, dashboard takes over the main
stage (paste-flow elements hidden); topbar updates with project
breadcrumb. Step 13's pipeline already calls renderDashboard via
graceful-fallback, so wiring is automatic.

Test additions (4): fleet-grid + fleet-tile presence, renderDashboard
function declaration, status vocabulary completeness.
This commit is contained in:
Kjell Tore Guttormsen 2026-05-10 16:43:22 +02:00
commit a479f47b4e
2 changed files with 221 additions and 0 deletions

View file

@ -149,3 +149,30 @@ test('voyage-playground.html uses clipboard.writeText for copy flow (Step 11 exp
const text = readFileSync(HTML, 'utf-8');
assert.match(text, /clipboard\.writeText/, 'navigator.clipboard.writeText path required for command-copy');
});
// --- v4.3 Sesjon 3 — Step 14 (dashboard) + Step 15 (drill-down + URL routing) ----
test('voyage-playground.html declares fleet-grid container (v4.3 Step 14 dashboard)', () => {
const text = readFileSync(HTML, 'utf-8');
assert.match(text, /fleet-grid/, 'fleet-grid container required for dashboard layout');
});
test('voyage-playground.html declares fleet-tile (v4.3 Step 14 dashboard)', () => {
const text = readFileSync(HTML, 'utf-8');
assert.match(text, /fleet-tile/, 'fleet-tile required for per-artifact dashboard cell');
});
test('voyage-playground.html declares renderDashboard JS function (v4.3 Step 14)', () => {
const text = readFileSync(HTML, 'utf-8');
assert.match(text, /function renderDashboard\b/, 'renderDashboard function required');
});
test('voyage-playground.html declares dashboard status vocabulary (v4.3 Step 14)', () => {
const text = readFileSync(HTML, 'utf-8');
// Status vocabulary per plan: complete, in-progress, blocked, missing, stale
assert.match(text, /'complete'/, 'status complete required');
assert.match(text, /'in-progress'/, 'status in-progress required');
assert.match(text, /'blocked'/, 'status blocked required');
assert.match(text, /'missing'/, 'status missing required');
assert.match(text, /'stale'/, 'status stale required');
});