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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Mission Control TUI Components
3
+ *
4
+ * Exports all TUI components for the Mission Control dashboard.
5
+ */
6
+ // Individual components
7
+ export { HeaderComponent, renderHeader, formatElapsedTime } from "./header.js";
8
+ export { PhasesPanelComponent, renderPhasesPanel } from "./phases-panel.js";
9
+ export { TasksPanelComponent, renderTasksPanel } from "./tasks-panel.js";
10
+ export { ProgressBarComponent, renderProgressBarComponent } from "./progress-bar.js";
11
+ export { PastRunsComponent, renderPastRuns, extractPastRuns } from "./past-runs.js";
12
+ export { IdleViewComponent, renderIdleView } from "./idle-view.js";
13
+ // Main dashboard
14
+ export { MissionDashboard, openMissionControl } from "./dashboard.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tui/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAwB;AACxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Mission Control TUI Past Runs List
3
+ *
4
+ * Displays archived/completed runs in idle state:
5
+ * - Run ID with date
6
+ * - Status color
7
+ * - Completion percentage
8
+ * - Keyboard selection
9
+ */
10
+ import type { Theme } from "@mariozechner/pi-coding-agent";
11
+ import type { Run, RunStatus } from "../state.js";
12
+ export interface PastRunItem {
13
+ runId: string;
14
+ status: RunStatus;
15
+ startedAt: string;
16
+ completedTasks: number;
17
+ totalTasks: number;
18
+ durationSeconds?: number;
19
+ }
20
+ export interface PastRunsProps {
21
+ runs: PastRunItem[];
22
+ selectedIndex: number;
23
+ }
24
+ /**
25
+ * Extract runs from Run objects
26
+ */
27
+ export declare function extractPastRuns(runs: Run[]): PastRunItem[];
28
+ /**
29
+ * Render the past runs list
30
+ */
31
+ export declare function renderPastRuns(width: number, height: number, props: PastRunsProps, theme: Theme): string[];
32
+ /**
33
+ * Past runs component class
34
+ */
35
+ export declare class PastRunsComponent {
36
+ private props;
37
+ private cachedWidth?;
38
+ private cachedHeight?;
39
+ private cachedLines?;
40
+ constructor(runs?: PastRunItem[]);
41
+ updateRuns(runs: PastRunItem[], selectedIndex?: number): void;
42
+ getSelectedIndex(): number;
43
+ getSelectedRun(): PastRunItem | undefined;
44
+ navigateUp(): void;
45
+ navigateDown(): void;
46
+ render(width: number, height: number, theme: Theme): string[];
47
+ invalidate(): void;
48
+ }
49
+ //# sourceMappingURL=past-runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"past-runs.d.ts","sourceRoot":"","sources":["../../src/tui/past-runs.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOlD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AA0CD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAgC1D;AAqCD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,KAAK,GACX,MAAM,EAAE,CA0CV;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAEnB,IAAI,GAAE,WAAW,EAAO;IAOpC,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAU7D,gBAAgB,IAAI,MAAM;IAI1B,cAAc,IAAI,WAAW,GAAG,SAAS;IAIzC,UAAU,IAAI,IAAI;IAOlB,YAAY,IAAI,IAAI;IAOpB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAW7D,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Mission Control TUI Past Runs List
3
+ *
4
+ * Displays archived/completed runs in idle state:
5
+ * - Run ID with date
6
+ * - Status color
7
+ * - Completion percentage
8
+ * - Keyboard selection
9
+ */
10
+ import { truncateToWidth } from "@mariozechner/pi-tui";
11
+ import { missionSuccess, missionWarning } from "./styles.js";
12
+ const ICON_SELECTED = "> ";
13
+ const ICON_UNSELECTED = " ";
14
+ /**
15
+ * Apply Mission Control status colors for past runs.
16
+ */
17
+ function styleStatus(status, text, theme) {
18
+ switch (status) {
19
+ case "done": return missionSuccess(text);
20
+ case "failed": return theme.fg("error", text);
21
+ case "in_progress": return missionWarning(text);
22
+ case "paused": return missionWarning(text);
23
+ default: return theme.fg("muted", text);
24
+ }
25
+ }
26
+ /**
27
+ * Format date as numeric Y-M-D 24h format
28
+ */
29
+ function formatDate(isoDate) {
30
+ try {
31
+ const date = new Date(isoDate);
32
+ const y = date.getFullYear();
33
+ const m = (date.getMonth() + 1).toString().padStart(2, "0");
34
+ const d = date.getDate().toString().padStart(2, "0");
35
+ const h = date.getHours().toString().padStart(2, "0");
36
+ const min = date.getMinutes().toString().padStart(2, "0");
37
+ return `${y}-${m}-${d} ${h}:${min}`;
38
+ }
39
+ catch {
40
+ return isoDate;
41
+ }
42
+ }
43
+ /**
44
+ * Format duration in HH:MM:SS
45
+ */
46
+ function formatDuration(seconds) {
47
+ const h = Math.floor(seconds / 3600).toString().padStart(2, "0");
48
+ const m = Math.floor((seconds % 3600) / 60).toString().padStart(2, "0");
49
+ const s = (seconds % 60).toString().padStart(2, "0");
50
+ return `${h}:${m}:${s}`;
51
+ }
52
+ /**
53
+ * Extract runs from Run objects
54
+ */
55
+ export function extractPastRuns(runs) {
56
+ return runs.map(run => {
57
+ let completed = 0;
58
+ let total = 0;
59
+ for (const phase of run.phases) {
60
+ for (const task of phase.tasks) {
61
+ if (task.status === "removed")
62
+ continue;
63
+ total++;
64
+ if (task.status === "done") {
65
+ completed++;
66
+ }
67
+ }
68
+ }
69
+ // Calculate duration if run has finished
70
+ let durationSeconds;
71
+ if (run.finish_at) {
72
+ const start = new Date(run.started_at).getTime();
73
+ const end = new Date(run.finish_at).getTime();
74
+ durationSeconds = Math.round((end - start) / 1000);
75
+ }
76
+ return {
77
+ runId: run.run_id,
78
+ status: run.status,
79
+ startedAt: run.started_at,
80
+ completedTasks: completed,
81
+ totalTasks: total,
82
+ durationSeconds
83
+ };
84
+ }).sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime());
85
+ }
86
+ /**
87
+ * Render a single past run line
88
+ * Format: "> run-id (YYYY-MM-DD HH:MM) [duration] 45% (5/11)"
89
+ */
90
+ function renderPastRunLine(run, index, selectedIndex, width, theme) {
91
+ const isSelected = index === selectedIndex;
92
+ const date = formatDate(run.startedAt);
93
+ const percent = run.totalTasks > 0
94
+ ? Math.round((run.completedTasks / run.totalTasks) * 100)
95
+ : 0;
96
+ // Include duration if available
97
+ const durationStr = run.durationSeconds ? ` [${formatDuration(run.durationSeconds)}]` : "";
98
+ const selectIndicator = isSelected ? ICON_SELECTED : ICON_UNSELECTED;
99
+ const baseText = `${selectIndicator}${run.runId} (${date})${durationStr} ${percent}% (${run.completedTasks}/${run.totalTasks})`;
100
+ // Apply styling
101
+ let styled;
102
+ if (isSelected) {
103
+ styled = theme.fg("text", theme.bold(baseText));
104
+ }
105
+ else {
106
+ styled = styleStatus(run.status, baseText, theme);
107
+ }
108
+ return truncateToWidth(styled, width);
109
+ }
110
+ /**
111
+ * Render the past runs list
112
+ */
113
+ export function renderPastRuns(width, height, props, theme) {
114
+ const { runs, selectedIndex } = props;
115
+ const lines = [];
116
+ // Header
117
+ const header = theme.fg("text", theme.bold("PAST RUNS"));
118
+ lines.push(truncateToWidth(header, width));
119
+ lines.push(""); // spacer
120
+ if (runs.length === 0) {
121
+ const emptyMsg = theme.fg("muted", " No past runs");
122
+ lines.push(truncateToWidth(emptyMsg, width));
123
+ }
124
+ else {
125
+ // Calculate visible range
126
+ const availableHeight = height - 2;
127
+ let startIdx = 0;
128
+ let endIdx = runs.length;
129
+ if (runs.length > availableHeight) {
130
+ const halfHeight = Math.floor(availableHeight / 2);
131
+ startIdx = Math.max(0, selectedIndex - halfHeight);
132
+ endIdx = Math.min(runs.length, startIdx + availableHeight);
133
+ if (endIdx - startIdx < availableHeight) {
134
+ startIdx = Math.max(0, endIdx - availableHeight);
135
+ }
136
+ }
137
+ // Render visible runs
138
+ for (let i = startIdx; i < endIdx; i++) {
139
+ const run = runs[i];
140
+ const line = renderPastRunLine(run, i, selectedIndex, width, theme);
141
+ lines.push(line);
142
+ }
143
+ }
144
+ // Pad to height
145
+ while (lines.length < height) {
146
+ lines.push("");
147
+ }
148
+ return lines.slice(0, height);
149
+ }
150
+ /**
151
+ * Past runs component class
152
+ */
153
+ export class PastRunsComponent {
154
+ props;
155
+ cachedWidth;
156
+ cachedHeight;
157
+ cachedLines;
158
+ constructor(runs = []) {
159
+ this.props = {
160
+ runs,
161
+ selectedIndex: 0
162
+ };
163
+ }
164
+ updateRuns(runs, selectedIndex) {
165
+ this.props.runs = runs;
166
+ if (selectedIndex !== undefined) {
167
+ this.props.selectedIndex = Math.max(0, Math.min(selectedIndex, runs.length - 1));
168
+ }
169
+ else if (this.props.selectedIndex >= runs.length && runs.length > 0) {
170
+ this.props.selectedIndex = runs.length - 1;
171
+ }
172
+ this.invalidate();
173
+ }
174
+ getSelectedIndex() {
175
+ return this.props.selectedIndex;
176
+ }
177
+ getSelectedRun() {
178
+ return this.props.runs[this.props.selectedIndex];
179
+ }
180
+ navigateUp() {
181
+ if (this.props.selectedIndex > 0) {
182
+ this.props.selectedIndex--;
183
+ this.invalidate();
184
+ }
185
+ }
186
+ navigateDown() {
187
+ if (this.props.selectedIndex < this.props.runs.length - 1) {
188
+ this.props.selectedIndex++;
189
+ this.invalidate();
190
+ }
191
+ }
192
+ render(width, height, theme) {
193
+ if (this.cachedLines && this.cachedWidth === width && this.cachedHeight === height) {
194
+ return this.cachedLines;
195
+ }
196
+ this.cachedLines = renderPastRuns(width, height, this.props, theme);
197
+ this.cachedWidth = width;
198
+ this.cachedHeight = height;
199
+ return this.cachedLines;
200
+ }
201
+ invalidate() {
202
+ this.cachedWidth = undefined;
203
+ this.cachedHeight = undefined;
204
+ this.cachedLines = undefined;
205
+ }
206
+ }
207
+ //# sourceMappingURL=past-runs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"past-runs.js","sourceRoot":"","sources":["../../src/tui/past-runs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Mission Control TUI Phases Panel
3
+ *
4
+ * Left panel displaying:
5
+ * - List of phases with status icons
6
+ * - Navigation indicator (arrow) for selected phase
7
+ * - Keyboard navigation support
8
+ *
9
+ * Icons (Nerd Font):
10
+ * - Done: \uf058 (󰗠) check
11
+ * - In Progress: \uf192 () dot-circle
12
+ * - Pending: \uf096 (󰄱) empty box
13
+ * - Selected: \uf054 (󰁔) arrow
14
+ */
15
+ import type { Theme } from "@mariozechner/pi-coding-agent";
16
+ import type { Phase } from "../state.js";
17
+ export interface PhasesPanelProps {
18
+ phases: Phase[];
19
+ selectedIndex: number;
20
+ focused: boolean;
21
+ }
22
+ /**
23
+ * Render the phases panel
24
+ */
25
+ export declare function renderPhasesPanel(width: number, height: number, props: PhasesPanelProps, theme: Theme): string[];
26
+ /**
27
+ * Phases panel component class
28
+ */
29
+ export declare class PhasesPanelComponent {
30
+ private props;
31
+ private cachedWidth?;
32
+ private cachedHeight?;
33
+ private cachedLines?;
34
+ constructor(phases?: Phase[], focused?: boolean);
35
+ update(phases: Phase[], selectedIndex?: number): void;
36
+ setFocused(focused: boolean): void;
37
+ isFocused(): boolean;
38
+ getSelectedIndex(): number;
39
+ getSelectedPhase(): Phase | undefined;
40
+ navigateUp(): void;
41
+ navigateDown(): void;
42
+ selectFirstInProgress(): void;
43
+ render(width: number, height: number, theme: Theme): string[];
44
+ invalidate(): void;
45
+ }
46
+ //# sourceMappingURL=phases-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases-panel.d.ts","sourceRoot":"","sources":["../../src/tui/phases-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAsCD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,MAAM,EAAE,CA2CV;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAEnB,MAAM,GAAE,KAAK,EAAO,EAAE,OAAO,UAAQ;IAQjD,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAWrD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKlC,SAAS,IAAI,OAAO;IAIpB,gBAAgB,IAAI,MAAM;IAI1B,gBAAgB,IAAI,KAAK,GAAG,SAAS;IAIrC,UAAU,IAAI,IAAI;IAOlB,YAAY,IAAI,IAAI;IAOpB,qBAAqB,IAAI,IAAI;IAQ7B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAW7D,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Mission Control TUI Phases Panel
3
+ *
4
+ * Left panel displaying:
5
+ * - List of phases with status icons
6
+ * - Navigation indicator (arrow) for selected phase
7
+ * - Keyboard navigation support
8
+ *
9
+ * Icons (Nerd Font):
10
+ * - Done: \uf058 (󰗠) check
11
+ * - In Progress: \uf192 () dot-circle
12
+ * - Pending: \uf096 (󰄱) empty box
13
+ * - Selected: \uf054 (󰁔) arrow
14
+ */
15
+ import { truncateToWidth } from "@mariozechner/pi-tui";
16
+ import { missionSuccess, missionWarning, strike } from "./styles.js";
17
+ /**
18
+ * Render a single phase line
19
+ * Styling: selected=white bold, running=orange/warning, unselected non-running=gray/muted
20
+ */
21
+ function renderPhaseLine(phase, index, selectedIndex, width, theme, focused) {
22
+ const isSelected = index === selectedIndex;
23
+ const isRunning = phase.status === "in_progress";
24
+ const baseText = `Phase ${index + 1}: ${phase.name}`;
25
+ let styled;
26
+ if (phase.status === "removed") {
27
+ const removedText = strike(baseText);
28
+ styled = isSelected && focused
29
+ ? theme.fg("text", theme.bold(removedText))
30
+ : theme.fg("muted", removedText);
31
+ }
32
+ else if (isSelected && focused) {
33
+ styled = theme.fg("text", theme.bold(baseText));
34
+ }
35
+ else if (isRunning) {
36
+ styled = missionWarning(baseText);
37
+ }
38
+ else if (phase.status === "done") {
39
+ styled = missionSuccess(baseText);
40
+ }
41
+ else {
42
+ styled = theme.fg("muted", baseText);
43
+ }
44
+ // Truncate to fit
45
+ return truncateToWidth(styled, width);
46
+ }
47
+ /**
48
+ * Render the phases panel
49
+ */
50
+ export function renderPhasesPanel(width, height, props, theme) {
51
+ const { phases, selectedIndex, focused } = props;
52
+ const lines = [];
53
+ // Header
54
+ const header = theme.fg("text", theme.bold("PHASES"));
55
+ lines.push(truncateToWidth(header, width));
56
+ if (phases.length === 0) {
57
+ const emptyMsg = theme.fg("muted", " No phases yet");
58
+ lines.push(truncateToWidth(emptyMsg, width));
59
+ }
60
+ else {
61
+ // Calculate visible range if list is taller than available height
62
+ const availableHeight = height - 1;
63
+ let startIdx = 0;
64
+ let endIdx = phases.length;
65
+ if (phases.length > availableHeight) {
66
+ // Scroll to keep selected item visible
67
+ const halfHeight = Math.floor(availableHeight / 2);
68
+ startIdx = Math.max(0, selectedIndex - halfHeight);
69
+ endIdx = Math.min(phases.length, startIdx + availableHeight);
70
+ // Adjust start if we're near the end
71
+ if (endIdx - startIdx < availableHeight) {
72
+ startIdx = Math.max(0, endIdx - availableHeight);
73
+ }
74
+ }
75
+ // Render visible phases
76
+ for (let i = startIdx; i < endIdx; i++) {
77
+ const phase = phases[i];
78
+ const line = renderPhaseLine(phase, i, selectedIndex, width, theme, focused);
79
+ lines.push(line);
80
+ }
81
+ }
82
+ // Pad to height
83
+ while (lines.length < height) {
84
+ lines.push("");
85
+ }
86
+ return lines.slice(0, height);
87
+ }
88
+ /**
89
+ * Phases panel component class
90
+ */
91
+ export class PhasesPanelComponent {
92
+ props;
93
+ cachedWidth;
94
+ cachedHeight;
95
+ cachedLines;
96
+ constructor(phases = [], focused = false) {
97
+ this.props = {
98
+ phases,
99
+ selectedIndex: 0,
100
+ focused
101
+ };
102
+ }
103
+ update(phases, selectedIndex) {
104
+ this.props.phases = phases;
105
+ if (selectedIndex !== undefined) {
106
+ // Clamp to valid range
107
+ this.props.selectedIndex = Math.max(0, Math.min(selectedIndex, phases.length - 1));
108
+ }
109
+ else if (this.props.selectedIndex >= phases.length && phases.length > 0) {
110
+ this.props.selectedIndex = phases.length - 1;
111
+ }
112
+ this.invalidate();
113
+ }
114
+ setFocused(focused) {
115
+ this.props.focused = focused;
116
+ this.invalidate();
117
+ }
118
+ isFocused() {
119
+ return this.props.focused;
120
+ }
121
+ getSelectedIndex() {
122
+ return this.props.selectedIndex;
123
+ }
124
+ getSelectedPhase() {
125
+ return this.props.phases[this.props.selectedIndex];
126
+ }
127
+ navigateUp() {
128
+ if (this.props.selectedIndex > 0) {
129
+ this.props.selectedIndex--;
130
+ this.invalidate();
131
+ }
132
+ }
133
+ navigateDown() {
134
+ if (this.props.selectedIndex < this.props.phases.length - 1) {
135
+ this.props.selectedIndex++;
136
+ this.invalidate();
137
+ }
138
+ }
139
+ selectFirstInProgress() {
140
+ const idx = this.props.phases.findIndex(p => p.status === "in_progress");
141
+ if (idx !== -1) {
142
+ this.props.selectedIndex = idx;
143
+ this.invalidate();
144
+ }
145
+ }
146
+ render(width, height, theme) {
147
+ if (this.cachedLines && this.cachedWidth === width && this.cachedHeight === height) {
148
+ return this.cachedLines;
149
+ }
150
+ this.cachedLines = renderPhasesPanel(width, height, this.props, theme);
151
+ this.cachedWidth = width;
152
+ this.cachedHeight = height;
153
+ return this.cachedLines;
154
+ }
155
+ invalidate() {
156
+ this.cachedWidth = undefined;
157
+ this.cachedHeight = undefined;
158
+ this.cachedLines = undefined;
159
+ }
160
+ }
161
+ //# sourceMappingURL=phases-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases-panel.js","sourceRoot":"","sources":["../../src/tui/phases-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Mission Control TUI Progress Bar
3
+ *
4
+ * Bottom bar displaying:
5
+ * - Visual progress bar using block characters
6
+ * - Percentage completion
7
+ * - Task count (completed/total)
8
+ *
9
+ * Block characters for progress bar:
10
+ * - Full: \u2588 (█)
11
+ * - Empty: \u2591 (░)
12
+ */
13
+ import type { Theme } from "@mariozechner/pi-coding-agent";
14
+ import type { Run } from "../state.js";
15
+ export interface ProgressBarProps {
16
+ run: Run | null;
17
+ statusMessage: string;
18
+ }
19
+ /**
20
+ * Render the progress bar component
21
+ */
22
+ export declare function renderProgressBarComponent(width: number, props: ProgressBarProps, theme: Theme): string[];
23
+ /**
24
+ * Progress bar component class
25
+ */
26
+ export declare class ProgressBarComponent {
27
+ private props;
28
+ private cachedWidth?;
29
+ private cachedLines?;
30
+ constructor(run?: Run | null, statusMessage?: string);
31
+ update(run: Run | null, statusMessage?: string): void;
32
+ updateStatus(message: string): void;
33
+ getCompletionPercent(): number;
34
+ render(width: number, theme: Theme): string[];
35
+ invalidate(): void;
36
+ }
37
+ //# sourceMappingURL=progress-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-bar.d.ts","sourceRoot":"","sources":["../../src/tui/progress-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAOvC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAuCD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,KAAK,GACX,MAAM,EAAE,CAoBV;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAEnB,GAAG,GAAE,GAAG,GAAG,IAAW,EAAE,aAAa,SAAK;IAItD,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAQrD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,oBAAoB,IAAI,MAAM;IAoB9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAU7C,UAAU,IAAI,IAAI;CAInB"}