@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.
- package/dist/__tests__/fixy-commands.test.js +172 -3
- package/dist/__tests__/fixy-commands.test.js.map +1 -1
- package/dist/fixy-commands.d.ts +1 -0
- package/dist/fixy-commands.d.ts.map +1 -1
- package/dist/fixy-commands.js +186 -3
- package/dist/fixy-commands.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/fixy-commands.test.ts +195 -3
- package/src/fixy-commands.ts +233 -6
|
@@ -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
|
|
99
|
+
// Test 3: /all without prompt — shows usage message
|
|
100
100
|
// -------------------------------------------------------------------------
|
|
101
|
-
it('/all
|
|
101
|
+
it('/all without prompt — shows 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('
|
|
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":"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"}
|
|
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,oDAAoD;IACpD,4EAA4E;IAC5E,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAE5C,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,wBAAwB,CAAC,CAC3E,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,+CAA+C;IAC/C,4EAA4E;IAC5E,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,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,iCAAiC,CAAC,CACpF,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,4DAA4D;IAC5D,4EAA4E;IAC5E,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACtE,SAAS,EAAE,CAAC;YACZ,oDAAoD;YACpD,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO;oBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;oBAC1C,OAAO,EAAE,8CAA8C;oBACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;iBAC7D,CAAC;YACJ,CAAC;YACD,gCAAgC;YAChC,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;gBAC1C,OAAO,EAAE,4CAA4C;gBACrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE9B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACnC,CAAC,CAAC,CAAC;QAEJ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACnE,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAC3E,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,kEAAkE;IAClE,4EAA4E;IAC5E,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,6BAA6B;QAC7B,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACtE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;YAC1C,OAAO,EAAE,qEAAqE;YAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;SAC7D,CAAC,CAAC,CAAC;QAEJ,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;YACxE,WAAW,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;gBAC1C,OAAO,EAAE,0CAA0C;gBACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClC,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE9B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACnC,CAAC,CAAC,CAAC;QAEJ,sDAAsD;QACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,8DAA8D;IAC9D,4EAA4E;IAC5E,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YACpE,YAAY,EAAE,CAAC;YACf,gCAAgC;YAChC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;oBAC1C,OAAO,EAAE,0BAA0B;oBACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;iBAC7D,CAAC;YACJ,CAAC;YACD,iBAAiB;YACjB,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;oBAC1C,OAAO,EAAE,gBAAgB;oBACzB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;iBAC7D,CAAC;YACJ,CAAC;YACD,2BAA2B;YAC3B,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;oBAC1C,OAAO,EAAE,gCAAgC;oBACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;iBAC7D,CAAC;YACJ,CAAC;YACD,yBAAyB;YACzB,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;gBAC1C,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;YACxE,WAAW,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;gBAC1C,OAAO,EAAE,yBAAyB,WAAW,EAAE;gBAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACpC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAClC,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE9B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACnC,CAAC,CAAC,CAAC;QAEJ,gEAAgE;QAChE,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,iCAAiC;IACjC,4EAA4E;IAC5E,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjG,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnE,SAAS,EAAE,CAAC;YACZ,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,OAAO;oBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;oBAC1C,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;iBAC7D,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK;gBAC1C,OAAO,EAAE,MAAM;gBACf,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI;aAC7D,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;QAE9B,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;YACvB,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACnC,CAAC,CAAC,CAAC;QAEJ,iCAAiC;QACjC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,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"}
|
package/dist/fixy-commands.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/fixy-commands.js
CHANGED
|
@@ -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
|
-
|
|
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
|
@@ -127,18 +127,210 @@ describe('FixyCommandRunner', () => {
|
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
// -------------------------------------------------------------------------
|
|
130
|
-
// Test 3: /all
|
|
130
|
+
// Test 3: /all without prompt — shows usage message
|
|
131
131
|
// -------------------------------------------------------------------------
|
|
132
|
-
it('/all
|
|
132
|
+
it('/all without prompt — shows 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('
|
|
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
|
// -------------------------------------------------------------------------
|
package/src/fixy-commands.ts
CHANGED
|
@@ -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
|
-
|
|
81
|
-
'
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
private async _handleAll(prompt: string, ctx: FixyCommandContext): Promise<void> {
|
|
80
|
+
if (!prompt.trim()) {
|
|
81
|
+
await this._appendSystemMessage('/all requires a prompt — usage: @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> {
|