@fasttest-ai/qa-agent 0.4.0 → 0.4.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/dist/install.js CHANGED
@@ -1,94 +1,140 @@
1
1
  /**
2
- * FastTest Agent installer for Claude Code.
3
- * Registers the MCP server and pre-approves all tools so users
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 --scope project
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] === "--scope" && rest[i + 1]) {
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 helpers
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 printManualInstructions() {
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
- "npx", "-y", "@fasttest-ai/qa-agent@latest",
128
+ MCP_COMMAND, ...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 removeMcpServer(scope) {
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
- function addToolPermissions() {
114
- if (!existsSync(CLAUDE_DIR)) {
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(SETTINGS_PATH)) {
165
+ if (existsSync(CLAUDE_SETTINGS_PATH)) {
119
166
  try {
120
- settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
167
+ settings = JSON.parse(readFileSync(CLAUDE_SETTINGS_PATH, "utf-8"));
121
168
  }
122
169
  catch {
123
- const backup = SETTINGS_PATH + ".bak";
124
- writeFileSync(backup, readFileSync(SETTINGS_PATH));
125
- console.log(` Warning: ${SETTINGS_PATH} was corrupted. Backed up to ${backup}`);
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(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
184
+ writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
138
185
  return { added: true, alreadyExists: false };
139
186
  }
140
- function removeToolPermissions() {
141
- if (!existsSync(SETTINGS_PATH))
187
+ function removeClaudePermissions() {
188
+ if (!existsSync(CLAUDE_SETTINGS_PATH))
142
189
  return false;
143
190
  try {
144
- const settings = JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
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(SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
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
- // Install / Uninstall
207
+ // JSON config writers (Cursor, Windsurf, VS Code)
161
208
  // ---------------------------------------------------------------------------
162
- function install(config) {
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
- if (!isClaudeCliAvailable()) {
165
- printManualInstructions();
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(" [1/2] Registering MCP server...");
169
- const registered = registerMcpServer(config.scope);
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
- console.log(` MCP server "${MCP_SERVER_NAME}" registered (scope: ${config.scope})`);
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
- console.log(" Warning: Could not register via CLI. See manual instructions above.");
428
+ if (ide.format === "cli") {
429
+ process.exit(1);
430
+ }
431
+ console.log(" Warning: Could not register MCP server.");
175
432
  }
176
- if (!config.skipPermissions) {
177
- console.log(" [2/2] Pre-approving tools...");
178
- const { added, alreadyExists } = addToolPermissions();
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 ${SETTINGS_PATH}`);
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
- else {
187
- console.log(" [2/2] Skipping permissions (--skip-permissions)");
188
- }
446
+ // Step 3: Install Playwright browsers
447
+ console.log(` [${step}/${totalSteps}] Installing Playwright browsers...`);
448
+ installPlaywrightBrowsers();
189
449
  console.log(`
190
- Done! Start a new Claude Code session and try:
450
+ Done! Open ${ide.label} and try:
191
451
 
192
452
  "test my app at http://localhost:3000"
193
453
  `);
194
454
  }
195
- function uninstall(config) {
455
+ // ---------------------------------------------------------------------------
456
+ // Uninstall
457
+ // ---------------------------------------------------------------------------
458
+ async function uninstall(config) {
196
459
  console.log("\n FastTest Agent Uninstaller\n");
197
- console.log(" [1/2] Removing MCP server...");
198
- const removed = removeMcpServer(config.scope);
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
- console.log(" [2/2] Removing tool permissions...");
206
- const permRemoved = removeToolPermissions();
207
- if (permRemoved) {
208
- console.log(` Removed ${PERMISSION_ENTRY} from ${SETTINGS_PATH}`);
209
- }
210
- else {
211
- console.log(" Permission was not present (nothing to remove)");
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("\n FastTest has been uninstalled from Claude Code.\n");
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
@@ -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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"}