@coralai/sps-cli 0.8.1 → 0.9.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 (43) hide show
  1. package/README.md +820 -47
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +140 -1
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/workerDashboard.d.ts +2 -0
  6. package/dist/commands/workerDashboard.d.ts.map +1 -0
  7. package/dist/commands/workerDashboard.js +415 -0
  8. package/dist/commands/workerDashboard.js.map +1 -0
  9. package/dist/core/state.d.ts +6 -0
  10. package/dist/core/state.d.ts.map +1 -1
  11. package/dist/core/state.js +1 -0
  12. package/dist/core/state.js.map +1 -1
  13. package/dist/engines/CloseoutEngine.d.ts +7 -0
  14. package/dist/engines/CloseoutEngine.d.ts.map +1 -1
  15. package/dist/engines/CloseoutEngine.js +85 -38
  16. package/dist/engines/CloseoutEngine.js.map +1 -1
  17. package/dist/engines/ExecutionEngine.d.ts +10 -2
  18. package/dist/engines/ExecutionEngine.d.ts.map +1 -1
  19. package/dist/engines/ExecutionEngine.js +46 -50
  20. package/dist/engines/ExecutionEngine.js.map +1 -1
  21. package/dist/engines/SchedulerEngine.d.ts +5 -0
  22. package/dist/engines/SchedulerEngine.d.ts.map +1 -1
  23. package/dist/engines/SchedulerEngine.js +15 -5
  24. package/dist/engines/SchedulerEngine.js.map +1 -1
  25. package/dist/interfaces/RepoBackend.d.ts +1 -0
  26. package/dist/interfaces/RepoBackend.d.ts.map +1 -1
  27. package/dist/interfaces/WorkerProvider.d.ts +16 -0
  28. package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
  29. package/dist/main.js +12 -2
  30. package/dist/main.js.map +1 -1
  31. package/dist/providers/ClaudeWorkerProvider.d.ts +13 -3
  32. package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
  33. package/dist/providers/ClaudeWorkerProvider.js +21 -8
  34. package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
  35. package/dist/providers/CodexWorkerProvider.d.ts +11 -1
  36. package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
  37. package/dist/providers/CodexWorkerProvider.js +19 -4
  38. package/dist/providers/CodexWorkerProvider.js.map +1 -1
  39. package/dist/providers/GitLabRepoBackend.d.ts +1 -0
  40. package/dist/providers/GitLabRepoBackend.d.ts.map +1 -1
  41. package/dist/providers/GitLabRepoBackend.js +36 -0
  42. package/dist/providers/GitLabRepoBackend.js.map +1 -1
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AASA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACpC;AAcD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8JtF"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AASA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACpC;AAcD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsKtF"}
@@ -1,5 +1,6 @@
1
- import { mkdirSync, writeFileSync, appendFileSync } from 'node:fs';
1
+ import { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
+ import { resolve } from 'node:path';
3
4
  import { ProjectContext } from '../core/context.js';
4
5
  import { checkPathExists } from '../core/paths.js';
5
6
  import { readState, writeState } from '../core/state.js';
@@ -73,6 +74,14 @@ export async function executeDoctor(project, flags) {
73
74
  else {
74
75
  checks.push({ name: 'repo-dir', status: 'warn', message: `Repo dir not found: ${ctx.paths.repoDir}` });
75
76
  }
77
+ // 4.5 Worker rules files (CLAUDE.md, AGENTS.md, .gitignore entry)
78
+ const isGitRepo = checkPathExists(`${ctx.paths.repoDir}/.git`);
79
+ if (checkPathExists(ctx.paths.repoDir) && isGitRepo) {
80
+ checkWorkerRulesFiles(ctx, checks, fixes, doFix);
81
+ }
82
+ else {
83
+ checks.push({ name: 'worker-rules', status: 'skip', message: 'Repo not available, skipping worker rules check' });
84
+ }
76
85
  // 5. state.json
77
86
  if (checkPathExists(ctx.paths.stateFile)) {
78
87
  try {
@@ -230,6 +239,136 @@ function checkCliConfFields(ctx, checks, fixes, doFix) {
230
239
  }
231
240
  }
232
241
  }
242
+ /**
243
+ * Generate project-level CLAUDE.md content.
244
+ * This file is committed to the repo and inherited by all worktrees.
245
+ * Task-specific info (seq, branch) goes in .jarvis_task_prompt.txt instead.
246
+ */
247
+ function generateWorkerRules(ctx) {
248
+ return `# Worker Rules (auto-generated by sps doctor --fix)
249
+ #
250
+ # This file defines rules for AI workers (Claude Code / Codex) operating
251
+ # in this repository. It is committed to the repo so that all worktrees
252
+ # inherit these rules automatically.
253
+ #
254
+ # You may edit this file to add project-specific coding standards,
255
+ # architecture constraints, testing requirements, etc.
256
+ # SPS will NOT overwrite this file once it exists.
257
+
258
+ ## Scope
259
+ - ONLY work in the current working directory
260
+ - Do NOT read or modify files outside this directory
261
+ - Do NOT explore the system, home directory, or other projects
262
+
263
+ ## Workflow
264
+ 1. Read the task prompt from .jarvis_task_prompt.txt
265
+ 2. Implement the changes in this directory
266
+ 3. Self-test your changes
267
+ 4. git add, commit, and push to your feature branch
268
+ 5. Create a Merge Request targeting ${ctx.mergeBranch}
269
+ 6. Output "done" when finished
270
+
271
+ ## Commit Rules
272
+ - Commit frequently (every meaningful change)
273
+ - Push after each commit
274
+ - Use conventional commit messages (feat:, fix:, refactor:, etc.)
275
+
276
+ ## MR Creation
277
+ - Use git push first, then create MR via GitLab API:
278
+ curl -s -X POST -H "PRIVATE-TOKEN: $GITLAB_TOKEN" -H "Content-Type: application/json" \\
279
+ "$GITLAB_URL/api/v4/projects/${ctx.config.GITLAB_PROJECT_ID}/merge_requests" \\
280
+ -d '{"source_branch":"<your-branch>","target_branch":"${ctx.mergeBranch}","title":"feat: <title>"}'
281
+
282
+ ## Forbidden
283
+ - No PLAN.md, TODO.md, TASKLIST.md, ROADMAP.md, NOTES.md
284
+ - No local planning files of any kind
285
+ - No changes outside task scope
286
+ - Do NOT explore ~/.projects or other system directories
287
+
288
+ ## Project-Specific Rules
289
+ # Add your project's coding standards, architecture constraints,
290
+ # testing requirements, and other conventions below:
291
+ #
292
+ # Examples:
293
+ # - Language: TypeScript strict mode
294
+ # - Test framework: vitest, 80%+ coverage required
295
+ # - Architecture: src/modules/<domain>/ structure
296
+ # - Linting: eslint + prettier, must pass before commit
297
+ `;
298
+ }
299
+ /**
300
+ * Check whether CLAUDE.md, AGENTS.md, and .gitignore entries exist in the repo.
301
+ * If --fix, generate missing files and commit them.
302
+ */
303
+ function checkWorkerRulesFiles(ctx, checks, fixes, doFix) {
304
+ const repoDir = ctx.paths.repoDir;
305
+ const claudeMd = resolve(repoDir, 'CLAUDE.md');
306
+ const agentsMd = resolve(repoDir, 'AGENTS.md');
307
+ const gitignorePath = resolve(repoDir, '.gitignore');
308
+ const taskPromptEntry = '.jarvis_task_prompt.txt';
309
+ // Check CLAUDE.md
310
+ const hasClaudeMd = existsSync(claudeMd);
311
+ const hasAgentsMd = existsSync(agentsMd);
312
+ if (hasClaudeMd && hasAgentsMd) {
313
+ checks.push({ name: 'worker-rules', status: 'pass', message: 'CLAUDE.md and AGENTS.md present in repo' });
314
+ }
315
+ else if (doFix) {
316
+ const content = generateWorkerRules(ctx);
317
+ const created = [];
318
+ if (!hasClaudeMd) {
319
+ writeFileSync(claudeMd, content);
320
+ created.push('CLAUDE.md');
321
+ }
322
+ if (!hasAgentsMd) {
323
+ writeFileSync(agentsMd, content);
324
+ created.push('AGENTS.md');
325
+ }
326
+ // Ensure .gitignore has .jarvis_task_prompt.txt
327
+ let gitignoreUpdated = false;
328
+ if (existsSync(gitignorePath)) {
329
+ const gitignoreContent = readFileSync(gitignorePath, 'utf-8');
330
+ if (!gitignoreContent.includes(taskPromptEntry)) {
331
+ appendFileSync(gitignorePath, `\n# SPS task prompt (per-worktree, not committed)\n${taskPromptEntry}\n`);
332
+ gitignoreUpdated = true;
333
+ }
334
+ }
335
+ else {
336
+ writeFileSync(gitignorePath, `# SPS task prompt (per-worktree, not committed)\n${taskPromptEntry}\n`);
337
+ gitignoreUpdated = true;
338
+ }
339
+ if (gitignoreUpdated)
340
+ created.push('.gitignore');
341
+ // Git add + commit
342
+ if (created.length > 0) {
343
+ try {
344
+ const filesToAdd = [];
345
+ if (!hasClaudeMd)
346
+ filesToAdd.push('CLAUDE.md');
347
+ if (!hasAgentsMd)
348
+ filesToAdd.push('AGENTS.md');
349
+ if (gitignoreUpdated)
350
+ filesToAdd.push('.gitignore');
351
+ execSync(`git add ${filesToAdd.join(' ')}`, { cwd: repoDir, timeout: 5000 });
352
+ execSync(`git commit -m "chore: add worker rules (CLAUDE.md, AGENTS.md)"`, { cwd: repoDir, timeout: 10000, stdio: ['ignore', 'pipe', 'pipe'] });
353
+ fixes.push(`Created ${created.join(', ')} in repo and committed`);
354
+ checks.push({ name: 'worker-rules', status: 'pass', message: `Generated and committed: ${created.join(', ')}` });
355
+ }
356
+ catch (err) {
357
+ const msg = err instanceof Error ? err.message : String(err);
358
+ checks.push({ name: 'worker-rules', status: 'warn', message: `Files created but commit failed: ${msg}` });
359
+ fixes.push(`Created ${created.join(', ')} (commit failed, please commit manually)`);
360
+ }
361
+ }
362
+ }
363
+ else {
364
+ const missing = [!hasClaudeMd && 'CLAUDE.md', !hasAgentsMd && 'AGENTS.md'].filter(Boolean);
365
+ checks.push({
366
+ name: 'worker-rules',
367
+ status: 'warn',
368
+ message: `Missing ${missing.join(', ')} in repo (use --fix to generate)`,
369
+ });
370
+ }
371
+ }
233
372
  function outputResult(project, checks, fixes, flags) {
234
373
  if (flags.json) {
235
374
  const result = {
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function executeWorkerDashboard(projects: string[], flags: Record<string, boolean>): Promise<void>;
2
+ //# sourceMappingURL=workerDashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerDashboard.d.ts","sourceRoot":"","sources":["../../src/commands/workerDashboard.ts"],"names":[],"mappings":"AA2cA,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
@@ -0,0 +1,415 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readdirSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import { ProjectContext } from '../core/context.js';
5
+ import { readState } from '../core/state.js';
6
+ const HOME = process.env.HOME || '/home/coral';
7
+ // ── tmux helpers ──────────────────────────────────────────────────────
8
+ function tmux(args) {
9
+ try {
10
+ return execFileSync('tmux', args, {
11
+ encoding: 'utf-8',
12
+ timeout: 5_000,
13
+ stdio: ['ignore', 'pipe', 'pipe'],
14
+ });
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function listTmuxSessions() {
21
+ const out = tmux(['list-sessions', '-F', '#{session_name}']);
22
+ if (!out)
23
+ return [];
24
+ return out.trim().split('\n').filter(Boolean);
25
+ }
26
+ function capturePaneText(session, lines) {
27
+ return tmux(['capture-pane', '-t', session, '-p', '-S', `-${lines}`]) ?? '';
28
+ }
29
+ function getSessionDimensions(session) {
30
+ const out = tmux(['display-message', '-t', session, '-p', '#{window_width},#{window_height}']);
31
+ if (!out)
32
+ return { cols: 0, rows: 0 };
33
+ const [cols, rows] = out.trim().split(',').map(Number);
34
+ return { cols: cols || 0, rows: rows || 0 };
35
+ }
36
+ // ── ANSI helpers ──────────────────────────────────────────────────────
37
+ const RESET = '\x1b[0m';
38
+ const BOLD = '\x1b[1m';
39
+ const DIM = '\x1b[2m';
40
+ const FG = {
41
+ red: '\x1b[31m',
42
+ green: '\x1b[32m',
43
+ yellow: '\x1b[33m',
44
+ blue: '\x1b[34m',
45
+ magenta: '\x1b[35m',
46
+ cyan: '\x1b[36m',
47
+ white: '\x1b[37m',
48
+ gray: '\x1b[90m',
49
+ };
50
+ const BG = {
51
+ black: '\x1b[40m',
52
+ };
53
+ function statusColor(status) {
54
+ switch (status) {
55
+ case 'active': return FG.green;
56
+ case 'idle': return FG.gray;
57
+ case 'releasing': return FG.yellow;
58
+ default: return FG.white;
59
+ }
60
+ }
61
+ function statusIcon(status) {
62
+ switch (status) {
63
+ case 'active': return '●';
64
+ case 'idle': return '○';
65
+ case 'releasing': return '◐';
66
+ default: return '?';
67
+ }
68
+ }
69
+ function sessionStatusIcon(alive) {
70
+ return alive ? `${FG.green}▶${RESET}` : `${FG.red}■${RESET}`;
71
+ }
72
+ // ── Strip ANSI escape codes for width calculations ────────────────────
73
+ function stripAnsi(s) {
74
+ return s.replace(/\x1b\[[0-9;]*m/g, '');
75
+ }
76
+ function visibleLength(s) {
77
+ return stripAnsi(s).length;
78
+ }
79
+ // ── Pad / truncate to visible width ──────────────────────────────────
80
+ function padOrTruncate(s, width) {
81
+ const vLen = visibleLength(s);
82
+ if (vLen > width) {
83
+ // Truncate: walk character by character, tracking visible length
84
+ let visible = 0;
85
+ let result = '';
86
+ let inEscape = false;
87
+ for (const ch of s) {
88
+ if (ch === '\x1b') {
89
+ inEscape = true;
90
+ result += ch;
91
+ continue;
92
+ }
93
+ if (inEscape) {
94
+ result += ch;
95
+ if (/[a-zA-Z]/.test(ch))
96
+ inEscape = false;
97
+ continue;
98
+ }
99
+ if (visible >= width - 1) {
100
+ result += '…';
101
+ break;
102
+ }
103
+ result += ch;
104
+ visible++;
105
+ }
106
+ return result;
107
+ }
108
+ return s + ' '.repeat(width - vLen);
109
+ }
110
+ // ── Discover all SPS projects from ~/.projects/ ──────────────────────
111
+ function discoverProjects() {
112
+ const projectsDir = resolve(HOME, '.projects');
113
+ if (!existsSync(projectsDir))
114
+ return [];
115
+ try {
116
+ return readdirSync(projectsDir, { withFileTypes: true })
117
+ .filter(d => d.isDirectory() && existsSync(resolve(projectsDir, d.name, 'conf')))
118
+ .map(d => d.name)
119
+ .sort();
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ }
125
+ function collectPanels(projects) {
126
+ const panels = [];
127
+ const allSessions = new Set(listTmuxSessions());
128
+ for (const projectName of projects) {
129
+ let ctx;
130
+ try {
131
+ ctx = ProjectContext.load(projectName);
132
+ }
133
+ catch {
134
+ continue;
135
+ }
136
+ const state = readState(ctx.paths.stateFile, ctx.maxWorkers);
137
+ for (const [slotName, slot] of Object.entries(state.workers)) {
138
+ const sessionName = slot.tmuxSession || `${projectName}-${slotName}`;
139
+ const sessionAlive = allSessions.has(sessionName);
140
+ // Only show panels with active slots or live tmux sessions
141
+ if (slot.status === 'idle' && !sessionAlive)
142
+ continue;
143
+ const paneText = sessionAlive ? capturePaneText(sessionName, 30) : '';
144
+ const paneLines = paneText.split('\n');
145
+ panels.push({
146
+ projectName,
147
+ slotName,
148
+ slot,
149
+ sessionAlive,
150
+ paneLines,
151
+ });
152
+ }
153
+ }
154
+ return panels;
155
+ }
156
+ // ── Render dashboard ─────────────────────────────────────────────────
157
+ function renderHeader(termWidth) {
158
+ const title = ' SPS Worker Dashboard ';
159
+ const now = new Date().toLocaleTimeString();
160
+ const rightInfo = `${DIM}${now} q=quit r=refresh${RESET}`;
161
+ const rightLen = visibleLength(rightInfo);
162
+ const leftPad = Math.max(0, Math.floor((termWidth - title.length) / 2));
163
+ return [
164
+ `${BOLD}${FG.cyan}${'─'.repeat(termWidth)}${RESET}`,
165
+ `${' '.repeat(leftPad)}${BOLD}${FG.cyan}${title}${RESET}${' '.repeat(Math.max(0, termWidth - leftPad - title.length - rightLen))}${rightInfo}`,
166
+ `${BOLD}${FG.cyan}${'─'.repeat(termWidth)}${RESET}`,
167
+ ];
168
+ }
169
+ function renderPanel(panel, panelWidth, panelHeight) {
170
+ const lines = [];
171
+ const innerWidth = panelWidth - 2; // borders
172
+ // ── Header bar ──
173
+ const sIcon = statusIcon(panel.slot.status);
174
+ const sColor = statusColor(panel.slot.status);
175
+ const aliveIcon = sessionStatusIcon(panel.sessionAlive);
176
+ const seqInfo = panel.slot.seq !== null ? ` seq:${panel.slot.seq}` : '';
177
+ const branchInfo = panel.slot.branch ? ` ${DIM}${panel.slot.branch}${RESET}` : '';
178
+ const headerText = `${sColor}${sIcon} ${BOLD}${panel.projectName}/${panel.slotName}${RESET}${seqInfo} ${aliveIcon}${branchInfo}`;
179
+ const headerLine = ` ${padOrTruncate(headerText, innerWidth)} `;
180
+ // ── Time info ──
181
+ const elapsed = panel.slot.claimedAt
182
+ ? formatElapsed(new Date(panel.slot.claimedAt))
183
+ : '';
184
+ const heartbeat = panel.slot.lastHeartbeat
185
+ ? `hb: ${formatElapsed(new Date(panel.slot.lastHeartbeat))} ago`
186
+ : '';
187
+ const timeLine = elapsed || heartbeat
188
+ ? ` ${DIM}${[elapsed, heartbeat].filter(Boolean).join(' │ ')}${RESET}`
189
+ : '';
190
+ // Top border
191
+ lines.push(`${FG.gray}┌${'─'.repeat(panelWidth - 2)}┐${RESET}`);
192
+ lines.push(`${FG.gray}│${RESET}${padOrTruncate(headerText, innerWidth)}${FG.gray}│${RESET}`);
193
+ if (timeLine) {
194
+ lines.push(`${FG.gray}│${RESET}${padOrTruncate(timeLine, innerWidth)}${FG.gray}│${RESET}`);
195
+ }
196
+ lines.push(`${FG.gray}├${'─'.repeat(panelWidth - 2)}┤${RESET}`);
197
+ // ── Pane content ──
198
+ const contentHeight = panelHeight - lines.length - 1; // -1 for bottom border
199
+ const trimmedLines = panel.paneLines
200
+ .filter(l => l.trim() !== '') // skip empty lines
201
+ .slice(-contentHeight); // show last N lines
202
+ for (let i = 0; i < contentHeight; i++) {
203
+ const raw = trimmedLines[i] ?? '';
204
+ const content = padOrTruncate(`${DIM}${raw}${RESET}`, innerWidth);
205
+ lines.push(`${FG.gray}│${RESET}${content}${FG.gray}│${RESET}`);
206
+ }
207
+ // Bottom border
208
+ lines.push(`${FG.gray}└${'─'.repeat(panelWidth - 2)}┘${RESET}`);
209
+ return lines;
210
+ }
211
+ function renderIdleSummary(projects, termWidth) {
212
+ const lines = [];
213
+ for (const projectName of projects) {
214
+ let ctx;
215
+ try {
216
+ ctx = ProjectContext.load(projectName);
217
+ }
218
+ catch {
219
+ continue;
220
+ }
221
+ const state = readState(ctx.paths.stateFile, ctx.maxWorkers);
222
+ const total = Object.keys(state.workers).length;
223
+ const idle = Object.values(state.workers).filter(w => w.status === 'idle').length;
224
+ const active = Object.values(state.workers).filter(w => w.status === 'active').length;
225
+ const activeCards = Object.keys(state.activeCards).length;
226
+ lines.push(` ${BOLD}${projectName}${RESET}: ${FG.green}${active} active${RESET} / ${FG.gray}${idle} idle${RESET} / ${total} total │ ${FG.cyan}${activeCards} cards${RESET}`);
227
+ }
228
+ return lines;
229
+ }
230
+ function renderEmptyState(termWidth) {
231
+ return [
232
+ '',
233
+ `${DIM} No active workers found.${RESET}`,
234
+ `${DIM} All worker slots are idle across all projects.${RESET}`,
235
+ '',
236
+ `${DIM} Tip: Start a pipeline with ${RESET}sps tick <project>${DIM} to launch workers.${RESET}`,
237
+ '',
238
+ ];
239
+ }
240
+ function formatElapsed(from) {
241
+ const ms = Date.now() - from.getTime();
242
+ if (ms < 0)
243
+ return '';
244
+ const secs = Math.floor(ms / 1000);
245
+ if (secs < 60)
246
+ return `${secs}s`;
247
+ const mins = Math.floor(secs / 60);
248
+ if (mins < 60)
249
+ return `${mins}m${secs % 60}s`;
250
+ const hours = Math.floor(mins / 60);
251
+ return `${hours}h${mins % 60}m`;
252
+ }
253
+ function getTerminalSize() {
254
+ return {
255
+ cols: process.stdout.columns || 120,
256
+ rows: process.stdout.rows || 40,
257
+ };
258
+ }
259
+ function renderDashboard(projects) {
260
+ const { cols: termWidth, rows: termHeight } = getTerminalSize();
261
+ const output = [];
262
+ // Header
263
+ output.push(...renderHeader(termWidth));
264
+ // Summary line
265
+ output.push('');
266
+ output.push(...renderIdleSummary(projects, termWidth));
267
+ output.push('');
268
+ // Collect active panels
269
+ const panels = collectPanels(projects);
270
+ if (panels.length === 0) {
271
+ output.push(...renderEmptyState(termWidth));
272
+ return output.join('\n');
273
+ }
274
+ // Calculate grid layout
275
+ const gridCols = panels.length <= 2 ? panels.length : panels.length <= 4 ? 2 : 3;
276
+ const gridRows = Math.ceil(panels.length / gridCols);
277
+ const panelWidth = Math.floor((termWidth - 1) / gridCols); // -1 for spacing
278
+ const usedHeaderRows = output.length;
279
+ const availableRows = termHeight - usedHeaderRows - 2; // -2 for footer
280
+ const panelHeight = Math.max(10, Math.floor(availableRows / gridRows));
281
+ // Render panels row by row
282
+ for (let row = 0; row < gridRows; row++) {
283
+ const rowPanels = [];
284
+ for (let col = 0; col < gridCols; col++) {
285
+ const idx = row * gridCols + col;
286
+ if (idx < panels.length) {
287
+ rowPanels.push(renderPanel(panels[idx], panelWidth, panelHeight));
288
+ }
289
+ else {
290
+ // Empty filler
291
+ rowPanels.push(Array(panelHeight + 2).fill(' '.repeat(panelWidth)));
292
+ }
293
+ }
294
+ // Merge columns side by side
295
+ const maxLines = Math.max(...rowPanels.map(p => p.length));
296
+ for (let line = 0; line < maxLines; line++) {
297
+ const merged = rowPanels
298
+ .map(p => p[line] ?? ' '.repeat(panelWidth))
299
+ .join(' ');
300
+ output.push(merged);
301
+ }
302
+ }
303
+ return output.join('\n');
304
+ }
305
+ function buildJsonOutput(projects) {
306
+ const allSessions = new Set(listTmuxSessions());
307
+ const result = {
308
+ timestamp: new Date().toISOString(),
309
+ projects: [],
310
+ tmuxSessions: [...allSessions].sort(),
311
+ };
312
+ for (const projectName of projects) {
313
+ let ctx;
314
+ try {
315
+ ctx = ProjectContext.load(projectName);
316
+ }
317
+ catch {
318
+ continue;
319
+ }
320
+ const state = readState(ctx.paths.stateFile, ctx.maxWorkers);
321
+ const workers = [];
322
+ for (const [slotName, slot] of Object.entries(state.workers)) {
323
+ const sessionName = slot.tmuxSession || `${projectName}-${slotName}`;
324
+ const sessionAlive = allSessions.has(sessionName);
325
+ const panePreview = sessionAlive
326
+ ? capturePaneText(sessionName, 5).trim()
327
+ : '';
328
+ workers.push({
329
+ slot: slotName,
330
+ status: slot.status,
331
+ seq: slot.seq,
332
+ branch: slot.branch,
333
+ tmuxSession: slot.tmuxSession,
334
+ sessionAlive,
335
+ claimedAt: slot.claimedAt,
336
+ lastHeartbeat: slot.lastHeartbeat,
337
+ panePreview,
338
+ });
339
+ }
340
+ result.projects.push({
341
+ name: projectName,
342
+ workers,
343
+ activeCards: state.activeCards,
344
+ });
345
+ }
346
+ return result;
347
+ }
348
+ // ── Live mode (watch) ────────────────────────────────────────────────
349
+ async function runLive(projects, intervalMs) {
350
+ // Hide cursor
351
+ process.stdout.write('\x1b[?25l');
352
+ // Restore cursor on exit
353
+ const cleanup = () => {
354
+ process.stdout.write('\x1b[?25h'); // show cursor
355
+ process.stdout.write('\x1b[0m'); // reset colors
356
+ process.exit(0);
357
+ };
358
+ process.on('SIGINT', cleanup);
359
+ process.on('SIGTERM', cleanup);
360
+ // Enable raw mode for keypress detection
361
+ if (process.stdin.isTTY) {
362
+ process.stdin.setRawMode(true);
363
+ process.stdin.resume();
364
+ process.stdin.setEncoding('utf-8');
365
+ process.stdin.on('data', (key) => {
366
+ if (key === 'q' || key === '\x03') { // q or Ctrl+C
367
+ cleanup();
368
+ }
369
+ if (key === 'r') {
370
+ // Force immediate refresh
371
+ draw();
372
+ }
373
+ });
374
+ }
375
+ const draw = () => {
376
+ const screen = renderDashboard(projects);
377
+ // Clear screen and move cursor to top-left
378
+ process.stdout.write('\x1b[2J\x1b[H');
379
+ process.stdout.write(screen);
380
+ };
381
+ draw();
382
+ setInterval(draw, intervalMs);
383
+ // Block forever
384
+ return new Promise(() => { });
385
+ }
386
+ // ── Main entry point ─────────────────────────────────────────────────
387
+ export async function executeWorkerDashboard(projects, flags) {
388
+ const jsonOutput = !!flags.json;
389
+ const watch = !flags.once; // default to live mode unless --once
390
+ // If no projects specified, discover all
391
+ if (projects.length === 0) {
392
+ projects = discoverProjects();
393
+ }
394
+ if (projects.length === 0) {
395
+ if (jsonOutput) {
396
+ console.log(JSON.stringify({ timestamp: new Date().toISOString(), projects: [], tmuxSessions: [] }));
397
+ }
398
+ else {
399
+ console.error('No projects found in ~/.projects/');
400
+ }
401
+ process.exit(1);
402
+ }
403
+ if (jsonOutput) {
404
+ console.log(JSON.stringify(buildJsonOutput(projects), null, 2));
405
+ return;
406
+ }
407
+ if (watch) {
408
+ const intervalMs = parseInt(process.env.SPS_DASHBOARD_INTERVAL || '3000', 10);
409
+ await runLive(projects, intervalMs);
410
+ }
411
+ else {
412
+ console.log(renderDashboard(projects));
413
+ }
414
+ }
415
+ //# sourceMappingURL=workerDashboard.js.map