agentic-forge 0.0.0 → 0.7.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.
- package/LICENSE +21 -21
- package/README.md +31 -21
- package/dist/checkpoints/manager.d.ts +5 -0
- package/dist/checkpoints/manager.js +87 -0
- package/dist/checkpoints/manager.js.map +1 -0
- package/{src → dist}/claude/.claude/skills/analyze/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/create-checkpoint/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/create-log/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/fix-analyze/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-branch/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-commit/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/git-pr/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/sdlc-plan/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/sdlc-review/SKILL.md +1 -1
- package/{src → dist}/claude/.claude/skills/workflow-builder/SKILL.md +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +155 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +2 -0
- package/dist/commands/config-cmd.js +30 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/{src/commands/index.ts → dist/commands/index.d.ts} +1 -10
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +83 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/release-notes.d.ts +5 -0
- package/dist/commands/release-notes.js +68 -0
- package/dist/commands/release-notes.js.map +1 -0
- package/dist/commands/resume.d.ts +5 -0
- package/dist/commands/resume.js +79 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/run.d.ts +14 -0
- package/dist/commands/run.js +193 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/shortcuts.d.ts +2 -0
- package/dist/commands/shortcuts.js +11 -0
- package/dist/commands/shortcuts.js.map +1 -0
- package/dist/commands/skills-dir.d.ts +2 -0
- package/dist/commands/skills-dir.js +9 -0
- package/dist/commands/skills-dir.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.js +99 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.js +65 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/version.d.ts +3 -0
- package/dist/commands/version.js +26 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/workflows.d.ts +4 -0
- package/dist/commands/workflows.js +109 -0
- package/dist/commands/workflows.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +110 -0
- package/dist/config.js.map +1 -0
- package/dist/console.d.ts +103 -0
- package/dist/console.js +670 -0
- package/dist/console.js.map +1 -0
- package/dist/executor.d.ts +27 -0
- package/dist/executor.js +236 -0
- package/dist/executor.js.map +1 -0
- package/dist/git/worktree.d.ts +23 -0
- package/dist/git/worktree.js +170 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/logging/logger.d.ts +27 -0
- package/dist/logging/logger.js +69 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/orchestrator.d.ts +44 -0
- package/dist/orchestrator.js +587 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/parser.d.ts +17 -0
- package/dist/parser.js +184 -0
- package/dist/parser.js.map +1 -0
- package/dist/progress.d.ts +29 -0
- package/dist/progress.js +275 -0
- package/dist/progress.js.map +1 -0
- package/dist/ralph-loop.d.ts +26 -0
- package/dist/ralph-loop.js +194 -0
- package/dist/ralph-loop.js.map +1 -0
- package/dist/renderer.d.ts +15 -0
- package/dist/renderer.js +123 -0
- package/dist/renderer.js.map +1 -0
- package/dist/runner.d.ts +84 -0
- package/dist/runner.js +529 -0
- package/dist/runner.js.map +1 -0
- package/dist/signal-manager.d.ts +16 -0
- package/dist/signal-manager.js +50 -0
- package/dist/signal-manager.js.map +1 -0
- package/dist/steps/base.d.ts +28 -0
- package/dist/steps/base.js +23 -0
- package/dist/steps/base.js.map +1 -0
- package/dist/steps/conditional-step.d.ts +12 -0
- package/dist/steps/conditional-step.js +106 -0
- package/dist/steps/conditional-step.js.map +1 -0
- package/{src/steps/index.ts → dist/steps/index.d.ts} +1 -9
- package/dist/steps/index.js +8 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/parallel-step.d.ts +11 -0
- package/dist/steps/parallel-step.js +166 -0
- package/dist/steps/parallel-step.js.map +1 -0
- package/dist/steps/prompt-step.d.ts +8 -0
- package/dist/steps/prompt-step.js +94 -0
- package/dist/steps/prompt-step.js.map +1 -0
- package/dist/steps/ralph-loop-step.d.ts +8 -0
- package/dist/steps/ralph-loop-step.js +132 -0
- package/dist/steps/ralph-loop-step.js.map +1 -0
- package/dist/steps/serial-step.d.ts +10 -0
- package/dist/steps/serial-step.js +57 -0
- package/dist/steps/serial-step.js.map +1 -0
- package/dist/types.d.ts +118 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -2
- package/.gitattributes +0 -24
- package/.github/workflows/ci.yml +0 -70
- package/.markdownlint-cli2.jsonc +0 -16
- package/.prettierignore +0 -3
- package/.prettierrc +0 -6
- package/.vscode/agentic-forge.code-workspace +0 -26
- package/CHANGELOG.md +0 -100
- package/CLAUDE.md +0 -158
- package/CONTRIBUTING.md +0 -152
- package/biome.json +0 -21
- package/scripts/copy-assets.js +0 -21
- package/src/checkpoints/manager.ts +0 -119
- package/src/cli.ts +0 -182
- package/src/commands/config-cmd.ts +0 -28
- package/src/commands/init.ts +0 -96
- package/src/commands/release-notes.ts +0 -85
- package/src/commands/resume.ts +0 -103
- package/src/commands/run.ts +0 -234
- package/src/commands/shortcuts.ts +0 -11
- package/src/commands/skills-dir.ts +0 -11
- package/src/commands/status.ts +0 -112
- package/src/commands/update.ts +0 -64
- package/src/commands/version.ts +0 -27
- package/src/commands/workflows.ts +0 -129
- package/src/config.ts +0 -129
- package/src/console.ts +0 -790
- package/src/executor.ts +0 -354
- package/src/git/worktree.ts +0 -236
- package/src/logging/logger.ts +0 -95
- package/src/orchestrator.ts +0 -815
- package/src/parser.ts +0 -225
- package/src/progress.ts +0 -306
- package/src/ralph-loop.ts +0 -260
- package/src/renderer.ts +0 -164
- package/src/runner.ts +0 -634
- package/src/signal-manager.ts +0 -55
- package/src/steps/base.ts +0 -71
- package/src/steps/conditional-step.ts +0 -144
- package/src/steps/parallel-step.ts +0 -213
- package/src/steps/prompt-step.ts +0 -121
- package/src/steps/ralph-loop-step.ts +0 -186
- package/src/steps/serial-step.ts +0 -84
- package/src/types.ts +0 -141
- package/tests/config.test.ts +0 -219
- package/tests/console.test.ts +0 -506
- package/tests/executor.test.ts +0 -339
- package/tests/init.test.ts +0 -86
- package/tests/logger.test.ts +0 -110
- package/tests/parser.test.ts +0 -290
- package/tests/progress.test.ts +0 -345
- package/tests/ralph-loop.test.ts +0 -418
- package/tests/renderer.test.ts +0 -350
- package/tests/runner.test.ts +0 -497
- package/tests/setup.test.ts +0 -7
- package/tests/signal-manager.test.ts +0 -26
- package/tests/steps.test.ts +0 -412
- package/tests/worktree.test.ts +0 -411
- package/tsconfig.json +0 -18
- package/vitest.config.ts +0 -8
- /package/{src → dist}/agents/explorer.md +0 -0
- /package/{src → dist}/agents/reviewer.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/bug.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/debt.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/doc.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/security.md +0 -0
- /package/{src → dist}/claude/.claude/skills/analyze/references/style.md +0 -0
- /package/{src → dist}/claude/.claude/skills/orchestrate/SKILL.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/bug.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/chore.md +0 -0
- /package/{src → dist}/claude/.claude/skills/sdlc-plan/references/feature.md +0 -0
- /package/{src → dist}/claude/.claude/skills/workflow-builder/references/REFERENCE.md +0 -0
- /package/{src → dist}/claude/.claude/skills/workflow-builder/references/workflow-example.yaml +0 -0
- /package/{src → dist}/prompts/agentic-system.md +0 -0
- /package/{src → dist}/templates/analysis/bug.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/debt.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/doc.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/security.md.j2 +0 -0
- /package/{src → dist}/templates/analysis/style.md.j2 +0 -0
- /package/{src → dist}/templates/analysis-summary.md.j2 +0 -0
- /package/{src → dist}/templates/checkpoint.md.j2 +0 -0
- /package/{src → dist}/templates/implementation-report.md.j2 +0 -0
- /package/{src → dist}/templates/memory.md.j2 +0 -0
- /package/{src → dist}/templates/plan-bug.md.j2 +0 -0
- /package/{src → dist}/templates/plan-chore.md.j2 +0 -0
- /package/{src → dist}/templates/plan-feature.md.j2 +0 -0
- /package/{src → dist}/templates/progress.json.j2 +0 -0
- /package/{src → dist}/templates/ralph-report.md.j2 +0 -0
- /package/{src → dist}/workflows/analyze-codebase-merge.yaml +0 -0
- /package/{src → dist}/workflows/analyze-codebase.yaml +0 -0
- /package/{src → dist}/workflows/analyze-single.yaml +0 -0
- /package/{src → dist}/workflows/demo.yaml +0 -0
- /package/{src → dist}/workflows/one-shot.yaml +0 -0
- /package/{src → dist}/workflows/plan-build-review.yaml +0 -0
- /package/{src → dist}/workflows/ralph-loop.yaml +0 -0
package/dist/runner.js
ADDED
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
/** Claude CLI runner for workflow orchestration. */
|
|
2
|
+
import { execFileSync, spawn } from "node:child_process";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
// --- Path constants ---
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
/** Path to the bundled skills directory for --add-dir. */
|
|
9
|
+
export const SKILLS_DIR = path.join(__dirname, "claude");
|
|
10
|
+
/** Path to the agentic system prompt file. */
|
|
11
|
+
export const AGENTIC_SYSTEM_PROMPT_FILE = path.join(__dirname, "prompts", "agentic-system.md");
|
|
12
|
+
// --- Model mapping ---
|
|
13
|
+
export const MODEL_MAP = {
|
|
14
|
+
sonnet: "sonnet",
|
|
15
|
+
haiku: "haiku",
|
|
16
|
+
opus: "opus",
|
|
17
|
+
};
|
|
18
|
+
// --- Executable resolution ---
|
|
19
|
+
/**
|
|
20
|
+
* Resolve executable path for cross-platform subprocess calls.
|
|
21
|
+
*
|
|
22
|
+
* Uses `where` on Windows and `which` on Unix to find the full path,
|
|
23
|
+
* allowing shell=false in subprocess calls.
|
|
24
|
+
*/
|
|
25
|
+
export function getExecutable(name) {
|
|
26
|
+
try {
|
|
27
|
+
const cmd = process.platform === "win32" ? "where" : "which";
|
|
28
|
+
const result = execFileSync(cmd, [name], {
|
|
29
|
+
encoding: "utf-8",
|
|
30
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
31
|
+
});
|
|
32
|
+
const firstLine = result.trim().split(/\r?\n/)[0];
|
|
33
|
+
if (firstLine) {
|
|
34
|
+
return firstLine;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Fall through to error
|
|
39
|
+
}
|
|
40
|
+
throw new FileNotFoundError(`Executable not found in PATH: ${name}`);
|
|
41
|
+
}
|
|
42
|
+
/** Custom error for missing executables. */
|
|
43
|
+
export class FileNotFoundError extends Error {
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = "FileNotFoundError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// --- Stream-JSON parsing ---
|
|
50
|
+
/** Parse a single line of stream-json output. */
|
|
51
|
+
export function parseStreamJsonLine(line) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (!trimmed.startsWith("{")) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(trimmed);
|
|
58
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Extract model name from an assistant or system message. */
|
|
68
|
+
export function extractModelFromMessage(data) {
|
|
69
|
+
const msgType = data.type;
|
|
70
|
+
if (msgType === "assistant") {
|
|
71
|
+
const message = data.message;
|
|
72
|
+
if (typeof message !== "object" || message === null)
|
|
73
|
+
return null;
|
|
74
|
+
const model = message.model;
|
|
75
|
+
return typeof model === "string" ? model : null;
|
|
76
|
+
}
|
|
77
|
+
if (msgType === "system") {
|
|
78
|
+
const model = data.model;
|
|
79
|
+
return typeof model === "string" ? model : null;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/** Format model name for display. */
|
|
84
|
+
export function formatModelName(model) {
|
|
85
|
+
if (!model) {
|
|
86
|
+
return "";
|
|
87
|
+
}
|
|
88
|
+
// Pattern 1: claude-{tier}-{major}-{minor}-{date}
|
|
89
|
+
const pattern1 = /^claude-(sonnet|opus|haiku)-(\d+)-(\d+)-\d{8}$/;
|
|
90
|
+
let match = pattern1.exec(model);
|
|
91
|
+
if (match) {
|
|
92
|
+
const [, tier, major, minor] = match;
|
|
93
|
+
return `${tier}-${major}.${minor}`;
|
|
94
|
+
}
|
|
95
|
+
// Pattern 2: claude-{major}-{minor}-{tier}-{date}
|
|
96
|
+
const pattern2 = /^claude-(\d+)-(\d+)-(sonnet|opus|haiku)-\d{8}$/;
|
|
97
|
+
match = pattern2.exec(model);
|
|
98
|
+
if (match) {
|
|
99
|
+
const [, major, minor, tier] = match;
|
|
100
|
+
return `${tier}-${major}.${minor}`;
|
|
101
|
+
}
|
|
102
|
+
// Pattern 3: claude-{tier}-{date} (no version)
|
|
103
|
+
const pattern3 = /^claude-(sonnet|opus|haiku)-\d{8}$/;
|
|
104
|
+
match = pattern3.exec(model);
|
|
105
|
+
if (match) {
|
|
106
|
+
return match[1];
|
|
107
|
+
}
|
|
108
|
+
return model;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Extract text content from an assistant message.
|
|
112
|
+
*
|
|
113
|
+
* Handles two stream-json formats:
|
|
114
|
+
* 1. Verbose format: {"type": "assistant", "message": {"content": [...]}}
|
|
115
|
+
* 2. Stream event format: {"type": "stream_event", "event": {"type": "content_block_delta", ...}}
|
|
116
|
+
*
|
|
117
|
+
* Returns array of [content_block_index, text] tuples.
|
|
118
|
+
*/
|
|
119
|
+
export function extractTextFromMessage(data) {
|
|
120
|
+
const msgType = data.type;
|
|
121
|
+
const results = [];
|
|
122
|
+
if (msgType === "assistant") {
|
|
123
|
+
const message = data.message;
|
|
124
|
+
if (typeof message !== "object" || message === null)
|
|
125
|
+
return results;
|
|
126
|
+
const msg = message;
|
|
127
|
+
const contentRaw = msg.content;
|
|
128
|
+
if (!Array.isArray(contentRaw))
|
|
129
|
+
return results;
|
|
130
|
+
for (let idx = 0; idx < contentRaw.length; idx++) {
|
|
131
|
+
const block = contentRaw[idx];
|
|
132
|
+
if (typeof block === "object" &&
|
|
133
|
+
block !== null &&
|
|
134
|
+
block.type === "text") {
|
|
135
|
+
const text = block.text;
|
|
136
|
+
if (typeof text === "string" && text) {
|
|
137
|
+
results.push([idx, text]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (msgType === "stream_event") {
|
|
143
|
+
const eventRaw = data.event;
|
|
144
|
+
if (typeof eventRaw !== "object" || eventRaw === null)
|
|
145
|
+
return results;
|
|
146
|
+
const event = eventRaw;
|
|
147
|
+
const eventType = event.type;
|
|
148
|
+
if (eventType === "content_block_delta") {
|
|
149
|
+
const idx = typeof event.index === "number" ? event.index : 0;
|
|
150
|
+
const deltaRaw = event.delta;
|
|
151
|
+
if (typeof deltaRaw !== "object" || deltaRaw === null)
|
|
152
|
+
return results;
|
|
153
|
+
const delta = deltaRaw;
|
|
154
|
+
if (delta.type === "text_delta") {
|
|
155
|
+
const text = delta.text;
|
|
156
|
+
if (typeof text === "string" && text) {
|
|
157
|
+
results.push([idx, text]);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return results;
|
|
163
|
+
}
|
|
164
|
+
/** Extract text content from a user message. */
|
|
165
|
+
export function extractUserText(data) {
|
|
166
|
+
if (data.type !== "user") {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const message = data.message;
|
|
170
|
+
if (typeof message !== "object" || message === null)
|
|
171
|
+
return null;
|
|
172
|
+
const msg = message;
|
|
173
|
+
const contentRaw = msg.content;
|
|
174
|
+
if (!Array.isArray(contentRaw))
|
|
175
|
+
return null;
|
|
176
|
+
const texts = [];
|
|
177
|
+
for (const block of contentRaw) {
|
|
178
|
+
if (typeof block === "object" &&
|
|
179
|
+
block !== null &&
|
|
180
|
+
block.type === "text") {
|
|
181
|
+
const text = block.text;
|
|
182
|
+
if (typeof text === "string" && text) {
|
|
183
|
+
texts.push(text);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (typeof block === "string") {
|
|
187
|
+
texts.push(block);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return texts.length > 0 ? texts.join("\n") : null;
|
|
191
|
+
}
|
|
192
|
+
/** Extract the final result text from a result message. */
|
|
193
|
+
export function extractResultText(data) {
|
|
194
|
+
if (data.type !== "result") {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return data.result ?? null;
|
|
198
|
+
}
|
|
199
|
+
// --- System prompt ---
|
|
200
|
+
/** Load the agentic system prompt from file. */
|
|
201
|
+
export function getAgenticSystemPrompt() {
|
|
202
|
+
if (existsSync(AGENTIC_SYSTEM_PROMPT_FILE)) {
|
|
203
|
+
return readFileSync(AGENTIC_SYSTEM_PROMPT_FILE, "utf-8");
|
|
204
|
+
}
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
// --- SessionOutput ---
|
|
208
|
+
export class SessionOutput {
|
|
209
|
+
sessionId;
|
|
210
|
+
isSuccess;
|
|
211
|
+
context;
|
|
212
|
+
extra;
|
|
213
|
+
rawJson;
|
|
214
|
+
constructor(sessionId = null, isSuccess = false, context = "", extra = {}, rawJson = null) {
|
|
215
|
+
this.sessionId = sessionId;
|
|
216
|
+
this.isSuccess = isSuccess;
|
|
217
|
+
this.context = context;
|
|
218
|
+
this.extra = extra;
|
|
219
|
+
this.rawJson = rawJson;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Extract the session output JSON from Claude's stdout.
|
|
223
|
+
*
|
|
224
|
+
* Looks for the last JSON block that contains the required base keys
|
|
225
|
+
* (sessionId, isSuccess, context).
|
|
226
|
+
*/
|
|
227
|
+
static fromStdout(stdout) {
|
|
228
|
+
if (!stdout) {
|
|
229
|
+
return new SessionOutput(null, false, "No output received from Claude session");
|
|
230
|
+
}
|
|
231
|
+
// Find all JSON blocks in code blocks
|
|
232
|
+
const jsonPattern = /```(?:json)?\s*(\{[^`]*\})\s*```/gs;
|
|
233
|
+
const codeBlockMatches = [...stdout.matchAll(jsonPattern)].map((m) => m[1]);
|
|
234
|
+
// Also look for bare JSON objects with sessionId
|
|
235
|
+
const bareJsonPattern = /\{[^{}]*"sessionId"[^{}]*\}/gs;
|
|
236
|
+
const bareMatches = [...stdout.matchAll(bareJsonPattern)].map((m) => m[0]);
|
|
237
|
+
const allMatches = [...codeBlockMatches, ...bareMatches];
|
|
238
|
+
// Try to parse each match, starting from the last (most recent)
|
|
239
|
+
for (let i = allMatches.length - 1; i >= 0; i--) {
|
|
240
|
+
try {
|
|
241
|
+
const data = JSON.parse(allMatches[i]);
|
|
242
|
+
if ("sessionId" in data && "isSuccess" in data && "context" in data) {
|
|
243
|
+
const extra = {};
|
|
244
|
+
for (const [k, v] of Object.entries(data)) {
|
|
245
|
+
if (k !== "sessionId" && k !== "isSuccess" && k !== "context") {
|
|
246
|
+
extra[k] = v;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return new SessionOutput(data.sessionId, Boolean(data.isSuccess), data.context ?? "", extra, data);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// Invalid JSON, try next match
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return new SessionOutput(null, false, "No valid session output JSON found in Claude response");
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// --- ClaudeResult ---
|
|
260
|
+
export class ClaudeResult {
|
|
261
|
+
returncode;
|
|
262
|
+
stdout;
|
|
263
|
+
stderr;
|
|
264
|
+
prompt;
|
|
265
|
+
cwd;
|
|
266
|
+
model;
|
|
267
|
+
_sessionOutput = null;
|
|
268
|
+
constructor(returncode, stdout, stderr, prompt, cwd, model = null) {
|
|
269
|
+
this.returncode = returncode;
|
|
270
|
+
this.stdout = stdout;
|
|
271
|
+
this.stderr = stderr;
|
|
272
|
+
this.prompt = prompt;
|
|
273
|
+
this.cwd = cwd;
|
|
274
|
+
this.model = model;
|
|
275
|
+
}
|
|
276
|
+
get success() {
|
|
277
|
+
return this.returncode === 0;
|
|
278
|
+
}
|
|
279
|
+
get sessionOutput() {
|
|
280
|
+
if (this._sessionOutput === null) {
|
|
281
|
+
this._sessionOutput = SessionOutput.fromStdout(this.stdout);
|
|
282
|
+
}
|
|
283
|
+
return this._sessionOutput;
|
|
284
|
+
}
|
|
285
|
+
toString() {
|
|
286
|
+
const status = this.success ? "SUCCESS" : "FAILED";
|
|
287
|
+
const modelStr = this.model ? `, model=${this.model}` : "";
|
|
288
|
+
return `ClaudeResult(${status}${modelStr})`;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// --- Main run function ---
|
|
292
|
+
/** Run claude with the given prompt. */
|
|
293
|
+
export function runClaude(options) {
|
|
294
|
+
const { prompt, cwd = null, model = "sonnet", timeout = 300, printOutput = false, skipPermissions = false, allowedTools = null, console: consoleOutput = null, appendSystemPrompt = true, workflowId = null, } = options;
|
|
295
|
+
const claudePath = getExecutable("claude");
|
|
296
|
+
const cmd = [claudePath, "--print"];
|
|
297
|
+
// Add bundled skills directory for skill discovery
|
|
298
|
+
if (existsSync(SKILLS_DIR)) {
|
|
299
|
+
cmd.push("--add-dir", SKILLS_DIR);
|
|
300
|
+
}
|
|
301
|
+
// Use stream-json format when streaming output for real-time parsing
|
|
302
|
+
if (printOutput) {
|
|
303
|
+
cmd.push("--output-format", "stream-json", "--verbose");
|
|
304
|
+
}
|
|
305
|
+
if (model && model in MODEL_MAP) {
|
|
306
|
+
cmd.push("--model", MODEL_MAP[model]);
|
|
307
|
+
}
|
|
308
|
+
if (skipPermissions) {
|
|
309
|
+
cmd.push("--dangerously-skip-permissions");
|
|
310
|
+
}
|
|
311
|
+
if (allowedTools) {
|
|
312
|
+
for (const tool of allowedTools) {
|
|
313
|
+
cmd.push("--allowedTools", tool);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Append agentic system prompt for standardized output format
|
|
317
|
+
if (appendSystemPrompt) {
|
|
318
|
+
const systemPrompt = getAgenticSystemPrompt();
|
|
319
|
+
if (systemPrompt) {
|
|
320
|
+
cmd.push("--append-system-prompt", systemPrompt);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
const cwdStr = cwd ?? undefined;
|
|
324
|
+
// Set up environment with OTEL tracing if workflow_id is provided
|
|
325
|
+
const env = workflowId
|
|
326
|
+
? { ...process.env, OTEL_RESOURCE_ATTRIBUTES: `session=${workflowId}` }
|
|
327
|
+
: undefined;
|
|
328
|
+
if (printOutput) {
|
|
329
|
+
return runClaudeStreaming(cmd, prompt, cwdStr, env, timeout, consoleOutput, model, cwd);
|
|
330
|
+
}
|
|
331
|
+
return runClaudeNonStreaming(cmd, prompt, cwdStr, env, timeout, model, cwd);
|
|
332
|
+
}
|
|
333
|
+
function runClaudeStreaming(cmd, prompt, cwdStr, env, timeout, consoleOutput, model, cwd) {
|
|
334
|
+
return new Promise((resolve) => {
|
|
335
|
+
const [executable, ...args] = cmd;
|
|
336
|
+
const proc = spawn(executable, args, {
|
|
337
|
+
cwd: cwdStr,
|
|
338
|
+
env,
|
|
339
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
340
|
+
});
|
|
341
|
+
if (proc.stdin) {
|
|
342
|
+
proc.stdin.write(prompt);
|
|
343
|
+
proc.stdin.end();
|
|
344
|
+
}
|
|
345
|
+
// Show user prompt at start in ALL mode
|
|
346
|
+
if (consoleOutput) {
|
|
347
|
+
consoleOutput.streamText(prompt, "user");
|
|
348
|
+
consoleOutput.streamComplete();
|
|
349
|
+
}
|
|
350
|
+
const collectedText = [];
|
|
351
|
+
let resultText = null;
|
|
352
|
+
const accumulatedText = new Map();
|
|
353
|
+
let currentModel = null;
|
|
354
|
+
let hasStreamedContent = false;
|
|
355
|
+
let stderrData = "";
|
|
356
|
+
if (proc.stderr) {
|
|
357
|
+
proc.stderr.on("data", (chunk) => {
|
|
358
|
+
stderrData += chunk.toString("utf-8");
|
|
359
|
+
});
|
|
360
|
+
proc.stderr.on("error", () => {
|
|
361
|
+
// Stream error during process execution; stderr data already captured
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
let lineBuffer = "";
|
|
365
|
+
if (proc.stdout) {
|
|
366
|
+
proc.stdout.on("data", (chunk) => {
|
|
367
|
+
lineBuffer += chunk.toString("utf-8");
|
|
368
|
+
const lines = lineBuffer.split("\n");
|
|
369
|
+
// Keep the last partial line in the buffer
|
|
370
|
+
lineBuffer = lines.pop() ?? "";
|
|
371
|
+
for (const line of lines) {
|
|
372
|
+
const data = parseStreamJsonLine(line);
|
|
373
|
+
if (data === null)
|
|
374
|
+
continue;
|
|
375
|
+
// Extract model from assistant messages
|
|
376
|
+
const extractedModel = extractModelFromMessage(data);
|
|
377
|
+
if (extractedModel) {
|
|
378
|
+
currentModel = extractedModel;
|
|
379
|
+
}
|
|
380
|
+
const msgType = data.type;
|
|
381
|
+
// When a new assistant message starts, complete the previous one
|
|
382
|
+
if (msgType === "assistant" && hasStreamedContent && consoleOutput) {
|
|
383
|
+
consoleOutput.streamComplete();
|
|
384
|
+
hasStreamedContent = false;
|
|
385
|
+
accumulatedText.clear();
|
|
386
|
+
}
|
|
387
|
+
// Handle user messages (tool results in stream-json)
|
|
388
|
+
const userText = extractUserText(data);
|
|
389
|
+
if (userText && consoleOutput) {
|
|
390
|
+
if (hasStreamedContent) {
|
|
391
|
+
consoleOutput.streamComplete();
|
|
392
|
+
hasStreamedContent = false;
|
|
393
|
+
}
|
|
394
|
+
consoleOutput.streamText(userText, "user");
|
|
395
|
+
consoleOutput.streamComplete();
|
|
396
|
+
}
|
|
397
|
+
// Extract text from assistant messages for streaming
|
|
398
|
+
const isStreamEvent = msgType === "stream_event";
|
|
399
|
+
for (const [idx, text] of extractTextFromMessage(data)) {
|
|
400
|
+
let delta;
|
|
401
|
+
if (isStreamEvent) {
|
|
402
|
+
delta = text;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
const prevText = accumulatedText.get(idx) ?? "";
|
|
406
|
+
delta = text.startsWith(prevText) ? text.slice(prevText.length) : text;
|
|
407
|
+
accumulatedText.set(idx, text);
|
|
408
|
+
}
|
|
409
|
+
if (delta) {
|
|
410
|
+
if (consoleOutput) {
|
|
411
|
+
consoleOutput.streamText(delta, "assistant", currentModel);
|
|
412
|
+
hasStreamedContent = true;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
process.stdout.write(delta);
|
|
416
|
+
}
|
|
417
|
+
collectedText.push(delta);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Capture final result
|
|
421
|
+
const result = extractResultText(data);
|
|
422
|
+
if (result !== null) {
|
|
423
|
+
resultText = result;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
if (proc.stdout) {
|
|
429
|
+
proc.stdout.on("error", () => {
|
|
430
|
+
// Stream error during process execution; stdout data already captured
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
// Handle timeout
|
|
434
|
+
let timeoutId = null;
|
|
435
|
+
if (timeout) {
|
|
436
|
+
timeoutId = setTimeout(() => {
|
|
437
|
+
proc.stdout?.destroy();
|
|
438
|
+
proc.stderr?.destroy();
|
|
439
|
+
proc.kill();
|
|
440
|
+
}, timeout * 1000);
|
|
441
|
+
}
|
|
442
|
+
proc.on("close", (code) => {
|
|
443
|
+
if (timeoutId)
|
|
444
|
+
clearTimeout(timeoutId);
|
|
445
|
+
// Process any remaining data in the line buffer
|
|
446
|
+
if (lineBuffer.trim()) {
|
|
447
|
+
const data = parseStreamJsonLine(lineBuffer);
|
|
448
|
+
if (data) {
|
|
449
|
+
const result = extractResultText(data);
|
|
450
|
+
if (result !== null) {
|
|
451
|
+
resultText = result;
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
if (consoleOutput && hasStreamedContent) {
|
|
456
|
+
consoleOutput.streamComplete();
|
|
457
|
+
}
|
|
458
|
+
const finalOutput = resultText ?? collectedText.join("");
|
|
459
|
+
resolve(new ClaudeResult(code ?? 1, finalOutput, stderrData, prompt, cwd, model));
|
|
460
|
+
});
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
function runClaudeNonStreaming(cmd, prompt, cwdStr, env, timeout, model, cwd) {
|
|
464
|
+
return new Promise((resolve) => {
|
|
465
|
+
const [executable, ...args] = cmd;
|
|
466
|
+
const proc = spawn(executable, args, {
|
|
467
|
+
cwd: cwdStr,
|
|
468
|
+
env,
|
|
469
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
470
|
+
});
|
|
471
|
+
if (proc.stdin) {
|
|
472
|
+
proc.stdin.write(prompt);
|
|
473
|
+
proc.stdin.end();
|
|
474
|
+
}
|
|
475
|
+
const stdoutChunks = [];
|
|
476
|
+
const stderrChunks = [];
|
|
477
|
+
if (proc.stdout) {
|
|
478
|
+
proc.stdout.on("data", (chunk) => {
|
|
479
|
+
stdoutChunks.push(chunk.toString("utf-8"));
|
|
480
|
+
});
|
|
481
|
+
proc.stdout.on("error", () => { });
|
|
482
|
+
}
|
|
483
|
+
if (proc.stderr) {
|
|
484
|
+
proc.stderr.on("data", (chunk) => {
|
|
485
|
+
stderrChunks.push(chunk.toString("utf-8"));
|
|
486
|
+
});
|
|
487
|
+
proc.stderr.on("error", () => { });
|
|
488
|
+
}
|
|
489
|
+
let timeoutId = null;
|
|
490
|
+
let timedOut = false;
|
|
491
|
+
if (timeout) {
|
|
492
|
+
timeoutId = setTimeout(() => {
|
|
493
|
+
timedOut = true;
|
|
494
|
+
proc.stdout?.destroy();
|
|
495
|
+
proc.stderr?.destroy();
|
|
496
|
+
proc.kill();
|
|
497
|
+
}, timeout * 1000);
|
|
498
|
+
}
|
|
499
|
+
proc.on("close", (code) => {
|
|
500
|
+
if (timeoutId)
|
|
501
|
+
clearTimeout(timeoutId);
|
|
502
|
+
if (timedOut) {
|
|
503
|
+
resolve(new ClaudeResult(1, "", `Command timed out after ${timeout} seconds`, prompt, cwd, model));
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
resolve(new ClaudeResult(code ?? 1, stdoutChunks.join(""), stderrChunks.join(""), prompt, cwd, model));
|
|
507
|
+
});
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
/** Check if the claude CLI is available. */
|
|
511
|
+
export function checkClaudeAvailable() {
|
|
512
|
+
try {
|
|
513
|
+
const claudePath = getExecutable("claude");
|
|
514
|
+
const result = execFileSync(claudePath, ["--version"], {
|
|
515
|
+
encoding: "utf-8",
|
|
516
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
517
|
+
timeout: 10000,
|
|
518
|
+
});
|
|
519
|
+
return result !== undefined;
|
|
520
|
+
}
|
|
521
|
+
catch (err) {
|
|
522
|
+
if (err instanceof FileNotFoundError) {
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
// execFileSync throws on non-zero exit or timeout
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Signal handling for graceful shutdown. */
|
|
2
|
+
import type { WorkflowProgress } from "./types.js";
|
|
3
|
+
export declare class SignalManager {
|
|
4
|
+
private _shutdownRequested;
|
|
5
|
+
private readonly _onShutdown;
|
|
6
|
+
private readonly _handler;
|
|
7
|
+
constructor(onShutdown?: () => void);
|
|
8
|
+
private _installHandlers;
|
|
9
|
+
dispose(): void;
|
|
10
|
+
private _handleShutdown;
|
|
11
|
+
get shutdownRequested(): boolean;
|
|
12
|
+
requestShutdown(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare function handleGracefulShutdown(progress: WorkflowProgress, logger: {
|
|
15
|
+
info: (step: string, message: string) => void;
|
|
16
|
+
}, repoRoot: string): Promise<void>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Signal handling for graceful shutdown. */
|
|
2
|
+
export class SignalManager {
|
|
3
|
+
_shutdownRequested = false;
|
|
4
|
+
_onShutdown;
|
|
5
|
+
_handler;
|
|
6
|
+
constructor(onShutdown) {
|
|
7
|
+
this._onShutdown = onShutdown ?? null;
|
|
8
|
+
this._handler = () => this._handleShutdown();
|
|
9
|
+
this._installHandlers();
|
|
10
|
+
}
|
|
11
|
+
_installHandlers() {
|
|
12
|
+
process.on("SIGINT", this._handler);
|
|
13
|
+
if (process.platform !== "win32") {
|
|
14
|
+
process.on("SIGTERM", this._handler);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
process.on("SIGBREAK", this._handler);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
dispose() {
|
|
21
|
+
process.removeListener("SIGINT", this._handler);
|
|
22
|
+
if (process.platform !== "win32") {
|
|
23
|
+
process.removeListener("SIGTERM", this._handler);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
process.removeListener("SIGBREAK", this._handler);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
_handleShutdown() {
|
|
30
|
+
this._shutdownRequested = true;
|
|
31
|
+
console.log("\nShutdown requested, cleaning up...");
|
|
32
|
+
if (this._onShutdown) {
|
|
33
|
+
this._onShutdown();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
get shutdownRequested() {
|
|
37
|
+
return this._shutdownRequested;
|
|
38
|
+
}
|
|
39
|
+
requestShutdown() {
|
|
40
|
+
this._shutdownRequested = true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function handleGracefulShutdown(progress, logger, repoRoot) {
|
|
44
|
+
// Lazy import to avoid circular dependencies
|
|
45
|
+
const { pruneOrphaned } = await import("./git/worktree.js");
|
|
46
|
+
logger.info("orchestrator", "Performing graceful shutdown");
|
|
47
|
+
progress.status = "canceled";
|
|
48
|
+
pruneOrphaned(repoRoot);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=signal-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-manager.js","sourceRoot":"","sources":["../src/signal-manager.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAI7C,MAAM,OAAO,aAAa;IACjB,kBAAkB,GAAG,KAAK,CAAC;IAClB,WAAW,CAAsB;IACjC,QAAQ,CAAa;IAEtC,YAAY,UAAuB;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzB,CAAC;IAEO,gBAAgB;QACvB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACF,CAAC;IAED,OAAO;QACN,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAEO,eAAe;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACF,CAAC;IAED,IAAI,iBAAiB;QACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAED,eAAe;QACd,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAChC,CAAC;CACD;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,QAA0B,EAC1B,MAAyD,EACzD,QAAgB;IAEhB,6CAA6C;IAC7C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE5D,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,8BAA8B,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;IAE7B,aAAa,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Base class and types for step executors. */
|
|
2
|
+
import type { ConsoleOutput } from "../console.js";
|
|
3
|
+
import type { WorkflowLogger } from "../logging/logger.js";
|
|
4
|
+
import type { TemplateRenderer } from "../renderer.js";
|
|
5
|
+
import type { StepDefinition, WorkflowProgress, WorkflowSettings } from "../types.js";
|
|
6
|
+
export interface StepContext {
|
|
7
|
+
repoRoot: string;
|
|
8
|
+
config: Record<string, unknown>;
|
|
9
|
+
renderer: TemplateRenderer;
|
|
10
|
+
workflowSettings: WorkflowSettings | null;
|
|
11
|
+
workflowId: string;
|
|
12
|
+
variables: Record<string, unknown>;
|
|
13
|
+
outputs: Record<string, unknown>;
|
|
14
|
+
cwdOverride?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildTemplateContext(context: StepContext): Record<string, unknown>;
|
|
17
|
+
export declare function resolveModel(context: StepContext, stepModel?: string | null): string;
|
|
18
|
+
export interface StepResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
outputSummary?: string;
|
|
21
|
+
fullOutput?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare abstract class StepExecutor {
|
|
25
|
+
abstract execute(step: StepDefinition, progress: WorkflowProgress, context: StepContext, logger: WorkflowLogger, console: ConsoleOutput): Promise<StepResult>;
|
|
26
|
+
}
|
|
27
|
+
/** Callable type for executing a single step within a composite executor. */
|
|
28
|
+
export type BranchStepExecutor = (step: StepDefinition, progress: WorkflowProgress, context: StepContext, logger: WorkflowLogger, console: ConsoleOutput) => Promise<StepResult>;
|