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,59 @@
1
+ const KNOWN_COMMANDS = new Set(['init', 'next', 'status', 'dashboard', 'replan', 'config']);
2
+ function stripOuterQuotes(value) {
3
+ if ((value.startsWith('"') && value.endsWith('"')) ||
4
+ (value.startsWith("'") && value.endsWith("'"))) {
5
+ return value.slice(1, -1);
6
+ }
7
+ return value;
8
+ }
9
+ export function parseArgs(argv) {
10
+ let command = null;
11
+ let goal = null;
12
+ const flags = {};
13
+ let i = 0;
14
+ while (i < argv.length) {
15
+ const arg = argv[i];
16
+ if (arg === '-v') {
17
+ flags['version'] = true;
18
+ i++;
19
+ continue;
20
+ }
21
+ if (arg === '-h') {
22
+ flags['help'] = true;
23
+ i++;
24
+ continue;
25
+ }
26
+ if (arg.startsWith('--')) {
27
+ const eqIndex = arg.indexOf('=');
28
+ if (eqIndex !== -1) {
29
+ const key = arg.slice(2, eqIndex);
30
+ const value = arg.slice(eqIndex + 1);
31
+ flags[key] = value;
32
+ }
33
+ else {
34
+ const key = arg.slice(2);
35
+ const next = argv[i + 1];
36
+ if (next !== undefined && !next.startsWith('-')) {
37
+ flags[key] = next;
38
+ i++;
39
+ }
40
+ else {
41
+ flags[key] = true;
42
+ }
43
+ }
44
+ i++;
45
+ continue;
46
+ }
47
+ // Positional argument
48
+ const cleaned = stripOuterQuotes(arg);
49
+ if (command === null && KNOWN_COMMANDS.has(cleaned)) {
50
+ command = cleaned;
51
+ }
52
+ else if (goal === null) {
53
+ goal = cleaned;
54
+ }
55
+ i++;
56
+ }
57
+ return { command, goal, flags };
58
+ }
59
+ //# sourceMappingURL=arg-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arg-parser.js","sourceRoot":"","sources":["../../src/cli/arg-parser.ts"],"names":[],"mappings":"AAMA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE5F,SAAS,gBAAgB,CAAC,KAAa;IACrC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAqC,EAAE,CAAC;IAEnD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACxB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBAClB,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,OAAO,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,GAAG,OAAO,CAAC;QACjB,CAAC;QAED,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ConfigCommandDeps {
2
+ readonly argv?: readonly string[];
3
+ readonly input?: NodeJS.ReadableStream;
4
+ readonly output?: NodeJS.WritableStream;
5
+ readonly root?: string;
6
+ }
7
+ /** Number of keys walked in interactive mode (exported for tests). */
8
+ export declare const INTERACTIVE_KEY_COUNT: number;
9
+ export declare function configCommand(subcommand: string | null, flags: Record<string, string | boolean>, deps?: ConfigCommandDeps): Promise<void>;
@@ -0,0 +1,120 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { join } from 'node:path';
3
+ import { readFile, writeFile } from 'node:fs/promises';
4
+ import { requireRoot } from './find-root.js';
5
+ const EDITABLE_KEYS = [
6
+ 'maxConcurrentAgents',
7
+ 'maxTotalTokens',
8
+ 'maxTokensPerStep',
9
+ 'maxWallTimeSeconds',
10
+ 'maxAgentInvocations',
11
+ ];
12
+ /** Number of keys walked in interactive mode (exported for tests). */
13
+ export const INTERACTIVE_KEY_COUNT = EDITABLE_KEYS.length;
14
+ function parseValue(value) {
15
+ if (value === 'true')
16
+ return true;
17
+ if (value === 'false')
18
+ return false;
19
+ const num = Number(value);
20
+ if (!isNaN(num) && value.trim() !== '')
21
+ return num;
22
+ return value;
23
+ }
24
+ function collectPositionals(argv) {
25
+ const result = [];
26
+ for (let i = 0; i < argv.length; i++) {
27
+ const arg = argv[i];
28
+ if (arg.startsWith('--')) {
29
+ if (!arg.includes('=') && i + 1 < argv.length && !argv[i + 1].startsWith('-')) {
30
+ i++;
31
+ }
32
+ continue;
33
+ }
34
+ if (arg === '-v' || arg === '-h') {
35
+ continue;
36
+ }
37
+ result.push(arg);
38
+ }
39
+ return result;
40
+ }
41
+ async function readConfig(configPath) {
42
+ const content = await readFile(configPath, 'utf-8');
43
+ return JSON.parse(content);
44
+ }
45
+ async function writeConfig(configPath, config) {
46
+ await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
47
+ }
48
+ export async function configCommand(subcommand, flags, deps) {
49
+ const argv = deps?.argv ?? process.argv.slice(2);
50
+ const input = deps?.input ?? process.stdin;
51
+ const output = deps?.output ?? process.stdout;
52
+ const projectRoot = deps?.root ?? requireRoot();
53
+ const sdRoot = join(projectRoot, '.slavedriver');
54
+ const configPath = join(sdRoot, 'config.json');
55
+ const positionals = collectPositionals(argv);
56
+ const key = positionals[2];
57
+ const rawValue = positionals[3];
58
+ if (subcommand === 'get') {
59
+ if (!key) {
60
+ output.write('Error: config get requires a key argument\nUsage: slavedriver config get <key>\n');
61
+ process.exitCode = 1;
62
+ return;
63
+ }
64
+ const config = await readConfig(configPath);
65
+ if (!(key in config)) {
66
+ output.write(`Error: unknown config key "${key}"\n`);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ const value = config[key];
71
+ if (typeof value === 'object') {
72
+ output.write(JSON.stringify(value) + '\n');
73
+ }
74
+ else {
75
+ output.write(String(value) + '\n');
76
+ }
77
+ return;
78
+ }
79
+ if (subcommand === 'set') {
80
+ if (!key || rawValue === undefined) {
81
+ output.write('Error: config set requires key and value arguments\nUsage: slavedriver config set <key> <value>\n');
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ const config = await readConfig(configPath);
86
+ if (!(key in config)) {
87
+ output.write(`Error: unknown config key "${key}"\n`);
88
+ process.exitCode = 1;
89
+ return;
90
+ }
91
+ const parsed = parseValue(rawValue);
92
+ const updated = { ...config, [key]: parsed };
93
+ await writeConfig(configPath, updated);
94
+ output.write(`Set ${key} = ${String(parsed)}\n`);
95
+ return;
96
+ }
97
+ // No subcommand — interactive or JSON dump
98
+ const config = await readConfig(configPath);
99
+ const isTTY = !!input.isTTY;
100
+ if (!isTTY) {
101
+ output.write(JSON.stringify(config, null, 2) + '\n');
102
+ return;
103
+ }
104
+ output.write('Configure slavedriver settings (press Enter to keep current value):\n\n');
105
+ const updated = { ...config };
106
+ const rl = createInterface({ input, output });
107
+ const ask = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
108
+ for (const editKey of EDITABLE_KEYS) {
109
+ const currentValue = config[editKey];
110
+ if (currentValue === undefined)
111
+ continue;
112
+ const answer = await ask(`${editKey} (${currentValue}): `);
113
+ const trimmed = answer.trim();
114
+ updated[editKey] = parseValue(trimmed === '' ? String(currentValue) : trimmed);
115
+ }
116
+ rl.close();
117
+ await writeConfig(configPath, updated);
118
+ output.write('\nConfiguration saved.\n');
119
+ }
120
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function dashboardCommand(): Promise<void>;
@@ -0,0 +1,54 @@
1
+ import { join } from 'node:path';
2
+ import { createStepStore } from '../../steps/store.js';
3
+ import { createDisplay } from '../../tui/display.js';
4
+ import { requireRoot } from './find-root.js';
5
+ export async function dashboardCommand() {
6
+ const projectRoot = requireRoot();
7
+ const sdRoot = join(projectRoot, '.slavedriver');
8
+ const store = createStepStore(sdRoot);
9
+ const projectName = projectRoot.split('/').pop() ?? 'project';
10
+ const display = createDisplay({
11
+ version: '0.2.0',
12
+ projectName,
13
+ noTui: false,
14
+ });
15
+ display.start();
16
+ // Show current step state
17
+ const steps = await store.listSteps();
18
+ for (const step of steps) {
19
+ if (step.meta.status === 'completed') {
20
+ display.handleEvent({
21
+ type: 'step_completed',
22
+ stepNumber: step.number,
23
+ name: step.meta.name,
24
+ inputTokens: step.meta.inputTokens ?? 0,
25
+ outputTokens: step.meta.outputTokens ?? 0,
26
+ });
27
+ }
28
+ else if (step.meta.status === 'failed') {
29
+ display.handleEvent({
30
+ type: 'step_failed',
31
+ stepNumber: step.number,
32
+ name: step.meta.name,
33
+ error: step.meta.error ?? 'unknown',
34
+ });
35
+ }
36
+ else if (step.meta.status === 'running') {
37
+ display.handleEvent({
38
+ type: 'step_started',
39
+ stepNumber: step.number,
40
+ name: step.meta.name,
41
+ agent: step.meta.agent,
42
+ });
43
+ }
44
+ }
45
+ console.log('Dashboard opened. Press Ctrl+C to close.');
46
+ // Keep alive
47
+ await new Promise((resolve) => {
48
+ process.on('SIGINT', () => {
49
+ display.stop();
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,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,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAE9D,MAAM,OAAO,GAAG,aAAa,CAAC;QAC5B,OAAO,EAAE,OAAO;QAChB,WAAW;QACX,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,0BAA0B;IAC1B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC;gBACvC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC;aAC1C,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS;aACpC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,CAAC,WAAW,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,aAAa;IACb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Walk up from `from` (default cwd) looking for `.slavedriver/` directory.
3
+ * Returns the directory containing it, or null if not found.
4
+ */
5
+ export declare function findSlavedriverRoot(from?: string): string | null;
6
+ /**
7
+ * Calls findSlavedriverRoot, throws actionable error if not found.
8
+ */
9
+ export declare function requireRoot(from?: string): string;
10
+ /**
11
+ * Find project root by walking up looking for common project markers.
12
+ * Falls back to cwd if no marker is found.
13
+ */
14
+ export declare function findProjectRoot(from?: string): string;
@@ -0,0 +1,55 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join, dirname, resolve } from 'node:path';
3
+ /**
4
+ * Walk up from `from` (default cwd) looking for `.slavedriver/` directory.
5
+ * Returns the directory containing it, or null if not found.
6
+ */
7
+ export function findSlavedriverRoot(from) {
8
+ let current = resolve(from ?? process.cwd());
9
+ // eslint-disable-next-line no-constant-condition
10
+ while (true) {
11
+ const candidate = join(current, '.slavedriver');
12
+ if (existsSync(candidate)) {
13
+ return current;
14
+ }
15
+ const parent = dirname(current);
16
+ if (parent === current) {
17
+ // Reached filesystem root
18
+ return null;
19
+ }
20
+ current = parent;
21
+ }
22
+ }
23
+ /**
24
+ * Calls findSlavedriverRoot, throws actionable error if not found.
25
+ */
26
+ export function requireRoot(from) {
27
+ const root = findSlavedriverRoot(from);
28
+ if (root === null) {
29
+ throw new Error('No .slavedriver/ directory found. Run `slavedriver init` first.');
30
+ }
31
+ return root;
32
+ }
33
+ /**
34
+ * Find project root by walking up looking for common project markers.
35
+ * Falls back to cwd if no marker is found.
36
+ */
37
+ export function findProjectRoot(from) {
38
+ const markers = ['package.json', 'Cargo.toml', 'go.mod', '.git'];
39
+ let current = resolve(from ?? process.cwd());
40
+ // eslint-disable-next-line no-constant-condition
41
+ while (true) {
42
+ for (const marker of markers) {
43
+ if (existsSync(join(current, marker))) {
44
+ return current;
45
+ }
46
+ }
47
+ const parent = dirname(current);
48
+ if (parent === current) {
49
+ // No marker found — use original cwd
50
+ return resolve(from ?? process.cwd());
51
+ }
52
+ current = parent;
53
+ }
54
+ }
55
+ //# sourceMappingURL=find-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-root.js","sourceRoot":"","sources":["../../../src/cli/commands/find-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE7C,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,0BAA0B;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACvC,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE7C,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,qCAAqC;YACrC,OAAO,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function initCommand(flags?: Record<string, string | boolean>): Promise<void>;
@@ -0,0 +1,65 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { findProjectRoot } from './find-root.js';
5
+ import { runWizard } from '../wizard/index.js';
6
+ import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
7
+ export async function initCommand(flags) {
8
+ const projectRoot = findProjectRoot();
9
+ const sdRoot = join(projectRoot, '.slavedriver');
10
+ if (existsSync(sdRoot)) {
11
+ console.warn(`Warning: .slavedriver/ already exists at ${projectRoot}`);
12
+ console.warn('Aborting init to avoid overwriting existing configuration.');
13
+ process.exitCode = 1;
14
+ return;
15
+ }
16
+ // Create directory structure
17
+ await ensureDirectories(sdRoot);
18
+ // Run wizard to generate configuration
19
+ const wizardResult = await runWizard({
20
+ runtime: createClaudeCodeRuntime(),
21
+ rootDir: projectRoot,
22
+ autopilot: flags?.['autopilot'] === true,
23
+ });
24
+ // Write wizard-generated files
25
+ await writeFile(join(sdRoot, 'config.json'), JSON.stringify(wizardResult.config, null, 2) + '\n', 'utf-8');
26
+ await writeFile(join(sdRoot, 'CONSTITUTION.md'), wizardResult.constitution, 'utf-8');
27
+ await writeFile(join(sdRoot, 'CONTEXT.md'), wizardResult.context, 'utf-8');
28
+ // Register MCP server in .mcp.json (project root)
29
+ await registerMcpServer(projectRoot);
30
+ console.log(`Initialized .slavedriver/ in ${projectRoot}`);
31
+ console.log('');
32
+ console.log('Created:');
33
+ console.log(' .slavedriver/config.json — project configuration');
34
+ console.log(' .slavedriver/CONTEXT.md — project context and decisions');
35
+ console.log(' .slavedriver/CONSTITUTION.md — non-negotiable constraints');
36
+ console.log(' .slavedriver/steps/ — step artifacts (populated by pipeline)');
37
+ console.log(' .mcp.json — MCP server registration');
38
+ console.log('');
39
+ console.log('Next: Run slavedriver "<your goal>"');
40
+ }
41
+ async function ensureDirectories(root) {
42
+ await mkdir(root, { recursive: true });
43
+ await mkdir(join(root, 'steps'), { recursive: true });
44
+ }
45
+ async function registerMcpServer(projectRoot) {
46
+ const mcpJsonPath = join(projectRoot, '.mcp.json');
47
+ const localMcp = join(projectRoot, 'dist', 'mcp', 'index.js');
48
+ const useLocal = existsSync(localMcp);
49
+ const mcpEntry = useLocal
50
+ ? { command: 'node', args: ['./dist/mcp/index.js'], cwd: projectRoot }
51
+ : { command: 'slavedriver-mcp' };
52
+ let mcpConfig = {};
53
+ try {
54
+ const raw = await readFile(mcpJsonPath, 'utf-8');
55
+ mcpConfig = JSON.parse(raw);
56
+ }
57
+ catch {
58
+ // File doesn't exist or isn't valid JSON — start fresh
59
+ }
60
+ const existing = (mcpConfig.mcpServers ?? {});
61
+ existing['slavedriver'] = mcpEntry;
62
+ mcpConfig.mcpServers = existing;
63
+ await writeFile(mcpJsonPath, JSON.stringify(mcpConfig, null, 2) + '\n', 'utf-8');
64
+ }
65
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function nextCommand(flags?: Record<string, string | boolean>): Promise<void>;
@@ -0,0 +1,61 @@
1
+ import { join } from 'node:path';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { createStepStore } from '../../steps/store.js';
4
+ import { runStep, runStepsParallel } from '../../steps/runner.js';
5
+ import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
6
+ import { createDisplay, createPlainDisplay } from '../../tui/display.js';
7
+ import { requireRoot } from './find-root.js';
8
+ export async function nextCommand(flags) {
9
+ const projectRoot = requireRoot();
10
+ const sdRoot = join(projectRoot, '.slavedriver');
11
+ const store = createStepStore(sdRoot);
12
+ const constitutionPath = join(sdRoot, 'CONSTITUTION.md');
13
+ const pending = await store.getNextPendingSteps();
14
+ if (pending.length === 0) {
15
+ const allSteps = await store.listSteps();
16
+ if (allSteps.length === 0) {
17
+ console.log('No steps found. Run slavedriver "<goal>" to create a pipeline.');
18
+ }
19
+ else {
20
+ const completed = allSteps.filter((s) => s.meta.status === 'completed').length;
21
+ const failed = allSteps.filter((s) => s.meta.status === 'failed').length;
22
+ console.log(`No pending steps. ${completed} completed, ${failed} failed out of ${allSteps.length} total.`);
23
+ }
24
+ return;
25
+ }
26
+ console.log(`Found ${pending.length} pending step(s):`);
27
+ for (const step of pending) {
28
+ console.log(` ${String(step.number).padStart(3, '0')}-${step.meta.name} [${step.meta.agent}]`);
29
+ }
30
+ console.log('');
31
+ const runtime = createClaudeCodeRuntime();
32
+ const configPath = join(sdRoot, 'config.json');
33
+ const config = JSON.parse(await readFile(configPath, 'utf-8'));
34
+ // Create display
35
+ const noTui = flags?.['no-tui'] === true;
36
+ let display;
37
+ try {
38
+ display = noTui ? createPlainDisplay({ version: '0.2.0', projectName: projectRoot.split('/').pop() ?? 'project', noTui: true }) : createDisplay({ version: '0.2.0', projectName: projectRoot.split('/').pop() ?? 'project', noTui: false });
39
+ display.start();
40
+ }
41
+ catch {
42
+ display = createPlainDisplay({ version: '0.2.0', projectName: projectRoot.split('/').pop() ?? 'project', noTui: true });
43
+ }
44
+ const stepOpts = { runtime, store, constitutionPath, workingDirectory: projectRoot };
45
+ try {
46
+ if (pending.length === 1) {
47
+ for await (const event of runStep(pending[0], stepOpts)) {
48
+ display.handleEvent(event);
49
+ }
50
+ }
51
+ else {
52
+ for await (const event of runStepsParallel(pending, config.maxConcurrentAgents, stepOpts)) {
53
+ display.handleEvent(event);
54
+ }
55
+ }
56
+ }
57
+ finally {
58
+ display.stop();
59
+ }
60
+ }
61
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedArgs } from '../arg-parser.js';
2
+ export declare function planCommand(goal: string, flags: ParsedArgs['flags']): Promise<void>;
@@ -0,0 +1,53 @@
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 { requireRoot } from './find-root.js';
8
+ export async function planCommand(goal, flags) {
9
+ const projectRoot = requireRoot();
10
+ const sdRoot = join(projectRoot, '.slavedriver');
11
+ const store = createFileStore(sdRoot);
12
+ const config = await store.readConfig();
13
+ const runtime = createClaudeCodeRuntime();
14
+ // Check if runtime is available
15
+ const available = await runtime.isAvailable();
16
+ if (!available) {
17
+ throw new Error('Claude Code CLI is not available. Install it with: npm install -g @anthropic-ai/claude-code');
18
+ }
19
+ const sessionManager = createInProcessSessionManager(join(sdRoot, 'sessions'));
20
+ const onEvent = (event) => {
21
+ switch (event.type) {
22
+ case 'phase_changed':
23
+ console.log(`[phase] ${event.from} -> ${event.to}`);
24
+ break;
25
+ case 'complete':
26
+ console.log(`[done] Plan created with ${event.taskCount} tasks`);
27
+ break;
28
+ case 'error':
29
+ console.error(`[error] ${event.error} (phase: ${event.phase})`);
30
+ break;
31
+ default:
32
+ break;
33
+ }
34
+ };
35
+ const engine = createEngine({
36
+ runtime,
37
+ store,
38
+ sessionManager,
39
+ config,
40
+ workingDirectory: projectRoot,
41
+ onEvent,
42
+ onApproval: createApprovalCallback('cli'),
43
+ skipDiscovery: false,
44
+ dryRun: true,
45
+ });
46
+ console.log(`Planning: "${goal}"`);
47
+ console.log('');
48
+ await engine.run(goal);
49
+ console.log('');
50
+ console.log(`Plan saved to ${join(sdRoot, 'PLAN.md')}`);
51
+ console.log('Review the plan, then run: slavedriver run');
52
+ }
53
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AACA,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,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAA0B;IACxE,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;IACxC,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAE1C,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,cAAc,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAE/E,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,4BAA4B,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC;gBACjE,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,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO;QACP,KAAK;QACL,cAAc;QACd,MAAM;QACN,gBAAgB,EAAE,WAAW;QAC7B,OAAO;QACP,UAAU,EAAE,sBAAsB,CAAC,KAAK,CAAC;QACzC,aAAa,EAAE,KAAK;QACpB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function replanCommand(flags?: Record<string, string | boolean>): Promise<void>;
@@ -0,0 +1,54 @@
1
+ import { join } from 'node:path';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { createStepStore } from '../../steps/store.js';
4
+ import { runStep } from '../../steps/runner.js';
5
+ import { createClaudeCodeRuntime } from '../../agents/backends/claude-code.js';
6
+ import { createPlainDisplay } from '../../tui/display.js';
7
+ import { requireRoot } from './find-root.js';
8
+ export async function replanCommand(flags) {
9
+ const projectRoot = requireRoot();
10
+ const sdRoot = join(projectRoot, '.slavedriver');
11
+ const store = createStepStore(sdRoot);
12
+ const constitutionPath = join(sdRoot, 'CONSTITUTION.md');
13
+ const allSteps = await store.listSteps();
14
+ const completedSteps = allSteps.filter((s) => s.meta.status === 'completed');
15
+ if (completedSteps.length === 0) {
16
+ console.log('No completed steps to build a replan from.');
17
+ console.log('Run slavedriver "<goal>" to start a pipeline.');
18
+ return;
19
+ }
20
+ console.log(`Creating replan step reading ${completedSteps.length} completed step(s)...`);
21
+ const completedNumbers = completedSteps.map((s) => s.number);
22
+ // Build a summary of what has been done
23
+ const summaryParts = ['# Current State Summary\n'];
24
+ for (const step of completedSteps) {
25
+ const output = await readFile(join(step.dir, 'output.md'), 'utf-8').catch(() => '(no output)');
26
+ const preview = output.length > 500 ? output.slice(0, 500) + '...' : output;
27
+ summaryParts.push(`## Step ${step.number}: ${step.meta.name}\n${preview}\n`);
28
+ }
29
+ const replanStep = await store.createStep({
30
+ name: 'replan',
31
+ agent: 'planner',
32
+ prompt: [
33
+ 'Review the completed work above and create an updated plan for any remaining work.',
34
+ 'If the original goal has been achieved, state that clearly.',
35
+ 'Otherwise, output new step definitions for the remaining work.',
36
+ '',
37
+ 'Output format for new steps:',
38
+ '',
39
+ '## Step: <name>',
40
+ 'agent: <role>',
41
+ 'reads: <comma-separated step numbers>',
42
+ '',
43
+ '<detailed prompt>',
44
+ ].join('\n'),
45
+ reads: completedNumbers,
46
+ });
47
+ const runtime = createClaudeCodeRuntime();
48
+ const display = createPlainDisplay({ version: '0.2.0', projectName: projectRoot.split('/').pop() ?? 'project', noTui: true });
49
+ for await (const event of runStep(replanStep, { runtime, store, constitutionPath, workingDirectory: projectRoot })) {
50
+ display.handleEvent(event);
51
+ }
52
+ console.log('Replan step completed. Run `slavedriver status` to see updated steps.');
53
+ }
54
+ //# sourceMappingURL=replan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replan.js","sourceRoot":"","sources":["../../../src/cli/commands/replan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ParsedArgs } from '../arg-parser.js';
2
+ export declare function runGoalPipeline(goal: string, flags: ParsedArgs['flags']): Promise<void>;