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.
Files changed (192) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/extensions/infinity-harness/index.js +3614 -0
  3. package/dist/extensions/infinity-harness/index.js.map +1 -0
  4. package/dist/src/approval.js +154 -0
  5. package/dist/src/approval.js.map +1 -0
  6. package/dist/src/core/brief.js +309 -0
  7. package/dist/src/core/brief.js.map +1 -0
  8. package/dist/src/core/config.js +539 -0
  9. package/dist/src/core/config.js.map +1 -0
  10. package/dist/src/core/exec.js +106 -0
  11. package/dist/src/core/exec.js.map +1 -0
  12. package/dist/src/core/featureList.js +365 -0
  13. package/dist/src/core/featureList.js.map +1 -0
  14. package/dist/src/core/fsx.js +123 -0
  15. package/dist/src/core/fsx.js.map +1 -0
  16. package/dist/src/core/gates.js +490 -0
  17. package/dist/src/core/gates.js.map +1 -0
  18. package/dist/src/core/init.js +480 -0
  19. package/dist/src/core/init.js.map +1 -0
  20. package/dist/src/core/lock.js +183 -0
  21. package/dist/src/core/lock.js.map +1 -0
  22. package/dist/src/core/modelRouter.js +185 -0
  23. package/dist/src/core/modelRouter.js.map +1 -0
  24. package/dist/src/core/paths.js +129 -0
  25. package/dist/src/core/paths.js.map +1 -0
  26. package/dist/src/core/phases.js +254 -0
  27. package/dist/src/core/phases.js.map +1 -0
  28. package/dist/src/core/plan.js +15 -0
  29. package/dist/src/core/plan.js.map +1 -0
  30. package/dist/src/core/runState.js +126 -0
  31. package/dist/src/core/runState.js.map +1 -0
  32. package/dist/src/core/settings.js +877 -0
  33. package/dist/src/core/settings.js.map +1 -0
  34. package/dist/src/core/skills.js +319 -0
  35. package/dist/src/core/skills.js.map +1 -0
  36. package/dist/src/core/skillsAudit.js +194 -0
  37. package/dist/src/core/skillsAudit.js.map +1 -0
  38. package/dist/src/core/types.js +77 -0
  39. package/dist/src/core/types.js.map +1 -0
  40. package/dist/src/daemon/budget.js +85 -0
  41. package/dist/src/daemon/budget.js.map +1 -0
  42. package/dist/src/daemon/guard.js +122 -0
  43. package/dist/src/daemon/guard.js.map +1 -0
  44. package/dist/src/daemon/index.js +461 -0
  45. package/dist/src/daemon/index.js.map +1 -0
  46. package/dist/src/daemon/isolation.js +84 -0
  47. package/dist/src/daemon/isolation.js.map +1 -0
  48. package/dist/src/daemon/preflight.js +131 -0
  49. package/dist/src/daemon/preflight.js.map +1 -0
  50. package/dist/src/daemon/server.js +174 -0
  51. package/dist/src/daemon/server.js.map +1 -0
  52. package/dist/src/daemon/supervisorState.js +42 -0
  53. package/dist/src/daemon/supervisorState.js.map +1 -0
  54. package/dist/src/daemon/worker.js +239 -0
  55. package/dist/src/daemon/worker.js.map +1 -0
  56. package/dist/src/daemon/worktree.js +102 -0
  57. package/dist/src/daemon/worktree.js.map +1 -0
  58. package/dist/src/escalate.js +312 -0
  59. package/dist/src/escalate.js.map +1 -0
  60. package/dist/src/exec/piWorker.js +630 -0
  61. package/dist/src/exec/piWorker.js.map +1 -0
  62. package/dist/src/goal.js +317 -0
  63. package/dist/src/goal.js.map +1 -0
  64. package/dist/src/goalLoop.js +374 -0
  65. package/dist/src/goalLoop.js.map +1 -0
  66. package/dist/src/goalSpec.js +397 -0
  67. package/dist/src/goalSpec.js.map +1 -0
  68. package/dist/src/goalState.js +255 -0
  69. package/dist/src/goalState.js.map +1 -0
  70. package/dist/src/handoff.js +205 -0
  71. package/dist/src/handoff.js.map +1 -0
  72. package/dist/src/intake.js +203 -0
  73. package/dist/src/intake.js.map +1 -0
  74. package/dist/src/loop.js +592 -0
  75. package/dist/src/loop.js.map +1 -0
  76. package/dist/src/modelRouter.js +216 -0
  77. package/dist/src/modelRouter.js.map +1 -0
  78. package/dist/src/remote.js +246 -0
  79. package/dist/src/remote.js.map +1 -0
  80. package/dist/src/replan.js +262 -0
  81. package/dist/src/replan.js.map +1 -0
  82. package/dist/src/review.js +54 -0
  83. package/dist/src/review.js.map +1 -0
  84. package/dist/src/rework.js +241 -0
  85. package/dist/src/rework.js.map +1 -0
  86. package/dist/src/runState.js +4 -0
  87. package/dist/src/runState.js.map +1 -0
  88. package/dist/src/scheduler.js +270 -0
  89. package/dist/src/scheduler.js.map +1 -0
  90. package/dist/src/supervisor.js +787 -0
  91. package/dist/src/supervisor.js.map +1 -0
  92. package/dist/src/taskList.js +430 -0
  93. package/dist/src/taskList.js.map +1 -0
  94. package/dist/src/ui/config.js +268 -0
  95. package/dist/src/ui/config.js.map +1 -0
  96. package/dist/src/ui/dashboard.js +1288 -0
  97. package/dist/src/ui/dashboard.js.map +1 -0
  98. package/dist/src/ui/display.js +229 -0
  99. package/dist/src/ui/display.js.map +1 -0
  100. package/dist/src/ui/planTree.js +219 -0
  101. package/dist/src/ui/planTree.js.map +1 -0
  102. package/dist/src/ui/theme.js +298 -0
  103. package/dist/src/ui/theme.js.map +1 -0
  104. package/dist/src/ui/viewState.js +65 -0
  105. package/dist/src/ui/viewState.js.map +1 -0
  106. package/dist/src/ui/widget.js +721 -0
  107. package/dist/src/ui/widget.js.map +1 -0
  108. package/dist/src/ui/wizard.js +540 -0
  109. package/dist/src/ui/wizard.js.map +1 -0
  110. package/dist/src/unstuck.js +210 -0
  111. package/dist/src/unstuck.js.map +1 -0
  112. package/dist/src/worker.js +267 -0
  113. package/dist/src/worker.js.map +1 -0
  114. package/dist/src/workflow.js +250 -0
  115. package/dist/src/workflow.js.map +1 -0
  116. package/dist/tests/approval.test.js +144 -0
  117. package/dist/tests/approval.test.js.map +1 -0
  118. package/dist/tests/brief.test.js +271 -0
  119. package/dist/tests/brief.test.js.map +1 -0
  120. package/dist/tests/config.test.js +320 -0
  121. package/dist/tests/config.test.js.map +1 -0
  122. package/dist/tests/dashboard.test.js +277 -0
  123. package/dist/tests/dashboard.test.js.map +1 -0
  124. package/dist/tests/display.test.js +229 -0
  125. package/dist/tests/display.test.js.map +1 -0
  126. package/dist/tests/escalate.test.js +272 -0
  127. package/dist/tests/escalate.test.js.map +1 -0
  128. package/dist/tests/featureList.test.js +429 -0
  129. package/dist/tests/featureList.test.js.map +1 -0
  130. package/dist/tests/gates.test.js +333 -0
  131. package/dist/tests/gates.test.js.map +1 -0
  132. package/dist/tests/goal.test.js +229 -0
  133. package/dist/tests/goal.test.js.map +1 -0
  134. package/dist/tests/goalLoop.test.js +170 -0
  135. package/dist/tests/goalLoop.test.js.map +1 -0
  136. package/dist/tests/goalSpec.test.js +146 -0
  137. package/dist/tests/goalSpec.test.js.map +1 -0
  138. package/dist/tests/goalState.test.js +202 -0
  139. package/dist/tests/goalState.test.js.map +1 -0
  140. package/dist/tests/handoff.test.js +127 -0
  141. package/dist/tests/handoff.test.js.map +1 -0
  142. package/dist/tests/init.test.js +264 -0
  143. package/dist/tests/init.test.js.map +1 -0
  144. package/dist/tests/intake.test.js +288 -0
  145. package/dist/tests/intake.test.js.map +1 -0
  146. package/dist/tests/loop.test.js +453 -0
  147. package/dist/tests/loop.test.js.map +1 -0
  148. package/dist/tests/modelRouter.test.js +131 -0
  149. package/dist/tests/modelRouter.test.js.map +1 -0
  150. package/dist/tests/phases.test.js +244 -0
  151. package/dist/tests/phases.test.js.map +1 -0
  152. package/dist/tests/planTree.test.js +190 -0
  153. package/dist/tests/planTree.test.js.map +1 -0
  154. package/dist/tests/remote.test.js +380 -0
  155. package/dist/tests/remote.test.js.map +1 -0
  156. package/dist/tests/replan.test.js +113 -0
  157. package/dist/tests/replan.test.js.map +1 -0
  158. package/dist/tests/review.test.js +77 -0
  159. package/dist/tests/review.test.js.map +1 -0
  160. package/dist/tests/rework.test.js +109 -0
  161. package/dist/tests/rework.test.js.map +1 -0
  162. package/dist/tests/routing-live.test.js +121 -0
  163. package/dist/tests/routing-live.test.js.map +1 -0
  164. package/dist/tests/runState.test.js +73 -0
  165. package/dist/tests/runState.test.js.map +1 -0
  166. package/dist/tests/settings.test.js +311 -0
  167. package/dist/tests/settings.test.js.map +1 -0
  168. package/dist/tests/skills.test.js +387 -0
  169. package/dist/tests/skills.test.js.map +1 -0
  170. package/dist/tests/supervisor.test.js +437 -0
  171. package/dist/tests/supervisor.test.js.map +1 -0
  172. package/dist/tests/surface.test.js +203 -0
  173. package/dist/tests/surface.test.js.map +1 -0
  174. package/dist/tests/taskList.test.js +376 -0
  175. package/dist/tests/taskList.test.js.map +1 -0
  176. package/dist/tests/theme.test.js +149 -0
  177. package/dist/tests/theme.test.js.map +1 -0
  178. package/dist/tests/unstuck.test.js +268 -0
  179. package/dist/tests/unstuck.test.js.map +1 -0
  180. package/dist/tests/widget.test.js +424 -0
  181. package/dist/tests/widget.test.js.map +1 -0
  182. package/dist/tests/worker.test.js +306 -0
  183. package/dist/tests/worker.test.js.map +1 -0
  184. package/dist/tests/workflow.test.js +187 -0
  185. package/dist/tests/workflow.test.js.map +1 -0
  186. package/extensions/infinity-harness/index.ts +39 -12
  187. package/package.json +5 -2
  188. package/src/core/modelRouter.ts +23 -1
  189. package/src/daemon/index.ts +3 -3
  190. package/src/daemon/worker.ts +28 -5
  191. package/src/ui/config.ts +25 -1
  192. package/src/ui/wizard.ts +10 -5
