@jonit-dev/night-watch-cli 1.2.0 → 1.3.0

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 (54) hide show
  1. package/dist/commands/dashboard/tab-actions.d.ts +10 -0
  2. package/dist/commands/dashboard/tab-actions.d.ts.map +1 -0
  3. package/dist/commands/dashboard/tab-actions.js +245 -0
  4. package/dist/commands/dashboard/tab-actions.js.map +1 -0
  5. package/dist/commands/dashboard/tab-config.d.ts +21 -0
  6. package/dist/commands/dashboard/tab-config.d.ts.map +1 -0
  7. package/dist/commands/dashboard/tab-config.js +821 -0
  8. package/dist/commands/dashboard/tab-config.js.map +1 -0
  9. package/dist/commands/dashboard/tab-logs.d.ts +10 -0
  10. package/dist/commands/dashboard/tab-logs.d.ts.map +1 -0
  11. package/dist/commands/dashboard/tab-logs.js +178 -0
  12. package/dist/commands/dashboard/tab-logs.js.map +1 -0
  13. package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
  14. package/dist/commands/dashboard/tab-schedules.d.ts.map +1 -0
  15. package/dist/commands/dashboard/tab-schedules.js +304 -0
  16. package/dist/commands/dashboard/tab-schedules.js.map +1 -0
  17. package/dist/commands/dashboard/tab-status.d.ts +32 -0
  18. package/dist/commands/dashboard/tab-status.d.ts.map +1 -0
  19. package/dist/commands/dashboard/tab-status.js +416 -0
  20. package/dist/commands/dashboard/tab-status.js.map +1 -0
  21. package/dist/commands/dashboard/types.d.ts +43 -0
  22. package/dist/commands/dashboard/types.d.ts.map +1 -0
  23. package/dist/commands/dashboard/types.js +5 -0
  24. package/dist/commands/dashboard/types.js.map +1 -0
  25. package/dist/commands/dashboard.d.ts +2 -20
  26. package/dist/commands/dashboard.d.ts.map +1 -1
  27. package/dist/commands/dashboard.js +166 -224
  28. package/dist/commands/dashboard.js.map +1 -1
  29. package/dist/commands/install.d.ts +16 -0
  30. package/dist/commands/install.d.ts.map +1 -1
  31. package/dist/commands/install.js +54 -0
  32. package/dist/commands/install.js.map +1 -1
  33. package/dist/commands/run.d.ts.map +1 -1
  34. package/dist/commands/run.js +4 -0
  35. package/dist/commands/run.js.map +1 -1
  36. package/dist/commands/uninstall.d.ts +12 -0
  37. package/dist/commands/uninstall.d.ts.map +1 -1
  38. package/dist/commands/uninstall.js +44 -0
  39. package/dist/commands/uninstall.js.map +1 -1
  40. package/dist/config.d.ts.map +1 -1
  41. package/dist/config.js +9 -1
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.d.ts +1 -0
  44. package/dist/constants.d.ts.map +1 -1
  45. package/dist/constants.js +2 -0
  46. package/dist/constants.js.map +1 -1
  47. package/dist/types.d.ts +2 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/utils/config-writer.d.ts +16 -0
  50. package/dist/utils/config-writer.d.ts.map +1 -0
  51. package/dist/utils/config-writer.js +45 -0
  52. package/dist/utils/config-writer.js.map +1 -0
  53. package/package.json +2 -1
  54. package/scripts/night-watch-helpers.sh +20 -0
