@coralai/sps-cli 0.49.0 → 0.49.1

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 (155) hide show
  1. package/dist/console-assets/assets/{index-C7skV1yt.js → index-Co0H5e5_.js} +14 -14
  2. package/dist/console-assets/index.html +1 -1
  3. package/package.json +1 -1
  4. package/dist/commands/cardMarkComplete.test.d.ts +0 -2
  5. package/dist/commands/cardMarkComplete.test.d.ts.map +0 -1
  6. package/dist/commands/cardMarkComplete.test.js +0 -142
  7. package/dist/commands/cardMarkComplete.test.js.map +0 -1
  8. package/dist/commands/cardMarkStarted.test.d.ts +0 -2
  9. package/dist/commands/cardMarkStarted.test.d.ts.map +0 -1
  10. package/dist/commands/cardMarkStarted.test.js +0 -98
  11. package/dist/commands/cardMarkStarted.test.js.map +0 -1
  12. package/dist/commands/projectInit.test.d.ts +0 -2
  13. package/dist/commands/projectInit.test.d.ts.map +0 -1
  14. package/dist/commands/projectInit.test.js +0 -126
  15. package/dist/commands/projectInit.test.js.map +0 -1
  16. package/dist/commands/tick-heartbeat.test.d.ts +0 -2
  17. package/dist/commands/tick-heartbeat.test.d.ts.map +0 -1
  18. package/dist/commands/tick-heartbeat.test.js +0 -89
  19. package/dist/commands/tick-heartbeat.test.js.map +0 -1
  20. package/dist/console-server/routes/chat.test.d.ts +0 -2
  21. package/dist/console-server/routes/chat.test.d.ts.map +0 -1
  22. package/dist/console-server/routes/chat.test.js +0 -131
  23. package/dist/console-server/routes/chat.test.js.map +0 -1
  24. package/dist/console-server/routes/projects.test.d.ts +0 -2
  25. package/dist/console-server/routes/projects.test.d.ts.map +0 -1
  26. package/dist/console-server/routes/projects.test.js +0 -150
  27. package/dist/console-server/routes/projects.test.js.map +0 -1
  28. package/dist/console-server/routes/system.test.d.ts +0 -2
  29. package/dist/console-server/routes/system.test.d.ts.map +0 -1
  30. package/dist/console-server/routes/system.test.js +0 -107
  31. package/dist/console-server/routes/system.test.js.map +0 -1
  32. package/dist/core/checklist.test.d.ts +0 -2
  33. package/dist/core/checklist.test.d.ts.map +0 -1
  34. package/dist/core/checklist.test.js +0 -74
  35. package/dist/core/checklist.test.js.map +0 -1
  36. package/dist/core/config.test.d.ts +0 -2
  37. package/dist/core/config.test.d.ts.map +0 -1
  38. package/dist/core/config.test.js +0 -352
  39. package/dist/core/config.test.js.map +0 -1
  40. package/dist/core/lock.test.d.ts +0 -2
  41. package/dist/core/lock.test.d.ts.map +0 -1
  42. package/dist/core/lock.test.js +0 -118
  43. package/dist/core/lock.test.js.map +0 -1
  44. package/dist/core/markerFile.test.d.ts +0 -2
  45. package/dist/core/markerFile.test.d.ts.map +0 -1
  46. package/dist/core/markerFile.test.js +0 -111
  47. package/dist/core/markerFile.test.js.map +0 -1
  48. package/dist/core/queue.test.d.ts +0 -2
  49. package/dist/core/queue.test.d.ts.map +0 -1
  50. package/dist/core/queue.test.js +0 -114
  51. package/dist/core/queue.test.js.map +0 -1
  52. package/dist/core/sessionCleanup.test.d.ts +0 -2
  53. package/dist/core/sessionCleanup.test.d.ts.map +0 -1
  54. package/dist/core/sessionCleanup.test.js +0 -158
  55. package/dist/core/sessionCleanup.test.js.map +0 -1
  56. package/dist/core/shellEnv.test.d.ts +0 -2
  57. package/dist/core/shellEnv.test.d.ts.map +0 -1
  58. package/dist/core/shellEnv.test.js +0 -116
  59. package/dist/core/shellEnv.test.js.map +0 -1
  60. package/dist/core/skillStore.test.d.ts +0 -2
  61. package/dist/core/skillStore.test.d.ts.map +0 -1
  62. package/dist/core/skillStore.test.js +0 -203
  63. package/dist/core/skillStore.test.js.map +0 -1
  64. package/dist/core/state.test.d.ts +0 -2
  65. package/dist/core/state.test.d.ts.map +0 -1
  66. package/dist/core/state.test.js +0 -336
  67. package/dist/core/state.test.js.map +0 -1
  68. package/dist/engines/CloseoutEngine.d.ts +0 -72
  69. package/dist/engines/CloseoutEngine.d.ts.map +0 -1
  70. package/dist/engines/CloseoutEngine.js +0 -648
  71. package/dist/engines/CloseoutEngine.js.map +0 -1
  72. package/dist/engines/EventHandler.test.d.ts +0 -2
  73. package/dist/engines/EventHandler.test.d.ts.map +0 -1
  74. package/dist/engines/EventHandler.test.js +0 -169
  75. package/dist/engines/EventHandler.test.js.map +0 -1
  76. package/dist/engines/ExecutionEngine.d.ts +0 -125
  77. package/dist/engines/ExecutionEngine.d.ts.map +0 -1
  78. package/dist/engines/ExecutionEngine.js +0 -766
  79. package/dist/engines/ExecutionEngine.js.map +0 -1
  80. package/dist/engines/MonitorEngine.test.d.ts +0 -2
  81. package/dist/engines/MonitorEngine.test.d.ts.map +0 -1
  82. package/dist/engines/MonitorEngine.test.js +0 -355
  83. package/dist/engines/MonitorEngine.test.js.map +0 -1
  84. package/dist/engines/engine-pipeline-adapter.test.d.ts +0 -17
  85. package/dist/engines/engine-pipeline-adapter.test.d.ts.map +0 -1
  86. package/dist/engines/engine-pipeline-adapter.test.js +0 -707
  87. package/dist/engines/engine-pipeline-adapter.test.js.map +0 -1
  88. package/dist/interfaces/HookProvider.d.ts +0 -9
  89. package/dist/interfaces/HookProvider.d.ts.map +0 -1
  90. package/dist/interfaces/HookProvider.js +0 -2
  91. package/dist/interfaces/HookProvider.js.map +0 -1
  92. package/dist/manager/completion-judge.test.d.ts +0 -17
  93. package/dist/manager/completion-judge.test.d.ts.map +0 -1
  94. package/dist/manager/completion-judge.test.js +0 -233
  95. package/dist/manager/completion-judge.test.js.map +0 -1
  96. package/dist/manager/integration-queue.d.ts +0 -71
  97. package/dist/manager/integration-queue.d.ts.map +0 -1
  98. package/dist/manager/integration-queue.js +0 -137
  99. package/dist/manager/integration-queue.js.map +0 -1
  100. package/dist/manager/integration-queue.test.d.ts +0 -17
  101. package/dist/manager/integration-queue.test.d.ts.map +0 -1
  102. package/dist/manager/integration-queue.test.js +0 -210
  103. package/dist/manager/integration-queue.test.js.map +0 -1
  104. package/dist/manager/pm-client.d.ts +0 -10
  105. package/dist/manager/pm-client.d.ts.map +0 -1
  106. package/dist/manager/pm-client.js +0 -260
  107. package/dist/manager/pm-client.js.map +0 -1
  108. package/dist/manager/resource-limiter.d.ts +0 -56
  109. package/dist/manager/resource-limiter.d.ts.map +0 -1
  110. package/dist/manager/resource-limiter.js +0 -116
  111. package/dist/manager/resource-limiter.js.map +0 -1
  112. package/dist/manager/resource-limiter.test.d.ts +0 -17
  113. package/dist/manager/resource-limiter.test.d.ts.map +0 -1
  114. package/dist/manager/resource-limiter.test.js +0 -118
  115. package/dist/manager/resource-limiter.test.js.map +0 -1
  116. package/dist/manager/supervisor.test.d.ts +0 -17
  117. package/dist/manager/supervisor.test.d.ts.map +0 -1
  118. package/dist/manager/supervisor.test.js +0 -216
  119. package/dist/manager/supervisor.test.js.map +0 -1
  120. package/dist/manager/worker-manager-impl.test.d.ts +0 -17
  121. package/dist/manager/worker-manager-impl.test.d.ts.map +0 -1
  122. package/dist/manager/worker-manager-impl.test.js +0 -446
  123. package/dist/manager/worker-manager-impl.test.js.map +0 -1
  124. package/dist/providers/PlaneTaskBackend.d.ts +0 -83
  125. package/dist/providers/PlaneTaskBackend.d.ts.map +0 -1
  126. package/dist/providers/PlaneTaskBackend.js +0 -461
  127. package/dist/providers/PlaneTaskBackend.js.map +0 -1
  128. package/dist/providers/TrelloTaskBackend.d.ts +0 -64
  129. package/dist/providers/TrelloTaskBackend.d.ts.map +0 -1
  130. package/dist/providers/TrelloTaskBackend.js +0 -298
  131. package/dist/providers/TrelloTaskBackend.js.map +0 -1
  132. package/dist/providers/adapters/acp-fs-handlers.test.d.ts +0 -2
  133. package/dist/providers/adapters/acp-fs-handlers.test.d.ts.map +0 -1
  134. package/dist/providers/adapters/acp-fs-handlers.test.js +0 -80
  135. package/dist/providers/adapters/acp-fs-handlers.test.js.map +0 -1
  136. package/dist/providers/adapters/acp-permissions.test.d.ts +0 -2
  137. package/dist/providers/adapters/acp-permissions.test.d.ts.map +0 -1
  138. package/dist/providers/adapters/acp-permissions.test.js +0 -103
  139. package/dist/providers/adapters/acp-permissions.test.js.map +0 -1
  140. package/dist/providers/adapters/acp-session-accumulator.test.d.ts +0 -2
  141. package/dist/providers/adapters/acp-session-accumulator.test.d.ts.map +0 -1
  142. package/dist/providers/adapters/acp-session-accumulator.test.js +0 -88
  143. package/dist/providers/adapters/acp-session-accumulator.test.js.map +0 -1
  144. package/dist/providers/adapters/acp-terminal-manager.test.d.ts +0 -2
  145. package/dist/providers/adapters/acp-terminal-manager.test.d.ts.map +0 -1
  146. package/dist/providers/adapters/acp-terminal-manager.test.js +0 -86
  147. package/dist/providers/adapters/acp-terminal-manager.test.js.map +0 -1
  148. package/dist/providers/outputParser.test.d.ts +0 -2
  149. package/dist/providers/outputParser.test.d.ts.map +0 -1
  150. package/dist/providers/outputParser.test.js +0 -185
  151. package/dist/providers/outputParser.test.js.map +0 -1
  152. package/dist/test-setup.d.ts +0 -2
  153. package/dist/test-setup.d.ts.map +0 -1
  154. package/dist/test-setup.js +0 -27
  155. package/dist/test-setup.js.map +0 -1
