issue-flow 0.4.4 → 0.5.2

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -1
  3. package/dist/{analyze-PDDIU7HD.js → analyze-QVQ4CTCU.js} +7 -9
  4. package/dist/{analyze-PDDIU7HD.js.map → analyze-QVQ4CTCU.js.map} +1 -1
  5. package/dist/chunk-3ULIAC2J.js +58 -0
  6. package/dist/chunk-3ULIAC2J.js.map +1 -0
  7. package/dist/{chunk-LTPXKMPE.js → chunk-DLWRUTRL.js} +105 -157
  8. package/dist/chunk-DLWRUTRL.js.map +1 -0
  9. package/dist/chunk-HDV3YDTG.js +52 -0
  10. package/dist/chunk-HDV3YDTG.js.map +1 -0
  11. package/dist/chunk-JMSRJ43G.js +84 -0
  12. package/dist/chunk-JMSRJ43G.js.map +1 -0
  13. package/dist/{chunk-4OQ2ARLP.js → chunk-KLBAHTXX.js} +10 -2
  14. package/dist/chunk-KLBAHTXX.js.map +1 -0
  15. package/dist/chunk-KMX3DUJN.js +104 -0
  16. package/dist/chunk-KMX3DUJN.js.map +1 -0
  17. package/dist/{chunk-65KDGHLM.js → chunk-LJI45O5B.js} +38 -19
  18. package/dist/chunk-LJI45O5B.js.map +1 -0
  19. package/dist/chunk-O5XI2CFF.js +850 -0
  20. package/dist/chunk-O5XI2CFF.js.map +1 -0
  21. package/dist/{chunk-HPSU5GGE.js → chunk-OEJSMZMO.js} +7 -9
  22. package/dist/{chunk-HPSU5GGE.js.map → chunk-OEJSMZMO.js.map} +1 -1
  23. package/dist/chunk-PA3GI7LR.js +240 -0
  24. package/dist/chunk-PA3GI7LR.js.map +1 -0
  25. package/dist/{chunk-OZVHOVDT.js → chunk-SLHZPB3C.js} +15 -8
  26. package/dist/chunk-SLHZPB3C.js.map +1 -0
  27. package/dist/{chunk-CSSXTPWE.js → chunk-VM7C7L3A.js} +2 -2
  28. package/dist/cli.js +55 -18
  29. package/dist/cli.js.map +1 -1
  30. package/dist/execute-TEJ26L4O.js +12 -0
  31. package/dist/{generate-HP4CPMJG.js → generate-KBQ4KW4T.js} +4 -4
  32. package/dist/init-4VMPBRMA.js +9 -0
  33. package/dist/plan-PWYZP5AN.js +13 -0
  34. package/dist/pr-CJQWZUDR.js +13 -0
  35. package/dist/prd-4KLQY7BC.js +13 -0
  36. package/dist/review-YFCWBBKY.js +11 -0
  37. package/dist/{run-A44XQ77Z.js → run-3GJC54DB.js} +292 -26
  38. package/dist/run-3GJC54DB.js.map +1 -0
  39. package/package.json +13 -3
  40. package/web/public/app.css +481 -0
  41. package/web/public/app.js +522 -0
  42. package/web/public/index.html +113 -0
  43. package/dist/chunk-4OQ2ARLP.js.map +0 -1
  44. package/dist/chunk-65KDGHLM.js.map +0 -1
  45. package/dist/chunk-LTPXKMPE.js.map +0 -1
  46. package/dist/chunk-OZVHOVDT.js.map +0 -1
  47. package/dist/chunk-SKTTLX7R.js +0 -68
  48. package/dist/chunk-SKTTLX7R.js.map +0 -1
  49. package/dist/chunk-X5QCISNM.js +0 -180
  50. package/dist/chunk-X5QCISNM.js.map +0 -1
  51. package/dist/chunk-YAFHVFV5.js +0 -199
  52. package/dist/chunk-YAFHVFV5.js.map +0 -1
  53. package/dist/chunk-ZJB2IMPU.js +0 -85
  54. package/dist/chunk-ZJB2IMPU.js.map +0 -1
  55. package/dist/execute-WKYSGIGH.js +0 -11
  56. package/dist/init-SXFGOCML.js +0 -9
  57. package/dist/plan-JUOBYTCD.js +0 -12
  58. package/dist/pr-CYZYJZZV.js +0 -12
  59. package/dist/prd-PZOY3FCC.js +0 -12
  60. package/dist/review-MK5FTVUE.js +0 -12
  61. package/dist/run-A44XQ77Z.js.map +0 -1
  62. /package/dist/{chunk-CSSXTPWE.js.map → chunk-VM7C7L3A.js.map} +0 -0
  63. /package/dist/{execute-WKYSGIGH.js.map → execute-TEJ26L4O.js.map} +0 -0
  64. /package/dist/{generate-HP4CPMJG.js.map → generate-KBQ4KW4T.js.map} +0 -0
  65. /package/dist/{init-SXFGOCML.js.map → init-4VMPBRMA.js.map} +0 -0
  66. /package/dist/{plan-JUOBYTCD.js.map → plan-PWYZP5AN.js.map} +0 -0
  67. /package/dist/{pr-CYZYJZZV.js.map → pr-CJQWZUDR.js.map} +0 -0
  68. /package/dist/{prd-PZOY3FCC.js.map → prd-4KLQY7BC.js.map} +0 -0
  69. /package/dist/{review-MK5FTVUE.js.map → review-YFCWBBKY.js.map} +0 -0
