@ghostwater/soulforge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/dist/cli/cli.d.ts +2 -0
  4. package/dist/cli/cli.js +483 -0
  5. package/dist/cli/cli.js.map +1 -0
  6. package/dist/daemon/daemon-entry.d.ts +2 -0
  7. package/dist/daemon/daemon-entry.js +8 -0
  8. package/dist/daemon/daemon-entry.js.map +1 -0
  9. package/dist/daemon/daemon.d.ts +9 -0
  10. package/dist/daemon/daemon.js +88 -0
  11. package/dist/daemon/daemon.js.map +1 -0
  12. package/dist/daemon/runner.d.ts +3 -0
  13. package/dist/daemon/runner.js +310 -0
  14. package/dist/daemon/runner.js.map +1 -0
  15. package/dist/db/database.d.ts +95 -0
  16. package/dist/db/database.js +277 -0
  17. package/dist/db/database.js.map +1 -0
  18. package/dist/executors/claude-code.d.ts +9 -0
  19. package/dist/executors/claude-code.js +86 -0
  20. package/dist/executors/claude-code.js.map +1 -0
  21. package/dist/executors/codex.d.ts +9 -0
  22. package/dist/executors/codex.js +66 -0
  23. package/dist/executors/codex.js.map +1 -0
  24. package/dist/executors/openclaw.d.ts +10 -0
  25. package/dist/executors/openclaw.js +19 -0
  26. package/dist/executors/openclaw.js.map +1 -0
  27. package/dist/executors/registry.d.ts +4 -0
  28. package/dist/executors/registry.js +20 -0
  29. package/dist/executors/registry.js.map +1 -0
  30. package/dist/executors/self.d.ts +10 -0
  31. package/dist/executors/self.js +25 -0
  32. package/dist/executors/self.js.map +1 -0
  33. package/dist/executors/types.d.ts +41 -0
  34. package/dist/executors/types.js +2 -0
  35. package/dist/executors/types.js.map +1 -0
  36. package/dist/index.d.ts +6 -0
  37. package/dist/index.js +7 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/logger.d.ts +7 -0
  40. package/dist/lib/logger.js +56 -0
  41. package/dist/lib/logger.js.map +1 -0
  42. package/dist/lib/worktree.d.ts +30 -0
  43. package/dist/lib/worktree.js +131 -0
  44. package/dist/lib/worktree.js.map +1 -0
  45. package/dist/workflow/parser.d.ts +2 -0
  46. package/dist/workflow/parser.js +95 -0
  47. package/dist/workflow/parser.js.map +1 -0
  48. package/dist/workflow/template.d.ts +14 -0
  49. package/dist/workflow/template.js +71 -0
  50. package/dist/workflow/template.js.map +1 -0
  51. package/dist/workflow/types.d.ts +65 -0
  52. package/dist/workflow/types.js +2 -0
  53. package/dist/workflow/types.js.map +1 -0
  54. package/package.json +46 -0
  55. package/workflows/feature-dev/workflow.yml +169 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ghostwater Studio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,115 @@