@@ -1,446 +0,0 @@
1
- /**
2
- * @module worker-manager-impl.test
3
- * @description WorkerManagerImpl 单元测试
4
- *
5
- * @author eddy
6
- * @organization wykj
7
- * @ownership wykj/eddy
8
- *
9
- * @created 2026-03-29
10
- * @updated 2026-04-03
11
- *
12
- * @role test
13
- * @layer manager
14
- * @boundedContext worker-lifecycle
15
- */
16
- import { mkdtempSync, rmSync } from 'node:fs';
17
- import { tmpdir } from 'node:os';
18
- import { join } from 'node:path';
19
- import { afterEach, describe, expect, it, vi } from 'vitest';
20
- import { createIdleWorkerSlot, writeState } from '../core/state.js';
21
- import { CompletionJudge } from './completion-judge.js';
22
- import { ProcessSupervisor } from './supervisor.js';
23
- import { WorkerManagerImpl } from './worker-manager-impl.js';
24
- // ─── Helpers ──────────────────────────────────────────────────────
25
- function makeTempDir() {
26
- return mkdtempSync(join(tmpdir(), 'sps-wm-test-'));
27
- }
28
- function makeState(maxWorkers) {
29
- const workers = {};
30
- for (let i = 1; i <= maxWorkers; i++) {
31
- workers[`worker-${i}`] = createIdleWorkerSlot();
32
- }
33
- return {
34
- version: 1,
35
- generation: 0,
36
- updatedAt: new Date().toISOString(),
37
- updatedBy: 'test',
38
- workers,
39
- activeCards: {},
40
- leases: {},
41
- worktreeEvidence: {},
42
- worktreeCleanup: [],
43
- sessions: {},
44
- integrationQueues: {},
45
- pendingPMActions: [],
46
- };
47
- }
48
- function setup(maxWorkers = 2) {
49
- const tempDir = makeTempDir();
50
- const stateFile = join(tempDir, 'state.json');
51
- const state = makeState(maxWorkers);
52
- writeState(stateFile, state, 'test-init');
53
- const supervisor = new ProcessSupervisor();
54
- const judge = new CompletionJudge();
55
- // Mock supervisor.kill
56
- vi.spyOn(supervisor, 'kill').mockResolvedValue();
57
- vi.spyOn(supervisor, 'remove').mockImplementation(() => { });
58
- // Mock agentRuntime for ACP transport
59
- const agentRuntime = {
60
- startRun: vi.fn().mockResolvedValue({ sessionId: 'mock-session', sessionName: 'mock', pid: 99999 }),
61
- resumeRun: vi.fn().mockResolvedValue({ sessionId: 'mock-session', sessionName: 'mock', pid: 99999 }),
62
- inspectRun: vi.fn().mockResolvedValue({ status: 'running' }),
63
- stopSession: vi.fn().mockResolvedValue(undefined),
64
- ensureSession: vi.fn().mockResolvedValue({ sessionId: 'mock-session' }),
65
- };
66
- const deps = {
67
- supervisor,
68
- completionJudge: judge,
69
- agentRuntime: agentRuntime,
70
- stateFile,
71
- maxWorkers,
72
- };
73
- const wm = new WorkerManagerImpl(deps);
74
- const events = [];
75
- wm.onEvent((event) => events.push(event));
76
- return { tempDir, stateFile, supervisor, judge, agentRuntime, wm, events };
77
- }
78
- function makeRunRequest(taskId, project = 'test') {
79
- return {
80
- taskId,
81
- cardId: taskId,
82
- project,
83
- phase: 'development',
84
- stageName: 'develop',
85
- prompt: 'implement feature X',
86
- cwd: '/tmp/worktree',
87
- branch: `feat-${taskId}`,
88
- targetBranch: 'main',
89
- tool: 'claude',
90
- transport: 'acp-sdk',
91
- outputFile: `/tmp/output-${taskId}.jsonl`,
92
- };
93
- }
94
- // ─── Tests ────────────────────────────────────────────────────────
95
- describe('WorkerManagerImpl', () => {
96
- let ctx;
97
- afterEach(() => {
98
- if (ctx?.tempDir) {
99
- rmSync(ctx.tempDir, { recursive: true, force: true });
100
- }
101
- });
102
- describe('run', () => {
103
- it('accepts a task and assigns a slot', async () => {
104
- ctx = setup(2);
105
- const resp = await ctx.wm.run(makeRunRequest('1'));
106
- expect(resp.accepted).toBe(true);
107
- expect(resp.slot).toBe('worker-1');
108
- expect(resp.workerId).toBe('test:worker-1:1');
109
- expect(resp.pid).toBe(99999);
110
- });
111
- it('rejects duplicate task', async () => {
112
- ctx = setup(2);
113
- await ctx.wm.run(makeRunRequest('1'));
114
- const resp2 = await ctx.wm.run(makeRunRequest('1'));
115
- expect(resp2.accepted).toBe(false);
116
- expect(resp2.rejectReason).toBe('duplicate_task');
117
- });
118
- it('rejects when all slots exhausted', async () => {
119
- ctx = setup(1);
120
- await ctx.wm.run(makeRunRequest('1'));
121
- const resp = await ctx.wm.run(makeRunRequest('2'));
122
- expect(resp.accepted).toBe(false);
123
- expect(resp.rejectReason).toBe('resource_exhausted');
124
- });
125
- it('fills multiple slots', async () => {
126
- ctx = setup(3);
127
- const r1 = await ctx.wm.run(makeRunRequest('1'));
128
- const r2 = await ctx.wm.run(makeRunRequest('2'));
129
- const r3 = await ctx.wm.run(makeRunRequest('3'));
130
- expect(r1.slot).toBe('worker-1');
131
- expect(r2.slot).toBe('worker-2');
132
- expect(r3.slot).toBe('worker-3');
133
- });
134
- it('injects only stable env vars into agent subprocess (regression guard)', async () => {
135
- // v0.40.2: SPS_CARD_ID / SPS_STAGE / SPS_CARD_TITLE were removed because
136
- // POSIX env is frozen at spawn and goes stale when claude is reused for
137
- // the next card. Only SPS_PROJECT and SPS_WORKER_SLOT (both stable across
138
- // reuse) should be injected. Hooks must read the marker file instead.
139
- ctx = setup(1);
140
- await ctx.wm.run(makeRunRequest('1'));
141
- expect(ctx.agentRuntime.startRun).toHaveBeenCalledTimes(1);
142
- const opts = ctx.agentRuntime.startRun.mock.calls[0][4];
143
- expect(opts).toBeDefined();
144
- expect(opts.extraEnv).toBeDefined();
145
- const envKeys = Object.keys(opts.extraEnv).sort();
146
- expect(envKeys).toEqual(['SPS_PROJECT', 'SPS_WORKER_SLOT']);
147
- expect(opts.extraEnv.SPS_PROJECT).toBe('test');
148
- expect(opts.extraEnv.SPS_WORKER_SLOT).toBe('worker-1');
149
- // Explicit assertions: per-card values must NOT be in env.
150
- expect(opts.extraEnv).not.toHaveProperty('SPS_CARD_ID');
151
- expect(opts.extraEnv).not.toHaveProperty('SPS_STAGE');
152
- expect(opts.extraEnv).not.toHaveProperty('SPS_CARD_TITLE');
153
- });
154
- });
155
- describe('inspect', () => {
156
- it('returns all worker snapshots', async () => {
157
- ctx = setup(2);
158
- await ctx.wm.run(makeRunRequest('1'));
159
- const snapshots = ctx.wm.inspect({ project: 'test' });
160
- expect(snapshots).toHaveLength(2);
161
- const active = snapshots.find(s => s.state === 'running');
162
- expect(active).toBeDefined();
163
- expect(active.slot).toBe('worker-1');
164
- expect(active.taskId).toBe('1');
165
- const idle = snapshots.find(s => s.state === 'idle');
166
- expect(idle).toBeDefined();
167
- });
168
- it('filters by slot', async () => {
169
- ctx = setup(2);
170
- await ctx.wm.run(makeRunRequest('1'));
171
- const snapshots = ctx.wm.inspect({ slot: 'worker-1' });
172
- expect(snapshots).toHaveLength(1);
173
- expect(snapshots[0].slot).toBe('worker-1');
174
- });
175
- it('filters by taskId', async () => {
176
- ctx = setup(2);
177
- await ctx.wm.run(makeRunRequest('1'));
178
- const snapshots = ctx.wm.inspect({ taskId: '1' });
179
- // Idle workers with seq=null pass the filter (null !== '1' check doesn't exclude them)
180
- // So we check that our target task is in the results
181
- const match = snapshots.find(s => s.taskId === '1');
182
- expect(match).toBeDefined();
183
- expect(match.slot).toBe('worker-1');
184
- // Task 999 doesn't exist — only idle workers returned
185
- const result999 = ctx.wm.inspect({ taskId: '999' });
186
- const active999 = result999.filter(s => s.state !== 'idle');
187
- expect(active999).toHaveLength(0);
188
- });
189
- });
190
- describe('cleanup (v0.41.2)', () => {
191
- it('deletes per-slot marker files on cleanup', async () => {
192
- ctx = setup(2);
193
- // Force-create a marker by running a task (writes marker)
194
- await ctx.wm.run(makeRunRequest('1'));
195
- const { existsSync } = await import('node:fs');
196
- const { resolve, dirname } = await import('node:path');
197
- const markerPath = resolve(dirname(ctx.stateFile), 'worker-worker-1-current.json');
198
- expect(existsSync(markerPath)).toBe(true);
199
- ctx.wm.cleanup();
200
- expect(existsSync(markerPath)).toBe(false);
201
- });
202
- it('cleanup is a no-op when no marker files exist', async () => {
203
- ctx = setup(2);
204
- expect(() => ctx.wm.cleanup()).not.toThrow();
205
- });
206
- });
207
- describe('cancel', () => {
208
- it('cancels a running task', async () => {
209
- ctx = setup(2);
210
- await ctx.wm.run(makeRunRequest('1'));
211
- await ctx.wm.cancel({ taskId: '1', project: 'test', reason: 'user_cancel' });
212
- expect(ctx.supervisor.kill).toHaveBeenCalled();
213
- const failEvent = ctx.events.find(e => e.type === 'run.failed' && e.taskId === '1');
214
- expect(failEvent).toBeDefined();
215
- expect(failEvent.error).toContain('Cancelled');
216
- });
217
- it('does nothing for unknown task', async () => {
218
- ctx = setup(2);
219
- await ctx.wm.cancel({ taskId: '999', project: 'test', reason: 'user_cancel' });
220
- expect(ctx.supervisor.kill).not.toHaveBeenCalled();
221
- });
222
- });
223
- describe('onEvent', () => {
224
- it('calls registered event handlers', async () => {
225
- ctx = setup(2);
226
- const handler = vi.fn();
227
- ctx.wm.onEvent(handler);
228
- await ctx.wm.run(makeRunRequest('1'));
229
- await ctx.wm.cancel({ taskId: '1', project: 'test', reason: 'user_cancel' });
230
- expect(handler).toHaveBeenCalled();
231
- });
232
- });
233
- // Integration queue tests removed — single worker model, no queue
234
- describe('resume', () => {
235
- it('accepts a resume request with session ID', async () => {
236
- ctx = setup(2);
237
- const resp = await ctx.wm.resume({
238
- taskId: '1',
239
- cardId: '1',
240
- project: 'test',
241
- phase: 'development',
242
- prompt: 'continue work',
243
- cwd: '/tmp/worktree',
244
- branch: 'feat-1',
245
- targetBranch: 'main',
246
- tool: 'claude',
247
- transport: 'acp-sdk',
248
- outputFile: '/tmp/output-1.jsonl',
249
- sessionId: 'session-abc-123',
250
- });
251
- expect(resp.accepted).toBe(true);
252
- expect(resp.slot).toBe('worker-1');
253
- });
254
- });
255
- describe('recover', () => {
256
- it('returns empty result when no leases exist', async () => {
257
- ctx = setup(2);
258
- const result = await ctx.wm.recover([{
259
- project: 'test',
260
- stateFile: ctx.stateFile,
261
- baseBranch: 'main',
262
- }]);
263
- expect(result.scanned).toBe(0);
264
- expect(result.alive).toBe(0);
265
- expect(result.completed).toBe(0);
266
- expect(result.failed).toBe(0);
267
- expect(result.released).toBe(0);
268
- });
269
- it('releases leases when PM state is Done', async () => {
270
- ctx = setup(2);
271
- // Write state with a lease in Done state
272
- const { readState } = await import('../core/state.js');
273
- const state = readState(ctx.stateFile, 2);
274
- state.workers['worker-1'] = {
275
- ...createIdleWorkerSlot(),
276
- status: 'active',
277
- seq: 5,
278
- };
279
- state.leases['5'] = {
280
- seq: 5,
281
- pmStateObserved: 'Done',
282
- phase: 'coding',
283
- slot: 'worker-1',
284
- branch: 'feat-5',
285
- worktree: '/tmp/wt',
286
- sessionId: null,
287
- runId: null,
288
- claimedAt: '2026-01-01T00:00:00.000Z',
289
- retryCount: 0,
290
- lastTransitionAt: '2026-01-01T00:00:00.000Z',
291
- };
292
- writeState(ctx.stateFile, state, 'test-recover');
293
- const result = await ctx.wm.recover([{
294
- project: 'test',
295
- stateFile: ctx.stateFile,
296
- baseBranch: 'main',
297
- }]);
298
- expect(result.scanned).toBe(1);
299
- expect(result.released).toBe(1);
300
- });
301
- it('releases leases when PM state is Backlog', async () => {
302
- ctx = setup(2);
303
- const { readState } = await import('../core/state.js');
304
- const state = readState(ctx.stateFile, 2);
305
- state.workers['worker-1'] = {
306
- ...createIdleWorkerSlot(),
307
- status: 'active',
308
- seq: 3,
309
- };
310
- state.leases['3'] = {
311
- seq: 3,
312
- pmStateObserved: 'Backlog',
313
- phase: 'coding',
314
- slot: 'worker-1',
315
- branch: 'feat-3',
316
- worktree: '/tmp/wt',
317
- sessionId: null,
318
- runId: null,
319
- claimedAt: '2026-01-01T00:00:00.000Z',
320
- retryCount: 0,
321
- lastTransitionAt: '2026-01-01T00:00:00.000Z',
322
- };
323
- writeState(ctx.stateFile, state, 'test-recover-backlog');
324
- const result = await ctx.wm.recover([{
325
- project: 'test',
326
- stateFile: ctx.stateFile,
327
- baseBranch: 'main',
328
- }]);
329
- expect(result.scanned).toBe(1);
330
- expect(result.released).toBe(1);
331
- });
332
- it('skips released and suspended leases', async () => {
333
- ctx = setup(2);
334
- const { readState } = await import('../core/state.js');
335
- const state = readState(ctx.stateFile, 2);
336
- state.leases['1'] = {
337
- seq: 1,
338
- pmStateObserved: 'Inprogress',
339
- phase: 'released',
340
- slot: 'worker-1',
341
- branch: 'feat-1',
342
- worktree: '/tmp/wt',
343
- sessionId: null,
344
- runId: null,
345
- claimedAt: '2026-01-01T00:00:00.000Z',
346
- retryCount: 0,
347
- lastTransitionAt: '2026-01-01T00:00:00.000Z',
348
- };
349
- state.leases['2'] = {
350
- seq: 2,
351
- pmStateObserved: 'Inprogress',
352
- phase: 'suspended',
353
- slot: 'worker-2',
354
- branch: 'feat-2',
355
- worktree: '/tmp/wt2',
356
- sessionId: null,
357
- runId: null,
358
- claimedAt: '2026-01-01T00:00:00.000Z',
359
- retryCount: 0,
360
- lastTransitionAt: '2026-01-01T00:00:00.000Z',
361
- };
362
- writeState(ctx.stateFile, state, 'test-skip');
363
- const result = await ctx.wm.recover([{
364
- project: 'test',
365
- stateFile: ctx.stateFile,
366
- baseBranch: 'main',
367
- }]);
368
- expect(result.scanned).toBe(0);
369
- });
370
- });
371
- describe('state management', () => {
372
- it('updates state after run (slot claimed, lease created)', async () => {
373
- ctx = setup(2);
374
- await ctx.wm.run(makeRunRequest('7'));
375
- const { readState } = await import('../core/state.js');
376
- const state = readState(ctx.stateFile, 2);
377
- expect(state.workers['worker-1'].status).toBe('active');
378
- expect(state.workers['worker-1'].seq).toBe(7);
379
- expect(state.activeCards['7']).toBeDefined();
380
- expect(state.activeCards['7'].state).toBe('Inprogress');
381
- expect(state.leases['7']).toBeDefined();
382
- expect(state.leases['7'].phase).toBe('coding');
383
- });
384
- it('releases slot after cancel', async () => {
385
- ctx = setup(2);
386
- await ctx.wm.run(makeRunRequest('7'));
387
- await ctx.wm.cancel({ taskId: '7', project: 'test', reason: 'user_cancel' });
388
- const { readState } = await import('../core/state.js');
389
- const state = readState(ctx.stateFile, 2);
390
- expect(state.workers['worker-1'].status).toBe('idle');
391
- expect(state.workers['worker-1'].seq).toBeNull();
392
- expect(state.activeCards['7']).toBeUndefined();
393
- expect(state.leases['7']).toBeUndefined();
394
- });
395
- });
396
- describe('spawn failure handling', () => {
397
- it('emits run.failed event when agentRuntime.startRun throws', async () => {
398
- ctx = setup(2);
399
- // Make agentRuntime.startRun throw
400
- ctx.agentRuntime.startRun.mockRejectedValueOnce(new Error('spawn failed: command not found'));
401
- const resp = await ctx.wm.run(makeRunRequest('1'));
402
- expect(resp.accepted).toBe(false);
403
- expect(resp.rejectReason).toBe('spawn_failed');
404
- const failEvent = ctx.events.find(e => e.type === 'run.failed');
405
- expect(failEvent).toBeDefined();
406
- expect(failEvent.error).toContain('spawn failed');
407
- });
408
- it('releases resources after spawn failure', async () => {
409
- ctx = setup(1);
410
- ctx.agentRuntime.startRun.mockRejectedValueOnce(new Error('oops'));
411
- await ctx.wm.run(makeRunRequest('1'));
412
- // Should be able to acquire again (resources released)
413
- ctx.agentRuntime.startRun.mockResolvedValueOnce({ sessionId: 'mock-session-2', sessionName: 'mock', pid: 88888 });
414
- const resp2 = await ctx.wm.run(makeRunRequest('2'));
415
- expect(resp2.accepted).toBe(true);
416
- });
417
- });
418
- describe('event handler error isolation', () => {
419
- it('does not crash when event handler throws', async () => {
420
- ctx = setup(2);
421
- ctx.wm.onEvent(() => { throw new Error('handler crash'); });
422
- await ctx.wm.run(makeRunRequest('1'));
423
- // Should not throw — cancel emits event that handler will throw on
424
- await expect(ctx.wm.cancel({ taskId: '1', project: 'test', reason: 'user_cancel' })).resolves.toBeUndefined();
425
- });
426
- });
427
- // Note: handleExit is now triggered by monitorAcpCompletion polling,
428
- // not by supervisor.spawn onExit callbacks. Integration-level tests
429
- // for the ACP completion flow live in integration-queue.test.ts.
430
- describe('mapWorkerState', () => {
431
- it('maps idle status correctly', async () => {
432
- ctx = setup(2);
433
- const snapshots = ctx.wm.inspect({});
434
- const idle = snapshots.find(s => s.state === 'idle');
435
- expect(idle).toBeDefined();
436
- });
437
- it('maps active status to running', async () => {
438
- ctx = setup(2);
439
- await ctx.wm.run(makeRunRequest('1'));
440
- const snapshots = ctx.wm.inspect({});
441
- const running = snapshots.find(s => s.state === 'running');
442
- expect(running).toBeDefined();
443
- });
444
- });
445
- });
446
- //# sourceMappingURL=worker-manager-impl.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-manager-impl.test.js","sourceRoot":"","sources":["../../src/manager/worker-manager-impl.test.ts"],"names":[],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- import type { ProjectConfig } from '../core/config.js';
2
- import type { TaskBackend } from '../interfaces/TaskBackend.js';
3
- import type { Card, CardState } from '../models/types.js';
4
- export declare class PlaneTaskBackend implements TaskBackend {
5
- private readonly apiUrl;
6
- private readonly apiKey;
7
- private readonly workspaceSlug;
8
- private readonly projectId;
9
- private readonly projectName;
10
- private readonly pmMetaDir;
11
- /** Map CardState → Plane state UUID */
12
- private readonly stateMap;
13
- /** Reverse map: Plane state UUID → CardState */
14
- private readonly reverseStateMap;
15
- /** Cache: label name → label UUID (populated lazily) */
16
- private labelCache;
17
- constructor(config: ProjectConfig);
18
- /** Base URL for project-scoped endpoints. */
19
- private get baseUrl();
20
- /** Standard headers for every Plane request. */
21
- private get headers();
22
- /**
23
- * Generic Plane API request wrapper.
24
- * Throws on non-2xx responses with a descriptive message.
25
- */
26
- private request;
27
- /**
28
- * Convert a Plane issue to a Card.
29
- * Labels may come as objects ({id, name}) or bare UUID strings.
30
- * When they are UUIDs, resolve to names via the label cache.
31
- */
32
- private resolveIssueToCard;
33
- /**
34
- * Reverse lookup: label UUID → name.
35
- */
36
- private reverseLabelName;
37
- incrementRetryCount(seq: string): Promise<number>;
38
- resetRetryCount(seq: string): Promise<void>;
39
- bootstrap(): Promise<void>;
40
- listByState(state: CardState): Promise<Card[]>;
41
- listAll(): Promise<Card[]>;
42
- getBySeq(seq: string): Promise<Card | null>;
43
- move(seq: string, targetState: CardState): Promise<void>;
44
- addLabel(seq: string, label: string): Promise<void>;
45
- removeLabel(seq: string, label: string): Promise<void>;
46
- claim(seq: string, workerSlot: string): Promise<void>;
47
- releaseClaim(seq: string): Promise<void>;
48
- comment(seq: string, text: string): Promise<void>;
49
- create(name: string, desc: string, state: CardState): Promise<Card>;
50
- checklistCreate(seq: string, items: string[]): Promise<void>;
51
- checklistList(seq: string): Promise<{
52
- id: string;
53
- text: string;
54
- checked: boolean;
55
- }[]>;
56
- checklistCheck(seq: string, itemId: string): Promise<void>;
57
- checklistUncheck(seq: string, itemId: string): Promise<void>;
58
- private updateChecklistItem;
59
- metaRead(seq: string): Promise<Record<string, unknown>>;
60
- metaWrite(seq: string, data: Record<string, unknown>): Promise<void>;
61
- /**
62
- * Resolve a sequence ID to a full Plane issue object.
63
- * Throws if the issue cannot be found.
64
- */
65
- private resolveIssue;
66
- /**
67
- * Get current label UUIDs on an issue.
68
- */
69
- private getIssueLabelIds;
70
- /**
71
- * Find or create a project label by name, returning its UUID.
72
- */
73
- private ensureLabel;
74
- /**
75
- * Find label UUID by name. Returns null if not found.
76
- */
77
- private findLabelId;
78
- /**
79
- * Populate label name→id cache from Plane API.
80
- */
81
- private refreshLabelCache;
82
- }
83
- //# sourceMappingURL=PlaneTaskBackend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PlaneTaskBackend.d.ts","sourceRoot":"","sources":["../../src/providers/PlaneTaskBackend.ts"],"names":[],"mappings":"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"}