package/dist/cli.js CHANGED
@@ -1,9 +1,12 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ setWebCliOverrides
4
+ } from "./chunk-PA3GI7LR.js";
2
5
  import {
3
6
  printError,
4
7
  setGlobalTimeout,
5
8
  setVerbose
6
- } from "./chunk-YAFHVFV5.js";
9
+ } from "./chunk-O5XI2CFF.js";
7
10
 
8
11
  // src/cli.ts
9
12
  import { createRequire } from "module";
@@ -24,6 +27,31 @@ function withGlobalOptions(cmd) {
24
27
  parseInteger
25
28
  );
26
29
  }
30
+ function withWebOptions(cmd) {
31
+ return cmd.option("--web", "Enable the web monitoring server").option("--serve", "Alias for --web").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).option("--web-log-limit <n>", "Max log entries kept in the snapshot", parseInteger).option("--web-no-logs", "Exclude logs from the published snapshot");
32
+ }
33
+ function resolveWebOverrides(opts) {
34
+ const overrides = {};
35
+ if (opts.web === true || opts.serve === true) {
36
+ overrides.enabled = true;
37
+ }
38
+ if (opts.port !== void 0) {
39
+ overrides.port = opts.port;
40
+ }
41
+ if (opts.host !== void 0) {
42
+ overrides.host = opts.host;
43
+ }
44
+ if (opts.refresh !== void 0) {
45
+ overrides.refreshSeconds = opts.refresh;
46
+ }
47
+ if (opts.webLogLimit !== void 0) {
48
+ overrides.logLimit = opts.webLogLimit;
49
+ }
50
+ if (opts.webNoLogs === true) {
51
+ overrides.includeLogs = false;
52
+ }
53
+ return overrides;
54
+ }
27
55
  var program = new Command();
