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,129 @@
1
+ /**
2
+ * mission_scaffold tool
3
+ *
4
+ * First-time setup tool - copies bundled worker/auditor agents and skills
5
+ * into project .pi dirs and creates mission-control directory structure.
6
+ *
7
+ * This is a command-only tool (not exposed to agents).
8
+ */
9
+ import * as path from "path";
10
+ import * as fs from "fs";
11
+ import { fileURLToPath } from "url";
12
+ import { getProjectRoot, getMissionControlDir, getMemoryDir, getRunsDir, ensureDir, copyDir, fileExists, writeJson, defaultState } from "../state.js";
13
+ const packageRoot = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
14
+ /**
15
+ * Get the bundled agents directory path (within the npm package)
16
+ */
17
+ function getBundledAgentsDir() {
18
+ return path.join(packageRoot, "agents");
19
+ }
20
+ /**
21
+ * Get the bundled skills directory path (within the npm package)
22
+ */
23
+ function getBundledSkillsDir() {
24
+ return path.join(packageRoot, "skills");
25
+ }
26
+ /**
27
+ * Get the bundled templates directory path (within the npm package)
28
+ */
29
+ function getBundledTemplatesDir() {
30
+ return path.join(packageRoot, "templates");
31
+ }
32
+ /**
33
+ * Get target paths in the project
34
+ */
35
+ function getTargetPaths() {
36
+ const projectRoot = getProjectRoot();
37
+ return {
38
+ agents: path.join(projectRoot, ".pi", "agents"),
39
+ skills: path.join(projectRoot, ".pi", "skills"),
40
+ missionControl: getMissionControlDir(),
41
+ memory: getMemoryDir(),
42
+ runs: getRunsDir()
43
+ };
44
+ }
45
+ /**
46
+ * Scaffold the mission-control environment
47
+ *
48
+ * Copies bundled worker/auditor agents and skills to project .pi dirs and creates
49
+ * the mission-control directory structure. Non-destructive -
50
+ * skips existing files rather than overwriting.
51
+ */
52
+ export function missionScaffold() {
53
+ const result = {
54
+ success: true,
55
+ message: "",
56
+ created: [],
57
+ skipped: [],
58
+ errors: []
59
+ };
60
+ try {
61
+ const bundledDirs = {
62
+ agents: getBundledAgentsDir(),
63
+ skills: getBundledSkillsDir(),
64
+ templates: getBundledTemplatesDir()
65
+ };
66
+ const targetPaths = getTargetPaths();
67
+ // Verify bundled directories exist
68
+ for (const [name, dirPath] of Object.entries(bundledDirs)) {
69
+ if (!fileExists(dirPath)) {
70
+ result.errors.push(`Bundled ${name} directory not found: ${dirPath}`);
71
+ }
72
+ }
73
+ if (result.errors.length > 0) {
74
+ result.success = false;
75
+ result.message = "Scaffolding failed: bundled resources not found";
76
+ return result;
77
+ }
78
+ // Create base directory structure
79
+ ensureDir(targetPaths.missionControl);
80
+ ensureDir(targetPaths.memory);
81
+ ensureDir(targetPaths.runs);
82
+ result.created.push(".pi/mission-control/");
83
+ result.created.push(".pi/mission-control/memory/");
84
+ result.created.push(".pi/mission-control/runs/");
85
+ // Create state.json if it doesn't exist
86
+ const statePath = path.join(targetPaths.missionControl, "state.json");
87
+ if (!fileExists(statePath)) {
88
+ writeJson(statePath, defaultState);
89
+ result.created.push(".pi/mission-control/state.json");
90
+ }
91
+ else {
92
+ result.skipped.push(".pi/mission-control/state.json (already exists)");
93
+ }
94
+ // Copy worker/auditor agents (skip existing files)
95
+ const agentsCopied = copyDir(bundledDirs.agents, targetPaths.agents, true);
96
+ if (agentsCopied > 0) {
97
+ result.created.push(`.pi/agents/ (${agentsCopied} files copied)`);
98
+ }
99
+ else {
100
+ result.skipped.push(".pi/agents/ (all files already exist)");
101
+ }
102
+ // Copy skills (skip existing files)
103
+ const skillsCopied = copyDir(bundledDirs.skills, targetPaths.skills, true);
104
+ if (skillsCopied > 0) {
105
+ result.created.push(`.pi/skills/ (${skillsCopied} files copied)`);
106
+ }
107
+ else {
108
+ result.skipped.push(".pi/skills/ (all files already exist)");
109
+ }
110
+ // Create long_term.md if it doesn't exist
111
+ const longTermPath = path.join(targetPaths.memory, "long_term.md");
112
+ if (!fileExists(longTermPath)) {
113
+ fs.writeFileSync(longTermPath, "# Long-term Memory\n\nDistilled knowledge from past missions.\n\n## Repo Conventions\n\n## Tooling Quirks\n\n## Architecture Decisions\n\n## Common Failures\n\n## Performance Notes\n", "utf-8");
114
+ result.created.push(".pi/mission-control/memory/long_term.md");
115
+ }
116
+ else {
117
+ result.skipped.push(".pi/mission-control/memory/long_term.md (already exists)");
118
+ }
119
+ result.success = true;
120
+ result.message = "Mission Control scaffolding complete";
121
+ }
122
+ catch (error) {
123
+ result.success = false;
124
+ result.message = `Scaffolding error: ${error instanceof Error ? error.message : String(error)}`;
125
+ result.errors.push(String(error));
126
+ }
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
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
+ import { PhaseStatus } from "../state.js";
11
+ export interface UpdatePhaseParams {
12
+ phase_id: string;
13
+ status: PhaseStatus;
14
+ }
15
+ export interface UpdatePhaseResult {
16
+ success: boolean;
17
+ message: string;
18
+ phaseId: string | null;
19
+ previousStatus: PhaseStatus | null;
20
+ newStatus: PhaseStatus | null;
21
+ startedAt: string | null;
22
+ finishAt: string | null;
23
+ errors: string[];
24
+ }
25
+ /**
26
+ * Update a phase's status in the active mission run
27
+ *
28
+ * @param params.phase_id - ID of the phase to update
29
+ * @param params.status - New status ("pending" | "in_progress" | "done" | "removed")
30
+ * @returns Result with updated phase info
31
+ */
32
+ export declare function updatePhase(params: UpdatePhaseParams): UpdatePhaseResult;
33
+ //# sourceMappingURL=update-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-phase.d.ts","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAOL,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAgGxE"}
@@ -0,0 +1,101 @@
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
+ import { readState, readRun, writeRun, findPhase, updatePhaseInRun, getTimestamp } from "../state.js";
11
+ /**
12
+ * Update a phase's status in the active mission run
13
+ *
14
+ * @param params.phase_id - ID of the phase to update
15
+ * @param params.status - New status ("pending" | "in_progress" | "done" | "removed")
16
+ * @returns Result with updated phase info
17
+ */
18
+ export function updatePhase(params) {
19
+ const result = {
20
+ success: false,
21
+ message: "",
22
+ phaseId: null,
23
+ previousStatus: null,
24
+ newStatus: null,
25
+ startedAt: null,
26
+ finishAt: null,
27
+ errors: []
28
+ };
29
+ try {
30
+ // Validate parameters
31
+ if (!params.phase_id || params.phase_id.trim() === "") {
32
+ result.errors.push("Phase ID is required");
33
+ result.message = "Failed to update phase: phase_id is required";
34
+ return result;
35
+ }
36
+ if (!params.status) {
37
+ result.errors.push("Status is required");
38
+ result.message = "Failed to update phase: status is required";
39
+ return result;
40
+ }
41
+ const validStatuses = ["pending", "in_progress", "done", "removed"];
42
+ if (!validStatuses.includes(params.status)) {
43
+ result.errors.push(`Invalid status: ${params.status}. Must be one of: ${validStatuses.join(", ")}`);
44
+ result.message = "Failed to update phase: invalid status";
45
+ return result;
46
+ }
47
+ // Get active run
48
+ const state = readState();
49
+ if (!state.active_run_id) {
50
+ result.errors.push("No active run");
51
+ result.message = "Failed to update phase: no active mission run";
52
+ return result;
53
+ }
54
+ // Read run.json
55
+ const run = readRun(state.active_run_id);
56
+ if (!run) {
57
+ result.errors.push(`Run not found: ${state.active_run_id}`);
58
+ result.message = "Failed to update phase: run not found";
59
+ return result;
60
+ }
61
+ // Find phase
62
+ const phase = findPhase(run, params.phase_id.trim());
63
+ if (!phase) {
64
+ result.errors.push(`Phase not found: ${params.phase_id}`);
65
+ result.message = "Failed to update phase: phase not found";
66
+ return result;
67
+ }
68
+ // Capture previous status
69
+ result.previousStatus = phase.status;
70
+ result.phaseId = phase.id;
71
+ // Calculate timestamp updates
72
+ const updates = {
73
+ status: params.status
74
+ };
75
+ const now = getTimestamp();
76
+ // Set started_at when transitioning to in_progress
77
+ if (params.status === "in_progress" && phase.status !== "in_progress") {
78
+ updates.started_at = now;
79
+ result.startedAt = now;
80
+ }
81
+ // Set finish_at when transitioning to terminal states
82
+ const terminalStatuses = ["done", "removed"];
83
+ if (terminalStatuses.includes(params.status) && !terminalStatuses.includes(phase.status)) {
84
+ updates.finish_at = now;
85
+ result.finishAt = now;
86
+ }
87
+ // Update run
88
+ const updatedRun = updatePhaseInRun(run, phase.id, updates);
89
+ writeRun(updatedRun);
90
+ result.success = true;
91
+ result.newStatus = params.status;
92
+ result.message = `Phase ${phase.id} updated: ${phase.status} → ${params.status}`;
93
+ }
94
+ catch (error) {
95
+ result.success = false;
96
+ result.message = `Error updating phase: ${error instanceof Error ? error.message : String(error)}`;
97
+ result.errors.push(String(error));
98
+ }
99
+ return result;
100
+ }
101
+ //# sourceMappingURL=update-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
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
+ import { TaskStatus } from "../state.js";
11
+ export interface UpdateTaskParams {
12
+ task_id: string;
13
+ status: TaskStatus;
14
+ }
15
+ export interface UpdateTaskResult {
16
+ success: boolean;
17
+ message: string;
18
+ taskId: string | null;
19
+ phaseId: string | null;
20
+ previousStatus: TaskStatus | null;
21
+ newStatus: TaskStatus | null;
22
+ startedAt: string | null;
23
+ finishAt: string | null;
24
+ errors: string[];
25
+ }
26
+ /**
27
+ * Update a task's status in the active mission run
28
+ *
29
+ * @param params.task_id - ID of the task to update (e.g., "phase1-task1")
30
+ * @param params.status - New status ("pending" | "in_progress" | "done" | "failed" | "removed")
31
+ * @returns Result with updated task info
32
+ */
33
+ export declare function updateTask(params: UpdateTaskParams): UpdateTaskResult;
34
+ //# sourceMappingURL=update-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-task.d.ts","sourceRoot":"","sources":["../../src/tools/update-task.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAOL,UAAU,EACX,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAoGrE"}
@@ -0,0 +1,104 @@
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
+ import { readState, readRun, writeRun, findTask, updateTaskInRun, getTimestamp } from "../state.js";
11
+ /**
12
+ * Update a task's status in the active mission run
13
+ *
14
+ * @param params.task_id - ID of the task to update (e.g., "phase1-task1")
15
+ * @param params.status - New status ("pending" | "in_progress" | "done" | "failed" | "removed")
16
+ * @returns Result with updated task info
17
+ */
18
+ export function updateTask(params) {
19
+ const result = {
20
+ success: false,
21
+ message: "",
22
+ taskId: null,
23
+ phaseId: null,
24
+ previousStatus: null,
25
+ newStatus: null,
26
+ startedAt: null,
27
+ finishAt: null,
28
+ errors: []
29
+ };
30
+ try {
31
+ // Validate parameters
32
+ if (!params.task_id || params.task_id.trim() === "") {
33
+ result.errors.push("Task ID is required");
34
+ result.message = "Failed to update task: task_id is required";
35
+ return result;
36
+ }
37
+ if (!params.status) {
38
+ result.errors.push("Status is required");
39
+ result.message = "Failed to update task: status is required";
40
+ return result;
41
+ }
42
+ const validStatuses = ["pending", "in_progress", "done", "failed", "removed"];
43
+ if (!validStatuses.includes(params.status)) {
44
+ result.errors.push(`Invalid status: ${params.status}. Must be one of: ${validStatuses.join(", ")}`);
45
+ result.message = "Failed to update task: invalid status";
46
+ return result;
47
+ }
48
+ // Get active run
49
+ const state = readState();
50
+ if (!state.active_run_id) {
51
+ result.errors.push("No active run");
52
+ result.message = "Failed to update task: no active mission run";
53
+ return result;
54
+ }
55
+ // Read run.json
56
+ const run = readRun(state.active_run_id);
57
+ if (!run) {
58
+ result.errors.push(`Run not found: ${state.active_run_id}`);
59
+ result.message = "Failed to update task: run not found";
60
+ return result;
61
+ }
62
+ // Find task
63
+ const taskInfo = findTask(run, params.task_id.trim());
64
+ if (!taskInfo) {
65
+ result.errors.push(`Task not found: ${params.task_id}`);
66
+ result.message = "Failed to update task: task not found";
67
+ return result;
68
+ }
69
+ const { task, phase } = taskInfo;
70
+ // Capture previous status
71
+ result.previousStatus = task.status;
72
+ result.taskId = task.id;
73
+ result.phaseId = phase.id;
74
+ // Calculate timestamp updates
75
+ const updates = {
76
+ status: params.status
77
+ };
78
+ const now = getTimestamp();
79
+ // Set started_at when transitioning to in_progress
80
+ if (params.status === "in_progress" && task.status !== "in_progress") {
81
+ updates.started_at = now;
82
+ result.startedAt = now;
83
+ }
84
+ // Set finish_at when transitioning to terminal states
85
+ const terminalStatuses = ["done", "failed", "removed"];
86
+ if (terminalStatuses.includes(params.status) && !terminalStatuses.includes(task.status)) {
87
+ updates.finish_at = now;
88
+ result.finishAt = now;
89
+ }
90
+ // Update run
91
+ const updatedRun = updateTaskInRun(run, task.id, updates);
92
+ writeRun(updatedRun);
93
+ result.success = true;
94
+ result.newStatus = params.status;
95
+ result.message = `Task ${task.id} updated: ${task.status} → ${params.status}`;
96
+ }
97
+ catch (error) {
98
+ result.success = false;
99
+ result.message = `Error updating task: ${error instanceof Error ? error.message : String(error)}`;
100
+ result.errors.push(String(error));
101
+ }
102
+ return result;
103
+ }
104
+ //# sourceMappingURL=update-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-task.js","sourceRoot":"","sources":["../../src/tools/update-task.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,YAAY,EAEb,MAAM,aAAa,CAAC;AAmBrB;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,MAAwB;IACjD,MAAM,MAAM,GAAqB;QAC/B,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,IAAI,CAAC;QACH,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,GAAG,4CAA4C,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,GAAG,2CAA2C,CAAC;YAC7D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,aAAa,GAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC5F,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,qBAAqB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpG,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,8CAA8C,CAAC;YAChE,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,sCAAsC,CAAC;YACxD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,YAAY;QACZ,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,GAAG,uCAAuC,CAAC;YACzD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAEjC,0BAA0B;QAC1B,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;QAE1B,8BAA8B;QAC9B,MAAM,OAAO,GAAyB;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QAEF,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;QAE3B,mDAAmD;QACnD,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,IAAI,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACrE,OAAO,CAAC,UAAU,GAAG,GAAG,CAAC;YACzB,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;QACzB,CAAC;QAED,sDAAsD;QACtD,MAAM,gBAAgB,GAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxF,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;YACxB,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC;QACxB,CAAC;QAED,aAAa;QACb,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,QAAQ,CAAC,UAAU,CAAC,CAAC;QAErB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QACjC,MAAM,CAAC,OAAO,GAAG,QAAQ,IAAI,CAAC,EAAE,aAAa,IAAI,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Mission Control TUI Dashboard
3
+ *
4
+ * Main dashboard component that composes:
5
+ * - Header (run ID, timer, phase)
6
+ * - Phases panel (left)
7
+ * - Tasks panel (right)
8
+ * - Progress bar (bottom)
9
+ *
10
+ * Features:
11
+ * - Keyboard navigation (Up/Down/Left/Right)
12
+ * - Esc to close
13
+ * - Enter to init new mission when idle
14
+ * - Timed refresh for clock/file state
15
+ * - Overlay support via ctx.ui.custom(..., { overlay: true })
16
+ */
17
+ import type { Theme } from "@mariozechner/pi-coding-agent";
18
+ import type { TUI } from "@mariozechner/pi-tui";
19
+ import type { Run } from "../state.js";
20
+ type DashboardMode = "idle" | "active";
21
+ export interface DashboardProps {
22
+ onClose: () => void;
23
+ onInitMission?: () => void;
24
+ }
25
+ /**
26
+ * Mission Control Dashboard Component
27
+ *
28
+ * Usage:
29
+ * ```typescript
30
+ * const handle = ctx.ui.custom(
31
+ * (tui, theme, keybindings, done) => new MissionDashboard({ onClose: done }),
32
+ * { overlay: true }
33
+ * );
34
+ * ```
35
+ */
36
+ export declare class MissionDashboard {
37
+ private header;
38
+ private phasesPanel;
39
+ private tasksPanel;
40
+ private progressBar;
41
+ private idleView;
42
+ private pastRuns;
43
+ private mode;
44
+ private run;
45
+ private state;
46
+ private refreshInterval;
47
+ private cachedWidth?;
48
+ private cachedLines?;
49
+ private tui;
50
+ private theme;
51
+ private onClose;
52
+ private onInitMission?;
53
+ constructor(props: DashboardProps);
54
+ /**
55
+ * Start the refresh interval for clock/timer updates
56
+ */
57
+ startRefresh(tui: TUI): void;
58
+ /**
59
+ * Stop the refresh interval
60
+ */
61
+ stopRefresh(): void;
62
+ /**
63
+ * Refresh data from files
64
+ */
65
+ refreshData(): void;
66
+ /**
67
+ * Handle init mission action (Enter in idle mode)
68
+ */
69
+ private handleInitMission;
70
+ /**
71
+ * Handle keyboard input
72
+ */
73
+ handleInput(data: string): void;
74
+ /**
75
+ * Request a re-render from TUI
76
+ */
77
+ private requestRender;
78
+ /**
79
+ * Render the dashboard
80
+ */
81
+ render(width: number, theme: Theme): string[];
82
+ private renderShortcutLegend;
83
+ /**
84
+ * Render idle mode
85
+ */
86
+ private renderIdle;
87
+ /**
88
+ * Render active mode with a simple 40/60 split
89
+ */
90
+ private renderActive;
91
+ /**
92
+ * Invalidate cached render output
93
+ */
94
+ invalidate(): void;
95
+ /**
96
+ * Get current mode
97
+ */
98
+ getMode(): DashboardMode;
99
+ /**
100
+ * Get active run (if any)
101
+ */
102
+ getRun(): Run | null;
103
+ /**
104
+ * Dispose of resources
105
+ */
106
+ dispose(): void;
107
+ }
108
+ /**
109
+ * Open the Mission Control dashboard
110
+ *
111
+ * Usage in extension:
112
+ * ```typescript
113
+ * pi.registerCommand("mission", {
114
+ * handler: async (_args, ctx) => {
115
+ * const result = await ctx.ui.custom<string | null>(
116
+ * (tui, theme, _kb, done) => {
117
+ * const dashboard = new MissionDashboard({
118
+ * onClose: () => done(null),
119
+ * onInitMission: () => {
120
+ * // Trigger mission_init tool
121
+ * done("init");
122
+ * }
123
+ * });
124
+ * dashboard.startRefresh(tui);
125
+ * return dashboard;
126
+ * },
127
+ * { overlay: true }
128
+ * );
129
+ *
130
+ * if (result === "init") {
131
+ * // Handle init action
132
+ * }
133
+ * }
134
+ * });
135
+ * ```
136
+ */
137
+ export declare function openMissionControl(ctx: {
138
+ ui: {
139
+ custom: (factory: (tui: TUI, theme: Theme, keybindings: unknown, done: (result: string | null) => void) => MissionDashboard, options: {
140
+ overlay: boolean;
141
+ }) => Promise<string | null>;
142
+ notify: (message: string, type: "info" | "warning" | "error") => void;
143
+ };
144
+ }): Promise<void>;
145
+ export default MissionDashboard;
146
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/tui/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAsB,MAAM,aAAa,CAAC;AAW3D,KAAK,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IAGpC,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,KAAK,CAAsB;IAGnC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAC,CAAa;gBAEvB,KAAK,EAAE,cAAc;IAqBjC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAc5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,WAAW,IAAI,IAAI;IAgDnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAmD/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAkB7C,OAAO,CAAC,oBAAoB;IA2B5B;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsCpB;;OAEG;IACH,UAAU,IAAI,IAAI;IAYlB;;OAEG;IACH,OAAO,IAAI,aAAa;IAIxB;;OAEG;IACH,MAAM,IAAI,GAAG,GAAG,IAAI;IAIpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE;IAAE,EAAE,EAAE;QAAE,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,KAAK,gBAAgB,EAAE,OAAO,EAAE;YAAE,OAAO,EAAE,OAAO,CAAA;SAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,GAC5Q,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,eAAe,gBAAgB,CAAC"}