@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.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/cli/cli.d.ts +2 -0
- package/dist/cli/cli.js +483 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/daemon/daemon-entry.d.ts +2 -0
- package/dist/daemon/daemon-entry.js +8 -0
- package/dist/daemon/daemon-entry.js.map +1 -0
- package/dist/daemon/daemon.d.ts +9 -0
- package/dist/daemon/daemon.js +88 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/runner.d.ts +3 -0
- package/dist/daemon/runner.js +310 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/db/database.d.ts +95 -0
- package/dist/db/database.js +277 -0
- package/dist/db/database.js.map +1 -0
- package/dist/executors/claude-code.d.ts +9 -0
- package/dist/executors/claude-code.js +86 -0
- package/dist/executors/claude-code.js.map +1 -0
- package/dist/executors/codex.d.ts +9 -0
- package/dist/executors/codex.js +66 -0
- package/dist/executors/codex.js.map +1 -0
- package/dist/executors/openclaw.d.ts +10 -0
- package/dist/executors/openclaw.js +19 -0
- package/dist/executors/openclaw.js.map +1 -0
- package/dist/executors/registry.d.ts +4 -0
- package/dist/executors/registry.js +20 -0
- package/dist/executors/registry.js.map +1 -0
- package/dist/executors/self.d.ts +10 -0
- package/dist/executors/self.js +25 -0
- package/dist/executors/self.js.map +1 -0
- package/dist/executors/types.d.ts +41 -0
- package/dist/executors/types.js +2 -0
- package/dist/executors/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.js +56 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/worktree.d.ts +30 -0
- package/dist/lib/worktree.js +131 -0
- package/dist/lib/worktree.js.map +1 -0
- package/dist/workflow/parser.d.ts +2 -0
- package/dist/workflow/parser.js +95 -0
- package/dist/workflow/parser.js.map +1 -0
- package/dist/workflow/template.d.ts +14 -0
- package/dist/workflow/template.js +71 -0
- package/dist/workflow/template.js.map +1 -0
- package/dist/workflow/types.d.ts +65 -0
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -0
- package/package.json +46 -0
- 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
|
package/dist/cli/cli.js
ADDED
|
@@ -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,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
|