@coralai/sps-cli 0.24.4 → 0.24.6

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 (69) hide show
  1. package/dist/core/config.d.ts.map +1 -1
  2. package/dist/core/config.js +3 -70
  3. package/dist/core/config.js.map +1 -1
  4. package/dist/core/config.test.d.ts +2 -0
  5. package/dist/core/config.test.d.ts.map +1 -0
  6. package/dist/core/config.test.js +363 -0
  7. package/dist/core/config.test.js.map +1 -0
  8. package/dist/core/lock.d.ts.map +1 -1
  9. package/dist/core/lock.js +8 -5
  10. package/dist/core/lock.js.map +1 -1
  11. package/dist/core/lock.test.d.ts +2 -0
  12. package/dist/core/lock.test.d.ts.map +1 -0
  13. package/dist/core/lock.test.js +103 -0
  14. package/dist/core/lock.test.js.map +1 -0
  15. package/dist/core/queue.test.d.ts +2 -0
  16. package/dist/core/queue.test.d.ts.map +1 -0
  17. package/dist/core/queue.test.js +99 -0
  18. package/dist/core/queue.test.js.map +1 -0
  19. package/dist/core/shellEnv.d.ts +20 -0
  20. package/dist/core/shellEnv.d.ts.map +1 -0
  21. package/dist/core/shellEnv.js +78 -0
  22. package/dist/core/shellEnv.js.map +1 -0
  23. package/dist/core/shellEnv.test.d.ts +2 -0
  24. package/dist/core/shellEnv.test.d.ts.map +1 -0
  25. package/dist/core/shellEnv.test.js +101 -0
  26. package/dist/core/shellEnv.test.js.map +1 -0
  27. package/dist/core/state.test.d.ts +2 -0
  28. package/dist/core/state.test.d.ts.map +1 -0
  29. package/dist/core/state.test.js +322 -0
  30. package/dist/core/state.test.js.map +1 -0
  31. package/dist/manager/completion-judge.d.ts.map +1 -1
  32. package/dist/manager/completion-judge.js +12 -2
  33. package/dist/manager/completion-judge.js.map +1 -1
  34. package/dist/manager/completion-judge.test.d.ts +2 -0
  35. package/dist/manager/completion-judge.test.d.ts.map +1 -0
  36. package/dist/manager/completion-judge.test.js +218 -0
  37. package/dist/manager/completion-judge.test.js.map +1 -0
  38. package/dist/manager/integration-queue.test.d.ts +2 -0
  39. package/dist/manager/integration-queue.test.d.ts.map +1 -0
  40. package/dist/manager/integration-queue.test.js +195 -0
  41. package/dist/manager/integration-queue.test.js.map +1 -0
  42. package/dist/manager/resource-limiter.test.d.ts +2 -0
  43. package/dist/manager/resource-limiter.test.d.ts.map +1 -0
  44. package/dist/manager/resource-limiter.test.js +103 -0
  45. package/dist/manager/resource-limiter.test.js.map +1 -0
  46. package/dist/manager/supervisor.d.ts +0 -1
  47. package/dist/manager/supervisor.d.ts.map +1 -1
  48. package/dist/manager/supervisor.js +5 -40
  49. package/dist/manager/supervisor.js.map +1 -1
  50. package/dist/manager/supervisor.test.d.ts +2 -0
  51. package/dist/manager/supervisor.test.d.ts.map +1 -0
  52. package/dist/manager/supervisor.test.js +245 -0
  53. package/dist/manager/supervisor.test.js.map +1 -0
  54. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  55. package/dist/manager/worker-manager-impl.js +7 -0
  56. package/dist/manager/worker-manager-impl.js.map +1 -1
  57. package/dist/manager/worker-manager-impl.test.d.ts +2 -0
  58. package/dist/manager/worker-manager-impl.test.d.ts.map +1 -0
  59. package/dist/manager/worker-manager-impl.test.js +528 -0
  60. package/dist/manager/worker-manager-impl.test.js.map +1 -0
  61. package/dist/providers/outputParser.test.d.ts +2 -0
  62. package/dist/providers/outputParser.test.d.ts.map +1 -0
  63. package/dist/providers/outputParser.test.js +203 -0
  64. package/dist/providers/outputParser.test.js.map +1 -0
  65. package/dist/test-setup.d.ts +2 -0
  66. package/dist/test-setup.d.ts.map +1 -0
  67. package/dist/test-setup.js +18 -0
  68. package/dist/test-setup.js.map +1 -0
  69. package/package.json +7 -2
