issue-flow 0.12.0 → 0.14.0

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 (197) hide show
  1. package/README.md +79 -274
  2. package/dist/agent-OX3KPHE4.js +30 -0
  3. package/dist/{analyze-OEET7KGE.js → analyze-WIND2SEB.js} +31 -16
  4. package/dist/analyze-WIND2SEB.js.map +1 -0
  5. package/dist/{apply-ZIA3C52S.js → apply-JNOI2LR4.js} +18 -7
  6. package/dist/{apply-ZIA3C52S.js.map → apply-JNOI2LR4.js.map} +1 -1
  7. package/dist/bench-B4VZON7E.js +910 -0
  8. package/dist/bench-B4VZON7E.js.map +1 -0
  9. package/dist/{chunk-FADTCQGM.js → chunk-2IQ6M4ZE.js} +94 -32
  10. package/dist/chunk-2IQ6M4ZE.js.map +1 -0
  11. package/dist/chunk-3BWZO4YI.js +141 -0
  12. package/dist/chunk-3BWZO4YI.js.map +1 -0
  13. package/dist/chunk-3WFZETIM.js +163 -0
  14. package/dist/chunk-3WFZETIM.js.map +1 -0
  15. package/dist/chunk-67YIU2VB.js +362 -0
  16. package/dist/chunk-67YIU2VB.js.map +1 -0
  17. package/dist/{chunk-QCPGHBSZ.js → chunk-6BENHR2I.js} +63 -21
  18. package/dist/chunk-6BENHR2I.js.map +1 -0
  19. package/dist/{chunk-BYZDPR7N.js → chunk-6QYMSNVA.js} +194 -235
  20. package/dist/chunk-6QYMSNVA.js.map +1 -0
  21. package/dist/{chunk-Y5ZDJ4PJ.js → chunk-76MMPJ53.js} +20 -10
  22. package/dist/chunk-76MMPJ53.js.map +1 -0
  23. package/dist/chunk-7Z4Y3VKM.js +26 -0
  24. package/dist/chunk-7Z4Y3VKM.js.map +1 -0
  25. package/dist/{chunk-3QHK4YQA.js → chunk-B72RQZBV.js} +346 -119
  26. package/dist/chunk-B72RQZBV.js.map +1 -0
  27. package/dist/chunk-BEZ5BA5U.js +625 -0
  28. package/dist/chunk-BEZ5BA5U.js.map +1 -0
  29. package/dist/chunk-BRCNQXYQ.js +74 -0
  30. package/dist/chunk-BRCNQXYQ.js.map +1 -0
  31. package/dist/chunk-CGKLE6WR.js +1203 -0
  32. package/dist/chunk-CGKLE6WR.js.map +1 -0
  33. package/dist/chunk-CRGIQFUQ.js +83 -0
  34. package/dist/chunk-CRGIQFUQ.js.map +1 -0
  35. package/dist/{chunk-NS6R37II.js → chunk-F6TOYSYY.js} +141 -12
  36. package/dist/chunk-F6TOYSYY.js.map +1 -0
  37. package/dist/chunk-G5EK2XRN.js +25 -0
  38. package/dist/chunk-G5EK2XRN.js.map +1 -0
  39. package/dist/chunk-HAKDLR6N.js +134 -0
  40. package/dist/chunk-HAKDLR6N.js.map +1 -0
  41. package/dist/chunk-J3SOTUVI.js +298 -0
  42. package/dist/chunk-J3SOTUVI.js.map +1 -0
  43. package/dist/chunk-JN6D3MY6.js +30 -0
  44. package/dist/chunk-JN6D3MY6.js.map +1 -0
  45. package/dist/{chunk-LAFNLLQP.js → chunk-KMRFRXIT.js} +5 -5
  46. package/dist/chunk-KT7JKOXB.js +72 -0
  47. package/dist/chunk-KT7JKOXB.js.map +1 -0
  48. package/dist/chunk-L6HSKTQE.js +77 -0
  49. package/dist/chunk-L6HSKTQE.js.map +1 -0
  50. package/dist/chunk-LBGHI4S2.js +1264 -0
  51. package/dist/chunk-LBGHI4S2.js.map +1 -0
  52. package/dist/chunk-LEW4QM74.js +180 -0
  53. package/dist/chunk-LEW4QM74.js.map +1 -0
  54. package/dist/{chunk-FJP3UQGD.js → chunk-LFEQIZLB.js} +115 -20
  55. package/dist/chunk-LFEQIZLB.js.map +1 -0
  56. package/dist/chunk-OOVG2KBY.js +77 -0
  57. package/dist/chunk-OOVG2KBY.js.map +1 -0
  58. package/dist/{chunk-56KS3TFQ.js → chunk-OR43364P.js} +115 -160
  59. package/dist/chunk-OR43364P.js.map +1 -0
  60. package/dist/chunk-P3LRUNC6.js +16 -0
  61. package/dist/chunk-P3LRUNC6.js.map +1 -0
  62. package/dist/{chunk-TSOLWK7Y.js → chunk-PBTA3QQX.js} +8 -7
  63. package/dist/{chunk-TSOLWK7Y.js.map → chunk-PBTA3QQX.js.map} +1 -1
  64. package/dist/{chunk-MJULIKQU.js → chunk-PHW2YV6N.js} +23 -47
  65. package/dist/chunk-PHW2YV6N.js.map +1 -0
  66. package/dist/{chunk-73ATPIYX.js → chunk-PZTWU277.js} +36 -71
  67. package/dist/chunk-PZTWU277.js.map +1 -0
  68. package/dist/{chunk-M5UCXTIT.js → chunk-QD4VOILZ.js} +22 -18
  69. package/dist/chunk-QD4VOILZ.js.map +1 -0
  70. package/dist/chunk-QJ5UZAH5.js +2718 -0
  71. package/dist/chunk-QJ5UZAH5.js.map +1 -0
  72. package/dist/chunk-QK7WUO7A.js +283 -0
  73. package/dist/chunk-QK7WUO7A.js.map +1 -0
  74. package/dist/{chunk-A4SLHOW7.js → chunk-QZVKRDJY.js} +27 -19
  75. package/dist/chunk-QZVKRDJY.js.map +1 -0
  76. package/dist/chunk-REO3PXXO.js +71 -0
  77. package/dist/chunk-REO3PXXO.js.map +1 -0
  78. package/dist/{chunk-EZATO3DW.js → chunk-RVO7L4FX.js} +594 -17
  79. package/dist/chunk-RVO7L4FX.js.map +1 -0
  80. package/dist/{chunk-XQUSIEKA.js → chunk-SZMHCEYV.js} +63 -14
  81. package/dist/chunk-SZMHCEYV.js.map +1 -0
  82. package/dist/chunk-TYRNTSPJ.js +243 -0
  83. package/dist/chunk-TYRNTSPJ.js.map +1 -0
  84. package/dist/chunk-UJ3L2MS7.js +238 -0
  85. package/dist/chunk-UJ3L2MS7.js.map +1 -0
  86. package/dist/chunk-V7MO5EDS.js +120 -0
  87. package/dist/chunk-V7MO5EDS.js.map +1 -0
  88. package/dist/chunk-WB2X37MO.js +415 -0
  89. package/dist/chunk-WB2X37MO.js.map +1 -0
  90. package/dist/{chunk-NTMMF5UD.js → chunk-X44FKNKP.js} +525 -252
  91. package/dist/chunk-X44FKNKP.js.map +1 -0
  92. package/dist/chunk-XEYH6ZZI.js +289 -0
  93. package/dist/chunk-XEYH6ZZI.js.map +1 -0
  94. package/dist/cli.js +267 -44
  95. package/dist/cli.js.map +1 -1
  96. package/dist/{config-PRJGWW7J.js → config-HMFMCY2M.js} +31 -5
  97. package/dist/contract-JH2WBIO6.js +8 -0
  98. package/dist/conventions-NJF2OPVQ.js +146 -0
  99. package/dist/conventions-NJF2OPVQ.js.map +1 -0
  100. package/dist/diagnostics-THH42ZMP.js +23 -0
  101. package/dist/execute-KFNNZZHI.js +35 -0
  102. package/dist/{generate-EGB4KV2B.js → generate-FW5C6NP7.js} +37 -20
  103. package/dist/{generate-EGB4KV2B.js.map → generate-FW5C6NP7.js.map} +1 -1
  104. package/dist/git-W72QQ6GT.js +33 -0
  105. package/dist/init-HTN4V67Q.js +24 -0
  106. package/dist/{operations-BYT626KQ.js → operations-BCFOBH42.js} +27 -15
  107. package/dist/{operations-BYT626KQ.js.map → operations-BCFOBH42.js.map} +1 -1
  108. package/dist/permissions-4AKNQZHK.js +18 -0
  109. package/dist/plan-SIZLGA4V.js +34 -0
  110. package/dist/{policy-6S4GFC76.js → policy-DT6Q6ZVM.js} +20 -6
  111. package/dist/policy-DT6Q6ZVM.js.map +1 -0
  112. package/dist/pr-OMWCGUOW.js +39 -0
  113. package/dist/pr-review-N24CZPKR.js +32 -0
  114. package/dist/pr-review-N24CZPKR.js.map +1 -0
  115. package/dist/prd-5OFTZAHJ.js +33 -0
  116. package/dist/prd-5OFTZAHJ.js.map +1 -0
  117. package/dist/ps-RFORTCUD.js +93 -0
  118. package/dist/ps-RFORTCUD.js.map +1 -0
  119. package/dist/recorder-KCCPMKQG.js +32 -0
  120. package/dist/recorder-KCCPMKQG.js.map +1 -0
  121. package/dist/registry-GLPXOMFG.js +15 -0
  122. package/dist/registry-GLPXOMFG.js.map +1 -0
  123. package/dist/{resume-PPCNQVVV.js → resume-M5RLKP4I.js} +55 -34
  124. package/dist/{resume-PPCNQVVV.js.map → resume-M5RLKP4I.js.map} +1 -1
  125. package/dist/review-YM4JAABY.js +35 -0
  126. package/dist/review-YM4JAABY.js.map +1 -0
  127. package/dist/routing-NNT5WKGX.js +94 -0
  128. package/dist/routing-NNT5WKGX.js.map +1 -0
  129. package/dist/run-PZUKHPQK.js +54 -0
  130. package/dist/run-PZUKHPQK.js.map +1 -0
  131. package/dist/session-publisher-T7EI3CIP.js +11 -0
  132. package/dist/session-publisher-T7EI3CIP.js.map +1 -0
  133. package/dist/{state-manager-2EDVDBAR.js → state-manager-GQH32C44.js} +4 -2
  134. package/dist/state-manager-GQH32C44.js.map +1 -0
  135. package/dist/usage-V2CHE5PY.js +177 -0
  136. package/dist/usage-V2CHE5PY.js.map +1 -0
  137. package/dist/{web-EF5WIIGG.js → web-EA3KGNFN.js} +45 -30
  138. package/dist/web-EA3KGNFN.js.map +1 -0
  139. package/package.json +6 -2
  140. package/prompts/execute.md +7 -8
  141. package/prompts/plan.md +4 -5
  142. package/prompts/pr.md +2 -2
  143. package/web/AGENTS.md +152 -13
  144. package/web/public/app.css +380 -109
  145. package/web/public/app.js +525 -25
  146. package/web/public/index.html +68 -1
  147. package/dist/analyze-OEET7KGE.js.map +0 -1
  148. package/dist/chunk-3QHK4YQA.js.map +0 -1
  149. package/dist/chunk-42PJFMAR.js +0 -605
  150. package/dist/chunk-42PJFMAR.js.map +0 -1
  151. package/dist/chunk-4JSOYE4G.js +0 -368
  152. package/dist/chunk-4JSOYE4G.js.map +0 -1
  153. package/dist/chunk-56KS3TFQ.js.map +0 -1
  154. package/dist/chunk-73ATPIYX.js.map +0 -1
  155. package/dist/chunk-A4SLHOW7.js.map +0 -1
  156. package/dist/chunk-BAUPQXPE.js +0 -173
  157. package/dist/chunk-BAUPQXPE.js.map +0 -1
  158. package/dist/chunk-BYZDPR7N.js.map +0 -1
  159. package/dist/chunk-CD5ULRVC.js +0 -615
  160. package/dist/chunk-CD5ULRVC.js.map +0 -1
  161. package/dist/chunk-DIDUVL6O.js +0 -1365
  162. package/dist/chunk-DIDUVL6O.js.map +0 -1
  163. package/dist/chunk-EZATO3DW.js.map +0 -1
  164. package/dist/chunk-FADTCQGM.js.map +0 -1
  165. package/dist/chunk-FJP3UQGD.js.map +0 -1
  166. package/dist/chunk-LWRSMTTZ.js +0 -18
  167. package/dist/chunk-LWRSMTTZ.js.map +0 -1
  168. package/dist/chunk-M5UCXTIT.js.map +0 -1
  169. package/dist/chunk-M66SJHQQ.js +0 -206
  170. package/dist/chunk-M66SJHQQ.js.map +0 -1
  171. package/dist/chunk-MJULIKQU.js.map +0 -1
  172. package/dist/chunk-NS6R37II.js.map +0 -1
  173. package/dist/chunk-NTMMF5UD.js.map +0 -1
  174. package/dist/chunk-QCPGHBSZ.js.map +0 -1
  175. package/dist/chunk-XQUSIEKA.js.map +0 -1
  176. package/dist/chunk-Y5ZDJ4PJ.js.map +0 -1
  177. package/dist/execute-XBNVL753.js +0 -18
  178. package/dist/init-AJHCXJBP.js +0 -10
  179. package/dist/plan-QOZ3RIO6.js +0 -21
  180. package/dist/policy-6S4GFC76.js.map +0 -1
  181. package/dist/pr-EBBHD2ZX.js +0 -26
  182. package/dist/pr-review-VVMW5PO4.js +0 -20
  183. package/dist/prd-JQSZF7PR.js +0 -21
  184. package/dist/review-3F6MARWH.js +0 -19
  185. package/dist/run-RXE5GDQO.js +0 -36
  186. package/dist/web-EF5WIIGG.js.map +0 -1
  187. /package/dist/{config-PRJGWW7J.js.map → agent-OX3KPHE4.js.map} +0 -0
  188. /package/dist/{chunk-LAFNLLQP.js.map → chunk-KMRFRXIT.js.map} +0 -0
  189. /package/dist/{execute-XBNVL753.js.map → config-HMFMCY2M.js.map} +0 -0
  190. /package/dist/{init-AJHCXJBP.js.map → contract-JH2WBIO6.js.map} +0 -0
  191. /package/dist/{plan-QOZ3RIO6.js.map → diagnostics-THH42ZMP.js.map} +0 -0
  192. /package/dist/{pr-EBBHD2ZX.js.map → execute-KFNNZZHI.js.map} +0 -0
  193. /package/dist/{pr-review-VVMW5PO4.js.map → git-W72QQ6GT.js.map} +0 -0
  194. /package/dist/{prd-JQSZF7PR.js.map → init-HTN4V67Q.js.map} +0 -0
  195. /package/dist/{review-3F6MARWH.js.map → permissions-4AKNQZHK.js.map} +0 -0
  196. /package/dist/{run-RXE5GDQO.js.map → plan-SIZLGA4V.js.map} +0 -0
  197. /package/dist/{state-manager-2EDVDBAR.js.map → pr-OMWCGUOW.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -1,25 +1,39 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  DEFAULT_INACTIVITY_TIMEOUT_MS,
4
- installShutdownHandlers
5
- } from "./chunk-M66SJHQQ.js";
6
- import {
4
+ installShutdownHandlers,
5
+ parseAgentPhaseFlag,
6
+ setAgentCliOverrides,
7
7
  setIssuesCliOverrides,
8
8
  setResilienceCliOverrides,
9
+ setRoutingCliOverrides,
10
+ setVerifyCliOverrides,
9
11
  setWebCliOverrides
10
- } from "./chunk-42PJFMAR.js";
11
- import "./chunk-DIDUVL6O.js";
12
+ } from "./chunk-QJ5UZAH5.js";
13
+ import "./chunk-QK7WUO7A.js";
12
14
  import {
13
15
  printError,
14
16
  setGlobalTimeout,
15
17
  setInactivityTimeout,
16
18
  setVerbose
17
- } from "./chunk-BYZDPR7N.js";
18
- import "./chunk-CD5ULRVC.js";
19
+ } from "./chunk-TYRNTSPJ.js";
20
+ import "./chunk-6QYMSNVA.js";
21
+ import "./chunk-3WFZETIM.js";
22
+ import "./chunk-HAKDLR6N.js";
23
+ import "./chunk-BEZ5BA5U.js";
24
+ import "./chunk-67YIU2VB.js";
25
+ import "./chunk-P3LRUNC6.js";
26
+ import "./chunk-G5EK2XRN.js";
27
+ import "./chunk-J3SOTUVI.js";
28
+ import {
29
+ isAgentProviderId
30
+ } from "./chunk-LBGHI4S2.js";
31
+ import "./chunk-7Z4Y3VKM.js";
32
+ import "./chunk-XEYH6ZZI.js";
19
33
 