28
56
  program.name("issue-flow").description(
29
57
  "Unified CLI for orchestrating the full issue-flow pipeline via Claude Code Headless."
@@ -36,59 +64,68 @@ program.hook("preAction", (_thisCommand, actionCommand) => {
36
64
  if (opts.timeout !== void 0) {
37
65
  setGlobalTimeout(opts.timeout * 1e3);
38
66
  }
67
+ setWebCliOverrides(resolveWebOverrides(opts));
39
68
  });
40
69
  withGlobalOptions(
41
70
  program.command("init").description("Verify that all prerequisites (claude, gh, git) are met")
42
71
  ).action(async () => {
43
- const { runInit } = await import("./init-SXFGOCML.js");
72
+ const { runInit } = await import("./init-4VMPBRMA.js");
44
73
  const code = await runInit();
45
74
  process.exit(code);
46
75
  });
47
76
  withGlobalOptions(
48
77
  program.command("generate").description("Create a GitHub issue via Claude Code Headless").requiredOption("--prompt <text>", "Issue description text")
49
78
  ).action(async (options) => {
50
- const { runGenerate } = await import("./generate-HP4CPMJG.js");
79
+ const { runGenerate } = await import("./generate-KBQ4KW4T.js");
51
80
  const code = await runGenerate(options.prompt);
52
81
  process.exit(code);
53
82
  });
54
- withGlobalOptions(
55
- program.command("run").description("Execute the full pipeline: prd \u2192 plan \u2192 execute \u2192 review \u2192 pr").argument("<issue>", "Issue number").option("--mode <mode>", "Execution mode: auto | manual", "auto").option("--from <phase>", "Resume from a specific phase").option("--no-branch", "Run pipeline on current branch without creating a new branch or PR")
83
+ withWebOptions(
84
+ withGlobalOptions(
85
+ program.command("run").description("Execute the full pipeline: prd \u2192 plan \u2192 execute \u2192 review \u2192 pr").argument("<issue>", "Issue number").option("--mode <mode>", "Execution mode: auto | manual", "auto").option("--from <phase>", "Resume from a specific phase").option("--no-branch", "Run pipeline on current branch without creating a new branch or PR")
86
+ )
56
87
  ).action(async (issue, options) => {
57
- const { runPipeline } = await import("./run-A44XQ77Z.js");
88
+ const { runPipeline } = await import("./run-3GJC54DB.js");
58
89
  const code = await runPipeline(issue, options.mode, options.from, options.noBranch);
59
90
  process.exit(code);
60
91
  });
61
92
  withGlobalOptions(
62
93
  program.command("analyze").description("Analyze a GitHub issue via Claude Code Headless").argument("<issue>", "Issue number")
63
94
  ).action(async (issue) => {
64
- const { runAnalyze } = await import("./analyze-PDDIU7HD.js");
95
+ const { runAnalyze } = await import("./analyze-QVQ4CTCU.js");
65
96
  const code = await runAnalyze(issue);
66
97
  process.exit(code);
67
98
  });
68
99
  withGlobalOptions(
69
100
  program.command("prd").description("Generate a PRD from an analyzed issue via Claude Code Headless").argument("<issue>", "Issue number")
70
101
  ).action(async (issue) => {
71
- const { runPrd } = await import("./prd-PZOY3FCC.js");
102
+ const { runPrd } = await import("./prd-4KLQY7BC.js");
72
103
  const code = await runPrd(issue);
73
104
  process.exit(code);
74
105
  });
75
106
  withGlobalOptions(
76
107
  program.command("plan").description("Convert a PRD to a tasks.json task plan via Claude Code Headless").argument("<issue>", "Issue number")
77
108
  ).action(async (issue) => {
78
- const { runPlan } = await import("./plan-JUOBYTCD.js");
109
+ const { runPlan } = await import("./plan-PWYZP5AN.js");
79
110
  const code = await runPlan(issue);
80
111
  process.exit(code);
81
112
  });
82
- withGlobalOptions(
83
- program.command("execute").description("Run the iterative story execution loop (issue-flow engine)").option("--issue <number>", "Issue number \u2014 reads artifacts from issues/N/").option("--max-iterations <number>", "Stop after N iterations", parseInteger).option(
84
- "--retry-limit <number>",
85
- "Retry transient Claude failures up to N consecutive times",
86
- parseInteger
87
- ).option("--retry-forever", "Retry transient Claude failures indefinitely").argument("[max-iterations]", "Backward-compatible alias for --max-iterations N", parseInteger)
113
+ withWebOptions(
114
+ withGlobalOptions(
115
+ program.command("execute").description("Run the iterative story execution loop (issue-flow engine)").option("--issue <number>", "Issue number \u2014 reads artifacts from issues/N/").option("--max-iterations <number>", "Stop after N iterations", parseInteger).option(
116
+ "--retry-limit <number>",
117
+ "Retry transient Claude failures up to N consecutive times",
118
+ parseInteger
119
+ ).option("--retry-forever", "Retry transient Claude failures indefinitely").argument(
120
+ "[max-iterations]",
121
+ "Backward-compatible alias for --max-iterations N",
122
+ parseInteger
123
+ )
124
+ )
88
125
  ).action(
89
126
  async (positionalMaxIter, options) => {
90
127
  try {
91
- const { runExecute } = await import("./execute-WKYSGIGH.js");
128
+ const { runExecute } = await import("./execute-TEJ26L4O.js");
92
129
  const code = await runExecute(positionalMaxIter, options);
93
130
  process.exit(code);
94
131
  } catch (error) {
@@ -100,14 +137,14 @@ withGlobalOptions(
100
137
  withGlobalOptions(
101
138
  program.command("review").description("Validate an issue resolution via Claude Code Headless").argument("<issue>", "Issue number")
102
139
  ).action(async (issue) => {
103
- const { runReview } = await import("./review-MK5FTVUE.js");
140
+ const { runReview } = await import("./review-YFCWBBKY.js");
104
141
  const code = await runReview(issue);
105
142
  process.exit(code);
106
143
  });
107
144
  withGlobalOptions(
108
145
  program.command("pr").description("Create a pull request via Claude Code Headless").argument("<issue>", "Issue number")
109
146
  ).action(async (issue) => {
110
- const { runPr } = await import("./pr-CYZYJZZV.js");
147
+ const { runPr } = await import("./pr-CJQWZUDR.js");
111
148
  const code = await runPr(issue);
112
149
  process.exit(code);
113
150
  });
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { Command, InvalidArgumentError } from 'commander';\nimport { setGlobalTimeout, setVerbose } from './core/verbose.js';\nimport { printError } from './ui/logger.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json') as { version: string };\n\n/**\n * Parse a numeric string, throwing InvalidArgumentError if not a valid number.\n */\nfunction parseInteger(value: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed < 0) {\n throw new InvalidArgumentError('Must be a non-negative integer.');\n }\n return parsed;\n}\n\n/**\n * Add shared options (--verbose) to a subcommand.\n */\nfunction withGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-v, --verbose', 'Show Claude progress output in real time')\n .option(\n '-t, --timeout <seconds>',\n 'Override headless timeout in seconds (0 = no limit)',\n parseInteger,\n );\n}\n\nconst program = new Command();\n\nprogram\n .name('issue-flow')\n .description(\n 'Unified CLI for orchestrating the full issue-flow pipeline via Claude Code Headless.',\n )\n .version(version);\n\nprogram.hook('preAction', (_thisCommand, actionCommand) => {\n const opts = actionCommand.opts();\n if (opts.verbose) {\n setVerbose(true);\n }\n if (opts.timeout !== undefined) {\n setGlobalTimeout(opts.timeout * 1000);\n }\n});\n\n// ── init ────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program.command('init').description('Verify that all prerequisites (claude, gh, git) are met'),\n).action(async () => {\n const { runInit } = await import('./commands/init.js');\n const code = await runInit();\n process.exit(code);\n});\n\n// ── generate ────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('generate')\n .description('Create a GitHub issue via Claude Code Headless')\n .requiredOption('--prompt <text>', 'Issue description text'),\n).action(async (options: { prompt: string }) => {\n const { runGenerate } = await import('./commands/generate.js');\n const code = await runGenerate(options.prompt);\n process.exit(code);\n});\n\n// ── run ─────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('run')\n .description('Execute the full pipeline: prd → plan → execute → review → pr')\n .argument('<issue>', 'Issue number')\n .option('--mode <mode>', 'Execution mode: auto | manual', 'auto')\n .option('--from <phase>', 'Resume from a specific phase')\n .option('--no-branch', 'Run pipeline on current branch without creating a new branch or PR'),\n).action(async (issue: string, options: { mode: string; from?: string; noBranch?: boolean }) => {\n const { runPipeline } = await import('./commands/run.js');\n const code = await runPipeline(issue, options.mode, options.from, options.noBranch);\n process.exit(code);\n});\n\n// ── analyze ─────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('analyze')\n .description('Analyze a GitHub issue via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runAnalyze } = await import('./commands/analyze.js');\n const code = await runAnalyze(issue);\n process.exit(code);\n});\n\n// ── prd ─────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('prd')\n .description('Generate a PRD from an analyzed issue via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPrd } = await import('./commands/prd.js');\n const code = await runPrd(issue);\n process.exit(code);\n});\n\n// ── plan ────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('plan')\n .description('Convert a PRD to a tasks.json task plan via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPlan } = await import('./commands/plan.js');\n const code = await runPlan(issue);\n process.exit(code);\n});\n\n// ── execute ─────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('execute')\n .description('Run the iterative story execution loop (issue-flow engine)')\n .option('--issue <number>', 'Issue number — reads artifacts from issues/N/')\n .option('--max-iterations <number>', 'Stop after N iterations', parseInteger)\n .option(\n '--retry-limit <number>',\n 'Retry transient Claude failures up to N consecutive times',\n parseInteger,\n )\n .option('--retry-forever', 'Retry transient Claude failures indefinitely')\n .argument('[max-iterations]', 'Backward-compatible alias for --max-iterations N', parseInteger),\n).action(\n async (\n positionalMaxIter: number | undefined,\n options: {\n issue?: string;\n maxIterations?: number;\n retryLimit?: number;\n retryForever?: boolean;\n },\n ) => {\n try {\n const { runExecute } = await import('./commands/execute.js');\n const code = await runExecute(positionalMaxIter, options);\n process.exit(code);\n } catch (error) {\n printError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n);\n\n// ── review ──────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('review')\n .description('Validate an issue resolution via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runReview } = await import('./commands/review.js');\n const code = await runReview(issue);\n process.exit(code);\n});\n\n// ── pr ──────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('pr')\n .description('Create a pull request via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPr } = await import('./commands/pr.js');\n const code = await runPr(issue);\n process.exit(code);\n});\n\nprogram.parse();\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,SAAS,4BAA4B;AAI9C,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,QAAQ,IAAIA,SAAQ,iBAAiB;AAK7C,SAAS,aAAa,OAAuB;AAC3C,QAAM,SAAS,SAAS,OAAO,EAAE;AACjC,MAAI,OAAO,MAAM,MAAM,KAAK,SAAS,GAAG;AACtC,UAAM,IAAI,qBAAqB,iCAAiC;AAAA,EAClE;AACA,SAAO;AACT;AAKA,SAAS,kBAAkB,KAAuB;AAChD,SAAO,IACJ,OAAO,iBAAiB,0CAA0C,EAClE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACJ;AAEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,YAAY,EACjB;AAAA,EACC;AACF,EACC,QAAQ,OAAO;AAElB,QAAQ,KAAK,aAAa,CAAC,cAAc,kBAAkB;AACzD,QAAM,OAAO,cAAc,KAAK;AAChC,MAAI,KAAK,SAAS;AAChB,eAAW,IAAI;AAAA,EACjB;AACA,MAAI,KAAK,YAAY,QAAW;AAC9B,qBAAiB,KAAK,UAAU,GAAI;AAAA,EACtC;AACF,CAAC;AAGD;AAAA,EACE,QAAQ,QAAQ,MAAM,EAAE,YAAY,yDAAyD;AAC/F,EAAE,OAAO,YAAY;AACnB,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,oBAAoB;AACrD,QAAM,OAAO,MAAM,QAAQ;AAC3B,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,UAAU,EAClB,YAAY,gDAAgD,EAC5D,eAAe,mBAAmB,wBAAwB;AAC/D,EAAE,OAAO,OAAO,YAAgC;AAC9C,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,wBAAwB;AAC7D,QAAM,OAAO,MAAM,YAAY,QAAQ,MAAM;AAC7C,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,KAAK,EACb,YAAY,mFAA+D,EAC3E,SAAS,WAAW,cAAc,EAClC,OAAO,iBAAiB,iCAAiC,MAAM,EAC/D,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,eAAe,oEAAoE;AAC/F,EAAE,OAAO,OAAO,OAAe,YAAiE;AAC9F,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,mBAAmB;AACxD,QAAM,OAAO,MAAM,YAAY,OAAO,QAAQ,MAAM,QAAQ,MAAM,QAAQ,QAAQ;AAClF,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,SAAS,EACjB,YAAY,iDAAiD,EAC7D,SAAS,WAAW,cAAc;AACvC,EAAE,OAAO,OAAO,UAAkB;AAChC,QAAM,EAAE,WAAW,IAAI,MAAM,OAAO,uBAAuB;AAC3D,QAAM,OAAO,MAAM,WAAW,KAAK;AACnC,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,KAAK,EACb,YAAY,gEAAgE,EAC5E,SAAS,WAAW,cAAc;AACvC,EAAE,OAAO,OAAO,UAAkB;AAChC,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,mBAAmB;AACnD,QAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,MAAM,EACd,YAAY,kEAAkE,EAC9E,SAAS,WAAW,cAAc;AACvC,EAAE,OAAO,OAAO,UAAkB;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,oBAAoB;AACrD,QAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,SAAS,EACjB,YAAY,4DAA4D,EACxE,OAAO,oBAAoB,oDAA+C,EAC1E,OAAO,6BAA6B,2BAA2B,YAAY,EAC3E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,mBAAmB,8CAA8C,EACxE,SAAS,oBAAoB,oDAAoD,YAAY;AAClG,EAAE;AAAA,EACA,OACE,mBACA,YAMG;AACH,QAAI;AACF,YAAM,EAAE,WAAW,IAAI,MAAM,OAAO,uBAAuB;AAC3D,YAAM,OAAO,MAAM,WAAW,mBAAmB,OAAO;AACxD,cAAQ,KAAK,IAAI;AAAA,IACnB,SAAS,OAAO;AACd,iBAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACjE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAGA;AAAA,EACE,QACG,QAAQ,QAAQ,EAChB,YAAY,uDAAuD,EACnE,SAAS,WAAW,cAAc;AACvC,EAAE,OAAO,OAAO,UAAkB;AAChC,QAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAsB;AACzD,QAAM,OAAO,MAAM,UAAU,KAAK;AAClC,UAAQ,KAAK,IAAI;AACnB,CAAC;AAGD;AAAA,EACE,QACG,QAAQ,IAAI,EACZ,YAAY,gDAAgD,EAC5D,SAAS,WAAW,cAAc;AACvC,EAAE,OAAO,OAAO,UAAkB;AAChC,QAAM,EAAE,MAAM,IAAI,MAAM,OAAO,kBAAkB;AACjD,QAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,UAAQ,KAAK,IAAI;AACnB,CAAC;AAED,QAAQ,MAAM;","names":["require"]}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { Command, InvalidArgumentError } from 'commander';\nimport { setWebCliOverrides } from './config.js';\nimport { setGlobalTimeout, setVerbose } from './core/verbose.js';\nimport type { WebConfig } from './schemas.js';\nimport { printError } from './ui/logger.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../package.json') as { version: string };\n\n/**\n * Parse a numeric string, throwing InvalidArgumentError if not a valid number.\n */\nfunction parseInteger(value: string): number {\n const parsed = parseInt(value, 10);\n if (Number.isNaN(parsed) || parsed < 0) {\n throw new InvalidArgumentError('Must be a non-negative integer.');\n }\n return parsed;\n}\n\n/**\n * Add shared options (--verbose) to a subcommand.\n */\nfunction withGlobalOptions(cmd: Command): Command {\n return cmd\n .option('-v, --verbose', 'Show Claude progress output in real time')\n .option(\n '-t, --timeout <seconds>',\n 'Override headless timeout in seconds (0 = no limit)',\n parseInteger,\n );\n}\n\n/**\n * Add web monitoring options to a subcommand (run and execute only).\n * The values are resolved into CLI overrides by the preAction hook below;\n * loadWebConfig() applies the flag > env > file > defaults precedence.\n */\nfunction withWebOptions(cmd: Command): Command {\n return cmd\n .option('--web', 'Enable the web monitoring server')\n .option('--serve', 'Alias for --web')\n .option('--port <n>', 'Web server port (default: 3737)', parseInteger)\n .option('--host <h>', 'Web server host (default: 0.0.0.0)')\n .option('--refresh <s>', 'Suggested UI polling interval in seconds', parseInteger)\n .option('--web-log-limit <n>', 'Max log entries kept in the snapshot', parseInteger)\n .option('--web-no-logs', 'Exclude logs from the published snapshot');\n}\n\n/**\n * Extract the web-related CLI flags from a command's options, keeping only\n * the ones the user actually set.\n */\nfunction resolveWebOverrides(opts: Record<string, unknown>): Partial<WebConfig> {\n const overrides: Partial<WebConfig> = {};\n if (opts.web === true || opts.serve === true) {\n overrides.enabled = true;\n }\n if (opts.port !== undefined) {\n overrides.port = opts.port as number;\n }\n if (opts.host !== undefined) {\n overrides.host = opts.host as string;\n }\n if (opts.refresh !== undefined) {\n overrides.refreshSeconds = opts.refresh as number;\n }\n if (opts.webLogLimit !== undefined) {\n overrides.logLimit = opts.webLogLimit as number;\n }\n if (opts.webNoLogs === true) {\n overrides.includeLogs = false;\n }\n return overrides;\n}\n\nconst program = new Command();\n\nprogram\n .name('issue-flow')\n .description(\n 'Unified CLI for orchestrating the full issue-flow pipeline via Claude Code Headless.',\n )\n .version(version);\n\nprogram.hook('preAction', (_thisCommand, actionCommand) => {\n const opts = actionCommand.opts();\n if (opts.verbose) {\n setVerbose(true);\n }\n if (opts.timeout !== undefined) {\n setGlobalTimeout(opts.timeout * 1000);\n }\n setWebCliOverrides(resolveWebOverrides(opts));\n});\n\n// ── init ────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program.command('init').description('Verify that all prerequisites (claude, gh, git) are met'),\n).action(async () => {\n const { runInit } = await import('./commands/init.js');\n const code = await runInit();\n process.exit(code);\n});\n\n// ── generate ────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('generate')\n .description('Create a GitHub issue via Claude Code Headless')\n .requiredOption('--prompt <text>', 'Issue description text'),\n).action(async (options: { prompt: string }) => {\n const { runGenerate } = await import('./commands/generate.js');\n const code = await runGenerate(options.prompt);\n process.exit(code);\n});\n\n// ── run ─────────────────────────────────────────────────────────────────────\nwithWebOptions(\n withGlobalOptions(\n program\n .command('run')\n .description('Execute the full pipeline: prd → plan → execute → review → pr')\n .argument('<issue>', 'Issue number')\n .option('--mode <mode>', 'Execution mode: auto | manual', 'auto')\n .option('--from <phase>', 'Resume from a specific phase')\n .option('--no-branch', 'Run pipeline on current branch without creating a new branch or PR'),\n ),\n).action(async (issue: string, options: { mode: string; from?: string; noBranch?: boolean }) => {\n const { runPipeline } = await import('./commands/run.js');\n const code = await runPipeline(issue, options.mode, options.from, options.noBranch);\n process.exit(code);\n});\n\n// ── analyze ─────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('analyze')\n .description('Analyze a GitHub issue via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runAnalyze } = await import('./commands/analyze.js');\n const code = await runAnalyze(issue);\n process.exit(code);\n});\n\n// ── prd ─────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('prd')\n .description('Generate a PRD from an analyzed issue via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPrd } = await import('./commands/prd.js');\n const code = await runPrd(issue);\n process.exit(code);\n});\n\n// ── plan ────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('plan')\n .description('Convert a PRD to a tasks.json task plan via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPlan } = await import('./commands/plan.js');\n const code = await runPlan(issue);\n process.exit(code);\n});\n\n// ── execute ─────────────────────────────────────────────────────────────────\nwithWebOptions(\n withGlobalOptions(\n program\n .command('execute')\n .description('Run the iterative story execution loop (issue-flow engine)')\n .option('--issue <number>', 'Issue number — reads artifacts from issues/N/')\n .option('--max-iterations <number>', 'Stop after N iterations', parseInteger)\n .option(\n '--retry-limit <number>',\n 'Retry transient Claude failures up to N consecutive times',\n parseInteger,\n )\n .option('--retry-forever', 'Retry transient Claude failures indefinitely')\n .argument(\n '[max-iterations]',\n 'Backward-compatible alias for --max-iterations N',\n parseInteger,\n ),\n ),\n).action(\n async (\n positionalMaxIter: number | undefined,\n options: {\n issue?: string;\n maxIterations?: number;\n retryLimit?: number;\n retryForever?: boolean;\n },\n ) => {\n try {\n const { runExecute } = await import('./commands/execute.js');\n const code = await runExecute(positionalMaxIter, options);\n process.exit(code);\n } catch (error) {\n printError(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n },\n);\n\n// ── review ──────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('review')\n .description('Validate an issue resolution via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runReview } = await import('./commands/review.js');\n const code = await runReview(issue);\n process.exit(code);\n});\n\n// ── pr ──────────────────────────────────────────────────────────────────────\nwithGlobalOptions(\n program\n .command('pr')\n .description('Create a pull request via Claude Code Headless')\n .argument('<issue>', 'Issue number'),\n).action(async (issue: string) => {\n const { runPr } = await import('./commands/pr.js');\n const code = await runPr(issue);\n process.exit(code);\n});\n\nprogram.parse();\n"],"mappings":"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","names":["require"]}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runExecute
4
+ } from "./chunk-DLWRUTRL.js";
5
+ import "./chunk-PA3GI7LR.js";
6
+ import "./chunk-HDV3YDTG.js";
7
+ import "./chunk-SLHZPB3C.js";
8
+ import "./chunk-O5XI2CFF.js";
9
+ export {
10
+ runExecute
11
+ };
12
+ //# sourceMappingURL=execute-TEJ26L4O.js.map
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runHeadless
4
- } from "./chunk-4OQ2ARLP.js";
4
+ } from "./chunk-KLBAHTXX.js";
5
5
  import {
6
6
  applyPlaceholders,
7
7
  loadPrompt
8
- } from "./chunk-OZVHOVDT.js";
8
+ } from "./chunk-SLHZPB3C.js";
9
9
  import {
10
10
  getGlobalTimeout,
11
11
  printError,
12
12
  printSuccess
13
- } from "./chunk-YAFHVFV5.js";
13
+ } from "./chunk-O5XI2CFF.js";
14
14
 
