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,244 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { PHASE_ORDER, advancePhase, getPhaseOrder, isFinalPhase, isPhase, isValidTransition, nextPhase, transitionPhase, } from "../src/core/phases.js";
6
+ import { defaultConfig, loadConfig } from "../src/core/config.js";
7
+ import { DEFAULT_ENABLED_PHASES } from "../src/core/types.js";
8
+ function tmpProject(mutate = () => { }) {
9
+ const d = mkdtempSync(join(tmpdir(), "pi-phases-"));
10
+ mkdirSync(join(d, "harness"), { recursive: true });
11
+ const c = defaultConfig();
12
+ mutate(c);
13
+ writeFileSync(join(d, "harness", "config.json"), JSON.stringify(c, null, 2), "utf-8");
14
+ return d;
15
+ }
16
+ function configFile(dir) {
17
+ return join(dir, "harness", "config.json");
18
+ }
19
+ // ── isPhase / getPhaseOrder ────────────────────────────────────────────────
20
+ {
21
+ assert.ok(isPhase("build"));
22
+ assert.ok(isPhase("simplify"));
23
+ assert.ok(!isPhase("deploy"));
24
+ assert.ok(!isPhase(null));
25
+ assert.ok(!isPhase(3));
26
+ const def = getPhaseOrder();
27
+ assert.deepEqual(def, DEFAULT_ENABLED_PHASES);
28
+ assert.ok(!def.includes("simplify"), "SIMPLIFY is not in the default pipeline");
29
+ assert.ok(!def.includes("init"), "INIT is a bootstrap step, not part of the run");
30
+ assert.deepEqual(getPhaseOrder(null), def, "null means default");
31
+ assert.deepEqual(getPhaseOrder(undefined), def);
32
+ assert.deepEqual(getPhaseOrder([]), def, "an empty pipeline falls back to the default");
33
+ assert.deepEqual(getPhaseOrder(["nonsense"]), def, "a pipeline of unknown phases falls back to the default");
34
+ // Enabling SIMPLIFY puts it in its canonical position, not at the end.
35
+ const withSimplify = getPhaseOrder([...DEFAULT_ENABLED_PHASES, "simplify"]);
36
+ assert.deepEqual(withSimplify, ["define", "plan", "build", "verify", "simplify", "review", "ship"]);
37
+ // Order comes from PHASE_ORDER, not from the order the caller listed them.
38
+ assert.deepEqual(getPhaseOrder(["ship", "define", "build"]), ["define", "build", "ship"]);
39
+ // Unknown entries are ignored rather than inserted.
40
+ assert.deepEqual(getPhaseOrder(["define", "deploy", "ship"]), ["define", "ship"]);
41
+ assert.deepEqual([...PHASE_ORDER], ["init", "research", "define", "plan", "build", "verify", "simplify", "review", "ship"]);
42
+ console.log("✓ getPhaseOrder: default excludes simplify, order is canonical");
43
+ }
44
+ // ── isValidTransition ──────────────────────────────────────────────────────
45
+ {
46
+ // From nothing, only the first phase of the pipeline is reachable.
47
+ assert.equal(isValidTransition(null, "define"), true);
48
+ assert.equal(isValidTransition(null, "plan"), false, "a run cannot start in the middle");
49
+ assert.equal(isValidTransition(null, "ship"), false);
50
+ // Forward exactly one step.
51
+ const order = getPhaseOrder();
52
+ for (let i = 0; i < order.length - 1; i++) {
53
+ assert.equal(isValidTransition(order[i], order[i + 1]), true, `${order[i]} → ${order[i + 1]}`);
54
+ }
55
+ // Re-running the current phase is always legal — that is how a failed gate retries.
56
+ for (const p of order)
57
+ assert.equal(isValidTransition(p, p), true, `${p} → ${p}`);
58
+ // Skipping ahead is the thing the harness exists to prevent.
59
+ assert.equal(isValidTransition("build", "review"), false);
60
+ assert.equal(isValidTransition("build", "ship"), false);
61
+ assert.equal(isValidTransition("define", "build"), false);
62
+ // Backwards is never a transition; it is an explicit rework.
63
+ assert.equal(isValidTransition("verify", "build"), false);
64
+ assert.equal(isValidTransition("ship", "define"), false);
65
+ assert.equal(isValidTransition("plan", "define"), false);
66
+ // A phase outside the enabled pipeline is not reachable at all.
67
+ assert.equal(isValidTransition("verify", "simplify"), false, "simplify is disabled by default");
68
+ assert.equal(isValidTransition("verify", "simplify", [...DEFAULT_ENABLED_PHASES, "simplify"]), true, "…and reachable once enabled");
69
+ assert.equal(isValidTransition("verify", "review", [...DEFAULT_ENABLED_PHASES, "simplify"]), false, "enabling simplify makes verify → review a skip");
70
+ // A custom pipeline redefines what "one step" means.
71
+ const custom = ["define", "build", "ship"];
72
+ assert.equal(isValidTransition("define", "build", custom), true);
73
+ assert.equal(isValidTransition("build", "ship", custom), true);
74
+ assert.equal(isValidTransition("define", "plan", custom), false, "a disabled phase is not a valid target");
75
+ console.log("✓ isValidTransition: forward one step or same phase, nothing else");
76
+ }
77
+ // ── nextPhase / isFinalPhase ───────────────────────────────────────────────
78
+ {
79
+ assert.equal(nextPhase(null), "define", "the pipeline starts at its first phase");
80
+ assert.equal(nextPhase("define"), "plan");
81
+ assert.equal(nextPhase("build"), "verify");
82
+ assert.equal(nextPhase("review"), "ship");
83
+ assert.equal(nextPhase("ship"), null, "there is nothing after the final phase");
84
+ assert.equal(nextPhase("simplify"), "define", "a phase outside the pipeline restarts at the top");
85
+ assert.equal(nextPhase("verify", [...DEFAULT_ENABLED_PHASES, "simplify"]), "simplify");
86
+ assert.equal(nextPhase("build", ["define", "build", "ship"]), "ship");
87
+ assert.equal(isFinalPhase("ship"), true);
88
+ assert.equal(isFinalPhase("review"), false);
89
+ assert.equal(isFinalPhase(null), false);
90
+ assert.equal(isFinalPhase("build", ["define", "build"]), true, "the final phase depends on the pipeline");
91
+ assert.equal(isFinalPhase("ship", ["define", "build"]), false, "a disabled phase is never the final one");
92
+ console.log("✓ nextPhase / isFinalPhase");
93
+ }
94
+ // ── transitionPhase: a valid advance persists ──────────────────────────────
95
+ {
96
+ const dir = tmpProject((c) => {
97
+ c.currentPhase = "build";
98
+ c.currentRole = "generator";
99
+ c.phaseRetryCount = 3;
100
+ c.retryCount = 3;
101
+ c.taskRetryCount = 2;
102
+ c.featureRetryCount = 1;
103
+ c.pipelineIteration = 5;
104
+ c.paused = true;
105
+ });
106
+ try {
107
+ const res = await transitionPhase(dir, "verify");
108
+ assert.equal(res.ok, true, res.error ?? "");
109
+ assert.equal(res.from, "build");
110
+ assert.equal(res.to, "verify");
111
+ const stored = loadConfig(dir).config;
112
+ assert.equal(stored.currentPhase, "verify", "the new phase is on disk, not just in memory");
113
+ assert.equal(stored.currentRole, "evaluator", "the role follows the phase");
114
+ assert.equal(stored.phaseRetryCount, 0, "a new phase starts with a fresh phase budget");
115
+ assert.equal(stored.retryCount, 0);
116
+ assert.equal(stored.taskRetryCount, 2, "the task budget belongs to the task, not the phase");
117
+ assert.equal(stored.featureRetryCount, 1, "the feature budget belongs to the feature");
118
+ assert.equal(stored.pipelineIteration, 6, "advancing counts as a pipeline iteration");
119
+ assert.equal(stored.paused, false, "advancing clears a pause");
120
+ assert.equal(stored.gateHistory.length, 1, "leaving a phase records its passing gate");
121
+ assert.equal(stored.gateHistory[0].phase, "build");
122
+ assert.equal(stored.gateHistory[0].result, "pass");
123
+ console.log("✓ transitionPhase: a valid advance persists and resets the phase budget");
124
+ }
125
+ finally {
126
+ rmSync(dir, { recursive: true, force: true });
127
+ }
128
+ }
129
+ // ── transitionPhase: re-running the same phase is a retry ──────────────────
130
+ {
131
+ const dir = tmpProject((c) => {
132
+ c.currentPhase = "build";
133
+ c.phaseRetryCount = 1;
134
+ c.retryCount = 1;
135
+ c.pipelineIteration = 4;
136
+ });
137
+ try {
138
+ const res = await transitionPhase(dir, "build");
139
+ assert.equal(res.ok, true, res.error ?? "");
140
+ assert.equal(res.from, "build");
141
+ assert.equal(res.to, "build");
142
+ const stored = loadConfig(dir).config;
143
+ assert.equal(stored.currentPhase, "build");
144
+ assert.equal(stored.phaseRetryCount, 2, "a re-run burns one phase retry");
145
+ assert.equal(stored.retryCount, 2);
146
+ assert.equal(stored.pipelineIteration, 4, "a re-run is not a new pipeline iteration");
147
+ assert.deepEqual(stored.gateHistory, [], "a re-run does not record a passing gate");
148
+ // Retries accumulate across re-runs.
149
+ await transitionPhase(dir, "build");
150
+ assert.equal(loadConfig(dir).config.phaseRetryCount, 3);
151
+ console.log("✓ transitionPhase: a same-phase re-run increments the retry count");
152
+ }
153
+ finally {
154
+ rmSync(dir, { recursive: true, force: true });
155
+ }
156
+ }
157
+ // ── transitionPhase: an invalid transition writes nothing ──────────────────
158
+ {
159
+ const dir = tmpProject((c) => {
160
+ c.currentPhase = "build";
161
+ c.phaseRetryCount = 2;
162
+ });
163
+ try {
164
+ const before = readFileSync(configFile(dir), "utf-8");
165
+ for (const target of ["ship", "review", "plan"]) {
166
+ const res = await transitionPhase(dir, target);
167
+ assert.equal(res.ok, false, `build → ${target} must be rejected`);
168
+ assert.equal(res.config, null, "a rejected transition hands back no config");
169
+ assert.match(res.error ?? "", /invalid transition build → /);
170
+ assert.match(res.error ?? "", /Pipeline is: define → plan → build → verify → review → ship/);
171
+ assert.equal(res.from, "build");
172
+ assert.equal(res.to, target);
173
+ }
174
+ assert.equal(readFileSync(configFile(dir), "utf-8"), before, "the config file is untouched");
175
+ const stored = loadConfig(dir).config;
176
+ assert.equal(stored.currentPhase, "build");
177
+ assert.equal(stored.phaseRetryCount, 2, "a rejected transition burns nothing");
178
+ console.log("✓ transitionPhase: an invalid transition is rejected without writing");
179
+ }
180
+ finally {
181
+ rmSync(dir, { recursive: true, force: true });
182
+ }
183
+ }
184
+ // ── transitionPhase: no config at all ──────────────────────────────────────
185
+ {
186
+ const dir = mkdtempSync(join(tmpdir(), "pi-phases-bare-"));
187
+ try {
188
+ const res = await transitionPhase(dir, "define");
189
+ assert.equal(res.ok, false, "an uninitialised project cannot transition");
190
+ assert.equal(res.config, null);
191
+ assert.match(res.error ?? "", /config/);
192
+ console.log("✓ transitionPhase refuses an uninitialised project");
193
+ }
194
+ finally {
195
+ rmSync(dir, { recursive: true, force: true });
196
+ }
197
+ }
198
+ // ── advancePhase walks the pipeline and stops at the end ───────────────────
199
+ {
200
+ const dir = tmpProject((c) => {
201
+ c.currentPhase = null;
202
+ });
203
+ try {
204
+ const walked = [];
205
+ for (let i = 0; i < DEFAULT_ENABLED_PHASES.length; i++) {
206
+ const res = await advancePhase(dir);
207
+ assert.equal(res.ok, true, res.error ?? "");
208
+ walked.push(res.to);
209
+ }
210
+ assert.deepEqual(walked, DEFAULT_ENABLED_PHASES, "advancePhase walks the enabled pipeline in order");
211
+ const done = await advancePhase(dir);
212
+ assert.equal(done.ok, false, "the pipeline does not wrap around");
213
+ assert.match(done.error ?? "", /pipeline complete/);
214
+ assert.equal(done.to, null);
215
+ assert.equal(loadConfig(dir).config.currentPhase, "ship", "the final phase stays put");
216
+ console.log("✓ advancePhase walks the pipeline and stops at the end");
217
+ }
218
+ finally {
219
+ rmSync(dir, { recursive: true, force: true });
220
+ }
221
+ }
222
+ // ── a custom pipeline is honoured end to end ───────────────────────────────
223
+ {
224
+ const dir = tmpProject((c) => {
225
+ c.currentPhase = "define";
226
+ c.phases.enabled = ["define", "build", "ship"];
227
+ });
228
+ try {
229
+ const skipped = await transitionPhase(dir, "plan");
230
+ assert.equal(skipped.ok, false, "a disabled phase is not a legal target");
231
+ const ok = await transitionPhase(dir, "build");
232
+ assert.equal(ok.ok, true, ok.error ?? "");
233
+ assert.equal(loadConfig(dir).config.currentPhase, "build");
234
+ const last = await advancePhase(dir);
235
+ assert.equal(last.to, "ship");
236
+ assert.equal(isFinalPhase("ship", loadConfig(dir).config.phases.enabled), true);
237
+ console.log("✓ a custom pipeline is honoured end to end");
238
+ }
239
+ finally {
240
+ rmSync(dir, { recursive: true, force: true });
241
+ }
242
+ }
243
+ console.log("All phases tests PASS");
244
+ //# sourceMappingURL=phases.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases.test.js","sourceRoot":"","sources":["../../tests/phases.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * The plan has five levels. All five must reach the screen.
3
+ *
4
+ * Goal → sprint → feature → task → subtask. Only two of them used to: the
5
+ * widget drew features and tasks, goals were one title line, and sprints
6
+ * appeared nowhere at all — so a plan organised into sprints looked, on
7
+ * screen, exactly like a plan that was not.
8
+ *
9
+ * The rule that matters most here is that nothing is ever *dropped*. A feature
10
+ * pointing at a goal that has since been deleted is still a feature with real
11
+ * tasks in it, and a task nobody can see is a task that gets stuck forever.
12
+ */
13
+ import assert from "node:assert/strict";
14
+ import { buildPlanRows, focusRowIndex, groupPlan } from "../src/ui/planTree.js";
15
+ const FULL = {
16
+ version: "2.0",
17
+ baseRevision: 9,
18
+ goals: [
19
+ { id: "goal-001", title: "Reconcile payouts" },
20
+ { id: "goal-002", title: "Then make it fast" },
21
+ ],
22
+ sprints: [
23
+ { id: "sprint-001", name: "Foundations", goalId: "goal-001" },
24
+ { id: "sprint-002", name: "Reporting", goalId: "goal-001" },
25
+ ],
26
+ features: [
27
+ {
28
+ id: "feature-001",
29
+ name: "Ledger import",
30
+ sprintId: "sprint-001",
31
+ goalId: "goal-001",
32
+ tasks: [
33
+ { id: "task-001", description: "Parse the CSV", status: "complete", subtasks: [] },
34
+ {
35
+ id: "task-002",
36
+ description: "Reject bad rows",
37
+ status: "in_progress",
38
+ dependsOn: ["feature-001/task-001"],
39
+ subtasks: [
40
+ { id: "s1", title: "define the tolerance", status: "complete" },
41
+ { id: "s2", title: "write the failing test", status: "in_progress" },
42
+ ],
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ id: "feature-002",
48
+ name: "Audit report",
49
+ sprintId: "sprint-002",
50
+ goalId: "goal-001",
51
+ tasks: [{ id: "task-003", description: "CSV export", status: "pending", subtasks: [] }],
52
+ },
53
+ // Under a goal, but in no sprint.
54
+ {
55
+ id: "feature-003",
56
+ name: "Caching",
57
+ goalId: "goal-002",
58
+ tasks: [{ id: "task-004", description: "Memoise the FX table", status: "pending", subtasks: [] }],
59
+ },
60
+ ],
61
+ };
62
+ const titles = (list, active = null, options = {}) => buildPlanRows(list, active, options).map((r) => r.title);
63
+ // ── grouping ───────────────────────────────────────────────────────────────
64
+ {
65
+ const groups = groupPlan(FULL);
66
+ assert.equal(groups.length, 2, "one group per goal");
67
+ assert.equal(groups[0]?.goal?.id, "goal-001");
68
+ assert.equal(groups[0]?.sprints.length, 2);
69
+ assert.equal(groups[0]?.total, 3, "a goal counts every task beneath it");
70
+ assert.equal(groups[0]?.done, 1);
71
+ const second = groups[1];
72
+ assert.equal(second.goal?.id, "goal-002");
73
+ assert.equal(second.sprints.length, 1, "a feature with no sprint sits in a nameless sprint group");
74
+ assert.equal(second.sprints[0]?.sprint, null);
75
+ assert.equal(second.sprints[0]?.features[0]?.id, "feature-003");
76
+ console.log("✓ groupPlan reproduces the plan's real shape, with counts at every level");
77
+ }
78
+ // ── nothing is dropped ─────────────────────────────────────────────────────
79
+ {
80
+ const orphaned = {
81
+ version: "2.0",
82
+ baseRevision: 1,
83
+ goals: [{ id: "goal-001", title: "Kept" }],
84
+ sprints: [{ id: "sprint-001", name: "Ghost sprint", goalId: "goal-deleted" }],
85
+ features: [
86
+ { id: "f-a", name: "Under a deleted goal", goalId: "goal-gone", tasks: [{ id: "t1", description: "a", status: "pending", subtasks: [] }] },
87
+ { id: "f-b", name: "Under a deleted sprint", sprintId: "sprint-gone", tasks: [{ id: "t2", description: "b", status: "pending", subtasks: [] }] },
88
+ { id: "f-c", name: "Under nothing at all", tasks: [{ id: "t3", description: "c", status: "pending", subtasks: [] }] },
89
+ { id: "f-d", name: "Under a ghost sprint", sprintId: "sprint-001", tasks: [{ id: "t4", description: "d", status: "pending", subtasks: [] }] },
90
+ ],
91
+ };
92
+ const shown = titles(orphaned, null, { collapseTrivial: false });
93
+ for (const name of [
94
+ "Under a deleted goal",
95
+ "Under a deleted sprint",
96
+ "Under nothing at all",
97
+ "Under a ghost sprint",
98
+ ]) {
99
+ assert.ok(shown.includes(name), `${name} vanished — a task nobody can see is a task that gets stuck`);
100
+ }
101
+ const everyTask = buildPlanRows(orphaned, null).filter((r) => r.level === "task");
102
+ assert.equal(everyTask.length, 4, "every task reaches the screen exactly once");
103
+ assert.deepEqual(everyTask.map((t) => t.index), [1, 2, 3, 4], "and they are numbered contiguously, so `← #3` means something");
104
+ console.log("✓ orphans and dangling parents are still drawn, exactly once each");
105
+ }
106
+ // ── the five levels ────────────────────────────────────────────────────────
107
+ {
108
+ const rows = buildPlanRows(FULL, "feature-001/task-002", { expandSubtasks: true });
109
+ const levels = new Set(rows.map((r) => r.level));
110
+ for (const level of ["goal", "sprint", "feature", "task", "subtask"]) {
111
+ assert.ok(levels.has(level), `${level} rows are missing`);
112
+ }
113
+ // Depth is what makes the shape readable without reading the ids.
114
+ const goal = rows.find((r) => r.level === "goal");
115
+ const sprint = rows.find((r) => r.level === "sprint");
116
+ const feature = rows.find((r) => r.level === "feature");
117
+ const task = rows.find((r) => r.id === "feature-001/task-002");
118
+ const subtask = rows.find((r) => r.level === "subtask");
119
+ assert.ok(goal.depth < sprint.depth);
120
+ assert.ok(sprint.depth < feature.depth);
121
+ assert.ok(feature.depth < task.depth);
122
+ assert.ok(task.depth < subtask.depth);
123
+ assert.equal(task.active, true, "the active task is marked so the surface can highlight it");
124
+ assert.deepEqual(task.dependsOn, ["feature-001/task-001"]);
125
+ assert.equal(subtask.parentId, "feature-001/task-002");
126
+ console.log("✓ all five levels are emitted, nested, with the active task marked");
127
+ }
128
+ // ── grouping levels that say nothing are skipped ───────────────────────────
129
+ {
130
+ const single = {
131
+ version: "2.0",
132
+ baseRevision: 1,
133
+ goals: [{ id: "goal-001", title: "The only goal" }],
134
+ sprints: [],
135
+ features: [{ id: "f1", name: "F", tasks: [{ id: "t1", description: "a", status: "pending", subtasks: [] }] }],
136
+ };
137
+ // One goal is the run's headline; the surface draws it above the tree, so a
138
+ // row repeating it is a wasted line out of nine.
139
+ assert.ok(!titles(single).includes("The only goal"), "a lone goal is collapsed by default");
140
+ assert.ok(titles(single, null, { collapseTrivial: false }).includes("The only goal"));
141
+ const noSprints = buildPlanRows(FULL, null);
142
+ assert.ok(noSprints.some((r) => r.level === "sprint"), "two goals and real sprints are structure, and structure is drawn");
143
+ const flat = {
144
+ version: "2.0",
145
+ baseRevision: 1,
146
+ goals: [],
147
+ sprints: [],
148
+ features: [{ id: "f1", name: "F", tasks: [{ id: "t1", description: "a", status: "pending", subtasks: [] }] }],
149
+ };
150
+ assert.deepEqual(buildPlanRows(flat, null).map((r) => `${r.level}:${r.depth}`), ["feature:0", "task:1"], "a plan using two levels is not indented as though it used five");
151
+ console.log("✓ a grouping level with nothing to say costs no rows");
152
+ }
153
+ // ── subtasks appear where they are actionable ──────────────────────────────
154
+ {
155
+ const idle = buildPlanRows(FULL, null);
156
+ assert.ok(idle.some((r) => r.level === "subtask"), "the in-progress task's subtasks show even with no explicit active task");
157
+ const collapsed = buildPlanRows({ ...FULL, features: FULL.features.map((f) => ({ ...f, tasks: (f.tasks ?? []).map((t) => ({ ...t, status: "pending" })) })) }, null);
158
+ assert.equal(collapsed.filter((r) => r.level === "subtask").length, 0, "with nothing in progress, subtasks are detail nobody is acting on");
159
+ assert.ok(buildPlanRows(collapsed.length ? FULL : FULL, null, { expandSubtasks: true }).filter((r) => r.level === "subtask")
160
+ .length > 0, "expanding shows them all");
161
+ console.log("✓ subtasks follow the work, and expand on request");
162
+ }
163
+ // ── where the window should sit ────────────────────────────────────────────
164
+ {
165
+ const rows = buildPlanRows(FULL, "feature-001/task-002");
166
+ const focus = focusRowIndex(rows);
167
+ assert.equal(rows[focus]?.id, "feature-001/task-002", "the window follows the active task");
168
+ const allDone = {
169
+ version: "2.0",
170
+ baseRevision: 1,
171
+ goals: [],
172
+ sprints: [],
173
+ features: [{ id: "f1", name: "F", tasks: [{ id: "t1", description: "a", status: "complete", subtasks: [] }] }],
174
+ };
175
+ assert.equal(focusRowIndex(buildPlanRows(allDone, null)), buildPlanRows(allDone, null).length - 1);
176
+ assert.equal(focusRowIndex([]), 0, "an empty plan does not produce a negative index");
177
+ console.log("✓ the focus row is the work, or the tail when there is none");
178
+ }
179
+ // ── junk in, no throw out ──────────────────────────────────────────────────
180
+ {
181
+ const junk = {
182
+ version: "2.0",
183
+ baseRevision: 0,
184
+ };
185
+ assert.doesNotThrow(() => buildPlanRows(junk, null));
186
+ assert.deepEqual(buildPlanRows(junk, null), []);
187
+ assert.deepEqual(groupPlan(junk), []);
188
+ console.log("✓ a plan missing every array renders as nothing rather than throwing");
189
+ }
190
+ //# sourceMappingURL=planTree.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planTree.test.js","sourceRoot":"","sources":["../../tests/planTree.test.ts"],"names":[],"mappings":"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"}