mirror of
https://github.com/affaan-m/everything-claude-code.git
synced 2026-03-30 13:43:26 +08:00
242 lines
7.6 KiB
JavaScript
242 lines
7.6 KiB
JavaScript
'use strict';
|
|
|
|
const assert = require('assert');
|
|
const fs = require('fs');
|
|
const os = require('os');
|
|
const path = require('path');
|
|
|
|
const {
|
|
buildSessionSnapshot,
|
|
loadWorkerSnapshots,
|
|
parseWorkerHandoff,
|
|
parseWorkerStatus,
|
|
parseWorkerTask,
|
|
resolveSnapshotTarget
|
|
} = require('../../scripts/lib/orchestration-session');
|
|
|
|
console.log('=== Testing orchestration-session.js ===\n');
|
|
|
|
let passed = 0;
|
|
let failed = 0;
|
|
|
|
function test(desc, fn) {
|
|
try {
|
|
fn();
|
|
console.log(` ✓ ${desc}`);
|
|
passed++;
|
|
} catch (error) {
|
|
console.log(` ✗ ${desc}: ${error.message}`);
|
|
failed++;
|
|
}
|
|
}
|
|
|
|
test('parseWorkerStatus extracts structured status fields', () => {
|
|
const status = parseWorkerStatus([
|
|
'# Status',
|
|
'',
|
|
'- State: completed',
|
|
'- Updated: 2026-03-12T14:09:15Z',
|
|
'- Branch: feature-branch',
|
|
'- Worktree: `/tmp/worktree`',
|
|
'',
|
|
'- Handoff file: `/tmp/handoff.md`'
|
|
].join('\n'));
|
|
|
|
assert.deepStrictEqual(status, {
|
|
state: 'completed',
|
|
updated: '2026-03-12T14:09:15Z',
|
|
branch: 'feature-branch',
|
|
worktree: '/tmp/worktree',
|
|
taskFile: null,
|
|
handoffFile: '/tmp/handoff.md'
|
|
});
|
|
});
|
|
|
|
test('parseWorkerTask extracts objective and seeded overlays', () => {
|
|
const task = parseWorkerTask([
|
|
'# Worker Task',
|
|
'',
|
|
'## Seeded Local Overlays',
|
|
'- `scripts/orchestrate-worktrees.js`',
|
|
'- `commands/orchestrate.md`',
|
|
'',
|
|
'## Objective',
|
|
'Verify seeded files and summarize status.'
|
|
].join('\n'));
|
|
|
|
assert.deepStrictEqual(task.seedPaths, [
|
|
'scripts/orchestrate-worktrees.js',
|
|
'commands/orchestrate.md'
|
|
]);
|
|
assert.strictEqual(task.objective, 'Verify seeded files and summarize status.');
|
|
});
|
|
|
|
test('parseWorkerHandoff extracts summary, validation, and risks', () => {
|
|
const handoff = parseWorkerHandoff([
|
|
'# Handoff',
|
|
'',
|
|
'## Summary',
|
|
'- Worker completed successfully',
|
|
'',
|
|
'## Validation',
|
|
'- Ran tests',
|
|
'',
|
|
'## Remaining Risks',
|
|
'- No runtime screenshot'
|
|
].join('\n'));
|
|
|
|
assert.deepStrictEqual(handoff.summary, ['Worker completed successfully']);
|
|
assert.deepStrictEqual(handoff.validation, ['Ran tests']);
|
|
assert.deepStrictEqual(handoff.remainingRisks, ['No runtime screenshot']);
|
|
});
|
|
|
|
test('parseWorkerHandoff also supports bold section headers', () => {
|
|
const handoff = parseWorkerHandoff([
|
|
'# Handoff',
|
|
'',
|
|
'**Summary**',
|
|
'- Worker completed successfully',
|
|
'',
|
|
'**Validation**',
|
|
'- Ran tests',
|
|
'',
|
|
'**Remaining Risks**',
|
|
'- No runtime screenshot'
|
|
].join('\n'));
|
|
|
|
assert.deepStrictEqual(handoff.summary, ['Worker completed successfully']);
|
|
assert.deepStrictEqual(handoff.validation, ['Ran tests']);
|
|
assert.deepStrictEqual(handoff.remainingRisks, ['No runtime screenshot']);
|
|
});
|
|
|
|
test('loadWorkerSnapshots reads coordination worker directories', () => {
|
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-orch-session-'));
|
|
const coordinationDir = path.join(tempRoot, 'coordination');
|
|
const workerDir = path.join(coordinationDir, 'seed-check');
|
|
const proofDir = path.join(coordinationDir, 'proof');
|
|
fs.mkdirSync(workerDir, { recursive: true });
|
|
fs.mkdirSync(proofDir, { recursive: true });
|
|
|
|
try {
|
|
fs.writeFileSync(path.join(workerDir, 'status.md'), [
|
|
'# Status',
|
|
'',
|
|
'- State: running',
|
|
'- Branch: seed-branch',
|
|
'- Worktree: `/tmp/seed-worktree`'
|
|
].join('\n'));
|
|
fs.writeFileSync(path.join(workerDir, 'task.md'), [
|
|
'# Worker Task',
|
|
'',
|
|
'## Objective',
|
|
'Inspect seed paths.'
|
|
].join('\n'));
|
|
fs.writeFileSync(path.join(workerDir, 'handoff.md'), [
|
|
'# Handoff',
|
|
'',
|
|
'## Summary',
|
|
'- Pending'
|
|
].join('\n'));
|
|
|
|
const workers = loadWorkerSnapshots(coordinationDir);
|
|
assert.strictEqual(workers.length, 1);
|
|
assert.strictEqual(workers[0].workerSlug, 'seed-check');
|
|
assert.strictEqual(workers[0].status.branch, 'seed-branch');
|
|
assert.strictEqual(workers[0].task.objective, 'Inspect seed paths.');
|
|
} finally {
|
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('buildSessionSnapshot merges tmux panes with worker metadata', () => {
|
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-orch-snapshot-'));
|
|
const coordinationDir = path.join(tempRoot, 'coordination');
|
|
const workerDir = path.join(coordinationDir, 'seed-check');
|
|
fs.mkdirSync(workerDir, { recursive: true });
|
|
|
|
try {
|
|
fs.writeFileSync(path.join(workerDir, 'status.md'), '- State: completed\n- Branch: seed-branch\n');
|
|
fs.writeFileSync(path.join(workerDir, 'task.md'), '## Objective\nInspect seed paths.\n');
|
|
fs.writeFileSync(path.join(workerDir, 'handoff.md'), '## Summary\n- ok\n');
|
|
|
|
const snapshot = buildSessionSnapshot({
|
|
sessionName: 'workflow-visual-proof',
|
|
coordinationDir,
|
|
panes: [
|
|
{
|
|
paneId: '%95',
|
|
windowIndex: 1,
|
|
paneIndex: 2,
|
|
title: 'seed-check',
|
|
currentCommand: 'codex',
|
|
currentPath: '/tmp/worktree',
|
|
active: false,
|
|
dead: false,
|
|
pid: 1234
|
|
}
|
|
]
|
|
});
|
|
|
|
assert.strictEqual(snapshot.sessionActive, true);
|
|
assert.strictEqual(snapshot.workerCount, 1);
|
|
assert.strictEqual(snapshot.workerStates.completed, 1);
|
|
assert.strictEqual(snapshot.workers[0].pane.paneId, '%95');
|
|
} finally {
|
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('resolveSnapshotTarget handles plan files and direct session names', () => {
|
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-orch-target-'));
|
|
const repoRoot = path.join(tempRoot, 'repo');
|
|
fs.mkdirSync(repoRoot, { recursive: true });
|
|
const planPath = path.join(repoRoot, 'plan.json');
|
|
fs.writeFileSync(planPath, JSON.stringify({
|
|
sessionName: 'workflow-visual-proof',
|
|
repoRoot,
|
|
coordinationRoot: path.join(repoRoot, '.claude', 'orchestration')
|
|
}));
|
|
|
|
try {
|
|
const fromPlan = resolveSnapshotTarget(planPath, repoRoot);
|
|
assert.strictEqual(fromPlan.targetType, 'plan');
|
|
assert.strictEqual(fromPlan.sessionName, 'workflow-visual-proof');
|
|
|
|
const fromSession = resolveSnapshotTarget('workflow-visual-proof', repoRoot);
|
|
assert.strictEqual(fromSession.targetType, 'session');
|
|
assert.ok(fromSession.coordinationDir.endsWith(path.join('.orchestration', 'workflow-visual-proof')));
|
|
} finally {
|
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('resolveSnapshotTarget normalizes plan session names and defaults to the repo name', () => {
|
|
const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'ecc-orch-target-'));
|
|
const repoRoot = path.join(tempRoot, 'My Repo');
|
|
fs.mkdirSync(repoRoot, { recursive: true });
|
|
|
|
const namedPlanPath = path.join(repoRoot, 'named-plan.json');
|
|
const defaultPlanPath = path.join(repoRoot, 'default-plan.json');
|
|
|
|
fs.writeFileSync(namedPlanPath, JSON.stringify({
|
|
sessionName: 'Workflow Visual Proof',
|
|
repoRoot
|
|
}));
|
|
fs.writeFileSync(defaultPlanPath, JSON.stringify({ repoRoot }));
|
|
|
|
try {
|
|
const namedPlan = resolveSnapshotTarget(namedPlanPath, repoRoot);
|
|
assert.strictEqual(namedPlan.sessionName, 'workflow-visual-proof');
|
|
assert.ok(namedPlan.coordinationDir.endsWith(path.join('.orchestration', 'workflow-visual-proof')));
|
|
|
|
const defaultPlan = resolveSnapshotTarget(defaultPlanPath, repoRoot);
|
|
assert.strictEqual(defaultPlan.sessionName, 'my-repo');
|
|
assert.ok(defaultPlan.coordinationDir.endsWith(path.join('.orchestration', 'my-repo')));
|
|
} finally {
|
|
fs.rmSync(tempRoot, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
console.log(`\n=== Results: ${passed} passed, ${failed} failed ===`);
|
|
if (failed > 0) process.exit(1);
|