15
15
  // src/commands/generate.ts
16
16
  function parseIssueUrl(output) {
@@ -45,4 +45,4 @@ async function runGenerate(promptText) {
45
45
  export {
46
46
  runGenerate
47
47
  };
48
- //# sourceMappingURL=generate-HP4CPMJG.js.map
48
+ //# sourceMappingURL=generate-KBQ4KW4T.js.map
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runInit
4
+ } from "./chunk-VM7C7L3A.js";
5
+ import "./chunk-O5XI2CFF.js";
6
+ export {
7
+ runInit
8
+ };
9
+ //# sourceMappingURL=init-4VMPBRMA.js.map
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runPlan
4
+ } from "./chunk-KMX3DUJN.js";
5
+ import "./chunk-3ULIAC2J.js";
6
+ import "./chunk-HDV3YDTG.js";
7
+ import "./chunk-KLBAHTXX.js";
8
+ import "./chunk-SLHZPB3C.js";
9
+ import "./chunk-O5XI2CFF.js";
10
+ export {
11
+ runPlan
12
+ };
13
+ //# sourceMappingURL=plan-PWYZP5AN.js.map
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runPr
4
+ } from "./chunk-LJI45O5B.js";
5
+ import "./chunk-3ULIAC2J.js";
6
+ import "./chunk-HDV3YDTG.js";
7
+ import "./chunk-KLBAHTXX.js";
8
+ import "./chunk-SLHZPB3C.js";
9
+ import "./chunk-O5XI2CFF.js";
10
+ export {
11
+ runPr
12
+ };
13
+ //# sourceMappingURL=pr-CJQWZUDR.js.map
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runPrd
4
+ } from "./chunk-JMSRJ43G.js";
5
+ import "./chunk-3ULIAC2J.js";
6
+ import "./chunk-HDV3YDTG.js";
7
+ import "./chunk-KLBAHTXX.js";
8
+ import "./chunk-SLHZPB3C.js";
9
+ import "./chunk-O5XI2CFF.js";
10
+ export {
11
+ runPrd
12
+ };
13
+ //# sourceMappingURL=prd-4KLQY7BC.js.map
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runReview
4
+ } from "./chunk-OEJSMZMO.js";
5
+ import "./chunk-KLBAHTXX.js";
6
+ import "./chunk-SLHZPB3C.js";
7
+ import "./chunk-O5XI2CFF.js";
8
+ export {
9
+ runReview
10
+ };
11
+ //# sourceMappingURL=review-YFCWBBKY.js.map