pi-mission-control 0.0.0-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +205 -0
- package/agents/auditor.md +45 -0
- package/agents/worker.md +44 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +526 -0
- package/dist/index.js.map +1 -0
- package/dist/state.d.ts +265 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +474 -0
- package/dist/state.js.map +1 -0
- package/dist/tools/add-phase.d.ts +28 -0
- package/dist/tools/add-phase.d.ts.map +1 -0
- package/dist/tools/add-phase.js +69 -0
- package/dist/tools/add-phase.js.map +1 -0
- package/dist/tools/add-task.d.ts +30 -0
- package/dist/tools/add-task.d.ts.map +1 -0
- package/dist/tools/add-task.js +85 -0
- package/dist/tools/add-task.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +16 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/init.d.ts +34 -0
- package/dist/tools/init.d.ts.map +1 -0
- package/dist/tools/init.js +75 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/mission-complete.d.ts +30 -0
- package/dist/tools/mission-complete.d.ts.map +1 -0
- package/dist/tools/mission-complete.js +85 -0
- package/dist/tools/mission-complete.js.map +1 -0
- package/dist/tools/mission-resume.d.ts +35 -0
- package/dist/tools/mission-resume.d.ts.map +1 -0
- package/dist/tools/mission-resume.js +87 -0
- package/dist/tools/mission-resume.js.map +1 -0
- package/dist/tools/scaffold.d.ts +24 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +129 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/update-phase.d.ts +33 -0
- package/dist/tools/update-phase.d.ts.map +1 -0
- package/dist/tools/update-phase.js +101 -0
- package/dist/tools/update-phase.js.map +1 -0
- package/dist/tools/update-task.d.ts +34 -0
- package/dist/tools/update-task.d.ts.map +1 -0
- package/dist/tools/update-task.js +104 -0
- package/dist/tools/update-task.js.map +1 -0
- package/dist/tui/dashboard.d.ts +146 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js +381 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/header.d.ts +39 -0
- package/dist/tui/header.d.ts.map +1 -0
- package/dist/tui/header.js +62 -0
- package/dist/tui/header.js.map +1 -0
- package/dist/tui/idle-view.d.ts +44 -0
- package/dist/tui/idle-view.d.ts.map +1 -0
- package/dist/tui/idle-view.js +87 -0
- package/dist/tui/idle-view.js.map +1 -0
- package/dist/tui/index.d.ts +13 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +15 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/past-runs.d.ts +49 -0
- package/dist/tui/past-runs.d.ts.map +1 -0
- package/dist/tui/past-runs.js +207 -0
- package/dist/tui/past-runs.js.map +1 -0
- package/dist/tui/phases-panel.d.ts +46 -0
- package/dist/tui/phases-panel.d.ts.map +1 -0
- package/dist/tui/phases-panel.js +161 -0
- package/dist/tui/phases-panel.js.map +1 -0
- package/dist/tui/progress-bar.d.ts +37 -0
- package/dist/tui/progress-bar.d.ts.map +1 -0
- package/dist/tui/progress-bar.js +123 -0
- package/dist/tui/progress-bar.js.map +1 -0
- package/dist/tui/styles.d.ts +8 -0
- package/dist/tui/styles.d.ts.map +1 -0
- package/dist/tui/styles.js +22 -0
- package/dist/tui/styles.js.map +1 -0
- package/dist/tui/tasks-panel.d.ts +48 -0
- package/dist/tui/tasks-panel.d.ts.map +1 -0
- package/dist/tui/tasks-panel.js +191 -0
- package/dist/tui/tasks-panel.js.map +1 -0
- package/package.json +42 -0
- package/skills/mission-memory/SKILL.md +88 -0
- package/skills/mission-orchestrator/SKILL.md +167 -0
- package/skills/mission-pm/SKILL.md +83 -0
- package/skills/mission-research/SKILL.md +66 -0
- package/skills/mission-tech-lead/SKILL.md +68 -0
- package/src/index.ts +659 -0
- package/src/state.ts +623 -0
- package/src/tools/add-phase.ts +98 -0
- package/src/tools/add-task.ts +121 -0
- package/src/tools/index.ts +18 -0
- package/src/tools/init.ts +109 -0
- package/src/tools/mission-complete.ts +118 -0
- package/src/tools/mission-resume.ts +119 -0
- package/src/tools/scaffold.ts +167 -0
- package/src/tools/update-phase.ts +140 -0
- package/src/tools/update-task.ts +145 -0
- package/src/tui/dashboard.ts +441 -0
- package/src/tui/header.ts +85 -0
- package/src/tui/idle-view.ts +114 -0
- package/src/tui/index.ts +20 -0
- package/src/tui/past-runs.ts +261 -0
- package/src/tui/phases-panel.ts +199 -0
- package/src/tui/progress-bar.ts +152 -0
- package/src/tui/styles.ts +27 -0
- package/src/tui/tasks-panel.ts +228 -0
- package/templates/state.json +5 -0
package/dist/state.js
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State types and file helpers for mission-control
|
|
3
|
+
*
|
|
4
|
+
* Types for state.json, run.json, and file read/write operations.
|
|
5
|
+
* All tool mutations go through here.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Default State Values
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export const defaultState = {
|
|
13
|
+
active_run_id: null,
|
|
14
|
+
current_phase: "idle",
|
|
15
|
+
current_status_message: ""
|
|
16
|
+
};
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Path Helpers
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Get the project root (cwd)
|
|
22
|
+
*/
|
|
23
|
+
export function getProjectRoot() {
|
|
24
|
+
return process.cwd();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the base mission-control directory path
|
|
28
|
+
*/
|
|
29
|
+
export function getMissionControlDir() {
|
|
30
|
+
return path.join(getProjectRoot(), ".pi", "mission-control");
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the state.json file path
|
|
34
|
+
*/
|
|
35
|
+
export function getStateFilePath() {
|
|
36
|
+
return path.join(getMissionControlDir(), "state.json");
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get the memory directory path
|
|
40
|
+
*/
|
|
41
|
+
export function getMemoryDir() {
|
|
42
|
+
return path.join(getMissionControlDir(), "memory");
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the long-term memory file path
|
|
46
|
+
*/
|
|
47
|
+
export function getLongTermMemoryPath() {
|
|
48
|
+
return path.join(getMemoryDir(), "long_term.md");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the runs directory path
|
|
52
|
+
*/
|
|
53
|
+
export function getRunsDir() {
|
|
54
|
+
return path.join(getMissionControlDir(), "runs");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get a specific run directory path
|
|
58
|
+
*/
|
|
59
|
+
export function getRunDir(runId) {
|
|
60
|
+
return path.join(getRunsDir(), runId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get the run.json file path for a specific run
|
|
64
|
+
*/
|
|
65
|
+
export function getRunFilePath(runId) {
|
|
66
|
+
return path.join(getRunDir(runId), "run.json");
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get the tasks directory path for a specific run
|
|
70
|
+
*/
|
|
71
|
+
export function getTasksDir(runId) {
|
|
72
|
+
return path.join(getRunDir(runId), "tasks");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get a specific task directory path
|
|
76
|
+
*/
|
|
77
|
+
export function getTaskDir(runId, taskId) {
|
|
78
|
+
return path.join(getTasksDir(runId), taskId);
|
|
79
|
+
}
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// File I/O Helpers
|
|
82
|
+
// ============================================================================
|
|
83
|
+
/**
|
|
84
|
+
* Ensure a directory exists (recursive)
|
|
85
|
+
*/
|
|
86
|
+
export function ensureDir(dirPath) {
|
|
87
|
+
if (!fs.existsSync(dirPath)) {
|
|
88
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Read and parse JSON file
|
|
93
|
+
*/
|
|
94
|
+
export function readJson(filePath) {
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.existsSync(filePath)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
100
|
+
return JSON.parse(content);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`Error reading JSON file ${filePath}:`, error);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Write JSON file (with pretty formatting)
|
|
109
|
+
*/
|
|
110
|
+
export function writeJson(filePath, data) {
|
|
111
|
+
ensureDir(path.dirname(filePath));
|
|
112
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Read a text file
|
|
116
|
+
*/
|
|
117
|
+
export function readText(filePath) {
|
|
118
|
+
try {
|
|
119
|
+
if (!fs.existsSync(filePath)) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error(`Error reading text file ${filePath}:`, error);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Write a text file
|
|
131
|
+
*/
|
|
132
|
+
export function writeText(filePath, content) {
|
|
133
|
+
ensureDir(path.dirname(filePath));
|
|
134
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if a file exists
|
|
138
|
+
*/
|
|
139
|
+
export function fileExists(filePath) {
|
|
140
|
+
return fs.existsSync(filePath);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Copy a file from source to destination (skip if exists when specified)
|
|
144
|
+
*/
|
|
145
|
+
export function copyFile(src, dest, skipIfExists = false) {
|
|
146
|
+
if (skipIfExists && fs.existsSync(dest)) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
ensureDir(path.dirname(dest));
|
|
150
|
+
fs.copyFileSync(src, dest);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Copy a directory recursively (skip existing files when specified)
|
|
155
|
+
* Returns count of files copied
|
|
156
|
+
*/
|
|
157
|
+
export function copyDir(src, dest, skipIfExists = false) {
|
|
158
|
+
if (!fs.existsSync(src)) {
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
ensureDir(dest);
|
|
162
|
+
let copiedCount = 0;
|
|
163
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
const srcPath = path.join(src, entry.name);
|
|
166
|
+
const destPath = path.join(dest, entry.name);
|
|
167
|
+
if (entry.isDirectory()) {
|
|
168
|
+
copiedCount += copyDir(srcPath, destPath, skipIfExists);
|
|
169
|
+
}
|
|
170
|
+
else if (entry.isFile()) {
|
|
171
|
+
if (copyFile(srcPath, destPath, skipIfExists)) {
|
|
172
|
+
copiedCount++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return copiedCount;
|
|
177
|
+
}
|
|
178
|
+
// ============================================================================
|
|
179
|
+
// State File Operations
|
|
180
|
+
// ============================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Read the current state.json
|
|
183
|
+
* Returns default state if file doesn't exist
|
|
184
|
+
*/
|
|
185
|
+
export function readState() {
|
|
186
|
+
const statePath = getStateFilePath();
|
|
187
|
+
const state = readJson(statePath);
|
|
188
|
+
return state ?? { ...defaultState };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Write state.json
|
|
192
|
+
*/
|
|
193
|
+
export function writeState(state) {
|
|
194
|
+
const statePath = getStateFilePath();
|
|
195
|
+
writeJson(statePath, state);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Update specific fields in state.json
|
|
199
|
+
*/
|
|
200
|
+
export function updateState(updates) {
|
|
201
|
+
const state = readState();
|
|
202
|
+
const updatedState = { ...state, ...updates };
|
|
203
|
+
writeState(updatedState);
|
|
204
|
+
return updatedState;
|
|
205
|
+
}
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// Run File Operations
|
|
208
|
+
// ============================================================================
|
|
209
|
+
/**
|
|
210
|
+
* Read a run.json file
|
|
211
|
+
*/
|
|
212
|
+
export function readRun(runId) {
|
|
213
|
+
const runPath = getRunFilePath(runId);
|
|
214
|
+
return readJson(runPath);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Write a run.json file
|
|
218
|
+
*/
|
|
219
|
+
export function writeRun(run) {
|
|
220
|
+
const runPath = getRunFilePath(run.run_id);
|
|
221
|
+
writeJson(runPath, run);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Update specific fields in a run
|
|
225
|
+
*/
|
|
226
|
+
export function updateRun(runId, updates) {
|
|
227
|
+
const run = readRun(runId);
|
|
228
|
+
if (!run) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
const updatedRun = { ...run, ...updates };
|
|
232
|
+
writeRun(updatedRun);
|
|
233
|
+
return updatedRun;
|
|
234
|
+
}
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// Timestamp Helpers
|
|
237
|
+
// ============================================================================
|
|
238
|
+
/**
|
|
239
|
+
* Get current ISO timestamp
|
|
240
|
+
*/
|
|
241
|
+
export function getTimestamp() {
|
|
242
|
+
return new Date().toISOString();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Generate a run ID from current timestamp
|
|
246
|
+
* Format: run-YYYYMMDD-HHmmss
|
|
247
|
+
*/
|
|
248
|
+
export function generateRunId() {
|
|
249
|
+
const now = new Date();
|
|
250
|
+
const date = now.toISOString().slice(0, 10).replace(/-/g, "");
|
|
251
|
+
const time = now.toTimeString().slice(0, 8).replace(/:/g, "");
|
|
252
|
+
return `run-${date}-${time}`;
|
|
253
|
+
}
|
|
254
|
+
// ============================================================================
|
|
255
|
+
// Phase Helpers
|
|
256
|
+
// ============================================================================
|
|
257
|
+
/**
|
|
258
|
+
* Find a phase by ID in a run
|
|
259
|
+
*/
|
|
260
|
+
export function findPhase(run, phaseId) {
|
|
261
|
+
return run.phases.find(p => p.id === phaseId);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Generate the next phase ID
|
|
265
|
+
*/
|
|
266
|
+
export function generatePhaseId(run) {
|
|
267
|
+
const phaseCount = run.phases.length;
|
|
268
|
+
return `phase${phaseCount + 1}`;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Create a new phase
|
|
272
|
+
*/
|
|
273
|
+
export function createPhase(id, name, file) {
|
|
274
|
+
return {
|
|
275
|
+
id,
|
|
276
|
+
name,
|
|
277
|
+
status: "pending",
|
|
278
|
+
started_at: null,
|
|
279
|
+
finish_at: null,
|
|
280
|
+
file,
|
|
281
|
+
tasks: []
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Add a phase to a run
|
|
286
|
+
*/
|
|
287
|
+
export function addPhaseToRun(run, phase) {
|
|
288
|
+
return {
|
|
289
|
+
...run,
|
|
290
|
+
phases: [...run.phases, phase]
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Update a phase in a run
|
|
295
|
+
*/
|
|
296
|
+
export function updatePhaseInRun(run, phaseId, updates) {
|
|
297
|
+
return {
|
|
298
|
+
...run,
|
|
299
|
+
phases: run.phases.map(p => p.id === phaseId ? { ...p, ...updates } : p)
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
// ============================================================================
|
|
303
|
+
// Task Helpers
|
|
304
|
+
// ============================================================================
|
|
305
|
+
/**
|
|
306
|
+
* Find a task by ID in a run (searches all phases)
|
|
307
|
+
*/
|
|
308
|
+
export function findTask(run, taskId) {
|
|
309
|
+
for (let phaseIndex = 0; phaseIndex < run.phases.length; phaseIndex++) {
|
|
310
|
+
const phase = run.phases[phaseIndex];
|
|
311
|
+
const taskIndex = phase.tasks.findIndex(t => t.id === taskId);
|
|
312
|
+
if (taskIndex !== -1) {
|
|
313
|
+
return { phase, task: phase.tasks[taskIndex], phaseIndex, taskIndex };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Generate the next task ID for a phase
|
|
320
|
+
*/
|
|
321
|
+
export function generateTaskId(phase) {
|
|
322
|
+
const taskCount = phase.tasks.length;
|
|
323
|
+
return `${phase.id}-task${taskCount + 1}`;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Create a new task
|
|
327
|
+
*/
|
|
328
|
+
export function createTask(id, name, file) {
|
|
329
|
+
const taskDir = path.join("tasks", id);
|
|
330
|
+
return {
|
|
331
|
+
id,
|
|
332
|
+
name,
|
|
333
|
+
status: "pending",
|
|
334
|
+
started_at: null,
|
|
335
|
+
finish_at: null,
|
|
336
|
+
file,
|
|
337
|
+
paths: {
|
|
338
|
+
contract: path.join(taskDir, "contract.md"),
|
|
339
|
+
worker_output: path.join(taskDir, "worker-output.md"),
|
|
340
|
+
auditor_report: path.join(taskDir, "auditor-report.md")
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Add a task to a phase within a run
|
|
346
|
+
*/
|
|
347
|
+
export function addTaskToRun(run, phaseId, task) {
|
|
348
|
+
return {
|
|
349
|
+
...run,
|
|
350
|
+
phases: run.phases.map(p => p.id === phaseId
|
|
351
|
+
? { ...p, tasks: [...p.tasks, task] }
|
|
352
|
+
: p)
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Update a task in a run
|
|
357
|
+
*/
|
|
358
|
+
export function updateTaskInRun(run, taskId, updates) {
|
|
359
|
+
return {
|
|
360
|
+
...run,
|
|
361
|
+
phases: run.phases.map(p => ({
|
|
362
|
+
...p,
|
|
363
|
+
tasks: p.tasks.map(t => t.id === taskId ? { ...t, ...updates } : t)
|
|
364
|
+
}))
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Check if all tasks in a phase are done
|
|
369
|
+
*/
|
|
370
|
+
export function areAllTasksDone(phase) {
|
|
371
|
+
if (phase.tasks.length === 0)
|
|
372
|
+
return false;
|
|
373
|
+
return phase.tasks.every(t => t.status === "done");
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Check if all phases in a run are done
|
|
377
|
+
*/
|
|
378
|
+
export function areAllPhasesDone(run) {
|
|
379
|
+
if (run.phases.length === 0)
|
|
380
|
+
return false;
|
|
381
|
+
return run.phases.every(p => p.status === "done");
|
|
382
|
+
}
|
|
383
|
+
// ============================================================================
|
|
384
|
+
// Run Discovery
|
|
385
|
+
// ============================================================================
|
|
386
|
+
/**
|
|
387
|
+
* List all run IDs in the runs directory
|
|
388
|
+
*/
|
|
389
|
+
export function listRunIds() {
|
|
390
|
+
const runsDir = getRunsDir();
|
|
391
|
+
if (!fs.existsSync(runsDir)) {
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
return fs.readdirSync(runsDir, { withFileTypes: true })
|
|
395
|
+
.filter(entry => entry.isDirectory() && entry.name.startsWith("run-"))
|
|
396
|
+
.map(entry => entry.name)
|
|
397
|
+
.sort();
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* List all runs with their basic info
|
|
401
|
+
*/
|
|
402
|
+
export function listRuns() {
|
|
403
|
+
const runIds = listRunIds();
|
|
404
|
+
return runIds.map(runId => ({
|
|
405
|
+
runId,
|
|
406
|
+
run: readRun(runId)
|
|
407
|
+
}));
|
|
408
|
+
}
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// Scaffold Check
|
|
411
|
+
// ============================================================================
|
|
412
|
+
/**
|
|
413
|
+
* Check if mission-control has been scaffolded
|
|
414
|
+
*/
|
|
415
|
+
export function isScaffolded() {
|
|
416
|
+
return fileExists(getMissionControlDir());
|
|
417
|
+
}
|
|
418
|
+
// ============================================================================
|
|
419
|
+
// Initialization Helpers
|
|
420
|
+
// ============================================================================
|
|
421
|
+
/**
|
|
422
|
+
* Create the initial run.json structure
|
|
423
|
+
*/
|
|
424
|
+
export function createInitialRun(runId) {
|
|
425
|
+
const now = getTimestamp();
|
|
426
|
+
return {
|
|
427
|
+
run_id: runId,
|
|
428
|
+
started_at: now,
|
|
429
|
+
finish_at: null,
|
|
430
|
+
status: "in_progress",
|
|
431
|
+
artifacts: {
|
|
432
|
+
requirements: "00-requirements.md",
|
|
433
|
+
architecture: "01-architecture.md",
|
|
434
|
+
validation: "02-validation.md"
|
|
435
|
+
},
|
|
436
|
+
phases: []
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Create the base mission-control directory structure
|
|
441
|
+
*/
|
|
442
|
+
export function createBaseStructure() {
|
|
443
|
+
ensureDir(getMissionControlDir());
|
|
444
|
+
ensureDir(getMemoryDir());
|
|
445
|
+
ensureDir(getRunsDir());
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Create a new run directory structure
|
|
449
|
+
*/
|
|
450
|
+
export function createRunStructure(runId) {
|
|
451
|
+
const runDir = getRunDir(runId);
|
|
452
|
+
ensureDir(runDir);
|
|
453
|
+
ensureDir(getTasksDir(runId));
|
|
454
|
+
}
|
|
455
|
+
// ============================================================================
|
|
456
|
+
// Status Transition Logic
|
|
457
|
+
// ============================================================================
|
|
458
|
+
/**
|
|
459
|
+
* Get the appropriate timestamp field to update based on status
|
|
460
|
+
*/
|
|
461
|
+
export function getTimestampForStatus(status, currentStatus) {
|
|
462
|
+
const now = getTimestamp();
|
|
463
|
+
// Transition to in_progress sets started_at
|
|
464
|
+
if (status === "in_progress" && currentStatus !== "in_progress") {
|
|
465
|
+
return { started_at: now };
|
|
466
|
+
}
|
|
467
|
+
// Transition to terminal state sets finish_at
|
|
468
|
+
const terminalStatuses = ["done", "failed", "removed"];
|
|
469
|
+
if (terminalStatuses.includes(status) && !terminalStatuses.includes(currentStatus)) {
|
|
470
|
+
return { finish_at: now };
|
|
471
|
+
}
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add_phase tool
|
|
3
|
+
*
|
|
4
|
+
* Agent tool to add a new phase to the current mission run.
|
|
5
|
+
* Auto-generates phase_id ("phase1", "phase2", ...).
|
|
6
|
+
* Sets status to "pending".
|
|
7
|
+
*
|
|
8
|
+
* Used by: mission-pm skill
|
|
9
|
+
*/
|
|
10
|
+
export interface AddPhaseParams {
|
|
11
|
+
name: string;
|
|
12
|
+
file: string;
|
|
13
|
+
}
|
|
14
|
+
export interface AddPhaseResult {
|
|
15
|
+
success: boolean;
|
|
16
|
+
message: string;
|
|
17
|
+
phaseId: string | null;
|
|
18
|
+
errors: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Add a phase to the active mission run
|
|
22
|
+
*
|
|
23
|
+
* @param params.name - Human-readable phase name (e.g., "Auth Backend")
|
|
24
|
+
* @param params.file - Path to phase definition/reference file
|
|
25
|
+
* @returns Result with generated phase_id
|
|
26
|
+
*/
|
|
27
|
+
export declare function addPhase(params: AddPhaseParams): AddPhaseResult;
|
|
28
|
+
//# sourceMappingURL=add-phase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-phase.d.ts","sourceRoot":"","sources":["../../src/tools/add-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CA2D/D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add_phase tool
|
|
3
|
+
*
|
|
4
|
+
* Agent tool to add a new phase to the current mission run.
|
|
5
|
+
* Auto-generates phase_id ("phase1", "phase2", ...).
|
|
6
|
+
* Sets status to "pending".
|
|
7
|
+
*
|
|
8
|
+
* Used by: mission-pm skill
|
|
9
|
+
*/
|
|
10
|
+
import { readState, readRun, writeRun, generatePhaseId, createPhase, addPhaseToRun } from "../state.js";
|
|
11
|
+
/**
|
|
12
|
+
* Add a phase to the active mission run
|
|
13
|
+
*
|
|
14
|
+
* @param params.name - Human-readable phase name (e.g., "Auth Backend")
|
|
15
|
+
* @param params.file - Path to phase definition/reference file
|
|
16
|
+
* @returns Result with generated phase_id
|
|
17
|
+
*/
|
|
18
|
+
export function addPhase(params) {
|
|
19
|
+
const result = {
|
|
20
|
+
success: false,
|
|
21
|
+
message: "",
|
|
22
|
+
phaseId: null,
|
|
23
|
+
errors: []
|
|
24
|
+
};
|
|
25
|
+
try {
|
|
26
|
+
// Validate parameters
|
|
27
|
+
if (!params.name || params.name.trim() === "") {
|
|
28
|
+
result.errors.push("Phase name is required");
|
|
29
|
+
result.message = "Failed to add phase: name is required";
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
if (!params.file || params.file.trim() === "") {
|
|
33
|
+
result.errors.push("Phase file is required");
|
|
34
|
+
result.message = "Failed to add phase: file is required";
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
// Get active run
|
|
38
|
+
const state = readState();
|
|
39
|
+
if (!state.active_run_id) {
|
|
40
|
+
result.errors.push("No active run");
|
|
41
|
+
result.message = "Failed to add phase: no active mission run";
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
// Read run.json
|
|
45
|
+
const run = readRun(state.active_run_id);
|
|
46
|
+
if (!run) {
|
|
47
|
+
result.errors.push(`Run not found: ${state.active_run_id}`);
|
|
48
|
+
result.message = "Failed to add phase: run not found";
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
// Generate phase ID
|
|
52
|
+
const phaseId = generatePhaseId(run);
|
|
53
|
+
// Create phase
|
|
54
|
+
const phase = createPhase(phaseId, params.name.trim(), params.file.trim());
|
|
55
|
+
// Add to run
|
|
56
|
+
const updatedRun = addPhaseToRun(run, phase);
|
|
57
|
+
writeRun(updatedRun);
|
|
58
|
+
result.success = true;
|
|
59
|
+
result.phaseId = phaseId;
|
|
60
|
+
result.message = `Phase added: ${phaseId} - ${params.name}`;
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
result.success = false;
|
|
64
|
+
result.message = `Error adding phase: ${error instanceof Error ? error.message : String(error)}`;
|
|
65
|
+
result.errors.push(String(error));
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=add-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-phase.js","sourceRoot":"","sources":["../../src/tools/add-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,SAAS,EACT,OAAO,EACP,QAAQ,EACR,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,aAAa,CAAC;AAcrB;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAsB;IAC7C,MAAM,MAAM,GAAmB;QAC7B,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,IAAI,CAAC;QACH,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,GAAG,uCAAuC,CAAC;YACzD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,GAAG,uCAAuC,CAAC;YACzD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,GAAG,4CAA4C,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,gBAAgB;QAChB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,GAAG,oCAAoC,CAAC;YACtD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAErC,eAAe;QACf,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAE3E,aAAa;QACb,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,UAAU,CAAC,CAAC;QAErB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,gBAAgB,OAAO,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IAE9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add_task tool
|
|
3
|
+
*
|
|
4
|
+
* Agent tool to add a new task to a phase.
|
|
5
|
+
* Auto-generates task_id from phase prefix ("phase1-task1", "phase1-task2", ...).
|
|
6
|
+
* Sets status to "pending".
|
|
7
|
+
*
|
|
8
|
+
* Used by: mission-pm skill
|
|
9
|
+
*/
|
|
10
|
+
export interface AddTaskParams {
|
|
11
|
+
phase_id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
file: string;
|
|
14
|
+
}
|
|
15
|
+
export interface AddTaskResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
message: string;
|
|
18
|
+
taskId: string | null;
|
|
19
|
+
errors: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add a task to a phase in the active mission run
|
|
23
|
+
*
|
|
24
|
+
* @param params.phase_id - ID of the phase to add task to (e.g., "phase1")
|
|
25
|
+
* @param params.name - Human-readable task name (e.g., "Setup DB Schema")
|
|
26
|
+
* @param params.file - Path to task contract file
|
|
27
|
+
* @returns Result with generated task_id
|
|
28
|
+
*/
|
|
29
|
+
export declare function addTask(params: AddTaskParams): AddTaskResult;
|
|
30
|
+
//# sourceMappingURL=add-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-task.d.ts","sourceRoot":"","sources":["../../src/tools/add-task.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CA6E5D"}
|