@tostudy-ai/mcp-setup 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 (75) hide show
  1. package/README.md +149 -0
  2. package/bin/cli.js +6 -0
  3. package/dist/__tests__/e2e-diagnostic-repair-flow.test.d.ts +52 -0
  4. package/dist/__tests__/e2e-diagnostic-repair-flow.test.d.ts.map +1 -0
  5. package/dist/__tests__/e2e-diagnostic-repair-flow.test.js +720 -0
  6. package/dist/__tests__/e2e-diagnostic-repair-flow.test.js.map +1 -0
  7. package/dist/__tests__/e2e-wizard-flow.test.d.ts +43 -0
  8. package/dist/__tests__/e2e-wizard-flow.test.d.ts.map +1 -0
  9. package/dist/__tests__/e2e-wizard-flow.test.js +407 -0
  10. package/dist/__tests__/e2e-wizard-flow.test.js.map +1 -0
  11. package/dist/__tests__/ide-handlers.test.d.ts +10 -0
  12. package/dist/__tests__/ide-handlers.test.d.ts.map +1 -0
  13. package/dist/__tests__/ide-handlers.test.js +336 -0
  14. package/dist/__tests__/ide-handlers.test.js.map +1 -0
  15. package/dist/__tests__/install-command.test.d.ts +10 -0
  16. package/dist/__tests__/install-command.test.d.ts.map +1 -0
  17. package/dist/__tests__/install-command.test.js +237 -0
  18. package/dist/__tests__/install-command.test.js.map +1 -0
  19. package/dist/config.d.ts +51 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +117 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/detect.d.ts +42 -0
  24. package/dist/detect.d.ts.map +1 -0
  25. package/dist/detect.js +277 -0
  26. package/dist/detect.js.map +1 -0
  27. package/dist/diagnose.d.ts +36 -0
  28. package/dist/diagnose.d.ts.map +1 -0
  29. package/dist/diagnose.js +512 -0
  30. package/dist/diagnose.js.map +1 -0
  31. package/dist/ide-handlers/base.d.ts +36 -0
  32. package/dist/ide-handlers/base.d.ts.map +1 -0
  33. package/dist/ide-handlers/base.js +41 -0
  34. package/dist/ide-handlers/base.js.map +1 -0
  35. package/dist/ide-handlers/claude-code.d.ts +15 -0
  36. package/dist/ide-handlers/claude-code.d.ts.map +1 -0
  37. package/dist/ide-handlers/claude-code.js +50 -0
  38. package/dist/ide-handlers/claude-code.js.map +1 -0
  39. package/dist/ide-handlers/cursor.d.ts +15 -0
  40. package/dist/ide-handlers/cursor.d.ts.map +1 -0
  41. package/dist/ide-handlers/cursor.js +61 -0
  42. package/dist/ide-handlers/cursor.js.map +1 -0
  43. package/dist/ide-handlers/desktop.d.ts +16 -0
  44. package/dist/ide-handlers/desktop.d.ts.map +1 -0
  45. package/dist/ide-handlers/desktop.js +26 -0
  46. package/dist/ide-handlers/desktop.js.map +1 -0
  47. package/dist/ide-handlers/index.d.ts +21 -0
  48. package/dist/ide-handlers/index.d.ts.map +1 -0
  49. package/dist/ide-handlers/index.js +49 -0
  50. package/dist/ide-handlers/index.js.map +1 -0
  51. package/dist/ide-handlers/manual.d.ts +16 -0
  52. package/dist/ide-handlers/manual.d.ts.map +1 -0
  53. package/dist/ide-handlers/manual.js +34 -0
  54. package/dist/ide-handlers/manual.js.map +1 -0
  55. package/dist/ide-handlers/opencode.d.ts +15 -0
  56. package/dist/ide-handlers/opencode.d.ts.map +1 -0
  57. package/dist/ide-handlers/opencode.js +57 -0
  58. package/dist/ide-handlers/opencode.js.map +1 -0
  59. package/dist/ide-handlers/vscode.d.ts +16 -0
  60. package/dist/ide-handlers/vscode.d.ts.map +1 -0
  61. package/dist/ide-handlers/vscode.js +62 -0
  62. package/dist/ide-handlers/vscode.js.map +1 -0
  63. package/dist/index.d.ts +14 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +501 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/prompts.d.ts +23 -0
  68. package/dist/prompts.d.ts.map +1 -0
  69. package/dist/prompts.js +68 -0
  70. package/dist/prompts.js.map +1 -0
  71. package/dist/repair.d.ts +50 -0
  72. package/dist/repair.d.ts.map +1 -0
  73. package/dist/repair.js +588 -0
  74. package/dist/repair.js.map +1 -0
  75. package/package.json +54 -0