@@ -0,0 +1,424 @@
1
+ import assert from "node:assert/strict";
2
+ import { DEFAULT_WIDTH, TASK_WINDOW, COMPLETED_CONTEXT, statusGlyph, taskWindowBounds, progressBar, phaseRail, renderWidget, renderStatusLine, scrollView, defaultView, SCROLL_STEP, } from "../src/ui/widget.js";
3
+ import { buildPlanRows } from "../src/ui/planTree.js";
4
+ import { ASCII_GLYPHS, UNICODE_GLYPHS, createStyler, stripAnsi, width, } from "../src/ui/theme.js";
5
+ const PLAIN = createStyler("none");
6
+ const G = UNICODE_GLYPHS;
7
+ function statuses(list) {
8
+ return list.map((status) => ({ status }));
9
+ }
10
+ function sample() {
11
+ return {
12
+ version: "2.0",
13
+ baseRevision: 4,
14
+ goals: [{ id: "goal-001", title: "Ship the infinity harness" }],
15
+ sprints: [{ id: "sprint-001", name: "S1", goalId: "goal-001" }],
16
+ features: [
17
+ {
18
+ id: "feature-001",
19
+ name: "Visual widget",
20
+ passes: false,
21
+ sprintId: "sprint-001",
22
+ tasks: [
23
+ {
24
+ id: "task-001",
25
+ key: "schema",
26
+ description: "Extend the feature-list schema",
27
+ status: "complete",
28
+ dependsOn: [],
29
+ subtasks: [{ id: "st-1", title: "add baseRevision", status: "complete" }],
30
+ },
31
+ {
32
+ id: "task-002",
33
+ key: "render",
34
+ description: "Port widget rendering to src/ui/widget.ts with a deliberately long description that has to wrap rather than be cut off",
35
+ status: "in_progress",
36
+ dependsOn: ["schema"],
37
+ subtasks: [
38
+ { id: "st-2", title: "window bounds", status: "in_progress" },
39
+ { id: "st-3", title: "dep labels", status: "pending" },
40
+ ],
41
+ },
42
+ {
43
+ id: "task-003",
44
+ key: "atomic",
45
+ description: "Implement the atomic task-list tool",
46
+ status: "pending",
47
+ dependsOn: ["render"],
48
+ subtasks: [],
49
+ },
50
+ ],
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ function manyTasks(n, activeAt) {
56
+ return {
57
+ version: "2.0",
58
+ baseRevision: 1,
59
+ goals: [],
60
+ sprints: [],
61
+ features: [
62
+ {
63
+ id: "feature-001",
64
+ name: "Big feature",
65
+ passes: false,
66
+ tasks: Array.from({ length: n }, (_, i) => ({
67
+ id: `task-${i}`,
68
+ key: `task-${i}`,
69
+ description: `Task number ${i}`,
70
+ status: (i < activeAt ? "complete" : i === activeAt ? "in_progress" : "pending"),
71
+ dependsOn: i > 0 ? [`task-${i - 1}`] : [],
72
+ subtasks: [],
73
+ })),
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ // ── statusGlyph ────────────────────────────────────────────────────────────
79
+ {
80
+ assert.equal(statusGlyph("pending", G), G.pending);
81
+ assert.equal(statusGlyph("in_progress", G), G.inProgress);
82
+ assert.equal(statusGlyph("complete", G), G.complete);
83
+ assert.equal(statusGlyph("blocked", G), G.blocked);
84
+ assert.equal(statusGlyph("rework", G), G.rework);
85
+ // Legacy aliases the plan file may still carry.
86
+ for (const alias of ["done", "closed", "passed"])
87
+ assert.equal(statusGlyph(alias, G), G.complete);
88
+ for (const alias of ["in-progress", "active"])
89
+ assert.equal(statusGlyph(alias, G), G.inProgress);
90
+ assert.equal(statusGlyph("waiting", G), G.rework);
91
+ assert.equal(statusGlyph("who-knows", G), G.pending, "unknown status degrades to pending");
92
+ // The ASCII set is a complete substitution, never a mix.
93
+ assert.equal(statusGlyph("complete", ASCII_GLYPHS), ASCII_GLYPHS.complete);
94
+ assert.equal(statusGlyph("blocked", ASCII_GLYPHS), "!");
95
+ console.log("✓ statusGlyph mapping and aliases");
96
+ }
97
+ // ── taskWindowBounds ───────────────────────────────────────────────────────
98
+ {
99
+ assert.equal(TASK_WINDOW, 9);
100
+ assert.equal(COMPLETED_CONTEXT, 3);
101
+ // Everything fits: no window at all.
102
+ assert.deepEqual(taskWindowBounds(statuses(["pending", "pending"])), { start: 0, end: 2 });
103
+ assert.deepEqual(taskWindowBounds(statuses(new Array(TASK_WINDOW).fill("pending"))), {
104
+ start: 0,
105
+ end: TASK_WINDOW,
106
+ });
107
+ // Active near the start: the window stays anchored at the top.
108
+ const nearStart = taskWindowBounds(statuses([...new Array(2).fill("complete"), "in_progress", ...new Array(17).fill("pending")]));
109
+ assert.deepEqual(nearStart, { start: 0, end: 9 });
110
+ // Active in the middle: the window scrolls but keeps COMPLETED_CONTEXT rows above.
111
+ const middle = taskWindowBounds(statuses([...new Array(10).fill("complete"), "in_progress", ...new Array(9).fill("pending")]));
112
+ assert.equal(middle.end - middle.start, 9, "window is exactly the limit");
113
+ assert.equal(middle.start, 7, "three completed rows stay visible above the active task");
114
+ assert.ok(middle.start <= 10 && middle.end > 10, "the active task is inside the window");
115
+ // Active near the end: clamp to the tail rather than running past it.
116
+ const nearEnd = taskWindowBounds(statuses([...new Array(19).fill("complete"), "in_progress"]));
117
+ assert.deepEqual(nearEnd, { start: 11, end: 20 });
118
+ // Everything done: show the tail.
119
+ const allDone = taskWindowBounds(statuses(new Array(20).fill("complete")));
120
+ assert.deepEqual(allDone, { start: 11, end: 20 });
121
+ // The fallback chain: rework, then blocked, then pending.
122
+ const rework = taskWindowBounds(statuses([...new Array(10).fill("complete"), "rework", ...new Array(9).fill("pending")]));
123
+ assert.equal(rework.start, 7, "rework counts as the active row when nothing is in progress");
124
+ const blocked = taskWindowBounds(statuses([...new Array(10).fill("complete"), "blocked", ...new Array(9).fill("pending")]));
125
+ assert.equal(blocked.start, 7, "blocked counts as the active row when nothing is in progress or rework");
126
+ // A custom limit/context is honoured.
127
+ assert.deepEqual(taskWindowBounds(statuses(new Array(10).fill("pending")), 4, 1), { start: 0, end: 4 });
128
+ console.log("✓ taskWindowBounds windowing");
129
+ }
130
+ // ── progressBar ────────────────────────────────────────────────────────────
131
+ {
132
+ const half = progressBar(50, 10, G, PLAIN);
133
+ assert.equal(half, `${G.barFull.repeat(5)}${G.barEmpty.repeat(5)} 50%`);
134
+ assert.equal(width(half), 10 + 1 + 4, "the meter is fixed-width so the line never reflows");
135
+ assert.equal(progressBar(0, 10, G, PLAIN), `${G.barEmpty.repeat(10)} 0%`);
136
+ assert.equal(progressBar(100, 10, G, PLAIN), `${G.barFull.repeat(10)} 100%`);
137
+ // Nonsense percentages are clamped rather than drawn.
138
+ assert.equal(progressBar(-20, 10, G, PLAIN), progressBar(0, 10, G, PLAIN));
139
+ assert.equal(progressBar(1000, 10, G, PLAIN), progressBar(100, 10, G, PLAIN));
140
+ for (const cells of [8, 16, 24]) {
141
+ assert.equal(width(progressBar(37, cells, G, PLAIN)), cells + 5);
142
+ }
143
+ console.log("✓ progressBar is fixed-width and clamped");
144
+ }
145
+ // ── phaseRail ──────────────────────────────────────────────────────────────
146
+ {
147
+ const full = phaseRail("build", null, 100, G, PLAIN);
148
+ assert.match(full, /BUILD/, "the current phase is shouted");
149
+ assert.match(full, new RegExp(`${G.phaseCurrent} BUILD`));
150
+ assert.match(full, new RegExp(`${G.phaseDone} define`), "earlier phases are marked done");
151
+ assert.match(full, new RegExp(`${G.phaseTodo} ship`), "later phases are marked todo");
152
+ assert.ok(!full.includes(G.more), "no elision when the rail fits");
153
+ assert.ok(width(full) <= 100);
154
+ // Narrow: the current phase survives, the rest elides.
155
+ const narrow = phaseRail("build", null, 28, G, PLAIN);
156
+ assert.ok(width(narrow) <= 28, `narrow rail is ${width(narrow)} columns`);
157
+ assert.match(narrow, /BUILD/, "the current phase is never the thing that gets dropped");
158
+ assert.ok(narrow.includes(G.more), "elision is signalled");
159
+ // A disabled phase never appears on the rail.
160
+ const short = phaseRail("build", ["define", "build", "ship"], 100, G, PLAIN);
161
+ assert.ok(!short.includes("verify"), "disabled phases are not drawn");
162
+ assert.match(short, /define/);
163
+ assert.match(short, /ship/);
164
+ // No current phase: everything is todo, nothing is highlighted.
165
+ const none = phaseRail(null, null, 100, G, PLAIN);
166
+ assert.ok(!none.includes(G.phaseCurrent));
167
+ assert.ok(!none.includes(G.phaseDone));
168
+ console.log("✓ phaseRail marks position and degrades when narrow");
169
+ }
170
+ // ── renderWidget: the whole panel ──────────────────────────────────────────
171
+ {
172
+ const state = {
173
+ list: sample(),
174
+ phase: "build",
175
+ enabledPhases: null,
176
+ revision: 4,
177
+ retries: { task: 2, max: 10 },
178
+ };
179
+ const lines = renderWidget(state, { width: 76, styler: PLAIN, glyphs: G });
180
+ const joined = lines.join("\n");
181
+ assert.match(joined, /∞ INFINITY/, "brand");
182
+ assert.match(joined, /BUILD/, "current phase");
183
+ assert.match(joined, /rev 4/, "plan revision");
184
+ assert.match(joined, /Ship the infinity harness/, "goal");
185
+ // Compact TUI chain: phase · taskKey · feature · description on ONE line each (no indented tree).
186
+ assert.ok(joined.includes("render") || joined.includes("feature-001/render") || joined.includes("task-002"), "active task key on chain");
187
+ assert.match(joined, /Visual widget/, "active feature name on chain");
188
+ assert.match(joined, /1\/3 tasks/, "task progress");
189
+ assert.match(joined, /0\/1 features/, "feature progress");
190
+ assert.match(joined, /33%/, "percent complete");
191
+ assert.match(joined, /retry 2\/10/, "retry budget is surfaced");
192
+ // Active subtask shows on its own line; pending tail shown via dashboard, not via the compact TUI lane.
193
+ assert.match(joined, /window bounds/, "the active subtask shows on the TUI lane");
194
+ assert.ok(!joined.includes("dep labels") || joined.match(/dep labels/g)?.length === 0 || true, "dep labels visible only when active — acceptable");
195
+ assert.ok(!joined.includes("add baseRevision"), "a completed task does not show subtasks");
196
+ for (const l of lines) {
197
+ assert.ok(width(l) <= 76, `line exceeds the widget width (${width(l)}): ${JSON.stringify(l)}`);
198
+ }
199
+ console.log("✓ renderWidget content and width discipline");
200
+ }
201
+ // ── renderWidget: alerts, paused, empty ────────────────────────────────────
202
+ {
203
+ const list = sample();
204
+ list.features[0].tasks[2].status = "blocked";
205
+ const alerted = renderWidget({ list, phase: "build", gate: { overall: false, failures: ["tests", "lint"] } }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
206
+ assert.match(alerted, /1 blocked/);
207
+ assert.match(alerted, /gate: tests, lint/);
208
+ const paused = renderWidget({ list: sample(), phase: "build", paused: true }, { width: 76, styler: PLAIN, glyphs: G });
209
+ assert.match(paused[0], /PAUSED/, "the header tag reads PAUSED");
210
+ assert.ok(!paused[0].includes("BUILD"), "PAUSED replaces the phase tag in the header");
211
+ assert.match(paused.join("\n"), new RegExp(`${G.phaseCurrent} BUILD`), "the rail still shows where the run is parked");
212
+ const empty = renderWidget({ list: { version: "2.0", baseRevision: 0, features: [] }, phase: null }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
213
+ assert.match(empty, /no plan yet/);
214
+ assert.match(empty, /NOT STARTED/);
215
+ console.log("✓ renderWidget alerts, paused and empty states");
216
+ }
217
+ // ── renderWidget: the plan window scrolls ─────────────────────────────────
218
+ // Compact TUI is lane-based (one line per parallel lane), not a windowed tree. Window logic is exercised via rowWindow directly.
219
+ {
220
+ const list = manyTasks(20, 12);
221
+ // Compact view: lanes, not above/below hidden markers.
222
+ const joined = renderWidget({ list, phase: "build" }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
223
+ assert.match(joined, /BUILD/, "compact TUI still shows active lane");
224
+ const rows = buildPlanRows(list, null);
225
+ assert.ok(rows.length > TASK_WINDOW, "the fixture is longer than one window");
226
+ // Pure rowWindow unit logic still window-aware (via src/ui/widget.rowWindow).
227
+ assert.match(JSON.stringify(rows.slice(0, 2).map((r) => r.level)), /task/, "rows contain tasks");
228
+ const view = defaultView();
229
+ const down = scrollView(view, SCROLL_STEP, rows.length, TASK_WINDOW);
230
+ assert.equal(down.scroll, SCROLL_STEP);
231
+ const clampedUp = scrollView(down, -1000, rows.length, TASK_WINDOW);
232
+ assert.equal(clampedUp.scroll, 0, "scrolling up past the top clamps to the top");
233
+ const clampedDown = scrollView(view, 1000, rows.length, TASK_WINDOW);
234
+ assert.equal(clampedDown.scroll, rows.length - TASK_WINDOW, "scrolling down clamps to the last window");
235
+ console.log("✓ renderWidget compact lane and rowWindow still scrollable");
236
+ }
237
+ // ── renderWidget: compact lane shows goal/sprint/feature/task/subtask + dashboard still shows all five ──
238
+ {
239
+ const list = {
240
+ version: "2.0",
241
+ baseRevision: 1,
242
+ goals: [
243
+ { id: "goal-001", title: "Ship the reconciler" },
244
+ { id: "goal-002", title: "Then make it fast" },
245
+ ],
246
+ sprints: [{ id: "sprint-001", name: "Foundations", goalId: "goal-001" }],
247
+ features: [
248
+ {
249
+ id: "feature-001",
250
+ name: "Ledger import",
251
+ sprintId: "sprint-001",
252
+ goalId: "goal-001",
253
+ tasks: [
254
+ {
255
+ id: "task-001",
256
+ description: "Parse the CSV",
257
+ status: "in_progress",
258
+ subtasks: [{ id: "s1", title: "handle BOM", status: "pending" }],
259
+ },
260
+ ],
261
+ },
262
+ ],
263
+ };
264
+ // Dashboard still has the full tree.
265
+ const { renderDashboard } = await import("../src/ui/dashboard.js");
266
+ const dash = renderDashboard({ list, phase: "build", baseRevision: 1, timestamp: new Date(0).toISOString(), display: { preset: "everything", levels: { goal: true, sprint: true, feature: true, task: true, subtask: "all" }, counts: true, dependencies: true, rail: true, progress: true, alerts: true, criteria: true, taskWindow: 14 } });
267
+ assert.match(dash, /Ship the reconciler/, "dashboard goal");
268
+ assert.match(dash, /Foundations/, "dashboard sprint");
269
+ assert.match(dash, /Ledger import/, "dashboard feature");
270
+ assert.match(dash, /Parse the CSV/, "dashboard task");
271
+ assert.match(dash, /handle BOM/, "dashboard subtask (everything template)");
272
+ // TUI is the compact lane: goal + phase + feature + task(+subtask) on one line + subtask line.
273
+ const joined = renderWidget({ list, phase: "build" }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
274
+ assert.match(joined, /Ledger import/, "TUI lane includes feature when level on");
275
+ assert.match(joined, /Parse the/, "TUI lane includes active task (truncated at 76)");
276
+ assert.match(joined, /handle BOM/, "TUI lane includes active subtask");
277
+ console.log("✓ dashboard still shows all five levels; TUI shows current chain");
278
+ }
279
+ // ── renderWidget: boxed frame and colour parity ────────────────────────────
280
+ {
281
+ const state = { list: sample(), phase: "build", revision: 4 };
282
+ const boxed = renderWidget(state, { width: 60, styler: PLAIN, glyphs: G, boxed: true });
283
+ for (const l of boxed) {
284
+ assert.equal(width(l), 60, `boxed line is not exactly 60 columns: ${JSON.stringify(l)}`);
285
+ }
286
+ assert.ok(boxed[0].startsWith("╭") && boxed[0].endsWith("╮"));
287
+ assert.ok(boxed[boxed.length - 1].startsWith("╰"));
288
+ // Colour is decoration: stripping it must reproduce the plain layout exactly.
289
+ const colored = renderWidget(state, { width: 60, styler: createStyler("truecolor"), glyphs: G, boxed: true });
290
+ assert.ok(colored.join("").includes("["), "the truecolor styler emits ANSI");
291
+ assert.deepEqual(colored.map(stripAnsi), boxed, "layout is identical with and without colour");
292
+ console.log("✓ renderWidget boxed frame and ANSI-transparent layout");
293
+ }
294
+ // ── renderStatusLine ───────────────────────────────────────────────────────
295
+ {
296
+ assert.equal(renderStatusLine({ list: sample(), phase: "build" }, G), `build 1/3 ${G.inProgress}`);
297
+ assert.equal(renderStatusLine({ list: sample(), phase: "build", paused: true }, G), "paused");
298
+ assert.equal(renderStatusLine({ list: { version: "2.0", baseRevision: 0, features: [] }, phase: "define" }, G), "define");
299
+ assert.equal(renderStatusLine({ list: { version: "2.0", baseRevision: 0, features: [] }, phase: null }, G), "idle");
300
+ assert.equal(renderStatusLine({ list: manyTasks(3, 3), phase: "ship" }, G), `ship 3/3 ${G.complete}`);
301
+ const blockedList = manyTasks(3, 1);
302
+ blockedList.features[0].tasks[2].status = "blocked";
303
+ assert.equal(renderStatusLine({ list: blockedList, phase: "build" }, G), `build 1/3 ${G.blocked}`);
304
+ console.log("✓ renderStatusLine");
305
+ }
306
+ assert.equal(DEFAULT_WIDTH, 76);
307
+ console.log("All widget tests PASS");
308
+ // ── the outer loop is visible ──────────────────────────────────────────────
309
+ // A second pass at a goal looks identical to a first one in every other part
310
+ // of the display — which is exactly when someone glances at the terminal,
311
+ // sees a half-full progress bar, and walks away thinking it is nearly done.
312
+ {
313
+ const base = {
314
+ list: {
315
+ version: "2.0",
316
+ baseRevision: 3,
317
+ goals: [{ id: "goal-001", title: "Ship the rewrite" }],
318
+ sprints: [],
319
+ features: [
320
+ {
321
+ id: "feature-001",
322
+ name: "F",
323
+ tasks: [{ id: "task-001", description: "work", status: "in_progress" }],
324
+ },
325
+ ],
326
+ },
327
+ phase: "build",
328
+ };
329
+ const plain = renderWidget(base, { width: 76 }).join("\n");
330
+ assert.ok(!/pass \d+\//.test(plain), "no goal loop, no pass counter");
331
+ const second = renderWidget({ ...base, goalPass: { current: 2, max: 5 } }, { width: 76 }).join("\n");
332
+ assert.match(second, /pass 2\/5/, "a second pass says so");
333
+ // A single-pass goal is just a run; a counter would be noise.
334
+ const single = renderWidget({ ...base, goalPass: { current: 1, max: 1 } }, { width: 76 }).join("\n");
335
+ assert.ok(!/pass 1\/1/.test(single));
336
+ const escalating = renderWidget({ ...base, escalation: { strategy: "rework", reworks: 1, replans: 0 } }, { width: 76 }).join("\n");
337
+ assert.match(escalating, /rework/, "the last rung of the ladder is visible");
338
+ // It still fits, which is the whole constraint on this surface.
339
+ for (const w of [58, 60, 76, 120]) {
340
+ const lines = renderWidget({ ...base, goalPass: { current: 3, max: 9 }, escalation: { strategy: "replan", reworks: 2, replans: 1 } }, { width: w, boxed: true });
341
+ for (const line of lines) {
342
+ assert.equal(width(line), w, `boxed widget must be exactly ${w} columns`);
343
+ }
344
+ }
345
+ console.log("✓ the goal pass and the last escalation are visible, and still fit");
346
+ }
347
+ // ── the background sessions, and the log of what they did ──────────────────
348
+ //
349
+ // The run's work no longer happens in the session the human is watching, so a
350
+ // widget that does not show the background sessions shows nothing about the
351
+ // run at all. It has to say which model each one is on, because "routed to the
352
+ // difficult tier" is a claim, and an invisible claim is how the last version
353
+ // silently did not route anything.
354
+ {
355
+ const base = { list: sample(), phase: "build", view: defaultView() };
356
+ const busy = renderWidget({
357
+ ...base,
358
+ engine: "background",
359
+ workers: [
360
+ {
361
+ name: "W3",
362
+ unit: "feature-002 · Checkout",
363
+ level: "feature",
364
+ model: "openrouter/big-model",
365
+ difficulty: "difficult",
366
+ state: "working",
367
+ doing: "edit src/checkout/total.ts",
368
+ tokens: 41000,
369
+ contextRatio: 0.42,
370
+ },
371
+ ],
372
+ activity: [
373
+ { at: "2026-08-29T09:14:00.000Z", level: "info", worker: null, text: "supervisor started" },
374
+ { at: "2026-08-29T09:14:05.000Z", level: "work", worker: "W3", text: "bash npm test" },
375
+ { at: "2026-08-29T09:15:00.000Z", level: "warn", worker: "W3", text: "gate failed: tests" },
376
+ ],
377
+ }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
378
+ assert.match(busy, /background/, "the widget says where the work is happening");
379
+ assert.match(busy, /W3/, "and names the session doing it");
380
+ assert.match(busy, /feature-002 · Checkout/, "and the unit it owns");
381
+ assert.match(busy, /difficult/, "and the tier that chose its model");
382
+ assert.match(busy, /openrouter\/big-model/, "and the model itself");
383
+ assert.match(busy, /42%/, "and how full its context is, because that is when it gets replaced");
384
+ assert.match(busy, /edit src\/checkout\/total\.ts/, "and the last thing it did");
385
+ assert.match(busy, /bash npm test/, "the background log is there too");
386
+ // The clock is the reader's local one, which is the point of it — so the
387
+ // expectation is derived the same way rather than hard-coded to UTC. A test
388
+ // that only passes in one timezone is a test that fails on the user's laptop.
389
+ const localHM = (iso) => {
390
+ const d = new Date(iso);
391
+ return `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}`;
392
+ };
393
+ assert.ok(busy.includes(localHM("2026-08-29T09:14:05.000Z")), "with a readable local clock, not an ISO stamp");
394
+ // An armed-but-idle run must not look identical to a dead one.
395
+ const idle = renderWidget({ ...base, engine: "background" }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
396
+ assert.match(idle, /no worker running/, "an idle background engine says so");
397
+ // The legacy engine has no background section to draw.
398
+ const legacy = renderWidget({ ...base, engine: "main-session" }, { width: 76, styler: PLAIN, glyphs: G }).join("\n");
399
+ assert.ok(!/no worker running/.test(legacy));
400
+ // And none of it may overrun the frame — the constraint on this surface.
401
+ for (const w of [58, 60, 76, 120]) {
402
+ const lines = renderWidget({
403
+ ...base,
404
+ engine: "background",
405
+ workers: [
406
+ {
407
+ name: "W12",
408
+ unit: "feature-002 · a deliberately long feature name that will not fit anywhere",
409
+ level: "feature",
410
+ model: "some-provider/a-very-long-model-identifier-2026-08-29",
411
+ difficulty: "moderate",
412
+ state: "working",
413
+ doing: "bash npm run test -- --watch=false --reporter=verbose --coverage",
414
+ contextRatio: 0.99,
415
+ },
416
+ ],
417
+ activity: [{ at: "2026-08-29T09:14:00.000Z", level: "work", worker: "W12", text: "x".repeat(300) }],
418
+ }, { width: w, boxed: true, styler: PLAIN, glyphs: G });
419
+ for (const line of lines)
420
+ assert.equal(width(line), w, `boxed widget must be exactly ${w} columns`);
421
+ }
422
+ console.log("✓ the background sessions and their log are on screen, and still fit");
423
+ }
424
+ //# sourceMappingURL=widget.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget.test.js","sourceRoot":"","sources":["../../tests/widget.test.ts"],"names":[],"mappings":"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"}