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.
- package/LICENSE +21 -0
- package/README.md +38 -1
- package/dist/{analyze-PDDIU7HD.js → analyze-QVQ4CTCU.js} +7 -9
- package/dist/{analyze-PDDIU7HD.js.map → analyze-QVQ4CTCU.js.map} +1 -1
- package/dist/chunk-3ULIAC2J.js +58 -0
- package/dist/chunk-3ULIAC2J.js.map +1 -0
- package/dist/{chunk-LTPXKMPE.js → chunk-DLWRUTRL.js} +105 -157
- package/dist/chunk-DLWRUTRL.js.map +1 -0
- package/dist/chunk-HDV3YDTG.js +52 -0
- package/dist/chunk-HDV3YDTG.js.map +1 -0
- package/dist/chunk-JMSRJ43G.js +84 -0
- package/dist/chunk-JMSRJ43G.js.map +1 -0
- package/dist/{chunk-4OQ2ARLP.js → chunk-KLBAHTXX.js} +10 -2
- package/dist/chunk-KLBAHTXX.js.map +1 -0
- package/dist/chunk-KMX3DUJN.js +104 -0
- package/dist/chunk-KMX3DUJN.js.map +1 -0
- package/dist/{chunk-65KDGHLM.js → chunk-LJI45O5B.js} +38 -19
- package/dist/chunk-LJI45O5B.js.map +1 -0
- package/dist/chunk-O5XI2CFF.js +850 -0
- package/dist/chunk-O5XI2CFF.js.map +1 -0
- package/dist/{chunk-HPSU5GGE.js → chunk-OEJSMZMO.js} +7 -9
- package/dist/{chunk-HPSU5GGE.js.map → chunk-OEJSMZMO.js.map} +1 -1
- package/dist/chunk-PA3GI7LR.js +240 -0
- package/dist/chunk-PA3GI7LR.js.map +1 -0
- package/dist/{chunk-OZVHOVDT.js → chunk-SLHZPB3C.js} +15 -8
- package/dist/chunk-SLHZPB3C.js.map +1 -0
- package/dist/{chunk-CSSXTPWE.js → chunk-VM7C7L3A.js} +2 -2
- package/dist/cli.js +55 -18
- package/dist/cli.js.map +1 -1
- package/dist/execute-TEJ26L4O.js +12 -0
- package/dist/{generate-HP4CPMJG.js → generate-KBQ4KW4T.js} +4 -4
- package/dist/init-4VMPBRMA.js +9 -0
- package/dist/plan-PWYZP5AN.js +13 -0
- package/dist/pr-CJQWZUDR.js +13 -0
- package/dist/prd-4KLQY7BC.js +13 -0
- package/dist/review-YFCWBBKY.js +11 -0
- package/dist/{run-A44XQ77Z.js → run-3GJC54DB.js} +292 -26
- package/dist/run-3GJC54DB.js.map +1 -0
- package/package.json +13 -3
- package/web/public/app.css +481 -0
- package/web/public/app.js +522 -0
- package/web/public/index.html +113 -0
- package/dist/chunk-4OQ2ARLP.js.map +0 -1
- package/dist/chunk-65KDGHLM.js.map +0 -1
- package/dist/chunk-LTPXKMPE.js.map +0 -1
- package/dist/chunk-OZVHOVDT.js.map +0 -1
- package/dist/chunk-SKTTLX7R.js +0 -68
- package/dist/chunk-SKTTLX7R.js.map +0 -1
- package/dist/chunk-X5QCISNM.js +0 -180
- package/dist/chunk-X5QCISNM.js.map +0 -1
- package/dist/chunk-YAFHVFV5.js +0 -199
- package/dist/chunk-YAFHVFV5.js.map +0 -1
- package/dist/chunk-ZJB2IMPU.js +0 -85
- package/dist/chunk-ZJB2IMPU.js.map +0 -1
- package/dist/execute-WKYSGIGH.js +0 -11
- package/dist/init-SXFGOCML.js +0 -9
- package/dist/plan-JUOBYTCD.js +0 -12
- package/dist/pr-CYZYJZZV.js +0 -12
- package/dist/prd-PZOY3FCC.js +0 -12
- package/dist/review-MK5FTVUE.js +0 -12
- package/dist/run-A44XQ77Z.js.map +0 -1
- /package/dist/{chunk-CSSXTPWE.js.map → chunk-VM7C7L3A.js.map} +0 -0
- /package/dist/{execute-WKYSGIGH.js.map → execute-TEJ26L4O.js.map} +0 -0
- /package/dist/{generate-HP4CPMJG.js.map → generate-KBQ4KW4T.js.map} +0 -0
- /package/dist/{init-SXFGOCML.js.map → init-4VMPBRMA.js.map} +0 -0
- /package/dist/{plan-JUOBYTCD.js.map → plan-PWYZP5AN.js.map} +0 -0
- /package/dist/{pr-CYZYJZZV.js.map → pr-CJQWZUDR.js.map} +0 -0
- /package/dist/{prd-PZOY3FCC.js.map → prd-4KLQY7BC.js.map} +0 -0
- /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-
|
|
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-
|
|
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-
|
|
79
|
+
const { runGenerate } = await import("./generate-KBQ4KW4T.js");
|
|
51
80
|
const code = await runGenerate(options.prompt);
|
|
52
81
|
process.exit(code);
|
|
53
82
|
});
|
|
54
|
-
|
|
55
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
109
|
+
const { runPlan } = await import("./plan-PWYZP5AN.js");
|
|
79
110
|
const code = await runPlan(issue);
|
|
80
111
|
process.exit(code);
|
|
81
112
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"--
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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":"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","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":";;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,SAAS,4BAA4B;AAM9C,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;AAOA,SAAS,eAAe,KAAuB;AAC7C,SAAO,IACJ,OAAO,SAAS,kCAAkC,EAClD,OAAO,WAAW,iBAAiB,EACnC,OAAO,cAAc,mCAAmC,YAAY,EACpE,OAAO,cAAc,oCAAoC,EACzD,OAAO,iBAAiB,4CAA4C,YAAY,EAChF,OAAO,uBAAuB,wCAAwC,YAAY,EAClF,OAAO,iBAAiB,0CAA0C;AACvE;AAMA,SAAS,oBAAoB,MAAmD;AAC9E,QAAM,YAAgC,CAAC;AACvC,MAAI,KAAK,QAAQ,QAAQ,KAAK,UAAU,MAAM;AAC5C,cAAU,UAAU;AAAA,EACtB;AACA,MAAI,KAAK,SAAS,QAAW;AAC3B,cAAU,OAAO,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,SAAS,QAAW;AAC3B,cAAU,OAAO,KAAK;AAAA,EACxB;AACA,MAAI,KAAK,YAAY,QAAW;AAC9B,cAAU,iBAAiB,KAAK;AAAA,EAClC;AACA,MAAI,KAAK,gBAAgB,QAAW;AAClC,cAAU,WAAW,KAAK;AAAA,EAC5B;AACA,MAAI,KAAK,cAAc,MAAM;AAC3B,cAAU,cAAc;AAAA,EAC1B;AACA,SAAO;AACT;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;AACA,qBAAmB,oBAAoB,IAAI,CAAC;AAC9C,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;AAAA,IACE,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;AAAA,EAC/F;AACF,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;AAAA,IACE,QACG,QAAQ,SAAS,EACjB,YAAY,4DAA4D,EACxE,OAAO,oBAAoB,oDAA+C,EAC1E,OAAO,6BAA6B,2BAA2B,YAAY,EAC3E;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF,EACC,OAAO,mBAAmB,8CAA8C,EACxE;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACF,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"]}
|
|
@@ -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-
|
|
4
|
+
} from "./chunk-KLBAHTXX.js";
|
|
5
5
|
import {
|
|
6
6
|
applyPlaceholders,
|
|
7
7
|
loadPrompt
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-SLHZPB3C.js";
|
|
9
9
|
import {
|
|
10
10
|
getGlobalTimeout,
|
|
11
11
|
printError,
|
|
12
12
|
printSuccess
|
|
13
|
-
} from "./chunk-
|
|
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-
|
|
48
|
+
//# sourceMappingURL=generate-KBQ4KW4T.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
|