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,155 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { getAgentConfig } from '../agents/prompt-compiler.js';
4
+ import { generateId } from '../utils/id.js';
5
+ export async function* runStep(step, options) {
6
+ const { runtime, store, constitutionPath, workingDirectory } = options;
7
+ // Mark running
8
+ await store.startStep(step.number);
9
+ yield { type: 'step_started', stepNumber: step.number, name: step.meta.name, agent: step.meta.agent };
10
+ // Load context
11
+ const ctx = await store.loadStepContext(step.number, constitutionPath);
12
+ const prompt = await readFile(join(step.dir, 'prompt.md'), 'utf-8');
13
+ // Build full prompt with artifacts
14
+ const sections = [];
15
+ if (ctx.constitution) {
16
+ sections.push('# Constitution\n\n' + ctx.constitution);
17
+ }
18
+ for (const [num, output] of ctx.artifacts) {
19
+ const depStep = await store.getStep(num);
20
+ const label = depStep ? `${String(num).padStart(3, '0')}-${depStep.meta.name}` : `step-${num}`;
21
+ sections.push(`# Artifact: ${label}\n\n${output}`);
22
+ }
23
+ sections.push('# Task\n\n' + prompt);
24
+ const fullPrompt = sections.join('\n\n---\n\n');
25
+ // Get agent config
26
+ const agentConfig = getAgentConfig(step.meta.agent);
27
+ // Execute
28
+ const executionId = generateId();
29
+ let inputTokens = 0;
30
+ let outputTokens = 0;
31
+ let textAccumulator = '';
32
+ let completeResult = '';
33
+ try {
34
+ const stream = runtime.execute({
35
+ executionId,
36
+ prompt: fullPrompt,
37
+ systemPrompt: agentConfig.systemPrompt,
38
+ workingDirectory,
39
+ model: agentConfig.model,
40
+ maxTurns: agentConfig.maxTurns,
41
+ allowedTools: agentConfig.allowedTools,
42
+ outputFormat: 'stream-json',
43
+ dangerouslySkipPermissions: true,
44
+ });
45
+ for await (const event of stream) {
46
+ if (options.abortSignal?.aborted) {
47
+ await runtime.abort(executionId);
48
+ await store.failStep(step.number, 'aborted');
49
+ yield { type: 'step_failed', stepNumber: step.number, name: step.meta.name, error: 'aborted' };
50
+ return;
51
+ }
52
+ yield { type: 'agent_event', stepNumber: step.number, event };
53
+ switch (event.type) {
54
+ case 'text_delta':
55
+ textAccumulator += event.text;
56
+ break;
57
+ case 'cost_update':
58
+ inputTokens += event.inputTokens;
59
+ outputTokens += event.outputTokens;
60
+ break;
61
+ case 'complete':
62
+ completeResult = event.result;
63
+ break;
64
+ case 'error':
65
+ await store.failStep(step.number, event.error);
66
+ yield { type: 'step_failed', stepNumber: step.number, name: step.meta.name, error: event.error };
67
+ return;
68
+ }
69
+ }
70
+ const output = completeResult || textAccumulator;
71
+ await store.completeStep(step.number, output, { input: inputTokens, output: outputTokens });
72
+ yield { type: 'step_completed', stepNumber: step.number, name: step.meta.name, inputTokens, outputTokens };
73
+ }
74
+ catch (err) {
75
+ const errorMsg = err instanceof Error ? err.message : String(err);
76
+ await store.failStep(step.number, errorMsg);
77
+ yield { type: 'step_failed', stepNumber: step.number, name: step.meta.name, error: errorMsg };
78
+ }
79
+ }
80
+ function createSemaphore(max) {
81
+ let current = 0;
82
+ const queue = [];
83
+ return {
84
+ acquire() {
85
+ if (current < max) {
86
+ current++;
87
+ return Promise.resolve();
88
+ }
89
+ return new Promise((resolve) => {
90
+ queue.push(resolve);
91
+ });
92
+ },
93
+ release() {
94
+ const next = queue.shift();
95
+ if (next) {
96
+ next();
97
+ }
98
+ else {
99
+ current--;
100
+ }
101
+ },
102
+ };
103
+ }
104
+ export async function* runStepsParallel(steps, concurrency, options) {
105
+ const semaphore = createSemaphore(concurrency);
106
+ const eventQueue = [];
107
+ let resolveWait = null;
108
+ let allDone = false;
109
+ let activeCount = 0;
110
+ function pushEvent(event) {
111
+ eventQueue.push(event);
112
+ if (resolveWait) {
113
+ resolveWait();
114
+ resolveWait = null;
115
+ }
116
+ }
117
+ async function runOne(step) {
118
+ await semaphore.acquire();
119
+ try {
120
+ for await (const event of runStep(step, options)) {
121
+ pushEvent(event);
122
+ }
123
+ }
124
+ finally {
125
+ semaphore.release();
126
+ activeCount--;
127
+ if (activeCount === 0) {
128
+ allDone = true;
129
+ if (resolveWait) {
130
+ resolveWait();
131
+ resolveWait = null;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ // Launch all steps
137
+ activeCount = steps.length;
138
+ if (activeCount === 0)
139
+ return;
140
+ const promises = steps.map((s) => runOne(s));
141
+ // Drain events as they arrive
142
+ while (!allDone || eventQueue.length > 0) {
143
+ if (eventQueue.length > 0) {
144
+ yield eventQueue.shift();
145
+ }
146
+ else {
147
+ await new Promise((resolve) => {
148
+ resolveWait = resolve;
149
+ });
150
+ }
151
+ }
152
+ // Wait for all promises to settle (catches any unhandled rejections)
153
+ await Promise.allSettled(promises);
154
+ }
155
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/steps/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { StepDef, Step, StepContext } from './types.js';
2
+ export interface StepStore {
3
+ readonly stepsDir: string;
4
+ /** Create a new numbered step directory with prompt.md and meta.json. Returns the step. */
5
+ createStep(def: StepDef): Promise<Step>;
6
+ /** Mark a step as started. */
7
+ startStep(stepNumber: number): Promise<void>;
8
+ /** Mark a step as completed and write output.md. */
9
+ completeStep(stepNumber: number, output: string, tokens: {
10
+ input: number;
11
+ output: number;
12
+ }): Promise<void>;
13
+ /** Mark a step as failed. */
14
+ failStep(stepNumber: number, error: string): Promise<void>;
15
+ /** List all steps sorted by number. */
16
+ listSteps(): Promise<Step[]>;
17
+ /** Get a single step by number. */
18
+ getStep(stepNumber: number): Promise<Step | null>;
19
+ /** Load context for a step: constitution + outputs of all steps in reads. */
20
+ loadStepContext(stepNumber: number, constitutionPath: string): Promise<StepContext>;
21
+ /** Get all steps whose reads are satisfied (all dependencies completed). */
22
+ getNextPendingSteps(): Promise<Step[]>;
23
+ /** Get all steps belonging to a specific phase. */
24
+ getPhaseSteps(phase: string): Promise<Step[]>;
25
+ }
26
+ export declare function createStepStore(sdRoot: string): StepStore;
@@ -0,0 +1,164 @@
1
+ import { readFile, writeFile, mkdir, readdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ // ── Helpers ─────────────────────────────────────────────────────────────────
4
+ function padNumber(n) {
5
+ return String(n).padStart(3, '0');
6
+ }
7
+ function parseStepDir(name) {
8
+ const match = name.match(/^(\d{3})-(.+)$/);
9
+ if (!match)
10
+ return null;
11
+ return { number: parseInt(match[1], 10), stepName: match[2] };
12
+ }
13
+ async function readFileOrEmpty(filePath) {
14
+ try {
15
+ return await readFile(filePath, 'utf-8');
16
+ }
17
+ catch (err) {
18
+ const nodeErr = err;
19
+ if (nodeErr.code === 'ENOENT')
20
+ return '';
21
+ throw err;
22
+ }
23
+ }
24
+ async function readMeta(dir) {
25
+ const content = await readFile(join(dir, 'meta.json'), 'utf-8');
26
+ return JSON.parse(content);
27
+ }
28
+ async function writeMeta(dir, meta) {
29
+ await writeFile(join(dir, 'meta.json'), JSON.stringify(meta, null, 2) + '\n', 'utf-8');
30
+ }
31
+ // ── Factory ──────────────────────────────────────────────────────────────────
32
+ export function createStepStore(sdRoot) {
33
+ const stepsDir = join(sdRoot, 'steps');
34
+ async function ensureStepsDir() {
35
+ await mkdir(stepsDir, { recursive: true });
36
+ }
37
+ async function listStepDirs() {
38
+ await ensureStepsDir();
39
+ const entries = await readdir(stepsDir, { withFileTypes: true });
40
+ const steps = [];
41
+ for (const entry of entries) {
42
+ if (!entry.isDirectory())
43
+ continue;
44
+ const parsed = parseStepDir(entry.name);
45
+ if (!parsed)
46
+ continue;
47
+ steps.push({ number: parsed.number, name: parsed.stepName, dir: join(stepsDir, entry.name) });
48
+ }
49
+ steps.sort((a, b) => a.number - b.number);
50
+ return steps;
51
+ }
52
+ async function getNextNumber() {
53
+ const dirs = await listStepDirs();
54
+ if (dirs.length === 0)
55
+ return 0;
56
+ return dirs[dirs.length - 1].number + 1;
57
+ }
58
+ const store = {
59
+ stepsDir,
60
+ async createStep(def) {
61
+ await ensureStepsDir();
62
+ const num = await getNextNumber();
63
+ const dirName = `${padNumber(num)}-${def.name}`;
64
+ const dir = join(stepsDir, dirName);
65
+ await mkdir(dir, { recursive: true });
66
+ const meta = {
67
+ name: def.name,
68
+ status: 'pending',
69
+ agent: def.agent,
70
+ reads: def.reads,
71
+ ...(def.phase ? { phase: def.phase } : {}),
72
+ createdAt: new Date().toISOString(),
73
+ };
74
+ await writeMeta(dir, meta);
75
+ await writeFile(join(dir, 'prompt.md'), def.prompt, 'utf-8');
76
+ return { number: num, dir, meta };
77
+ },
78
+ async startStep(stepNumber) {
79
+ const step = await store.getStep(stepNumber);
80
+ if (!step)
81
+ throw new Error(`Step ${stepNumber} not found`);
82
+ const updated = {
83
+ ...step.meta,
84
+ status: 'running',
85
+ startedAt: new Date().toISOString(),
86
+ };
87
+ await writeMeta(step.dir, updated);
88
+ },
89
+ async completeStep(stepNumber, output, tokens) {
90
+ const step = await store.getStep(stepNumber);
91
+ if (!step)
92
+ throw new Error(`Step ${stepNumber} not found`);
93
+ const updated = {
94
+ ...step.meta,
95
+ status: 'completed',
96
+ completedAt: new Date().toISOString(),
97
+ inputTokens: tokens.input,
98
+ outputTokens: tokens.output,
99
+ };
100
+ await writeMeta(step.dir, updated);
101
+ await writeFile(join(step.dir, 'output.md'), output, 'utf-8');
102
+ },
103
+ async failStep(stepNumber, error) {
104
+ const step = await store.getStep(stepNumber);
105
+ if (!step)
106
+ throw new Error(`Step ${stepNumber} not found`);
107
+ const updated = {
108
+ ...step.meta,
109
+ status: 'failed',
110
+ completedAt: new Date().toISOString(),
111
+ error,
112
+ };
113
+ await writeMeta(step.dir, updated);
114
+ },
115
+ async listSteps() {
116
+ const dirs = await listStepDirs();
117
+ const steps = [];
118
+ for (const d of dirs) {
119
+ const meta = await readMeta(d.dir);
120
+ steps.push({ number: d.number, dir: d.dir, meta });
121
+ }
122
+ return steps;
123
+ },
124
+ async getStep(stepNumber) {
125
+ const dirs = await listStepDirs();
126
+ const found = dirs.find((d) => d.number === stepNumber);
127
+ if (!found)
128
+ return null;
129
+ const meta = await readMeta(found.dir);
130
+ return { number: found.number, dir: found.dir, meta };
131
+ },
132
+ async loadStepContext(stepNumber, constitutionPath) {
133
+ const step = await store.getStep(stepNumber);
134
+ if (!step)
135
+ throw new Error(`Step ${stepNumber} not found`);
136
+ const constitution = await readFileOrEmpty(constitutionPath);
137
+ const artifacts = new Map();
138
+ for (const readNum of step.meta.reads) {
139
+ const depStep = await store.getStep(readNum);
140
+ if (depStep) {
141
+ const output = await readFileOrEmpty(join(depStep.dir, 'output.md'));
142
+ if (output)
143
+ artifacts.set(readNum, output);
144
+ }
145
+ }
146
+ return { constitution, artifacts };
147
+ },
148
+ async getNextPendingSteps() {
149
+ const allSteps = await store.listSteps();
150
+ const completedSet = new Set(allSteps.filter((s) => s.meta.status === 'completed').map((s) => s.number));
151
+ return allSteps.filter((step) => {
152
+ if (step.meta.status !== 'pending')
153
+ return false;
154
+ return step.meta.reads.every((r) => completedSet.has(r));
155
+ });
156
+ },
157
+ async getPhaseSteps(phase) {
158
+ const allSteps = await store.listSteps();
159
+ return allSteps.filter((s) => s.meta.phase === phase);
160
+ },
161
+ };
162
+ return store;
163
+ }
164
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/steps/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { StepStatus } from '../types.js';
2
+ export interface StepMeta {
3
+ readonly name: string;
4
+ readonly status: StepStatus;
5
+ readonly agent: string;
6
+ readonly reads: readonly number[];
7
+ readonly phase?: string;
8
+ readonly createdAt: string;
9
+ readonly startedAt?: string;
10
+ readonly completedAt?: string;
11
+ readonly inputTokens?: number;
12
+ readonly outputTokens?: number;
13
+ readonly error?: string;
14
+ }
15
+ export interface StepDef {
16
+ readonly name: string;
17
+ readonly agent: string;
18
+ readonly prompt: string;
19
+ readonly reads: readonly number[];
20
+ readonly phase?: string;
21
+ }
22
+ export interface PhaseDef {
23
+ readonly name: string;
24
+ readonly description: string;
25
+ readonly priority: number;
26
+ readonly depends: readonly string[];
27
+ }
28
+ export interface Step {
29
+ readonly number: number;
30
+ readonly dir: string;
31
+ readonly meta: StepMeta;
32
+ }
33
+ export interface StepContext {
34
+ readonly constitution: string;
35
+ readonly artifacts: ReadonlyMap<number, string>;
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/steps/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { EngineEvent } from '../orchestrator/engine.js';
2
+ import type { AgentEvent } from '../agents/runtime.js';
3
+ export interface TuiApp {
4
+ start(): void;
5
+ stop(): void;
6
+ handleEngineEvent(event: EngineEvent): void;
7
+ handleAgentEvent(taskId: string, event: AgentEvent): void;
8
+ }
9
+ export interface TuiConfig {
10
+ readonly version: string;
11
+ readonly projectName: string;
12
+ readonly refreshRate?: number;
13
+ readonly masterMode?: boolean;
14
+ }
15
+ export declare function createTuiApp(config: TuiConfig): TuiApp;