20
34
  // src/cli.ts
21
35
  import { createRequire } from "module";
22
- import { Command, InvalidArgumentError } from "commander";
36
+ import { Command, InvalidArgumentError, Option } from "commander";
23
37
 
24
38
  // src/cli-options.ts
25
39
  function resolveNoBranch(options) {
@@ -37,9 +51,15 @@ function resolveQueueScopeFlags(options) {
37
51
  "--yes cannot be combined with --only: --yes runs the whole discovered hierarchy, --only runs just the issues you informed."
38
52
  );
39
53
  }
54
+ if (options.cascade === true && options.only === true) {
55
+ throw new CliFlagError(
56
+ "--cascade cannot be combined with --only: --cascade runs the container hierarchy, --only runs just the issues you informed."
57
+ );
58
+ }
40
59
  return {
41
60
  yes: options.yes === true ? true : void 0,
42
- only: options.only === true ? true : void 0
61
+ only: options.only === true ? true : void 0,
62
+ cascade: options.cascade === true ? true : void 0
43
63
  };
44
64
  }
45
65
  function resolveRunPhaseFlags(options) {
@@ -156,6 +176,16 @@ function parseInteger(value) {
156
176
  }
157
177
  return parsed;
158
178
  }
179
+ function parseUsd(value) {
180
+ const parsed = Number.parseFloat(value);
181
+ if (!Number.isFinite(parsed) || parsed < 0) {
182
+ throw new InvalidArgumentError("Must be a non-negative number.");
183
+ }
184
+ return parsed;
185
+ }
186
+ function collectString(value, previous) {
187
+ return [...previous, value];
188
+ }
159
189
  function parseQueueFailureMode(value) {
160
190
  if (value === "stop" || value === "skip" || value === "block") return value;
161
191
  throw new InvalidArgumentError("Must be one of: stop, skip, block.");
@@ -175,7 +205,7 @@ function withUserStoryNumberingOptions(cmd) {
175
205
  );
176
206
  }
