@fasttest-ai/qa-agent 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +188 -0
- package/bin/install.js +3 -0
- package/bin/qa-agent.js +7 -2
- package/dist/actions.d.ts +0 -1
- package/dist/actions.js +0 -1
- package/dist/actions.js.map +1 -1
- package/dist/browser.d.ts +3 -1
- package/dist/browser.js +33 -10
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +16 -3
- package/dist/cli.js.map +1 -1
- package/dist/cloud.d.ts +59 -30
- package/dist/cloud.js +42 -24
- package/dist/cloud.js.map +1 -1
- package/dist/healer.d.ts +6 -1
- package/dist/healer.js +86 -16
- package/dist/healer.js.map +1 -1
- package/dist/index.js +483 -48
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +11 -0
- package/dist/install.js +500 -0
- package/dist/install.js.map +1 -0
- package/dist/runner.d.ts +21 -0
- package/dist/runner.js +181 -18
- package/dist/runner.js.map +1 -1
- package/package.json +26 -4
package/dist/install.js
ADDED
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FastTest Agent installer — supports Claude Code, Cursor, Windsurf, VS Code, and Codex.
|
|
3
|
+
* Registers the MCP server, sets up permissions (where supported), and installs Playwright.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npx @fasttest-ai/qa-agent install # Interactive IDE picker
|
|
7
|
+
* npx @fasttest-ai/qa-agent install --ide cursor # Skip prompt
|
|
8
|
+
* npx @fasttest-ai/qa-agent install --ide claude-code --scope project
|
|
9
|
+
* npx @fasttest-ai/qa-agent uninstall
|
|
10
|
+
*/
|
|
11
|
+
import { execFileSync } from "node:child_process";
|
|
12
|
+
import { createInterface } from "node:readline";
|
|
13
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
14
|
+
import { homedir, platform } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
const IS_WINDOWS = platform() === "win32";
|
|
17
|
+
const IS_MAC = platform() === "darwin";
|
|
18
|
+
const MCP_SERVER_NAME = "fasttest";
|
|
19
|
+
const NPX_CMD = IS_WINDOWS ? "npx.cmd" : "npx";
|
|
20
|
+
const MCP_COMMAND = "npx";
|
|
21
|
+
const MCP_ARGS = ["-y", "@fasttest-ai/qa-agent@latest"];
|
|
22
|
+
const IDE_CONFIGS = [
|
|
23
|
+
{
|
|
24
|
+
id: "claude-code",
|
|
25
|
+
label: "Claude Code",
|
|
26
|
+
globalConfigPath: "", // Uses CLI, not direct file write
|
|
27
|
+
format: "cli",
|
|
28
|
+
hasPermissions: true,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "cursor",
|
|
32
|
+
label: "Cursor",
|
|
33
|
+
globalConfigPath: join(homedir(), ".cursor", "mcp.json"),
|
|
34
|
+
format: "json-mcpServers",
|
|
35
|
+
hasPermissions: false,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "windsurf",
|
|
39
|
+
label: "Windsurf",
|
|
40
|
+
globalConfigPath: join(homedir(), ".codeium", "windsurf", "mcp_config.json"),
|
|
41
|
+
format: "json-mcpServers",
|
|
42
|
+
hasPermissions: false,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "vscode",
|
|
46
|
+
label: "VS Code / Copilot",
|
|
47
|
+
globalConfigPath: IS_MAC
|
|
48
|
+
? join(homedir(), "Library", "Application Support", "Code", "User", "mcp.json")
|
|
49
|
+
: IS_WINDOWS
|
|
50
|
+
? join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "Code", "User", "mcp.json")
|
|
51
|
+
: join(homedir(), ".config", "Code", "User", "mcp.json"),
|
|
52
|
+
format: "json-servers",
|
|
53
|
+
hasPermissions: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "codex",
|
|
57
|
+
label: "Codex",
|
|
58
|
+
globalConfigPath: join(homedir(), ".codex", "config.toml"),
|
|
59
|
+
format: "toml",
|
|
60
|
+
hasPermissions: false,
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
function parseArgs() {
|
|
64
|
+
const action = process.argv[2];
|
|
65
|
+
const rest = process.argv.slice(3);
|
|
66
|
+
let ide = null;
|
|
67
|
+
let scope = "user";
|
|
68
|
+
let skipPermissions = false;
|
|
69
|
+
for (let i = 0; i < rest.length; i++) {
|
|
70
|
+
if (rest[i] === "--ide" && rest[i + 1]) {
|
|
71
|
+
ide = rest[++i];
|
|
72
|
+
}
|
|
73
|
+
else if (rest[i] === "--scope" && rest[i + 1]) {
|
|
74
|
+
scope = rest[++i];
|
|
75
|
+
}
|
|
76
|
+
else if (rest[i] === "--skip-permissions") {
|
|
77
|
+
skipPermissions = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { action, ide, scope, skipPermissions };
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Interactive IDE picker
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function askQuestion(prompt) {
|
|
86
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
87
|
+
return new Promise((resolve) => {
|
|
88
|
+
rl.question(prompt, (answer) => {
|
|
89
|
+
rl.close();
|
|
90
|
+
resolve(answer.trim());
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async function pickIde() {
|
|
95
|
+
console.log(" Which IDE do you use?\n");
|
|
96
|
+
IDE_CONFIGS.forEach((ide, i) => {
|
|
97
|
+
console.log(` ${i + 1}. ${ide.label}`);
|
|
98
|
+
});
|
|
99
|
+
console.log();
|
|
100
|
+
const answer = await askQuestion(" > ");
|
|
101
|
+
const idx = parseInt(answer, 10) - 1;
|
|
102
|
+
if (idx >= 0 && idx < IDE_CONFIGS.length) {
|
|
103
|
+
return IDE_CONFIGS[idx].id;
|
|
104
|
+
}
|
|
105
|
+
// Try matching by name
|
|
106
|
+
const match = IDE_CONFIGS.find((c) => c.id === answer.toLowerCase() || c.label.toLowerCase() === answer.toLowerCase());
|
|
107
|
+
if (match)
|
|
108
|
+
return match.id;
|
|
109
|
+
console.log(" Invalid selection, defaulting to Claude Code.\n");
|
|
110
|
+
return "claude-code";
|
|
111
|
+
}
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// Claude Code — CLI-based registration + permission management
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
function isClaudeCliAvailable() {
|
|
116
|
+
try {
|
|
117
|
+
execFileSync("claude", ["--version"], { stdio: "pipe", shell: IS_WINDOWS });
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function registerClaudeCode(scope) {
|
|
125
|
+
const args = [
|
|
126
|
+
"mcp", "add", "--scope", scope,
|
|
127
|
+
MCP_SERVER_NAME, "--",
|
|
128
|
+
...MCP_ARGS,
|
|
129
|
+
];
|
|
130
|
+
try {
|
|
131
|
+
execFileSync("claude", args, { stdio: "inherit", shell: IS_WINDOWS });
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
try {
|
|
136
|
+
execFileSync("claude", ["mcp", "remove", "--scope", scope, MCP_SERVER_NAME], {
|
|
137
|
+
stdio: "pipe", shell: IS_WINDOWS,
|
|
138
|
+
});
|
|
139
|
+
execFileSync("claude", args, { stdio: "inherit", shell: IS_WINDOWS });
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function removeClaudeCode(scope) {
|
|
148
|
+
try {
|
|
149
|
+
execFileSync("claude", ["mcp", "remove", "--scope", scope, MCP_SERVER_NAME], {
|
|
150
|
+
stdio: "inherit", shell: IS_WINDOWS,
|
|
151
|
+
});
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const CLAUDE_DIR = join(homedir(), ".claude");
|
|
159
|
+
const CLAUDE_SETTINGS_PATH = join(CLAUDE_DIR, "settings.json");
|
|
160
|
+
const PERMISSION_ENTRY = "mcp__fasttest";
|
|
161
|
+
function addClaudePermissions() {
|
|
162
|
+
if (!existsSync(CLAUDE_DIR))
|
|
163
|
+
mkdirSync(CLAUDE_DIR, { recursive: true });
|
|
164
|
+
let settings = {};
|
|
165
|
+
if (existsSync(CLAUDE_SETTINGS_PATH)) {
|
|
166
|
+
try {
|
|
167
|
+
settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
const backup = CLAUDE_SETTINGS_PATH + ".bak";
|
|
171
|
+
writeFileSync(backup, readFileSync(CLAUDE_SETTINGS_PATH));
|
|
172
|
+
console.log(` Warning: ${CLAUDE_SETTINGS_PATH} was corrupted. Backed up to ${backup}`);
|
|
173
|
+
settings = {};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!settings.permissions)
|
|
177
|
+
settings.permissions = {};
|
|
178
|
+
if (!Array.isArray(settings.permissions.allow))
|
|
179
|
+
settings.permissions.allow = [];
|
|
180
|
+
if (settings.permissions.allow.includes(PERMISSION_ENTRY)) {
|
|
181
|
+
return { added: false, alreadyExists: true };
|
|
182
|
+
}
|
|
183
|
+
settings.permissions.allow.push(PERMISSION_ENTRY);
|
|
184
|
+
writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
|
|
185
|
+
return { added: true, alreadyExists: false };
|
|
186
|
+
}
|
|
187
|
+
function removeClaudePermissions() {
|
|
188
|
+
if (!existsSync(CLAUDE_SETTINGS_PATH))
|
|
189
|
+
return false;
|
|
190
|
+
try {
|
|
191
|
+
const settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
|
|
192
|
+
const allow = settings.permissions?.allow;
|
|
193
|
+
if (!Array.isArray(allow))
|
|
194
|
+
return false;
|
|
195
|
+
const idx = allow.indexOf(PERMISSION_ENTRY);
|
|
196
|
+
if (idx === -1)
|
|
197
|
+
return false;
|
|
198
|
+
allow.splice(idx, 1);
|
|
199
|
+
writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// JSON config writers (Cursor, Windsurf, VS Code)
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/** Cursor & Windsurf: { "mcpServers": { "fasttest": { "command": ..., "args": ... } } } */
|
|
210
|
+
function writeMcpServersJson(configPath) {
|
|
211
|
+
const dir = join(configPath, "..");
|
|
212
|
+
if (!existsSync(dir))
|
|
213
|
+
mkdirSync(dir, { recursive: true });
|
|
214
|
+
let config = {};
|
|
215
|
+
if (existsSync(configPath)) {
|
|
216
|
+
try {
|
|
217
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
const backup = configPath + ".bak";
|
|
221
|
+
writeFileSync(backup, readFileSync(configPath));
|
|
222
|
+
console.log(` Warning: ${configPath} was corrupted. Backed up to ${backup}`);
|
|
223
|
+
config = {};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!config.mcpServers || typeof config.mcpServers !== "object") {
|
|
227
|
+
config.mcpServers = {};
|
|
228
|
+
}
|
|
229
|
+
config.mcpServers[MCP_SERVER_NAME] = {
|
|
230
|
+
command: MCP_COMMAND,
|
|
231
|
+
args: [...MCP_ARGS],
|
|
232
|
+
};
|
|
233
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
/** VS Code: { "servers": { "fasttest": { "type": "stdio", "command": ..., "args": ... } } } */
|
|
237
|
+
function writeVscodeJson(configPath) {
|
|
238
|
+
const dir = join(configPath, "..");
|
|
239
|
+
if (!existsSync(dir))
|
|
240
|
+
mkdirSync(dir, { recursive: true });
|
|
241
|
+
let config = {};
|
|
242
|
+
if (existsSync(configPath)) {
|
|
243
|
+
try {
|
|
244
|
+
config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
const backup = configPath + ".bak";
|
|
248
|
+
writeFileSync(backup, readFileSync(configPath));
|
|
249
|
+
console.log(` Warning: ${configPath} was corrupted. Backed up to ${backup}`);
|
|
250
|
+
config = {};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (!config.servers || typeof config.servers !== "object") {
|
|
254
|
+
config.servers = {};
|
|
255
|
+
}
|
|
256
|
+
config.servers[MCP_SERVER_NAME] = {
|
|
257
|
+
type: "stdio",
|
|
258
|
+
command: MCP_COMMAND,
|
|
259
|
+
args: [...MCP_ARGS],
|
|
260
|
+
};
|
|
261
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
// Codex TOML config writer
|
|
266
|
+
// ---------------------------------------------------------------------------
|
|
267
|
+
function writeCodexToml(configPath) {
|
|
268
|
+
const dir = join(configPath, "..");
|
|
269
|
+
if (!existsSync(dir))
|
|
270
|
+
mkdirSync(dir, { recursive: true });
|
|
271
|
+
let content = "";
|
|
272
|
+
if (existsSync(configPath)) {
|
|
273
|
+
content = readFileSync(configPath, "utf-8");
|
|
274
|
+
}
|
|
275
|
+
const sectionHeader = `[mcp_servers.${MCP_SERVER_NAME}]`;
|
|
276
|
+
if (content.includes(sectionHeader)) {
|
|
277
|
+
// Replace existing section — find from header to next section or EOF
|
|
278
|
+
const regex = new RegExp(`\\[mcp_servers\\.${MCP_SERVER_NAME}\\][\\s\\S]*?(?=\\n\\[|$)`);
|
|
279
|
+
content = content.replace(regex, buildCodexSection());
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Append
|
|
283
|
+
if (content.length > 0 && !content.endsWith("\n"))
|
|
284
|
+
content += "\n";
|
|
285
|
+
content += "\n" + buildCodexSection() + "\n";
|
|
286
|
+
}
|
|
287
|
+
writeFileSync(configPath, content);
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
function buildCodexSection() {
|
|
291
|
+
return `[mcp_servers.${MCP_SERVER_NAME}]\ncommand = "${MCP_COMMAND}"\nargs = [${MCP_ARGS.map((a) => `"${a}"`).join(", ")}]`;
|
|
292
|
+
}
|
|
293
|
+
// ---------------------------------------------------------------------------
|
|
294
|
+
// Remove from JSON configs
|
|
295
|
+
// ---------------------------------------------------------------------------
|
|
296
|
+
function removeFromMcpServersJson(configPath) {
|
|
297
|
+
if (!existsSync(configPath))
|
|
298
|
+
return false;
|
|
299
|
+
try {
|
|
300
|
+
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
301
|
+
const servers = config.mcpServers;
|
|
302
|
+
if (!servers || !(MCP_SERVER_NAME in servers))
|
|
303
|
+
return false;
|
|
304
|
+
delete servers[MCP_SERVER_NAME];
|
|
305
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function removeFromVscodeJson(configPath) {
|
|
313
|
+
if (!existsSync(configPath))
|
|
314
|
+
return false;
|
|
315
|
+
try {
|
|
316
|
+
const config = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
317
|
+
const servers = config.servers;
|
|
318
|
+
if (!servers || !(MCP_SERVER_NAME in servers))
|
|
319
|
+
return false;
|
|
320
|
+
delete servers[MCP_SERVER_NAME];
|
|
321
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function removeFromCodexToml(configPath) {
|
|
329
|
+
if (!existsSync(configPath))
|
|
330
|
+
return false;
|
|
331
|
+
try {
|
|
332
|
+
let content = readFileSync(configPath, "utf-8");
|
|
333
|
+
const sectionHeader = `[mcp_servers.${MCP_SERVER_NAME}]`;
|
|
334
|
+
if (!content.includes(sectionHeader))
|
|
335
|
+
return false;
|
|
336
|
+
const regex = new RegExp(`\\n?\\[mcp_servers\\.${MCP_SERVER_NAME}\\][\\s\\S]*?(?=\\n\\[|$)`);
|
|
337
|
+
content = content.replace(regex, "");
|
|
338
|
+
writeFileSync(configPath, content);
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Playwright browser installation
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
function installPlaywrightBrowsers() {
|
|
349
|
+
try {
|
|
350
|
+
execFileSync(NPX_CMD, ["playwright", "install", "--with-deps", "chromium"], {
|
|
351
|
+
stdio: "inherit",
|
|
352
|
+
});
|
|
353
|
+
console.log(" Chromium installed");
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
console.log(" Warning: Could not install Playwright browsers automatically.");
|
|
357
|
+
console.log(" Run manually: npx playwright install --with-deps chromium");
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
// ---------------------------------------------------------------------------
|
|
361
|
+
// Install
|
|
362
|
+
// ---------------------------------------------------------------------------
|
|
363
|
+
function registerMcpServer(ide, scope) {
|
|
364
|
+
switch (ide.format) {
|
|
365
|
+
case "cli":
|
|
366
|
+
if (!isClaudeCliAvailable()) {
|
|
367
|
+
console.log(`
|
|
368
|
+
Claude Code CLI not found in PATH.
|
|
369
|
+
|
|
370
|
+
Install Claude Code first:
|
|
371
|
+
npm install -g @anthropic-ai/claude-code
|
|
372
|
+
|
|
373
|
+
Or add manually to ~/.claude/mcp.json:
|
|
374
|
+
{
|
|
375
|
+
"mcpServers": {
|
|
376
|
+
"fasttest": {
|
|
377
|
+
"command": "npx",
|
|
378
|
+
"args": ["-y", "@fasttest-ai/qa-agent@latest"]
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
`);
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
return registerClaudeCode(scope);
|
|
386
|
+
case "json-mcpServers":
|
|
387
|
+
return writeMcpServersJson(ide.globalConfigPath);
|
|
388
|
+
case "json-servers":
|
|
389
|
+
return writeVscodeJson(ide.globalConfigPath);
|
|
390
|
+
case "toml":
|
|
391
|
+
return writeCodexToml(ide.globalConfigPath);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
function removeMcpServer(ide, scope) {
|
|
395
|
+
switch (ide.format) {
|
|
396
|
+
case "cli":
|
|
397
|
+
return removeClaudeCode(scope);
|
|
398
|
+
case "json-mcpServers":
|
|
399
|
+
return removeFromMcpServersJson(ide.globalConfigPath);
|
|
400
|
+
case "json-servers":
|
|
401
|
+
return removeFromVscodeJson(ide.globalConfigPath);
|
|
402
|
+
case "toml":
|
|
403
|
+
return removeFromCodexToml(ide.globalConfigPath);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async function install(config) {
|
|
407
|
+
console.log("\n FastTest Agent Installer\n");
|
|
408
|
+
const ideId = config.ide ?? (await pickIde());
|
|
409
|
+
const ide = IDE_CONFIGS.find((c) => c.id === ideId);
|
|
410
|
+
if (!ide) {
|
|
411
|
+
console.log(` Unknown IDE: ${ideId}`);
|
|
412
|
+
console.log(` Supported: ${IDE_CONFIGS.map((c) => c.id).join(", ")}`);
|
|
413
|
+
process.exit(1);
|
|
414
|
+
}
|
|
415
|
+
console.log(`\n Installing for ${ide.label}...\n`);
|
|
416
|
+
// Step 1: Register MCP server
|
|
417
|
+
const totalSteps = ide.hasPermissions && !config.skipPermissions ? 3 : 2;
|
|
418
|
+
let step = 1;
|
|
419
|
+
console.log(` [${step}/${totalSteps}] Registering MCP server...`);
|
|
420
|
+
const registered = registerMcpServer(ide, config.scope);
|
|
421
|
+
if (registered) {
|
|
422
|
+
const location = ide.format === "cli"
|
|
423
|
+
? `(scope: ${config.scope})`
|
|
424
|
+
: ide.globalConfigPath;
|
|
425
|
+
console.log(` MCP server "${MCP_SERVER_NAME}" registered ${location}`);
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
if (ide.format === "cli") {
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
console.log(" Warning: Could not register MCP server.");
|
|
432
|
+
}
|
|
433
|
+
step++;
|
|
434
|
+
// Step 2: Pre-approve tools (Claude Code only)
|
|
435
|
+
if (ide.hasPermissions && !config.skipPermissions) {
|
|
436
|
+
console.log(` [${step}/${totalSteps}] Pre-approving tools...`);
|
|
437
|
+
const { added, alreadyExists } = addClaudePermissions();
|
|
438
|
+
if (added) {
|
|
439
|
+
console.log(` Added ${PERMISSION_ENTRY} to ${CLAUDE_SETTINGS_PATH}`);
|
|
440
|
+
}
|
|
441
|
+
else if (alreadyExists) {
|
|
442
|
+
console.log(` Already configured (${PERMISSION_ENTRY})`);
|
|
443
|
+
}
|
|
444
|
+
step++;
|
|
445
|
+
}
|
|
446
|
+
// Step 3: Install Playwright browsers
|
|
447
|
+
console.log(` [${step}/${totalSteps}] Installing Playwright browsers...`);
|
|
448
|
+
installPlaywrightBrowsers();
|
|
449
|
+
console.log(`
|
|
450
|
+
Done! Open ${ide.label} and try:
|
|
451
|
+
|
|
452
|
+
"test my app at http://localhost:3000"
|
|
453
|
+
`);
|
|
454
|
+
}
|
|
455
|
+
// ---------------------------------------------------------------------------
|
|
456
|
+
// Uninstall
|
|
457
|
+
// ---------------------------------------------------------------------------
|
|
458
|
+
async function uninstall(config) {
|
|
459
|
+
console.log("\n FastTest Agent Uninstaller\n");
|
|
460
|
+
const ideId = config.ide ?? (await pickIde());
|
|
461
|
+
const ide = IDE_CONFIGS.find((c) => c.id === ideId);
|
|
462
|
+
if (!ide) {
|
|
463
|
+
console.log(` Unknown IDE: ${ideId}`);
|
|
464
|
+
process.exit(1);
|
|
465
|
+
}
|
|
466
|
+
console.log(`\n Uninstalling from ${ide.label}...\n`);
|
|
467
|
+
const totalSteps = ide.hasPermissions ? 2 : 1;
|
|
468
|
+
let step = 1;
|
|
469
|
+
console.log(` [${step}/${totalSteps}] Removing MCP server...`);
|
|
470
|
+
const removed = removeMcpServer(ide, config.scope);
|
|
471
|
+
if (removed) {
|
|
472
|
+
console.log(` MCP server "${MCP_SERVER_NAME}" removed`);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
console.log(" MCP server was not registered (nothing to remove)");
|
|
476
|
+
}
|
|
477
|
+
step++;
|
|
478
|
+
if (ide.hasPermissions) {
|
|
479
|
+
console.log(` [${step}/${totalSteps}] Removing tool permissions...`);
|
|
480
|
+
const permRemoved = removeClaudePermissions();
|
|
481
|
+
if (permRemoved) {
|
|
482
|
+
console.log(` Removed ${PERMISSION_ENTRY} from ${CLAUDE_SETTINGS_PATH}`);
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
console.log(" Permission was not present (nothing to remove)");
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
console.log(`\n FastTest has been uninstalled from ${ide.label}.\n`);
|
|
489
|
+
}
|
|
490
|
+
// ---------------------------------------------------------------------------
|
|
491
|
+
// Main
|
|
492
|
+
// ---------------------------------------------------------------------------
|
|
493
|
+
const config = parseArgs();
|
|
494
|
+
if (config.action === "uninstall") {
|
|
495
|
+
await uninstall(config);
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
await install(config);
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface RunOptions {
|
|
|
16
16
|
environmentId?: string;
|
|
17
17
|
testCaseIds?: string[];
|
|
18
18
|
appUrlOverride?: string;
|
|
19
|
+
/** When true, stop on first failure with diagnostic snapshot for AI intervention. */
|
|
20
|
+
aiFallback?: boolean;
|
|
19
21
|
}
|
|
20
22
|
export interface RunSummary {
|
|
21
23
|
execution_id: string;
|
|
@@ -27,6 +29,18 @@ export interface RunSummary {
|
|
|
27
29
|
duration_ms: number;
|
|
28
30
|
results: TestCaseResult[];
|
|
29
31
|
healed: HealedStep[];
|
|
32
|
+
/** Present when aiFallback is enabled and a step failed — contains context for AI intervention. */
|
|
33
|
+
ai_fallback?: AiFallbackContext;
|
|
34
|
+
}
|
|
35
|
+
export interface AiFallbackContext {
|
|
36
|
+
test_case_id: string;
|
|
37
|
+
test_case_name: string;
|
|
38
|
+
step_index: number;
|
|
39
|
+
step: Record<string, unknown>;
|
|
40
|
+
intent?: string;
|
|
41
|
+
error: string;
|
|
42
|
+
page_url: string;
|
|
43
|
+
snapshot: Record<string, unknown>;
|
|
30
44
|
}
|
|
31
45
|
interface TestCaseResult {
|
|
32
46
|
id: string;
|
|
@@ -51,8 +65,15 @@ interface StepResult {
|
|
|
51
65
|
strategy: string;
|
|
52
66
|
confidence: number;
|
|
53
67
|
};
|
|
68
|
+
/** Diagnostic snapshot captured on failure for AI fallback. */
|
|
69
|
+
ai_context?: {
|
|
70
|
+
intent?: string;
|
|
71
|
+
page_url: string;
|
|
72
|
+
snapshot: Record<string, unknown>;
|
|
73
|
+
};
|
|
54
74
|
}
|
|
55
75
|
export interface HealedStep {
|
|
76
|
+
test_case_id: string;
|
|
56
77
|
test_case: string;
|
|
57
78
|
step_index: number;
|
|
58
79
|
original_selector: string;
|