@fasttest-ai/qa-agent 0.4.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/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 +16 -0
- package/dist/cloud.js +35 -0
- package/dist/cloud.js.map +1 -1
- package/dist/healer.d.ts +1 -0
- package/dist/healer.js +4 -3
- package/dist/healer.js.map +1 -1
- package/dist/index.js +191 -24
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +5 -5
- package/dist/install.js +367 -92
- package/dist/install.js.map +1 -1
- package/dist/runner.d.ts +21 -0
- package/dist/runner.js +181 -18
- package/dist/runner.js.map +1 -1
- package/package.json +24 -3
package/dist/install.js
CHANGED
|
@@ -1,94 +1,140 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* FastTest Agent installer
|
|
3
|
-
* Registers the MCP server
|
|
4
|
-
* don't get prompted for each tool call individually.
|
|
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.
|
|
5
4
|
*
|
|
6
5
|
* Usage:
|
|
7
|
-
* npx @fasttest-ai/qa-agent install
|
|
8
|
-
* npx @fasttest-ai/qa-agent install --
|
|
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
9
|
* npx @fasttest-ai/qa-agent uninstall
|
|
10
10
|
*/
|
|
11
11
|
import { execFileSync } from "node:child_process";
|
|
12
|
+
import { createInterface } from "node:readline";
|
|
12
13
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
13
14
|
import { homedir, platform } from "node:os";
|
|
14
15
|
import { join } from "node:path";
|
|
15
|
-
const CLAUDE_DIR = join(homedir(), ".claude");
|
|
16
|
-
const SETTINGS_PATH = join(CLAUDE_DIR, "settings.json");
|
|
17
|
-
const PERMISSION_ENTRY = "mcp__fasttest";
|
|
18
|
-
const MCP_SERVER_NAME = "fasttest";
|
|
19
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
|
+
];
|
|
20
63
|
function parseArgs() {
|
|
21
64
|
const action = process.argv[2];
|
|
22
65
|
const rest = process.argv.slice(3);
|
|
66
|
+
let ide = null;
|
|
23
67
|
let scope = "user";
|
|
24
68
|
let skipPermissions = false;
|
|
25
69
|
for (let i = 0; i < rest.length; i++) {
|
|
26
|
-
if (rest[i] === "--
|
|
70
|
+
if (rest[i] === "--ide" && rest[i + 1]) {
|
|
71
|
+
ide = rest[++i];
|
|
72
|
+
}
|
|
73
|
+
else if (rest[i] === "--scope" && rest[i + 1]) {
|
|
27
74
|
scope = rest[++i];
|
|
28
75
|
}
|
|
29
76
|
else if (rest[i] === "--skip-permissions") {
|
|
30
77
|
skipPermissions = true;
|
|
31
78
|
}
|
|
32
79
|
}
|
|
33
|
-
return { action, scope, skipPermissions };
|
|
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";
|
|
34
111
|
}
|
|
35
112
|
// ---------------------------------------------------------------------------
|
|
36
|
-
// Claude CLI
|
|
113
|
+
// Claude Code — CLI-based registration + permission management
|
|
37
114
|
// ---------------------------------------------------------------------------
|
|
38
115
|
function isClaudeCliAvailable() {
|
|
39
116
|
try {
|
|
40
|
-
execFileSync("claude", ["--version"], {
|
|
41
|
-
stdio: "pipe",
|
|
42
|
-
shell: IS_WINDOWS,
|
|
43
|
-
});
|
|
117
|
+
execFileSync("claude", ["--version"], { stdio: "pipe", shell: IS_WINDOWS });
|
|
44
118
|
return true;
|
|
45
119
|
}
|
|
46
120
|
catch {
|
|
47
121
|
return false;
|
|
48
122
|
}
|
|
49
123
|
}
|
|
50
|
-
function
|
|
51
|
-
console.log(`
|
|
52
|
-
Claude Code CLI not found in PATH.
|
|
53
|
-
|
|
54
|
-
Install Claude Code first:
|
|
55
|
-
npm install -g @anthropic-ai/claude-code
|
|
56
|
-
|
|
57
|
-
Or configure manually:
|
|
58
|
-
|
|
59
|
-
1. Add to ~/.claude/mcp.json:
|
|
60
|
-
{
|
|
61
|
-
"mcpServers": {
|
|
62
|
-
"fasttest": {
|
|
63
|
-
"command": "npx",
|
|
64
|
-
"args": ["-y", "@fasttest-ai/qa-agent@latest"]
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
2. Add to ~/.claude/settings.json under permissions.allow:
|
|
70
|
-
"mcp__fasttest"
|
|
71
|
-
`);
|
|
72
|
-
}
|
|
73
|
-
// ---------------------------------------------------------------------------
|
|
74
|
-
// MCP server registration
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
|
-
function registerMcpServer(scope) {
|
|
124
|
+
function registerClaudeCode(scope) {
|
|
77
125
|
const args = [
|
|
78
126
|
"mcp", "add", "--scope", scope,
|
|
79
127
|
MCP_SERVER_NAME, "--",
|
|
80
|
-
|
|
128
|
+
...MCP_ARGS,
|
|
81
129
|
];
|
|
82
130
|
try {
|
|
83
131
|
execFileSync("claude", args, { stdio: "inherit", shell: IS_WINDOWS });
|
|
84
132
|
return true;
|
|
85
133
|
}
|
|
86
134
|
catch {
|
|
87
|
-
// May fail if already registered — remove then re-add
|
|
88
135
|
try {
|
|
89
136
|
execFileSync("claude", ["mcp", "remove", "--scope", scope, MCP_SERVER_NAME], {
|
|
90
|
-
stdio: "pipe",
|
|
91
|
-
shell: IS_WINDOWS,
|
|
137
|
+
stdio: "pipe", shell: IS_WINDOWS,
|
|
92
138
|
});
|
|
93
139
|
execFileSync("claude", args, { stdio: "inherit", shell: IS_WINDOWS });
|
|
94
140
|
return true;
|
|
@@ -98,11 +144,10 @@ function registerMcpServer(scope) {
|
|
|
98
144
|
}
|
|
99
145
|
}
|
|
100
146
|
}
|
|
101
|
-
function
|
|
147
|
+
function removeClaudeCode(scope) {
|
|
102
148
|
try {
|
|
103
149
|
execFileSync("claude", ["mcp", "remove", "--scope", scope, MCP_SERVER_NAME], {
|
|
104
|
-
stdio: "inherit",
|
|
105
|
-
shell: IS_WINDOWS,
|
|
150
|
+
stdio: "inherit", shell: IS_WINDOWS,
|
|
106
151
|
});
|
|
107
152
|
return true;
|
|
108
153
|
}
|
|
@@ -110,19 +155,21 @@ function removeMcpServer(scope) {
|
|
|
110
155
|
return false;
|
|
111
156
|
}
|
|
112
157
|
}
|
|
113
|
-
|
|
114
|
-
|
|
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))
|
|
115
163
|
mkdirSync(CLAUDE_DIR, { recursive: true });
|
|
116
|
-
}
|
|
117
164
|
let settings = {};
|
|
118
|
-
if (existsSync(
|
|
165
|
+
if (existsSync(CLAUDE_SETTINGS_PATH)) {
|
|
119
166
|
try {
|
|
120
|
-
settings = JSON.parse(readFileSync(
|
|
167
|
+
settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
|
|
121
168
|
}
|
|
122
169
|
catch {
|
|
123
|
-
const backup =
|
|
124
|
-
writeFileSync(backup, readFileSync(
|
|
125
|
-
console.log(`
|
|
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}`);
|
|
126
173
|
settings = {};
|
|
127
174
|
}
|
|
128
175
|
}
|
|
@@ -134,14 +181,14 @@ function addToolPermissions() {
|
|
|
134
181
|
return { added: false, alreadyExists: true };
|
|
135
182
|
}
|
|
136
183
|
settings.permissions.allow.push(PERMISSION_ENTRY);
|
|
137
|
-
writeFileSync(
|
|
184
|
+
writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
|
|
138
185
|
return { added: true, alreadyExists: false };
|
|
139
186
|
}
|
|
140
|
-
function
|
|
141
|
-
if (!existsSync(
|
|
187
|
+
function removeClaudePermissions() {
|
|
188
|
+
if (!existsSync(CLAUDE_SETTINGS_PATH))
|
|
142
189
|
return false;
|
|
143
190
|
try {
|
|
144
|
-
const settings = JSON.parse(readFileSync(
|
|
191
|
+
const settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
|
|
145
192
|
const allow = settings.permissions?.allow;
|
|
146
193
|
if (!Array.isArray(allow))
|
|
147
194
|
return false;
|
|
@@ -149,7 +196,7 @@ function removeToolPermissions() {
|
|
|
149
196
|
if (idx === -1)
|
|
150
197
|
return false;
|
|
151
198
|
allow.splice(idx, 1);
|
|
152
|
-
writeFileSync(
|
|
199
|
+
writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
|
|
153
200
|
return true;
|
|
154
201
|
}
|
|
155
202
|
catch {
|
|
@@ -157,69 +204,297 @@ function removeToolPermissions() {
|
|
|
157
204
|
}
|
|
158
205
|
}
|
|
159
206
|
// ---------------------------------------------------------------------------
|
|
160
|
-
//
|
|
207
|
+
// JSON config writers (Cursor, Windsurf, VS Code)
|
|
161
208
|
// ---------------------------------------------------------------------------
|
|
162
|
-
|
|
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) {
|
|
163
407
|
console.log("\n FastTest Agent Installer\n");
|
|
164
|
-
|
|
165
|
-
|
|
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(", ")}`);
|
|
166
413
|
process.exit(1);
|
|
167
414
|
}
|
|
168
|
-
console.log(
|
|
169
|
-
|
|
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);
|
|
170
421
|
if (registered) {
|
|
171
|
-
|
|
422
|
+
const location = ide.format === "cli"
|
|
423
|
+
? `(scope: ${config.scope})`
|
|
424
|
+
: ide.globalConfigPath;
|
|
425
|
+
console.log(` MCP server "${MCP_SERVER_NAME}" registered ${location}`);
|
|
172
426
|
}
|
|
173
427
|
else {
|
|
174
|
-
|
|
428
|
+
if (ide.format === "cli") {
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
console.log(" Warning: Could not register MCP server.");
|
|
175
432
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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();
|
|
179
438
|
if (added) {
|
|
180
|
-
console.log(` Added ${PERMISSION_ENTRY} to ${
|
|
439
|
+
console.log(` Added ${PERMISSION_ENTRY} to ${CLAUDE_SETTINGS_PATH}`);
|
|
181
440
|
}
|
|
182
441
|
else if (alreadyExists) {
|
|
183
442
|
console.log(` Already configured (${PERMISSION_ENTRY})`);
|
|
184
443
|
}
|
|
444
|
+
step++;
|
|
185
445
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
446
|
+
// Step 3: Install Playwright browsers
|
|
447
|
+
console.log(` [${step}/${totalSteps}] Installing Playwright browsers...`);
|
|
448
|
+
installPlaywrightBrowsers();
|
|
189
449
|
console.log(`
|
|
190
|
-
Done!
|
|
450
|
+
Done! Open ${ide.label} and try:
|
|
191
451
|
|
|
192
452
|
"test my app at http://localhost:3000"
|
|
193
453
|
`);
|
|
194
454
|
}
|
|
195
|
-
|
|
455
|
+
// ---------------------------------------------------------------------------
|
|
456
|
+
// Uninstall
|
|
457
|
+
// ---------------------------------------------------------------------------
|
|
458
|
+
async function uninstall(config) {
|
|
196
459
|
console.log("\n FastTest Agent Uninstaller\n");
|
|
197
|
-
|
|
198
|
-
const
|
|
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);
|
|
199
471
|
if (removed) {
|
|
200
472
|
console.log(` MCP server "${MCP_SERVER_NAME}" removed`);
|
|
201
473
|
}
|
|
202
474
|
else {
|
|
203
475
|
console.log(" MCP server was not registered (nothing to remove)");
|
|
204
476
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
+
}
|
|
212
487
|
}
|
|
213
|
-
console.log(
|
|
488
|
+
console.log(`\n FastTest has been uninstalled from ${ide.label}.\n`);
|
|
214
489
|
}
|
|
215
490
|
// ---------------------------------------------------------------------------
|
|
216
491
|
// Main
|
|
217
492
|
// ---------------------------------------------------------------------------
|
|
218
493
|
const config = parseArgs();
|
|
219
494
|
if (config.action === "uninstall") {
|
|
220
|
-
uninstall(config);
|
|
495
|
+
await uninstall(config);
|
|
221
496
|
}
|
|
222
497
|
else {
|
|
223
|
-
install(config);
|
|
498
|
+
await install(config);
|
|
224
499
|
}
|
|
225
500
|
//# sourceMappingURL=install.js.map
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|