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.
Files changed (110) hide show
  1. package/README.md +205 -0
  2. package/agents/auditor.md +45 -0
  3. package/agents/worker.md +44 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +526 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/state.d.ts +265 -0
  9. package/dist/state.d.ts.map +1 -0
  10. package/dist/state.js +474 -0
  11. package/dist/state.js.map +1 -0
  12. package/dist/tools/add-phase.d.ts +28 -0
  13. package/dist/tools/add-phase.d.ts.map +1 -0
  14. package/dist/tools/add-phase.js +69 -0
  15. package/dist/tools/add-phase.js.map +1 -0
  16. package/dist/tools/add-task.d.ts +30 -0
  17. package/dist/tools/add-task.d.ts.map +1 -0
  18. package/dist/tools/add-task.js +85 -0
  19. package/dist/tools/add-task.js.map +1 -0
  20. package/dist/tools/index.d.ts +13 -0
  21. package/dist/tools/index.d.ts.map +1 -0
  22. package/dist/tools/index.js +16 -0
  23. package/dist/tools/index.js.map +1 -0
  24. package/dist/tools/init.d.ts +34 -0
  25. package/dist/tools/init.d.ts.map +1 -0
  26. package/dist/tools/init.js +75 -0
  27. package/dist/tools/init.js.map +1 -0
  28. package/dist/tools/mission-complete.d.ts +30 -0
  29. package/dist/tools/mission-complete.d.ts.map +1 -0
  30. package/dist/tools/mission-complete.js +85 -0
  31. package/dist/tools/mission-complete.js.map +1 -0
  32. package/dist/tools/mission-resume.d.ts +35 -0
  33. package/dist/tools/mission-resume.d.ts.map +1 -0
  34. package/dist/tools/mission-resume.js +87 -0
  35. package/dist/tools/mission-resume.js.map +1 -0
  36. package/dist/tools/scaffold.d.ts +24 -0
  37. package/dist/tools/scaffold.d.ts.map +1 -0
  38. package/dist/tools/scaffold.js +129 -0
  39. package/dist/tools/scaffold.js.map +1 -0
  40. package/dist/tools/update-phase.d.ts +33 -0
  41. package/dist/tools/update-phase.d.ts.map +1 -0
  42. package/dist/tools/update-phase.js +101 -0
  43. package/dist/tools/update-phase.js.map +1 -0
  44. package/dist/tools/update-task.d.ts +34 -0
  45. package/dist/tools/update-task.d.ts.map +1 -0
  46. package/dist/tools/update-task.js +104 -0
  47. package/dist/tools/update-task.js.map +1 -0
  48. package/dist/tui/dashboard.d.ts +146 -0
  49. package/dist/tui/dashboard.d.ts.map +1 -0
  50. package/dist/tui/dashboard.js +381 -0
  51. package/dist/tui/dashboard.js.map +1 -0
  52. package/dist/tui/header.d.ts +39 -0
  53. package/dist/tui/header.d.ts.map +1 -0
  54. package/dist/tui/header.js +62 -0
  55. package/dist/tui/header.js.map +1 -0
  56. package/dist/tui/idle-view.d.ts +44 -0
  57. package/dist/tui/idle-view.d.ts.map +1 -0
  58. package/dist/tui/idle-view.js +87 -0
  59. package/dist/tui/idle-view.js.map +1 -0
  60. package/dist/tui/index.d.ts +13 -0
  61. package/dist/tui/index.d.ts.map +1 -0
  62. package/dist/tui/index.js +15 -0
  63. package/dist/tui/index.js.map +1 -0
  64. package/dist/tui/past-runs.d.ts +49 -0
  65. package/dist/tui/past-runs.d.ts.map +1 -0
  66. package/dist/tui/past-runs.js +207 -0
  67. package/dist/tui/past-runs.js.map +1 -0
  68. package/dist/tui/phases-panel.d.ts +46 -0
  69. package/dist/tui/phases-panel.d.ts.map +1 -0
  70. package/dist/tui/phases-panel.js +161 -0
  71. package/dist/tui/phases-panel.js.map +1 -0
  72. package/dist/tui/progress-bar.d.ts +37 -0
  73. package/dist/tui/progress-bar.d.ts.map +1 -0
  74. package/dist/tui/progress-bar.js +123 -0
  75. package/dist/tui/progress-bar.js.map +1 -0
  76. package/dist/tui/styles.d.ts +8 -0
  77. package/dist/tui/styles.d.ts.map +1 -0
  78. package/dist/tui/styles.js +22 -0
  79. package/dist/tui/styles.js.map +1 -0
  80. package/dist/tui/tasks-panel.d.ts +48 -0
  81. package/dist/tui/tasks-panel.d.ts.map +1 -0
  82. package/dist/tui/tasks-panel.js +191 -0
  83. package/dist/tui/tasks-panel.js.map +1 -0
  84. package/package.json +42 -0
  85. package/skills/mission-memory/SKILL.md +88 -0
  86. package/skills/mission-orchestrator/SKILL.md +167 -0
  87. package/skills/mission-pm/SKILL.md +83 -0
  88. package/skills/mission-research/SKILL.md +66 -0
  89. package/skills/mission-tech-lead/SKILL.md +68 -0
  90. package/src/index.ts +659 -0
  91. package/src/state.ts +623 -0
  92. package/src/tools/add-phase.ts +98 -0
  93. package/src/tools/add-task.ts +121 -0
  94. package/src/tools/index.ts +18 -0
  95. package/src/tools/init.ts +109 -0
  96. package/src/tools/mission-complete.ts +118 -0
  97. package/src/tools/mission-resume.ts +119 -0
  98. package/src/tools/scaffold.ts +167 -0
  99. package/src/tools/update-phase.ts +140 -0
  100. package/src/tools/update-task.ts +145 -0
  101. package/src/tui/dashboard.ts +441 -0
  102. package/src/tui/header.ts +85 -0
  103. package/src/tui/idle-view.ts +114 -0
  104. package/src/tui/index.ts +20 -0
  105. package/src/tui/past-runs.ts +261 -0
  106. package/src/tui/phases-panel.ts +199 -0
  107. package/src/tui/progress-bar.ts +152 -0
  108. package/src/tui/styles.ts +27 -0
  109. package/src/tui/tasks-panel.ts +228 -0
  110. 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
+ }