@fixy/core 0.0.1 → 0.0.3

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.
@@ -96,15 +96,184 @@ describe('FixyCommandRunner', () => {
96
96
  await expect(runner.run(makeCtx({ rest: '/worker unknown' }))).rejects.toThrow(/Unknown adapter/);
97
97
  });
98
98
  // -------------------------------------------------------------------------
99
- // Test 3: /all build somethingreturns stub message
99
+ // Test 3: /all without promptshows usage message
100
100
  // -------------------------------------------------------------------------
101
- it('/all build somethingreturns stub collaboration message', async () => {
101
+ it('/all without promptshows usage message', async () => {
102
+ await runner.run(makeCtx({ rest: '/all' }));
103
+ const fresh = await store.getThread(thread.id, thread.projectRoot);
104
+ const sysMsg = fresh.messages.find((m) => m.role === 'system' && m.content.includes('/all requires a prompt'));
105
+ expect(sysMsg).toBeDefined();
106
+ });
107
+ // -------------------------------------------------------------------------
108
+ // Test 3b: /all with no adapters — shows error
109
+ // -------------------------------------------------------------------------
110
+ it('/all with no adapters — shows error', async () => {
102
111
  await runner.run(makeCtx({ rest: '/all build something' }));
103
112
  const fresh = await store.getThread(thread.id, thread.projectRoot);
104
- const sysMsg = fresh.messages.find((m) => m.role === 'system' && m.content.includes('collaboration engine not yet implemented'));
113
+ const sysMsg = fresh.messages.find((m) => m.role === 'system' && m.content.includes('at least one registered adapter'));
105
114
  expect(sysMsg).toBeDefined();
106
115
  });
107
116
  // -------------------------------------------------------------------------
117
+ // Test 3c: /all solo mode — single adapter skips discussion
118
+ // -------------------------------------------------------------------------
119
+ it('/all solo mode — single adapter runs plan+execute without discussion', async () => {
120
+ let callCount = 0;
121
+ const soloAdapter = createStubAdapter('claude', 'Claude', async (ctx) => {
122
+ callCount++;
123
+ // First call: plan breakdown → return numbered list
124
+ if (callCount === 1) {
125
+ return {
126
+ exitCode: 0, signal: null, timedOut: false,
127
+ summary: '1. Create auth module\n2. Add login endpoint',
128
+ session: null, patches: [], warnings: [], errorMessage: null,
129
+ };
130
+ }
131
+ // Second call: worker execution
132
+ return {
133
+ exitCode: 0, signal: null, timedOut: false,
134
+ summary: 'Implemented auth module and login endpoint',
135
+ session: null, patches: [], warnings: [], errorMessage: null,
136
+ };
137
+ });
138
+ registry.register(soloAdapter);
139
+ thread.workerModel = 'claude';
140
+ const logs = [];
141
+ await runner.run(makeCtx({
142
+ rest: '/all build auth',
143
+ onLog: (_s, msg) => logs.push(msg),
144
+ }));
145
+ expect(logs.some((l) => l.includes('Solo mode'))).toBe(true);
146
+ expect(logs.some((l) => l.includes('Phase 2'))).toBe(true);
147
+ expect(logs.some((l) => l.includes('Phase 3'))).toBe(true);
148
+ const fresh = await store.getThread(thread.id, thread.projectRoot);
149
+ const completionMsg = fresh.messages.find((m) => m.role === 'system' && m.content.includes('collaboration complete'));
150
+ expect(completionMsg).toBeDefined();
151
+ });
152
+ // -------------------------------------------------------------------------
153
+ // Test 3d: /all multi-adapter — full discussion + worker + review
154
+ // -------------------------------------------------------------------------
155
+ it('/all multi-adapter — runs discussion, plan, worker execution, and review', async () => {
156
+ // Thinker agrees immediately
157
+ const thinkerAdapter = createStubAdapter('codex', 'Codex', async () => ({
158
+ exitCode: 0, signal: null, timedOut: false,
159
+ summary: 'I agree with the plan. LGTM.\n1. Create util function\n2. Add tests',
160
+ session: null, patches: [], warnings: [], errorMessage: null,
161
+ }));
162
+ let workerCalls = 0;
163
+ const workerAdapterObj = createStubAdapter('claude', 'Claude', async () => {
164
+ workerCalls++;
165
+ return {
166
+ exitCode: 0, signal: null, timedOut: false,
167
+ summary: 'Done implementing the requested changes.',
168
+ session: null, patches: [], warnings: [], errorMessage: null,
169
+ };
170
+ });
171
+ registry.register(workerAdapterObj);
172
+ registry.register(thinkerAdapter);
173
+ thread.workerModel = 'claude';
174
+ const logs = [];
175
+ await runner.run(makeCtx({
176
+ rest: '/all build a utility',
177
+ onLog: (_s, msg) => logs.push(msg),
178
+ }));
179
+ // Discussion should have ended early due to agreement
180
+ expect(logs.some((l) => l.includes('Phase 1'))).toBe(true);
181
+ expect(logs.some((l) => l.includes('Phase 2'))).toBe(true);
182
+ expect(logs.some((l) => l.includes('Phase 3'))).toBe(true);
183
+ expect(logs.some((l) => l.includes('Phase 5'))).toBe(true);
184
+ expect(workerCalls).toBeGreaterThanOrEqual(1);
185
+ });
186
+ // -------------------------------------------------------------------------
187
+ // Test 3e: /all review finds issues — worker gets fix attempt
188
+ // -------------------------------------------------------------------------
189
+ it('/all review issues — worker retries when thinker flags issues', async () => {
190
+ let thinkerCalls = 0;
191
+ const thinkerAdapter = createStubAdapter('codex', 'Codex', async () => {
192
+ thinkerCalls++;
193
+ // Discussion: agree immediately
194
+ if (thinkerCalls <= 1) {
195
+ return {
196
+ exitCode: 0, signal: null, timedOut: false,
197
+ summary: 'I agree.\n1. Fix the bug',
198
+ session: null, patches: [], warnings: [], errorMessage: null,
199
+ };
200
+ }
201
+ // Plan breakdown
202
+ if (thinkerCalls === 2) {
203
+ return {
204
+ exitCode: 0, signal: null, timedOut: false,
205
+ summary: '1. Fix the bug',
206
+ session: null, patches: [], warnings: [], errorMessage: null,
207
+ };
208
+ }
209
+ // First review: flag issue
210
+ if (thinkerCalls === 3) {
211
+ return {
212
+ exitCode: 0, signal: null, timedOut: false,
213
+ summary: 'ISSUES: Missing error handling',
214
+ session: null, patches: [], warnings: [], errorMessage: null,
215
+ };
216
+ }
217
+ // Second review: approve
218
+ return {
219
+ exitCode: 0, signal: null, timedOut: false,
220
+ summary: 'APPROVED',
221
+ session: null, patches: [], warnings: [], errorMessage: null,
222
+ };
223
+ });
224
+ let workerCalls = 0;
225
+ const workerAdapterObj = createStubAdapter('claude', 'Claude', async () => {
226
+ workerCalls++;
227
+ return {
228
+ exitCode: 0, signal: null, timedOut: false,
229
+ summary: `Worker output attempt ${workerCalls}`,
230
+ session: null, patches: [], warnings: [], errorMessage: null,
231
+ };
232
+ });
233
+ registry.register(workerAdapterObj);
234
+ registry.register(thinkerAdapter);
235
+ thread.workerModel = 'claude';
236
+ const logs = [];
237
+ await runner.run(makeCtx({
238
+ rest: '/all fix the bug',
239
+ onLog: (_s, msg) => logs.push(msg),
240
+ }));
241
+ // Worker should have been called at least twice (initial + fix)
242
+ expect(workerCalls).toBeGreaterThanOrEqual(2);
243
+ expect(logs.some((l) => l.includes('Phase 4'))).toBe(true);
244
+ });
245
+ // -------------------------------------------------------------------------
246
+ // Test 3f: /all caps TODOs at 20
247
+ // -------------------------------------------------------------------------
248
+ it('/all caps TODO list at 20 items', async () => {
249
+ const longList = Array.from({ length: 25 }, (_, i) => `${i + 1}. Task item ${i + 1}`).join('\n');
250
+ let callCount = 0;
251
+ const soloAdapter = createStubAdapter('claude', 'Claude', async () => {
252
+ callCount++;
253
+ if (callCount === 1) {
254
+ return {
255
+ exitCode: 0, signal: null, timedOut: false,
256
+ summary: longList,
257
+ session: null, patches: [], warnings: [], errorMessage: null,
258
+ };
259
+ }
260
+ return {
261
+ exitCode: 0, signal: null, timedOut: false,
262
+ summary: 'Done',
263
+ session: null, patches: [], warnings: [], errorMessage: null,
264
+ };
265
+ });
266
+ registry.register(soloAdapter);
267
+ thread.workerModel = 'claude';
268
+ const logs = [];
269
+ await runner.run(makeCtx({
270
+ rest: '/all big task',
271
+ onLog: (_s, msg) => logs.push(msg),
272
+ }));
273
+ // Should report exactly 20 TODOs
274
+ expect(logs.some((l) => l.includes('20 TODO items'))).toBe(true);
275
+ });
276
+ // -------------------------------------------------------------------------
108
277
  // Test 4: /settings — returns stub message
109
278
  // -------------------------------------------------------------------------
110
279
  it('/settings — returns stub message', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"fixy-commands.test.js","sourceRoot":"","sources":["../../src/__tests__/fixy-commands.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,EAAU,EACV,IAAY,EACZ,SAAuE;IAEvE,OAAO;QACL,EAAE;QACF,IAAI;QACJ,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAClB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,IAAa;YACzB,MAAM,EAAE,IAAI;SACb,CAAC;QACF,OAAO,EACL,SAAS;YACT,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,iBAAiB,EAAE,EAAE;gBAC9B,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;KACN,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAChF,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IACrC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAC5B,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAC7B,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;CACE,CAAC;AAEhC,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,MAAc,CAAC;IACnB,IAAI,KAAuB,CAAC;IAC5B,IAAI,MAAkB,CAAC;IACvB,IAAI,QAAyB,CAAC;IAC9B,IAAI,MAAyB,CAAC;IAE9B,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAClC,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACvD,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAEjC,+CAA+C;QAC/C,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,SAAS,OAAO,CAAC,SAAuC;QACtD,OAAO;YACL,MAAM;YACN,IAAI,EAAE,EAAE;YACR,KAAK;YACL,QAAQ;YACR,eAAe,EAAE,mBAAmB;YACpC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;YACf,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;YACjC,GAAG,SAAS;SACb,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,qDAAqD;IACrD,4EAA4E;IAC5E,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzD,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAErD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,qBAAqB,CAClE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,uDAAuD;IACvD,4EAA4E;IAC5E,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEzD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,iBAAiB,CAClB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,sDAAsD;IACtD,4EAA4E;IAC5E,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAC7F,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,2CAA2C;IAC3C,4EAA4E;IAC5E,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,sCAAsC,CACnF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,wCAAwC;IACxC,4EAA4E;IAC5E,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,yDAAyD;QACzD,MAAM,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QACvE,MAAM,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;QAEtD,qEAAqE;QACrE,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAEzE,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE9C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CACjE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7B,yEAAyE;QACzE,MAAM,CAAC,mBAAmB,CAAC,KAAiC,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,gDAAgD;IAChD,4EAA4E;IAC5E,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzD,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,2BAA2B;IAC5E,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,4DAA4D;IAC5D,4EAA4E;IAC5E,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,aAAa,GAAG,KAAK,EAAE,IAA0B,EAAgC,EAAE,CAAC,CAAC;YACzF,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;YAC9C,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE9B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAEhE,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"fixy-commands.test.js","sourceRoot":"","sources":["../../src/__tests__/fixy-commands.test.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare class FixyCommandRunner {
15
15
  run(ctx: FixyCommandContext): Promise<void>;
16
16
  private _handleWorker;
17
17
  private _handleAll;
18
+ private _parseTodoList;
18
19
  private _handleSettings;
19
20
  private _handleReset;
20
21
  private _handleStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"fixy-commands.d.ts","sourceRoot":"","sources":["../src/fixy-commands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,qBAAa,iBAAiB;IACtB,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YAiCnC,aAAa;YAwBb,UAAU;YAOV,eAAe;YAIf,YAAY;YAwBZ,aAAa;YAwBb,WAAW;YA0CX,cAAc;YAOd,oBAAoB;CAcnC"}
1
+ {"version":3,"file":"fixy-commands.d.ts","sourceRoot":"","sources":["../src/fixy-commands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,qBAAa,iBAAiB;IACtB,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;YAiCnC,aAAa;YAwBb,UAAU;IA8NxB,OAAO,CAAC,cAAc;YAYR,eAAe;YAIf,YAAY;YAwBZ,aAAa;YAwBb,WAAW;YA0CX,cAAc;YAOd,oBAAoB;CAcnC"}
@@ -16,7 +16,7 @@ export class FixyCommandRunner {
16
16
  await this._handleWorker(args, ctx);
17
17
  break;
18
18
  case '/all':
19
- await this._handleAll(ctx);
19
+ await this._handleAll(args, ctx);
20
20
  break;
21
21
  case '/settings':
22
22
  await this._handleSettings(ctx);
@@ -51,8 +51,191 @@ export class FixyCommandRunner {
51
51
  await this._persistThread(fresh);
52
52
  ctx.thread.workerModel = adapterId;
53
53
  }
54
- async _handleAll(ctx) {
55
- await this._appendSystemMessage('collaboration engine not yet implemented — arriving in Step 12', ctx);
54
+ async _handleAll(prompt, ctx) {
55
+ if (!prompt.trim()) {
56
+ await this._appendSystemMessage('/all requires a prompt — usage: @fixy /all <prompt>', ctx);
57
+ return;
58
+ }
59
+ const allAdapters = ctx.registry.list();
60
+ if (allAdapters.length === 0) {
61
+ await this._appendSystemMessage('/all requires at least one registered adapter', ctx);
62
+ return;
63
+ }
64
+ const workerId = ctx.thread.workerModel ?? allAdapters[0].id;
65
+ const workerAdapter = ctx.registry.require(workerId);
66
+ const thinkers = allAdapters.filter((a) => a.id !== workerId);
67
+ const soloMode = thinkers.length === 0;
68
+ const log = (msg) => {
69
+ ctx.onLog('stdout', msg);
70
+ };
71
+ // Helpers to call an adapter and record its response
72
+ const callAdapter = async (adapter, adapterPrompt) => {
73
+ const runId = randomUUID();
74
+ const execCtx = {
75
+ runId,
76
+ agent: { id: adapter.id, name: adapter.name },
77
+ threadContext: {
78
+ threadId: ctx.thread.id,
79
+ projectRoot: ctx.thread.projectRoot,
80
+ worktreePath: ctx.thread.projectRoot,
81
+ repoRef: null,
82
+ },
83
+ messages: ctx.thread.messages,
84
+ prompt: adapterPrompt,
85
+ session: ctx.thread.agentSessions[adapter.id] ?? null,
86
+ onLog: ctx.onLog,
87
+ onMeta: () => { },
88
+ onSpawn: () => { },
89
+ signal: ctx.signal,
90
+ };
91
+ const result = await adapter.execute(execCtx);
92
+ ctx.thread.agentSessions[adapter.id] = result.session;
93
+ const agentMsg = {
94
+ id: randomUUID(),
95
+ createdAt: new Date().toISOString(),
96
+ role: 'agent',
97
+ agentId: adapter.id,
98
+ content: result.summary,
99
+ runId,
100
+ dispatchedTo: [],
101
+ patches: result.patches,
102
+ warnings: result.warnings,
103
+ };
104
+ await ctx.store.appendMessage(ctx.thread.id, ctx.thread.projectRoot, agentMsg);
105
+ return result.summary;
106
+ };
107
+ // ── PHASE 1: DISCUSSION ──
108
+ let discussionLog = [];
109
+ if (soloMode) {
110
+ log('\n[fixy /all] Solo mode — skipping discussion phase\n');
111
+ }
112
+ else {
113
+ log('\n[fixy /all] Phase 1: discussion\n');
114
+ const systemFraming = 'You are a thinker agent. Discuss this task with the other agents. Goal: agree on a full implementation plan.';
115
+ for (let round = 1; round <= 5; round++) {
116
+ log(`\n[fixy /all] Phase 1: discussion round ${round}/5\n`);
117
+ let allAgree = true;
118
+ for (const thinker of thinkers) {
119
+ const threadContext = discussionLog
120
+ .map((e) => `[${e.agentId}]: ${e.content}`)
121
+ .join('\n\n');
122
+ const thinkerPrompt = round === 1
123
+ ? `${systemFraming}\n\nUser task: ${prompt}` +
124
+ (threadContext ? `\n\nDiscussion so far:\n${threadContext}` : '')
125
+ : `${systemFraming}\n\nUser task: ${prompt}\n\nDiscussion so far:\n${threadContext}`;
126
+ const response = await callAdapter(thinker, thinkerPrompt);
127
+ discussionLog.push({ agentId: thinker.id, content: response });
128
+ const lower = response.toLowerCase();
129
+ const agreeSignals = ['agree', 'looks good', 'lgtm', 'i agree with the plan'];
130
+ if (!agreeSignals.some((s) => lower.includes(s))) {
131
+ allAgree = false;
132
+ }
133
+ }
134
+ if (allAgree) {
135
+ log('\n[fixy /all] Phase 1: all thinkers agree — ending discussion\n');
136
+ break;
137
+ }
138
+ }
139
+ }
140
+ // ── PHASE 2: PLAN BREAKDOWN ──
141
+ log('\n[fixy /all] Phase 2: plan breakdown\n');
142
+ const planPrompt = 'Break the agreed plan into ordered TODO items. Each TODO must be a concrete, scoped coding instruction. Output ONLY a numbered list, max 20 items total, no prose.';
143
+ const planContext = discussionLog.map((e) => `[${e.agentId}]: ${e.content}`).join('\n\n');
144
+ const fullPlanPrompt = planContext
145
+ ? `User task: ${prompt}\n\nDiscussion:\n${planContext}\n\n${planPrompt}`
146
+ : `User task: ${prompt}\n\n${planPrompt}`;
147
+ let todos = [];
148
+ if (soloMode) {
149
+ const response = await callAdapter(workerAdapter, fullPlanPrompt);
150
+ todos = this._parseTodoList(response);
151
+ }
152
+ else {
153
+ const responses = [];
154
+ for (const thinker of thinkers) {
155
+ const response = await callAdapter(thinker, fullPlanPrompt);
156
+ responses.push(response);
157
+ }
158
+ // Merge and deduplicate
159
+ const allTodos = responses.flatMap((r) => this._parseTodoList(r));
160
+ const seen = new Set();
161
+ for (const todo of allTodos) {
162
+ if (!seen.has(todo)) {
163
+ seen.add(todo);
164
+ todos.push(todo);
165
+ }
166
+ }
167
+ }
168
+ // Cap at 20
169
+ todos = todos.slice(0, 20);
170
+ if (todos.length === 0) {
171
+ await this._appendSystemMessage('/all failed — could not extract TODO items from plan', ctx);
172
+ return;
173
+ }
174
+ log(`\n[fixy /all] Phase 2: ${todos.length} TODO items extracted\n`);
175
+ // ── PHASE 3+4: WORKER EXECUTION + REVIEW (batches of 5) ──
176
+ const batches = [];
177
+ for (let i = 0; i < todos.length; i += 5) {
178
+ batches.push(todos.slice(i, i + 5));
179
+ }
180
+ for (let batchIdx = 0; batchIdx < batches.length; batchIdx++) {
181
+ const batch = batches[batchIdx];
182
+ log(`\n[fixy /all] Phase 3: worker executing batch ${batchIdx + 1}/${batches.length} (${batch.length} TODOs)\n`);
183
+ const batchList = batch.map((t, i) => `${i + 1}. ${t}`).join('\n');
184
+ const workerPrompt = `Execute these TODO items exactly as written. Write the actual code. Report what you did for each item.\n\n${batchList}`;
185
+ let workerOutput = await callAdapter(workerAdapter, workerPrompt);
186
+ // Review loop (skip in solo mode)
187
+ if (!soloMode) {
188
+ let approved = false;
189
+ for (let attempt = 0; attempt < 2 && !approved; attempt++) {
190
+ log(`\n[fixy /all] Phase 4: review of batch ${batchIdx + 1} (attempt ${attempt + 1}/2)\n`);
191
+ let issues = [];
192
+ for (const thinker of thinkers) {
193
+ const reviewPrompt = `Review this worker output. Did it implement the TODOs correctly? Reply ONLY with: APPROVED or ISSUES: <description>.\n\nTODOs:\n${batchList}\n\nWorker output:\n${workerOutput}`;
194
+ const reviewResponse = await callAdapter(thinker, reviewPrompt);
195
+ if (reviewResponse.toUpperCase().includes('ISSUES')) {
196
+ issues.push(reviewResponse);
197
+ }
198
+ }
199
+ if (issues.length === 0) {
200
+ approved = true;
201
+ log(`\n[fixy /all] Phase 4: batch ${batchIdx + 1} approved\n`);
202
+ }
203
+ else {
204
+ const fixPrompt = `The reviewers found issues with your implementation. Fix them:\n\n${issues.join('\n\n')}\n\nOriginal TODOs:\n${batchList}`;
205
+ workerOutput = await callAdapter(workerAdapter, fixPrompt);
206
+ }
207
+ }
208
+ }
209
+ }
210
+ // ── PHASE 5: FINAL REVIEW ──
211
+ log('\n[fixy /all] Phase 5: final review\n');
212
+ if (!soloMode) {
213
+ const threadSummary = ctx.thread.messages
214
+ .filter((m) => m.role === 'agent')
215
+ .map((m) => `[${m.agentId}]: ${m.content}`)
216
+ .join('\n\n');
217
+ const finalPrompt = `This is the final output. Do a complete review. Reply ONLY with: APPROVED or ISSUES: <description>.\n\n${threadSummary}`;
218
+ const finalResults = [];
219
+ for (const thinker of thinkers) {
220
+ const response = await callAdapter(thinker, finalPrompt);
221
+ finalResults.push(`[${thinker.id}]: ${response}`);
222
+ }
223
+ await this._appendSystemMessage(`[fixy /all] collaboration complete\n\nFinal review:\n${finalResults.join('\n')}`, ctx);
224
+ }
225
+ else {
226
+ await this._appendSystemMessage('[fixy /all] collaboration complete (solo mode)', ctx);
227
+ }
228
+ }
229
+ _parseTodoList(text) {
230
+ const lines = text.split('\n');
231
+ const todos = [];
232
+ for (const line of lines) {
233
+ const match = line.match(/^\s*\d+[\.\)]\s+(.+)/);
234
+ if (match?.[1]) {
235
+ todos.push(match[1].trim());
236
+ }
237
+ }
238
+ return todos;
56
239
  }
57
240
  async _handleSettings(ctx) {
58
241
  await this._appendSystemMessage('settings command not yet implemented', ctx);
@@ -1 +1 @@
1
- {"version":3,"file":"fixy-commands.js","sourceRoot":"","sources":["../src/fixy-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixy-commands.js","sourceRoot":"","sources":["../src/fixy-commands.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fixy/core",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -127,18 +127,210 @@ describe('FixyCommandRunner', () => {
127
127
  });
128
128
 
129
129
  // -------------------------------------------------------------------------
130
- // Test 3: /all build somethingreturns stub message
130
+ // Test 3: /all without promptshows usage message
131
131
  // -------------------------------------------------------------------------
132
- it('/all build somethingreturns stub collaboration message', async () => {
132
+ it('/all without promptshows usage message', async () => {
133
+ await runner.run(makeCtx({ rest: '/all' }));
134
+
135
+ const fresh = await store.getThread(thread.id, thread.projectRoot);
136
+ const sysMsg = fresh.messages.find(
137
+ (m) => m.role === 'system' && m.content.includes('/all requires a prompt'),
138
+ );
139
+ expect(sysMsg).toBeDefined();
140
+ });
141
+
142
+ // -------------------------------------------------------------------------
143
+ // Test 3b: /all with no adapters — shows error
144
+ // -------------------------------------------------------------------------
145
+ it('/all with no adapters — shows error', async () => {
133
146
  await runner.run(makeCtx({ rest: '/all build something' }));
134
147
 
135
148
  const fresh = await store.getThread(thread.id, thread.projectRoot);
136
149
  const sysMsg = fresh.messages.find(
137
- (m) => m.role === 'system' && m.content.includes('collaboration engine not yet implemented'),
150
+ (m) => m.role === 'system' && m.content.includes('at least one registered adapter'),
138
151
  );
139
152
  expect(sysMsg).toBeDefined();
140
153
  });
141
154
 
155
+ // -------------------------------------------------------------------------
156
+ // Test 3c: /all solo mode — single adapter skips discussion
157
+ // -------------------------------------------------------------------------
158
+ it('/all solo mode — single adapter runs plan+execute without discussion', async () => {
159
+ let callCount = 0;
160
+ const soloAdapter = createStubAdapter('claude', 'Claude', async (ctx) => {
161
+ callCount++;
162
+ // First call: plan breakdown → return numbered list
163
+ if (callCount === 1) {
164
+ return {
165
+ exitCode: 0, signal: null, timedOut: false,
166
+ summary: '1. Create auth module\n2. Add login endpoint',
167
+ session: null, patches: [], warnings: [], errorMessage: null,
168
+ };
169
+ }
170
+ // Second call: worker execution
171
+ return {
172
+ exitCode: 0, signal: null, timedOut: false,
173
+ summary: 'Implemented auth module and login endpoint',
174
+ session: null, patches: [], warnings: [], errorMessage: null,
175
+ };
176
+ });
177
+ registry.register(soloAdapter);
178
+ thread.workerModel = 'claude';
179
+
180
+ const logs: string[] = [];
181
+ await runner.run(makeCtx({
182
+ rest: '/all build auth',
183
+ onLog: (_s, msg) => logs.push(msg),
184
+ }));
185
+
186
+ expect(logs.some((l) => l.includes('Solo mode'))).toBe(true);
187
+ expect(logs.some((l) => l.includes('Phase 2'))).toBe(true);
188
+ expect(logs.some((l) => l.includes('Phase 3'))).toBe(true);
189
+
190
+ const fresh = await store.getThread(thread.id, thread.projectRoot);
191
+ const completionMsg = fresh.messages.find(
192
+ (m) => m.role === 'system' && m.content.includes('collaboration complete'),
193
+ );
194
+ expect(completionMsg).toBeDefined();
195
+ });
196
+
197
+ // -------------------------------------------------------------------------
198
+ // Test 3d: /all multi-adapter — full discussion + worker + review
199
+ // -------------------------------------------------------------------------
200
+ it('/all multi-adapter — runs discussion, plan, worker execution, and review', async () => {
201
+ // Thinker agrees immediately
202
+ const thinkerAdapter = createStubAdapter('codex', 'Codex', async () => ({
203
+ exitCode: 0, signal: null, timedOut: false,
204
+ summary: 'I agree with the plan. LGTM.\n1. Create util function\n2. Add tests',
205
+ session: null, patches: [], warnings: [], errorMessage: null,
206
+ }));
207
+
208
+ let workerCalls = 0;
209
+ const workerAdapterObj = createStubAdapter('claude', 'Claude', async () => {
210
+ workerCalls++;
211
+ return {
212
+ exitCode: 0, signal: null, timedOut: false,
213
+ summary: 'Done implementing the requested changes.',
214
+ session: null, patches: [], warnings: [], errorMessage: null,
215
+ };
216
+ });
217
+
218
+ registry.register(workerAdapterObj);
219
+ registry.register(thinkerAdapter);
220
+ thread.workerModel = 'claude';
221
+
222
+ const logs: string[] = [];
223
+ await runner.run(makeCtx({
224
+ rest: '/all build a utility',
225
+ onLog: (_s, msg) => logs.push(msg),
226
+ }));
227
+
228
+ // Discussion should have ended early due to agreement
229
+ expect(logs.some((l) => l.includes('Phase 1'))).toBe(true);
230
+ expect(logs.some((l) => l.includes('Phase 2'))).toBe(true);
231
+ expect(logs.some((l) => l.includes('Phase 3'))).toBe(true);
232
+ expect(logs.some((l) => l.includes('Phase 5'))).toBe(true);
233
+ expect(workerCalls).toBeGreaterThanOrEqual(1);
234
+ });
235
+
236
+ // -------------------------------------------------------------------------
237
+ // Test 3e: /all review finds issues — worker gets fix attempt
238
+ // -------------------------------------------------------------------------
239
+ it('/all review issues — worker retries when thinker flags issues', async () => {
240
+ let thinkerCalls = 0;
241
+ const thinkerAdapter = createStubAdapter('codex', 'Codex', async () => {
242
+ thinkerCalls++;
243
+ // Discussion: agree immediately
244
+ if (thinkerCalls <= 1) {
245
+ return {
246
+ exitCode: 0, signal: null, timedOut: false,
247
+ summary: 'I agree.\n1. Fix the bug',
248
+ session: null, patches: [], warnings: [], errorMessage: null,
249
+ };
250
+ }
251
+ // Plan breakdown
252
+ if (thinkerCalls === 2) {
253
+ return {
254
+ exitCode: 0, signal: null, timedOut: false,
255
+ summary: '1. Fix the bug',
256
+ session: null, patches: [], warnings: [], errorMessage: null,
257
+ };
258
+ }
259
+ // First review: flag issue
260
+ if (thinkerCalls === 3) {
261
+ return {
262
+ exitCode: 0, signal: null, timedOut: false,
263
+ summary: 'ISSUES: Missing error handling',
264
+ session: null, patches: [], warnings: [], errorMessage: null,
265
+ };
266
+ }
267
+ // Second review: approve
268
+ return {
269
+ exitCode: 0, signal: null, timedOut: false,
270
+ summary: 'APPROVED',
271
+ session: null, patches: [], warnings: [], errorMessage: null,
272
+ };
273
+ });
274
+
275
+ let workerCalls = 0;
276
+ const workerAdapterObj = createStubAdapter('claude', 'Claude', async () => {
277
+ workerCalls++;
278
+ return {
279
+ exitCode: 0, signal: null, timedOut: false,
280
+ summary: `Worker output attempt ${workerCalls}`,
281
+ session: null, patches: [], warnings: [], errorMessage: null,
282
+ };
283
+ });
284
+
285
+ registry.register(workerAdapterObj);
286
+ registry.register(thinkerAdapter);
287
+ thread.workerModel = 'claude';
288
+
289
+ const logs: string[] = [];
290
+ await runner.run(makeCtx({
291
+ rest: '/all fix the bug',
292
+ onLog: (_s, msg) => logs.push(msg),
293
+ }));
294
+
295
+ // Worker should have been called at least twice (initial + fix)
296
+ expect(workerCalls).toBeGreaterThanOrEqual(2);
297
+ expect(logs.some((l) => l.includes('Phase 4'))).toBe(true);
298
+ });
299
+
300
+ // -------------------------------------------------------------------------
301
+ // Test 3f: /all caps TODOs at 20
302
+ // -------------------------------------------------------------------------
303
+ it('/all caps TODO list at 20 items', async () => {
304
+ const longList = Array.from({ length: 25 }, (_, i) => `${i + 1}. Task item ${i + 1}`).join('\n');
305
+ let callCount = 0;
306
+ const soloAdapter = createStubAdapter('claude', 'Claude', async () => {
307
+ callCount++;
308
+ if (callCount === 1) {
309
+ return {
310
+ exitCode: 0, signal: null, timedOut: false,
311
+ summary: longList,
312
+ session: null, patches: [], warnings: [], errorMessage: null,
313
+ };
314
+ }
315
+ return {
316
+ exitCode: 0, signal: null, timedOut: false,
317
+ summary: 'Done',
318
+ session: null, patches: [], warnings: [], errorMessage: null,
319
+ };
320
+ });
321
+ registry.register(soloAdapter);
322
+ thread.workerModel = 'claude';
323
+
324
+ const logs: string[] = [];
325
+ await runner.run(makeCtx({
326
+ rest: '/all big task',
327
+ onLog: (_s, msg) => logs.push(msg),
328
+ }));
329
+
330
+ // Should report exactly 20 TODOs
331
+ expect(logs.some((l) => l.includes('20 TODO items'))).toBe(true);
332
+ });
333
+
142
334
  // -------------------------------------------------------------------------
143
335
  // Test 4: /settings — returns stub message
144
336
  // -------------------------------------------------------------------------
@@ -36,7 +36,7 @@ export class FixyCommandRunner {
36
36
  await this._handleWorker(args, ctx);
37
37
  break;
38
38
  case '/all':
39
- await this._handleAll(ctx);
39
+ await this._handleAll(args, ctx);
40
40
  break;
41
41
  case '/settings':
42
42
  await this._handleSettings(ctx);
@@ -76,11 +76,238 @@ export class FixyCommandRunner {
76
76
  ctx.thread.workerModel = adapterId;
77
77
  }
78
78
 
79
- private async _handleAll(ctx: FixyCommandContext): Promise<void> {
80
- await this._appendSystemMessage(
81
- 'collaboration engine not yet implemented arriving in Step 12',
82
- ctx,
83
- );
79
+ private async _handleAll(prompt: string, ctx: FixyCommandContext): Promise<void> {
80
+ if (!prompt.trim()) {
81
+ await this._appendSystemMessage('/all requires a promptusage: @fixy /all <prompt>', ctx);
82
+ return;
83
+ }
84
+
85
+ const allAdapters = ctx.registry.list();
86
+ if (allAdapters.length === 0) {
87
+ await this._appendSystemMessage('/all requires at least one registered adapter', ctx);
88
+ return;
89
+ }
90
+
91
+ const workerId = ctx.thread.workerModel ?? allAdapters[0]!.id;
92
+ const workerAdapter = ctx.registry.require(workerId);
93
+ const thinkers = allAdapters.filter((a) => a.id !== workerId);
94
+ const soloMode = thinkers.length === 0;
95
+
96
+ const log = (msg: string): void => {
97
+ ctx.onLog('stdout', msg);
98
+ };
99
+
100
+ // Helpers to call an adapter and record its response
101
+ const callAdapter = async (
102
+ adapter: typeof workerAdapter,
103
+ adapterPrompt: string,
104
+ ): Promise<string> => {
105
+ const runId = randomUUID();
106
+ const execCtx: FixyExecutionContext = {
107
+ runId,
108
+ agent: { id: adapter.id, name: adapter.name },
109
+ threadContext: {
110
+ threadId: ctx.thread.id,
111
+ projectRoot: ctx.thread.projectRoot,
112
+ worktreePath: ctx.thread.projectRoot,
113
+ repoRef: null,
114
+ },
115
+ messages: ctx.thread.messages,
116
+ prompt: adapterPrompt,
117
+ session: ctx.thread.agentSessions[adapter.id] ?? null,
118
+ onLog: ctx.onLog,
119
+ onMeta: () => {},
120
+ onSpawn: () => {},
121
+ signal: ctx.signal,
122
+ };
123
+
124
+ const result = await adapter.execute(execCtx);
125
+ ctx.thread.agentSessions[adapter.id] = result.session;
126
+
127
+ const agentMsg: FixyMessage = {
128
+ id: randomUUID(),
129
+ createdAt: new Date().toISOString(),
130
+ role: 'agent',
131
+ agentId: adapter.id,
132
+ content: result.summary,
133
+ runId,
134
+ dispatchedTo: [],
135
+ patches: result.patches,
136
+ warnings: result.warnings,
137
+ };
138
+ await ctx.store.appendMessage(ctx.thread.id, ctx.thread.projectRoot, agentMsg);
139
+
140
+ return result.summary;
141
+ };
142
+
143
+ // ── PHASE 1: DISCUSSION ──
144
+ let discussionLog: Array<{ agentId: string; content: string }> = [];
145
+
146
+ if (soloMode) {
147
+ log('\n[fixy /all] Solo mode — skipping discussion phase\n');
148
+ } else {
149
+ log('\n[fixy /all] Phase 1: discussion\n');
150
+ const systemFraming =
151
+ 'You are a thinker agent. Discuss this task with the other agents. Goal: agree on a full implementation plan.';
152
+
153
+ for (let round = 1; round <= 5; round++) {
154
+ log(`\n[fixy /all] Phase 1: discussion round ${round}/5\n`);
155
+
156
+ let allAgree = true;
157
+ for (const thinker of thinkers) {
158
+ const threadContext = discussionLog
159
+ .map((e) => `[${e.agentId}]: ${e.content}`)
160
+ .join('\n\n');
161
+
162
+ const thinkerPrompt =
163
+ round === 1
164
+ ? `${systemFraming}\n\nUser task: ${prompt}` +
165
+ (threadContext ? `\n\nDiscussion so far:\n${threadContext}` : '')
166
+ : `${systemFraming}\n\nUser task: ${prompt}\n\nDiscussion so far:\n${threadContext}`;
167
+
168
+ const response = await callAdapter(thinker, thinkerPrompt);
169
+ discussionLog.push({ agentId: thinker.id, content: response });
170
+
171
+ const lower = response.toLowerCase();
172
+ const agreeSignals = ['agree', 'looks good', 'lgtm', 'i agree with the plan'];
173
+ if (!agreeSignals.some((s) => lower.includes(s))) {
174
+ allAgree = false;
175
+ }
176
+ }
177
+
178
+ if (allAgree) {
179
+ log('\n[fixy /all] Phase 1: all thinkers agree — ending discussion\n');
180
+ break;
181
+ }
182
+ }
183
+ }
184
+
185
+ // ── PHASE 2: PLAN BREAKDOWN ──
186
+ log('\n[fixy /all] Phase 2: plan breakdown\n');
187
+
188
+ const planPrompt =
189
+ 'Break the agreed plan into ordered TODO items. Each TODO must be a concrete, scoped coding instruction. Output ONLY a numbered list, max 20 items total, no prose.';
190
+
191
+ const planContext = discussionLog.map((e) => `[${e.agentId}]: ${e.content}`).join('\n\n');
192
+ const fullPlanPrompt = planContext
193
+ ? `User task: ${prompt}\n\nDiscussion:\n${planContext}\n\n${planPrompt}`
194
+ : `User task: ${prompt}\n\n${planPrompt}`;
195
+
196
+ let todos: string[] = [];
197
+
198
+ if (soloMode) {
199
+ const response = await callAdapter(workerAdapter, fullPlanPrompt);
200
+ todos = this._parseTodoList(response);
201
+ } else {
202
+ const responses: string[] = [];
203
+ for (const thinker of thinkers) {
204
+ const response = await callAdapter(thinker, fullPlanPrompt);
205
+ responses.push(response);
206
+ }
207
+ // Merge and deduplicate
208
+ const allTodos = responses.flatMap((r) => this._parseTodoList(r));
209
+ const seen = new Set<string>();
210
+ for (const todo of allTodos) {
211
+ if (!seen.has(todo)) {
212
+ seen.add(todo);
213
+ todos.push(todo);
214
+ }
215
+ }
216
+ }
217
+
218
+ // Cap at 20
219
+ todos = todos.slice(0, 20);
220
+
221
+ if (todos.length === 0) {
222
+ await this._appendSystemMessage('/all failed — could not extract TODO items from plan', ctx);
223
+ return;
224
+ }
225
+
226
+ log(`\n[fixy /all] Phase 2: ${todos.length} TODO items extracted\n`);
227
+
228
+ // ── PHASE 3+4: WORKER EXECUTION + REVIEW (batches of 5) ──
229
+ const batches: string[][] = [];
230
+ for (let i = 0; i < todos.length; i += 5) {
231
+ batches.push(todos.slice(i, i + 5));
232
+ }
233
+
234
+ for (let batchIdx = 0; batchIdx < batches.length; batchIdx++) {
235
+ const batch = batches[batchIdx]!;
236
+ log(
237
+ `\n[fixy /all] Phase 3: worker executing batch ${batchIdx + 1}/${batches.length} (${batch.length} TODOs)\n`,
238
+ );
239
+
240
+ const batchList = batch.map((t, i) => `${i + 1}. ${t}`).join('\n');
241
+ const workerPrompt = `Execute these TODO items exactly as written. Write the actual code. Report what you did for each item.\n\n${batchList}`;
242
+
243
+ let workerOutput = await callAdapter(workerAdapter, workerPrompt);
244
+
245
+ // Review loop (skip in solo mode)
246
+ if (!soloMode) {
247
+ let approved = false;
248
+ for (let attempt = 0; attempt < 2 && !approved; attempt++) {
249
+ log(
250
+ `\n[fixy /all] Phase 4: review of batch ${batchIdx + 1} (attempt ${attempt + 1}/2)\n`,
251
+ );
252
+
253
+ let issues: string[] = [];
254
+ for (const thinker of thinkers) {
255
+ const reviewPrompt = `Review this worker output. Did it implement the TODOs correctly? Reply ONLY with: APPROVED or ISSUES: <description>.\n\nTODOs:\n${batchList}\n\nWorker output:\n${workerOutput}`;
256
+ const reviewResponse = await callAdapter(thinker, reviewPrompt);
257
+
258
+ if (reviewResponse.toUpperCase().includes('ISSUES')) {
259
+ issues.push(reviewResponse);
260
+ }
261
+ }
262
+
263
+ if (issues.length === 0) {
264
+ approved = true;
265
+ log(`\n[fixy /all] Phase 4: batch ${batchIdx + 1} approved\n`);
266
+ } else {
267
+ const fixPrompt = `The reviewers found issues with your implementation. Fix them:\n\n${issues.join('\n\n')}\n\nOriginal TODOs:\n${batchList}`;
268
+ workerOutput = await callAdapter(workerAdapter, fixPrompt);
269
+ }
270
+ }
271
+
272
+ }
273
+ }
274
+
275
+ // ── PHASE 5: FINAL REVIEW ──
276
+ log('\n[fixy /all] Phase 5: final review\n');
277
+
278
+ if (!soloMode) {
279
+ const threadSummary = ctx.thread.messages
280
+ .filter((m) => m.role === 'agent')
281
+ .map((m) => `[${m.agentId}]: ${m.content}`)
282
+ .join('\n\n');
283
+
284
+ const finalPrompt = `This is the final output. Do a complete review. Reply ONLY with: APPROVED or ISSUES: <description>.\n\n${threadSummary}`;
285
+
286
+ const finalResults: string[] = [];
287
+ for (const thinker of thinkers) {
288
+ const response = await callAdapter(thinker, finalPrompt);
289
+ finalResults.push(`[${thinker.id}]: ${response}`);
290
+ }
291
+
292
+ await this._appendSystemMessage(
293
+ `[fixy /all] collaboration complete\n\nFinal review:\n${finalResults.join('\n')}`,
294
+ ctx,
295
+ );
296
+ } else {
297
+ await this._appendSystemMessage('[fixy /all] collaboration complete (solo mode)', ctx);
298
+ }
299
+ }
300
+
301
+ private _parseTodoList(text: string): string[] {
302
+ const lines = text.split('\n');
303
+ const todos: string[] = [];
304
+ for (const line of lines) {
305
+ const match = line.match(/^\s*\d+[\.\)]\s+(.+)/);
306
+ if (match?.[1]) {
307
+ todos.push(match[1].trim());
308
+ }
309
+ }
310
+ return todos;
84
311
  }
85
312
 
86
313
  private async _handleSettings(ctx: FixyCommandContext): Promise<void> {