@@ -0,0 +1,322 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, writeFileSync, readFileSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { readState, writeState, createIdleWorkerSlot, } from './state.js';
6
+ // ─── Helpers ──────────────────────────────────────────────────────
7
+ function makeTempDir() {
8
+ return mkdtempSync(join(tmpdir(), 'sps-state-test-'));
9
+ }
10
+ function makeState(overrides) {
11
+ return {
12
+ version: 1,
13
+ generation: 0,
14
+ updatedAt: '2026-01-01T00:00:00.000Z',
15
+ updatedBy: 'test',
16
+ workers: { 'worker-1': createIdleWorkerSlot() },
17
+ activeCards: {},
18
+ leases: {},
19
+ worktreeEvidence: {},
20
+ worktreeCleanup: [],
21
+ sessions: {},
22
+ integrationQueues: {},
23
+ pendingPMActions: [],
24
+ ...overrides,
25
+ };
26
+ }
27
+ // ─── Tests ────────────────────────────────────────────────────────
28
+ describe('createIdleWorkerSlot', () => {
29
+ it('returns a slot with idle status and null fields', () => {
30
+ const slot = createIdleWorkerSlot();
31
+ expect(slot.status).toBe('idle');
32
+ expect(slot.seq).toBeNull();
33
+ expect(slot.branch).toBeNull();
34
+ expect(slot.worktree).toBeNull();
35
+ expect(slot.pid).toBeNull();
36
+ expect(slot.exitCode).toBeNull();
37
+ expect(slot.mergeRetries).toBe(0);
38
+ expect(slot.mode).toBeNull();
39
+ expect(slot.transport).toBeNull();
40
+ expect(slot.agent).toBeNull();
41
+ });
42
+ it('creates independent instances (no shared reference)', () => {
43
+ const a = createIdleWorkerSlot();
44
+ const b = createIdleWorkerSlot();
45
+ a.status = 'active';
46
+ expect(b.status).toBe('idle');
47
+ });
48
+ });
49
+ describe('readState', () => {
50
+ let tempDir;
51
+ beforeEach(() => {
52
+ tempDir = makeTempDir();
53
+ });
54
+ afterEach(() => {
55
+ rmSync(tempDir, { recursive: true, force: true });
56
+ });
57
+ it('returns default state when file does not exist', () => {
58
+ const stateFile = join(tempDir, 'nonexistent.json');
59
+ const state = readState(stateFile, 2);
60
+ expect(state.version).toBe(1);
61
+ expect(state.generation).toBe(0);
62
+ expect(Object.keys(state.workers)).toHaveLength(2);
63
+ expect(state.workers['worker-1'].status).toBe('idle');
64
+ expect(state.workers['worker-2'].status).toBe('idle');
65
+ expect(state.activeCards).toEqual({});
66
+ expect(state.leases).toEqual({});
67
+ });
68
+ it('creates N worker slots based on maxWorkers', () => {
69
+ const stateFile = join(tempDir, 'nonexistent.json');
70
+ const state = readState(stateFile, 5);
71
+ expect(Object.keys(state.workers)).toHaveLength(5);
72
+ for (let i = 1; i <= 5; i++) {
73
+ expect(state.workers[`worker-${i}`]).toBeDefined();
74
+ }
75
+ });
76
+ it('reads and reconciles an existing state file', () => {
77
+ const stateFile = join(tempDir, 'state.json');
78
+ const existing = makeState({
79
+ generation: 42,
80
+ workers: {
81
+ 'worker-1': { ...createIdleWorkerSlot(), status: 'active', seq: 3 },
82
+ },
83
+ });
84
+ writeFileSync(stateFile, JSON.stringify(existing));
85
+ const state = readState(stateFile, 2);
86
+ expect(state.generation).toBe(42);
87
+ expect(state.workers['worker-1'].status).toBe('active');
88
+ expect(state.workers['worker-1'].seq).toBe(3);
89
+ // Worker-2 should be added by reconciliation
90
+ expect(state.workers['worker-2'].status).toBe('idle');
91
+ });
92
+ it('returns default state on invalid JSON', () => {
93
+ const stateFile = join(tempDir, 'state.json');
94
+ writeFileSync(stateFile, 'NOT JSON');
95
+ const state = readState(stateFile, 1);
96
+ expect(state.version).toBe(1);
97
+ expect(state.generation).toBe(0);
98
+ });
99
+ it('grows worker slots when maxWorkers increases', () => {
100
+ const stateFile = join(tempDir, 'state.json');
101
+ const existing = makeState({
102
+ workers: {
103
+ 'worker-1': { ...createIdleWorkerSlot(), status: 'active', seq: 1 },
104
+ },
105
+ });
106
+ writeFileSync(stateFile, JSON.stringify(existing));
107
+ // Read with higher maxWorkers
108
+ const state = readState(stateFile, 4);
109
+ expect(Object.keys(state.workers)).toHaveLength(4);
110
+ expect(state.workers['worker-1'].status).toBe('active');
111
+ expect(state.workers['worker-2'].status).toBe('idle');
112
+ expect(state.workers['worker-3'].status).toBe('idle');
113
+ expect(state.workers['worker-4'].status).toBe('idle');
114
+ });
115
+ it('fills in missing fields on legacy worker slots', () => {
116
+ const stateFile = join(tempDir, 'state.json');
117
+ // Simulate a legacy state file without new fields
118
+ const legacy = {
119
+ version: 1,
120
+ generation: 5,
121
+ updatedAt: '2026-01-01T00:00:00.000Z',
122
+ updatedBy: 'old',
123
+ workers: {
124
+ 'worker-1': {
125
+ status: 'active',
126
+ seq: 2,
127
+ branch: 'feat-1',
128
+ worktree: '/tmp/wt',
129
+ tmuxSession: null,
130
+ claimedAt: '2026-01-01T00:00:00.000Z',
131
+ lastHeartbeat: null,
132
+ // No mode, transport, agent, pid, etc.
133
+ },
134
+ },
135
+ activeCards: {},
136
+ };
137
+ writeFileSync(stateFile, JSON.stringify(legacy));
138
+ const state = readState(stateFile, 1);
139
+ const w = state.workers['worker-1'];
140
+ expect(w.status).toBe('active');
141
+ expect(w.seq).toBe(2);
142
+ // New fields should have defaults from createIdleWorkerSlot
143
+ expect(w.mode).toBeNull();
144
+ expect(w.transport).toBeNull();
145
+ expect(w.pid).toBeNull();
146
+ expect(w.mergeRetries).toBe(0);
147
+ });
148
+ it('reconciles activeCards with missing retryCount', () => {
149
+ const stateFile = join(tempDir, 'state.json');
150
+ const existing = makeState({
151
+ activeCards: {
152
+ '1': {
153
+ seq: 1,
154
+ state: 'Inprogress',
155
+ worker: 'worker-1',
156
+ mrUrl: null,
157
+ conflictDomains: [],
158
+ startedAt: '2026-01-01T00:00:00.000Z',
159
+ // no retryCount
160
+ },
161
+ },
162
+ });
163
+ writeFileSync(stateFile, JSON.stringify(existing));
164
+ const state = readState(stateFile, 1);
165
+ expect(state.activeCards['1'].retryCount).toBe(0);
166
+ });
167
+ it('reconciles leases with missing retryCount', () => {
168
+ const stateFile = join(tempDir, 'state.json');
169
+ const existing = makeState({
170
+ leases: {
171
+ '5': {
172
+ seq: 5,
173
+ pmStateObserved: 'Inprogress',
174
+ phase: 'coding',
175
+ slot: 'worker-1',
176
+ branch: 'feat-5',
177
+ worktree: '/tmp/wt',
178
+ sessionId: null,
179
+ runId: null,
180
+ claimedAt: '2026-01-01T00:00:00.000Z',
181
+ lastTransitionAt: '2026-01-01T00:00:00.000Z',
182
+ // no retryCount
183
+ },
184
+ },
185
+ });
186
+ writeFileSync(stateFile, JSON.stringify(existing));
187
+ const state = readState(stateFile, 1);
188
+ expect(state.leases['5'].retryCount).toBe(0);
189
+ });
190
+ });
191
+ describe('writeState', () => {
192
+ let tempDir;
193
+ beforeEach(() => {
194
+ tempDir = makeTempDir();
195
+ });
196
+ afterEach(() => {
197
+ rmSync(tempDir, { recursive: true, force: true });
198
+ });
199
+ it('writes state atomically (temp + rename)', () => {
200
+ const stateFile = join(tempDir, 'state.json');
201
+ const state = makeState();
202
+ writeState(stateFile, state, 'test-writer');
203
+ expect(existsSync(stateFile)).toBe(true);
204
+ const raw = JSON.parse(readFileSync(stateFile, 'utf-8'));
205
+ expect(raw.updatedBy).toBe('test-writer');
206
+ expect(raw.generation).toBe(1);
207
+ });
208
+ it('increments generation on each write', () => {
209
+ const stateFile = join(tempDir, 'state.json');
210
+ const state = makeState({ generation: 10 });
211
+ writeState(stateFile, state, 'w1');
212
+ expect(state.generation).toBe(11);
213
+ writeState(stateFile, state, 'w2');
214
+ expect(state.generation).toBe(12);
215
+ const raw = JSON.parse(readFileSync(stateFile, 'utf-8'));
216
+ expect(raw.generation).toBe(12);
217
+ });
218
+ it('updates the updatedAt timestamp', () => {
219
+ const stateFile = join(tempDir, 'state.json');
220
+ const state = makeState({ updatedAt: '2020-01-01T00:00:00.000Z' });
221
+ writeState(stateFile, state, 'ts-test');
222
+ expect(state.updatedAt).not.toBe('2020-01-01T00:00:00.000Z');
223
+ const parsed = new Date(state.updatedAt);
224
+ expect(parsed.getFullYear()).toBeGreaterThanOrEqual(2026);
225
+ });
226
+ it('creates parent directories if missing', () => {
227
+ const stateFile = join(tempDir, 'deep', 'nested', 'state.json');
228
+ const state = makeState();
229
+ writeState(stateFile, state, 'mkdir-test');
230
+ expect(existsSync(stateFile)).toBe(true);
231
+ });
232
+ it('produces valid JSON that can be read back', () => {
233
+ const stateFile = join(tempDir, 'state.json');
234
+ const state = makeState({
235
+ workers: {
236
+ 'worker-1': {
237
+ ...createIdleWorkerSlot(),
238
+ status: 'active',
239
+ seq: 7,
240
+ branch: 'feat-7',
241
+ pid: 12345,
242
+ },
243
+ },
244
+ activeCards: {
245
+ '7': {
246
+ seq: 7,
247
+ state: 'Inprogress',
248
+ worker: 'worker-1',
249
+ mrUrl: null,
250
+ conflictDomains: ['auth'],
251
+ startedAt: '2026-01-01T00:00:00.000Z',
252
+ retryCount: 1,
253
+ },
254
+ },
255
+ });
256
+ writeState(stateFile, state, 'roundtrip');
257
+ const readBack = readState(stateFile, 1);
258
+ expect(readBack.workers['worker-1'].status).toBe('active');
259
+ expect(readBack.workers['worker-1'].seq).toBe(7);
260
+ expect(readBack.workers['worker-1'].pid).toBe(12345);
261
+ expect(readBack.activeCards['7'].conflictDomains).toEqual(['auth']);
262
+ expect(readBack.activeCards['7'].retryCount).toBe(1);
263
+ });
264
+ it('does not leave temp files on success', () => {
265
+ const stateFile = join(tempDir, 'state.json');
266
+ const state = makeState();
267
+ writeState(stateFile, state, 'clean');
268
+ const { readdirSync } = require('node:fs');
269
+ const files = readdirSync(tempDir);
270
+ const tmpFiles = files.filter((f) => f.endsWith('.tmp'));
271
+ expect(tmpFiles).toHaveLength(0);
272
+ });
273
+ });
274
+ describe('state roundtrip with reconciliation', () => {
275
+ let tempDir;
276
+ beforeEach(() => {
277
+ tempDir = makeTempDir();
278
+ });
279
+ afterEach(() => {
280
+ rmSync(tempDir, { recursive: true, force: true });
281
+ });
282
+ it('write then read preserves all data', () => {
283
+ const stateFile = join(tempDir, 'state.json');
284
+ const state = makeState({
285
+ sessions: { 'sess-1': { sessionId: 'abc', slotName: 'worker-1' } },
286
+ pendingPMActions: [
287
+ {
288
+ type: 'move',
289
+ taskId: '5',
290
+ project: 'test',
291
+ target: 'Done',
292
+ createdAt: '2026-01-01T00:00:00.000Z',
293
+ retryCount: 0,
294
+ },
295
+ ],
296
+ });
297
+ writeState(stateFile, state, 'roundtrip');
298
+ const read = readState(stateFile, 1);
299
+ expect(read.sessions['sess-1']).toBeDefined();
300
+ expect(read.pendingPMActions).toHaveLength(1);
301
+ expect(read.pendingPMActions[0].type).toBe('move');
302
+ expect(read.pendingPMActions[0].taskId).toBe('5');
303
+ });
304
+ it('handles missing top-level fields gracefully', () => {
305
+ const stateFile = join(tempDir, 'state.json');
306
+ // Minimal state file — missing many fields
307
+ writeFileSync(stateFile, JSON.stringify({
308
+ workers: {
309
+ 'worker-1': { status: 'idle', seq: null },
310
+ },
311
+ }));
312
+ const state = readState(stateFile, 2);
313
+ expect(state.version).toBe(1);
314
+ expect(state.generation).toBe(0);
315
+ expect(state.worktreeCleanup).toEqual([]);
316
+ expect(state.sessions).toEqual({});
317
+ expect(state.integrationQueues).toEqual({});
318
+ expect(state.pendingPMActions).toEqual([]);
319
+ expect(Object.keys(state.workers)).toHaveLength(2);
320
+ });
321
+ });
322
+ //# sourceMappingURL=state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.test.js","sourceRoot":"","sources":["../../src/core/state.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"completion-judge.d.ts","sourceRoot":"","sources":["../../src/manager/completion-judge.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,qBAAa,eAAe;IAE1B;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB;IAgE1C,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,GAAG;CAGZ"}
1
+ {"version":3,"file":"completion-judge.d.ts","sourceRoot":"","sources":["../../src/manager/completion-judge.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,qBAAa,eAAe;IAE1B;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,gBAAgB;IA0E1C,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,GAAG;CAGZ"}
@@ -31,8 +31,18 @@ export class CompletionJudge {
31
31
  const { worktree, branch, baseBranch, outputFile, exitCode, logsDir, phase } = input;
32
32
  const mergedToBase = this.isMergedToBase(worktree, branch, baseBranch);
33
33
  if (mergedToBase) {
34
- this.log(`Branch ${branch} already merged into ${baseBranch}`);
35
- return { status: 'completed', reason: 'already_merged' };
34
+ // Guard: a freshly created branch with no work is trivially an
35
+ // ancestor of origin/base. Only trust "already merged" if:
36
+ // - Branch was pushed (worker pushed their work), OR
37
+ // - Branch has local commits ahead (worker committed locally)
38
+ // Without either, the branch just sits at the base commit.
39
+ const pushed = branchPushed(worktree, branch);
40
+ const localAhead = branchCommitsAhead(worktree, branch, baseBranch);
41
+ if (pushed || localAhead > 0) {
42
+ this.log(`Branch ${branch} already merged into ${baseBranch}`);
43
+ return { status: 'completed', reason: 'already_merged' };
44
+ }
45
+ this.log(`Branch ${branch} is ancestor of ${baseBranch} but has no artifacts — not a real merge`);
36
46
  }
37
47
  if (phase === 'integration') {
38
48
  if (exitCode === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"completion-judge.js","sourceRoot":"","sources":["../../src/manager/completion-judge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completion-judge.js","sourceRoot":"","sources":["../../src/manager/completion-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=completion-judge.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-judge.test.d.ts","sourceRoot":"","sources":["../../src/manager/completion-judge.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,218 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { execFileSync } from 'node:child_process';
6
+ import { CompletionJudge } from './completion-judge.js';
7
+ // ─── Helpers ──────────────────────────────────────────────────────
8
+ function makeTempDir() {
9
+ return mkdtempSync(join(tmpdir(), 'sps-judge-test-'));
10
+ }
11
+ /** Create a minimal git repo with a branch for testing */
12
+ function initGitRepo(dir, baseBranch = 'main') {
13
+ execFileSync('git', ['init', '-b', baseBranch, dir], { stdio: 'pipe' });
14
+ execFileSync('git', ['-C', dir, 'config', 'user.email', 'test@test.com'], { stdio: 'pipe' });
15
+ execFileSync('git', ['-C', dir, 'config', 'user.name', 'Test'], { stdio: 'pipe' });
16
+ writeFileSync(join(dir, 'README.md'), '# Test\n');
17
+ execFileSync('git', ['-C', dir, 'add', '.'], { stdio: 'pipe' });
18
+ execFileSync('git', ['-C', dir, 'commit', '-m', 'init'], { stdio: 'pipe' });
19
+ }
20
+ function createBranch(dir, branch) {
21
+ execFileSync('git', ['-C', dir, 'checkout', '-b', branch], { stdio: 'pipe' });
22
+ }
23
+ function addCommit(dir, filename, content, message) {
24
+ writeFileSync(join(dir, filename), content);
25
+ execFileSync('git', ['-C', dir, 'add', filename], { stdio: 'pipe' });
26
+ execFileSync('git', ['-C', dir, 'commit', '-m', message], { stdio: 'pipe' });
27
+ }
28
+ function checkoutBranch(dir, branch) {
29
+ execFileSync('git', ['-C', dir, 'checkout', branch], { stdio: 'pipe' });
30
+ }
31
+ function makeInput(overrides) {
32
+ return {
33
+ worktree: '/tmp/wt',
34
+ branch: 'feat-1',
35
+ baseBranch: 'main',
36
+ outputFile: null,
37
+ exitCode: 0,
38
+ phase: 'development',
39
+ ...overrides,
40
+ };
41
+ }
42
+ // ─── Tests ────────────────────────────────────────────────────────
43
+ describe('CompletionJudge', () => {
44
+ let judge;
45
+ let tempDir;
46
+ beforeEach(() => {
47
+ judge = new CompletionJudge();
48
+ tempDir = makeTempDir();
49
+ });
50
+ afterEach(() => {
51
+ rmSync(tempDir, { recursive: true, force: true });
52
+ });
53
+ describe('development phase', () => {
54
+ it('returns completed when branch has local commits ahead', () => {
55
+ initGitRepo(tempDir);
56
+ createBranch(tempDir, 'feat-1');
57
+ addCommit(tempDir, 'feature.ts', 'code', 'feat: add feature');
58
+ // Need to simulate origin/main — create a bare remote
59
+ const bareDir = makeTempDir();
60
+ execFileSync('git', ['clone', '--bare', tempDir, bareDir], { stdio: 'pipe' });
61
+ execFileSync('git', ['-C', tempDir, 'remote', 'add', 'origin', bareDir], { stdio: 'pipe' });
62
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'main'], { stdio: 'pipe' });
63
+ const result = judge.judge(makeInput({
64
+ worktree: tempDir,
65
+ branch: 'feat-1',
66
+ baseBranch: 'main',
67
+ }));
68
+ expect(result.status).toBe('completed');
69
+ expect(result.reason).toBe('branch_local_commits');
70
+ rmSync(bareDir, { recursive: true, force: true });
71
+ });
72
+ it('returns completed when branch is pushed with commits ahead', () => {
73
+ initGitRepo(tempDir);
74
+ createBranch(tempDir, 'feat-2');
75
+ addCommit(tempDir, 'feature.ts', 'code', 'feat: add feature');
76
+ const bareDir = makeTempDir();
77
+ execFileSync('git', ['clone', '--bare', tempDir, bareDir], { stdio: 'pipe' });
78
+ execFileSync('git', ['-C', tempDir, 'remote', 'add', 'origin', bareDir], { stdio: 'pipe' });
79
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'main'], { stdio: 'pipe' });
80
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'feat-2'], { stdio: 'pipe' });
81
+ const result = judge.judge(makeInput({
82
+ worktree: tempDir,
83
+ branch: 'feat-2',
84
+ baseBranch: 'main',
85
+ }));
86
+ expect(result.status).toBe('completed');
87
+ expect(result.reason).toBe('branch_pushed');
88
+ rmSync(bareDir, { recursive: true, force: true });
89
+ });
90
+ it('returns completed when marker file exists', () => {
91
+ initGitRepo(tempDir);
92
+ createBranch(tempDir, 'feat-marker');
93
+ // Add a unique commit on the branch so it diverges
94
+ addCommit(tempDir, 'marker-work.ts', 'work', 'feat: marker work');
95
+ const logsDir = join(tempDir, 'logs');
96
+ mkdirSync(logsDir);
97
+ writeFileSync(join(logsDir, 'task_completed'), '');
98
+ // Diverge main so branch is not considered merged
99
+ checkoutBranch(tempDir, 'main');
100
+ addCommit(tempDir, 'main-diverge.ts', 'diverge', 'chore: diverge main');
101
+ const bareDir = makeTempDir();
102
+ execFileSync('git', ['clone', '--bare', tempDir, bareDir], { stdio: 'pipe' });
103
+ execFileSync('git', ['-C', tempDir, 'remote', 'add', 'origin', bareDir], { stdio: 'pipe' });
104
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'main'], { stdio: 'pipe' });
105
+ checkoutBranch(tempDir, 'feat-marker');
106
+ const result = judge.judge(makeInput({
107
+ worktree: tempDir,
108
+ branch: 'feat-marker',
109
+ baseBranch: 'main',
110
+ logsDir,
111
+ }));
112
+ expect(result.status).toBe('completed');
113
+ expect(result.reason).toBe('marker_file');
114
+ rmSync(bareDir, { recursive: true, force: true });
115
+ });
116
+ it('returns incomplete with no artifacts and exit code 0', () => {
117
+ // No remote set up — simulates worker crash before any work done
118
+ // All git artifact checks fail gracefully, falling through to no_artifacts
119
+ initGitRepo(tempDir);
120
+ createBranch(tempDir, 'feat-empty');
121
+ const result = judge.judge(makeInput({
122
+ worktree: tempDir,
123
+ branch: 'feat-empty',
124
+ baseBranch: 'main',
125
+ exitCode: 0,
126
+ }));
127
+ expect(result.status).toBe('incomplete');
128
+ expect(result.reason).toBe('no_artifacts');
129
+ });
130
+ it('returns failed with non-zero exit code and no artifacts', () => {
131
+ // No remote — git checks fail, falls through to crash detection
132
+ initGitRepo(tempDir);
133
+ createBranch(tempDir, 'feat-crash');
134
+ const result = judge.judge(makeInput({
135
+ worktree: tempDir,
136
+ branch: 'feat-crash',
137
+ baseBranch: 'main',
138
+ exitCode: 1,
139
+ }));
140
+ expect(result.status).toBe('failed');
141
+ expect(result.reason).toBe('crash(1)');
142
+ });
143
+ it('returns completed when branch is already merged to base', () => {
144
+ initGitRepo(tempDir);
145
+ createBranch(tempDir, 'feat-merged');
146
+ addCommit(tempDir, 'feature.ts', 'code', 'feat: done');
147
+ checkoutBranch(tempDir, 'main');
148
+ execFileSync('git', ['-C', tempDir, 'merge', 'feat-merged'], { stdio: 'pipe' });
149
+ const bareDir = makeTempDir();
150
+ execFileSync('git', ['clone', '--bare', tempDir, bareDir], { stdio: 'pipe' });
151
+ execFileSync('git', ['-C', tempDir, 'remote', 'add', 'origin', bareDir], { stdio: 'pipe' });
152
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'main'], { stdio: 'pipe' });
153
+ // Push the feature branch too — simulates worker having pushed their work
154
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'feat-merged'], { stdio: 'pipe' });
155
+ checkoutBranch(tempDir, 'feat-merged');
156
+ const result = judge.judge(makeInput({
157
+ worktree: tempDir,
158
+ branch: 'feat-merged',
159
+ baseBranch: 'main',
160
+ }));
161
+ expect(result.status).toBe('completed');
162
+ expect(result.reason).toBe('already_merged');
163
+ rmSync(bareDir, { recursive: true, force: true });
164
+ });
165
+ });
166
+ describe('integration phase', () => {
167
+ it('returns completed when branch is merged', () => {
168
+ initGitRepo(tempDir);
169
+ createBranch(tempDir, 'feat-int');
170
+ addCommit(tempDir, 'feature.ts', 'code', 'feat: done');
171
+ checkoutBranch(tempDir, 'main');
172
+ execFileSync('git', ['-C', tempDir, 'merge', 'feat-int'], { stdio: 'pipe' });
173
+ const bareDir = makeTempDir();
174
+ execFileSync('git', ['clone', '--bare', tempDir, bareDir], { stdio: 'pipe' });
175
+ execFileSync('git', ['-C', tempDir, 'remote', 'add', 'origin', bareDir], { stdio: 'pipe' });
176
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'main'], { stdio: 'pipe' });
177
+ execFileSync('git', ['-C', tempDir, 'push', 'origin', 'feat-int'], { stdio: 'pipe' });
178
+ checkoutBranch(tempDir, 'feat-int');
179
+ const result = judge.judge(makeInput({
180
+ worktree: tempDir,
181
+ branch: 'feat-int',
182
+ baseBranch: 'main',
183
+ phase: 'integration',
184
+ }));
185
+ expect(result.status).toBe('completed');
186
+ expect(result.reason).toBe('already_merged');
187
+ rmSync(bareDir, { recursive: true, force: true });
188
+ });
189
+ it('returns incomplete when exit 0 but not merged', () => {
190
+ // No remote — isMergedToBase fails, falls to integration path
191
+ initGitRepo(tempDir);
192
+ createBranch(tempDir, 'feat-int-nomerge');
193
+ const result = judge.judge(makeInput({
194
+ worktree: tempDir,
195
+ branch: 'feat-int-nomerge',
196
+ baseBranch: 'main',
197
+ phase: 'integration',
198
+ exitCode: 0,
199
+ }));
200
+ expect(result.status).toBe('incomplete');
201
+ expect(result.reason).toBe('integration_not_merged');
202
+ });
203
+ it('returns failed on crash in integration', () => {
204
+ initGitRepo(tempDir);
205
+ createBranch(tempDir, 'feat-int-crash');
206
+ const result = judge.judge(makeInput({
207
+ worktree: tempDir,
208
+ branch: 'feat-int-crash',
209
+ baseBranch: 'main',
210
+ phase: 'integration',
211
+ exitCode: 137,
212
+ }));
213
+ expect(result.status).toBe('failed');
214
+ expect(result.reason).toBe('crash(137)');
215
+ });
216
+ });
217
+ });
218
+ //# sourceMappingURL=completion-judge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-judge.test.js","sourceRoot":"","sources":["../../src/manager/completion-judge.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration-queue.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-queue.test.d.ts","sourceRoot":"","sources":["../../src/manager/integration-queue.test.ts"],"names":[],"mappings":""}