@qelos/aidev 0.5.0 → 0.5.2
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/.env.aidev.example +8 -0
- package/README.md +137 -2
- package/dist/cli.js +14 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/accepted.d.ts +7 -2
- package/dist/commands/accepted.d.ts.map +1 -1
- package/dist/commands/accepted.js +17 -2
- package/dist/commands/accepted.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +13 -0
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/run.d.ts +16 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +408 -20
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/tasks.d.ts +1 -0
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +29 -0
- package/dist/commands/tasks.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/github.d.ts +2 -0
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +28 -0
- package/dist/github.js.map +1 -1
- package/dist/hooks.d.ts +16 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +1 -0
- package/dist/hooks.js.map +1 -1
- package/dist/providers/linear.js +1 -1
- package/dist/providers/linear.js.map +1 -1
- package/dist/sessions.d.ts +20 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +171 -0
- package/dist/sessions.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/ai-runners.test.d.ts +0 -2
- package/dist/__tests__/ai-runners.test.d.ts.map +0 -1
- package/dist/__tests__/ai-runners.test.js +0 -367
- package/dist/__tests__/ai-runners.test.js.map +0 -1
- package/dist/__tests__/clickup-format.test.d.ts +0 -2
- package/dist/__tests__/clickup-format.test.d.ts.map +0 -1
- package/dist/__tests__/clickup-format.test.js +0 -256
- package/dist/__tests__/clickup-format.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -418
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/git.test.d.ts +0 -2
- package/dist/__tests__/git.test.d.ts.map +0 -1
- package/dist/__tests__/git.test.js +0 -697
- package/dist/__tests__/git.test.js.map +0 -1
- package/dist/__tests__/github.test.d.ts +0 -2
- package/dist/__tests__/github.test.d.ts.map +0 -1
- package/dist/__tests__/github.test.js +0 -209
- package/dist/__tests__/github.test.js.map +0 -1
- package/dist/__tests__/help.test.d.ts +0 -2
- package/dist/__tests__/help.test.d.ts.map +0 -1
- package/dist/__tests__/help.test.js +0 -34
- package/dist/__tests__/help.test.js.map +0 -1
- package/dist/__tests__/hooks.test.d.ts +0 -2
- package/dist/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/__tests__/hooks.test.js +0 -333
- package/dist/__tests__/hooks.test.js.map +0 -1
- package/dist/__tests__/init.test.d.ts +0 -2
- package/dist/__tests__/init.test.d.ts.map +0 -1
- package/dist/__tests__/init.test.js +0 -596
- package/dist/__tests__/init.test.js.map +0 -1
- package/dist/__tests__/local-provider.test.d.ts +0 -2
- package/dist/__tests__/local-provider.test.d.ts.map +0 -1
- package/dist/__tests__/local-provider.test.js +0 -631
- package/dist/__tests__/local-provider.test.js.map +0 -1
- package/dist/__tests__/lockfile.test.d.ts +0 -2
- package/dist/__tests__/lockfile.test.d.ts.map +0 -1
- package/dist/__tests__/lockfile.test.js +0 -144
- package/dist/__tests__/lockfile.test.js.map +0 -1
- package/dist/__tests__/permissions.test.d.ts +0 -2
- package/dist/__tests__/permissions.test.d.ts.map +0 -1
- package/dist/__tests__/permissions.test.js +0 -151
- package/dist/__tests__/permissions.test.js.map +0 -1
- package/dist/__tests__/platform.test.d.ts +0 -2
- package/dist/__tests__/platform.test.d.ts.map +0 -1
- package/dist/__tests__/platform.test.js +0 -329
- package/dist/__tests__/platform.test.js.map +0 -1
- package/dist/__tests__/providers.test.d.ts +0 -2
- package/dist/__tests__/providers.test.d.ts.map +0 -1
- package/dist/__tests__/providers.test.js +0 -925
- package/dist/__tests__/providers.test.js.map +0 -1
- package/dist/__tests__/run.test.d.ts +0 -2
- package/dist/__tests__/run.test.d.ts.map +0 -1
- package/dist/__tests__/run.test.js +0 -529
- package/dist/__tests__/run.test.js.map +0 -1
- package/dist/__tests__/schedule.test.d.ts +0 -2
- package/dist/__tests__/schedule.test.d.ts.map +0 -1
- package/dist/__tests__/schedule.test.js +0 -258
- package/dist/__tests__/schedule.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/providers/linear.ts"],"names":[],"mappings":";;;AAEA,sCAAmC;AAEnC,MAAM,cAAc,GAAG,gCAAgC,CAAC;AACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;AAO5D,MAAa,cAAc;IAOzB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,mBAAmB,IAAI,SAAS,CAAC;QAC7D,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,oBAAoB,IAAI,WAAW,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,KAAa,EAAE,SAAmC;QACzE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/providers/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Comment, Config } from './types';
|
|
2
|
+
import { AIRunner } from './ai/base';
|
|
3
|
+
export interface Session {
|
|
4
|
+
taskId: string;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
fingerprint: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
lastCommentId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function getSessionsDir(): string;
|
|
11
|
+
export declare function ensureSessionsDir(): void;
|
|
12
|
+
export declare function getSessionPath(taskId: string): string;
|
|
13
|
+
export declare function readSession(taskId: string): Session | null;
|
|
14
|
+
export declare function writeSession(taskId: string, data: Session): void;
|
|
15
|
+
export declare function fingerprintComments(comments: Comment[]): string;
|
|
16
|
+
export declare function shouldCompress(prompt: string, threshold: number): boolean;
|
|
17
|
+
export declare function summarizeWithRunner(comments: Comment[], runners: AIRunner[]): Promise<string | null>;
|
|
18
|
+
export declare function truncateFallback(comments: Comment[]): string;
|
|
19
|
+
export declare function buildCompressedContext(comments: Comment[], taskId: string, runners: AIRunner[], config: Config): Promise<string>;
|
|
20
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAkB1D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAGhE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAS/D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzE;AAUD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,QAAQ,EAAE,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAI5D;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,QAAQ,EAAE,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
|
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getSessionsDir = getSessionsDir;
|
|
37
|
+
exports.ensureSessionsDir = ensureSessionsDir;
|
|
38
|
+
exports.getSessionPath = getSessionPath;
|
|
39
|
+
exports.readSession = readSession;
|
|
40
|
+
exports.writeSession = writeSession;
|
|
41
|
+
exports.fingerprintComments = fingerprintComments;
|
|
42
|
+
exports.shouldCompress = shouldCompress;
|
|
43
|
+
exports.summarizeWithRunner = summarizeWithRunner;
|
|
44
|
+
exports.truncateFallback = truncateFallback;
|
|
45
|
+
exports.buildCompressedContext = buildCompressedContext;
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const crypto = __importStar(require("node:crypto"));
|
|
49
|
+
const logger_1 = require("./logger");
|
|
50
|
+
function getSessionsDir() {
|
|
51
|
+
return path.join(process.cwd(), '.aidev', 'sessions');
|
|
52
|
+
}
|
|
53
|
+
function ensureSessionsDir() {
|
|
54
|
+
const dir = getSessionsDir();
|
|
55
|
+
if (!fs.existsSync(dir)) {
|
|
56
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function sanitizeTaskId(taskId) {
|
|
60
|
+
return taskId.replace(/[^a-zA-Z0-9_.-]/g, '_');
|
|
61
|
+
}
|
|
62
|
+
function getSessionPath(taskId) {
|
|
63
|
+
return path.join(getSessionsDir(), `${sanitizeTaskId(taskId)}.json`);
|
|
64
|
+
}
|
|
65
|
+
function readSession(taskId) {
|
|
66
|
+
const file = getSessionPath(taskId);
|
|
67
|
+
if (!fs.existsSync(file))
|
|
68
|
+
return null;
|
|
69
|
+
try {
|
|
70
|
+
const raw = fs.readFileSync(file, 'utf8');
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
if (parsed &&
|
|
73
|
+
typeof parsed.taskId === 'string' &&
|
|
74
|
+
typeof parsed.fingerprint === 'string' &&
|
|
75
|
+
typeof parsed.summary === 'string') {
|
|
76
|
+
return parsed;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function writeSession(taskId, data) {
|
|
85
|
+
ensureSessionsDir();
|
|
86
|
+
fs.writeFileSync(getSessionPath(taskId), JSON.stringify(data, null, 2), 'utf8');
|
|
87
|
+
}
|
|
88
|
+
function fingerprintComments(comments) {
|
|
89
|
+
const hash = crypto.createHash('sha256');
|
|
90
|
+
for (const c of comments) {
|
|
91
|
+
hash.update(c.id);
|
|
92
|
+
hash.update('\0');
|
|
93
|
+
hash.update(c.text);
|
|
94
|
+
hash.update('\0');
|
|
95
|
+
}
|
|
96
|
+
return hash.digest('hex');
|
|
97
|
+
}
|
|
98
|
+
function shouldCompress(prompt, threshold) {
|
|
99
|
+
return prompt.length > threshold;
|
|
100
|
+
}
|
|
101
|
+
function buildRawContext(comments) {
|
|
102
|
+
if (comments.length === 0)
|
|
103
|
+
return '';
|
|
104
|
+
return ('\n\nConversation context:\n' +
|
|
105
|
+
comments.map((c) => `${c.author}: ${c.text}`).join('\n'));
|
|
106
|
+
}
|
|
107
|
+
async function summarizeWithRunner(comments, runners) {
|
|
108
|
+
const conversation = comments.map((c) => `${c.author}: ${c.text}`).join('\n');
|
|
109
|
+
const prompt = 'Summarize the following conversation. Preserve any decisions, dev notes, dropped requirements, and open questions. Keep it concise (<1000 words). Output only the summary, no preamble.\n\n' +
|
|
110
|
+
conversation;
|
|
111
|
+
for (const runner of runners) {
|
|
112
|
+
if (!runner.isAvailable())
|
|
113
|
+
continue;
|
|
114
|
+
try {
|
|
115
|
+
const result = await runner.run(prompt);
|
|
116
|
+
if (result.success && result.output.trim()) {
|
|
117
|
+
return result.output.trim();
|
|
118
|
+
}
|
|
119
|
+
logger_1.logger.warn(`Summarization runner ${runner.name} returned no output`);
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
logger_1.logger.warn(`Summarization runner ${runner.name} failed: ${err.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
function truncateFallback(comments) {
|
|
128
|
+
const text = comments.map((c) => `${c.author}: ${c.text}`).join('\n');
|
|
129
|
+
if (text.length <= 3000)
|
|
130
|
+
return text;
|
|
131
|
+
return text.slice(0, 1500) + '\n…\n' + text.slice(-1500);
|
|
132
|
+
}
|
|
133
|
+
async function buildCompressedContext(comments, taskId, runners, config) {
|
|
134
|
+
if (!config.autoCompress || comments.length <= 1) {
|
|
135
|
+
return buildRawContext(comments);
|
|
136
|
+
}
|
|
137
|
+
const raw = buildRawContext(comments);
|
|
138
|
+
if (!shouldCompress(raw, config.compressThreshold)) {
|
|
139
|
+
return raw;
|
|
140
|
+
}
|
|
141
|
+
const lastComment = comments[comments.length - 1];
|
|
142
|
+
const earlier = comments.slice(0, -1);
|
|
143
|
+
const fingerprint = fingerprintComments(earlier);
|
|
144
|
+
let summary;
|
|
145
|
+
const cached = readSession(taskId);
|
|
146
|
+
if (cached && cached.fingerprint === fingerprint && cached.summary) {
|
|
147
|
+
summary = cached.summary;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const runnerSummary = await summarizeWithRunner(earlier, runners);
|
|
151
|
+
if (runnerSummary) {
|
|
152
|
+
summary = runnerSummary;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
logger_1.logger.warn('Auto-compress: no runner produced a summary; using deterministic truncation');
|
|
156
|
+
summary = truncateFallback(earlier);
|
|
157
|
+
}
|
|
158
|
+
writeSession(taskId, {
|
|
159
|
+
taskId,
|
|
160
|
+
updatedAt: Date.now(),
|
|
161
|
+
fingerprint,
|
|
162
|
+
summary,
|
|
163
|
+
lastCommentId: lastComment.id,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return ('\n\nSummary of earlier conversation (auto-compressed):\n' +
|
|
167
|
+
summary +
|
|
168
|
+
'\n\nLatest comment:\n' +
|
|
169
|
+
`${lastComment.author}: ${lastComment.text}`);
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai-runners.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ai-runners.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const node_test_1 = require("node:test");
|
|
7
|
-
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
-
const node_test_2 = require("node:test");
|
|
9
|
-
const logger_1 = require("../logger");
|
|
10
|
-
const antigravity_1 = require("../ai/antigravity");
|
|
11
|
-
const claude_1 = require("../ai/claude");
|
|
12
|
-
const codex_1 = require("../ai/codex");
|
|
13
|
-
const cursor_1 = require("../ai/cursor");
|
|
14
|
-
const windsurf_1 = require("../ai/windsurf");
|
|
15
|
-
const windsurf_2 = require("../ai/windsurf");
|
|
16
|
-
const index_1 = require("../ai/index");
|
|
17
|
-
const platform_1 = require("../platform");
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
19
|
-
const childProcess = require('node:child_process');
|
|
20
|
-
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
21
|
-
function mockSpawnSync(overrides) {
|
|
22
|
-
return node_test_2.mock.method(childProcess, 'spawnSync', () => ({
|
|
23
|
-
pid: 1,
|
|
24
|
-
output: [],
|
|
25
|
-
stdout: '',
|
|
26
|
-
stderr: '',
|
|
27
|
-
status: 0,
|
|
28
|
-
signal: null,
|
|
29
|
-
error: undefined,
|
|
30
|
-
...overrides,
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
function spyLogger() {
|
|
34
|
-
return {
|
|
35
|
-
info: node_test_2.mock.method(logger_1.logger, 'info', () => { }),
|
|
36
|
-
warn: node_test_2.mock.method(logger_1.logger, 'warn', () => { }),
|
|
37
|
-
debug: node_test_2.mock.method(logger_1.logger, 'debug', () => { }),
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
// ─── ClaudeRunner ─────────────────────────────────────────────────────────────
|
|
41
|
-
(0, node_test_1.describe)('ClaudeRunner – failed tasks', () => {
|
|
42
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
43
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
44
|
-
(0, node_test_1.it)('returns success=false when claude exits with non-zero status', async () => {
|
|
45
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'something went wrong' });
|
|
46
|
-
spyLogger();
|
|
47
|
-
const runner = new claude_1.ClaudeRunner();
|
|
48
|
-
const result = await runner.run('test prompt');
|
|
49
|
-
strict_1.default.equal(result.success, false);
|
|
50
|
-
strict_1.default.equal(result.error, 'something went wrong');
|
|
51
|
-
});
|
|
52
|
-
(0, node_test_1.it)('logs a warning with exit status on failure', async () => {
|
|
53
|
-
mockSpawnSync({ status: 2, stdout: '', stderr: 'fatal error' });
|
|
54
|
-
const spies = spyLogger();
|
|
55
|
-
const runner = new claude_1.ClaudeRunner();
|
|
56
|
-
await runner.run('test prompt');
|
|
57
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
58
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 2')));
|
|
59
|
-
});
|
|
60
|
-
(0, node_test_1.it)('logs stderr on failure', async () => {
|
|
61
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'heap out of memory' });
|
|
62
|
-
const spies = spyLogger();
|
|
63
|
-
const runner = new claude_1.ClaudeRunner();
|
|
64
|
-
await runner.run('test prompt');
|
|
65
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
66
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('heap out of memory')));
|
|
67
|
-
});
|
|
68
|
-
(0, node_test_1.it)('logs spawn error when present', async () => {
|
|
69
|
-
mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('ENOENT') });
|
|
70
|
-
const spies = spyLogger();
|
|
71
|
-
const runner = new claude_1.ClaudeRunner();
|
|
72
|
-
await runner.run('test prompt');
|
|
73
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
74
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('ENOENT')));
|
|
75
|
-
});
|
|
76
|
-
(0, node_test_1.it)('returns empty output on failure', async () => {
|
|
77
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
|
|
78
|
-
spyLogger();
|
|
79
|
-
const runner = new claude_1.ClaudeRunner();
|
|
80
|
-
const result = await runner.run('test prompt');
|
|
81
|
-
strict_1.default.equal(result.output, '');
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
// ─── ClaudeRunner – argv order ────────────────────────────────────────────────
|
|
85
|
-
(0, node_test_1.describe)('ClaudeRunner – argv order', () => {
|
|
86
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
87
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
88
|
-
(0, node_test_1.it)('first attempt omits --model so default CLI model is used', async () => {
|
|
89
|
-
const argvSnapshots = [];
|
|
90
|
-
node_test_2.mock.method(childProcess, 'spawnSync', (cmd, args) => {
|
|
91
|
-
// On Windows, spawnCommand calls findBin which may invoke where.exe —
|
|
92
|
-
// skip those helper calls and only capture the real CLI invocations.
|
|
93
|
-
const command = cmd;
|
|
94
|
-
if (!command.endsWith('where.exe')) {
|
|
95
|
-
argvSnapshots.push([...args]);
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
pid: 1,
|
|
99
|
-
output: [],
|
|
100
|
-
stdout: 'ok',
|
|
101
|
-
stderr: '',
|
|
102
|
-
status: 0,
|
|
103
|
-
signal: null,
|
|
104
|
-
error: undefined,
|
|
105
|
-
};
|
|
106
|
-
});
|
|
107
|
-
spyLogger();
|
|
108
|
-
await new claude_1.ClaudeRunner().run('fix the bug');
|
|
109
|
-
strict_1.default.equal(argvSnapshots.length, 1);
|
|
110
|
-
const args = argvSnapshots[0];
|
|
111
|
-
const pIdx = args.indexOf('-p');
|
|
112
|
-
strict_1.default.ok(pIdx >= 0, 'expected -p in spawn argv (after any Windows node cli.js prefix)');
|
|
113
|
-
strict_1.default.equal(args[pIdx + 1], 'fix the bug');
|
|
114
|
-
strict_1.default.ok(args.includes('--dangerously-skip-permissions'));
|
|
115
|
-
strict_1.default.ok(!args.includes('--model'));
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
// ─── AntigravityRunner ────────────────────────────────────────────────────────
|
|
119
|
-
(0, node_test_1.describe)('AntigravityRunner', () => {
|
|
120
|
-
(0, node_test_1.it)('isAvailable returns boolean (depends on agy/antigravity in PATH)', () => {
|
|
121
|
-
const runner = new antigravity_1.AntigravityRunner();
|
|
122
|
-
strict_1.default.equal(typeof runner.isAvailable(), 'boolean');
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
// ─── CodexRunner ─────────────────────────────────────────────────────────────
|
|
126
|
-
(0, node_test_1.describe)('CodexRunner', () => {
|
|
127
|
-
(0, node_test_1.it)('isAvailable returns boolean (depends on codex CLI in PATH)', () => {
|
|
128
|
-
const runner = new codex_1.CodexRunner();
|
|
129
|
-
strict_1.default.equal(typeof runner.isAvailable(), 'boolean');
|
|
130
|
-
});
|
|
131
|
-
});
|
|
132
|
-
(0, node_test_1.describe)('AntigravityRunner – failed tasks', () => {
|
|
133
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
134
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
135
|
-
(0, node_test_1.it)('returns success=false when antigravity exits with non-zero status', async () => {
|
|
136
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'antigravity failed' });
|
|
137
|
-
spyLogger();
|
|
138
|
-
const runner = new antigravity_1.AntigravityRunner();
|
|
139
|
-
const result = await runner.run('test prompt');
|
|
140
|
-
strict_1.default.equal(result.success, false);
|
|
141
|
-
strict_1.default.equal(result.error, 'antigravity failed');
|
|
142
|
-
});
|
|
143
|
-
(0, node_test_1.it)('logs a warning with exit status on failure', async () => {
|
|
144
|
-
mockSpawnSync({ status: 2, stdout: '', stderr: 'not found' });
|
|
145
|
-
const spies = spyLogger();
|
|
146
|
-
const runner = new antigravity_1.AntigravityRunner();
|
|
147
|
-
await runner.run('test prompt');
|
|
148
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
149
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 2')));
|
|
150
|
-
});
|
|
151
|
-
(0, node_test_1.it)('returns empty output on failure', async () => {
|
|
152
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
|
|
153
|
-
spyLogger();
|
|
154
|
-
const runner = new antigravity_1.AntigravityRunner();
|
|
155
|
-
const result = await runner.run('test prompt');
|
|
156
|
-
strict_1.default.equal(result.output, '');
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
(0, node_test_1.describe)('CodexRunner – failed tasks', () => {
|
|
160
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
161
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
162
|
-
(0, node_test_1.it)('returns success=false when codex exits with non-zero status', async () => {
|
|
163
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'codex failed' });
|
|
164
|
-
spyLogger();
|
|
165
|
-
const runner = new codex_1.CodexRunner();
|
|
166
|
-
const result = await runner.run('test prompt');
|
|
167
|
-
strict_1.default.equal(result.success, false);
|
|
168
|
-
strict_1.default.equal(result.error, 'codex failed');
|
|
169
|
-
});
|
|
170
|
-
(0, node_test_1.it)('logs a warning with exit status on failure', async () => {
|
|
171
|
-
mockSpawnSync({ status: 2, stdout: '', stderr: 'auth error' });
|
|
172
|
-
const spies = spyLogger();
|
|
173
|
-
const runner = new codex_1.CodexRunner();
|
|
174
|
-
await runner.run('test prompt');
|
|
175
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
176
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 2')));
|
|
177
|
-
});
|
|
178
|
-
(0, node_test_1.it)('returns empty output on failure', async () => {
|
|
179
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
|
|
180
|
-
spyLogger();
|
|
181
|
-
const runner = new codex_1.CodexRunner();
|
|
182
|
-
const result = await runner.run('test prompt');
|
|
183
|
-
strict_1.default.equal(result.output, '');
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
// ─── CursorRunner ─────────────────────────────────────────────────────────────
|
|
187
|
-
(0, node_test_1.describe)('CursorRunner', () => {
|
|
188
|
-
(0, node_test_1.it)('isAvailable returns boolean (depends on agent CLI in PATH)', () => {
|
|
189
|
-
const runner = new cursor_1.CursorRunner();
|
|
190
|
-
strict_1.default.equal(typeof runner.isAvailable(), 'boolean');
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
(0, node_test_1.describe)('CursorRunner – failed tasks', () => {
|
|
194
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
195
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
196
|
-
(0, node_test_1.it)('returns success=false when cursor exits with non-zero status', async () => {
|
|
197
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'cursor failed' });
|
|
198
|
-
spyLogger();
|
|
199
|
-
const runner = new cursor_1.CursorRunner();
|
|
200
|
-
const result = await runner.run('test prompt');
|
|
201
|
-
strict_1.default.equal(result.success, false);
|
|
202
|
-
strict_1.default.equal(result.error, 'cursor failed');
|
|
203
|
-
});
|
|
204
|
-
(0, node_test_1.it)('logs a warning with exit status on failure', async () => {
|
|
205
|
-
mockSpawnSync({ status: 3, stdout: '', stderr: 'timeout' });
|
|
206
|
-
const spies = spyLogger();
|
|
207
|
-
const runner = new cursor_1.CursorRunner();
|
|
208
|
-
await runner.run('test prompt');
|
|
209
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
210
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 3')));
|
|
211
|
-
});
|
|
212
|
-
(0, node_test_1.it)('logs stderr on failure', async () => {
|
|
213
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'workspace not found' });
|
|
214
|
-
const spies = spyLogger();
|
|
215
|
-
const runner = new cursor_1.CursorRunner();
|
|
216
|
-
await runner.run('test prompt');
|
|
217
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
218
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('workspace not found')));
|
|
219
|
-
});
|
|
220
|
-
(0, node_test_1.it)('logs spawn error when present', async () => {
|
|
221
|
-
mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('EACCES') });
|
|
222
|
-
const spies = spyLogger();
|
|
223
|
-
const runner = new cursor_1.CursorRunner();
|
|
224
|
-
await runner.run('test prompt');
|
|
225
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
226
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('EACCES')));
|
|
227
|
-
});
|
|
228
|
-
(0, node_test_1.it)('returns empty output on failure', async () => {
|
|
229
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
|
|
230
|
-
spyLogger();
|
|
231
|
-
const runner = new cursor_1.CursorRunner();
|
|
232
|
-
const result = await runner.run('test prompt');
|
|
233
|
-
strict_1.default.equal(result.output, '');
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
// ─── WindsurfRunner ───────────────────────────────────────────────────────────
|
|
237
|
-
(0, node_test_1.describe)('WindsurfRunner – failed tasks', () => {
|
|
238
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
239
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
240
|
-
(0, node_test_1.it)('returns success=false when windsurf exits with non-zero status', async () => {
|
|
241
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'windsurf crashed' });
|
|
242
|
-
spyLogger();
|
|
243
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
244
|
-
const result = await runner.run('test prompt');
|
|
245
|
-
strict_1.default.equal(result.success, false);
|
|
246
|
-
strict_1.default.equal(result.error, 'windsurf crashed');
|
|
247
|
-
});
|
|
248
|
-
(0, node_test_1.it)('logs a warning with exit status on failure', async () => {
|
|
249
|
-
mockSpawnSync({ status: 127, stdout: '', stderr: 'not found' });
|
|
250
|
-
const spies = spyLogger();
|
|
251
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
252
|
-
await runner.run('test prompt');
|
|
253
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
254
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('status 127')));
|
|
255
|
-
});
|
|
256
|
-
(0, node_test_1.it)('logs stderr on failure', async () => {
|
|
257
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'license expired' });
|
|
258
|
-
const spies = spyLogger();
|
|
259
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
260
|
-
await runner.run('test prompt');
|
|
261
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
262
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('license expired')));
|
|
263
|
-
});
|
|
264
|
-
(0, node_test_1.it)('logs spawn error when present', async () => {
|
|
265
|
-
mockSpawnSync({ status: null, stdout: '', stderr: '', error: new Error('SIGTERM') });
|
|
266
|
-
const spies = spyLogger();
|
|
267
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
268
|
-
await runner.run('test prompt');
|
|
269
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
270
|
-
strict_1.default.ok(warnCalls.some((msg) => msg?.includes('SIGTERM')));
|
|
271
|
-
});
|
|
272
|
-
(0, node_test_1.it)('returns empty output on failure', async () => {
|
|
273
|
-
mockSpawnSync({ status: 1, stdout: '', stderr: 'err' });
|
|
274
|
-
spyLogger();
|
|
275
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
276
|
-
const result = await runner.run('test prompt');
|
|
277
|
-
strict_1.default.equal(result.output, '');
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
(0, node_test_1.describe)('WindsurfRunner – process cleanup (non-Windows CLI mode)', { skip: platform_1.isWindows }, () => {
|
|
281
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
282
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
283
|
-
(0, node_test_1.it)('kills Windsurf IDE after run when it was not already running', async () => {
|
|
284
|
-
const spawnMock = node_test_2.mock.method(childProcess, 'spawnSync', (command) => {
|
|
285
|
-
const base = { pid: 1, output: [], stderr: '', status: 0, signal: null, error: undefined };
|
|
286
|
-
if (command === 'pgrep')
|
|
287
|
-
return { ...base, stdout: '', status: 1 };
|
|
288
|
-
return { ...base, stdout: '' };
|
|
289
|
-
});
|
|
290
|
-
spyLogger();
|
|
291
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
292
|
-
await runner.run('test prompt');
|
|
293
|
-
const calls = spawnMock.mock.calls.map((c) => c.arguments[0]);
|
|
294
|
-
strict_1.default.ok(calls.some((cmd) => cmd === 'pkill'), `Expected pkill in spawn calls: [${calls}]`);
|
|
295
|
-
});
|
|
296
|
-
(0, node_test_1.it)('does not kill Windsurf IDE when it was already running', async () => {
|
|
297
|
-
const spawnMock = node_test_2.mock.method(childProcess, 'spawnSync', (command) => {
|
|
298
|
-
const base = { pid: 1, output: [], stderr: '', status: 0, signal: null, error: undefined };
|
|
299
|
-
if (command === 'pgrep') {
|
|
300
|
-
return { ...base, stdout: '1234' };
|
|
301
|
-
}
|
|
302
|
-
return { ...base, stdout: '' };
|
|
303
|
-
});
|
|
304
|
-
spyLogger();
|
|
305
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
306
|
-
await runner.run('test prompt');
|
|
307
|
-
const calls = spawnMock.mock.calls.map((c) => c.arguments[0]);
|
|
308
|
-
strict_1.default.ok(!calls.some((cmd) => cmd === 'pkill'), `Expected no pkill in spawn calls: [${calls}]`);
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
(0, node_test_1.describe)('WindsurfRunner – Docker mode (Windows)', { skip: !platform_1.isWindows }, () => {
|
|
312
|
-
(0, node_test_1.it)('isDockerWindsurfAvailable checks for docker and WINDSURF_TOKEN', () => {
|
|
313
|
-
// This test reflects the real environment — just verify it returns a boolean
|
|
314
|
-
strict_1.default.equal(typeof (0, windsurf_2.isDockerWindsurfAvailable)(), 'boolean');
|
|
315
|
-
});
|
|
316
|
-
(0, node_test_1.it)('isAvailable returns boolean on Windows', () => {
|
|
317
|
-
const runner = new windsurf_1.WindsurfRunner();
|
|
318
|
-
strict_1.default.equal(typeof runner.isAvailable(), 'boolean');
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
// ─── createRunners ────────────────────────────────────────────────────────────
|
|
322
|
-
function makeConfig(agents) {
|
|
323
|
-
return { agents };
|
|
324
|
-
}
|
|
325
|
-
(0, node_test_1.describe)('createRunners', () => {
|
|
326
|
-
(0, node_test_1.beforeEach)(() => node_test_2.mock.restoreAll());
|
|
327
|
-
(0, node_test_1.afterEach)(() => node_test_2.mock.restoreAll());
|
|
328
|
-
(0, node_test_1.it)('returns runners in the order specified by config.agents', () => {
|
|
329
|
-
spyLogger();
|
|
330
|
-
const runners = (0, index_1.createRunners)(makeConfig(['cursor', 'codex', 'windsurf', 'claude', 'antigravity']));
|
|
331
|
-
strict_1.default.deepEqual(runners.map((r) => r.name), ['cursor', 'codex', 'windsurf', 'claude', 'antigravity']);
|
|
332
|
-
});
|
|
333
|
-
(0, node_test_1.it)('returns runners in reversed order when config specifies reversed order', () => {
|
|
334
|
-
spyLogger();
|
|
335
|
-
const runners = (0, index_1.createRunners)(makeConfig(['claude', 'cursor']));
|
|
336
|
-
strict_1.default.deepEqual(runners.map((r) => r.name), ['claude', 'cursor']);
|
|
337
|
-
});
|
|
338
|
-
(0, node_test_1.it)('returns a single runner when only one agent is configured', () => {
|
|
339
|
-
spyLogger();
|
|
340
|
-
const runners = (0, index_1.createRunners)(makeConfig(['claude']));
|
|
341
|
-
strict_1.default.equal(runners.length, 1);
|
|
342
|
-
strict_1.default.equal(runners[0].name, 'claude');
|
|
343
|
-
});
|
|
344
|
-
(0, node_test_1.it)('logs configured runners at info level', () => {
|
|
345
|
-
const spies = spyLogger();
|
|
346
|
-
(0, index_1.createRunners)(makeConfig(['cursor', 'claude']));
|
|
347
|
-
const infoCalls = spies.info.mock.calls.map((c) => c.arguments[0]);
|
|
348
|
-
strict_1.default.ok(infoCalls.some((msg) => msg?.includes('cursor') && msg?.includes('claude') && msg?.includes('Configured runners')));
|
|
349
|
-
});
|
|
350
|
-
(0, node_test_1.it)('logs a warning when a configured runner is not available', () => {
|
|
351
|
-
const spies = spyLogger();
|
|
352
|
-
(0, index_1.createRunners)(makeConfig(['windsurf', 'claude']));
|
|
353
|
-
const warnCalls = spies.warn.mock.calls.map((c) => c.arguments[0]);
|
|
354
|
-
const hasUnavailableWarning = warnCalls.some((msg) => msg?.includes('not found'));
|
|
355
|
-
// At least windsurf should be flagged (it's typically not installed in CI)
|
|
356
|
-
// We can't assert strongly since CI might have different tool availability
|
|
357
|
-
strict_1.default.ok(typeof hasUnavailableWarning === 'boolean');
|
|
358
|
-
});
|
|
359
|
-
(0, node_test_1.it)('includes unavailable runners in the returned array (filtering is done by callers)', () => {
|
|
360
|
-
spyLogger();
|
|
361
|
-
const runners = (0, index_1.createRunners)(makeConfig(['windsurf', 'claude']));
|
|
362
|
-
strict_1.default.equal(runners.length, 2);
|
|
363
|
-
strict_1.default.equal(runners[0].name, 'windsurf');
|
|
364
|
-
strict_1.default.equal(runners[1].name, 'claude');
|
|
365
|
-
});
|
|
366
|
-
});
|
|
367
|
-
//# sourceMappingURL=ai-runners.test.js.map
|