slavedriver 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/README.md +165 -0
- package/agents/executor.md +26 -0
- package/agents/planner.md +41 -0
- package/agents/researcher.md +28 -0
- package/agents/verifier.md +25 -0
- package/dist/agents/backends/claude-code.d.ts +2 -0
- package/dist/agents/backends/claude-code.js +215 -0
- package/dist/agents/backends/claude-code.js.map +1 -0
- package/dist/agents/backends/mock.d.ts +9 -0
- package/dist/agents/backends/mock.js +31 -0
- package/dist/agents/backends/mock.js.map +1 -0
- package/dist/agents/context-builder.d.ts +10 -0
- package/dist/agents/context-builder.js +61 -0
- package/dist/agents/context-builder.js.map +1 -0
- package/dist/agents/prompt-compiler.d.ts +27 -0
- package/dist/agents/prompt-compiler.js +549 -0
- package/dist/agents/prompt-compiler.js.map +1 -0
- package/dist/agents/runtime.d.ts +40 -0
- package/dist/agents/runtime.js +2 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +6 -0
- package/dist/cli/arg-parser.js +59 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.js +120 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +1 -0
- package/dist/cli/commands/dashboard.js +54 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/find-root.d.ts +14 -0
- package/dist/cli/commands/find-root.js +55 -0
- package/dist/cli/commands/find-root.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +65 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/next.d.ts +1 -0
- package/dist/cli/commands/next.js +61 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.js +53 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/replan.d.ts +1 -0
- package/dist/cli/commands/replan.js +54 -0
- package/dist/cli/commands/replan.js.map +1 -0
- package/dist/cli/commands/run-pipeline.d.ts +2 -0
- package/dist/cli/commands/run-pipeline.js +74 -0
- package/dist/cli/commands/run-pipeline.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +106 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +51 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +1 -0
- package/dist/cli/commands/verify.js +63 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/wizard.d.ts +8 -0
- package/dist/cli/commands/wizard.js +39 -0
- package/dist/cli/commands/wizard.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizard/index.d.ts +11 -0
- package/dist/cli/wizard/index.js +40 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/interview.d.ts +26 -0
- package/dist/cli/wizard/interview.js +284 -0
- package/dist/cli/wizard/interview.js.map +1 -0
- package/dist/cli/wizard/prompt.d.ts +18 -0
- package/dist/cli/wizard/prompt.js +72 -0
- package/dist/cli/wizard/prompt.js.map +1 -0
- package/dist/cli/wizard/template-generator.d.ts +8 -0
- package/dist/cli/wizard/template-generator.js +133 -0
- package/dist/cli/wizard/template-generator.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +68 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +33 -0
- package/dist/mcp/protocol.js +82 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.d.ts +20 -0
- package/dist/mcp/resources.js +101 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +36 -0
- package/dist/mcp/run-manager.js +179 -0
- package/dist/mcp/run-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +32 -0
- package/dist/mcp/tools.js +259 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestrator/alert-types.d.ts +16 -0
- package/dist/orchestrator/alert-types.js +2 -0
- package/dist/orchestrator/alert-types.js.map +1 -0
- package/dist/orchestrator/alerts.d.ts +20 -0
- package/dist/orchestrator/alerts.js +76 -0
- package/dist/orchestrator/alerts.js.map +1 -0
- package/dist/orchestrator/checkpoints.d.ts +8 -0
- package/dist/orchestrator/checkpoints.js +24 -0
- package/dist/orchestrator/checkpoints.js.map +1 -0
- package/dist/orchestrator/engine.d.ts +71 -0
- package/dist/orchestrator/engine.js +420 -0
- package/dist/orchestrator/engine.js.map +1 -0
- package/dist/orchestrator/phase-gates.d.ts +6 -0
- package/dist/orchestrator/phase-gates.js +127 -0
- package/dist/orchestrator/phase-gates.js.map +1 -0
- package/dist/orchestrator/plan-approval.d.ts +10 -0
- package/dist/orchestrator/plan-approval.js +51 -0
- package/dist/orchestrator/plan-approval.js.map +1 -0
- package/dist/orchestrator/safety.d.ts +22 -0
- package/dist/orchestrator/safety.js +126 -0
- package/dist/orchestrator/safety.js.map +1 -0
- package/dist/orchestrator/task-graph.d.ts +17 -0
- package/dist/orchestrator/task-graph.js +156 -0
- package/dist/orchestrator/task-graph.js.map +1 -0
- package/dist/orchestrator/wave-executor.d.ts +37 -0
- package/dist/orchestrator/wave-executor.js +237 -0
- package/dist/orchestrator/wave-executor.js.map +1 -0
- package/dist/session/in-process.d.ts +2 -0
- package/dist/session/in-process.js +149 -0
- package/dist/session/in-process.js.map +1 -0
- package/dist/session/log-capture.d.ts +7 -0
- package/dist/session/log-capture.js +56 -0
- package/dist/session/log-capture.js.map +1 -0
- package/dist/session/manager.d.ts +20 -0
- package/dist/session/manager.js +2 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/state/file-store.d.ts +3 -0
- package/dist/state/file-store.js +124 -0
- package/dist/state/file-store.js.map +1 -0
- package/dist/state/lock.d.ts +6 -0
- package/dist/state/lock.js +71 -0
- package/dist/state/lock.js.map +1 -0
- package/dist/state/plan-parser.d.ts +6 -0
- package/dist/state/plan-parser.js +54 -0
- package/dist/state/plan-parser.js.map +1 -0
- package/dist/state/store.d.ts +27 -0
- package/dist/state/store.js +2 -0
- package/dist/state/store.js.map +1 -0
- package/dist/steps/events.d.ts +49 -0
- package/dist/steps/events.js +2 -0
- package/dist/steps/events.js.map +1 -0
- package/dist/steps/pipeline.d.ts +14 -0
- package/dist/steps/pipeline.js +284 -0
- package/dist/steps/pipeline.js.map +1 -0
- package/dist/steps/plan-parser.d.ts +35 -0
- package/dist/steps/plan-parser.js +147 -0
- package/dist/steps/plan-parser.js.map +1 -0
- package/dist/steps/runner.d.ts +13 -0
- package/dist/steps/runner.js +155 -0
- package/dist/steps/runner.js.map +1 -0
- package/dist/steps/store.d.ts +26 -0
- package/dist/steps/store.js +164 -0
- package/dist/steps/store.js.map +1 -0
- package/dist/steps/types.d.ts +36 -0
- package/dist/steps/types.js +2 -0
- package/dist/steps/types.js.map +1 -0
- package/dist/tui/app.d.ts +15 -0
- package/dist/tui/app.js +297 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/banner.d.ts +1 -0
- package/dist/tui/banner.js +11 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/colors.d.ts +22 -0
- package/dist/tui/colors.js +30 -0
- package/dist/tui/colors.js.map +1 -0
- package/dist/tui/components/agent-panel.d.ts +8 -0
- package/dist/tui/components/agent-panel.js +80 -0
- package/dist/tui/components/agent-panel.js.map +1 -0
- package/dist/tui/components/header.d.ts +15 -0
- package/dist/tui/components/header.js +69 -0
- package/dist/tui/components/header.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +2 -0
- package/dist/tui/components/status-bar.js +8 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/components/task-board.d.ts +3 -0
- package/dist/tui/components/task-board.js +96 -0
- package/dist/tui/components/task-board.js.map +1 -0
- package/dist/tui/display.d.ts +23 -0
- package/dist/tui/display.js +125 -0
- package/dist/tui/display.js.map +1 -0
- package/dist/tui/input.d.ts +2 -0
- package/dist/tui/input.js +44 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/layout-master.d.ts +7 -0
- package/dist/tui/layout-master.js +31 -0
- package/dist/tui/layout-master.js.map +1 -0
- package/dist/tui/layout.d.ts +13 -0
- package/dist/tui/layout.js +37 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/pane-formatter.d.ts +27 -0
- package/dist/tui/pane-formatter.js +153 -0
- package/dist/tui/pane-formatter.js.map +1 -0
- package/dist/tui/renderer.d.ts +8 -0
- package/dist/tui/renderer.js +30 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +12 -0
- package/dist/tui/screen.js +32 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/structured-display.d.ts +5 -0
- package/dist/tui/structured-display.js +74 -0
- package/dist/tui/structured-display.js.map +1 -0
- package/dist/tui/tmux-display.d.ts +6 -0
- package/dist/tui/tmux-display.js +187 -0
- package/dist/tui/tmux-display.js.map +1 -0
- package/dist/tui/tmux.d.ts +26 -0
- package/dist/tui/tmux.js +265 -0
- package/dist/tui/tmux.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git.d.ts +6 -0
- package/dist/utils/git.js +35 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hello.d.ts +1 -0
- package/dist/utils/hello.js +4 -0
- package/dist/utils/hello.js.map +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +5 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/jsonl.d.ts +2 -0
- package/dist/utils/jsonl.js +18 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +3 -0
- package/dist/utils/pricing.js +26 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/xml.d.ts +13 -0
- package/dist/utils/xml.js +67 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/utils/yaml.d.ts +5 -0
- package/dist/utils/yaml.js +126 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +45 -0
- package/templates/CONSTITUTION.md +10 -0
- package/templates/STATE.md +3 -0
- package/templates/config.json +11 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { createStepStore } from '../../steps/store.js';
|
|
4
|
+
import { runPipeline } from '../../steps/pipeline.js';
|
|
5
|
+
import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
|
|
6
|
+
import { createDisplay, createPlainDisplay } from '../../tui/display.js';
|
|
7
|
+
import { findSlavedriverRoot } from './find-root.js';
|
|
8
|
+
import { initCommand } from './init.js';
|
|
9
|
+
export async function runGoalPipeline(goal, flags) {
|
|
10
|
+
// Auto-init if .slavedriver/ not found
|
|
11
|
+
let projectRoot = findSlavedriverRoot();
|
|
12
|
+
if (projectRoot === null) {
|
|
13
|
+
console.log('No .slavedriver/ found. Initializing...');
|
|
14
|
+
console.log('');
|
|
15
|
+
const initFlags = { ...flags };
|
|
16
|
+
if (!process.stdin.isTTY) {
|
|
17
|
+
initFlags['autopilot'] = true;
|
|
18
|
+
}
|
|
19
|
+
await initCommand(initFlags);
|
|
20
|
+
console.log('');
|
|
21
|
+
projectRoot = findSlavedriverRoot();
|
|
22
|
+
if (projectRoot === null) {
|
|
23
|
+
throw new Error('Failed to initialize .slavedriver/ directory');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const sdRoot = join(projectRoot, '.slavedriver');
|
|
27
|
+
const configPath = join(sdRoot, 'config.json');
|
|
28
|
+
const config = JSON.parse(await readFile(configPath, 'utf-8'));
|
|
29
|
+
const runtime = createClaudeCodeRuntime();
|
|
30
|
+
const store = createStepStore(sdRoot);
|
|
31
|
+
// Check if runtime is available
|
|
32
|
+
const available = await runtime.isAvailable();
|
|
33
|
+
if (!available) {
|
|
34
|
+
throw new Error('Claude Code CLI is not available. Install it with: npm install -g @anthropic-ai/claude-code');
|
|
35
|
+
}
|
|
36
|
+
const projectName = projectRoot.split('/').pop() ?? 'project';
|
|
37
|
+
const noTui = flags['no-tui'] === true;
|
|
38
|
+
const dryRun = flags['dry-run'] === true;
|
|
39
|
+
const jsonLogPath = typeof flags['json-log'] === 'string' ? flags['json-log'] : undefined;
|
|
40
|
+
let display;
|
|
41
|
+
try {
|
|
42
|
+
display = createDisplay({
|
|
43
|
+
version: '0.2.0',
|
|
44
|
+
projectName,
|
|
45
|
+
noTui,
|
|
46
|
+
...(jsonLogPath ? { structuredLogPath: jsonLogPath } : {}),
|
|
47
|
+
});
|
|
48
|
+
display.start();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
display = createPlainDisplay({ version: '0.2.0', projectName, noTui: true });
|
|
52
|
+
}
|
|
53
|
+
console.log(`Goal: "${goal}"`);
|
|
54
|
+
console.log(`Project: ${projectRoot}`);
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log('Starting pipeline: plan → execute → verify');
|
|
57
|
+
console.log('');
|
|
58
|
+
try {
|
|
59
|
+
for await (const event of runPipeline(goal, {
|
|
60
|
+
runtime,
|
|
61
|
+
store,
|
|
62
|
+
config,
|
|
63
|
+
sdRoot,
|
|
64
|
+
workingDirectory: projectRoot,
|
|
65
|
+
dryRun,
|
|
66
|
+
})) {
|
|
67
|
+
display.handleEvent(event);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
display.stop();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=run-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-pipeline.js","sourceRoot":"","sources":["../../../src/cli/commands/run-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAIxC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAA0B;IAC5E,uCAAuC;IACvC,IAAI,WAAW,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,SAAS,GAAqC,EAAE,GAAG,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,SAAS,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,WAAW,GAAG,mBAAmB,EAAE,CAAC;QACpC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAkB,CAAC;IAChF,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEtC,gCAAgC;IAChC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1F,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,aAAa,CAAC;YACtB,OAAO,EAAE,OAAO;YAChB,WAAW;YACX,KAAK;YACL,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3D,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE;YAC1C,OAAO;YACP,KAAK;YACL,MAAM;YACN,MAAM;YACN,gBAAgB,EAAE,WAAW;YAC7B,MAAM;SACP,CAAC,EAAE,CAAC;YACH,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createFileStore } from '../../state/file-store.js';
|
|
3
|
+
import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
|
|
4
|
+
import { createEngine } from '../../orchestrator/engine.js';
|
|
5
|
+
import { createInProcessSessionManager } from '../../session/in-process.js';
|
|
6
|
+
import { createApprovalCallback } from '../../orchestrator/plan-approval.js';
|
|
7
|
+
import { createDisplay } from '../../tui/display.js';
|
|
8
|
+
import { requireRoot } from './find-root.js';
|
|
9
|
+
import { parsePlan } from '../../state/plan-parser.js';
|
|
10
|
+
export async function runCommand(flags) {
|
|
11
|
+
const projectRoot = requireRoot();
|
|
12
|
+
const sdRoot = join(projectRoot, '.slavedriver');
|
|
13
|
+
const store = createFileStore(sdRoot);
|
|
14
|
+
const config = await store.readConfig();
|
|
15
|
+
// Read existing plan
|
|
16
|
+
const planContent = await store.readPlan();
|
|
17
|
+
if (!planContent.trim()) {
|
|
18
|
+
throw new Error('No plan found. Run `slavedriver plan <goal>` first.');
|
|
19
|
+
}
|
|
20
|
+
const isDryRun = flags['dry-run'] === true;
|
|
21
|
+
const skipDiscovery = flags['skip-discovery'] === true;
|
|
22
|
+
const skipVerification = flags['no-verify'] === true;
|
|
23
|
+
const targetWaveRaw = flags['wave'];
|
|
24
|
+
const targetWave = typeof targetWaveRaw === 'string'
|
|
25
|
+
? parseInt(targetWaveRaw, 10)
|
|
26
|
+
: undefined;
|
|
27
|
+
const runtime = createClaudeCodeRuntime();
|
|
28
|
+
const available = await runtime.isAvailable();
|
|
29
|
+
if (!available) {
|
|
30
|
+
throw new Error('Claude Code CLI is not available. Install it with: npm install -g @anthropic-ai/claude-code');
|
|
31
|
+
}
|
|
32
|
+
const sessionManager = createInProcessSessionManager(join(sdRoot, 'sessions'));
|
|
33
|
+
// Extract goal from the plan title if possible
|
|
34
|
+
const goalMatch = /^#\s+Plan:\s*(.+)$/m.exec(planContent);
|
|
35
|
+
const goal = goalMatch ? goalMatch[1].trim() : 'Execute plan';
|
|
36
|
+
const display = createDisplay({
|
|
37
|
+
version: '0.1.0',
|
|
38
|
+
projectName: projectRoot.split('/').pop() ?? 'project',
|
|
39
|
+
noTui: flags['no-tui'] === true,
|
|
40
|
+
});
|
|
41
|
+
display.start();
|
|
42
|
+
const engine = createEngine({
|
|
43
|
+
runtime,
|
|
44
|
+
store,
|
|
45
|
+
sessionManager,
|
|
46
|
+
config,
|
|
47
|
+
workingDirectory: projectRoot,
|
|
48
|
+
onEvent: (event) => display.handleEvent(event),
|
|
49
|
+
onApproval: createApprovalCallback('cli'),
|
|
50
|
+
skipDiscovery,
|
|
51
|
+
skipVerification,
|
|
52
|
+
dryRun: isDryRun,
|
|
53
|
+
targetWave,
|
|
54
|
+
});
|
|
55
|
+
console.log(`Executing plan: "${goal}"`);
|
|
56
|
+
if (targetWave !== undefined) {
|
|
57
|
+
console.log(`Targeting wave ${targetWave} only`);
|
|
58
|
+
}
|
|
59
|
+
if (skipVerification) {
|
|
60
|
+
console.log('Verification: skipped');
|
|
61
|
+
}
|
|
62
|
+
console.log('');
|
|
63
|
+
try {
|
|
64
|
+
await engine.run(goal);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
display.stop();
|
|
68
|
+
}
|
|
69
|
+
if (isDryRun) {
|
|
70
|
+
const freshPlanContent = await store.readPlan();
|
|
71
|
+
const parsed = parsePlan(freshPlanContent);
|
|
72
|
+
const { tasks } = parsed;
|
|
73
|
+
// Group tasks by wave number
|
|
74
|
+
const waveMap = new Map();
|
|
75
|
+
for (const task of tasks) {
|
|
76
|
+
const wave = task.wave;
|
|
77
|
+
if (!waveMap.has(wave)) {
|
|
78
|
+
waveMap.set(wave, []);
|
|
79
|
+
}
|
|
80
|
+
waveMap.get(wave).push(task);
|
|
81
|
+
}
|
|
82
|
+
const sortedWaves = [...waveMap.keys()].sort((a, b) => a - b);
|
|
83
|
+
console.log('\n=== Dry-Run Plan Summary ===\n');
|
|
84
|
+
for (const waveNum of sortedWaves) {
|
|
85
|
+
const waveTasks = waveMap.get(waveNum);
|
|
86
|
+
console.log(`Wave ${waveNum} (${waveTasks.length} task${waveTasks.length === 1 ? '' : 's'})`);
|
|
87
|
+
for (const task of waveTasks) {
|
|
88
|
+
console.log(` [${task.id}] ${task.title}`);
|
|
89
|
+
console.log(` priority: ${task.priority} agent: ${task.agent}`);
|
|
90
|
+
if (task.dependsOn.length > 0) {
|
|
91
|
+
console.log(` depends-on: ${task.dependsOn.join(', ')}`);
|
|
92
|
+
}
|
|
93
|
+
if (task.mustHaves.length > 0) {
|
|
94
|
+
for (const mh of task.mustHaves) {
|
|
95
|
+
console.log(` - ${mh}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
const totalWaves = sortedWaves.length;
|
|
102
|
+
console.log(`Total: ${tasks.length} task${tasks.length === 1 ? '' : 's'} across ${totalWaves} wave${totalWaves === 1 ? '' : 's'}`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function statusCommand(): Promise<void>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createStepStore } from '../../steps/store.js';
|
|
3
|
+
import { requireRoot } from './find-root.js';
|
|
4
|
+
import { formatTokens } from '../../tui/display.js';
|
|
5
|
+
export async function statusCommand() {
|
|
6
|
+
const projectRoot = requireRoot();
|
|
7
|
+
const sdRoot = join(projectRoot, '.slavedriver');
|
|
8
|
+
const store = createStepStore(sdRoot);
|
|
9
|
+
console.log('slavedriver status');
|
|
10
|
+
console.log('='.repeat(50));
|
|
11
|
+
console.log('');
|
|
12
|
+
console.log(`Project root: ${projectRoot}`);
|
|
13
|
+
console.log('');
|
|
14
|
+
const steps = await store.listSteps();
|
|
15
|
+
if (steps.length === 0) {
|
|
16
|
+
console.log('No steps found. Run slavedriver "<goal>" to start a pipeline.');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Summary counts
|
|
20
|
+
const completed = steps.filter((s) => s.meta.status === 'completed').length;
|
|
21
|
+
const failed = steps.filter((s) => s.meta.status === 'failed').length;
|
|
22
|
+
const running = steps.filter((s) => s.meta.status === 'running').length;
|
|
23
|
+
const pending = steps.filter((s) => s.meta.status === 'pending').length;
|
|
24
|
+
let totalInput = 0;
|
|
25
|
+
let totalOutput = 0;
|
|
26
|
+
for (const step of steps) {
|
|
27
|
+
totalInput += step.meta.inputTokens ?? 0;
|
|
28
|
+
totalOutput += step.meta.outputTokens ?? 0;
|
|
29
|
+
}
|
|
30
|
+
console.log(`Steps: ${steps.length} total, ${completed} completed, ${failed} failed, ${running} running, ${pending} pending`);
|
|
31
|
+
console.log(`Tokens: ${formatTokens(totalInput + totalOutput)} (${formatTokens(totalInput)} in, ${formatTokens(totalOutput)} out)`);
|
|
32
|
+
console.log('');
|
|
33
|
+
// Step table
|
|
34
|
+
const STATUS_ICONS = {
|
|
35
|
+
completed: '\u2713', // ✓
|
|
36
|
+
failed: '\u2715', // ✕
|
|
37
|
+
running: '\u25cf', // ●
|
|
38
|
+
pending: '\u25cb', // ○
|
|
39
|
+
skipped: '-',
|
|
40
|
+
};
|
|
41
|
+
for (const step of steps) {
|
|
42
|
+
const num = String(step.number).padStart(3, '0');
|
|
43
|
+
const icon = STATUS_ICONS[step.meta.status] ?? '?';
|
|
44
|
+
const tok = (step.meta.inputTokens ?? 0) + (step.meta.outputTokens ?? 0);
|
|
45
|
+
const tokStr = tok > 0 ? ` (${formatTokens(tok)} tok)` : '';
|
|
46
|
+
const errStr = step.meta.error ? ` — ${step.meta.error}` : '';
|
|
47
|
+
console.log(` ${icon} ${num}-${step.meta.name} [${step.meta.agent}] ${step.meta.status}${tokStr}${errStr}`);
|
|
48
|
+
}
|
|
49
|
+
console.log('');
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function verifyCommand(): Promise<void>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createFileStore } from '../../state/file-store.js';
|
|
3
|
+
import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
|
|
4
|
+
import { createEngine } from '../../orchestrator/engine.js';
|
|
5
|
+
import { createInProcessSessionManager } from '../../session/in-process.js';
|
|
6
|
+
import { requireRoot } from './find-root.js';
|
|
7
|
+
export async function verifyCommand() {
|
|
8
|
+
const projectRoot = requireRoot();
|
|
9
|
+
const sdRoot = join(projectRoot, '.slavedriver');
|
|
10
|
+
const store = createFileStore(sdRoot);
|
|
11
|
+
const config = await store.readConfig();
|
|
12
|
+
// Check plan exists
|
|
13
|
+
const planContent = await store.readPlan();
|
|
14
|
+
if (!planContent.trim()) {
|
|
15
|
+
throw new Error('No plan found. Run `slavedriver plan <goal>` first.');
|
|
16
|
+
}
|
|
17
|
+
const runtime = createClaudeCodeRuntime();
|
|
18
|
+
const available = await runtime.isAvailable();
|
|
19
|
+
if (!available) {
|
|
20
|
+
throw new Error('Claude Code CLI is not available. Install it with: npm install -g @anthropic-ai/claude-code');
|
|
21
|
+
}
|
|
22
|
+
const sessionManager = createInProcessSessionManager(join(sdRoot, 'sessions'));
|
|
23
|
+
// Extract goal from the plan title if possible
|
|
24
|
+
const goalMatch = /^#\s+Plan:\s*(.+)$/m.exec(planContent);
|
|
25
|
+
const goal = goalMatch ? goalMatch[1].trim() : 'Verify plan';
|
|
26
|
+
const onEvent = (event) => {
|
|
27
|
+
switch (event.type) {
|
|
28
|
+
case 'phase_changed':
|
|
29
|
+
console.log(`[phase] ${event.from} -> ${event.to}`);
|
|
30
|
+
break;
|
|
31
|
+
case 'complete':
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(`Verification complete. Tokens: ${event.totalInputTokens + event.totalOutputTokens}`);
|
|
34
|
+
break;
|
|
35
|
+
case 'error':
|
|
36
|
+
console.error(`[error] ${event.error} (phase: ${event.phase})`);
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
// Create engine that skips discovery and runs from plan phase onward
|
|
43
|
+
// but with dryRun=false and skipVerification=false so it reaches verify.
|
|
44
|
+
// We skip discovery since we already have the plan.
|
|
45
|
+
const engine = createEngine({
|
|
46
|
+
runtime,
|
|
47
|
+
store,
|
|
48
|
+
sessionManager,
|
|
49
|
+
config: {
|
|
50
|
+
...config,
|
|
51
|
+
requirePlanApproval: false, // Don't re-approve for verify-only
|
|
52
|
+
},
|
|
53
|
+
workingDirectory: projectRoot,
|
|
54
|
+
onEvent,
|
|
55
|
+
skipDiscovery: true,
|
|
56
|
+
skipVerification: false,
|
|
57
|
+
dryRun: false,
|
|
58
|
+
});
|
|
59
|
+
console.log('Running verification...');
|
|
60
|
+
console.log('');
|
|
61
|
+
await engine.run(goal);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;IAExC,oBAAoB;IACpB,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC3C,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/E,+CAA+C;IAC/C,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IAE7D,MAAM,OAAO,GAAG,CAAC,KAAkB,EAAQ,EAAE;QAC3C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,eAAe;gBAClB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBAClG,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;gBAChE,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IAEF,qEAAqE;IACrE,yEAAyE;IACzE,oDAAoD;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO;QACP,KAAK;QACL,cAAc;QACd,MAAM,EAAE;YACN,GAAG,MAAM;YACT,mBAAmB,EAAE,KAAK,EAAE,mCAAmC;SAChE;QACD,gBAAgB,EAAE,WAAW;QAC7B,OAAO;QACP,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,KAAK;QACvB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentRuntime } from '../../agents/runtime.js';
|
|
2
|
+
export interface WizardCommandDeps {
|
|
3
|
+
readonly runtime?: AgentRuntime;
|
|
4
|
+
readonly input?: NodeJS.ReadableStream;
|
|
5
|
+
readonly output?: NodeJS.WritableStream;
|
|
6
|
+
readonly root?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function wizardCommand(flags: Record<string, string | boolean>, deps?: WizardCommandDeps): Promise<void>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { requireRoot } from './find-root.js';
|
|
3
|
+
import { askConfirm } from '../wizard/prompt.js';
|
|
4
|
+
import { runWizard } from '../wizard/index.js';
|
|
5
|
+
import { createFileStore } from '../../state/file-store.js';
|
|
6
|
+
export async function wizardCommand(flags, deps) {
|
|
7
|
+
// Always validate that .slavedriver/ exists — requireRoot walks up from the given dir
|
|
8
|
+
const projectRoot = requireRoot(deps?.root);
|
|
9
|
+
const sdRoot = join(projectRoot, '.slavedriver');
|
|
10
|
+
const input = deps?.input ?? process.stdin;
|
|
11
|
+
const output = deps?.output ?? process.stdout;
|
|
12
|
+
const force = flags['force'] === true;
|
|
13
|
+
const autopilot = flags['autopilot'] === true;
|
|
14
|
+
if (!force) {
|
|
15
|
+
const confirmed = await askConfirm('This will overwrite CONSTITUTION.md, CONTEXT.md, and config.json. Continue?', { default: false, input, output });
|
|
16
|
+
if (!confirmed) {
|
|
17
|
+
const out = deps?.output ?? process.stdout;
|
|
18
|
+
out.write('Aborted.\n');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const result = await runWizard({
|
|
23
|
+
runtime: deps?.runtime,
|
|
24
|
+
rootDir: projectRoot,
|
|
25
|
+
autopilot,
|
|
26
|
+
input,
|
|
27
|
+
output,
|
|
28
|
+
});
|
|
29
|
+
const store = createFileStore(sdRoot);
|
|
30
|
+
await store.writeConstitution(result.constitution);
|
|
31
|
+
await store.writeContext(result.context);
|
|
32
|
+
await store.writeConfig(result.config);
|
|
33
|
+
const out = deps?.output ?? process.stdout;
|
|
34
|
+
out.write('Wizard complete. Updated:\n');
|
|
35
|
+
out.write(' .slavedriver/CONSTITUTION.md\n');
|
|
36
|
+
out.write(' .slavedriver/CONTEXT.md\n');
|
|
37
|
+
out.write(' .slavedriver/config.json\n');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../../src/cli/commands/wizard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAU5D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAuC,EACvC,IAAwB;IAExB,sFAAsF;IACtF,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAE9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAE9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,UAAU,CAChC,6EAA6E,EAC7E,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAClC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,OAAO;QACtB,OAAO,EAAE,WAAW;QACpB,SAAS;QACT,KAAK;QACL,MAAM;KACP,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC3C,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACzC,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC9C,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACzC,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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 { parseArgs } from './arg-parser.js';
|
|
6
|
+
import { initCommand } from './commands/init.js';
|
|
7
|
+
import { statusCommand } from './commands/status.js';
|
|
8
|
+
import { configCommand } from './commands/config.js';
|
|
9
|
+
import { nextCommand } from './commands/next.js';
|
|
10
|
+
import { dashboardCommand } from './commands/dashboard.js';
|
|
11
|
+
import { replanCommand } from './commands/replan.js';
|
|
12
|
+
import { runGoalPipeline } from './commands/run-pipeline.js';
|
|
13
|
+
const USAGE = `Usage: slavedriver [command] [options]
|
|
14
|
+
|
|
15
|
+
Commands:
|
|
16
|
+
<goal> Run full pipeline: research → scope → plan → execute → verify
|
|
17
|
+
init Initialize .slavedriver/ in current project
|
|
18
|
+
next Run next pending step(s)
|
|
19
|
+
status Show step progress
|
|
20
|
+
dashboard Open tmux dashboard
|
|
21
|
+
replan Create new plan from current state
|
|
22
|
+
config View or edit project configuration
|
|
23
|
+
config get <k> Print value of config key
|
|
24
|
+
config set <k> <v> Set a config key
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--dry-run Show what would execute
|
|
28
|
+
--no-tui Disable TUI, use plain console output
|
|
29
|
+
--autopilot Skip interactive wizard, use auto-detected defaults
|
|
30
|
+
--force Skip confirmation prompts
|
|
31
|
+
-v, --version Show version
|
|
32
|
+
-h, --help Show help`;
|
|
33
|
+
function getVersion() {
|
|
34
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const pkgPath = join(__dirname, '..', '..', 'package.json');
|
|
36
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
37
|
+
return pkg.version;
|
|
38
|
+
}
|
|
39
|
+
async function main() {
|
|
40
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
41
|
+
if (parsed.flags['version']) {
|
|
42
|
+
console.log(`slavedriver v${getVersion()}`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (parsed.flags['help']) {
|
|
46
|
+
console.log(USAGE);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
switch (parsed.command) {
|
|
50
|
+
case 'init':
|
|
51
|
+
await initCommand(parsed.flags);
|
|
52
|
+
return;
|
|
53
|
+
case 'next':
|
|
54
|
+
await nextCommand(parsed.flags);
|
|
55
|
+
return;
|
|
56
|
+
case 'status':
|
|
57
|
+
await statusCommand();
|
|
58
|
+
return;
|
|
59
|
+
case 'dashboard':
|
|
60
|
+
await dashboardCommand();
|
|
61
|
+
return;
|
|
62
|
+
case 'replan':
|
|
63
|
+
await replanCommand(parsed.flags);
|
|
64
|
+
return;
|
|
65
|
+
case 'config':
|
|
66
|
+
await configCommand(parsed.goal, parsed.flags);
|
|
67
|
+
return;
|
|
68
|
+
default:
|
|
69
|
+
if (parsed.goal) {
|
|
70
|
+
await runGoalPipeline(parsed.goal, parsed.flags);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
console.log(USAGE);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
main().catch((error) => {
|
|
78
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
79
|
+
console.error(`Error: ${message}`);
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AgentRuntime } from '../../agents/runtime.js';
|
|
2
|
+
import type { WizardResult } from './template-generator.js';
|
|
3
|
+
export type { WizardResult } from './template-generator.js';
|
|
4
|
+
export interface WizardOptions {
|
|
5
|
+
readonly runtime?: AgentRuntime;
|
|
6
|
+
readonly rootDir?: string;
|
|
7
|
+
readonly autopilot?: boolean;
|
|
8
|
+
readonly input?: NodeJS.ReadableStream;
|
|
9
|
+
readonly output?: NodeJS.WritableStream;
|
|
10
|
+
}
|
|
11
|
+
export declare function runWizard(opts?: WizardOptions): Promise<WizardResult>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { askChoice } from './prompt.js';
|
|
2
|
+
import { runInterview } from './interview.js';
|
|
3
|
+
import { generateFromInterview } from './template-generator.js';
|
|
4
|
+
export async function runWizard(opts) {
|
|
5
|
+
const rootDir = opts?.rootDir ?? process.cwd();
|
|
6
|
+
const isTTY = opts?.input?.isTTY ?? process.stdin.isTTY ?? false;
|
|
7
|
+
let mode;
|
|
8
|
+
if (opts?.autopilot === true || !isTTY) {
|
|
9
|
+
mode = 'autopilot';
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
const choice = await askChoice('How would you like to set up your project?', ['AI-guided design interview', 'Autopilot (quick defaults)'], { input: opts?.input, output: opts?.output });
|
|
13
|
+
mode = choice === 0 ? 'interactive' : 'autopilot';
|
|
14
|
+
}
|
|
15
|
+
if (mode === 'interactive' && opts?.runtime == null) {
|
|
16
|
+
throw new Error('AgentRuntime is required for interactive mode');
|
|
17
|
+
}
|
|
18
|
+
const runtime = opts?.runtime ?? createNoopRuntime();
|
|
19
|
+
const interviewResult = await runInterview({
|
|
20
|
+
runtime,
|
|
21
|
+
rootDir,
|
|
22
|
+
mode,
|
|
23
|
+
input: opts?.input,
|
|
24
|
+
output: opts?.output,
|
|
25
|
+
});
|
|
26
|
+
return generateFromInterview(interviewResult);
|
|
27
|
+
}
|
|
28
|
+
function createNoopRuntime() {
|
|
29
|
+
return {
|
|
30
|
+
type: 'noop',
|
|
31
|
+
async *execute() {
|
|
32
|
+
yield { type: 'complete', result: '' };
|
|
33
|
+
},
|
|
34
|
+
async isAvailable() {
|
|
35
|
+
return false;
|
|
36
|
+
},
|
|
37
|
+
async abort() { },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/wizard/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAahE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAoB;IAClD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAI,IAAI,EAAE,KAA2B,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IAExF,IAAI,IAAiC,CAAC;IAEtC,IAAI,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,GAAG,WAAW,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,4CAA4C,EAC5C,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,EAC5D,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAC7C,CAAC;QACF,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IACpD,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,iBAAiB,EAAE,CAAC;IAErD,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC;QACzC,OAAO;QACP,OAAO;QACP,IAAI;QACJ,KAAK,EAAE,IAAI,EAAE,KAAK;QAClB,MAAM,EAAE,IAAI,EAAE,MAAM;KACrB,CAAC,CAAC;IAEH,OAAO,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,CAAC,OAAO;YACZ,MAAM,EAAE,IAAI,EAAE,UAAmB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,WAAW;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,KAAK,KAAI,CAAC;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentRuntime } from '../../agents/runtime.js';
|
|
2
|
+
export interface CodebaseProfile {
|
|
3
|
+
readonly language?: string;
|
|
4
|
+
readonly framework?: string;
|
|
5
|
+
readonly buildTool?: string;
|
|
6
|
+
readonly testFramework?: string;
|
|
7
|
+
readonly packageManager?: string;
|
|
8
|
+
readonly hasTypeScript?: boolean;
|
|
9
|
+
readonly detectedFiles: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export interface InterviewResult {
|
|
12
|
+
readonly profile: CodebaseProfile;
|
|
13
|
+
readonly answers: Record<string, string>;
|
|
14
|
+
readonly constitution: string;
|
|
15
|
+
readonly context: string;
|
|
16
|
+
readonly mode: 'interactive' | 'autopilot';
|
|
17
|
+
}
|
|
18
|
+
export interface InterviewOptions {
|
|
19
|
+
readonly runtime: AgentRuntime;
|
|
20
|
+
readonly rootDir: string;
|
|
21
|
+
readonly mode: 'interactive' | 'autopilot';
|
|
22
|
+
readonly input?: NodeJS.ReadableStream;
|
|
23
|
+
readonly output?: NodeJS.WritableStream;
|
|
24
|
+
}
|
|
25
|
+
export declare function scanCodebase(rootDir: string): Promise<CodebaseProfile>;
|
|
26
|
+
export declare function runInterview(opts: InterviewOptions): Promise<InterviewResult>;
|