claude-cli-advanced-starter-pack 1.0.0

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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/OVERVIEW.md +597 -0
  3. package/README.md +439 -0
  4. package/bin/gtask.js +282 -0
  5. package/bin/postinstall.js +53 -0
  6. package/package.json +69 -0
  7. package/src/agents/phase-dev-templates.js +1011 -0
  8. package/src/agents/templates.js +668 -0
  9. package/src/analysis/checklist-parser.js +414 -0
  10. package/src/analysis/codebase.js +481 -0
  11. package/src/cli/menu.js +958 -0
  12. package/src/commands/claude-audit.js +1482 -0
  13. package/src/commands/claude-settings.js +2243 -0
  14. package/src/commands/create-agent.js +681 -0
  15. package/src/commands/create-command.js +337 -0
  16. package/src/commands/create-hook.js +262 -0
  17. package/src/commands/create-phase-dev/codebase-analyzer.js +813 -0
  18. package/src/commands/create-phase-dev/documentation-generator.js +352 -0
  19. package/src/commands/create-phase-dev/post-completion.js +404 -0
  20. package/src/commands/create-phase-dev/scale-calculator.js +344 -0
  21. package/src/commands/create-phase-dev/wizard.js +492 -0
  22. package/src/commands/create-phase-dev.js +481 -0
  23. package/src/commands/create-skill.js +313 -0
  24. package/src/commands/create.js +446 -0
  25. package/src/commands/decompose.js +392 -0
  26. package/src/commands/detect-tech-stack.js +768 -0
  27. package/src/commands/explore-mcp/claude-md-updater.js +252 -0
  28. package/src/commands/explore-mcp/mcp-installer.js +346 -0
  29. package/src/commands/explore-mcp/mcp-registry.js +438 -0
  30. package/src/commands/explore-mcp.js +638 -0
  31. package/src/commands/gtask-init.js +641 -0
  32. package/src/commands/help.js +128 -0
  33. package/src/commands/init.js +1890 -0
  34. package/src/commands/install.js +250 -0
  35. package/src/commands/list.js +116 -0
  36. package/src/commands/roadmap.js +750 -0
  37. package/src/commands/setup-wizard.js +482 -0
  38. package/src/commands/setup.js +351 -0
  39. package/src/commands/sync.js +534 -0
  40. package/src/commands/test-run.js +456 -0
  41. package/src/commands/test-setup.js +456 -0
  42. package/src/commands/validate.js +67 -0
  43. package/src/config/tech-stack.defaults.json +182 -0
  44. package/src/config/tech-stack.schema.json +502 -0
  45. package/src/github/client.js +359 -0
  46. package/src/index.js +84 -0
  47. package/src/templates/claude-command.js +244 -0
  48. package/src/templates/issue-body.js +284 -0
  49. package/src/testing/config.js +411 -0
  50. package/src/utils/template-engine.js +398 -0
  51. package/src/utils/validate-templates.js +223 -0
  52. package/src/utils.js +396 -0
  53. package/templates/commands/ccasp-setup.template.md +113 -0
  54. package/templates/commands/context-audit.template.md +97 -0
  55. package/templates/commands/create-task-list.template.md +382 -0
  56. package/templates/commands/deploy-full.template.md +261 -0
  57. package/templates/commands/github-task-start.template.md +99 -0
  58. package/templates/commands/github-update.template.md +69 -0
  59. package/templates/commands/happy-start.template.md +117 -0
  60. package/templates/commands/phase-track.template.md +142 -0
  61. package/templates/commands/tunnel-start.template.md +127 -0
  62. package/templates/commands/tunnel-stop.template.md +106 -0
  63. package/templates/hooks/context-guardian.template.js +173 -0
  64. package/templates/hooks/deployment-orchestrator.template.js +219 -0
  65. package/templates/hooks/github-progress-hook.template.js +197 -0
  66. package/templates/hooks/happy-checkpoint-manager.template.js +222 -0
  67. package/templates/hooks/phase-dev-enforcer.template.js +183 -0
