@coralai/sps-cli 0.8.0 → 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.
- package/README.md +820 -47
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +140 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/workerDashboard.d.ts +2 -0
- package/dist/commands/workerDashboard.d.ts.map +1 -0
- package/dist/commands/workerDashboard.js +415 -0
- package/dist/commands/workerDashboard.js.map +1 -0
- package/dist/core/state.d.ts +6 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +1 -0
- package/dist/core/state.js.map +1 -1
- package/dist/engines/CloseoutEngine.d.ts +7 -0
- package/dist/engines/CloseoutEngine.d.ts.map +1 -1
- package/dist/engines/CloseoutEngine.js +85 -38
- package/dist/engines/CloseoutEngine.js.map +1 -1
- package/dist/engines/ExecutionEngine.d.ts +10 -2
- package/dist/engines/ExecutionEngine.d.ts.map +1 -1
- package/dist/engines/ExecutionEngine.js +46 -50
- package/dist/engines/ExecutionEngine.js.map +1 -1
- package/dist/engines/SchedulerEngine.d.ts +5 -0
- package/dist/engines/SchedulerEngine.d.ts.map +1 -1
- package/dist/engines/SchedulerEngine.js +15 -5
- package/dist/engines/SchedulerEngine.js.map +1 -1
- package/dist/interfaces/RepoBackend.d.ts +1 -0
- package/dist/interfaces/RepoBackend.d.ts.map +1 -1
- package/dist/interfaces/WorkerProvider.d.ts +16 -0
- package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
- package/dist/main.js +12 -2
- package/dist/main.js.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.d.ts +13 -3
- package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.js +21 -8
- package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
- package/dist/providers/CodexWorkerProvider.d.ts +11 -1
- package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
- package/dist/providers/CodexWorkerProvider.js +19 -4
- package/dist/providers/CodexWorkerProvider.js.map +1 -1
- package/dist/providers/GitLabRepoBackend.d.ts +1 -0
- package/dist/providers/GitLabRepoBackend.d.ts.map +1 -1
- package/dist/providers/GitLabRepoBackend.js +36 -0
- package/dist/providers/GitLabRepoBackend.js.map +1 -1
- package/package.json +2 -2
- package/project-template/batch_scheduler.sh +2 -4
- package/project-template/conf.template +6 -1
- package/project-template/batch_scheduler.legacy.sh +0 -165
- package/project-template/project-template/README.md +0 -10
- package/project-template/project-template/batch_scheduler.legacy.sh +0 -165
- package/project-template/project-template/batch_scheduler.sh +0 -8
- package/project-template/project-template/conf.template +0 -78
- package/project-template/project-template/deploy.sh +0 -3
- package/project-template/project-template/logs/.gitkeep +0 -0
- package/project-template/project-template/pm_meta/.gitkeep +0 -0
|
@@ -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,
|
|
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"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -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 @@
|
|
|
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
|