@@ -0,0 +1,512 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Diagnostic Module
4
+ *
5
+ * Performs diagnostic checks for common MCP configuration issues.
6
+ * Detects port conflicts, missing config, auth errors, and connectivity problems.
7
+ */
8
+ import { existsSync, readFileSync, statSync } from 'node:fs';
9
+ import { createServer } from 'node:net';
10
+ import chalk from 'chalk';
11
+ import { getClaudeConfigPath, isClaudeInstalled, isTostudyMcpConfigured, getTostudyMcpConfig, readClaudeConfig, } from './config.js';
12
+ import { getInstalledIDEs } from './detect.js';
13
+ const DEFAULT_MCP_PORT = 3701;
14
+ function println(message = '') {
15
+ process.stdout.write(`${message}\n`);
16
+ }
17
+ /**
18
+ * Check if a port is available
19
+ */
20
+ async function isPortAvailable(port) {
21
+ return new Promise((resolve) => {
22
+ const server = createServer();
23
+ server.once('error', () => {
24
+ resolve(false);
25
+ });
26
+ server.once('listening', () => {
27
+ server.close();
28
+ resolve(true);
29
+ });
30
+ server.listen(port, '127.0.0.1');
31
+ });
32
+ }
33
+ /**
34
+ * Check if Claude Code is installed
35
+ */
36
+ function checkClaudeInstallation() {
37
+ if (!isClaudeInstalled()) {
38
+ return {
39
+ id: 'claude-not-installed',
40
+ severity: 'critical',
41
+ title: 'Claude Code nao encontrado',
42
+ description: 'O diretorio de configuracao do Claude Code nao foi encontrado no sistema.',
43
+ suggestion: 'Instale o Claude Code em https://claude.ai/download',
44
+ autoFixable: false,
45
+ };
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * Check if config file exists and is readable
51
+ */
52
+ function checkConfigFile() {
53
+ const configPath = getClaudeConfigPath();
54
+ if (!existsSync(configPath)) {
55
+ return {
56
+ id: 'config-missing',
57
+ severity: 'warning',
58
+ title: 'Arquivo de configuracao nao existe',
59
+ description: `O arquivo ${configPath} nao foi encontrado. Sera criado durante o setup.`,
60
+ suggestion: 'Execute o comando de setup para criar a configuracao.',
61
+ autoFixable: true,
62
+ };
63
+ }
64
+ // Check if file is readable
65
+ try {
66
+ const stats = statSync(configPath);
67
+ if (!stats.isFile()) {
68
+ return {
69
+ id: 'config-not-file',
70
+ severity: 'critical',
71
+ title: 'Configuracao nao e um arquivo',
72
+ description: `${configPath} existe mas nao e um arquivo valido.`,
73
+ suggestion: 'Remova o item e execute o setup novamente.',
74
+ autoFixable: false,
75
+ };
76
+ }
77
+ }
78
+ catch {
79
+ return {
80
+ id: 'config-unreadable',
81
+ severity: 'critical',
82
+ title: 'Arquivo de configuracao inacessivel',
83
+ description: `Nao foi possivel acessar ${configPath}. Verifique as permissoes.`,
84
+ suggestion: 'Verifique as permissoes do arquivo ou recrie-o.',
85
+ autoFixable: false,
86
+ };
87
+ }
88
+ return null;
89
+ }
90
+ /**
91
+ * Check if config JSON is valid
92
+ */
93
+ function checkConfigJson() {
94
+ const configPath = getClaudeConfigPath();
95
+ if (!existsSync(configPath)) {
96
+ return null; // Already handled by checkConfigFile
97
+ }
98
+ try {
99
+ const content = readFileSync(configPath, 'utf-8');
100
+ JSON.parse(content);
101
+ }
102
+ catch {
103
+ return {
104
+ id: 'config-invalid-json',
105
+ severity: 'critical',
106
+ title: 'JSON de configuracao invalido',
107
+ description: 'O arquivo de configuracao contem JSON invalido.',
108
+ suggestion: 'Execute "mcp-setup repair" para corrigir ou remova o arquivo e execute o setup novamente.',
109
+ autoFixable: true,
110
+ };
111
+ }
112
+ return null;
113
+ }
114
+ /**
115
+ * Check if Catalyst MCP is configured
116
+ */
117
+ function checkMcpConfiguration() {
118
+ if (!isTostudyMcpConfigured()) {
119
+ return {
120
+ id: 'mcp-not-configured',
121
+ severity: 'warning',
122
+ title: 'Catalyst MCP nao configurado',
123
+ description: 'O servidor MCP da Catalyst nao esta configurado no Claude Code.',
124
+ suggestion: 'Execute o comando de setup para configurar o MCP.',
125
+ autoFixable: true,
126
+ };
127
+ }
128
+ return null;
129
+ }
130
+ /**
131
+ * Check API key format
132
+ */
133
+ function checkApiKeyFormat() {
134
+ const mcpConfig = getTostudyMcpConfig();
135
+ if (!mcpConfig) {
136
+ return null; // Already handled by checkMcpConfiguration
137
+ }
138
+ // Check for Authorization header
139
+ const authHeader = mcpConfig.headers?.['Authorization'];
140
+ if (!authHeader) {
141
+ return {
142
+ id: 'api-key-missing',
143
+ severity: 'critical',
144
+ title: 'API key nao configurada',
145
+ description: 'A configuracao do MCP nao possui um header de Authorization.',
146
+ suggestion: 'Execute o setup novamente com uma API key valida.',
147
+ autoFixable: true,
148
+ };
149
+ }
150
+ // Check Bearer token format
151
+ if (!authHeader.startsWith('Bearer ')) {
152
+ return {
153
+ id: 'api-key-invalid-format',
154
+ severity: 'critical',
155
+ title: 'Formato de API key invalido',
156
+ description: 'O header de Authorization deve iniciar com "Bearer ".',
157
+ suggestion: 'Execute o setup novamente com uma API key valida.',
158
+ autoFixable: true,
159
+ };
160
+ }
161
+ // Check API key length
162
+ const apiKey = authHeader.replace('Bearer ', '');
163
+ if (apiKey.length < 32) {
164
+ return {
165
+ id: 'api-key-too-short',
166
+ severity: 'warning',
167
+ title: 'API key parece ser muito curta',
168
+ description: `A API key tem apenas ${apiKey.length} caracteres. API keys validas geralmente tem 32+ caracteres.`,
169
+ suggestion: 'Verifique se copiou a API key completa de /student/settings/mcp.',
170
+ autoFixable: true,
171
+ };
172
+ }
173
+ return null;
174
+ }
175
+ /**
176
+ * Check MCP server URL format
177
+ */
178
+ function checkServerUrl() {
179
+ const mcpConfig = getTostudyMcpConfig();
180
+ if (!mcpConfig) {
181
+ return null;
182
+ }
183
+ const url = mcpConfig.url;
184
+ if (!url) {
185
+ return {
186
+ id: 'server-url-missing',
187
+ severity: 'critical',
188
+ title: 'URL do servidor MCP nao configurada',
189
+ description: 'A configuracao do MCP nao possui uma URL de servidor.',
190
+ suggestion: 'Execute o setup novamente para configurar a URL correta.',
191
+ autoFixable: true,
192
+ };
193
+ }
194
+ // Check URL format
195
+ try {
196
+ const parsedUrl = new URL(url);
197
+ if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
198
+ return {
199
+ id: 'server-url-invalid-protocol',
200
+ severity: 'critical',
201
+ title: 'Protocolo de URL invalido',
202
+ description: `O protocolo "${parsedUrl.protocol}" nao e suportado. Use http: ou https:.`,
203
+ suggestion: 'Execute o setup novamente com a URL correta.',
204
+ autoFixable: true,
205
+ };
206
+ }
207
+ // Check if URL ends with /mcp/sse
208
+ if (!parsedUrl.pathname.endsWith('/mcp/sse')) {
209
+ return {
210
+ id: 'server-url-missing-sse-path',
211
+ severity: 'warning',
212
+ title: 'URL do servidor pode estar incorreta',
213
+ description: `A URL ${url} nao termina com /mcp/sse como esperado.`,
214
+ suggestion: 'Verifique se a URL esta correta ou execute o setup novamente.',
215
+ autoFixable: true,
216
+ };
217
+ }
218
+ }
219
+ catch {
220
+ return {
221
+ id: 'server-url-invalid',
222
+ severity: 'critical',
223
+ title: 'URL do servidor invalida',
224
+ description: `A URL "${url}" nao e uma URL valida.`,
225
+ suggestion: 'Execute o setup novamente com uma URL valida.',
226
+ autoFixable: true,
227
+ };
228
+ }
229
+ return null;
230
+ }
231
+ /**
232
+ * Check for port conflicts
233
+ */
234
+ async function checkPortConflict() {
235
+ const isAvailable = await isPortAvailable(DEFAULT_MCP_PORT);
236
+ if (!isAvailable) {
237
+ return {
238
+ id: 'port-conflict',
239
+ severity: 'warning',
240
+ title: `Porta ${DEFAULT_MCP_PORT} em uso`,
241
+ description: `A porta padrao do MCP server (${DEFAULT_MCP_PORT}) esta sendo usada por outro processo.`,
242
+ suggestion: 'Verifique qual processo esta usando a porta ou use uma porta alternativa.',
243
+ autoFixable: false,
244
+ };
245
+ }
246
+ return null;
247
+ }
248
+ /**
249
+ * Check MCP server connectivity
250
+ */
251
+ async function checkServerConnectivity() {
252
+ const mcpConfig = getTostudyMcpConfig();
253
+ if (!mcpConfig?.url) {
254
+ return null;
255
+ }
256
+ // Extract base URL (remove /sse path)
257
+ const baseUrl = mcpConfig.url.replace('/mcp/sse', '');
258
+ try {
259
+ const controller = new AbortController();
260
+ const timeout = setTimeout(() => controller.abort(), 5000);
261
+ const response = await fetch(`${baseUrl}/api/mcp/heartbeat`, {
262
+ method: 'POST',
263
+ headers: {
264
+ 'Authorization': mcpConfig.headers?.['Authorization'] || '',
265
+ 'Content-Type': 'application/json',
266
+ },
267
+ body: JSON.stringify({ timestamp: new Date().toISOString() }),
268
+ signal: controller.signal,
269
+ });
270
+ clearTimeout(timeout);
271
+ if (response.status === 401 || response.status === 403) {
272
+ return {
273
+ id: 'auth-failed',
274
+ severity: 'critical',
275
+ title: 'Falha de autenticacao',
276
+ description: 'O servidor MCP rejeitou a API key. Ela pode estar expirada ou invalida.',
277
+ suggestion: 'Gere uma nova API key em /student/settings/mcp e execute o setup novamente.',
278
+ autoFixable: true,
279
+ };
280
+ }
281
+ if (!response.ok && response.status !== 204) {
282
+ return {
283
+ id: 'server-error',
284
+ severity: 'warning',
285
+ title: `Servidor retornou erro ${response.status}`,
286
+ description: `O servidor MCP retornou um status de erro: ${response.status}.`,
287
+ suggestion: 'O servidor pode estar temporariamente indisponivel. Tente novamente mais tarde.',
288
+ autoFixable: false,
289
+ };
290
+ }
291
+ }
292
+ catch (error) {
293
+ if (error instanceof Error && error.name === 'AbortError') {
294
+ return {
295
+ id: 'server-timeout',
296
+ severity: 'warning',
297
+ title: 'Timeout de conexao',
298
+ description: 'O servidor MCP nao respondeu em 5 segundos.',
299
+ suggestion: 'Verifique sua conexao de internet ou se o servidor esta online.',
300
+ autoFixable: false,
301
+ };
302
+ }
303
+ return {
304
+ id: 'server-unreachable',
305
+ severity: 'warning',
306
+ title: 'Servidor MCP inacessivel',
307
+ description: 'Nao foi possivel conectar ao servidor MCP.',
308
+ suggestion: 'Verifique sua conexao de internet ou se a URL do servidor esta correta.',
309
+ autoFixable: false,
310
+ };
311
+ }
312
+ return null;
313
+ }
314
+ /**
315
+ * Check if any IDE is detected
316
+ */
317
+ function checkIDEInstallation() {
318
+ const installedIDEs = getInstalledIDEs();
319
+ if (installedIDEs.length === 0) {
320
+ return {
321
+ id: 'no-ide-detected',
322
+ severity: 'info',
323
+ title: 'Nenhuma IDE suportada detectada',
324
+ description: 'Nao foi encontrada nenhuma IDE compativel (VS Code, Cursor, JetBrains).',
325
+ suggestion: 'Instale uma IDE suportada para usar a integracao completa.',
326
+ autoFixable: false,
327
+ };
328
+ }
329
+ return null;
330
+ }
331
+ /**
332
+ * Check for duplicate MCP server entries
333
+ */
334
+ function checkDuplicateServers() {
335
+ const config = readClaudeConfig();
336
+ if (!config.mcpServers) {
337
+ return null;
338
+ }
339
+ // Check for servers with similar URLs
340
+ const servers = Object.entries(config.mcpServers);
341
+ const anaServers = servers.filter(([key, server]) => key.toLowerCase().includes('ana') ||
342
+ key.toLowerCase().includes('catalyst') ||
343
+ (server.url && server.url.includes('tostudy.com')));
344
+ if (anaServers.length > 1) {
345
+ return {
346
+ id: 'duplicate-servers',
347
+ severity: 'warning',
348
+ title: 'Multiplos servidores Catalyst configurados',
349
+ description: `Foram encontrados ${anaServers.length} servidores relacionados a Catalyst: ${anaServers.map(([k]) => k).join(', ')}.`,
350
+ suggestion: 'Execute "mcp-setup repair" para remover duplicatas ou limpe manualmente.',
351
+ autoFixable: true,
352
+ };
353
+ }
354
+ return null;
355
+ }
356
+ /**
357
+ * Run all diagnostic checks
358
+ */
359
+ export async function runDiagnostics() {
360
+ const issues = [];
361
+ // Synchronous checks
362
+ const syncChecks = [
363
+ checkClaudeInstallation(),
364
+ checkConfigFile(),
365
+ checkConfigJson(),
366
+ checkMcpConfiguration(),
367
+ checkApiKeyFormat(),
368
+ checkServerUrl(),
369
+ checkIDEInstallation(),
370
+ checkDuplicateServers(),
371
+ ];
372
+ for (const issue of syncChecks) {
373
+ if (issue) {
374
+ issues.push(issue);
375
+ }
376
+ }
377
+ // Async checks - only run if basic config is valid
378
+ const hasConfigIssues = issues.some((issue) => ['config-invalid-json', 'claude-not-installed'].includes(issue.id));
379
+ if (!hasConfigIssues) {
380
+ const asyncChecks = await Promise.all([
381
+ checkPortConflict(),
382
+ checkServerConnectivity(),
383
+ ]);
384
+ for (const issue of asyncChecks) {
385
+ if (issue) {
386
+ issues.push(issue);
387
+ }
388
+ }
389
+ }
390
+ // Sort by severity (critical > warning > info)
391
+ const severityOrder = {
392
+ critical: 0,
393
+ warning: 1,
394
+ info: 2,
395
+ };
396
+ issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
397
+ const hasCritical = issues.some((issue) => issue.severity === 'critical');
398
+ return {
399
+ timestamp: new Date().toISOString(),
400
+ claudeInstalled: isClaudeInstalled(),
401
+ mcpConfigured: isTostudyMcpConfigured(),
402
+ issues,
403
+ passed: !hasCritical,
404
+ };
405
+ }
406
+ /**
407
+ * Get severity icon
408
+ */
409
+ function getSeverityIcon(severity) {
410
+ switch (severity) {
411
+ case 'critical':
412
+ return chalk.red('●');
413
+ case 'warning':
414
+ return chalk.yellow('●');
415
+ case 'info':
416
+ return chalk.blue('●');
417
+ }
418
+ }
419
+ /**
420
+ * Get severity label
421
+ */
422
+ function getSeverityLabel(severity) {
423
+ switch (severity) {
424
+ case 'critical':
425
+ return chalk.red('CRITICO');
426
+ case 'warning':
427
+ return chalk.yellow('AVISO');
428
+ case 'info':
429
+ return chalk.blue('INFO');
430
+ }
431
+ }
432
+ /**
433
+ * Print diagnostic report to console
434
+ */
435
+ export function printDiagnosticReport(report) {
436
+ println();
437
+ println(chalk.cyan(' ╔═══════════════════════════════════════╗'));
438
+ println(chalk.cyan(' ║') + chalk.white.bold(' Catalyst MCP Diagnostics ') + chalk.cyan('║'));
439
+ println(chalk.cyan(' ╚═══════════════════════════════════════╝'));
440
+ println();
441
+ // Status summary
442
+ println(chalk.gray('Status:'));
443
+ println(` Claude Code: ${report.claudeInstalled ? chalk.green('✓ Instalado') : chalk.red('✗ Nao encontrado')}`);
444
+ println(` MCP Catalyst: ${report.mcpConfigured ? chalk.green('✓ Configurado') : chalk.yellow('○ Nao configurado')}`);
445
+ println();
446
+ if (report.issues.length === 0) {
447
+ println(chalk.green.bold('✓ Nenhum problema encontrado!'));
448
+ println();
449
+ println(chalk.gray('Tudo parece estar funcionando corretamente.'));
450
+ println();
451
+ return;
452
+ }
453
+ // Issues
454
+ const criticalCount = report.issues.filter((i) => i.severity === 'critical').length;
455
+ const warningCount = report.issues.filter((i) => i.severity === 'warning').length;
456
+ const infoCount = report.issues.filter((i) => i.severity === 'info').length;
457
+ println(chalk.white.bold('Problemas encontrados:'));
458
+ if (criticalCount > 0)
459
+ println(` ${chalk.red('●')} ${criticalCount} critico(s)`);
460
+ if (warningCount > 0)
461
+ println(` ${chalk.yellow('●')} ${warningCount} aviso(s)`);
462
+ if (infoCount > 0)
463
+ println(` ${chalk.blue('●')} ${infoCount} informativo(s)`);
464
+ println();
465
+ for (const issue of report.issues) {
466
+ println(`${getSeverityIcon(issue.severity)} ${getSeverityLabel(issue.severity)}: ${chalk.white(issue.title)}`);
467
+ println(chalk.gray(` ${issue.description}`));
468
+ println(chalk.cyan(` → ${issue.suggestion}`));
469
+ if (issue.autoFixable) {
470
+ println(chalk.green(` ✓ Corrigivel automaticamente`));
471
+ }
472
+ println();
473
+ }
474
+ // Summary
475
+ if (report.passed) {
476
+ println(chalk.yellow('⚠ Alguns avisos encontrados, mas o sistema deve funcionar.'));
477
+ }
478
+ else {
479
+ println(chalk.red('✗ Problemas criticos precisam ser resolvidos.'));
480
+ println(chalk.gray(' Execute "npx @tostudy-ai/mcp-setup" para corrigir a configuracao.'));
481
+ }
482
+ println();
483
+ }
484
+ /**
485
+ * Export diagnostic report as JSON
486
+ */
487
+ export function exportDiagnosticReportJson(report) {
488
+ return JSON.stringify(report, null, 2);
489
+ }
490
+ // CLI entry point
491
+ if (process.argv[1]?.endsWith('diagnose.js')) {
492
+ (async () => {
493
+ try {
494
+ const report = await runDiagnostics();
495
+ // Check for --json flag
496
+ if (process.argv.includes('--json')) {
497
+ println(exportDiagnosticReportJson(report));
498
+ }
499
+ else {
500
+ printDiagnosticReport(report);
501
+ }
502
+ // Exit with appropriate code
503
+ process.exit(report.passed ? 0 : 1);
504
+ }
505
+ catch (error) {
506
+ process.stderr.write(chalk.red('Erro ao executar diagnostico:\n'));
507
+ process.stderr.write((error instanceof Error ? error.message : String(error)) + '\n');
508
+ process.exit(1);
509
+ }
510
+ })();
511
+ }
512
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * IDE Handler Interface
3
+ *
4
+ * Each IDE has a handler that knows how to write MCP config
5
+ * to the correct location in the correct format.
6
+ */
7
+ export interface IDEHandler {
8
+ /** Handler identifier (matches IDEMethod type) */
9
+ id: string;
10
+ /** Human-readable name */
11
+ name: string;
12
+ /** Check if this IDE is likely installed */
13
+ detect(): Promise<boolean>;
14
+ /** Path where the config file lives */
15
+ getConfigPath(): string;
16
+ /** Write/merge MCP config for this IDE */
17
+ writeConfig(apiKey: string, mcpUrl: string): Promise<void>;
18
+ /** Verify connection via heartbeat */
19
+ verify(apiKey: string, mcpUrl: string): Promise<boolean>;
20
+ }
21
+ /**
22
+ * Build the mcp-remote args array used by most IDE handlers.
23
+ */
24
+ export declare function buildMcpRemoteArgs(apiKey: string, mcpUrl: string): string[];
25
+ /**
26
+ * Build the tostudy MCP server entry for stdio-based configs.
27
+ */
28
+ export declare function buildTostudyServerEntry(apiKey: string, mcpUrl: string): {
29
+ command: string;
30
+ args: string[];
31
+ };
32
+ /**
33
+ * Verify connection by hitting the platform heartbeat endpoint.
34
+ */
35
+ export declare function verifyHeartbeat(apiKey: string, platformUrl: string): Promise<boolean>;
36
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/ide-handlers/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,uCAAuC;IACvC,aAAa,IAAI,MAAM,CAAC;IACxB,0CAA0C;IAC1C,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,sCAAsC;IACtC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;EAKrE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc3F"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * IDE Handler Interface
3
+ *
4
+ * Each IDE has a handler that knows how to write MCP config
5
+ * to the correct location in the correct format.
6
+ */
7
+ /**
8
+ * Build the mcp-remote args array used by most IDE handlers.
9
+ */
10
+ export function buildMcpRemoteArgs(apiKey, mcpUrl) {
11
+ return ['-y', 'mcp-remote', `${mcpUrl}/mcp`, '--header', `Authorization:Bearer ${apiKey}`];
12
+ }
13
+ /**
14
+ * Build the tostudy MCP server entry for stdio-based configs.
15
+ */
16
+ export function buildTostudyServerEntry(apiKey, mcpUrl) {
17
+ return {
18
+ command: 'npx',
19
+ args: buildMcpRemoteArgs(apiKey, mcpUrl),
20
+ };
21
+ }
22
+ /**
23
+ * Verify connection by hitting the platform heartbeat endpoint.
24
+ */
25
+ export async function verifyHeartbeat(apiKey, platformUrl) {
26
+ try {
27
+ const response = await fetch(`${platformUrl}/api/mcp/heartbeat`, {
28
+ method: 'POST',
29
+ headers: {
30
+ 'Authorization': `Bearer ${apiKey}`,
31
+ 'Content-Type': 'application/json',
32
+ },
33
+ body: JSON.stringify({ timestamp: new Date().toISOString() }),
34
+ });
35
+ return response.ok || response.status === 204;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/ide-handlers/base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,EAAE,UAAU,EAAE,wBAAwB,MAAM,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAAc;IACpE,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC;KACzC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,WAAmB;IACvE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,oBAAoB,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Claude Code IDE Handler
3
+ *
4
+ * Uses `claude mcp add` CLI command to register the MCP server.
5
+ */
6
+ import { type IDEHandler } from './base.js';
7
+ export declare class ClaudeCodeHandler implements IDEHandler {
8
+ id: string;
9
+ name: string;
10
+ detect(): Promise<boolean>;
11
+ getConfigPath(): string;
12
+ writeConfig(apiKey: string, mcpUrl: string): Promise<void>;
13
+ verify(apiKey: string, mcpUrl: string): Promise<boolean>;
14
+ }
15
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../src/ide-handlers/claude-code.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAuC,MAAM,WAAW,CAAC;AAEjF,qBAAa,iBAAkB,YAAW,UAAU;IAClD,EAAE,SAAiB;IACnB,IAAI,SAAiB;IAEf,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAchC,aAAa,IAAI,MAAM;IAIjB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG/D"}