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.
Files changed (240) hide show
  1. package/README.md +165 -0
  2. package/agents/executor.md +26 -0
  3. package/agents/planner.md +41 -0
  4. package/agents/researcher.md +28 -0
  5. package/agents/verifier.md +25 -0
  6. package/dist/agents/backends/claude-code.d.ts +2 -0
  7. package/dist/agents/backends/claude-code.js +215 -0
  8. package/dist/agents/backends/claude-code.js.map +1 -0
  9. package/dist/agents/backends/mock.d.ts +9 -0
  10. package/dist/agents/backends/mock.js +31 -0
  11. package/dist/agents/backends/mock.js.map +1 -0
  12. package/dist/agents/context-builder.d.ts +10 -0
  13. package/dist/agents/context-builder.js +61 -0
  14. package/dist/agents/context-builder.js.map +1 -0
  15. package/dist/agents/prompt-compiler.d.ts +27 -0
  16. package/dist/agents/prompt-compiler.js +549 -0
  17. package/dist/agents/prompt-compiler.js.map +1 -0
  18. package/dist/agents/runtime.d.ts +40 -0
  19. package/dist/agents/runtime.js +2 -0
  20. package/dist/agents/runtime.js.map +1 -0
  21. package/dist/cli/arg-parser.d.ts +6 -0
  22. package/dist/cli/arg-parser.js +59 -0
  23. package/dist/cli/arg-parser.js.map +1 -0
  24. package/dist/cli/commands/config.d.ts +9 -0
  25. package/dist/cli/commands/config.js +120 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/dashboard.d.ts +1 -0
  28. package/dist/cli/commands/dashboard.js +54 -0
  29. package/dist/cli/commands/dashboard.js.map +1 -0
  30. package/dist/cli/commands/find-root.d.ts +14 -0
  31. package/dist/cli/commands/find-root.js +55 -0
  32. package/dist/cli/commands/find-root.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +1 -0
  34. package/dist/cli/commands/init.js +65 -0
  35. package/dist/cli/commands/init.js.map +1 -0
  36. package/dist/cli/commands/next.d.ts +1 -0
  37. package/dist/cli/commands/next.js +61 -0
  38. package/dist/cli/commands/next.js.map +1 -0
  39. package/dist/cli/commands/plan.d.ts +2 -0
  40. package/dist/cli/commands/plan.js +53 -0
  41. package/dist/cli/commands/plan.js.map +1 -0
  42. package/dist/cli/commands/replan.d.ts +1 -0
  43. package/dist/cli/commands/replan.js +54 -0
  44. package/dist/cli/commands/replan.js.map +1 -0
  45. package/dist/cli/commands/run-pipeline.d.ts +2 -0
  46. package/dist/cli/commands/run-pipeline.js +74 -0
  47. package/dist/cli/commands/run-pipeline.js.map +1 -0
  48. package/dist/cli/commands/run.d.ts +2 -0
  49. package/dist/cli/commands/run.js +106 -0
  50. package/dist/cli/commands/run.js.map +1 -0
  51. package/dist/cli/commands/status.d.ts +1 -0
  52. package/dist/cli/commands/status.js +51 -0
  53. package/dist/cli/commands/status.js.map +1 -0
  54. package/dist/cli/commands/verify.d.ts +1 -0
  55. package/dist/cli/commands/verify.js +63 -0
  56. package/dist/cli/commands/verify.js.map +1 -0
  57. package/dist/cli/commands/wizard.d.ts +8 -0
  58. package/dist/cli/commands/wizard.js +39 -0
  59. package/dist/cli/commands/wizard.js.map +1 -0
  60. package/dist/cli/index.d.ts +2 -0
  61. package/dist/cli/index.js +82 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/wizard/index.d.ts +11 -0
  64. package/dist/cli/wizard/index.js +40 -0
  65. package/dist/cli/wizard/index.js.map +1 -0
  66. package/dist/cli/wizard/interview.d.ts +26 -0
  67. package/dist/cli/wizard/interview.js +284 -0
  68. package/dist/cli/wizard/interview.js.map +1 -0
  69. package/dist/cli/wizard/prompt.d.ts +18 -0
  70. package/dist/cli/wizard/prompt.js +72 -0
  71. package/dist/cli/wizard/prompt.js.map +1 -0
  72. package/dist/cli/wizard/template-generator.d.ts +8 -0
  73. package/dist/cli/wizard/template-generator.js +133 -0
  74. package/dist/cli/wizard/template-generator.js.map +1 -0
  75. package/dist/mcp/index.d.ts +2 -0
  76. package/dist/mcp/index.js +68 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp/protocol.d.ts +33 -0
  79. package/dist/mcp/protocol.js +82 -0
  80. package/dist/mcp/protocol.js.map +1 -0
  81. package/dist/mcp/resources.d.ts +20 -0
  82. package/dist/mcp/resources.js +101 -0
  83. package/dist/mcp/resources.js.map +1 -0
  84. package/dist/mcp/run-manager.d.ts +36 -0
  85. package/dist/mcp/run-manager.js +179 -0
  86. package/dist/mcp/run-manager.js.map +1 -0
  87. package/dist/mcp/server.d.ts +13 -0
  88. package/dist/mcp/server.js +99 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/mcp/tools.d.ts +32 -0
  91. package/dist/mcp/tools.js +259 -0
  92. package/dist/mcp/tools.js.map +1 -0
  93. package/dist/orchestrator/alert-types.d.ts +16 -0
  94. package/dist/orchestrator/alert-types.js +2 -0
  95. package/dist/orchestrator/alert-types.js.map +1 -0
  96. package/dist/orchestrator/alerts.d.ts +20 -0
  97. package/dist/orchestrator/alerts.js +76 -0
  98. package/dist/orchestrator/alerts.js.map +1 -0
  99. package/dist/orchestrator/checkpoints.d.ts +8 -0
  100. package/dist/orchestrator/checkpoints.js +24 -0
  101. package/dist/orchestrator/checkpoints.js.map +1 -0
  102. package/dist/orchestrator/engine.d.ts +71 -0
  103. package/dist/orchestrator/engine.js +420 -0
  104. package/dist/orchestrator/engine.js.map +1 -0
  105. package/dist/orchestrator/phase-gates.d.ts +6 -0
  106. package/dist/orchestrator/phase-gates.js +127 -0
  107. package/dist/orchestrator/phase-gates.js.map +1 -0
  108. package/dist/orchestrator/plan-approval.d.ts +10 -0
  109. package/dist/orchestrator/plan-approval.js +51 -0
  110. package/dist/orchestrator/plan-approval.js.map +1 -0
  111. package/dist/orchestrator/safety.d.ts +22 -0
  112. package/dist/orchestrator/safety.js +126 -0
  113. package/dist/orchestrator/safety.js.map +1 -0
  114. package/dist/orchestrator/task-graph.d.ts +17 -0
  115. package/dist/orchestrator/task-graph.js +156 -0
  116. package/dist/orchestrator/task-graph.js.map +1 -0
  117. package/dist/orchestrator/wave-executor.d.ts +37 -0
  118. package/dist/orchestrator/wave-executor.js +237 -0
  119. package/dist/orchestrator/wave-executor.js.map +1 -0
  120. package/dist/session/in-process.d.ts +2 -0
  121. package/dist/session/in-process.js +149 -0
  122. package/dist/session/in-process.js.map +1 -0
  123. package/dist/session/log-capture.d.ts +7 -0
  124. package/dist/session/log-capture.js +56 -0
  125. package/dist/session/log-capture.js.map +1 -0
  126. package/dist/session/manager.d.ts +20 -0
  127. package/dist/session/manager.js +2 -0
  128. package/dist/session/manager.js.map +1 -0
  129. package/dist/state/file-store.d.ts +3 -0
  130. package/dist/state/file-store.js +124 -0
  131. package/dist/state/file-store.js.map +1 -0
  132. package/dist/state/lock.d.ts +6 -0
  133. package/dist/state/lock.js +71 -0
  134. package/dist/state/lock.js.map +1 -0
  135. package/dist/state/plan-parser.d.ts +6 -0
  136. package/dist/state/plan-parser.js +54 -0
  137. package/dist/state/plan-parser.js.map +1 -0
  138. package/dist/state/store.d.ts +27 -0
  139. package/dist/state/store.js +2 -0
  140. package/dist/state/store.js.map +1 -0
  141. package/dist/steps/events.d.ts +49 -0
  142. package/dist/steps/events.js +2 -0
  143. package/dist/steps/events.js.map +1 -0
  144. package/dist/steps/pipeline.d.ts +14 -0
  145. package/dist/steps/pipeline.js +284 -0
  146. package/dist/steps/pipeline.js.map +1 -0
  147. package/dist/steps/plan-parser.d.ts +35 -0
  148. package/dist/steps/plan-parser.js +147 -0
  149. package/dist/steps/plan-parser.js.map +1 -0
  150. package/dist/steps/runner.d.ts +13 -0
  151. package/dist/steps/runner.js +155 -0
  152. package/dist/steps/runner.js.map +1 -0
  153. package/dist/steps/store.d.ts +26 -0
  154. package/dist/steps/store.js +164 -0
  155. package/dist/steps/store.js.map +1 -0
  156. package/dist/steps/types.d.ts +36 -0
  157. package/dist/steps/types.js +2 -0
  158. package/dist/steps/types.js.map +1 -0
  159. package/dist/tui/app.d.ts +15 -0
  160. package/dist/tui/app.js +297 -0
  161. package/dist/tui/app.js.map +1 -0
  162. package/dist/tui/banner.d.ts +1 -0
  163. package/dist/tui/banner.js +11 -0
  164. package/dist/tui/banner.js.map +1 -0
  165. package/dist/tui/colors.d.ts +22 -0
  166. package/dist/tui/colors.js +30 -0
  167. package/dist/tui/colors.js.map +1 -0
  168. package/dist/tui/components/agent-panel.d.ts +8 -0
  169. package/dist/tui/components/agent-panel.js +80 -0
  170. package/dist/tui/components/agent-panel.js.map +1 -0
  171. package/dist/tui/components/header.d.ts +15 -0
  172. package/dist/tui/components/header.js +69 -0
  173. package/dist/tui/components/header.js.map +1 -0
  174. package/dist/tui/components/status-bar.d.ts +2 -0
  175. package/dist/tui/components/status-bar.js +8 -0
  176. package/dist/tui/components/status-bar.js.map +1 -0
  177. package/dist/tui/components/task-board.d.ts +3 -0
  178. package/dist/tui/components/task-board.js +96 -0
  179. package/dist/tui/components/task-board.js.map +1 -0
  180. package/dist/tui/display.d.ts +23 -0
  181. package/dist/tui/display.js +125 -0
  182. package/dist/tui/display.js.map +1 -0
  183. package/dist/tui/input.d.ts +2 -0
  184. package/dist/tui/input.js +44 -0
  185. package/dist/tui/input.js.map +1 -0
  186. package/dist/tui/layout-master.d.ts +7 -0
  187. package/dist/tui/layout-master.js +31 -0
  188. package/dist/tui/layout-master.js.map +1 -0
  189. package/dist/tui/layout.d.ts +13 -0
  190. package/dist/tui/layout.js +37 -0
  191. package/dist/tui/layout.js.map +1 -0
  192. package/dist/tui/pane-formatter.d.ts +27 -0
  193. package/dist/tui/pane-formatter.js +153 -0
  194. package/dist/tui/pane-formatter.js.map +1 -0
  195. package/dist/tui/renderer.d.ts +8 -0
  196. package/dist/tui/renderer.js +30 -0
  197. package/dist/tui/renderer.js.map +1 -0
  198. package/dist/tui/screen.d.ts +12 -0
  199. package/dist/tui/screen.js +32 -0
  200. package/dist/tui/screen.js.map +1 -0
  201. package/dist/tui/structured-display.d.ts +5 -0
  202. package/dist/tui/structured-display.js +74 -0
  203. package/dist/tui/structured-display.js.map +1 -0
  204. package/dist/tui/tmux-display.d.ts +6 -0
  205. package/dist/tui/tmux-display.js +187 -0
  206. package/dist/tui/tmux-display.js.map +1 -0
  207. package/dist/tui/tmux.d.ts +26 -0
  208. package/dist/tui/tmux.js +265 -0
  209. package/dist/tui/tmux.js.map +1 -0
  210. package/dist/types.d.ts +15 -0
  211. package/dist/types.js +2 -0
  212. package/dist/types.js.map +1 -0
  213. package/dist/utils/git.d.ts +6 -0
  214. package/dist/utils/git.js +35 -0
  215. package/dist/utils/git.js.map +1 -0
  216. package/dist/utils/hello.d.ts +1 -0
  217. package/dist/utils/hello.js +4 -0
  218. package/dist/utils/hello.js.map +1 -0
  219. package/dist/utils/id.d.ts +1 -0
  220. package/dist/utils/id.js +5 -0
  221. package/dist/utils/id.js.map +1 -0
  222. package/dist/utils/jsonl.d.ts +2 -0
  223. package/dist/utils/jsonl.js +18 -0
  224. package/dist/utils/jsonl.js.map +1 -0
  225. package/dist/utils/logger.d.ts +20 -0
  226. package/dist/utils/logger.js +40 -0
  227. package/dist/utils/logger.js.map +1 -0
  228. package/dist/utils/pricing.d.ts +3 -0
  229. package/dist/utils/pricing.js +26 -0
  230. package/dist/utils/pricing.js.map +1 -0
  231. package/dist/utils/xml.d.ts +13 -0
  232. package/dist/utils/xml.js +67 -0
  233. package/dist/utils/xml.js.map +1 -0
  234. package/dist/utils/yaml.d.ts +5 -0
  235. package/dist/utils/yaml.js +126 -0
  236. package/dist/utils/yaml.js.map +1 -0
  237. package/package.json +45 -0
  238. package/templates/CONSTITUTION.md +10 -0
  239. package/templates/STATE.md +3 -0
  240. 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":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedArgs } from '../arg-parser.js';
2
+ export declare function runCommand(flags: ParsedArgs['flags']): Promise<void>;
@@ -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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -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>;