1
+ # Soulforge 🔥
2
+
3
+ Pluggable executor workflow engine for AI coding agents.
4
+
5
+ Define multi-step workflows in YAML and dispatch each step to different executors — Claude Code CLI, Codex CLI, human review checkpoints, or custom agents. A persistent daemon manages execution, state recovery, and notifications.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install -g @ghostwater/soulforge
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # Start the daemon
17
+ soulforge daemon start
18
+
19
+ # Run a workflow
20
+ soulforge run workflows/feature-dev "Add dark mode toggle to the settings page" \
21
+ --var repo=/path/to/project
22
+
23
+ # Check status
24
+ soulforge status
25
+
26
+ # Approve a checkpoint
27
+ soulforge approve <run-id>
28
+ ```
29
+
30
+ ## Features
31
+
32
+ - **Pluggable executors** — Claude Code, Codex CLI, human checkpoints, or build your own
33
+ - **Persistent daemon** — survives session boundaries, recovers from crashes
34
+ - **Workflow YAML** — define steps, models, retry logic, and verification
35
+ - **Callback notifications** — framework-agnostic webhooks on run events
36
+ - **Auto worktrees** — isolate each run in a git worktree
37
+ - **SQLite state** — full run history, step logs, crash recovery
38
+ - **CLI-first** — approve, reject, cancel, resume from the command line
39
+
40
+ ## Workflow Example
41
+
42
+ ```yaml
43
+ id: feature-dev
44
+ version: 2
45
+ context:
46
+ repo: "{{repo}}"
47
+
48
+ steps:
49
+ - id: plan
50
+ executor: claude-code
51
+ model: claude-sonnet-4-20250514
52
+ input: |
53
+ Read the codebase at {{repo}} and create a plan for: {{task}}
54
+ expects: implementation_plan
55
+
56
+ - id: implement
57
+ executor: claude-code
58
+ model: claude-sonnet-4-20250514
59
+ input: |
60
+ Implement the following plan in {{repo}}:
61
+ {{steps.plan.output}}
62
+
63
+ - id: verify
64
+ executor: claude-code
65
+ model: claude-sonnet-4-20250514
66
+ input: |
67
+ Verify the implementation in {{repo}} builds and works correctly.
68
+ ```
69
+
70
+ ## CLI Reference
71
+
72
+ ```
73
+ soulforge daemon start|stop|status Manage the daemon
74
+ soulforge run <workflow> "<task>" Start a workflow run
75
+ soulforge status [<query>] Check run status
76
+ soulforge runs List all runs
77
+ soulforge approve <run-id> Approve a checkpoint
78
+ soulforge reject <run-id> Reject a checkpoint
79
+ soulforge cancel <run-id> Cancel a running workflow
80
+ soulforge resume <run-id> Resume a failed run
81
+ soulforge events [<run-id>] View run events
82
+ soulforge logs [<n>] View daemon logs
83
+ ```
84
+
85
+ ### Callback Notifications
86
+
87
+ ```bash
88
+ soulforge run workflows/feature-dev "task" \
89
+ --callback-url "https://your-webhook.com/notify" \
90
+ --callback-headers '{"Authorization":"Bearer TOKEN"}' \
91
+ --callback-body '{"channel":"#dev","notify":true}'
92
+ ```
93
+
94
+ Soulforge POSTs event data merged into your body template. Fully opaque — it doesn't know or care what's on the receiving end.
95
+
96
+ ### Auto Worktrees
97
+
98
+ ```bash
99
+ soulforge run workflows/feature-dev "task" \
100
+ --worktree --var repo=/path/to/repo
101
+ ```
102
+
103
+ Creates an isolated git worktree for the run. Supports both bare+worktree and standard git layouts.
104
+
105
+ ## Data
106
+
107
+ All state lives in `~/.soulforge/`:
108
+ - `soulforge.db` — SQLite database (runs, steps, events)
109
+ - `daemon.pid` — daemon process ID
110
+ - `daemon.log` — daemon logs
111
+ - `events/` — file-based event notifications
112
+
113
+ ## License
114
+
115
+ MIT — Ghostwater Studio
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,483 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { execSync } from "node:child_process";
6
+ import crypto from "node:crypto";
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import { createRun, getRun, listRuns, getStepsForRun, getStoriesForRun, getEvents, updateStepStatus, updateRunStatus, advancePipeline, insertEvent, getDb, } from "../db/database.js";
10
+ import { loadWorkflowSpec } from "../workflow/parser.js";
11
+ import { isDaemonRunning, startDaemonBackground, stopDaemon } from "../daemon/daemon.js";
12
+ import { readRecentLogs } from "../lib/logger.js";
13
+ import { createWorktree, validateGitRepo } from "../lib/worktree.js";
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ function getVersion() {
17
+ try {
18
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "package.json"), "utf-8"));
19
+ return pkg.version ?? "unknown";
20
+ }
21
+ catch {
22
+ return "unknown";
23
+ }
24
+ }
25
+ function printUsage() {
26
+ console.log(`soulforge v${getVersion()} — Pluggable Executor Workflow Engine
27
+
28
+ Usage:
29
+ soulforge daemon start Start the daemon (background)
30
+ soulforge daemon start -f Start the daemon (foreground)
31
+ soulforge daemon stop Stop the daemon
32
+ soulforge daemon status Check daemon status
33
+
34
+ soulforge run <workflow> "<task>" [--var key=value] [--workdir <path>] [--no-worktree] [--branch <name>] [--callback-url <url>] [--callback-headers <json>] [--callback-body <json>]
35
+ Start a workflow run
36
+ When --var repo=<path> is provided, auto-creates a worktree by default
37
+ Use --workdir to work in an existing directory (no git ops)
38
+ Use --no-worktree to work directly in the repo without creating a worktree
39
+ soulforge status [<query>] Check run status (ID prefix or task substring)
40
+ soulforge runs List all runs
41
+ soulforge approve <run-id> [--message "..."]
42
+ Approve a checkpoint
43
+ soulforge reject <run-id> --reason "..."
44
+ Reject a checkpoint
45
+ soulforge cancel <run-id> Cancel a running workflow
46
+ soulforge resume <run-id> Resume a failed run
47
+
48
+ soulforge events [--run <id>] [--follow]
49
+ Show workflow events
50
+ soulforge logs [<lines>] Show recent log entries
51
+
52
+ soulforge version Show version`);
53
+ }
54
+ async function main() {
55
+ const args = process.argv.slice(2);
56
+ const [group, action, ...rest] = args;
57
+ if (!group || group === "help" || group === "--help" || group === "-h") {
58
+ printUsage();
59
+ return;
60
+ }
61
+ if (group === "version" || group === "--version" || group === "-v") {
62
+ console.log(`soulforge v${getVersion()}`);
63
+ return;
64
+ }
65
+ // ── Daemon commands ─────────────────────────────────────────────
66
+ if (group === "daemon") {
67
+ if (action === "start") {
68
+ if (args.includes("-f") || args.includes("--foreground")) {
69
+ const { startDaemonForeground } = await import("../daemon/daemon.js");
70
+ startDaemonForeground();
71
+ return;
72
+ }
73
+ startDaemonBackground();
74
+ return;
75
+ }
76
+ if (action === "stop") {
77
+ if (stopDaemon()) {
78
+ console.log("Daemon stopped.");
79
+ }
80
+ else {
81
+ console.log("Daemon is not running.");
82
+ }
83
+ return;
84
+ }
85
+ if (action === "status") {
86
+ const status = isDaemonRunning();
87
+ if (status.running) {
88
+ console.log(`Daemon running (PID ${status.pid})`);
89
+ }
90
+ else {
91
+ console.log("Daemon is not running.");
92
+ }
93
+ return;
94
+ }
95
+ printUsage();
96
+ process.exit(1);
97
+ }
98
+ // ── Run command ─────────────────────────────────────────────────
99
+ if (group === "run") {
100
+ if (!action) {
101
+ console.error("Missing workflow path/name.");
102
+ process.exit(1);
103
+ }
104
+ const task = rest[0];
105
+ if (!task) {
106
+ console.error('Missing task. Usage: soulforge run <workflow> "task description"');
107
+ process.exit(1);
108
+ }
109
+ // Parse flags (order-independent)
110
+ const vars = {};
111
+ let workdir;
112
+ let noWorktree = false;
113
+ let branchName;
114
+ let callbackUrl;
115
+ let callbackHeaders;
116
+ let callbackBodyTemplate;
117
+ for (let i = 1; i < rest.length; i++) {
118
+ if (rest[i] === "--var" && rest[i + 1]) {
119
+ const [key, ...valParts] = rest[i + 1].split("=");
120
+ vars[key] = valParts.join("=");
121
+ i++;
122
+ }
123
+ else if (rest[i] === "--workdir" && rest[i + 1]) {
124
+ workdir = rest[i + 1];
125
+ i++;
126
+ }
127
+ else if (rest[i] === "--no-worktree") {
128
+ noWorktree = true;
129
+ }
130
+ else if (rest[i] === "--branch" && rest[i + 1]) {
131
+ branchName = rest[i + 1];
132
+ i++;
133
+ }
134
+ else if (rest[i] === "--callback-url" && rest[i + 1]) {
135
+ callbackUrl = rest[i + 1];
136
+ i++;
137
+ }
138
+ else if (rest[i] === "--callback-headers" && rest[i + 1]) {
139
+ try {
140
+ callbackHeaders = JSON.parse(rest[i + 1]);
141
+ }
142
+ catch {
143
+ console.error("Invalid JSON for --callback-headers");
144
+ process.exit(1);
145
+ }
146
+ i++;
147
+ }
148
+ else if (rest[i] === "--callback-body" && rest[i + 1]) {
149
+ try {
150
+ callbackBodyTemplate = JSON.parse(rest[i + 1]);
151
+ }
152
+ catch {
153
+ console.error("Invalid JSON for --callback-body");
154
+ process.exit(1);
155
+ }
156
+ i++;
157
+ }
158
+ }
159
+ // Validate mutual exclusivity: --workdir vs --var repo
160
+ const repoPath = vars.repo;
161
+ if (workdir && repoPath) {
162
+ console.error("--workdir and --var repo=... are mutually exclusive. Use one or the other.");
163
+ process.exit(1);
164
+ }
165
+ // Validate --workdir exists
166
+ if (workdir) {
167
+ const resolvedWorkdir = path.resolve(workdir);
168
+ if (!fs.existsSync(resolvedWorkdir)) {
169
+ console.error(`--workdir path does not exist: ${resolvedWorkdir}`);
170
+ process.exit(1);
171
+ }
172
+ if (!fs.statSync(resolvedWorkdir).isDirectory()) {
173
+ console.error(`--workdir path is not a directory: ${resolvedWorkdir}`);
174
+ process.exit(1);
175
+ }
176
+ }
177
+ // Validate callback flags after parsing (order-independent)
178
+ let callbackConfig;
179
+ if (callbackUrl) {
180
+ callbackConfig = { url: callbackUrl, headers: callbackHeaders, bodyTemplate: callbackBodyTemplate };
181
+ }
182
+ else if (callbackHeaders || callbackBodyTemplate) {
183
+ console.error("--callback-headers and --callback-body require --callback-url");
184
+ process.exit(1);
185
+ }
186
+ const spec = await loadWorkflowSpec(action);
187
+ // Determine the working directory for the run
188
+ let effectiveWorkdir;
189
+ let worktreeMetadata;
190
+ if (workdir) {
191
+ // --workdir provided: use it directly, no git operations
192
+ effectiveWorkdir = path.resolve(workdir);
193
+ }
194
+ else if (repoPath) {
195
+ const resolvedRepo = path.resolve(repoPath);
196
+ if (noWorktree) {
197
+ // --no-worktree: work directly in the repo, no worktree creation
198
+ effectiveWorkdir = resolvedRepo;
199
+ }
200
+ else {
201
+ // Auto-create worktree (default behavior when repo is provided)
202
+ const repoInfo = validateGitRepo(resolvedRepo);
203
+ if (repoInfo.type === 'not-git') {
204
+ console.error(`Cannot auto-create worktree: ${resolvedRepo} is not a git repository. Use --workdir instead.`);
205
+ process.exit(1);
206
+ }
207
+ const shortId = crypto.randomUUID().slice(0, 8);
208
+ const branch = branchName || `soulforge/${shortId}`;
209
+ console.log(`Creating worktree with branch: ${branch}`);
210
+ try {
211
+ const result = createWorktree(resolvedRepo, branch, repoInfo);
212
+ worktreeMetadata = {
213
+ originalRepo: resolvedRepo,
214
+ worktreePath: result.worktreePath,
215
+ branch: result.branch,
216
+ };
217
+ effectiveWorkdir = result.worktreePath;
218
+ // Install npm dependencies if package.json exists
219
+ const packageJsonPath = path.join(result.worktreePath, 'package.json');
220
+ if (fs.existsSync(packageJsonPath)) {
221
+ console.log("Installing npm dependencies in worktree...");
222
+ try {
223
+ execSync('npm install', { cwd: result.worktreePath, stdio: 'inherit' });
224
+ }
225
+ catch {
226
+ console.warn("Warning: npm install failed in worktree");
227
+ }
228
+ }
229
+ console.log(`Worktree created at: ${result.worktreePath}`);
230
+ }
231
+ catch (err) {
232
+ console.error(err instanceof Error ? err.message : String(err));
233
+ process.exit(1);
234
+ }
235
+ }
236
+ }
237
+ // Set workdir variable for templates
238
+ if (effectiveWorkdir) {
239
+ vars.workdir = effectiveWorkdir;
240
+ // Also keep repo pointing to the effective workdir for backwards compatibility
241
+ if (repoPath) {
242
+ vars.repo = effectiveWorkdir;
243
+ }
244
+ }
245
+ // Merge vars into context
246
+ if (spec.context) {
247
+ Object.assign(spec.context, vars);
248
+ }
249
+ else {
250
+ spec.context = vars;
251
+ }
252
+ // Ensure daemon is running
253
+ const status = isDaemonRunning();
254
+ if (!status.running) {
255
+ console.log("Starting daemon...");
256
+ startDaemonBackground();
257
+ // Give daemon a moment to start
258
+ await new Promise((r) => setTimeout(r, 1000));
259
+ }
260
+ const run = createRun(spec, action, task, callbackConfig, worktreeMetadata);
261
+ insertEvent(run.id, "run_started", `Run started: "${task}"`);
262
+ console.log(`Run: ${run.id}`);
263
+ console.log(`Workflow: ${run.workflow_id}`);
264
+ console.log(`Task: ${task}`);
265
+ if (effectiveWorkdir) {
266
+ console.log(`Workdir: ${effectiveWorkdir}`);
267
+ }
268
+ console.log(`Status: ${run.status}`);
269
+ console.log(`\nDaemon will pick up the first step shortly.`);
270
+ console.log(`Track progress: soulforge status ${run.id.slice(0, 8)}`);
271
+ return;
272
+ }
273
+ // ── Status command ──────────────────────────────────────────────
274
+ if (group === "status") {
275
+ const query = [action, ...rest].filter(Boolean).join(" ");
276
+ if (!query) {
277
+ // Show summary of active runs
278
+ const runs = listRuns(10);
279
+ const active = runs.filter((r) => r.status === "running" || r.status === "pending");
280
+ if (active.length === 0) {
281
+ console.log("No active runs.");
282
+ }
283
+ else {
284
+ console.log("Active runs:");
285
+ for (const r of active) {
286
+ const steps = getStepsForRun(r.id);
287
+ const done = steps.filter((s) => s.status === "done").length;
288
+ console.log(` [${r.status}] ${r.id.slice(0, 8)} ${r.workflow_id} ${done}/${steps.length} steps "${r.task.slice(0, 50)}"`);
289
+ }
290
+ }
291
+ return;
292
+ }
293
+ // Find by ID prefix or task substring
294
+ const db = getDb();
295
+ const run = db.prepare("SELECT * FROM runs WHERE id LIKE ? OR task LIKE ? ORDER BY created_at DESC LIMIT 1").get(`${query}%`, `%${query}%`);
296
+ if (!run) {
297
+ console.log(`No run found matching "${query}"`);
298
+ return;
299
+ }
300
+ const steps = getStepsForRun(run.id);
301
+ const stories = getStoriesForRun(run.id);
302
+ console.log(`Run: ${run.id}`);
303
+ console.log(`Workflow: ${run.workflow_id}`);
304
+ console.log(`Task: ${run.task.slice(0, 120)}`);
305
+ console.log(`Status: ${run.status}`);
306
+ console.log(`Created: ${run.created_at}`);
307
+ console.log(`Updated: ${run.updated_at}`);
308
+ console.log();
309
+ console.log("Steps:");
310
+ for (const s of steps) {
311
+ const dur = s.duration_ms ? ` (${(s.duration_ms / 1000).toFixed(1)}s)` : "";
312
+ const model = s.model ? ` [${s.model}]` : "";
313
+ console.log(` [${s.status.padEnd(17)}] ${s.step_id} (${s.executor})${model}${dur}`);
314
+ }
315
+ if (stories.length > 0) {
316
+ const done = stories.filter((s) => s.status === "done").length;
317
+ const failed = stories.filter((s) => s.status === "failed").length;
318
+ console.log();
319
+ console.log(`Stories: ${done}/${stories.length} done${failed ? `, ${failed} failed` : ""}`);
320
+ for (const s of stories) {
321
+ console.log(` ${s.story_id.padEnd(10)} [${s.status.padEnd(7)}] ${s.title}`);
322
+ }
323
+ }
324
+ return;
325
+ }
326
+ // ── Runs list ───────────────────────────────────────────────────
327
+ if (group === "runs") {
328
+ const runs = listRuns(50);
329
+ if (runs.length === 0) {
330
+ console.log("No workflow runs found.");
331
+ return;
332
+ }
333
+ console.log("Workflow runs:");
334
+ for (const r of runs) {
335
+ console.log(` [${r.status.padEnd(9)}] ${r.id.slice(0, 8)} ${r.workflow_id.padEnd(14)} "${r.task.slice(0, 50)}${r.task.length > 50 ? "..." : ""}"`);
336
+ }
337
+ return;
338
+ }
339
+ // ── Approve command ─────────────────────────────────────────────
340
+ if (group === "approve") {
341
+ if (!action) {
342
+ console.error("Missing run-id.");
343
+ process.exit(1);
344
+ }
345
+ const run = getRun(action);
346
+ if (!run) {
347
+ console.error(`Run not found: ${action}`);
348
+ process.exit(1);
349
+ }
350
+ // Find step waiting for approval
351
+ const db = getDb();
352
+ const step = db.prepare("SELECT * FROM steps WHERE run_id = ? AND status = 'waiting_approval' LIMIT 1").get(run.id);
353
+ if (!step) {
354
+ console.error("No step waiting for approval in this run.");
355
+ process.exit(1);
356
+ }
357
+ // Get optional message
358
+ const msgIdx = args.indexOf("--message");
359
+ const message = msgIdx !== -1 ? args[msgIdx + 1] : "Approved";
360
+ // Approve — mark step done and advance
361
+ updateStepStatus(step.id, "done", { output: `APPROVED: ${message}` });
362
+ insertEvent(run.id, "step_complete", `Checkpoint "${step.step_id}" approved: ${message}`, step.step_id);
363
+ const { runCompleted } = advancePipeline(run.id);
364
+ if (runCompleted) {
365
+ insertEvent(run.id, "run_complete", `Run completed: "${run.task}"`);
366
+ console.log("Run completed!");
367
+ }
368
+ else {
369
+ console.log(`Checkpoint "${step.step_id}" approved. Pipeline continuing.`);
370
+ }
371
+ return;
372
+ }
373
+ // ── Reject command ──────────────────────────────────────────────
374
+ if (group === "reject") {
375
+ if (!action) {
376
+ console.error("Missing run-id.");
377
+ process.exit(1);
378
+ }
379
+ const run = getRun(action);
380
+ if (!run) {
381
+ console.error(`Run not found: ${action}`);
382
+ process.exit(1);
383
+ }
384
+ const db = getDb();
385
+ const step = db.prepare("SELECT * FROM steps WHERE run_id = ? AND status = 'waiting_approval' LIMIT 1").get(run.id);
386
+ if (!step) {
387
+ console.error("No step waiting for approval in this run.");
388
+ process.exit(1);
389
+ }
390
+ const reasonIdx = args.indexOf("--reason");
391
+ const reason = reasonIdx !== -1 ? args[reasonIdx + 1] : "Rejected";
392
+ // Reject — set step back to pending (retry)
393
+ updateStepStatus(step.id, "pending", { error: `REJECTED: ${reason}` });
394
+ insertEvent(run.id, "step_retry", `Checkpoint "${step.step_id}" rejected: ${reason}`, step.step_id);
395
+ console.log(`Checkpoint "${step.step_id}" rejected. Step will retry.`);
396
+ return;
397
+ }
398
+ // ── Cancel command ──────────────────────────────────────────────
399
+ if (group === "cancel") {
400
+ if (!action) {
401
+ console.error("Missing run-id.");
402
+ process.exit(1);
403
+ }
404
+ const run = getRun(action);
405
+ if (!run) {
406
+ console.error(`Run not found: ${action}`);
407
+ process.exit(1);
408
+ }
409
+ updateRunStatus(run.id, "cancelled");
410
+ insertEvent(run.id, "run_cancelled", "Run cancelled by user");
411
+ console.log(`Run ${run.id.slice(0, 8)} cancelled.`);
412
+ return;
413
+ }
414
+ // ── Resume command ──────────────────────────────────────────────
415
+ if (group === "resume") {
416
+ if (!action) {
417
+ console.error("Missing run-id.");
418
+ process.exit(1);
419
+ }
420
+ const run = getRun(action);
421
+ if (!run) {
422
+ console.error(`Run not found: ${action}`);
423
+ process.exit(1);
424
+ }
425
+ if (run.status !== "failed") {
426
+ console.error(`Run is "${run.status}", not "failed". Nothing to resume.`);
427
+ process.exit(1);
428
+ }
429
+ // Find the failed step
430
+ const db = getDb();
431
+ const failedStep = db.prepare("SELECT * FROM steps WHERE run_id = ? AND status = 'failed' ORDER BY step_index ASC LIMIT 1").get(run.id);
432
+ if (!failedStep) {
433
+ console.error("No failed step found.");
434
+ process.exit(1);
435
+ }
436
+ // Reset step to pending
437
+ updateStepStatus(failedStep.id, "pending", { error: null, current_story_id: null });
438
+ updateRunStatus(run.id, "running");
439
+ // If loop step, reset failed stories
440
+ if (failedStep.type === "loop") {
441
+ db.prepare("UPDATE stories SET status = 'pending', updated_at = ? WHERE run_id = ? AND status = 'failed'").run(new Date().toISOString(), run.id);
442
+ }
443
+ insertEvent(run.id, "run_resumed", `Run resumed from step "${failedStep.step_id}"`);
444
+ console.log(`Resumed run ${run.id.slice(0, 8)} from step "${failedStep.step_id}".`);
445
+ return;
446
+ }
447
+ // ── Events command ──────────────────────────────────────────────
448
+ if (group === "events") {
449
+ const runIdx = args.indexOf("--run");
450
+ const runId = runIdx !== -1 ? args[runIdx + 1] : undefined;
451
+ const events = getEvents(runId, 50);
452
+ if (events.length === 0) {
453
+ console.log("No events found.");
454
+ return;
455
+ }
456
+ for (const e of events.reverse()) {
457
+ const stepStr = e.step_id ? ` [${e.step_id}]` : "";
458
+ console.log(`${e.created_at} ${e.type.padEnd(15)}${stepStr} ${e.summary}`);
459
+ }
460
+ return;
461
+ }
462
+ // ── Logs command ────────────────────────────────────────────────
463
+ if (group === "logs") {
464
+ const lines = parseInt(action, 10) || 50;
465
+ const logs = readRecentLogs(lines);
466
+ if (logs.length === 0) {
467
+ console.log("No logs yet.");
468
+ }
469
+ else {
470
+ for (const line of logs)
471
+ console.log(line);
472
+ }
473
+ return;
474
+ }
475
+ console.error(`Unknown command: ${group}`);
476
+ printUsage();
477
+ process.exit(1);
478
+ }
479
+ main().catch((err) => {
480
+ console.error(err instanceof Error ? err.message : String(err));
481
+ process.exit(1);
482
+ });
483
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Daemon entry point for background execution.
4
+ * Spawned by `soulforge daemon start` as a detached child process.
5
+ */
6
+ import { startDaemonForeground } from "./daemon.js";
7
+ startDaemonForeground();
8
+ //# sourceMappingURL=daemon-entry.js.map