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.
- package/LICENSE +21 -0
- package/OVERVIEW.md +597 -0
- package/README.md +439 -0
- package/bin/gtask.js +282 -0
- package/bin/postinstall.js +53 -0
- package/package.json +69 -0
- package/src/agents/phase-dev-templates.js +1011 -0
- package/src/agents/templates.js +668 -0
- package/src/analysis/checklist-parser.js +414 -0
- package/src/analysis/codebase.js +481 -0
- package/src/cli/menu.js +958 -0
- package/src/commands/claude-audit.js +1482 -0
- package/src/commands/claude-settings.js +2243 -0
- package/src/commands/create-agent.js +681 -0
- package/src/commands/create-command.js +337 -0
- package/src/commands/create-hook.js +262 -0
- package/src/commands/create-phase-dev/codebase-analyzer.js +813 -0
- package/src/commands/create-phase-dev/documentation-generator.js +352 -0
- package/src/commands/create-phase-dev/post-completion.js +404 -0
- package/src/commands/create-phase-dev/scale-calculator.js +344 -0
- package/src/commands/create-phase-dev/wizard.js +492 -0
- package/src/commands/create-phase-dev.js +481 -0
- package/src/commands/create-skill.js +313 -0
- package/src/commands/create.js +446 -0
- package/src/commands/decompose.js +392 -0
- package/src/commands/detect-tech-stack.js +768 -0
- package/src/commands/explore-mcp/claude-md-updater.js +252 -0
- package/src/commands/explore-mcp/mcp-installer.js +346 -0
- package/src/commands/explore-mcp/mcp-registry.js +438 -0
- package/src/commands/explore-mcp.js +638 -0
- package/src/commands/gtask-init.js +641 -0
- package/src/commands/help.js +128 -0
- package/src/commands/init.js +1890 -0
- package/src/commands/install.js +250 -0
- package/src/commands/list.js +116 -0
- package/src/commands/roadmap.js +750 -0
- package/src/commands/setup-wizard.js +482 -0
- package/src/commands/setup.js +351 -0
- package/src/commands/sync.js +534 -0
- package/src/commands/test-run.js +456 -0
- package/src/commands/test-setup.js +456 -0
- package/src/commands/validate.js +67 -0
- package/src/config/tech-stack.defaults.json +182 -0
- package/src/config/tech-stack.schema.json +502 -0
- package/src/github/client.js +359 -0
- package/src/index.js +84 -0
- package/src/templates/claude-command.js +244 -0
- package/src/templates/issue-body.js +284 -0
- package/src/testing/config.js +411 -0
- package/src/utils/template-engine.js +398 -0
- package/src/utils/validate-templates.js +223 -0
- package/src/utils.js +396 -0
- package/templates/commands/ccasp-setup.template.md +113 -0
- package/templates/commands/context-audit.template.md +97 -0
- package/templates/commands/create-task-list.template.md +382 -0
- package/templates/commands/deploy-full.template.md +261 -0
- package/templates/commands/github-task-start.template.md +99 -0
- package/templates/commands/github-update.template.md +69 -0
- package/templates/commands/happy-start.template.md +117 -0
- package/templates/commands/phase-track.template.md +142 -0
- package/templates/commands/tunnel-start.template.md +127 -0
- package/templates/commands/tunnel-stop.template.md +106 -0
- package/templates/hooks/context-guardian.template.js +173 -0
- package/templates/hooks/deployment-orchestrator.template.js +219 -0
- package/templates/hooks/github-progress-hook.template.js +197 -0
- package/templates/hooks/happy-checkpoint-manager.template.js +222 -0
- 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
|
+
}
|