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,288 @@
1
+ /**
2
+ * The start-up wizard: what the answers mean, and how they are asked.
3
+ *
4
+ * The bug this replaces: choosing "autopilot" started the run immediately,
5
+ * with no idea and no scope, so the first thing the harness did was invent a
6
+ * project and start building it. Autopilot was being read as "you decide
7
+ * everything, including what I want".
8
+ *
9
+ * Two questions were tangled together and are now separate — *what are we
10
+ * building* and *who signs off on what* — and the second turned out to be
11
+ * tangled too, because one switch cannot say "let it plan on its own but show
12
+ * me the review". It is a workflow now: a mode per phase.
13
+ */
14
+ import assert from "node:assert/strict";
15
+ import { mkdtempSync, rmSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { join } from "node:path";
18
+ import { BRIEF_QUESTION, DISPLAY_QUESTION, HANDOFF_QUESTION, PHASE_MODE_OPTIONS, PHASE_PURPOSE, SELECTABLE_PHASES, WORKFLOW_QUESTION, customWorkflow, planIntake, } from "../src/intake.js";
19
+ import { buildWorkflow, pickDisplay, runIntakeWizard, unattendedIntake } from "../src/ui/wizard.js";
20
+ import { BUILTIN_WORKFLOWS, builtInWorkflow, loadSavedWorkflows } from "../src/workflow.js";
21
+ import { BUILTIN_DISPLAYS } from "../src/ui/display.js";
22
+ /** A scripted human. Answers are matched against the question title. */
23
+ function human(script) {
24
+ const asked = [];
25
+ const notices = [];
26
+ const remaining = [...script];
27
+ const answer = (title, options) => {
28
+ asked.push({ title, options });
29
+ const i = remaining.findIndex(([re]) => re.test(title));
30
+ if (i === -1)
31
+ return undefined;
32
+ const [, value] = remaining.splice(i, 1)[0];
33
+ return typeof value === "function" ? value(options ?? []) : value;
34
+ };
35
+ const prompt = {
36
+ select: async (title, options) => answer(title, options),
37
+ input: async (title) => answer(title, null),
38
+ notify: (message) => {
39
+ notices.push(message);
40
+ },
41
+ };
42
+ return { prompt, asked, notices, remaining };
43
+ }
44
+ const pick = (re) => (options) => options.find((o) => re.test(o));
45
+ /** An isolated place for saved workflows and templates. */
46
+ function sandbox() {
47
+ const dir = mkdtempSync(join(tmpdir(), "intake-store-"));
48
+ return { env: { PI_CODING_AGENT_DIR: dir }, clean: () => rmSync(dir, { recursive: true, force: true }) };
49
+ }
50
+ // ── a workflow is a mode per phase ─────────────────────────────────────────
51
+ {
52
+ const copilot = planIntake({ workflow: builtInWorkflow("copilot"), brief: "a CSV reconciler" });
53
+ assert.equal(copilot.mode, "copilot");
54
+ assert.equal(copilot.phaseModes.define, "copilot");
55
+ assert.equal(copilot.phaseModes.build, "autopilot");
56
+ assert.match(copilot.summary, /\[define\]/, "the summary shows which phases stop");
57
+ assert.match(copilot.summary, /a CSV reconciler/);
58
+ const autopilot = planIntake({ workflow: builtInWorkflow("autopilot"), brief: "x" });
59
+ assert.equal(autopilot.mode, "autopilot");
60
+ assert.ok(Object.values(autopilot.phaseModes).every((m) => m === "autopilot"), "autopilot stops nowhere");
61
+ assert.ok(autopilot.warnings.some((w) => /Nothing is being approved by you/.test(w)));
62
+ // The shape the old switch could not express.
63
+ const late = planIntake({
64
+ workflow: customWorkflow(["define", "plan", "build", "verify", "review", "ship"], { review: "copilot", ship: "copilot" }),
65
+ brief: "x",
66
+ });
67
+ assert.equal(late.phaseModes.define, "autopilot", "it plans on its own");
68
+ assert.equal(late.phaseModes.review, "copilot", "and still shows you the review");
69
+ assert.equal(late.mode, "copilot", "any stop at all makes this a copilot run");
70
+ console.log("✓ a workflow says who signs each phase, including the ones a switch could not reach");
71
+ }
72
+ // ── the built-ins ──────────────────────────────────────────────────────────
73
+ {
74
+ assert.ok(BUILTIN_WORKFLOWS.length >= 4, "there are several to choose from");
75
+ for (const w of BUILTIN_WORKFLOWS) {
76
+ assert.ok(w.builtIn, `${w.id} must be marked built-in`);
77
+ assert.ok(w.description.length > 20, `${w.id} says what it is for`);
78
+ assert.ok(w.phases.length > 0);
79
+ for (const p of w.phases) {
80
+ assert.ok(["copilot", "autopilot"].includes(w.modes[p]), `${w.id}/${p} has no mode`);
81
+ }
82
+ }
83
+ assert.ok(builtInWorkflow("research-first").phases.includes("research"), "the research workflow actually enables research");
84
+ assert.ok(builtInWorkflow("every-gate").phases.every((p) => builtInWorkflow("every-gate").modes[p] === "copilot"), "'every gate' means every gate");
85
+ console.log("✓ every built-in workflow is complete and says what it is for");
86
+ }
87
+ // ── the missing question ───────────────────────────────────────────────────
88
+ {
89
+ const vague = planIntake({ workflow: builtInWorkflow("autopilot"), brief: " " });
90
+ assert.equal(vague.brief, null);
91
+ assert.ok(vague.warnings.some((w) => /No goal was given/.test(w) && /will not guess/.test(w)), "an empty goal is allowed, and the run says it will ask rather than invent one");
92
+ assert.match(vague.summary, /you will be asked/);
93
+ console.log("✓ a missing goal is a stated fact, not a licence to invent a project");
94
+ }
95
+ // ── session policy ─────────────────────────────────────────────────────────
96
+ {
97
+ const off = planIntake({ workflow: builtInWorkflow("copilot"), brief: "x", handoff: "off" });
98
+ assert.equal(off.session.contextThreshold, 0, "no handoff means no context handoff either");
99
+ assert.ok(off.warnings.some((w) => /one context window/.test(w)));
100
+ const perTask = planIntake({ workflow: builtInWorkflow("copilot"), brief: "x", handoff: "task" });
101
+ assert.match(perTask.summary, /per task/);
102
+ console.log("✓ the session policy is chosen, explained, and warned about when it will hurt");
103
+ }
104
+ // ── the wizard flow ────────────────────────────────────────────────────────
105
+ {
106
+ const box = sandbox();
107
+ const h = human([
108
+ [/which phases, and which of them stop for you/, pick(/^research first/)],
109
+ [/What are you building/, "a CLI that reconciles Stripe payouts"],
110
+ [/fresh session/, pick(/every phase/)],
111
+ [/How deep should research go/, pick(/Very Deep/)],
112
+ [/How much of the plan/, pick(/^everything/)],
113
+ [/Ready/, pick(/start with these settings/)],
114
+ ]);
115
+ const result = await runIntakeWizard({ prompt: h.prompt, env: box.env });
116
+ assert.equal(result.cancelled, false);
117
+ if (result.cancelled)
118
+ throw new Error("unreachable");
119
+ assert.equal(result.plan.workflow.id, "research-first");
120
+ assert.equal(result.plan.brief, "a CLI that reconciles Stripe payouts");
121
+ assert.ok(result.plan.phases.includes("research"));
122
+ assert.equal(result.plan.phaseModes.define, "copilot");
123
+ assert.equal(result.plan.display.levels.subtask, "all", "the display template was applied");
124
+ const titles = h.asked.map((a) => a.title).join("\n");
125
+ assert.match(titles, /What are you building/, "the goal is asked for whatever the workflow");
126
+ assert.match(titles, /How much of the plan/);
127
+ assert.ok(h.notices.some((n) => /Workflow {2}research first/.test(n)), "the summary is shown before committing");
128
+ assert.equal(result.plan.researchDepth, "deep", "very deep was stored when research is in pipeline");
129
+ assert.match(result.plan.summary, /Research deep/);
130
+ box.clean();
131
+ console.log("✓ the wizard asks four questions and returns what they add up to");
132
+ }
133
+ // ── building a workflow, and keeping it ────────────────────────────────────
134
+ {
135
+ const box = sandbox();
136
+ const h = human([
137
+ // Turn RESEARCH on, SIMPLIFY on, then finish the phase picker.
138
+ [/Which phases should run/, pick(/\[ \] research/)],
139
+ [/Which phases should run/, pick(/\[ \] simplify/)],
140
+ [/Which phases should run/, (o) => o.at(-1)],
141
+ // A mode for each phase, in pipeline order.
142
+ [/^RESEARCH —/, pick(/copilot/)],
143
+ [/^DEFINE —/, pick(/autopilot/)],
144
+ [/^PLAN —/, pick(/autopilot/)],
145
+ [/^BUILD —/, pick(/autopilot/)],
146
+ [/^VERIFY —/, pick(/autopilot/)],
147
+ [/^SIMPLIFY —/, pick(/autopilot/)],
148
+ [/^REVIEW —/, pick(/copilot/)],
149
+ [/^SHIP —/, pick(/copilot/)],
150
+ [/Keep this workflow/, pick(/save it under a name/)],
151
+ [/Call it what/, "Client work"],
152
+ ]);
153
+ const built = await buildWorkflow(h.prompt, box.env);
154
+ assert.ok(built, "a workflow came back");
155
+ assert.equal(built.id, "client-work", "the name became a stable id");
156
+ assert.deepEqual(built.phases, [
157
+ "research",
158
+ "define",
159
+ "plan",
160
+ "build",
161
+ "verify",
162
+ "simplify",
163
+ "review",
164
+ "ship",
165
+ ]);
166
+ assert.equal(built.modes.research, "copilot");
167
+ assert.equal(built.modes.plan, "autopilot", "the middle really is left alone");
168
+ assert.equal(built.modes.review, "copilot");
169
+ assert.equal(built.modes.ship, "copilot");
170
+ // And it is there for the next project.
171
+ const saved = loadSavedWorkflows(box.env);
172
+ assert.equal(saved.length, 1);
173
+ assert.equal(saved[0]?.name, "Client work");
174
+ assert.equal(saved[0]?.builtIn, false);
175
+ // Which means the wizard offers it.
176
+ const h2 = human([
177
+ [/which phases, and which of them stop for you/, pick(/Client work \(yours\)/)],
178
+ [/What are you building/, "the next one"],
179
+ [/fresh session/, (o) => o[0]],
180
+ [/How deep should research go/, pick(/Deep/)],
181
+ [/How much of the plan/, (o) => o[0]],
182
+ [/Ready/, pick(/start with these settings/)],
183
+ ]);
184
+ const second = await runIntakeWizard({ prompt: h2.prompt, env: box.env });
185
+ assert.equal(second.cancelled, false);
186
+ if (second.cancelled)
187
+ throw new Error("unreachable");
188
+ assert.equal(second.plan.workflow.id, "client-work", "a saved workflow is reusable");
189
+ assert.equal(second.plan.phaseModes.ship, "copilot");
190
+ box.clean();
191
+ console.log("✓ a custom workflow can be built, named, kept, and picked again next time");
192
+ }
193
+ // ── a one-off custom workflow is not saved ─────────────────────────────────
194
+ {
195
+ const box = sandbox();
196
+ const h = human([
197
+ [/Which phases should run/, (o) => o.at(-1)],
198
+ [/^DEFINE —/, pick(/copilot/)],
199
+ [/^PLAN —/, pick(/autopilot/)],
200
+ [/^BUILD —/, pick(/autopilot/)],
201
+ [/^VERIFY —/, pick(/autopilot/)],
202
+ [/^REVIEW —/, pick(/autopilot/)],
203
+ [/^SHIP —/, pick(/autopilot/)],
204
+ [/Keep this workflow/, pick(/just use it here/)],
205
+ ]);
206
+ const built = await buildWorkflow(h.prompt, box.env);
207
+ assert.ok(built);
208
+ assert.equal(built.id, "custom");
209
+ assert.equal(loadSavedWorkflows(box.env).length, 0, "declining to keep it keeps nothing");
210
+ box.clean();
211
+ console.log("✓ a one-off shape does not have to be named");
212
+ }
213
+ // ── built-in names are protected ───────────────────────────────────────────
214
+ {
215
+ const box = sandbox();
216
+ const h = human([
217
+ [/Which phases should run/, (o) => o.at(-1)],
218
+ [/^DEFINE —/, pick(/autopilot/)],
219
+ [/^PLAN —/, pick(/autopilot/)],
220
+ [/^BUILD —/, pick(/autopilot/)],
221
+ [/^VERIFY —/, pick(/autopilot/)],
222
+ [/^REVIEW —/, pick(/autopilot/)],
223
+ [/^SHIP —/, pick(/autopilot/)],
224
+ [/Keep this workflow/, pick(/save it under a name/)],
225
+ [/Call it what/, "copilot"],
226
+ [/Call it what/, "my copilot"],
227
+ ]);
228
+ const built = await buildWorkflow(h.prompt, box.env);
229
+ assert.equal(built?.id, "my-copilot");
230
+ assert.ok(h.notices.some((n) => /built-in workflow/.test(n)), "shadowing a built-in is refused, with a reason, and it asks again");
231
+ assert.equal(loadSavedWorkflows(box.env).length, 1);
232
+ box.clean();
233
+ console.log("✓ 'copilot' means the same thing everywhere — a built-in name cannot be taken");
234
+ }
235
+ // ── display templates ──────────────────────────────────────────────────────
236
+ {
237
+ const box = sandbox();
238
+ for (const t of BUILTIN_DISPLAYS) {
239
+ assert.ok(t.builtIn);
240
+ assert.ok(t.description.length > 20, `${t.id} says what it is for`);
241
+ }
242
+ assert.ok(BUILTIN_DISPLAYS.length >= 3, "at least three ship with the package");
243
+ const h = human([[/How much of the plan/, pick(/^overview/)]]);
244
+ const policy = await pickDisplay(h.prompt, box.env);
245
+ assert.equal(policy?.levels.task, false, "overview hides tasks");
246
+ assert.equal(policy?.levels.feature, true);
247
+ box.clean();
248
+ console.log("✓ display templates ship, and picking one returns its policy");
249
+ }
250
+ // ── nobody is there to answer ──────────────────────────────────────────────
251
+ {
252
+ const plan = unattendedIntake("a scheduled build");
253
+ assert.equal(plan.mode, "autopilot");
254
+ assert.ok(Object.values(plan.phaseModes).every((m) => m === "autopilot"), "an approval gate with nobody to answer it would park the run forever");
255
+ assert.equal(plan.brief, "a scheduled build");
256
+ assert.ok(plan.warnings.some((w) => /no dialogs/i.test(w)), "a headless run says the wizard was skipped rather than implying the human chose this");
257
+ console.log("✓ with no dialogs the wizard is skipped loudly, and nothing can park the run");
258
+ }
259
+ // ── cancelling ─────────────────────────────────────────────────────────────
260
+ {
261
+ const cancelled = await runIntakeWizard({ prompt: human([]).prompt });
262
+ assert.equal(cancelled.cancelled, true, "an unanswered question cancels rather than guessing");
263
+ console.log("✓ cancelling writes nothing");
264
+ }
265
+ // ── the questions themselves ───────────────────────────────────────────────
266
+ {
267
+ for (const q of [HANDOFF_QUESTION]) {
268
+ assert.ok(q.options && q.options.length >= 2, `${q.id} needs real choices`);
269
+ for (const o of q.options ?? []) {
270
+ assert.ok(o.label.length > 3, `${q.id} option has no label`);
271
+ assert.ok(o.help.length > 20, `${q.id}/${o.value} does not say why you would pick it`);
272
+ }
273
+ }
274
+ assert.ok(BRIEF_QUESTION.placeholder, "the goal question shows an example");
275
+ assert.ok(WORKFLOW_QUESTION.title.length > 20);
276
+ assert.ok(DISPLAY_QUESTION.title.length > 20);
277
+ assert.equal(PHASE_MODE_OPTIONS.length, 2);
278
+ for (const o of PHASE_MODE_OPTIONS)
279
+ assert.ok(o.help.length > 20, `${o.value} does not explain itself`);
280
+ // Every phase someone can pick has a line saying what it is for — that line
281
+ // is the whole reason the mode question is asked one phase at a time.
282
+ for (const p of SELECTABLE_PHASES) {
283
+ assert.ok(PHASE_PURPOSE[p] && PHASE_PURPOSE[p].length > 10, `${p} has no purpose line`);
284
+ }
285
+ assert.ok(!SELECTABLE_PHASES.includes("init"), "INIT is plumbing, not a phase anyone picks");
286
+ console.log("✓ every choice explains itself");
287
+ }
288
+ //# sourceMappingURL=intake.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intake.test.js","sourceRoot":"","sources":["../../tests/intake.test.ts"],"names":[],"mappings":"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"}