@@ -0,0 +1,638 @@
1
+ /**
2
+ * Explore MCP Command
3
+ *
4
+ * Interactive MCP server discovery and installation.
5
+ * Uses codebase analyzer to recommend relevant MCPs.
6
+ */
7
+
8
+ import chalk from 'chalk';
9
+ import inquirer from 'inquirer';
10
+ import ora from 'ora';
11
+ import { showHeader } from '../cli/menu.js';
12
+ import { analyzeCodebase, generateStackSummary, displayAnalysisResults } from './create-phase-dev/codebase-analyzer.js';
13
+ import {
14
+ getAllMcps,
15
+ getMcpsByCategory,
16
+ getRecommendedMcps,
17
+ getTestingMcps,
18
+ searchMcps,
19
+ getMcpById,
20
+ getCategories,
21
+ } from './explore-mcp/mcp-registry.js';
22
+ import {
23
+ installMcp,
24
+ installMultipleMcps,
25
+ isMcpInstalled,
26
+ getInstalledMcps,
27
+ removeMcp,
28
+ } from './explore-mcp/mcp-installer.js';
29
+ import { updateClaudeMd, removeMcpSection } from './explore-mcp/claude-md-updater.js';
30
+
31
+ /**
32
+ * Run the explore-mcp command
33
+ */
34
+ export async function runExploreMcp(options = {}) {
35
+ showHeader('MCP Server Explorer');
36
+
37
+ console.log(chalk.dim('Discover and install MCP servers to extend Claude\'s capabilities.'));
38
+ console.log(chalk.dim('MCPs add tools for browser automation, API access, deployments, and more.\n'));
39
+
40
+ // Check for quick options
41
+ if (options.recommend) {
42
+ return await runRecommendedFlow(options);
43
+ }
44
+
45
+ if (options.testing) {
46
+ return await runTestingFlow(options);
47
+ }
48
+
49
+ // Show main menu
50
+ return await showExploreMcpMenu();
51
+ }
52
+
53
+ /**
54
+ * Main menu for MCP exploration
55
+ */
56
+ export async function showExploreMcpMenu() {
57
+ const installed = getInstalledMcps();
58
+ const installedCount = installed.length;
59
+
60
+ const { action } = await inquirer.prompt([
61
+ {
62
+ type: 'list',
63
+ name: 'action',
64
+ message: 'What would you like to do?',
65
+ choices: [
66
+ {
67
+ name: `${chalk.green('1)')} Smart Recommendations Auto-detect stack & suggest MCPs`,
68
+ value: 'recommend',
69
+ short: 'Recommend',
70
+ },
71
+ {
72
+ name: `${chalk.cyan('2)')} Testing MCPs (Recommended) Install Playwright + Puppeteer`,
73
+ value: 'testing',
74
+ short: 'Testing',
75
+ },
76
+ new inquirer.Separator(),
77
+ {
78
+ name: `${chalk.blue('3)')} Browse by Category View all available MCPs`,
79
+ value: 'browse',
80
+ short: 'Browse',
81
+ },
82
+ {
83
+ name: `${chalk.blue('4)')} Search MCPs Find specific servers`,
84
+ value: 'search',
85
+ short: 'Search',
86
+ },
87
+ new inquirer.Separator(),
88
+ {
89
+ name: `${chalk.dim('5)')} View Installed (${installedCount}) Manage existing MCPs`,
90
+ value: 'installed',
91
+ short: 'Installed',
92
+ },
93
+ {
94
+ name: `${chalk.dim('6)')} Update CLAUDE.md Regenerate MCP documentation`,
95
+ value: 'update-docs',
96
+ short: 'Update Docs',
97
+ },
98
+ new inquirer.Separator(),
99
+ {
100
+ name: `${chalk.dim('Q)')} Back`,
101
+ value: 'back',
102
+ short: 'Back',
103
+ },
104
+ ],
105
+ },
106
+ ]);
107
+
108
+ switch (action) {
109
+ case 'recommend':
110
+ await runRecommendedFlow({});
111
+ break;
112
+ case 'testing':
113
+ await runTestingFlow({});
114
+ break;
115
+ case 'browse':
116
+ await runBrowseFlow();
117
+ break;
118
+ case 'search':
119
+ await runSearchFlow();
120
+ break;
121
+ case 'installed':
122
+ await runInstalledFlow();
123
+ break;
124
+ case 'update-docs':
125
+ await runUpdateDocsFlow();
126
+ break;
127
+ case 'back':
128
+ return null;
129
+ }
130
+
131
+ // Return to menu unless exiting
132
+ if (action !== 'back') {
133
+ return await showExploreMcpMenu();
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Smart recommendations flow
139
+ */
140
+ async function runRecommendedFlow(options) {
141
+ console.log(chalk.cyan.bold('\nšŸ” Analyzing Codebase...\n'));
142
+
143
+ // Analyze codebase
144
+ const analysis = await analyzeCodebase(process.cwd());
145
+ displayAnalysisResults(analysis);
146
+
147
+ // Get recommendations
148
+ const recommendations = getRecommendedMcps(analysis);
149
+ const installed = getInstalledMcps();
150
+
151
+ console.log(chalk.cyan.bold('\nšŸ“‹ Recommended MCP Servers\n'));
152
+
153
+ if (recommendations.length === 0) {
154
+ console.log(chalk.yellow('No specific recommendations based on your stack.'));
155
+ console.log(chalk.dim('Consider installing testing MCPs for browser automation.\n'));
156
+ return;
157
+ }
158
+
159
+ // Show recommendations with install status
160
+ const choices = recommendations.slice(0, 10).map((mcp, i) => {
161
+ const isInstalled = installed.includes(mcp.id);
162
+ const status = isInstalled ? chalk.green(' [installed]') : '';
163
+ const score = chalk.dim(` (score: ${mcp.score})`);
164
+
165
+ return {
166
+ name: `${chalk.cyan(`${i + 1})`)} ${mcp.name}${status}${score}\n ${chalk.dim(mcp.description)}`,
167
+ value: mcp.id,
168
+ short: mcp.name,
169
+ disabled: isInstalled ? 'Already installed' : false,
170
+ };
171
+ });
172
+
173
+ choices.push(new inquirer.Separator());
174
+ choices.push({
175
+ name: `${chalk.green('A)')} Install All Recommended`,
176
+ value: 'all',
177
+ short: 'Install All',
178
+ });
179
+ choices.push({
180
+ name: `${chalk.dim('Q)')} Skip`,
181
+ value: 'skip',
182
+ short: 'Skip',
183
+ });
184
+
185
+ const { selection } = await inquirer.prompt([
186
+ {
187
+ type: 'list',
188
+ name: 'selection',
189
+ message: 'Select MCPs to install:',
190
+ choices,
191
+ pageSize: 15,
192
+ },
193
+ ]);
194
+
195
+ if (selection === 'skip') return;
196
+
197
+ if (selection === 'all') {
198
+ const toInstall = recommendations
199
+ .filter((mcp) => !installed.includes(mcp.id))
200
+ .slice(0, 5); // Limit to top 5
201
+
202
+ if (toInstall.length === 0) {
203
+ console.log(chalk.yellow('\nAll recommended MCPs are already installed.'));
204
+ return;
205
+ }
206
+
207
+ console.log(chalk.cyan(`\nInstalling ${toInstall.length} MCPs...`));
208
+ const results = await installMultipleMcps(toInstall);
209
+
210
+ // Update CLAUDE.md
211
+ const successfulMcps = results
212
+ .filter((r) => r.success)
213
+ .map((r) => getMcpById(r.mcp.id));
214
+
215
+ if (successfulMcps.length > 0) {
216
+ await updateClaudeMd(successfulMcps);
217
+ }
218
+
219
+ displayInstallResults(results);
220
+ } else {
221
+ // Install single MCP
222
+ const mcp = getMcpById(selection);
223
+ if (mcp) {
224
+ const result = await installMcp(mcp);
225
+ if (result.success) {
226
+ await updateClaudeMd([mcp]);
227
+ }
228
+ displayInstallResults([result]);
229
+ }
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Testing MCPs flow - install Playwright and Puppeteer
235
+ */
236
+ async function runTestingFlow(options) {
237
+ console.log(chalk.cyan.bold('\n🧪 Testing MCP Servers\n'));
238
+ console.log(chalk.dim('Browser automation MCPs for E2E testing and UI interaction.\n'));
239
+
240
+ const testingMcps = getTestingMcps();
241
+ const installed = getInstalledMcps();
242
+
243
+ // Show testing MCPs
244
+ const choices = testingMcps.map((mcp) => {
245
+ const isInstalled = installed.includes(mcp.id);
246
+ const recommended = mcp.recommended ? chalk.green(' (Recommended)') : '';
247
+ const status = isInstalled ? chalk.green(' [installed]') : '';
248
+
249
+ return {
250
+ name: `${mcp.name}${recommended}${status}\n ${chalk.dim(mcp.description)}`,
251
+ value: mcp.id,
252
+ checked: mcp.recommended && !isInstalled,
253
+ disabled: isInstalled ? 'Already installed' : false,
254
+ };
255
+ });
256
+
257
+ const { selections } = await inquirer.prompt([
258
+ {
259
+ type: 'checkbox',
260
+ name: 'selections',
261
+ message: 'Select testing MCPs to install:',
262
+ choices,
263
+ },
264
+ ]);
265
+
266
+ if (selections.length === 0) {
267
+ console.log(chalk.yellow('\nNo MCPs selected.'));
268
+ return;
269
+ }
270
+
271
+ // Install selected MCPs
272
+ const mcpsToInstall = selections.map((id) => getMcpById(id)).filter(Boolean);
273
+ const results = await installMultipleMcps(mcpsToInstall);
274
+
275
+ // Update CLAUDE.md
276
+ const successfulMcps = results
277
+ .filter((r) => r.success)
278
+ .map((r) => getMcpById(r.mcp.id));
279
+
280
+ if (successfulMcps.length > 0) {
281
+ await updateClaudeMd(successfulMcps);
282
+ }
283
+
284
+ displayInstallResults(results);
285
+
286
+ // Show usage tips
287
+ console.log(chalk.cyan.bold('\nšŸ“š Usage Tips\n'));
288
+ console.log(chalk.white('Playwright MCP:'));
289
+ console.log(chalk.dim(' mcp__playwright__browser_navigate(url: "https://example.com")'));
290
+ console.log(chalk.dim(' mcp__playwright__browser_screenshot()'));
291
+ console.log(chalk.dim(' mcp__playwright__browser_click(selector: "button.submit")'));
292
+ console.log('');
293
+ console.log(chalk.white('Puppeteer MCP:'));
294
+ console.log(chalk.dim(' mcp__browser-monitor__puppeteer_navigate(url: "http://localhost:5174")'));
295
+ console.log(chalk.dim(' mcp__browser-monitor__puppeteer_screenshot()'));
296
+ console.log('');
297
+ console.log(chalk.yellow('āš ļø Restart Claude Code for changes to take effect.'));
298
+ }
299
+
300
+ /**
301
+ * Browse by category flow
302
+ */
303
+ async function runBrowseFlow() {
304
+ const categories = getCategories();
305
+
306
+ const { category } = await inquirer.prompt([
307
+ {
308
+ type: 'list',
309
+ name: 'category',
310
+ message: 'Select category:',
311
+ choices: [
312
+ ...categories.map((cat) => ({
313
+ name: `${cat.name} (${cat.count} servers)`,
314
+ value: cat.id,
315
+ short: cat.name,
316
+ })),
317
+ new inquirer.Separator(),
318
+ { name: 'Back', value: 'back' },
319
+ ],
320
+ },
321
+ ]);
322
+
323
+ if (category === 'back') return;
324
+
325
+ const mcps = getMcpsByCategory(category);
326
+ const installed = getInstalledMcps();
327
+
328
+ const choices = mcps.map((mcp) => {
329
+ const isInstalled = installed.includes(mcp.id);
330
+ const status = isInstalled ? chalk.green(' [installed]') : '';
331
+
332
+ return {
333
+ name: `${mcp.name}${status}\n ${chalk.dim(mcp.description)}`,
334
+ value: mcp.id,
335
+ short: mcp.name,
336
+ };
337
+ });
338
+
339
+ choices.push(new inquirer.Separator());
340
+ choices.push({ name: 'Back', value: 'back' });
341
+
342
+ const { selection } = await inquirer.prompt([
343
+ {
344
+ type: 'list',
345
+ name: 'selection',
346
+ message: `${category} MCPs:`,
347
+ choices,
348
+ pageSize: 12,
349
+ },
350
+ ]);
351
+
352
+ if (selection === 'back') return;
353
+
354
+ const mcp = getMcpById(selection);
355
+ if (mcp) {
356
+ await showMcpDetails(mcp);
357
+ }
358
+ }
359
+
360
+ /**
361
+ * Search flow
362
+ */
363
+ async function runSearchFlow() {
364
+ const { query } = await inquirer.prompt([
365
+ {
366
+ type: 'input',
367
+ name: 'query',
368
+ message: 'Search MCPs:',
369
+ validate: (input) => input.length >= 2 || 'Enter at least 2 characters',
370
+ },
371
+ ]);
372
+
373
+ const results = searchMcps(query);
374
+
375
+ if (results.length === 0) {
376
+ console.log(chalk.yellow(`\nNo MCPs found matching "${query}".`));
377
+ return;
378
+ }
379
+
380
+ const installed = getInstalledMcps();
381
+ const choices = results.map((mcp) => {
382
+ const isInstalled = installed.includes(mcp.id);
383
+ const status = isInstalled ? chalk.green(' [installed]') : '';
384
+
385
+ return {
386
+ name: `${mcp.name}${status} (${mcp.category})\n ${chalk.dim(mcp.description)}`,
387
+ value: mcp.id,
388
+ short: mcp.name,
389
+ };
390
+ });
391
+
392
+ choices.push(new inquirer.Separator());
393
+ choices.push({ name: 'Back', value: 'back' });
394
+
395
+ const { selection } = await inquirer.prompt([
396
+ {
397
+ type: 'list',
398
+ name: 'selection',
399
+ message: `Search results for "${query}":`,
400
+ choices,
401
+ },
402
+ ]);
403
+
404
+ if (selection === 'back') return;
405
+
406
+ const mcp = getMcpById(selection);
407
+ if (mcp) {
408
+ await showMcpDetails(mcp);
409
+ }
410
+ }
411
+
412
+ /**
413
+ * View installed MCPs flow
414
+ */
415
+ async function runInstalledFlow() {
416
+ const installed = getInstalledMcps();
417
+
418
+ if (installed.length === 0) {
419
+ console.log(chalk.yellow('\nNo MCPs installed yet.'));
420
+ console.log(chalk.dim('Use "Smart Recommendations" or "Testing MCPs" to get started.\n'));
421
+ return;
422
+ }
423
+
424
+ console.log(chalk.cyan.bold(`\nšŸ“¦ Installed MCPs (${installed.length})\n`));
425
+
426
+ const choices = installed.map((id) => {
427
+ const mcp = getMcpById(id);
428
+ const name = mcp ? mcp.name : id;
429
+ const desc = mcp ? chalk.dim(mcp.description) : chalk.dim('Custom MCP');
430
+
431
+ return {
432
+ name: `${name}\n ${desc}`,
433
+ value: id,
434
+ short: name,
435
+ };
436
+ });
437
+
438
+ choices.push(new inquirer.Separator());
439
+ choices.push({ name: 'Remove an MCP', value: 'remove' });
440
+ choices.push({ name: 'Back', value: 'back' });
441
+
442
+ const { selection } = await inquirer.prompt([
443
+ {
444
+ type: 'list',
445
+ name: 'selection',
446
+ message: 'Installed MCPs:',
447
+ choices,
448
+ },
449
+ ]);
450
+
451
+ if (selection === 'back') return;
452
+
453
+ if (selection === 'remove') {
454
+ const { toRemove } = await inquirer.prompt([
455
+ {
456
+ type: 'checkbox',
457
+ name: 'toRemove',
458
+ message: 'Select MCPs to remove:',
459
+ choices: installed.map((id) => ({
460
+ name: getMcpById(id)?.name || id,
461
+ value: id,
462
+ })),
463
+ },
464
+ ]);
465
+
466
+ if (toRemove.length > 0) {
467
+ for (const id of toRemove) {
468
+ removeMcp(id);
469
+ console.log(chalk.green(`āœ“ Removed ${id}`));
470
+ }
471
+
472
+ // Update CLAUDE.md
473
+ const remainingMcps = getInstalledMcps().map((id) => getMcpById(id)).filter(Boolean);
474
+ await updateClaudeMd(remainingMcps);
475
+ }
476
+ } else {
477
+ const mcp = getMcpById(selection);
478
+ if (mcp) {
479
+ await showMcpDetails(mcp);
480
+ }
481
+ }
482
+ }
483
+
484
+ /**
485
+ * Update CLAUDE.md documentation flow
486
+ */
487
+ async function runUpdateDocsFlow() {
488
+ const installed = getInstalledMcps();
489
+ const mcps = installed.map((id) => getMcpById(id)).filter(Boolean);
490
+
491
+ if (mcps.length === 0) {
492
+ console.log(chalk.yellow('\nNo MCPs to document.'));
493
+ return;
494
+ }
495
+
496
+ const result = await updateClaudeMd(mcps);
497
+
498
+ if (result.success) {
499
+ console.log(chalk.green(`\nāœ“ ${result.action === 'created' ? 'Created' : 'Updated'} CLAUDE.md`));
500
+ console.log(chalk.dim(` ${result.path}`));
501
+ }
502
+ }
503
+
504
+ /**
505
+ * Show MCP details and install option
506
+ */
507
+ async function showMcpDetails(mcp) {
508
+ console.log(chalk.cyan.bold(`\nšŸ“¦ ${mcp.name}\n`));
509
+ console.log(`${chalk.white('Description:')} ${mcp.description}`);
510
+ console.log(`${chalk.white('Category:')} ${mcp.category}`);
511
+ console.log(`${chalk.white('Package:')} ${mcp.npmPackage || mcp.command}`);
512
+
513
+ if (mcp.tools && mcp.tools.length > 0) {
514
+ console.log(`${chalk.white('Tools:')} ${mcp.tools.join(', ')}`);
515
+ }
516
+
517
+ if (Object.keys(mcp.requiredEnv || {}).length > 0) {
518
+ console.log(`${chalk.white('Required Env:')} ${Object.keys(mcp.requiredEnv).join(', ')}`);
519
+ }
520
+
521
+ if (mcp.note) {
522
+ console.log(`${chalk.yellow('Note:')} ${mcp.note}`);
523
+ }
524
+
525
+ console.log('');
526
+
527
+ const isInstalled = isMcpInstalled(mcp.id);
528
+
529
+ if (isInstalled) {
530
+ console.log(chalk.green('āœ“ Already installed'));
531
+
532
+ const { action } = await inquirer.prompt([
533
+ {
534
+ type: 'list',
535
+ name: 'action',
536
+ message: 'Action:',
537
+ choices: [
538
+ { name: 'Remove', value: 'remove' },
539
+ { name: 'Back', value: 'back' },
540
+ ],
541
+ },
542
+ ]);
543
+
544
+ if (action === 'remove') {
545
+ removeMcp(mcp.id);
546
+ console.log(chalk.green(`āœ“ Removed ${mcp.name}`));
547
+
548
+ const remainingMcps = getInstalledMcps().map((id) => getMcpById(id)).filter(Boolean);
549
+ await updateClaudeMd(remainingMcps);
550
+ }
551
+ } else {
552
+ const { install } = await inquirer.prompt([
553
+ {
554
+ type: 'confirm',
555
+ name: 'install',
556
+ message: 'Install this MCP?',
557
+ default: true,
558
+ },
559
+ ]);
560
+
561
+ if (install) {
562
+ const result = await installMcp(mcp);
563
+ if (result.success) {
564
+ await updateClaudeMd([mcp]);
565
+ }
566
+ displayInstallResults([result]);
567
+ }
568
+ }
569
+ }
570
+
571
+ /**
572
+ * Display installation results
573
+ */
574
+ function displayInstallResults(results) {
575
+ console.log(chalk.cyan.bold('\nšŸ“‹ Installation Results\n'));
576
+
577
+ const successful = results.filter((r) => r.success);
578
+ const failed = results.filter((r) => !r.success);
579
+
580
+ if (successful.length > 0) {
581
+ console.log(chalk.green('āœ“ Installed:'));
582
+ for (const result of successful) {
583
+ console.log(` - ${result.mcp.name}`);
584
+ }
585
+ }
586
+
587
+ if (failed.length > 0) {
588
+ console.log(chalk.red('\nāœ— Failed:'));
589
+ for (const result of failed) {
590
+ console.log(` - ${result.mcp.name}: ${result.error}`);
591
+ }
592
+ }
593
+
594
+ if (successful.length > 0) {
595
+ console.log(chalk.cyan('\nšŸ“ Files Updated:'));
596
+ console.log(chalk.dim(' - .mcp.json'));
597
+ console.log(chalk.dim(' - .claude/settings.json'));
598
+ console.log(chalk.dim(' - CLAUDE.md'));
599
+ console.log(chalk.yellow('\nāš ļø Restart Claude Code for changes to take effect.'));
600
+ }
601
+ }
602
+
603
+ /**
604
+ * Show help for MCP exploration
605
+ */
606
+ export function showExploreMcpHelp() {
607
+ console.log(chalk.cyan.bold('\nšŸ“š MCP Explorer Help\n'));
608
+
609
+ console.log(chalk.white.bold('What are MCPs?'));
610
+ console.log(chalk.dim(`
611
+ MCP (Model Context Protocol) servers extend Claude's capabilities
612
+ with additional tools for browser automation, API access, deployments,
613
+ and more. They run as separate processes that Claude communicates with.
614
+ `));
615
+
616
+ console.log(chalk.white.bold('Recommended MCPs:'));
617
+ console.log(chalk.dim(`
618
+ - Playwright: Browser automation for testing and web interaction
619
+ - Puppeteer: Alternative browser automation using Chrome
620
+ - GitHub: GitHub API for issues, PRs, and repository management
621
+ `));
622
+
623
+ console.log(chalk.white.bold('Files Modified:'));
624
+ console.log(chalk.dim(`
625
+ - .mcp.json: MCP server configurations (commit to git for team sharing)
626
+ - .claude/settings.json: Permissions and enabled servers
627
+ - CLAUDE.md: Documentation of installed tools
628
+ `));
629
+
630
+ console.log(chalk.white.bold('CLI Usage:'));
631
+ console.log(chalk.dim(`
632
+ gtask explore-mcp # Interactive menu
633
+ gtask explore-mcp --recommend # Auto-detect stack and recommend
634
+ gtask explore-mcp --testing # Install testing MCPs
635
+ `));
636
+
637
+ console.log('');
638
+ }