@@ -0,0 +1,416 @@
1
+ /**
2
+ * Status tab for the dashboard TUI
3
+ * Shows the original 4-pane layout: PRD Queue, Processes, Pull Requests, Logs
4
+ */
5
+ import blessed from "blessed";
6
+ import { getLastLogLines } from "../../utils/status-data.js";
7
+ import { saveConfig } from "../../utils/config-writer.js";
8
+ import * as fs from "fs";
9
+ /**
10
+ * Sort PRDs by priority order. PRDs in the priority list come first (in that order),
11
+ * remaining PRDs follow alphabetically.
12
+ */
13
+ export function sortPrdsByPriority(prds, priority) {
14
+ if (priority.length === 0)
15
+ return prds;
16
+ const priorityMap = new Map();
17
+ for (let i = 0; i < priority.length; i++) {
18
+ priorityMap.set(priority[i], i);
19
+ }
20
+ return [...prds].sort((a, b) => {
21
+ const aIdx = priorityMap.has(a.name) ? priorityMap.get(a.name) : Infinity;
22
+ const bIdx = priorityMap.has(b.name) ? priorityMap.get(b.name) : Infinity;
23
+ if (aIdx !== bIdx)
24
+ return aIdx - bIdx;
25
+ return a.name.localeCompare(b.name);
26
+ });
27
+ }
28
+ /**
29
+ * Render the PRD Queue pane content from snapshot data.
30
+ */
31
+ export function renderPrdPane(prds, priority) {
32
+ if (prds.length === 0) {
33
+ return "No PRD files found";
34
+ }
35
+ const sorted = priority ? sortPrdsByPriority(prds, priority) : prds;
36
+ const lines = [];
37
+ for (const prd of sorted) {
38
+ let indicator;
39
+ switch (prd.status) {
40
+ case "ready":
41
+ indicator = "{green-fg}\u25cf{/green-fg}";
42
+ break;
43
+ case "blocked":
44
+ indicator = "{yellow-fg}\u25cf{/yellow-fg}";
45
+ break;
46
+ case "in-progress":
47
+ indicator = "{cyan-fg}\u25cf{/cyan-fg}";
48
+ break;
49
+ case "done":
50
+ indicator = "{#888888-fg}\u25cf{/#888888-fg}";
51
+ break;
52
+ }
53
+ let line = `${indicator} ${prd.name}`;
54
+ if (prd.dependencies.length > 0) {
55
+ line += ` (deps: ${prd.dependencies.join(", ")})`;
56
+ }
57
+ lines.push(line);
58
+ }
59
+ return lines.join("\n");
60
+ }
61
+ /**
62
+ * Render the Process Status pane content from snapshot data.
63
+ */
64
+ export function renderProcessPane(processes) {
65
+ const lines = [];
66
+ for (const proc of processes) {
67
+ if (proc.running) {
68
+ lines.push(`{green-fg}\u25cf{/green-fg} ${proc.name}: Running (PID: ${proc.pid})`);
69
+ }
70
+ else {
71
+ lines.push(`{white-fg}\u25cb{/white-fg} ${proc.name}: Not running`);
72
+ }
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ /**
77
+ * Render the PR Status pane content from snapshot data.
78
+ */
79
+ export function renderPrPane(prs) {
80
+ if (prs.length === 0) {
81
+ return "No matching pull requests";
82
+ }
83
+ const lines = [];
84
+ for (const pr of prs) {
85
+ let ciIndicator;
86
+ switch (pr.ciStatus) {
87
+ case "pass":
88
+ ciIndicator = "{green-fg}\u25cf{/green-fg}";
89
+ break;
90
+ case "fail":
91
+ ciIndicator = "{red-fg}\u25cf{/red-fg}";
92
+ break;
93
+ case "pending":
94
+ ciIndicator = "{yellow-fg}\u25cf{/yellow-fg}";
95
+ break;
96
+ default:
97
+ ciIndicator = "{white-fg}\u25cf{/white-fg}";
98
+ break;
99
+ }
100
+ const reviewLabel = pr.reviewScore !== null ? ` [Review: ${pr.reviewScore}%]` : "";
101
+ lines.push(`${ciIndicator} #${pr.number} ${pr.title}${reviewLabel}`);
102
+ lines.push(` ${pr.branch}`);
103
+ }
104
+ return lines.join("\n");
105
+ }
106
+ /**
107
+ * Render the Log Tail pane content from snapshot data.
108
+ */
109
+ export function renderLogPane(projectDir, logs) {
110
+ const existingLogs = logs.filter((l) => l.exists);
111
+ if (existingLogs.length === 0) {
112
+ return "No log files found";
113
+ }
114
+ let newestLog = existingLogs[0];
115
+ let newestMtime = 0;
116
+ for (const log of existingLogs) {
117
+ try {
118
+ const stat = fs.statSync(log.path);
119
+ if (stat.mtimeMs > newestMtime) {
120
+ newestMtime = stat.mtimeMs;
121
+ newestLog = log;
122
+ }
123
+ }
124
+ catch {
125
+ // Ignore stat errors
126
+ }
127
+ }
128
+ const lines = getLastLogLines(newestLog.path, 20);
129
+ if (lines.length === 0) {
130
+ return `${newestLog.name}.log: (empty)`;
131
+ }
132
+ return `--- ${newestLog.name}.log ---\n${lines.join("\n")}`;
133
+ }
134
+ /**
135
+ * Create the Status tab with 4-pane layout
136
+ */
137
+ export function createStatusTab() {
138
+ const container = blessed.box({
139
+ top: 0,
140
+ left: 0,
141
+ width: "100%",
142
+ height: "100%",
143
+ hidden: true,
144
+ });
145
+ const prdPane = blessed.box({
146
+ top: 0,
147
+ left: 0,
148
+ width: "50%",
149
+ height: "50%",
150
+ label: "[ PRD Queue ]",
151
+ border: { type: "line" },
152
+ scrollable: true,
153
+ alwaysScroll: true,
154
+ scrollbar: { style: { bg: "blue" } },
155
+ style: { border: { fg: "white" } },
156
+ tags: true,
157
+ content: "Loading...",
158
+ });
159
+ const processPane = blessed.box({
160
+ top: 0,
161
+ left: "50%",
162
+ width: "50%",
163
+ height: "50%",
164
+ label: "[ Processes ]",
165
+ border: { type: "line" },
166
+ scrollable: true,
167
+ alwaysScroll: true,
168
+ scrollbar: { style: { bg: "blue" } },
169
+ style: { border: { fg: "white" } },
170
+ tags: true,
171
+ content: "Loading...",
172
+ });
173
+ const prPane = blessed.box({
174
+ top: "50%",
175
+ left: 0,
176
+ width: "50%",
177
+ height: "50%",
178
+ label: "[ Pull Requests ]",
179
+ border: { type: "line" },
180
+ scrollable: true,
181
+ alwaysScroll: true,
182
+ scrollbar: { style: { bg: "blue" } },
183
+ style: { border: { fg: "white" } },
184
+ tags: true,
185
+ content: "Loading...",
186
+ });
187
+ const logPane = blessed.box({
188
+ top: "50%",
189
+ left: "50%",
190
+ width: "50%",
191
+ height: "50%",
192
+ label: "[ Logs ]",
193
+ border: { type: "line" },
194
+ scrollable: true,
195
+ alwaysScroll: true,
196
+ scrollbar: { style: { bg: "blue" } },
197
+ style: { border: { fg: "white" } },
198
+ tags: true,
199
+ content: "Loading...",
200
+ });
201
+ container.append(prdPane);
202
+ container.append(processPane);
203
+ container.append(prPane);
204
+ container.append(logPane);
205
+ const panes = [prdPane, processPane, prPane, logPane];
206
+ let focusedPaneIndex = 0;
207
+ let keyHandlers = [];
208
+ let activeCtx = null;
209
+ // Reorder mode state
210
+ let reorderMode = false;
211
+ let reorderList = [];
212
+ let reorderIndex = 0;
213
+ let reorderKeyHandlers = [];
214
+ function updatePaneFocus(screen) {
215
+ panes.forEach((pane, index) => {
216
+ if (index === focusedPaneIndex) {
217
+ pane.style.border = { fg: reorderMode && index === 0 ? "yellow" : "cyan" };
218
+ pane.focus();
219
+ }
220
+ else {
221
+ pane.style.border = { fg: "white" };
222
+ }
223
+ });
224
+ screen.render();
225
+ }
226
+ function renderPanes(ctx) {
227
+ const snap = ctx.snapshot;
228
+ prdPane.setContent(renderPrdPane(snap.prds, ctx.config.prdPriority));
229
+ processPane.setContent(renderProcessPane(snap.processes));
230
+ prPane.setContent(renderPrPane(snap.prs));
231
+ logPane.setContent(renderLogPane(snap.projectDir, snap.logs));
232
+ logPane.setScrollPerc(100);
233
+ }
234
+ function renderReorderList(screen) {
235
+ const lines = reorderList.map((name, idx) => {
236
+ const marker = idx === reorderIndex ? "{bold}{cyan-fg}> " : " ";
237
+ const end = idx === reorderIndex ? "{/cyan-fg}{/bold}" : "";
238
+ return `${marker}${idx + 1}. ${name}${end}`;
239
+ });
240
+ prdPane.setContent(lines.join("\n"));
241
+ screen.render();
242
+ }
243
+ function enterReorderMode(ctx) {
244
+ // Only reorder non-done PRDs
245
+ const nonDone = ctx.snapshot.prds.filter((p) => p.status !== "done");
246
+ if (nonDone.length === 0) {
247
+ ctx.showMessage("No PRDs to reorder", "info");
248
+ return;
249
+ }
250
+ // Start with current priority order
251
+ const sorted = sortPrdsByPriority(nonDone, ctx.config.prdPriority);
252
+ reorderList = sorted.map((p) => p.name);
253
+ reorderIndex = 0;
254
+ reorderMode = true;
255
+ // Switch focus to PRD pane
256
+ focusedPaneIndex = 0;
257
+ prdPane.setLabel("[ PRD Queue - Reordering ]");
258
+ prdPane.style.border = { fg: "yellow" };
259
+ ctx.setEditing(true);
260
+ ctx.setFooter(" \u2191\u2193:Navigate K:Move Up J:Move Down Enter:Save Esc:Cancel");
261
+ renderReorderList(ctx.screen);
262
+ const handlers = [
263
+ {
264
+ key: ["up"],
265
+ handler: () => {
266
+ if (reorderIndex > 0)
267
+ reorderIndex--;
268
+ renderReorderList(ctx.screen);
269
+ },
270
+ },
271
+ {
272
+ key: ["down"],
273
+ handler: () => {
274
+ if (reorderIndex < reorderList.length - 1)
275
+ reorderIndex++;
276
+ renderReorderList(ctx.screen);
277
+ },
278
+ },
279
+ {
280
+ key: ["S-k"],
281
+ handler: () => {
282
+ if (reorderIndex > 0) {
283
+ [reorderList[reorderIndex - 1], reorderList[reorderIndex]] =
284
+ [reorderList[reorderIndex], reorderList[reorderIndex - 1]];
285
+ reorderIndex--;
286
+ renderReorderList(ctx.screen);
287
+ }
288
+ },
289
+ },
290
+ {
291
+ key: ["S-j"],
292
+ handler: () => {
293
+ if (reorderIndex < reorderList.length - 1) {
294
+ [reorderList[reorderIndex], reorderList[reorderIndex + 1]] =
295
+ [reorderList[reorderIndex + 1], reorderList[reorderIndex]];
296
+ reorderIndex++;
297
+ renderReorderList(ctx.screen);
298
+ }
299
+ },
300
+ },
301
+ {
302
+ key: ["enter"],
303
+ handler: () => {
304
+ // Save priority to config
305
+ const result = saveConfig(ctx.projectDir, { prdPriority: reorderList });
306
+ if (result.success) {
307
+ ctx.config = ctx.reloadConfig();
308
+ ctx.showMessage("PRD priority saved", "success");
309
+ }
310
+ else {
311
+ ctx.showMessage(`Save failed: ${result.error}`, "error");
312
+ }
313
+ exitReorderMode(ctx);
314
+ },
315
+ },
316
+ {
317
+ key: ["escape"],
318
+ handler: () => {
319
+ exitReorderMode(ctx);
320
+ },
321
+ },
322
+ ];
323
+ for (const { key, handler } of handlers) {
324
+ ctx.screen.key(key, handler);
325
+ }
326
+ reorderKeyHandlers = handlers;
327
+ }
328
+ function exitReorderMode(ctx) {
329
+ reorderMode = false;
330
+ ctx.setEditing(false);
331
+ // Unbind reorder keys
332
+ for (const { key, handler } of reorderKeyHandlers) {
333
+ for (const k of key) {
334
+ ctx.screen.unkey(k, handler);
335
+ }
336
+ }
337
+ reorderKeyHandlers = [];
338
+ prdPane.setLabel("[ PRD Queue ]");
339
+ ctx.setFooter(" Tab:Focus \u2191\u2193:Scroll p:Priority r:Refresh q:Quit");
340
+ renderPanes(ctx);
341
+ updatePaneFocus(ctx.screen);
342
+ }
343
+ return {
344
+ name: "Status",
345
+ container,
346
+ activate(ctx) {
347
+ ctx.setFooter(" Tab:Focus \u2191\u2193:Scroll p:Priority r:Refresh q:Quit");
348
+ renderPanes(ctx);
349
+ updatePaneFocus(ctx.screen);
350
+ keyHandlers = [
351
+ {
352
+ key: ["tab"],
353
+ handler: () => {
354
+ focusedPaneIndex = (focusedPaneIndex + 1) % panes.length;
355
+ updatePaneFocus(ctx.screen);
356
+ },
357
+ },
358
+ {
359
+ key: ["up"],
360
+ handler: () => {
361
+ panes[focusedPaneIndex].scroll(-1);
362
+ ctx.screen.render();
363
+ },
364
+ },
365
+ {
366
+ key: ["down"],
367
+ handler: () => {
368
+ panes[focusedPaneIndex].scroll(1);
369
+ ctx.screen.render();
370
+ },
371
+ },
372
+ {
373
+ key: ["p"],
374
+ handler: () => {
375
+ if (!reorderMode && focusedPaneIndex === 0) {
376
+ enterReorderMode(ctx);
377
+ }
378
+ },
379
+ },
380
+ ];
381
+ for (const { key, handler } of keyHandlers) {
382
+ ctx.screen.key(key, handler);
383
+ }
384
+ activeCtx = ctx;
385
+ },
386
+ deactivate() {
387
+ if (activeCtx) {
388
+ for (const { key, handler } of keyHandlers) {
389
+ for (const k of key) {
390
+ activeCtx.screen.unkey(k, handler);
391
+ }
392
+ }
393
+ // Clean up reorder mode if active
394
+ for (const { key, handler } of reorderKeyHandlers) {
395
+ for (const k of key) {
396
+ activeCtx.screen.unkey(k, handler);
397
+ }
398
+ }
399
+ reorderKeyHandlers = [];
400
+ reorderMode = false;
401
+ activeCtx = null;
402
+ }
403
+ keyHandlers = [];
404
+ },
405
+ refresh(ctx) {
406
+ if (!reorderMode) {
407
+ renderPanes(ctx);
408
+ ctx.screen.render();
409
+ }
410
+ },
411
+ destroy() {
412
+ // Nothing to clean up
413
+ },
414
+ };
415
+ }
416
+ //# sourceMappingURL=tab-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab-status.js","sourceRoot":"","sources":["../../../src/commands/dashboard/tab-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Shared interfaces for the dashboard tab system
3
+ */
4
+ import blessed from "blessed";
5
+ import { INightWatchConfig } from "../../types.js";
6
+ import { IStatusSnapshot } from "../../utils/status-data.js";
7
+ /**
8
+ * Context passed to each tab for accessing shared state and utilities
9
+ */
10
+ export interface ITabContext {
11
+ screen: blessed.Widgets.Screen;
12
+ projectDir: string;
13
+ config: INightWatchConfig;
14
+ snapshot: IStatusSnapshot;
15
+ /** Reload config from disk after a save */
16
+ reloadConfig: () => INightWatchConfig;
17
+ /** Re-fetch status snapshot with current config */
18
+ refreshSnapshot: () => IStatusSnapshot;
19
+ /** Update the footer text with tab-specific shortcuts */
20
+ setFooter: (text: string) => void;
21
+ /** Show a temporary flash message (success/error/info) */
22
+ showMessage: (text: string, type: "success" | "error" | "info", durationMs?: number) => void;
23
+ /** Set the editing state to suppress global key handlers */
24
+ setEditing: (editing: boolean) => void;
25
+ }
26
+ /**
27
+ * Interface that each dashboard tab must implement
28
+ */
29
+ export interface ITab {
30
+ /** Display name for the tab bar */
31
+ name: string;
32
+ /** The blessed container element for this tab's content */
33
+ container: blessed.Widgets.BoxElement;
34
+ /** Called when the tab becomes active */
35
+ activate: (ctx: ITabContext) => void;
36
+ /** Called when the tab is deactivated */
37
+ deactivate: () => void;
38
+ /** Called on the global refresh timer tick */
39
+ refresh: (ctx: ITabContext) => void;
40
+ /** Called to clean up before screen destruction */
41
+ destroy: () => void;
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/dashboard/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,2CAA2C;IAC3C,YAAY,EAAE,MAAM,iBAAiB,CAAC;IACtC,mDAAmD;IACnD,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,yDAAyD;IACzD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,0DAA0D;IAC1D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7F,4DAA4D;IAC5D,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IACtC,yCAAyC;IACzC,QAAQ,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACrC,yCAAyC;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,8CAA8C;IAC9C,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACpC,mDAAmD;IACnD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared interfaces for the dashboard tab system
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/dashboard/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,29 +1,11 @@
1
1
  /**
2
2
  * Dashboard command for Night Watch CLI
3
- * Renders a full-screen TUI with 4 panes using blessed
3
+ * Tabbed TUI with Status, Config, Schedules, Actions, and Logs tabs
4
4
  */
5
5
  import { Command } from "commander";
6
- import { IStatusSnapshot } from "../utils/status-data.js";
6
+ export { renderPrdPane, renderProcessPane, renderPrPane, renderLogPane, } from "./dashboard/tab-status.js";
7
7
  export interface IDashboardOptions {
8
8
  interval: string;
9
9
  }
10
- /**
11
- * Render the PRD Queue pane content from snapshot data.
12
- * Each PRD gets a colored status indicator and optional dependency list.
13
- */
14
- export declare function renderPrdPane(prds: IStatusSnapshot["prds"]): string;
15
- /**
16
- * Render the Process Status pane content from snapshot data.
17
- */
18
- export declare function renderProcessPane(processes: IStatusSnapshot["processes"]): string;
19
- /**
20
- * Render the PR Status pane content from snapshot data.
21
- */
22
- export declare function renderPrPane(prs: IStatusSnapshot["prs"]): string;
23
- /**
24
- * Render the Log Tail pane content from snapshot data.
25
- * Shows the last 20 lines from the most recent log file.
26
- */
27
- export declare function renderLogPane(projectDir: string, logs: IStatusSnapshot["logs"]): string;
28
10
  export declare function dashboardCommand(program: Command): void;
29
11
  //# sourceMappingURL=dashboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,eAAe,EAGhB,MAAM,yBAAyB,CAAC;AAGjC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,MAAM,CA+BnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,CAAC,WAAW,CAAC,GACtC,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,MAAM,CA4BhE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,GAC5B,MAAM,CA+BR;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0MvD"}
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8BD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2NvD"}