infinity-harness 2.8.9 → 2.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/extensions/infinity-harness/index.js +3614 -0
- package/dist/extensions/infinity-harness/index.js.map +1 -0
- package/dist/src/approval.js +154 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/core/brief.js +309 -0
- package/dist/src/core/brief.js.map +1 -0
- package/dist/src/core/config.js +539 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/exec.js +106 -0
- package/dist/src/core/exec.js.map +1 -0
- package/dist/src/core/featureList.js +365 -0
- package/dist/src/core/featureList.js.map +1 -0
- package/dist/src/core/fsx.js +123 -0
- package/dist/src/core/fsx.js.map +1 -0
- package/dist/src/core/gates.js +490 -0
- package/dist/src/core/gates.js.map +1 -0
- package/dist/src/core/init.js +480 -0
- package/dist/src/core/init.js.map +1 -0
- package/dist/src/core/lock.js +183 -0
- package/dist/src/core/lock.js.map +1 -0
- package/dist/src/core/modelRouter.js +185 -0
- package/dist/src/core/modelRouter.js.map +1 -0
- package/dist/src/core/paths.js +129 -0
- package/dist/src/core/paths.js.map +1 -0
- package/dist/src/core/phases.js +254 -0
- package/dist/src/core/phases.js.map +1 -0
- package/dist/src/core/plan.js +15 -0
- package/dist/src/core/plan.js.map +1 -0
- package/dist/src/core/runState.js +126 -0
- package/dist/src/core/runState.js.map +1 -0
- package/dist/src/core/settings.js +877 -0
- package/dist/src/core/settings.js.map +1 -0
- package/dist/src/core/skills.js +319 -0
- package/dist/src/core/skills.js.map +1 -0
- package/dist/src/core/skillsAudit.js +194 -0
- package/dist/src/core/skillsAudit.js.map +1 -0
- package/dist/src/core/types.js +77 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/daemon/budget.js +85 -0
- package/dist/src/daemon/budget.js.map +1 -0
- package/dist/src/daemon/guard.js +122 -0
- package/dist/src/daemon/guard.js.map +1 -0
- package/dist/src/daemon/index.js +461 -0
- package/dist/src/daemon/index.js.map +1 -0
- package/dist/src/daemon/isolation.js +84 -0
- package/dist/src/daemon/isolation.js.map +1 -0
- package/dist/src/daemon/preflight.js +131 -0
- package/dist/src/daemon/preflight.js.map +1 -0
- package/dist/src/daemon/server.js +174 -0
- package/dist/src/daemon/server.js.map +1 -0
- package/dist/src/daemon/supervisorState.js +42 -0
- package/dist/src/daemon/supervisorState.js.map +1 -0
- package/dist/src/daemon/worker.js +239 -0
- package/dist/src/daemon/worker.js.map +1 -0
- package/dist/src/daemon/worktree.js +102 -0
- package/dist/src/daemon/worktree.js.map +1 -0
- package/dist/src/escalate.js +312 -0
- package/dist/src/escalate.js.map +1 -0
- package/dist/src/exec/piWorker.js +630 -0
- package/dist/src/exec/piWorker.js.map +1 -0
- package/dist/src/goal.js +317 -0
- package/dist/src/goal.js.map +1 -0
- package/dist/src/goalLoop.js +374 -0
- package/dist/src/goalLoop.js.map +1 -0
- package/dist/src/goalSpec.js +397 -0
- package/dist/src/goalSpec.js.map +1 -0
- package/dist/src/goalState.js +255 -0
- package/dist/src/goalState.js.map +1 -0
- package/dist/src/handoff.js +205 -0
- package/dist/src/handoff.js.map +1 -0
- package/dist/src/intake.js +203 -0
- package/dist/src/intake.js.map +1 -0
- package/dist/src/loop.js +592 -0
- package/dist/src/loop.js.map +1 -0
- package/dist/src/modelRouter.js +216 -0
- package/dist/src/modelRouter.js.map +1 -0
- package/dist/src/remote.js +246 -0
- package/dist/src/remote.js.map +1 -0
- package/dist/src/replan.js +262 -0
- package/dist/src/replan.js.map +1 -0
- package/dist/src/review.js +54 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/rework.js +241 -0
- package/dist/src/rework.js.map +1 -0
- package/dist/src/runState.js +4 -0
- package/dist/src/runState.js.map +1 -0
- package/dist/src/scheduler.js +270 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/supervisor.js +787 -0
- package/dist/src/supervisor.js.map +1 -0
- package/dist/src/taskList.js +430 -0
- package/dist/src/taskList.js.map +1 -0
- package/dist/src/ui/config.js +268 -0
- package/dist/src/ui/config.js.map +1 -0
- package/dist/src/ui/dashboard.js +1288 -0
- package/dist/src/ui/dashboard.js.map +1 -0
- package/dist/src/ui/display.js +229 -0
- package/dist/src/ui/display.js.map +1 -0
- package/dist/src/ui/planTree.js +219 -0
- package/dist/src/ui/planTree.js.map +1 -0
- package/dist/src/ui/theme.js +298 -0
- package/dist/src/ui/theme.js.map +1 -0
- package/dist/src/ui/viewState.js +65 -0
- package/dist/src/ui/viewState.js.map +1 -0
- package/dist/src/ui/widget.js +721 -0
- package/dist/src/ui/widget.js.map +1 -0
- package/dist/src/ui/wizard.js +540 -0
- package/dist/src/ui/wizard.js.map +1 -0
- package/dist/src/unstuck.js +210 -0
- package/dist/src/unstuck.js.map +1 -0
- package/dist/src/worker.js +267 -0
- package/dist/src/worker.js.map +1 -0
- package/dist/src/workflow.js +250 -0
- package/dist/src/workflow.js.map +1 -0
- package/dist/tests/approval.test.js +144 -0
- package/dist/tests/approval.test.js.map +1 -0
- package/dist/tests/brief.test.js +271 -0
- package/dist/tests/brief.test.js.map +1 -0
- package/dist/tests/config.test.js +320 -0
- package/dist/tests/config.test.js.map +1 -0
- package/dist/tests/dashboard.test.js +277 -0
- package/dist/tests/dashboard.test.js.map +1 -0
- package/dist/tests/display.test.js +229 -0
- package/dist/tests/display.test.js.map +1 -0
- package/dist/tests/escalate.test.js +272 -0
- package/dist/tests/escalate.test.js.map +1 -0
- package/dist/tests/featureList.test.js +429 -0
- package/dist/tests/featureList.test.js.map +1 -0
- package/dist/tests/gates.test.js +333 -0
- package/dist/tests/gates.test.js.map +1 -0
- package/dist/tests/goal.test.js +229 -0
- package/dist/tests/goal.test.js.map +1 -0
- package/dist/tests/goalLoop.test.js +170 -0
- package/dist/tests/goalLoop.test.js.map +1 -0
- package/dist/tests/goalSpec.test.js +146 -0
- package/dist/tests/goalSpec.test.js.map +1 -0
- package/dist/tests/goalState.test.js +202 -0
- package/dist/tests/goalState.test.js.map +1 -0
- package/dist/tests/handoff.test.js +127 -0
- package/dist/tests/handoff.test.js.map +1 -0
- package/dist/tests/init.test.js +264 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/intake.test.js +288 -0
- package/dist/tests/intake.test.js.map +1 -0
- package/dist/tests/loop.test.js +453 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/modelRouter.test.js +131 -0
- package/dist/tests/modelRouter.test.js.map +1 -0
- package/dist/tests/phases.test.js +244 -0
- package/dist/tests/phases.test.js.map +1 -0
- package/dist/tests/planTree.test.js +190 -0
- package/dist/tests/planTree.test.js.map +1 -0
- package/dist/tests/remote.test.js +380 -0
- package/dist/tests/remote.test.js.map +1 -0
- package/dist/tests/replan.test.js +113 -0
- package/dist/tests/replan.test.js.map +1 -0
- package/dist/tests/review.test.js +77 -0
- package/dist/tests/review.test.js.map +1 -0
- package/dist/tests/rework.test.js +109 -0
- package/dist/tests/rework.test.js.map +1 -0
- package/dist/tests/routing-live.test.js +121 -0
- package/dist/tests/routing-live.test.js.map +1 -0
- package/dist/tests/runState.test.js +73 -0
- package/dist/tests/runState.test.js.map +1 -0
- package/dist/tests/settings.test.js +311 -0
- package/dist/tests/settings.test.js.map +1 -0
- package/dist/tests/skills.test.js +387 -0
- package/dist/tests/skills.test.js.map +1 -0
- package/dist/tests/supervisor.test.js +437 -0
- package/dist/tests/supervisor.test.js.map +1 -0
- package/dist/tests/surface.test.js +203 -0
- package/dist/tests/surface.test.js.map +1 -0
- package/dist/tests/taskList.test.js +376 -0
- package/dist/tests/taskList.test.js.map +1 -0
- package/dist/tests/theme.test.js +149 -0
- package/dist/tests/theme.test.js.map +1 -0
- package/dist/tests/unstuck.test.js +268 -0
- package/dist/tests/unstuck.test.js.map +1 -0
- package/dist/tests/widget.test.js +424 -0
- package/dist/tests/widget.test.js.map +1 -0
- package/dist/tests/worker.test.js +306 -0
- package/dist/tests/worker.test.js.map +1 -0
- package/dist/tests/workflow.test.js +187 -0
- package/dist/tests/workflow.test.js.map +1 -0
- package/extensions/infinity-harness/index.ts +39 -12
- package/package.json +5 -2
- package/src/core/modelRouter.ts +23 -1
- package/src/daemon/index.ts +3 -3
- package/src/daemon/worker.ts +28 -5
- package/src/ui/config.ts +25 -1
- package/src/ui/wizard.ts +10 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../tests/config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { escapeHtml, renderDashboard } from "../src/ui/dashboard.js";
|
|
3
|
+
function mkTask(id, status, extra = {}) {
|
|
4
|
+
return { id, description: `Do ${id}`, status, dependsOn: [], subtasks: [], ...extra };
|
|
5
|
+
}
|
|
6
|
+
function baseState(overrides = {}) {
|
|
7
|
+
return {
|
|
8
|
+
list: {
|
|
9
|
+
version: "2.0",
|
|
10
|
+
baseRevision: 7,
|
|
11
|
+
goals: [{ id: "goal-001", title: "Ship the harness" }],
|
|
12
|
+
sprints: [{ id: "sprint-001", name: "S1", goalId: "goal-001" }],
|
|
13
|
+
features: [
|
|
14
|
+
{
|
|
15
|
+
id: "feature-001",
|
|
16
|
+
name: "The first feature",
|
|
17
|
+
description: "does a thing",
|
|
18
|
+
sprintId: "sprint-001",
|
|
19
|
+
goalId: "goal-001",
|
|
20
|
+
passes: false,
|
|
21
|
+
tasks: [
|
|
22
|
+
mkTask("task-1", "complete"),
|
|
23
|
+
mkTask("task-2", "in_progress", {
|
|
24
|
+
key: "explicit-key",
|
|
25
|
+
dependsOn: ["task-1"],
|
|
26
|
+
difficulty: "difficult",
|
|
27
|
+
subtasks: [
|
|
28
|
+
{ id: "st-1", title: "first subtask", status: "complete" },
|
|
29
|
+
{ id: "st-2", title: "second subtask", status: "pending" },
|
|
30
|
+
],
|
|
31
|
+
}),
|
|
32
|
+
mkTask("task-3", "blocked"),
|
|
33
|
+
mkTask("task-4", "rework"),
|
|
34
|
+
mkTask("task-5", "pending"),
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
phase: "build",
|
|
40
|
+
enabledPhases: null,
|
|
41
|
+
paused: false,
|
|
42
|
+
gate: null,
|
|
43
|
+
baseRevision: 7,
|
|
44
|
+
timestamp: "2026-08-23T10:11:12.000Z",
|
|
45
|
+
retries: { task: 2, max: 10 },
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// ── escapeHtml ─────────────────────────────────────────────────────────────
|
|
50
|
+
{
|
|
51
|
+
assert.equal(escapeHtml("a & b"), "a & b");
|
|
52
|
+
assert.equal(escapeHtml("<script>"), "<script>");
|
|
53
|
+
assert.equal(escapeHtml('say "hi"'), "say "hi"");
|
|
54
|
+
assert.equal(escapeHtml("it's"), "it's");
|
|
55
|
+
assert.equal(escapeHtml(`&<>"'`), "&<>"'", "all five, in one pass");
|
|
56
|
+
assert.equal(escapeHtml("plain text 42"), "plain text 42", "innocent text is untouched");
|
|
57
|
+
assert.equal(escapeHtml(""), "");
|
|
58
|
+
// The ampersand must be escaped first, or every other entity is double-broken.
|
|
59
|
+
assert.equal(escapeHtml("<"), "&lt;", "an already-escaped entity is escaped again, not decoded");
|
|
60
|
+
assert.equal(escapeHtml("&amp;"), "&amp;amp;");
|
|
61
|
+
// The type says string, but these values come out of JSON.parse of files the
|
|
62
|
+
// harness does not control.
|
|
63
|
+
assert.equal(escapeHtml(42), "42");
|
|
64
|
+
assert.equal(escapeHtml(null), "null");
|
|
65
|
+
assert.equal(escapeHtml(undefined), "undefined");
|
|
66
|
+
assert.equal(escapeHtml({ toString: () => "<x>" }), "<x>");
|
|
67
|
+
// Attribute-breaking characters are covered, so the same helper is safe in
|
|
68
|
+
// both element text and quoted attribute values.
|
|
69
|
+
for (const c of ['"', "'", "<", ">", "&"]) {
|
|
70
|
+
assert.ok(!escapeHtml(`v${c}v`).includes(c) || c === "&", `${c} must not survive escaping`);
|
|
71
|
+
}
|
|
72
|
+
console.log("✓ escapeHtml covers & < > \" '");
|
|
73
|
+
}
|
|
74
|
+
// ── renderDashboard produces a complete, self-contained document ───────────
|
|
75
|
+
{
|
|
76
|
+
const html = renderDashboard(baseState());
|
|
77
|
+
assert.ok(html.startsWith("<!doctype html>"), "a complete document, not a fragment");
|
|
78
|
+
assert.ok(html.trimEnd().endsWith("</html>"));
|
|
79
|
+
assert.match(html, /<html lang="en">/);
|
|
80
|
+
assert.match(html, /<meta charset="utf-8">/);
|
|
81
|
+
assert.match(html, /<meta name="viewport"/);
|
|
82
|
+
assert.match(html, /<title>[^<]*BUILD[^<]*<\/title>/, "the tab title carries the phase");
|
|
83
|
+
assert.match(html, /<style>/);
|
|
84
|
+
assert.match(html, /<script>/);
|
|
85
|
+
assert.match(html, /<\/body>\n<\/html>/);
|
|
86
|
+
// Self-contained: the page is served from a localhost server with no asset
|
|
87
|
+
// routes, so any external reference is a broken page (or a privacy leak).
|
|
88
|
+
assert.ok(!html.includes("http://"), "no http:// reference anywhere in the document");
|
|
89
|
+
assert.ok(!html.includes("https://"), "no https:// reference anywhere in the document");
|
|
90
|
+
assert.ok(!/<link[^>]+href="(?!data:)/.test(html), "the only <link> is the inline data: favicon");
|
|
91
|
+
assert.ok(!/<img/.test(html), "no remote images");
|
|
92
|
+
assert.ok(!/<script[^>]+src=/.test(html), "no external scripts");
|
|
93
|
+
assert.ok(!/@import/.test(html), "no imported stylesheets");
|
|
94
|
+
assert.match(html, /<link rel="icon" href="data:,">/, "the favicon is inline so the server never 404s");
|
|
95
|
+
// The state the human came to read.
|
|
96
|
+
assert.match(html, /Ship the harness/, "the goal");
|
|
97
|
+
assert.match(html, /The first feature/, "the feature");
|
|
98
|
+
assert.match(html, /Do task-2/, "the task descriptions");
|
|
99
|
+
assert.match(html, /first subtask/, "subtasks of the active task");
|
|
100
|
+
assert.match(html, /rev 7/, "the plan revision");
|
|
101
|
+
assert.match(html, /1 blocked task/, "the alert strip counts blocked work");
|
|
102
|
+
assert.match(html, /1 in rework/);
|
|
103
|
+
assert.match(html, /retry budget 2 \/ 10/);
|
|
104
|
+
assert.match(html, /2026-08-23 10:11:12Z/, "the state timestamp");
|
|
105
|
+
assert.match(html, /#1/, "dependencies are labelled by plan position");
|
|
106
|
+
assert.match(html, /second subtask/, "the active task's subtasks are all listed");
|
|
107
|
+
console.log("✓ renderDashboard produces a complete self-contained document");
|
|
108
|
+
}
|
|
109
|
+
// ── XSS: every interpolated value comes back escaped ───────────────────────
|
|
110
|
+
{
|
|
111
|
+
const goalPayload = `<script>alert('goal')</script>`;
|
|
112
|
+
const taskPayload = `<script>alert("task")</script>`;
|
|
113
|
+
const gatePayload = `<script>alert(1)</script>`;
|
|
114
|
+
const featurePayload = `<img src=x onerror="alert('feature')">`;
|
|
115
|
+
const subtaskPayload = `<script>alert('sub')</script>`;
|
|
116
|
+
const gate = {
|
|
117
|
+
phase: "build",
|
|
118
|
+
overall: false,
|
|
119
|
+
failures: [`<script>alert('failure')</script>`],
|
|
120
|
+
checks: [
|
|
121
|
+
{
|
|
122
|
+
name: `<script>alert('name')</script>`,
|
|
123
|
+
pass: false,
|
|
124
|
+
detail: gatePayload,
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
const list = {
|
|
129
|
+
version: "2.0",
|
|
130
|
+
baseRevision: 1,
|
|
131
|
+
goals: [{ id: "goal-001", title: goalPayload, description: `" onmouseover="alert(1)` }],
|
|
132
|
+
sprints: [{ id: "sprint-001", name: `</span><script>alert('sprint')</script>` }],
|
|
133
|
+
features: [
|
|
134
|
+
{
|
|
135
|
+
id: `feature-001`,
|
|
136
|
+
name: featurePayload,
|
|
137
|
+
description: `<b>bold</b>`,
|
|
138
|
+
sprintId: "sprint-001",
|
|
139
|
+
goalId: "goal-001",
|
|
140
|
+
passes: false,
|
|
141
|
+
tasks: [
|
|
142
|
+
mkTask("task-1", "in_progress", {
|
|
143
|
+
description: taskPayload,
|
|
144
|
+
difficulty: `<script>alert('difficulty')</script>`,
|
|
145
|
+
dependsOn: [`<script>alert('dep')</script>`],
|
|
146
|
+
subtasks: [{ id: "st-1", title: subtaskPayload, status: "pending" }],
|
|
147
|
+
}),
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
const html = renderDashboard(baseState({ list, gate, phase: "build" }));
|
|
153
|
+
// Nothing executable survives.
|
|
154
|
+
assert.ok(!html.includes("<script>alert"), "no injected <script> tag survives");
|
|
155
|
+
assert.ok(!html.includes(goalPayload), "the goal title payload is not echoed raw");
|
|
156
|
+
assert.ok(!html.includes(taskPayload), "the task description payload is not echoed raw");
|
|
157
|
+
assert.ok(!html.includes(gatePayload), "the gate check detail payload is not echoed raw");
|
|
158
|
+
assert.ok(!html.includes(featurePayload), "the feature name payload is not echoed raw");
|
|
159
|
+
assert.ok(!html.includes(subtaskPayload), "the subtask payload is not echoed raw");
|
|
160
|
+
// The escaped text still reads "onerror=", which is fine — what matters is
|
|
161
|
+
// that no quote survives to close an attribute and open a handler.
|
|
162
|
+
assert.ok(!html.includes(`onerror="`), "no event handler is smuggled through an attribute");
|
|
163
|
+
assert.ok(!html.includes(`onmouseover="`), "no attribute break-out through the goal description");
|
|
164
|
+
assert.ok(!html.includes("<b>bold</b>"), "even harmless markup is escaped, not rendered");
|
|
165
|
+
// The only <script> in the document is the one the renderer itself emits.
|
|
166
|
+
assert.equal(html.split("<script>").length - 1, 1, "exactly one script tag: the polling loop");
|
|
167
|
+
// …and the text is still there, escaped, so the human can see what happened.
|
|
168
|
+
assert.ok(html.includes("<script>alert('goal')</script>"), "the goal payload is shown escaped");
|
|
169
|
+
assert.ok(html.includes("<script>alert("task")</script>"), "the task payload is shown escaped");
|
|
170
|
+
assert.ok(html.includes("<script>alert(1)</script>"), "the gate detail is shown escaped");
|
|
171
|
+
assert.ok(html.includes("<img src=x onerror=""), "the feature payload is shown escaped");
|
|
172
|
+
// A dangling dependency reference prints verbatim (escaped) rather than
|
|
173
|
+
// being hidden — it is a real planning bug.
|
|
174
|
+
assert.ok(html.includes("<script>alert('dep')</script>"));
|
|
175
|
+
console.log("✓ XSS payloads in goal, task, subtask and gate detail come back escaped");
|
|
176
|
+
}
|
|
177
|
+
// ── degenerate states still render a page ──────────────────────────────────
|
|
178
|
+
{
|
|
179
|
+
const empty = renderDashboard({
|
|
180
|
+
list: { version: "2.0", baseRevision: 0, features: [] },
|
|
181
|
+
phase: null,
|
|
182
|
+
baseRevision: 0,
|
|
183
|
+
timestamp: "not-a-timestamp",
|
|
184
|
+
});
|
|
185
|
+
assert.ok(empty.startsWith("<!doctype html>"));
|
|
186
|
+
assert.match(empty, /No plan yet/);
|
|
187
|
+
assert.match(empty, /not started/, "an un-started run says so");
|
|
188
|
+
assert.match(empty, /not-a-timestamp/, "an unparseable timestamp is shown as-is rather than as Invalid Date");
|
|
189
|
+
assert.ok(!empty.includes("NaN"), "no NaN leaks into the page");
|
|
190
|
+
// Junk statuses must not take the page down — a monitoring page that 500s
|
|
191
|
+
// because one task has a typo is worse than useless.
|
|
192
|
+
const junk = renderDashboard(baseState({
|
|
193
|
+
list: {
|
|
194
|
+
version: "2.0",
|
|
195
|
+
baseRevision: 1,
|
|
196
|
+
features: [
|
|
197
|
+
{
|
|
198
|
+
id: "f",
|
|
199
|
+
name: "F",
|
|
200
|
+
tasks: [
|
|
201
|
+
{ id: "a", description: "A", status: "nonsense" },
|
|
202
|
+
{ id: "b", description: "B", status: "done", subtasks: null },
|
|
203
|
+
{ id: "c", description: "C", status: "in-progress", dependsOn: null },
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
},
|
|
208
|
+
}));
|
|
209
|
+
assert.ok(junk.startsWith("<!doctype html>"));
|
|
210
|
+
assert.match(junk, /pending/, "an unknown status degrades to pending");
|
|
211
|
+
assert.match(junk, /complete/, "the legacy alias is normalised so the meter and the list agree");
|
|
212
|
+
assert.ok(!junk.includes("NaN"));
|
|
213
|
+
assert.ok(!junk.includes("undefined%"), "no broken width style");
|
|
214
|
+
// Paused is stated plainly.
|
|
215
|
+
const paused = renderDashboard(baseState({ paused: true }));
|
|
216
|
+
assert.match(paused, /paused/);
|
|
217
|
+
assert.match(paused, /<title>PAUSED · BUILD/);
|
|
218
|
+
console.log("✓ empty, junk and paused states still render");
|
|
219
|
+
}
|
|
220
|
+
// ── the numbers on the page agree with each other ──────────────────────────
|
|
221
|
+
{
|
|
222
|
+
const html = renderDashboard(baseState());
|
|
223
|
+
// 1 of 5 tasks complete.
|
|
224
|
+
assert.match(html, /<span class="count">1<\/span><span class="count-of"> \/ 5<\/span> tasks/);
|
|
225
|
+
assert.match(html, /<div class="pct">20<span class="pct-sign">%<\/span><\/div>/);
|
|
226
|
+
assert.match(html, /<span class="pct-inline">20%<\/span>/, "the masthead percentage matches the meter");
|
|
227
|
+
assert.match(html, /<title>BUILD · 20% · infinity-harness<\/title>/);
|
|
228
|
+
assert.match(html, /<span class="feature-count mono">1\/5<\/span>/, "the per-feature count agrees too");
|
|
229
|
+
console.log("✓ the progress numbers agree across the page");
|
|
230
|
+
}
|
|
231
|
+
// ── the background panel ───────────────────────────────────────────────────
|
|
232
|
+
//
|
|
233
|
+
// Same reason as the widget: once the work left the human's terminal this is
|
|
234
|
+
// the only place it is visible, so it has to name the session, the unit and
|
|
235
|
+
// the model — and it must escape everything, because a worker's "doing" line
|
|
236
|
+
// is a tool call with a path in it, which is attacker-adjacent input.
|
|
237
|
+
{
|
|
238
|
+
const html = renderDashboard(baseState({
|
|
239
|
+
engine: "background",
|
|
240
|
+
workers: [
|
|
241
|
+
{
|
|
242
|
+
name: "W2",
|
|
243
|
+
unitLabel: "feature-002 · Checkout",
|
|
244
|
+
level: "feature",
|
|
245
|
+
model: "openrouter/big-model",
|
|
246
|
+
servedModel: "openrouter/big-model",
|
|
247
|
+
difficulty: "difficult",
|
|
248
|
+
state: "working",
|
|
249
|
+
doing: "edit src/<script>alert(1)</script>.ts",
|
|
250
|
+
turns: 3,
|
|
251
|
+
tokens: { inputTokens: 40000, outputTokens: 1200 },
|
|
252
|
+
contextRatio: 0.42,
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
activity: [
|
|
256
|
+
{ at: "2026-08-29T09:14:00.000Z", level: "info", worker: null, text: "supervisor started" },
|
|
257
|
+
{ at: "2026-08-29T09:14:30.000Z", level: "warn", worker: "W2", text: "gate failed: tests" },
|
|
258
|
+
],
|
|
259
|
+
}));
|
|
260
|
+
assert.match(html, /class="card background"/);
|
|
261
|
+
assert.match(html, /background pi sessions/);
|
|
262
|
+
assert.match(html, /W2/);
|
|
263
|
+
assert.match(html, /feature-002 · Checkout/);
|
|
264
|
+
assert.match(html, /openrouter\/big-model/, "the model is on the card");
|
|
265
|
+
assert.match(html, /41,200 tokens/, "and what it has spent");
|
|
266
|
+
assert.match(html, /42% ctx/);
|
|
267
|
+
assert.match(html, /is-working/, "a live session is marked live");
|
|
268
|
+
assert.match(html, /gate failed: tests/, "the log is there");
|
|
269
|
+
assert.ok(!html.includes("<script>alert(1)</script>"), "worker output is escaped");
|
|
270
|
+
const idle = renderDashboard(baseState({ engine: "background" }));
|
|
271
|
+
assert.match(idle, /no background session running/);
|
|
272
|
+
const legacy = renderDashboard(baseState({ engine: "main-session" }));
|
|
273
|
+
assert.match(legacy, /Work runs in the pi session you started the harness from/);
|
|
274
|
+
console.log("✓ the background panel names the session, the unit and the model");
|
|
275
|
+
}
|
|
276
|
+
console.log("All dashboard tests PASS");
|
|
277
|
+
//# sourceMappingURL=dashboard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.test.js","sourceRoot":"","sources":["../../tests/dashboard.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,wBAAwB,CAAC;AAG1F,SAAS,MAAM,CAAC,EAAU,EAAE,MAAkB,EAAE,QAAiC,EAAE;IACjF,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,SAAS,CAAC,YAAqC,EAAE;IACxD,OAAO;QACL,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,CAAC;YACf,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;YACtD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;YAC/D,QAAQ,EAAE;gBACR;oBACE,EAAE,EAAE,aAAa;oBACjB,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EAAE,cAAc;oBAC3B,QAAQ,EAAE,YAAY;oBACtB,MAAM,EAAE,UAAU;oBAClB,MAAM,EAAE,KAAK;oBACb,KAAK,EAAE;wBACL,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;wBAC5B,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE;4BAC9B,GAAG,EAAE,cAAc;4BACnB,SAAS,EAAE,CAAC,QAAQ,CAAC;4BACrB,UAAU,EAAE,WAAW;4BACvB,QAAQ,EAAE;gCACR,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE;gCAC1D,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE;6BAC3D;yBACF,CAAC;wBACF,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC;wBAC3B,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;wBAC1B,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC;qBAC5B;iBACF;aACF;SACF;QACD,KAAK,EAAE,OAAO;QACd,aAAa,EAAE,IAAI;QACnB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,0BAA0B;QACrC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QAC7B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,CAAC;IACC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,0BAA0B,EAAE,uBAAuB,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,4BAA4B,CAAC,CAAC;IACzF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjC,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,yDAAyD,CAAC,CAAC;IACxG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,CAAC;IAEvD,6EAA6E;IAC7E,4BAA4B;IAC5B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAuB,CAAC,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAyB,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAA8B,CAAC,EAAE,WAAW,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAuB,CAAC,EAAE,WAAW,CAAC,CAAC;IAEtF,2EAA2E;IAC3E,iDAAiD;IACjD,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,CAAC;IACC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IAE1C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,qCAAqC,CAAC,CAAC;IACrF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,iCAAiC,EAAE,iCAAiC,CAAC,CAAC;IACzF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IAEzC,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,+CAA+C,CAAC,CAAC;IACtF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,gDAAgD,CAAC,CAAC;IACxF,MAAM,CAAC,EAAE,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,6CAA6C,CAAC,CAAC;IAClG,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,iCAAiC,EAAE,gDAAgD,CAAC,CAAC;IAExG,oCAAoC;IACpC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,uBAAuB,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,6BAA6B,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,qCAAqC,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,4CAA4C,CAAC,CAAC;IAEvE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,2CAA2C,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;AAC/E,CAAC;AAED,8EAA8E;AAC9E,CAAC;IACC,MAAM,WAAW,GAAG,gCAAgC,CAAC;IACrD,MAAM,WAAW,GAAG,gCAAgC,CAAC;IACrD,MAAM,WAAW,GAAG,2BAA2B,CAAC;IAChD,MAAM,cAAc,GAAG,wCAAwC,CAAC;IAChE,MAAM,cAAc,GAAG,+BAA+B,CAAC;IAEvD,MAAM,IAAI,GAAe;QACvB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,CAAC,mCAAmC,CAAC;QAC/C,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,gCAAgC;gBACtC,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,WAAW;aACpB;SACF;KACF,CAAC;IAEF,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;QACvF,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,yCAAyC,EAAE,CAAC;QAChF,QAAQ,EAAE;YACR;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,cAAc;gBACpB,WAAW,EAAE,aAAa;gBAC1B,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE;oBACL,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE;wBAC9B,WAAW,EAAE,WAAW;wBACxB,UAAU,EAAE,sCAAsC;wBAClD,SAAS,EAAE,CAAC,+BAA+B,CAAC;wBAC5C,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;qBACrE,CAAC;iBACH;aACF;SACF;KACF,CAAC;IAEF,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAExE,+BAA+B;IAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,mCAAmC,CAAC,CAAC;IAChF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,0CAA0C,CAAC,CAAC;IACnF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,gDAAgD,CAAC,CAAC;IACzF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,iDAAiD,CAAC,CAAC;IAC1F,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,4CAA4C,CAAC,CAAC;IACxF,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,uCAAuC,CAAC,CAAC;IACnF,2EAA2E;IAC3E,mEAAmE;IACnE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,mDAAmD,CAAC,CAAC;IAC5F,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,qDAAqD,CAAC,CAAC;IAClG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,+CAA+C,CAAC,CAAC;IAE1F,0EAA0E;IAC1E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,0CAA0C,CAAC,CAAC;IAE/F,6EAA6E;IAC7E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,oDAAoD,CAAC,EAAE,mCAAmC,CAAC,CAAC;IACpH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,sDAAsD,CAAC,EAAE,mCAAmC,CAAC,CAAC;IACtH,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,uCAAuC,CAAC,EAAE,kCAAkC,CAAC,CAAC;IACtG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAEjG,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,mDAAmD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;AACzF,CAAC;AAED,8EAA8E;AAC9E,CAAC;IACC,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvD,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,CAAC;QACf,SAAS,EAAE,iBAAiB;KAC7B,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,qEAAqE,CAAC,CAAC;IAC9G,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAEhE,0EAA0E;IAC1E,qDAAqD;IACrD,MAAM,IAAI,GAAG,eAAe,CAC1B,SAAS,CAAC;QACR,IAAI,EAAE;YACJ,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,CAAC;YACf,QAAQ,EAAE;gBACR;oBACE,EAAE,EAAE,GAAG;oBACP,IAAI,EAAE,GAAG;oBACT,KAAK,EAAE;wBACL,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,UAAwB,EAAE;wBAC/D,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,MAAoB,EAAE,QAAQ,EAAE,IAAa,EAAE;wBACpF,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,aAA2B,EAAE,SAAS,EAAE,IAAa,EAAE;qBAC7F;iBACF;aACF;SACF;KACF,CAAC,CACH,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;IACvE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,gEAAgE,CAAC,CAAC;IACjG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC,CAAC;IAEjE,4BAA4B;IAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAC9E,CAAC;IACC,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1C,yBAAyB;IACzB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yEAAyE,CAAC,CAAC;IAC9F,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,4DAA4D,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sCAAsC,EAAE,2CAA2C,CAAC,CAAC;IACxG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gDAAgD,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,+CAA+C,EAAE,kCAAkC,CAAC,CAAC;IACxG,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAC9E,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,sEAAsE;AACtE,CAAC;IACC,MAAM,IAAI,GAAG,eAAe,CAC1B,SAAS,CAAC;QACR,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,wBAAwB;gBACnC,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,sBAAsB;gBAC7B,WAAW,EAAE,sBAAsB;gBACnC,UAAU,EAAE,WAAW;gBACvB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,uCAAuC;gBAC9C,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE;gBAClD,YAAY,EAAE,IAAI;aACnB;SACF;QACD,QAAQ,EAAE;YACR,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE;YAC3F,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE;SAC5F;KACF,CAAC,CACH,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;IACxE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,+BAA+B,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;IAC7D,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,0BAA0B,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,0DAA0D,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC;AAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display templates: what the surfaces actually draw.
|
|
3
|
+
*
|
|
4
|
+
* Shipping all five plan levels to everyone was the wrong answer for the same
|
|
5
|
+
* reason shipping two was. One person works in sprints and never opens a
|
|
6
|
+
* subtask; the next has no sprints and lives in the subtask list. So it is a
|
|
7
|
+
* setting, with templates for the common shapes.
|
|
8
|
+
*
|
|
9
|
+
* The rule worth defending: **hiding a level must not hide what is under it**.
|
|
10
|
+
* Turning off sprints on a plan organised into sprints has to show the
|
|
11
|
+
* features one indent shallower, not delete half the plan from view. A task
|
|
12
|
+
* nobody can see is a task that gets stuck forever.
|
|
13
|
+
*/
|
|
14
|
+
import assert from "node:assert/strict";
|
|
15
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
import { BUILTIN_DISPLAYS, builtInDisplay, defaultDisplay, deleteDisplay, describeDisplay, findDisplay, listDisplays, loadSavedDisplays, matchDisplay, normalizeDisplay, saveDisplay, summarizeDisplay, } from "../src/ui/display.js";
|
|
19
|
+
import { buildPlanRows } from "../src/ui/planTree.js";
|
|
20
|
+
import { renderWidget } from "../src/ui/widget.js";
|
|
21
|
+
import { renderDashboard } from "../src/ui/dashboard.js";
|
|
22
|
+
import { createStyler, UNICODE_GLYPHS, width } from "../src/ui/theme.js";
|
|
23
|
+
import { userDisplayPath } from "../src/core/paths.js";
|
|
24
|
+
const PLAN = {
|
|
25
|
+
version: "2.0",
|
|
26
|
+
baseRevision: 4,
|
|
27
|
+
goals: [
|
|
28
|
+
{ id: "goal-001", title: "Reconcile payouts" },
|
|
29
|
+
{ id: "goal-002", title: "Then make it fast" },
|
|
30
|
+
],
|
|
31
|
+
sprints: [{ id: "sprint-001", name: "Foundations", goalId: "goal-001" }],
|
|
32
|
+
features: [
|
|
33
|
+
{
|
|
34
|
+
id: "feature-001",
|
|
35
|
+
name: "Ledger import",
|
|
36
|
+
sprintId: "sprint-001",
|
|
37
|
+
goalId: "goal-001",
|
|
38
|
+
criteria: ["refunds reconcile against the ledger"],
|
|
39
|
+
tasks: [
|
|
40
|
+
{
|
|
41
|
+
id: "task-001",
|
|
42
|
+
description: "Parse the payout CSV",
|
|
43
|
+
status: "in_progress",
|
|
44
|
+
dependsOn: [],
|
|
45
|
+
subtasks: [{ id: "s1", title: "handle the BOM", status: "pending" }],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "feature-002",
|
|
51
|
+
name: "Caching",
|
|
52
|
+
goalId: "goal-002",
|
|
53
|
+
tasks: [{ id: "task-002", description: "Memoise the FX table", status: "pending", subtasks: [] }],
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
const PLAIN = createStyler("none");
|
|
58
|
+
const widgetText = (policy = defaultDisplay()) => renderWidget({ list: PLAN, phase: "build", display: policy, view: { scroll: 0, expanded: false } }, { width: 76, styler: PLAIN, glyphs: UNICODE_GLYPHS }).join("\n");
|
|
59
|
+
const dashboardText = (policy = defaultDisplay()) => renderDashboard({
|
|
60
|
+
list: PLAN,
|
|
61
|
+
phase: "build",
|
|
62
|
+
baseRevision: 4,
|
|
63
|
+
timestamp: new Date(0).toISOString(),
|
|
64
|
+
display: policy,
|
|
65
|
+
});
|
|
66
|
+
function sandbox() {
|
|
67
|
+
const dir = mkdtempSync(join(tmpdir(), "display-store-"));
|
|
68
|
+
return { env: { PI_CODING_AGENT_DIR: dir }, clean: () => rmSync(dir, { recursive: true, force: true }) };
|
|
69
|
+
}
|
|
70
|
+
// ── the built-in templates ─────────────────────────────────────────────────
|
|
71
|
+
{
|
|
72
|
+
assert.ok(BUILTIN_DISPLAYS.length >= 3, "at least three ship with the package");
|
|
73
|
+
for (const t of BUILTIN_DISPLAYS) {
|
|
74
|
+
assert.ok(t.builtIn);
|
|
75
|
+
assert.ok(t.description.length > 20, `${t.id} says what it is for`);
|
|
76
|
+
assert.equal(t.policy.preset, t.id, "a template's policy names the template");
|
|
77
|
+
assert.deepEqual(normalizeDisplay(t.policy), t.policy, `${t.id} is already normalised`);
|
|
78
|
+
}
|
|
79
|
+
assert.equal(builtInDisplay("focus")?.policy.levels.subtask, "active");
|
|
80
|
+
assert.equal(builtInDisplay("everything")?.policy.levels.subtask, "all");
|
|
81
|
+
assert.equal(builtInDisplay("overview")?.policy.levels.task, false);
|
|
82
|
+
assert.equal(builtInDisplay("worklist")?.policy.levels.feature, false);
|
|
83
|
+
assert.equal(builtInDisplay("nope"), null);
|
|
84
|
+
console.log("✓ the templates ship, differ from each other, and explain themselves");
|
|
85
|
+
}
|
|
86
|
+
// ── both surfaces obey the same policy ─────────────────────────────────────
|
|
87
|
+
{
|
|
88
|
+
for (const t of BUILTIN_DISPLAYS) {
|
|
89
|
+
const widget = widgetText(t.policy);
|
|
90
|
+
const dashboard = dashboardText(t.policy);
|
|
91
|
+
// Dashboard renders the full tree (goal→feature→task→subtask) — it must respect every level.
|
|
92
|
+
for (const [level, needle] of [
|
|
93
|
+
["goal", "Reconcile payouts"],
|
|
94
|
+
["sprint", "Foundations"],
|
|
95
|
+
["feature", "Ledger import"],
|
|
96
|
+
["task", "Parse the payout CSV"],
|
|
97
|
+
]) {
|
|
98
|
+
const wanted = t.policy.levels[level];
|
|
99
|
+
assert.equal(dashboard.includes(needle), wanted, `${t.id}: the dashboard should ${wanted ? "show" : "hide"} ${level}`);
|
|
100
|
+
}
|
|
101
|
+
const wantsSubtasksDashboard = t.policy.levels.subtask !== "none" && t.policy.levels.task;
|
|
102
|
+
assert.equal(dashboard.includes("handle the BOM"), wantsSubtasksDashboard, `${t.id}: dashboard subtasks`);
|
|
103
|
+
assert.equal(dashboard.includes("refunds reconcile against the ledger"), t.policy.criteria && t.policy.levels.feature, `${t.id}: acceptance criteria`);
|
|
104
|
+
// Widget is the compact TUI: goal/sprint/feature/subtask honour the policy as above, but:
|
|
105
|
+
// - tasks emit the lane only when display.levels.task == true (overview suppresses lane).
|
|
106
|
+
// - on narrow TUI (76 cols) the lane truncates — needles must allow truncation.
|
|
107
|
+
if (t.policy.levels.task) {
|
|
108
|
+
// Full task description truncated to key+desc(36) inside the chain — needle fits at 76 as compositeKey or prefix.
|
|
109
|
+
const laneHasTask = widget.includes("Parse the") || widget.includes("feature-001/task-001");
|
|
110
|
+
assert.equal(laneHasTask, true, `${t.id}: widget shows active task (lane)`);
|
|
111
|
+
assert.equal(widget.includes("handle the BOM"), t.policy.levels.subtask !== "none", `${t.id}: widget subtasks on chain`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
// overview hides tasks entirely — widget lane is suppressed
|
|
115
|
+
assert.ok(!widget.includes("Parse the payout"), `${t.id}: widget hides task when task level off`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
console.log("✓ what you configure once is what both the widget and the dashboard draw");
|
|
119
|
+
}
|
|
120
|
+
// ── hiding a level never hides what is under it ────────────────────────────
|
|
121
|
+
// Dashboard is the authoritative tree; widget is the compact TUI (single-lane chain).
|
|
122
|
+
// So we assert dashboard for hierarchy, widget only for task visibility.
|
|
123
|
+
{
|
|
124
|
+
const noSprints = normalizeDisplay({ ...defaultDisplay(), levels: { ...defaultDisplay().levels, sprint: false } });
|
|
125
|
+
assert.ok(!dashboardText(noSprints).includes("Foundations"), "the sprint row is gone (dashboard)");
|
|
126
|
+
assert.ok(dashboardText(noSprints).includes("Ledger import"), "and its feature is still there (dashboard)");
|
|
127
|
+
assert.ok(dashboardText(noSprints).includes("Parse the payout CSV"), "and so is the task under that (dashboard)");
|
|
128
|
+
const noFeatures = normalizeDisplay({
|
|
129
|
+
...defaultDisplay(),
|
|
130
|
+
levels: { ...defaultDisplay().levels, feature: false },
|
|
131
|
+
});
|
|
132
|
+
assert.ok(!dashboardText(noFeatures).includes("Ledger import"), "feature row gone (dashboard)");
|
|
133
|
+
assert.ok(dashboardText(noFeatures).includes("Parse the payout CSV"), "tasks survive a hidden feature (dashboard)");
|
|
134
|
+
// Widget chain keeps compositeKey lane even when feature hidden — that is the minimal identifier for that lane.
|
|
135
|
+
assert.ok(widgetText(noFeatures).includes("Parse the payout CSV"), "TUI lane still shows task when feature hidden");
|
|
136
|
+
// Numbering has to keep meaning the same task whatever is on screen, or
|
|
137
|
+
// `← #3` points at the wrong row.
|
|
138
|
+
const hidden = buildPlanRows(PLAN, null, { levels: { feature: false, sprint: false, goal: false } });
|
|
139
|
+
const shown = buildPlanRows(PLAN, null);
|
|
140
|
+
assert.deepEqual(hidden.filter((r) => r.level === "task").map((r) => r.index), shown.filter((r) => r.level === "task").map((r) => r.index), "task numbers do not shift when a grouping level is hidden");
|
|
141
|
+
console.log("✓ hiding a level hides the row, never the work beneath it");
|
|
142
|
+
}
|
|
143
|
+
// ── the chrome is optional too ─────────────────────────────────────────────
|
|
144
|
+
{
|
|
145
|
+
const bare = normalizeDisplay({
|
|
146
|
+
...defaultDisplay(),
|
|
147
|
+
rail: false,
|
|
148
|
+
progress: false,
|
|
149
|
+
alerts: false,
|
|
150
|
+
counts: false,
|
|
151
|
+
dependencies: false,
|
|
152
|
+
});
|
|
153
|
+
const text = widgetText(bare);
|
|
154
|
+
assert.ok(!/define ─|◉ BUILD/.test(text), "no phase rail");
|
|
155
|
+
assert.ok(!/▰|▱/.test(text), "no progress meter");
|
|
156
|
+
assert.ok(text.includes("Ledger import"), "and the plan is still there");
|
|
157
|
+
assert.ok(!/\d+\/\d+$/m.test(text.replace(/\s+$/gm, "")), "no counts hanging off the right edge");
|
|
158
|
+
// Every combination has to render, at every width, without overrunning.
|
|
159
|
+
for (const t of [...BUILTIN_DISPLAYS.map((d) => d.policy), bare]) {
|
|
160
|
+
for (const w of [24, 40, 58, 76, 120]) {
|
|
161
|
+
const lines = renderWidget({ list: PLAN, phase: "build", display: t }, { width: w, styler: PLAIN, glyphs: UNICODE_GLYPHS, boxed: true });
|
|
162
|
+
for (const l of lines) {
|
|
163
|
+
assert.equal(width(l), w, `${t.preset} at ${w} columns produced a ${width(l)}-column line`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
console.log("✓ the rail, the meter, the alerts and the counts are each optional, at every width");
|
|
168
|
+
}
|
|
169
|
+
// ── saving, reusing, deleting ──────────────────────────────────────────────
|
|
170
|
+
{
|
|
171
|
+
const box = sandbox();
|
|
172
|
+
assert.deepEqual(loadSavedDisplays(box.env), []);
|
|
173
|
+
const policy = normalizeDisplay({
|
|
174
|
+
...defaultDisplay(),
|
|
175
|
+
levels: { goal: false, sprint: true, feature: true, task: true, subtask: "all" },
|
|
176
|
+
});
|
|
177
|
+
const saved = saveDisplay({ name: "Sprint view", policy }, box.env);
|
|
178
|
+
assert.equal(saved.ok, true, saved.error ?? "");
|
|
179
|
+
assert.equal(saved.template?.id, "sprint-view");
|
|
180
|
+
assert.equal(saved.template?.policy.preset, "sprint-view", "the saved policy names itself");
|
|
181
|
+
assert.ok(saved.template.description.length > 0);
|
|
182
|
+
assert.equal(findDisplay("sprint-view", box.env)?.name, "Sprint view");
|
|
183
|
+
assert.equal(listDisplays(box.env).length, BUILTIN_DISPLAYS.length + 1);
|
|
184
|
+
assert.equal(deleteDisplay("sprint-view", box.env).ok, true);
|
|
185
|
+
assert.equal(loadSavedDisplays(box.env).length, 0);
|
|
186
|
+
assert.equal(saveDisplay({ name: "focus", policy }, box.env).ok, false, "a built-in name is taken");
|
|
187
|
+
assert.equal(deleteDisplay("focus", box.env).ok, false, "and a built-in cannot be deleted");
|
|
188
|
+
box.clean();
|
|
189
|
+
console.log("✓ a template can be saved under a name and reused, and built-ins are protected");
|
|
190
|
+
}
|
|
191
|
+
// ── junk in, a widget out ──────────────────────────────────────────────────
|
|
192
|
+
{
|
|
193
|
+
// Every field is read on every render, inside a pi lifecycle hook, so a
|
|
194
|
+
// hand-edited config has to produce a widget rather than kill the session.
|
|
195
|
+
const junk = normalizeDisplay({ levels: "yes", counts: "sure", taskWindow: -12, preset: 42 });
|
|
196
|
+
assert.equal(junk.levels.goal, true);
|
|
197
|
+
assert.equal(junk.counts, true);
|
|
198
|
+
assert.ok(junk.taskWindow >= 3, "a window of -12 would be a widget with no plan in it");
|
|
199
|
+
assert.equal(junk.preset, defaultDisplay().preset);
|
|
200
|
+
assert.deepEqual(normalizeDisplay(null), defaultDisplay());
|
|
201
|
+
assert.deepEqual(normalizeDisplay(undefined), defaultDisplay());
|
|
202
|
+
assert.equal(normalizeDisplay({ taskWindow: 10_000 }).taskWindow, 60, "and an absurd one is capped");
|
|
203
|
+
assert.equal(normalizeDisplay({ levels: { subtask: "sometimes" } }).levels.subtask, "active");
|
|
204
|
+
assert.doesNotThrow(() => widgetText(junk));
|
|
205
|
+
const box = sandbox();
|
|
206
|
+
const path = userDisplayPath(box.env);
|
|
207
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
208
|
+
writeFileSync(path, "{not json", "utf-8");
|
|
209
|
+
assert.deepEqual(loadSavedDisplays(box.env), [], "a corrupt store leaves the built-ins");
|
|
210
|
+
box.clean();
|
|
211
|
+
console.log("✓ a nonsense policy is repaired rather than thrown");
|
|
212
|
+
}
|
|
213
|
+
// ── describing ─────────────────────────────────────────────────────────────
|
|
214
|
+
{
|
|
215
|
+
const box = sandbox();
|
|
216
|
+
assert.match(describeDisplay(defaultDisplay()), /goal/);
|
|
217
|
+
assert.match(describeDisplay(builtInDisplay("worklist").policy), /^task/);
|
|
218
|
+
assert.match(describeDisplay(normalizeDisplay({
|
|
219
|
+
levels: { goal: false, sprint: false, feature: false, task: false, subtask: "none" },
|
|
220
|
+
})), /every level is hidden/, "an empty display says so rather than rendering an empty string");
|
|
221
|
+
assert.equal(matchDisplay(builtInDisplay("overview").policy, box.env)?.id, "overview");
|
|
222
|
+
assert.match(summarizeDisplay(builtInDisplay("overview").policy, box.env), /^overview ·/);
|
|
223
|
+
const drifted = { ...builtInDisplay("overview").policy, counts: false };
|
|
224
|
+
assert.equal(matchDisplay(drifted, box.env), null);
|
|
225
|
+
assert.match(summarizeDisplay(drifted, box.env), /\(edited\)/, "a hand-edited policy stops claiming the name");
|
|
226
|
+
box.clean();
|
|
227
|
+
console.log("✓ a display can be read at a glance, and says when it has drifted off its template");
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=display.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.test.js","sourceRoot":"","sources":["../../tests/display.test.ts"],"names":[],"mappings":"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"}
|