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
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* update_phase tool
|
|
3
|
+
*
|
|
4
|
+
* Agent tool to update a phase's status.
|
|
5
|
+
* Auto-sets started_at when transitioning to "in_progress".
|
|
6
|
+
* Auto-sets finish_at when transitioning to "done" or "removed".
|
|
7
|
+
*
|
|
8
|
+
* Used by: mission-orchestrator skill
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
readState,
|
|
13
|
+
readRun,
|
|
14
|
+
writeRun,
|
|
15
|
+
findPhase,
|
|
16
|
+
updatePhaseInRun,
|
|
17
|
+
getTimestamp,
|
|
18
|
+
PhaseStatus
|
|
19
|
+
} from "../state.js";
|
|
20
|
+
|
|
21
|
+
export interface UpdatePhaseParams {
|
|
22
|
+
phase_id: string;
|
|
23
|
+
status: PhaseStatus;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface UpdatePhaseResult {
|
|
27
|
+
success: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
phaseId: string | null;
|
|
30
|
+
previousStatus: PhaseStatus | null;
|
|
31
|
+
newStatus: PhaseStatus | null;
|
|
32
|
+
startedAt: string | null;
|
|
33
|
+
finishAt: string | null;
|
|
34
|
+
errors: string[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Update a phase's status in the active mission run
|
|
39
|
+
*
|
|
40
|
+
* @param params.phase_id - ID of the phase to update
|
|
41
|
+
* @param params.status - New status ("pending" | "in_progress" | "done" | "removed")
|
|
42
|
+
* @returns Result with updated phase info
|
|
43
|
+
*/
|
|
44
|
+
export function updatePhase(params: UpdatePhaseParams): UpdatePhaseResult {
|
|
45
|
+
const result: UpdatePhaseResult = {
|
|
46
|
+
success: false,
|
|
47
|
+
message: "",
|
|
48
|
+
phaseId: null,
|
|
49
|
+
previousStatus: null,
|
|
50
|
+
newStatus: null,
|
|
51
|
+
startedAt: null,
|
|
52
|
+
finishAt: null,
|
|
53
|
+
errors: []
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
// Validate parameters
|
|
58
|
+
if (!params.phase_id || params.phase_id.trim() === "") {
|
|
59
|
+
result.errors.push("Phase ID is required");
|
|
60
|
+
result.message = "Failed to update phase: phase_id is required";
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!params.status) {
|
|
65
|
+
result.errors.push("Status is required");
|
|
66
|
+
result.message = "Failed to update phase: status is required";
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const validStatuses: PhaseStatus[] = ["pending", "in_progress", "done", "removed"];
|
|
71
|
+
if (!validStatuses.includes(params.status)) {
|
|
72
|
+
result.errors.push(`Invalid status: ${params.status}. Must be one of: ${validStatuses.join(", ")}`);
|
|
73
|
+
result.message = "Failed to update phase: invalid status";
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Get active run
|
|
78
|
+
const state = readState();
|
|
79
|
+
if (!state.active_run_id) {
|
|
80
|
+
result.errors.push("No active run");
|
|
81
|
+
result.message = "Failed to update phase: no active mission run";
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Read run.json
|
|
86
|
+
const run = readRun(state.active_run_id);
|
|
87
|
+
if (!run) {
|
|
88
|
+
result.errors.push(`Run not found: ${state.active_run_id}`);
|
|
89
|
+
result.message = "Failed to update phase: run not found";
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Find phase
|
|
94
|
+
const phase = findPhase(run, params.phase_id.trim());
|
|
95
|
+
if (!phase) {
|
|
96
|
+
result.errors.push(`Phase not found: ${params.phase_id}`);
|
|
97
|
+
result.message = "Failed to update phase: phase not found";
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Capture previous status
|
|
102
|
+
result.previousStatus = phase.status;
|
|
103
|
+
result.phaseId = phase.id;
|
|
104
|
+
|
|
105
|
+
// Calculate timestamp updates
|
|
106
|
+
const updates: Partial<typeof phase> = {
|
|
107
|
+
status: params.status
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const now = getTimestamp();
|
|
111
|
+
|
|
112
|
+
// Set started_at when transitioning to in_progress
|
|
113
|
+
if (params.status === "in_progress" && phase.status !== "in_progress") {
|
|
114
|
+
updates.started_at = now;
|
|
115
|
+
result.startedAt = now;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Set finish_at when transitioning to terminal states
|
|
119
|
+
const terminalStatuses: PhaseStatus[] = ["done", "removed"];
|
|
120
|
+
if (terminalStatuses.includes(params.status) && !terminalStatuses.includes(phase.status)) {
|
|
121
|
+
updates.finish_at = now;
|
|
122
|
+
result.finishAt = now;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Update run
|
|
126
|
+
const updatedRun = updatePhaseInRun(run, phase.id, updates);
|
|
127
|
+
writeRun(updatedRun);
|
|
128
|
+
|
|
129
|
+
result.success = true;
|
|
130
|
+
result.newStatus = params.status;
|
|
131
|
+
result.message = `Phase ${phase.id} updated: ${phase.status} → ${params.status}`;
|
|
132
|
+
|
|
133
|
+
} catch (error) {
|
|
134
|
+
result.success = false;
|
|
135
|
+
result.message = `Error updating phase: ${error instanceof Error ? error.message : String(error)}`;
|
|
136
|
+
result.errors.push(String(error));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* update_task tool
|
|
3
|
+
*
|
|
4
|
+
* Agent tool to update a task's status.
|
|
5
|
+
* Auto-sets started_at when transitioning to "in_progress".
|
|
6
|
+
* Auto-sets finish_at when transitioning to "done", "failed", or "removed".
|
|
7
|
+
*
|
|
8
|
+
* Used by: mission-orchestrator skill
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
readState,
|
|
13
|
+
readRun,
|
|
14
|
+
writeRun,
|
|
15
|
+
findTask,
|
|
16
|
+
updateTaskInRun,
|
|
17
|
+
getTimestamp,
|
|
18
|
+
TaskStatus
|
|
19
|
+
} from "../state.js";
|
|
20
|
+
|
|
21
|
+
export interface UpdateTaskParams {
|
|
22
|
+
task_id: string;
|
|
23
|
+
status: TaskStatus;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface UpdateTaskResult {
|
|
27
|
+
success: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
taskId: string | null;
|
|
30
|
+
phaseId: string | null;
|
|
31
|
+
previousStatus: TaskStatus | null;
|
|
32
|
+
newStatus: TaskStatus | null;
|
|
33
|
+
startedAt: string | null;
|
|
34
|
+
finishAt: string | null;
|
|
35
|
+
errors: string[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Update a task's status in the active mission run
|
|
40
|
+
*
|
|
41
|
+
* @param params.task_id - ID of the task to update (e.g., "phase1-task1")
|
|
42
|
+
* @param params.status - New status ("pending" | "in_progress" | "done" | "failed" | "removed")
|
|
43
|
+
* @returns Result with updated task info
|
|
44
|
+
*/
|
|
45
|
+
export function updateTask(params: UpdateTaskParams): UpdateTaskResult {
|
|
46
|
+
const result: UpdateTaskResult = {
|
|
47
|
+
success: false,
|
|
48
|
+
message: "",
|
|
49
|
+
taskId: null,
|
|
50
|
+
phaseId: null,
|
|
51
|
+
previousStatus: null,
|
|
52
|
+
newStatus: null,
|
|
53
|
+
startedAt: null,
|
|
54
|
+
finishAt: null,
|
|
55
|
+
errors: []
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// Validate parameters
|
|
60
|
+
if (!params.task_id || params.task_id.trim() === "") {
|
|
61
|
+
result.errors.push("Task ID is required");
|
|
62
|
+
result.message = "Failed to update task: task_id is required";
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (!params.status) {
|
|
67
|
+
result.errors.push("Status is required");
|
|
68
|
+
result.message = "Failed to update task: status is required";
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const validStatuses: TaskStatus[] = ["pending", "in_progress", "done", "failed", "removed"];
|
|
73
|
+
if (!validStatuses.includes(params.status)) {
|
|
74
|
+
result.errors.push(`Invalid status: ${params.status}. Must be one of: ${validStatuses.join(", ")}`);
|
|
75
|
+
result.message = "Failed to update task: invalid status";
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Get active run
|
|
80
|
+
const state = readState();
|
|
81
|
+
if (!state.active_run_id) {
|
|
82
|
+
result.errors.push("No active run");
|
|
83
|
+
result.message = "Failed to update task: no active mission run";
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Read run.json
|
|
88
|
+
const run = readRun(state.active_run_id);
|
|
89
|
+
if (!run) {
|
|
90
|
+
result.errors.push(`Run not found: ${state.active_run_id}`);
|
|
91
|
+
result.message = "Failed to update task: run not found";
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Find task
|
|
96
|
+
const taskInfo = findTask(run, params.task_id.trim());
|
|
97
|
+
if (!taskInfo) {
|
|
98
|
+
result.errors.push(`Task not found: ${params.task_id}`);
|
|
99
|
+
result.message = "Failed to update task: task not found";
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const { task, phase } = taskInfo;
|
|
104
|
+
|
|
105
|
+
// Capture previous status
|
|
106
|
+
result.previousStatus = task.status;
|
|
107
|
+
result.taskId = task.id;
|
|
108
|
+
result.phaseId = phase.id;
|
|
109
|
+
|
|
110
|
+
// Calculate timestamp updates
|
|
111
|
+
const updates: Partial<typeof task> = {
|
|
112
|
+
status: params.status
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const now = getTimestamp();
|
|
116
|
+
|
|
117
|
+
// Set started_at when transitioning to in_progress
|
|
118
|
+
if (params.status === "in_progress" && task.status !== "in_progress") {
|
|
119
|
+
updates.started_at = now;
|
|
120
|
+
result.startedAt = now;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Set finish_at when transitioning to terminal states
|
|
124
|
+
const terminalStatuses: TaskStatus[] = ["done", "failed", "removed"];
|
|
125
|
+
if (terminalStatuses.includes(params.status) && !terminalStatuses.includes(task.status)) {
|
|
126
|
+
updates.finish_at = now;
|
|
127
|
+
result.finishAt = now;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Update run
|
|
131
|
+
const updatedRun = updateTaskInRun(run, task.id, updates);
|
|
132
|
+
writeRun(updatedRun);
|
|
133
|
+
|
|
134
|
+
result.success = true;
|
|
135
|
+
result.newStatus = params.status;
|
|
136
|
+
result.message = `Task ${task.id} updated: ${task.status} → ${params.status}`;
|
|
137
|
+
|
|
138
|
+
} catch (error) {
|
|
139
|
+
result.success = false;
|
|
140
|
+
result.message = `Error updating task: ${error instanceof Error ? error.message : String(error)}`;
|
|
141
|
+
result.errors.push(String(error));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return result;
|
|
145
|
+
}
|