177
207
  function withGlobalOptions(cmd) {
178
- return cmd.option("-v, --verbose", "Show Claude progress output in real time").option(
208
+ return cmd.option("-v, --verbose", "Show agent progress output in real time").option(
179
209
  "-t, --timeout <seconds>",
180
210
  "Override headless timeout in seconds (0 = no limit)",
181
211
  parseInteger
@@ -183,7 +213,67 @@ function withGlobalOptions(cmd) {
183
213
  "--inactivity-timeout <seconds>",
184
214
  "Stop the agent after this many seconds with no output (0 = no watchdog)",
185
215
  parseInteger
186
- );
216
+ ).option(
217
+ "--agent <provider>",
218
+ "Run every phase on this agent (claude|codex|cursor|antigravity)"
219
+ ).option("--agent-model <model>", "Override the model for every phase").option(
220
+ "--agent-phase <phase>=<provider>[:<model>]",
221
+ "Override one phase (repeatable)",
222
+ collectAgentPhase,
223
+ {}
224
+ ).option("--verify-level <level>", "Acceptance-contract level: L0 | L1 | L2 | L3 | L5").option("--no-cross-verify", "Keep L2 off even when a trigger would fire").option("--no-escalation", "Keep routing.escalation.enabled off").option("--max-cost <usd>", "Issue cost ceiling in USD (Issue Flow enforces it)", parseUsd).option("--max-duration <seconds>", "Issue duration ceiling in seconds", parseInteger);
225
+ }
226
+ function collectAgentPhase(value, previous) {
227
+ const parsed = parseAgentPhaseFlag(value);
228
+ return { ...previous, [parsed.phase]: parsed.block };
229
+ }
230
+ function resolveAgentOverrides(opts) {
231
+ const overrides = {};
232
+ if (typeof opts.agent === "string") {
233
+ if (!isAgentProviderId(opts.agent)) {
234
+ throw new InvalidArgumentError("Must be one of: claude, codex, cursor, antigravity.");
235
+ }
236
+ overrides.forceProvider = opts.agent;
237
+ }
238
+ if (typeof opts.agentModel === "string") {
239
+ overrides.forceModel = opts.agentModel;
240
+ }
241
+ if (opts.agentPhase && typeof opts.agentPhase === "object") {
242
+ overrides.phases = opts.agentPhase;
243
+ }
244
+ return overrides;
245
+ }
246
+ var VERIFY_LEVELS = ["L0", "L1", "L2", "L3", "L5"];
247
+ function resolveVerifyOverrides(opts) {
248
+ const overrides = {};
249
+ if (typeof opts.verifyLevel === "string") {
250
+ if (!VERIFY_LEVELS.includes(opts.verifyLevel)) {
251
+ throw new InvalidArgumentError("Must be one of: L0, L1, L2, L3, L5.");
252
+ }
253
+ overrides.level = opts.verifyLevel;
254
+ }
255
+ if (opts.crossVerify === false) overrides.crossVerify = false;
256
+ return overrides;
257
+ }
258
+ function resolveRoutingOverrides(opts) {
259
+ const overrides = {};
260
+ if (opts.escalation === false) {
261
+ overrides.escalation = {
262
+ enabled: false,
263
+ minAttemptsBeforeEscalation: 2,
264
+ maxEscalations: 2,
265
+ maxRungs: ["effort", "model", "harness"]
266
+ };
267
+ }
268
+ if (typeof opts.maxCost === "number" || typeof opts.maxDuration === "number") {
269
+ overrides.ceilings = {
270
+ maxCostUsdPerIssue: typeof opts.maxCost === "number" ? opts.maxCost : null,
271
+ maxDurationMsPerIssue: typeof opts.maxDuration === "number" ? opts.maxDuration * 1e3 : null,
272
+ maxExecutionsPerIssue: null,
273
+ onCeiling: "block"
274
+ };
275
+ }
276
+ return overrides;
187
277
  }
188
278
  function withResilienceOptions(cmd) {
189
279
  return cmd.option("--continuous", "Long-running profile: keep going without supervision").option("--resilient", "Alias of --continuous").option("--no-failover", "Never migrate a phase to another agent provider").option("--auto-decompose", "Act on a decomposition report instead of only writing it");
@@ -218,7 +308,7 @@ function resolveWebOverrides(opts) {
218
308
  }
219
309
  var program = new Command();
220
310
  program.name("issue-flow").description(
221
- "Unified CLI for orchestrating the full issue-flow pipeline via Claude Code Headless."
311
+ "Unified CLI for orchestrating the full issue-flow pipeline via Claude Code, Codex CLI, Cursor CLI or Antigravity CLI."
222
312
  ).version(version);
223
313
  program.hook("preAction", (_thisCommand, actionCommand) => {
224
314
  installShutdownHandlers();
@@ -233,6 +323,17 @@ program.hook("preAction", (_thisCommand, actionCommand) => {
233
323
  setInactivityTimeout(opts.inactivityTimeout * 1e3);
234
324
  }
235
325
  setWebCliOverrides(resolveWebOverrides(opts));
326
+ try {
327
+ setVerifyCliOverrides(resolveVerifyOverrides(opts));
328
+ setAgentCliOverrides(resolveAgentOverrides(opts));
329
+ setRoutingCliOverrides(resolveRoutingOverrides(opts));
330
+ } catch (error) {
331
+ if (error instanceof InvalidArgumentError) {
332
+ printError(error.message);
333
+ process.exit(1);
334
+ }
335
+ throw error;
336
+ }
236
337
  setResilienceCliOverrides(
237
338
  resolveResilienceOverrides({
238
339
  continuous: opts.continuous,
@@ -257,19 +358,22 @@ withIssueOptions(
257
358
  withGlobalOptions(
258
359
  program.command("init").description(
259
360
  "Check prerequisites and report (or create) the conventions this repository is missing"
260
- ).option("--apply", "Create the missing files instead of only reporting them").option("--json", "Emit the plan as JSON").option("--scope <dir>", "Resolve the conventions for a subdirectory (monorepo)").option("--check-only", "Only verify prerequisites, as earlier releases did")
361
+ ).option("--apply", "Create the missing files instead of only reporting them").option("--json", "Emit the plan as JSON").option("--scope <dir>", "Resolve the conventions for a subdirectory (monorepo)").option("--check-only", "Only verify prerequisites, as earlier releases did").option("--no-agent-prompt", "Skip the first-run agent choice")
261
362
  )
262
363
  ).action(
263
364
  async (options) => {
264
- const { loadIssuesConfig } = await import("./config-PRJGWW7J.js");
265
- const { runInit } = await import("./init-AJHCXJBP.js");
365
+ const { loadIssuesConfig } = await import("./config-HMFMCY2M.js");
366
+ const { runInit } = await import("./init-HTN4V67Q.js");
266
367
  const { preferredProvider } = await loadIssuesConfig();
267
- const code = await runInit(preferredProvider, options);
368
+ const code = await runInit(preferredProvider, {
369
+ ...options,
370
+ noAgentPrompt: options.agentPrompt === false
371
+ });
268
372
  process.exit(code);
269
373
  }
270
374
  );
271
375
  withGlobalOptions(
272
- program.command("generate").description("Draft an issue via Claude Code Headless and create it").requiredOption("--prompt <text>", "Issue description text").option("--github", "Create the issue on GitHub").option("--local", "Create the issue under issues/<n>/ only").option("--both", "Create the issue on GitHub and mirror it locally")
376
+ program.command("generate").description("Draft an issue with the configured agent and create it").requiredOption("--prompt <text>", "Issue description text").option("--github", "Create the issue on GitHub").option("--local", "Create the issue under issues/<n>/ only").option("--both", "Create the issue on GitHub and mirror it locally")
273
377
  ).action(async (options) => {
274
378
  let target;
275
379
  try {
@@ -281,7 +385,7 @@ withGlobalOptions(
281
385
  }
282
386
  throw error;
283
387
  }
284
- const { runGenerate } = await import("./generate-EGB4KV2B.js");
388
+ const { runGenerate } = await import("./generate-FW5C6NP7.js");
285
389
  const code = await runGenerate(options.prompt, target);
286
390
  process.exit(code);
287
391
  });
@@ -295,7 +399,7 @@ withUserStoryNumberingOptions(
295
399
  ).argument("<issues...>", 'Issue number(s): 42, "42,43" or 42 43').option("--mode <mode>", "Execution mode: auto | manual", "auto").option("--from <phase>", "Resume from a specific phase").option(
296
400
  "--no-branch",
297
401
  "Run pipeline on current branch without creating a new branch or PR"
298
- ).option("--pr-review", "Review the created Pull Request after the pr phase").option("-y, --yes", "Run the whole discovered hierarchy without confirmation").option("--only", "Run just the issues informed, without their hierarchy").option(
402
+ ).option("--pr-review", "Review the created Pull Request after the pr phase").option("-y, --yes", "Run the whole discovered hierarchy without confirmation").option("--cascade", "Run the children of a container, without implementing it").option("--only", "Run just the issues informed, without their hierarchy").option(
299
403
  "--retry-limit <number>",
300
404
  "Retry transient Claude failures up to N consecutive times",
301
405
  parseInteger
@@ -303,7 +407,7 @@ withUserStoryNumberingOptions(
303
407
  "--on-issue-failure <mode>",
304
408
  "In a queue, on a failing issue: stop | skip | block",
305
409
  parseQueueFailureMode
306
- )
410
+ ).option("-d, --background", "Detach after confirmation and return the terminal").addOption(new Option("--detached-child").hideHelp())
307
411
  )
308
412
  )
309
413
  )
@@ -324,7 +428,7 @@ withUserStoryNumberingOptions(
324
428
  }
325
429
  throw error;
326
430
  }
327
- const { runPipeline } = await import("./run-RXE5GDQO.js");
431
+ const { runPipeline } = await import("./run-PZUKHPQK.js");
328
432
  const code = await runPipeline(
329
433
  issues,
330
434
  options.mode,
@@ -334,11 +438,14 @@ withUserStoryNumberingOptions(
334
438
  {
335
439
  yes: scope.yes,
336
440
  only: scope.only,
441
+ cascade: scope.cascade,
337
442
  continueNumbering: numbering.continueFlag,
338
443
  startUs: numbering.startUs,
339
444
  retryLimit: options.retryLimit,
340
445
  retryForever: options.retryForever,
341
- onIssueFailure: options.onIssueFailure
446
+ onIssueFailure: options.onIssueFailure,
447
+ background: options.background,
448
+ detachedChild: options.detachedChild
342
449
  }
343
450
  );
344
451
  process.exit(code);
@@ -349,7 +456,7 @@ withIssueOptions(
349
456
  program.command("resume").description("Resume an interrupted pipeline from the phase it stopped at").argument("[issue]", "Issue to resume. Omitted: the most recently attempted one").option("--all", "Resume every unfinished issue of this project, in order").option("--mode <mode>", "Execution mode: auto | manual", "auto")
350
457
  )
351
458
  ).action(async (issue, options) => {
352
- const { runResume } = await import("./resume-PPCNQVVV.js");
459
+ const { runResume } = await import("./resume-M5RLKP4I.js");
353
460
  const code = await runResume(issue, {
354
461
  ...options.all === void 0 ? {} : { all: options.all },
355
462
  ...options.mode === void 0 ? {} : { mode: options.mode }
@@ -359,22 +466,47 @@ withIssueOptions(
359
466
  withGlobalOptions(
360
467
  program.command("status").description("What is running right now, in which phase, and since when").argument("[issue]", "Restrict the report to one issue").option("--json", "Emit the assembled state as JSON")
361
468
  ).action(async (issue, options) => {
362
- const { runStatus } = await import("./operations-BYT626KQ.js");
469
+ const { runStatus } = await import("./operations-BCFOBH42.js");
363
470
  process.exit(
364
471
  await runStatus(issue, { ...options.json === void 0 ? {} : { json: options.json } })
365
472
  );
366
473
  });
474
+ withGlobalOptions(
475
+ program.command("usage").description("Aggregate execution telemetry from tasks.json").argument("[issue]", "Restrict the report to one issue").option("--issue <issue>", "Same as the positional argument").option("--since <date>", "Only executions started on or after this ISO date").option("--by <key>", "Group by harness, provider, model, purpose or status").option("--json", "Emit the assembled totals as JSON")
476
+ ).action(
477
+ async (issue, options) => {
478
+ const { runUsage, USAGE_GROUP_KEYS } = await import("./usage-V2CHE5PY.js");
479
+ const by = options.by;
480
+ if (by !== void 0 && !USAGE_GROUP_KEYS.includes(by)) {
481
+ printError("Must be one of: harness, provider, model, purpose, status.");
482
+ process.exit(1);
483
+ }
484
+ process.exit(
485
+ await runUsage(issue ?? options.issue, {
486
+ ...options.since === void 0 ? {} : { since: options.since },
487
+ ...by === void 0 ? {} : { by },
488
+ ...options.json === void 0 ? {} : { json: options.json }
489
+ })
490
+ );
491
+ }
492
+ );
493
+ withGlobalOptions(
494
+ program.command("ps").description("Every issue-flow run active on this machine").option("--json", "Emit the listing as JSON").option("--watch", "Refresh the listing until interrupted")
495
+ ).action(async (options) => {
496
+ const { runPs } = await import("./ps-RFORTCUD.js");
497
+ process.exit(await runPs(options));
498
+ });
367
499
  withGlobalOptions(
368
500
  program.command("runs").description("History of the runs of this project, with how each ended")
369
501
  ).action(async () => {
370
- const { runRuns } = await import("./operations-BYT626KQ.js");
502
+ const { runRuns } = await import("./operations-BCFOBH42.js");
371
503
  process.exit(await runRuns());
372
504
  });
373
505
  withGlobalOptions(
374
506
  program.command("logs").description("Read the execution journal (events.jsonl), filtered and readable").argument("[issue]", "Issue to read. Omitted: the most recently attempted one").option("--issue <issue>", "Same as the positional argument").option("--follow", "Keep reading as the journal grows").option("--tail <n>", "How many entries to show first (default 50)", parseInteger).option("--kind <kinds>", "Only these event types, comma separated (retry, phase:end, \u2026)")
375
507
  ).action(
376
508
  async (issue, options) => {
377
- const { runLogs } = await import("./operations-BYT626KQ.js");
509
+ const { runLogs } = await import("./operations-BCFOBH42.js");
378
510
  const kinds = options.kind === void 0 ? void 0 : options.kind.split(",").map((kind) => kind.trim()).filter((kind) => kind !== "");
379
511
  process.exit(
380
512
  await runLogs(issue ?? options.issue, {
@@ -388,37 +520,37 @@ withGlobalOptions(
388
520
  withGlobalOptions(
389
521
  program.command("pause").description("Ask the running pipeline to stop after writing a checkpoint")
390
522
  ).action(async () => {
391
- const { runPause } = await import("./operations-BYT626KQ.js");
523
+ const { runPause } = await import("./operations-BCFOBH42.js");
392
524
  process.exit(await runPause());
393
525
  });
394
526
  withGlobalOptions(
395
527
  program.command("cancel").description("Stop the run and mark the issue so a resume does not pick it up").argument("[issue]", "Issue to cancel. Omitted: the most recently attempted one")
396
528
  ).action(async (issue) => {
397
- const { runCancel } = await import("./operations-BYT626KQ.js");
529
+ const { runCancel } = await import("./operations-BCFOBH42.js");
398
530
  process.exit(await runCancel(issue));
399
531
  });
400
532
  withIssueOptions(
401
533
  withGlobalOptions(
402
- program.command("analyze").description("Analyze an issue via Claude Code Headless").argument("<issue>", "Issue number")
534
+ program.command("analyze").description("Analyze an issue with the configured agent").argument("<issue>", "Issue number")
403
535
  )
404
536
  ).action(async (issue) => {
405
- const { runAnalyze } = await import("./analyze-OEET7KGE.js");
537
+ const { runAnalyze } = await import("./analyze-WIND2SEB.js");
406
538
  const code = await runAnalyze(issue);
407
539
  process.exit(code);
408
540
  });
409
541
  withIssueOptions(
410
542
  withGlobalOptions(
411
- program.command("prd").description("Generate a PRD from an analyzed issue via Claude Code Headless").argument("<issue>", "Issue number")
543
+ program.command("prd").description("Generate a PRD from an analyzed issue with the configured agent").argument("<issue>", "Issue number")
412
544
  )
413
545
  ).action(async (issue) => {
414
- const { runPrd } = await import("./prd-JQSZF7PR.js");
546
+ const { runPrd } = await import("./prd-5OFTZAHJ.js");
415
547
  const code = await runPrd(issue);
416
548
  process.exit(code);
417
549
  });
418
550
  withUserStoryNumberingOptions(
419
551
  withIssueOptions(
420
552
  withGlobalOptions(
421
- program.command("plan").description("Convert a PRD to a tasks.json task plan via Claude Code Headless").argument("<issue>", "Issue number")
553
+ program.command("plan").description("Convert a PRD to a tasks.json task plan with the configured agent").argument("<issue>", "Issue number")
422
554
  )
423
555
  )
424
556
  ).action(async (issue, options) => {
@@ -432,7 +564,7 @@ withUserStoryNumberingOptions(
432
564
  }
433
565
  throw error;
434
566
  }
435
- const { runPlan } = await import("./plan-QOZ3RIO6.js");
567
+ const { runPlan } = await import("./plan-SIZLGA4V.js");
436
568
  const code = await runPlan(issue, void 0, numbering);
437
569
  process.exit(code);
438
570
  });
@@ -451,7 +583,7 @@ withWebOptions(
451
583
  ).action(
452
584
  async (positionalMaxIter, options) => {
453
585
  try {
454
- const { runExecute } = await import("./execute-XBNVL753.js");
586
+ const { runExecute } = await import("./execute-KFNNZZHI.js");
455
587
  const code = await runExecute(positionalMaxIter, options);
456
588
  process.exit(code);
457
589
  } catch (error) {
@@ -462,19 +594,19 @@ withWebOptions(
462
594
  );
463
595
  withIssueOptions(
464
596
  withGlobalOptions(
465
- program.command("review").description("Validate an issue resolution via Claude Code Headless").argument("<issue>", "Issue number")
597
+ program.command("review").description("Validate an issue resolution with the configured agent").argument("<issue>", "Issue number")
466
598
  )
467
599
  ).action(async (issue) => {
468
- const { runReview } = await import("./review-3F6MARWH.js");
600
+ const { runReview } = await import("./review-YM4JAABY.js");
469
601
  const code = await runReview(issue);
470
602
  process.exit(code);
471
603
  });
472
604
  withIssueOptions(
473
605
  withGlobalOptions(
474
- program.command("pr").description("Create a pull request via Claude Code Headless").argument("<issue>", "Issue number")
606
+ program.command("pr").description("Create a pull request with the configured agent").argument("<issue>", "Issue number")
475
607
  )
476
608
  ).action(async (issue) => {
477
- const { runPr } = await import("./pr-EBBHD2ZX.js");
609
+ const { runPr } = await import("./pr-OMWCGUOW.js");
478
610
  const code = await runPr(issue);
479
611
  process.exit(code);
480
612
  });
@@ -482,35 +614,126 @@ var webCommand = program.command("web").description("Manage the web monitoring s
482
614
  webCommand.command("serve").description(
483
615
  "Run the web monitor server in the foreground (internal \u2014 spawned detached by --web)"
484
616
  ).option("--port <n>", "Web server port (default: 3737)", parseInteger).option("--host <h>", "Web server host (default: 0.0.0.0)").option("--refresh <s>", "Suggested UI polling interval in seconds", parseInteger).action(async (options) => {
485
- const { runWebServe } = await import("./web-EF5WIIGG.js");
617
+ const { runWebServe } = await import("./web-EA3KGNFN.js");
486
618
  const code = await runWebServe(options);
487
619
  if (code !== 0) {
488
620
  process.exit(code);
489
621
  }
490
622
  });
491
623
  webCommand.command("stop").description("Stop the running web monitor server").action(async () => {
492
- const { runWebStop } = await import("./web-EF5WIIGG.js");
624
+ const { runWebStop } = await import("./web-EA3KGNFN.js");
493
625
  const code = await runWebStop();
494
626
  process.exit(code);
495
627
  });
496
628
  withGlobalOptions(
497
629
  program.command("policy").description("Inspect the policies discovered in this repository and their provenance").option("--scope <dir>", "Resolve the policy for a subdirectory (monorepo)").option("--json", "Emit the resolved policy as JSON")
498
630
  ).action(async (options) => {
499
- const { runPolicy } = await import("./policy-6S4GFC76.js");
631
+ const { runPolicy } = await import("./policy-DT6Q6ZVM.js");
500
632
  const code = await runPolicy(options);
501
633
  process.exit(code);
502
634
  });
635
+ var routingCommand = withGlobalOptions(
636
+ program.command("routing").description("Inspect the shadow router (records a recommendation, does not act)")
637
+ );
638
+ routingCommand.option("--json", "Emit the resolved routing config as JSON").action(async (options) => {
639
+ const { runRoutingInspect } = await import("./routing-NNT5WKGX.js");
640
+ process.exit(await runRoutingInspect(options));
641
+ });
642
+ routingCommand.command("report").description("Shadow agreement between selected and actual harness").option("--issue <n>", "Issue number").option("--json", "Emit JSON").action(async (options) => {
643
+ const { runRoutingReport } = await import("./routing-NNT5WKGX.js");
644
+ process.exit(await runRoutingReport(options));
645
+ });
646
+ var conventionsCommand = withGlobalOptions(
647
+ program.command("conventions").description("Compute the repository Git convention (branch, commit, PR title)")
648
+ );
649
+ conventionsCommand.command("branch").description("Print the deterministic branch name for an issue").option("--issue <n>", "Issue number").option("--title <text>", "Issue title, when the issue cannot be resolved").option("--json", "Emit JSON").action(async (options) => {
650
+ const { runConventionsBranch } = await import("./conventions-NJF2OPVQ.js");
651
+ process.exit(await runConventionsBranch(options));
652
+ });
653
+ conventionsCommand.command("commit").description("Print a Conventional Commit message").requiredOption("--type <type>", "Change type (feat, fix, docs, \u2026)").option("--scope <scope>", "Optional scope").requiredOption("--subject <text>", "Commit subject").option("--issue <n>", "Issue number for the Refs trailer").option("--story <id>", "Story id (US-010)").option("--breaking <text>", "Breaking change description").option("--json", "Emit JSON").action(
654
+ async (options) => {
655
+ const { runConventionsCommit } = await import("./conventions-NJF2OPVQ.js");
656
+ process.exit(await runConventionsCommit(options));
657
+ }
658
+ );
659
+ conventionsCommand.command("pr-title").description("Print the Conventional Commit Pull Request title").option("--issue <n>", "Issue number").option("--title <text>", "Issue title, when the issue cannot be resolved").option("--json", "Emit JSON").action(async (options) => {
660
+ const { runConventionsPrTitle } = await import("./conventions-NJF2OPVQ.js");
661
+ process.exit(await runConventionsPrTitle(options));
662
+ });
663
+ var agentCommand = withGlobalOptions(
664
+ program.command("agent").description("Inspect the resolved agent and model for each phase").option("--json", "Emit the resolved agent configuration as JSON")
665
+ );
666
+ agentCommand.action(async (options) => {
667
+ const { runAgent } = await import("./agent-OX3KPHE4.js");
668
+ const code = await runAgent(options);
669
+ process.exit(code);
670
+ });
671
+ agentCommand.command("use").description("Write an agent preference to config.json or .issue-flow.json").argument("<provider>", "claude, codex, cursor or antigravity").option("--model <model>", "Model identifier for this preference").option("--global", "Write to ~/.issue-flow/config.json (default)").option("--project", "Write to .issue-flow.json in the repository").option("--phase <phase>", "Write only the override for this phase").action(
672
+ async (provider, options) => {
673
+ const { runAgentUse } = await import("./agent-OX3KPHE4.js");
674
+ const code = await runAgentUse(provider, options);
675
+ process.exit(code);
676
+ }
677
+ );
503
678
  withGlobalOptions(
504
- program.command("pr-review").description("Review a Pull Request as a whole via Claude Code Headless").argument("[pr]", "Pull Request number (discovered from the session when omitted)").option("--issue <n>", "Issue the Pull Request belongs to").option("--round <n>", "Rewrite a specific review round instead of appending a new one").option("--yes", "Skip the confirmation of the discovered Pull Request").option(
679
+ program.command("pr-review").description("Review a Pull Request as a whole with the configured agent").argument("[pr]", "Pull Request number (discovered from the session when omitted)").option("--issue <n>", "Issue the Pull Request belongs to").option("--round <n>", "Rewrite a specific review round instead of appending a new one").option("--yes", "Skip the confirmation of the discovered Pull Request").option(
505
680
  "--fail-on <level>",
506
681
  "Verdict that fails the command: request-changes | suggestions | none"
507
682
  )
508
683
  ).action(
509
684
  async (pr, options) => {
510
- const { runPrReview } = await import("./pr-review-VVMW5PO4.js");
685
+ const { runPrReview } = await import("./pr-review-N24CZPKR.js");
511
686
  const code = await runPrReview(pr, options);
512
687
  process.exit(code);
513
688
  }
514
689
  );
690
+ withGlobalOptions(
691
+ program.command("bench").description("Measure the corpus: synthetic (CI) or real (paid, on demand)").option("--mode <mode>", "synthetic (default, free) or real (fixtures + harness)").option(
692
+ "--task <class>",
693
+ "Corpus class (repeatable): trivial, small, medium, analysis",
694
+ collectString,
695
+ []
696
+ ).option("--arm <name>", "Experiment arm (repeatable). Default: baseline", collectString, []).option("--repeats <n>", "Repetitions per cell (default 5)", parseInteger).option(
697
+ "--campaign-max-cost <usd>",
698
+ "Campaign cost ceiling in USD (evaluateCeilings)",
699
+ parseUsd
700
+ ).option(
701
+ "--campaign-max-duration <ms>",
702
+ "Campaign duration ceiling in milliseconds",
703
+ parseInteger
704
+ ).option("--out <path>", "Write the markdown report to this path").option("--yes", "Skip the paid-campaign confirmation").option("--repo <path>", "Investigation escape; does not produce a publishable row").option("--json", "Also emit the campaign JSON")
705
+ ).action(
706
+ async (options) => {
707
+ if (options.mode !== void 0 && options.mode !== "synthetic" && options.mode !== "real") {
708
+ printError("Unknown bench mode. Use 'synthetic' or 'real'.");
709
+ process.exit(1);
710
+ }
711
+ const { runBench } = await import("./bench-B4VZON7E.js");
712
+ process.exit(
713
+ await runBench({
714
+ ...options.mode === void 0 ? {} : { mode: options.mode },
715
+ ...options.task === void 0 || options.task.length === 0 ? {} : { task: options.task },
716
+ ...options.arm === void 0 || options.arm.length === 0 ? {} : { arm: options.arm },
717
+ ...options.repeats === void 0 ? {} : { repeats: options.repeats },
718
+ ...options.campaignMaxCost === void 0 ? {} : { maxCost: options.campaignMaxCost },
719
+ ...options.campaignMaxDuration === void 0 ? {} : { maxDuration: options.campaignMaxDuration },
720
+ ...options.out === void 0 ? {} : { out: options.out },
721
+ ...options.yes === void 0 ? {} : { yes: options.yes },
722
+ ...options.repo === void 0 ? {} : { repo: options.repo },
723
+ ...options.json === void 0 ? {} : { json: options.json }
724
+ })
725
+ );
726
+ }
727
+ );
728
+ program.action(async () => {
729
+ const { listLiveRuns } = await import("./registry-GLPXOMFG.js");
730
+ const runs = await listLiveRuns();
731
+ if (runs.length === 0) {
732
+ program.help();
733
+ return;
734
+ }
735
+ const { runPs } = await import("./ps-RFORTCUD.js");
736
+ process.exit(await runPs());
737
+ });
515
738
  program.parse();
516
739
  //# sourceMappingURL=cli.js.map