@tostudy-ai/mcp-setup 1.3.0 → 1.4.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/README.md +26 -25
- package/dist/index.d.ts +2 -14
- package/dist/index.js +2983 -613
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
- package/dist/__tests__/e2e-diagnostic-repair-flow.test.d.ts +0 -52
- package/dist/__tests__/e2e-diagnostic-repair-flow.test.d.ts.map +0 -1
- package/dist/__tests__/e2e-diagnostic-repair-flow.test.js +0 -720
- package/dist/__tests__/e2e-diagnostic-repair-flow.test.js.map +0 -1
- package/dist/__tests__/e2e-wizard-flow.test.d.ts +0 -43
- package/dist/__tests__/e2e-wizard-flow.test.d.ts.map +0 -1
- package/dist/__tests__/e2e-wizard-flow.test.js +0 -418
- package/dist/__tests__/e2e-wizard-flow.test.js.map +0 -1
- package/dist/__tests__/ide-handlers.test.d.ts +0 -10
- package/dist/__tests__/ide-handlers.test.d.ts.map +0 -1
- package/dist/__tests__/ide-handlers.test.js +0 -358
- package/dist/__tests__/ide-handlers.test.js.map +0 -1
- package/dist/__tests__/install-command.test.d.ts +0 -10
- package/dist/__tests__/install-command.test.d.ts.map +0 -1
- package/dist/__tests__/install-command.test.js +0 -248
- package/dist/__tests__/install-command.test.js.map +0 -1
- package/dist/callback-page.d.ts +0 -6
- package/dist/callback-page.d.ts.map +0 -1
- package/dist/callback-page.js +0 -96
- package/dist/callback-page.js.map +0 -1
- package/dist/config.d.ts +0 -62
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -167
- package/dist/config.js.map +0 -1
- package/dist/detect.d.ts +0 -42
- package/dist/detect.d.ts.map +0 -1
- package/dist/detect.js +0 -277
- package/dist/detect.js.map +0 -1
- package/dist/diagnose.d.ts +0 -36
- package/dist/diagnose.d.ts.map +0 -1
- package/dist/diagnose.js +0 -502
- package/dist/diagnose.js.map +0 -1
- package/dist/ide-handlers/antigravity.d.ts +0 -16
- package/dist/ide-handlers/antigravity.d.ts.map +0 -1
- package/dist/ide-handlers/antigravity.js +0 -46
- package/dist/ide-handlers/antigravity.js.map +0 -1
- package/dist/ide-handlers/base.d.ts +0 -36
- package/dist/ide-handlers/base.d.ts.map +0 -1
- package/dist/ide-handlers/base.js +0 -66
- package/dist/ide-handlers/base.js.map +0 -1
- package/dist/ide-handlers/claude-code.d.ts +0 -15
- package/dist/ide-handlers/claude-code.d.ts.map +0 -1
- package/dist/ide-handlers/claude-code.js +0 -50
- package/dist/ide-handlers/claude-code.js.map +0 -1
- package/dist/ide-handlers/codex.d.ts +0 -15
- package/dist/ide-handlers/codex.d.ts.map +0 -1
- package/dist/ide-handlers/codex.js +0 -53
- package/dist/ide-handlers/codex.js.map +0 -1
- package/dist/ide-handlers/cursor.d.ts +0 -15
- package/dist/ide-handlers/cursor.d.ts.map +0 -1
- package/dist/ide-handlers/cursor.js +0 -61
- package/dist/ide-handlers/cursor.js.map +0 -1
- package/dist/ide-handlers/desktop.d.ts +0 -16
- package/dist/ide-handlers/desktop.d.ts.map +0 -1
- package/dist/ide-handlers/desktop.js +0 -50
- package/dist/ide-handlers/desktop.js.map +0 -1
- package/dist/ide-handlers/index.d.ts +0 -21
- package/dist/ide-handlers/index.d.ts.map +0 -1
- package/dist/ide-handlers/index.js +0 -55
- package/dist/ide-handlers/index.js.map +0 -1
- package/dist/ide-handlers/manual.d.ts +0 -16
- package/dist/ide-handlers/manual.d.ts.map +0 -1
- package/dist/ide-handlers/manual.js +0 -34
- package/dist/ide-handlers/manual.js.map +0 -1
- package/dist/ide-handlers/opencode.d.ts +0 -15
- package/dist/ide-handlers/opencode.d.ts.map +0 -1
- package/dist/ide-handlers/opencode.js +0 -57
- package/dist/ide-handlers/opencode.js.map +0 -1
- package/dist/ide-handlers/vscode.d.ts +0 -16
- package/dist/ide-handlers/vscode.d.ts.map +0 -1
- package/dist/ide-handlers/vscode.js +0 -62
- package/dist/ide-handlers/vscode.js.map +0 -1
- package/dist/ide-handlers/windsurf.d.ts +0 -16
- package/dist/ide-handlers/windsurf.d.ts.map +0 -1
- package/dist/ide-handlers/windsurf.js +0 -46
- package/dist/ide-handlers/windsurf.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/oauth-server.d.ts +0 -4
- package/dist/oauth-server.d.ts.map +0 -1
- package/dist/oauth-server.js +0 -49
- package/dist/oauth-server.js.map +0 -1
- package/dist/prompts.d.ts +0 -23
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js +0 -68
- package/dist/prompts.js.map +0 -1
- package/dist/repair.d.ts +0 -50
- package/dist/repair.d.ts.map +0 -1
- package/dist/repair.js +0 -633
- package/dist/repair.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/prompts.ts","../src/detect.ts","../src/diagnose.ts","../src/repair.ts","../src/ide-handlers/claude-code.ts","../src/ide-handlers/base.ts","../src/ide-handlers/cursor.ts","../src/ide-handlers/vscode.ts","../src/ide-handlers/desktop.ts","../src/ide-handlers/windsurf.ts","../src/ide-handlers/opencode.ts","../src/ide-handlers/codex.ts","../src/ide-handlers/antigravity.ts","../src/ide-handlers/manual.ts","../src/ide-handlers/index.ts","../src/messages.ts","../src/oauth-server.ts","../src/callback-page.ts","../src/commands/init.ts","../../mcp-cli-core/src/detect-ide.ts","../../mcp-cli-core/src/detect-node.ts","../../mcp-cli-core/src/detect-workspace.ts","../../mcp-cli-core/src/generate-instructions.ts","../../mcp-cli-core/src/render-for-ide.ts","../src/commands/shared.ts","../src/commands/sync.ts"],"sourcesContent":["/**\n * ToStudy MCP Setup CLI\n *\n * Configures Claude Code to connect to the ToStudy MCP server.\n *\n * Usage:\n * npx @tostudy-ai/mcp-setup\n * npx @tostudy-ai/mcp-setup wizard\n * npx @tostudy-ai/mcp-setup --api-key <key>\n * npx @tostudy-ai/mcp-setup --uninstall\n */\n\nimport { program } from \"commander\";\nimport chalk from \"chalk\";\nimport { execFile } from \"node:child_process\";\nimport {\n getClaudeConfigPath,\n isClaudeInstalled,\n addTostudyMcpServer,\n removeTostudyMcpServer,\n isTostudyMcpConfigured,\n} from \"./config.js\";\nimport { promptApiKey, confirm, prompt } from \"./prompts.js\";\nimport { getInstalledIDEs, type DetectedIDE } from \"./detect.js\";\nimport { runDiagnostics, printDiagnosticReport } from \"./diagnose.js\";\nimport { repairAllIssues, printRepairReport } from \"./repair.js\";\nimport { getIDEHandler, type SupportedIDE, detectInstalledIDEs } from \"./ide-handlers/index.js\";\nimport {\n buildClaudeCodeAddArgs,\n buildClaudeCodeRemoveArgs,\n promptClaudeCodeScope,\n} from \"./ide-handlers/claude-code.js\";\nimport {\n API_KEY_DEPRECATION_WARNING,\n ASSISTANT_COURSES_PROMPT,\n COURSES_TOOL_HINT,\n NEXT_STEPS_TITLE,\n} from \"./messages.js\";\nimport { startCallbackServer } from \"./oauth-server.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { runSync } from \"./commands/sync.js\";\n\nconst VERSION = \"1.3.0\";\nconst DEFAULT_PLATFORM_URL = \"https://tostudy.ai\";\nconst OAUTH_PORT = 9877;\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\nfunction eprintln(message = \"\"): void {\n process.stderr.write(`${message}\\n`);\n}\n\n/**\n * Print styled banner\n */\nfunction printBanner(): void {\n println();\n println(chalk.cyan(\" ╔═══════════════════════════════════════╗\"));\n println(\n chalk.cyan(\" ║\") + chalk.white.bold(\" ToStudy MCP Setup \") + chalk.cyan(\"║\")\n );\n println(chalk.cyan(\" ╚═══════════════════════════════════════╝\"));\n println();\n}\n\n/**\n * Validate API key with the platform\n */\nasync function validateApiKey(apiKey: string, platformUrl: string): Promise<boolean> {\n try {\n const response = await fetch(`${platformUrl}/api/mcp/heartbeat`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ timestamp: new Date().toISOString() }),\n });\n\n return response.ok || response.status === 204;\n } catch {\n // Network error - can't validate, but allow anyway for offline setup\n println(chalk.yellow(\"! Não foi possível validar a API key (servidor offline?)\"));\n println(chalk.yellow(\" A configuração será salva mesmo assim.\"));\n return true;\n }\n}\n\n/**\n * Exchange an OAuth authorization code for a JWT token.\n */\nasync function exchangeCodeForToken(\n code: string,\n platformUrl: string,\n client: \"cli\" | \"mcp\" = \"mcp\"\n): Promise<{ token: string; userId: string; userName: string; expiresAt: string }> {\n const res = await fetch(`${platformUrl}/api/cli/auth/exchange`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ code, client }),\n });\n\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error ?? `Falha na autenticação (${res.status})`);\n }\n\n return res.json() as Promise<{\n token: string;\n userId: string;\n userName: string;\n expiresAt: string;\n }>;\n}\n\n/**\n * Detect IDEs, let user choose which to configure, then write config.\n */\nasync function configureIDEs(token: string, platformUrl: string): Promise<number> {\n const mcpUrl = resolveMcpServerUrl(platformUrl);\n\n // Exclude \"manual\" from auto-detection (it prints JWT to screen)\n const allDetected = await detectInstalledIDEs();\n const installedIDEs = allDetected.filter((h) => h.id !== \"manual\");\n\n if (installedIDEs.length === 0) {\n println(chalk.yellow(\" Nenhuma IDE suportada detectada.\"));\n println(chalk.gray(\" Use: npx @tostudy-ai/mcp-setup install --ide <nome> --key <token>\"));\n return 0;\n }\n\n // Show detected IDEs and let user choose\n println(chalk.white(\" IDEs detectadas:\\n\"));\n for (let i = 0; i < installedIDEs.length; i++) {\n println(` ${chalk.cyan(String(i + 1))}. ${installedIDEs[i].name}`);\n }\n println(` ${chalk.cyan(\"a\")}. Todas`);\n println();\n\n const answer = await prompt(\n \" Quais configurar? (números separados por vírgula, ou 'a' para todas) \"\n );\n const trimmed = answer.trim().toLowerCase();\n\n let selectedIDEs: typeof installedIDEs;\n if (!trimmed || trimmed === \"a\" || trimmed === \"all\") {\n selectedIDEs = installedIDEs;\n } else {\n const indices = trimmed\n .split(/[,\\s]+/)\n .map((s) => parseInt(s, 10) - 1)\n .filter((i) => i >= 0 && i < installedIDEs.length);\n if (indices.length === 0) {\n println(chalk.yellow(\" Nenhuma IDE selecionada.\"));\n return 0;\n }\n selectedIDEs = indices.map((i) => installedIDEs[i]);\n }\n\n println();\n\n // For Claude Code, ask global vs local\n const claudeCodeHandler = selectedIDEs.find((h) => h.id === \"claude-code\");\n let claudeCodeScope: \"user\" | \"project\" = \"user\";\n if (claudeCodeHandler) {\n claudeCodeScope = await promptClaudeCodeScope();\n println();\n }\n\n let configured = 0;\n for (const handler of selectedIDEs) {\n process.stdout.write(` ${chalk.gray(\"Configurando\")} ${handler.name}... `);\n try {\n if (handler.id === \"claude-code\") {\n await writeClaudeCodeConfig(handler, token, mcpUrl, claudeCodeScope);\n } else {\n await handler.writeConfig(token, mcpUrl);\n }\n println(chalk.green(\"OK\"));\n configured++;\n } catch (error) {\n println(chalk.red(\"FALHOU\"));\n eprintln(chalk.gray(` ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n\n return configured;\n}\n\n/**\n * Write Claude Code config with explicit scope (global or project-local).\n */\nasync function writeClaudeCodeConfig(\n _handler: Awaited<ReturnType<typeof detectInstalledIDEs>>[number],\n token: string,\n mcpUrl: string,\n scope: \"user\" | \"project\"\n): Promise<void> {\n const { execFileSync } = await import(\"node:child_process\");\n const addArgs = buildClaudeCodeAddArgs(token, mcpUrl, scope);\n const removeArgs = buildClaudeCodeRemoveArgs(scope);\n\n try {\n execFileSync(\"claude\", removeArgs, { stdio: \"ignore\" });\n } catch {\n /* may not exist */\n }\n\n execFileSync(\"claude\", addArgs, { stdio: \"inherit\" });\n}\n\n/**\n * Print success banner after IDE configuration.\n */\nfunction printSuccessBanner(configuredCount: number): void {\n println();\n if (configuredCount > 0) {\n println(chalk.green(\" ╔═══════════════════════════════════════════════╗\"));\n println(\n chalk.green(\" ║\") +\n chalk.white.bold(\n ` ${configuredCount} IDE${configuredCount > 1 ? \"s\" : \"\"} configurada${configuredCount > 1 ? \"s\" : \"\"} com sucesso!`.padEnd(\n 42\n )\n ) +\n chalk.green(\"║\")\n );\n println(chalk.green(\" ╚═══════════════════════════════════════════════╝\"));\n } else {\n println(chalk.yellow(\" Nenhuma IDE foi configurada.\"));\n println(chalk.gray(\" Use: npx @tostudy-ai/mcp-setup install --ide <nome> --key <token>\"));\n }\n println();\n println(chalk.white(NEXT_STEPS_TITLE));\n println(chalk.gray(\" 1.\") + \" Reinicie as IDEs configuradas\");\n println(chalk.gray(\" 2.\") + ASSISTANT_COURSES_PROMPT.trimStart());\n println();\n println(chalk.gray(\" ─────────────────────────────────────────\"));\n println();\n println(chalk.white(\" Prefere estudar pelo terminal?\"));\n println(chalk.gray(\" \") + chalk.cyan(\"npm install -g @tostudy-ai/cli\"));\n println(\n chalk.gray(\" \") +\n chalk.cyan(\"tostudy login\") +\n chalk.gray(\" → \") +\n chalk.cyan(\"tostudy courses\")\n );\n println();\n}\n\n/**\n * Main setup flow\n */\nasync function setup(apiKey?: string, platformUrl?: string): Promise<void> {\n printBanner();\n\n const url = platformUrl || process.env.TOSTUDY_PLATFORM_URL || DEFAULT_PLATFORM_URL;\n\n // API key fallback: skip OAuth, use key directly\n if (apiKey || process.env.TOSTUDY_API_KEY) {\n const key = apiKey || process.env.TOSTUDY_API_KEY!;\n println(chalk.yellow(` ${API_KEY_DEPRECATION_WARNING}`));\n println();\n println(chalk.gray(\" Usando API key fornecida...\"));\n\n process.stdout.write(chalk.gray(\" Validando... \"));\n const valid = await validateApiKey(key, url);\n if (!valid) {\n println(chalk.red(\"FALHOU\"));\n println(chalk.red(\" API key inválida ou expirada.\"));\n process.exit(1);\n }\n println(chalk.green(\"OK\"));\n println();\n\n const configured = await configureIDEs(key, url);\n printSuccessBanner(configured);\n return;\n }\n\n // OAuth flow\n println(chalk.gray(\" Abrindo browser para autenticação...\\n\"));\n\n let code: string;\n try {\n const serverPromise = startCallbackServer(OAUTH_PORT);\n\n const authUrl = `${url}/api/cli/auth/authorize?port=${OAUTH_PORT}`;\n const openCmd =\n process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n const openArgs = process.platform === \"win32\" ? [\"\", authUrl] : [authUrl];\n execFile(openCmd, openArgs, (err) => {\n if (err) {\n println(chalk.yellow(\" Não foi possível abrir o browser automaticamente.\"));\n println(chalk.gray(` Abra manualmente: ${authUrl}\\n`));\n }\n });\n\n const result = await serverPromise;\n code = result.code;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n eprintln(chalk.red(` Erro: ${msg}`));\n process.exit(1);\n }\n\n // Exchange code for JWT\n process.stdout.write(chalk.gray(\" Autenticando... \"));\n let token: string;\n let userName: string;\n try {\n const result = await exchangeCodeForToken(code, url, \"mcp\");\n token = result.token;\n userName = result.userName;\n println(chalk.green(\"OK\"));\n println(chalk.green(` Logado como ${userName}\\n`));\n } catch (err) {\n println(chalk.red(\"FALHOU\"));\n eprintln(chalk.red(` ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n\n // Configure all detected IDEs\n println(chalk.gray(\" Detectando IDEs...\\n\"));\n const configured = await configureIDEs(token, url);\n printSuccessBanner(configured);\n}\n\n/**\n * Uninstall flow\n */\nasync function uninstall(): Promise<void> {\n printBanner();\n\n if (!isTostudyMcpConfigured()) {\n println(chalk.yellow(\"ToStudy MCP não está configurado.\"));\n process.exit(0);\n }\n\n const shouldUninstall = await confirm(\"Remover configuração do ToStudy MCP?\", false);\n\n if (!shouldUninstall) {\n println(chalk.gray(\"Operação cancelada.\"));\n process.exit(0);\n }\n\n process.stdout.write(chalk.gray(\"Removendo configuração... \"));\n\n try {\n removeTostudyMcpServer();\n println(chalk.green(\"OK\"));\n println();\n println(chalk.green(\"Configuração removida com sucesso.\"));\n println(chalk.gray(\"Reinicie o Claude Code para aplicar as mudanças.\"));\n println();\n } catch (error) {\n println(chalk.red(\"FALHOU\"));\n eprintln(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Print wizard step header\n */\nfunction printStep(step: number, total: number, title: string): void {\n println();\n println(chalk.cyan(`━━━ Passo ${step}/${total}: ${title} ━━━`));\n println();\n}\n\n/**\n * Print IDE detection results\n */\nfunction printIDEDetection(installedIDEs: DetectedIDE[]): void {\n if (installedIDEs.length === 0) {\n println(chalk.yellow(\" Nenhuma IDE suportada detectada.\"));\n println(chalk.gray(\" O setup continuará para Claude Code.\"));\n } else {\n println(chalk.green(\" IDEs detectadas:\"));\n for (const ide of installedIDEs) {\n const version = ide.version ? chalk.gray(` (${ide.version})`) : \"\";\n println(` ${chalk.green(\"✓\")} ${ide.name}${version}`);\n }\n }\n}\n\n/**\n * Interactive wizard flow\n * Guides user through complete MCP setup with step-by-step instructions\n */\nasync function wizard(options: {\n apiKey?: string;\n url?: string;\n skipDiagnostics?: boolean;\n autoRepair?: boolean;\n}): Promise<void> {\n const TOTAL_STEPS = 4;\n\n // Print wizard banner\n println();\n println(chalk.cyan(\" ╔═══════════════════════════════════════════════╗\"));\n println(\n chalk.cyan(\" ║\") +\n chalk.white.bold(\" ToStudy MCP Setup Wizard \") +\n chalk.cyan(\"║\")\n );\n println(\n chalk.cyan(\" ║\") + chalk.gray(\" Configuração guiada passo a passo \") + chalk.cyan(\"║\")\n );\n println(chalk.cyan(\" ╚═══════════════════════════════════════════════╝\"));\n println();\n println(chalk.gray(\" Este assistente vai configurar o Claude Code para\"));\n println(chalk.gray(\" conectar ao servidor MCP da plataforma ToStudy.\"));\n println();\n\n // ━━━ Step 1: Environment Detection ━━━\n printStep(1, TOTAL_STEPS, \"Detectando ambiente\");\n\n // Check Claude Code\n process.stdout.write(\" Verificando Claude Code... \");\n if (!isClaudeInstalled()) {\n println(chalk.red(\"NÃO ENCONTRADO\"));\n println();\n println(chalk.red(\" Claude Code não está instalado.\"));\n println();\n println(\" Por favor, instale primeiro:\");\n println(chalk.cyan(\" https://claude.ai/download\"));\n println();\n process.exit(1);\n }\n println(chalk.green(\"OK\"));\n\n const configPath = getClaudeConfigPath();\n println(chalk.gray(` Config: ${configPath}`));\n\n // Check for other IDEs\n process.stdout.write(\" Detectando IDEs... \");\n const installedIDEs = getInstalledIDEs();\n println(chalk.green(\"OK\"));\n printIDEDetection(installedIDEs);\n\n // Check existing configuration\n process.stdout.write(\" Verificando configuração atual... \");\n const alreadyConfigured = isTostudyMcpConfigured();\n if (alreadyConfigured) {\n println(chalk.yellow(\"JÁ CONFIGURADO\"));\n println();\n const overwrite = await confirm(\" Deseja reconfigurar?\", false);\n if (!overwrite) {\n println();\n println(chalk.gray(\" Operação cancelada.\"));\n process.exit(0);\n }\n } else {\n println(chalk.gray(\"Não configurado\"));\n }\n\n // ━━━ Step 2: API Key Configuration ━━━\n printStep(2, TOTAL_STEPS, \"Configurando API Key\");\n\n println(chalk.gray(\" A API key conecta o Claude Code a sua conta na plataforma.\"));\n println();\n\n let apiKey = options.apiKey || process.env.TOSTUDY_API_KEY;\n\n if (!apiKey) {\n println(\" Acesse sua API key em:\");\n println(chalk.cyan(` ${options.url || DEFAULT_PLATFORM_URL}/student/settings/mcp`));\n println();\n apiKey = await promptApiKey();\n } else {\n println(chalk.yellow(` ${API_KEY_DEPRECATION_WARNING}`));\n println();\n println(chalk.green(\" ✓ API key fornecida via parâmetro ou ambiente\"));\n }\n\n const platformUrl = options.url || process.env.TOSTUDY_PLATFORM_URL || DEFAULT_PLATFORM_URL;\n\n // Validate API key\n println();\n process.stdout.write(chalk.gray(\" Validando API key... \"));\n const valid = await validateApiKey(apiKey, platformUrl);\n\n if (!valid) {\n println(chalk.red(\"FALHOU\"));\n println();\n println(chalk.red(\" API key inválida ou expirada.\"));\n println();\n println(\" Para gerar uma nova API key:\");\n println(chalk.cyan(` ${platformUrl}/student/settings/mcp`));\n println();\n process.exit(1);\n }\n println(chalk.green(\"OK\"));\n\n // ━━━ Step 3: Save Configuration ━━━\n printStep(3, TOTAL_STEPS, \"Salvando configuração\");\n\n process.stdout.write(\" Configurando Claude Code... \");\n\n try {\n addTostudyMcpServer(apiKey, platformUrl);\n println(chalk.green(\"OK\"));\n } catch (error) {\n println(chalk.red(\"FALHOU\"));\n eprintln();\n eprintln(chalk.red(\" Erro ao salvar configuração:\"));\n eprintln(\" \" + (error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n\n // ━━━ Step 4: Diagnostics & Verification ━━━\n printStep(4, TOTAL_STEPS, \"Verificação final\");\n\n if (!options.skipDiagnostics) {\n process.stdout.write(\" Executando diagnóstico... \");\n const report = await runDiagnostics();\n println(chalk.green(\"OK\"));\n println();\n\n // Filter out expected issues that we just fixed\n const remainingIssues = report.issues.filter(\n (issue) => ![\"mcp-not-configured\", \"config-missing\"].includes(issue.id)\n );\n\n if (remainingIssues.length > 0) {\n println(chalk.yellow(\" Avisos encontrados:\"));\n for (const issue of remainingIssues) {\n const icon =\n issue.severity === \"critical\"\n ? chalk.red(\"●\")\n : issue.severity === \"warning\"\n ? chalk.yellow(\"●\")\n : chalk.blue(\"●\");\n println(` ${icon} ${issue.title}`);\n }\n println();\n\n // Auto-repair if enabled\n if (options.autoRepair) {\n process.stdout.write(\" Tentando reparar automaticamente... \");\n const repairReport = repairAllIssues(report, apiKey, platformUrl);\n if (repairReport.repairsSucceeded > 0) {\n println(chalk.green(`${repairReport.repairsSucceeded} corrigido(s)`));\n } else {\n println(chalk.yellow(\"Nenhum reparo aplicado\"));\n }\n } else {\n println(\n chalk.gray(' Dica: Execute \"npx @tostudy-ai/mcp-setup diagnose\" para mais detalhes.')\n );\n }\n } else {\n println(chalk.green(\" ✓ Nenhum problema encontrado!\"));\n }\n } else {\n println(chalk.gray(\" Diagnóstico ignorado (--skip-diagnostics)\"));\n }\n\n // ━━━ Success ━━━\n println();\n println(chalk.green(\" ╔═══════════════════════════════════════════════╗\"));\n println(\n chalk.green(\" ║\") +\n chalk.white.bold(\" Configuração concluída com sucesso! \") +\n chalk.green(\"║\")\n );\n println(chalk.green(\" ╚═══════════════════════════════════════════════╝\"));\n println();\n println(chalk.white(NEXT_STEPS_TITLE));\n println();\n println(chalk.gray(\" 1.\") + \" Reinicie o Claude Code\");\n println(chalk.gray(\" 2.\") + \" O servidor MCP iniciará automaticamente\");\n println(chalk.gray(\" 3.\") + COURSES_TOOL_HINT.trimStart());\n println();\n println(chalk.gray(\" Comandos úteis:\"));\n println(\n chalk.gray(\" \") +\n chalk.cyan(\"npx @tostudy-ai/mcp-setup diagnose\") +\n chalk.gray(\" - Verificar problemas\")\n );\n println(\n chalk.gray(\" \") +\n chalk.cyan(\"npx @tostudy-ai/mcp-setup repair\") +\n chalk.gray(\" - Reparar automaticamente\")\n );\n println();\n println(chalk.gray(\" ─────────────────────────────────────────\"));\n println();\n println(chalk.white(\" Prefere estudar pelo terminal?\"));\n println(chalk.gray(\" \") + chalk.cyan(\"npm install -g @tostudy-ai/cli\"));\n println(\n chalk.gray(\" \") +\n chalk.cyan(\"tostudy login\") +\n chalk.gray(\" → \") +\n chalk.cyan(\"tostudy courses\")\n );\n println();\n}\n\n// CLI setup\nprogram\n .name(\"tostudy-mcp-setup\")\n .description(\"Configura o Claude Code para usar o ToStudy MCP server\")\n .version(VERSION);\n\n// Default command (setup)\nprogram\n .option(\"-k, --api-key <key>\", \"(deprecated) API key — use OAuth flow instead\")\n .option(\"-u, --url <url>\", \"URL da plataforma (default: https://tostudy.ai)\")\n .option(\"--uninstall\", \"Remove a configuração do ToStudy MCP\")\n .action(async (options) => {\n try {\n if (options.uninstall) {\n await uninstall();\n } else {\n await setup(options.apiKey, options.url);\n }\n } catch (error) {\n eprintln();\n eprintln(chalk.red(\"Erro:\") + \" \" + (error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n });\n\n// Wizard command - interactive step-by-step setup\nprogram\n .command(\"wizard\")\n .description(\"Assistente interativo de configuração passo a passo\")\n .option(\"-k, --api-key <key>\", \"(deprecated) API key — use OAuth flow instead\")\n .option(\"-u, --url <url>\", \"URL da plataforma (default: https://tostudy.ai)\")\n .option(\"--skip-diagnostics\", \"Pula a verificação de diagnóstico após setup\")\n .option(\"--auto-repair\", \"Tenta reparar problemas automaticamente\")\n .action(async (options) => {\n try {\n await wizard({\n apiKey: options.apiKey,\n url: options.url,\n skipDiagnostics: options.skipDiagnostics,\n autoRepair: options.autoRepair,\n });\n } catch (error) {\n eprintln();\n eprintln(chalk.red(\"Erro:\") + \" \" + (error instanceof Error ? error.message : String(error)));\n process.exit(1);\n }\n });\n\n// Diagnose command\nprogram\n .command(\"diagnose\")\n .description(\"Executa diagnóstico de problemas na configuração MCP\")\n .option(\"--json\", \"Saída em formato JSON\")\n .action(async (options) => {\n try {\n const report = await runDiagnostics();\n\n if (options.json) {\n println(JSON.stringify(report, null, 2));\n } else {\n printDiagnosticReport(report);\n }\n\n process.exit(report.passed ? 0 : 1);\n } catch (error) {\n eprintln();\n eprintln(chalk.red(\"Erro ao executar diagnóstico:\"));\n eprintln(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Repair command\nprogram\n .command(\"repair\")\n .description(\"Repara problemas de configuração automaticamente\")\n .option(\"-k, --api-key <key>\", \"API key para reparos que necessitam autenticação\")\n .option(\"-u, --url <url>\", \"URL da plataforma (default: https://tostudy.ai)\")\n .option(\"--json\", \"Saída em formato JSON\")\n .action(async (options) => {\n try {\n const apiKey = options.apiKey || process.env.TOSTUDY_API_KEY;\n const platformUrl = options.url || DEFAULT_PLATFORM_URL;\n\n const diagnostic = await runDiagnostics();\n const repair = repairAllIssues(diagnostic, apiKey, platformUrl);\n\n if (options.json) {\n println(JSON.stringify({ diagnostic, repair }, null, 2));\n } else {\n printRepairReport(repair);\n }\n\n const hasUnfixedCritical = diagnostic.issues.some(\n (issue) =>\n issue.severity === \"critical\" &&\n !repair.results.find((r) => r.issueId === issue.id && r.success)\n );\n\n process.exit(hasUnfixedCritical ? 1 : 0);\n } catch (error) {\n eprintln();\n eprintln(chalk.red(\"Erro ao executar reparo:\"));\n eprintln(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n\n// Install command - non-interactive, used by the web wizard's npx command\nconst SUPPORTED_IDES = [\n \"claude-code\",\n \"cursor\",\n \"vscode\",\n \"desktop\",\n \"windsurf\",\n \"opencode\",\n \"codex\",\n \"antigravity\",\n \"manual\",\n] as const;\n\nprogram\n .command(\"install\")\n .description(\"Install MCP config for a specific IDE (used by the web setup wizard)\")\n .requiredOption(\"--ide <ide>\", `Target IDE: ${SUPPORTED_IDES.join(\", \")}`)\n .requiredOption(\"--key <key>\", \"API key from the platform\")\n .option(\"--url <url>\", \"Platform URL (default: https://tostudy.ai)\", DEFAULT_PLATFORM_URL)\n .action(async (options) => {\n try {\n const ide = options.ide as SupportedIDE;\n if (!SUPPORTED_IDES.includes(ide)) {\n eprintln(chalk.red(`Unknown IDE: ${ide}`));\n eprintln(`Supported: ${SUPPORTED_IDES.join(\", \")}`);\n process.exit(1);\n }\n\n const handler = getIDEHandler(ide);\n const mcpUrl = resolveMcpServerUrl(options.url);\n\n println();\n println(chalk.cyan(` Installing MCP config for ${handler.name}...`));\n\n // Write config\n process.stdout.write(chalk.gray(\" Writing config... \"));\n await handler.writeConfig(options.key, mcpUrl);\n println(chalk.green(\"OK\"));\n\n if (ide !== \"manual\") {\n println(chalk.gray(` Config: ${handler.getConfigPath()}`));\n }\n\n // Verify heartbeat\n process.stdout.write(chalk.gray(\" Verifying connection... \"));\n const verified = await handler.verify(options.key, options.url);\n if (verified) {\n println(chalk.green(\"OK\"));\n } else {\n println(chalk.yellow(\"SKIPPED (server not reachable)\"));\n println(\n chalk.gray(\" The config was saved. Connection will work when the server is available.\")\n );\n }\n\n println();\n println(chalk.green.bold(\" Done! Restart your IDE to activate the MCP server.\"));\n println();\n } catch (error) {\n eprintln();\n eprintln(\n chalk.red(\"Install failed:\") +\n \" \" +\n (error instanceof Error ? error.message : String(error))\n );\n process.exit(1);\n }\n });\n\n/**\n * Resolve the MCP server URL from the platform URL.\n * The platform runs on port 3700, MCP server on 3701.\n */\nfunction resolveMcpServerUrl(platformUrl: string): string {\n if (platformUrl.includes(\":3700\")) {\n return platformUrl.replace(\":3700\", \":3701\");\n }\n if (platformUrl.includes(\"localhost\") && !platformUrl.includes(\":\")) {\n return \"http://localhost:3701\";\n }\n // Production: use dedicated MCP subdomain\n if (platformUrl.includes(\"tostudy\")) {\n return process.env.MCP_SERVER_URL || \"https://mcp.tostudy.ai\";\n }\n return platformUrl;\n}\n\nfunction resolvePlatformUrl(explicitUrl?: string): string {\n return explicitUrl || process.env.TOSTUDY_PLATFORM_URL || DEFAULT_PLATFORM_URL;\n}\n\nasync function resolveCommandApiKey(explicitApiKey?: string): Promise<string> {\n const apiKey = explicitApiKey || process.env.TOSTUDY_API_KEY;\n if (apiKey) {\n return apiKey;\n }\n\n return promptApiKey();\n}\n\nprogram\n .command(\"init\")\n .description(\"Configura instruções do curso no workspace atual\")\n .requiredOption(\"--course <courseId>\", \"Course ID to configure in this workspace\")\n .option(\"-k, --api-key <key>\", \"API key para autenticação\")\n .option(\"-u, --url <url>\", \"URL da plataforma (default: https://tostudy.ai)\")\n .action(async (options) => {\n try {\n const result = await runInit({\n apiKey: await resolveCommandApiKey(options.apiKey),\n platformUrl: resolvePlatformUrl(options.url),\n courseId: options.course,\n });\n\n if (!result.ok) {\n process.exit(1);\n }\n } catch (error) {\n eprintln();\n eprintln(\n chalk.red(\"Erro no init:\") + \" \" + (error instanceof Error ? error.message : String(error))\n );\n process.exit(1);\n }\n });\n\nprogram\n .command(\"sync\")\n .description(\"Regenera as instruções do curso com base no arquivo existente\")\n .option(\"--course <courseId>\", \"Course ID override when metadata is unavailable\")\n .option(\"-k, --api-key <key>\", \"API key para autenticação\")\n .option(\"-u, --url <url>\", \"URL da plataforma (default: https://tostudy.ai)\")\n .action(async (options) => {\n try {\n const result = await runSync({\n apiKey: await resolveCommandApiKey(options.apiKey),\n platformUrl: resolvePlatformUrl(options.url),\n courseId: options.course,\n });\n\n if (!result.ok) {\n process.exit(1);\n }\n } catch (error) {\n eprintln();\n eprintln(\n chalk.red(\"Erro no sync:\") + \" \" + (error instanceof Error ? error.message : String(error))\n );\n process.exit(1);\n }\n });\n\nprogram.parse();\n","/**\n * Claude Code Configuration Manager\n *\n * Handles reading/writing Claude Code's MCP server configuration.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { homedir, platform } from \"node:os\";\n\nexport interface ClaudeConfig {\n mcpServers?: Record<string, McpServerConfig>;\n [key: string]: unknown;\n}\n\nexport interface McpServerConfig {\n // Transport type\n type?: \"sse\" | \"stdio\";\n // SSE transport fields (legacy configs)\n url?: string;\n headers?: Record<string, string>;\n // Stdio transport fields (current format)\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * Extract the API key from either SSE (headers) or stdio (args) config format.\n */\nexport function extractApiKey(config: McpServerConfig): string | null {\n // SSE format: headers.Authorization = \"Bearer <key>\"\n const authHeader = config.headers?.[\"Authorization\"];\n if (authHeader?.startsWith(\"Bearer \")) {\n return authHeader.replace(\"Bearer \", \"\");\n }\n\n // Stdio format: args contains \"--header\", \"Authorization:Bearer <key>\"\n if (config.args) {\n for (let i = 0; i < config.args.length; i++) {\n if (\n config.args[i] === \"--header\" &&\n config.args[i + 1]?.startsWith(\"Authorization:Bearer \")\n ) {\n return config.args[i + 1].replace(\"Authorization:Bearer \", \"\");\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract the MCP server URL from either SSE (url) or stdio (args) config format.\n */\nexport function extractMcpUrl(config: McpServerConfig): string | null {\n // SSE format: url = \"https://mcp.tostudy.ai/mcp/sse\"\n if (config.url) {\n return config.url;\n }\n\n // Stdio format: args[2] is the URL (after \"-y\" \"mcp-remote\")\n if (config.args && config.args[0] === \"-y\" && config.args[1] === \"mcp-remote\" && config.args[2]) {\n return config.args[2];\n }\n\n return null;\n}\n\nfunction getClientOsHeaderValue(): \"macos\" | \"windows\" | \"linux\" {\n switch (platform()) {\n case \"darwin\":\n return \"macos\";\n case \"win32\":\n return \"windows\";\n default:\n return \"linux\";\n }\n}\n\n/**\n * Get the path to Claude Code's config file based on OS\n */\nexport function getClaudeConfigPath(): string {\n const home = homedir();\n const os = platform();\n\n switch (os) {\n case \"darwin\":\n return join(home, \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\");\n case \"win32\":\n return join(\n process.env.APPDATA || join(home, \"AppData\", \"Roaming\"),\n \"Claude\",\n \"claude_desktop_config.json\"\n );\n case \"linux\":\n return join(home, \".config\", \"Claude\", \"claude_desktop_config.json\");\n default:\n throw new Error(`Unsupported operating system: ${os}`);\n }\n}\n\n/**\n * Check if Claude Code is installed (config directory exists)\n */\nexport function isClaudeInstalled(): boolean {\n const configPath = getClaudeConfigPath();\n const configDir = dirname(configPath);\n return existsSync(configDir);\n}\n\n/**\n * Read Claude Code's current config\n */\nexport function readClaudeConfig(): ClaudeConfig {\n const configPath = getClaudeConfigPath();\n\n if (!existsSync(configPath)) {\n return { mcpServers: {} };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n return JSON.parse(content) as ClaudeConfig;\n } catch {\n // If config is corrupted, start fresh\n return { mcpServers: {} };\n }\n}\n\n/**\n * Write Claude Code's config\n */\nexport function writeClaudeConfig(config: ClaudeConfig): void {\n const configPath = getClaudeConfigPath();\n const configDir = dirname(configPath);\n\n // Ensure directory exists\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n // Backup existing config\n if (existsSync(configPath)) {\n const backupPath = `${configPath}.backup`;\n copyFileSync(configPath, backupPath);\n }\n\n // Write new config with pretty formatting\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\n/**\n * Add ToStudy MCP server to Claude Desktop config\n * Uses stdio transport via mcp-remote (Claude Desktop requires command + args)\n */\nexport function addTostudyMcpServer(\n apiKey: string,\n platformUrl: string,\n clientInfo: { ide?: string; os?: \"macos\" | \"windows\" | \"linux\" } = {}\n): void {\n const config = readClaudeConfig();\n\n // Initialize mcpServers if not exists\n if (!config.mcpServers) {\n config.mcpServers = {};\n }\n\n const ide = clientInfo.ide || \"desktop\";\n const os = clientInfo.os || getClientOsHeaderValue();\n\n // Use stdio transport with mcp-remote as bridge to the SSE endpoint\n // Claude Desktop requires command + args format\n config.mcpServers[\"tostudy\"] = {\n command: \"npx\",\n args: [\n \"-y\",\n \"mcp-remote\",\n `${platformUrl}/mcp`,\n \"--header\",\n `Authorization:Bearer ${apiKey}`,\n \"--header\",\n `X-Tostudy-Client-IDE:${ide}`,\n \"--header\",\n `X-Tostudy-Client-OS:${os}`,\n ],\n };\n\n writeClaudeConfig(config);\n}\n\n/**\n * Remove ToStudy MCP server from Claude config\n */\nexport function removeTostudyMcpServer(): void {\n const config = readClaudeConfig();\n\n if (config.mcpServers && config.mcpServers[\"tostudy\"]) {\n delete config.mcpServers[\"tostudy\"];\n writeClaudeConfig(config);\n }\n}\n\n/**\n * Check if ToStudy MCP server is already configured\n */\nexport function isTostudyMcpConfigured(): boolean {\n const config = readClaudeConfig();\n return !!(config.mcpServers && config.mcpServers[\"tostudy\"]);\n}\n\n/**\n * Get the current ToStudy config if exists\n */\nexport function getTostudyMcpConfig(): McpServerConfig | null {\n const config = readClaudeConfig();\n return config.mcpServers?.[\"tostudy\"] || null;\n}\n","/**\n * Interactive Prompts\n *\n * Simple readline-based prompts for CLI interaction.\n * Uses Node.js built-in readline to minimize dependencies.\n */\n\nimport * as readline from \"node:readline\";\nimport type { CourseContext } from \"@repo/mcp-cli-core\";\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\n/**\n * Create a readline interface for user input\n */\nfunction createInterface(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\n/**\n * Prompt user for text input\n */\nexport function prompt(question: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface();\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\n/**\n * Prompt for API key with validation\n */\nexport async function promptApiKey(): Promise<string> {\n println();\n println(\"Cole sua API key (de /student/settings/mcp):\");\n\n const apiKey = await prompt(\"> \");\n\n if (!apiKey) {\n throw new Error(\"API key não pode ser vazia\");\n }\n\n // Basic validation - key should be at least 32 characters\n if (apiKey.length < 32) {\n throw new Error(\"API key parece ser muito curta. Verifique e tente novamente.\");\n }\n\n return apiKey;\n}\n\n/**\n * Prompt for yes/no confirmation\n */\nexport async function confirm(question: string, defaultValue = false): Promise<boolean> {\n const defaultStr = defaultValue ? \"[S/n]\" : \"[s/N]\";\n const answer = await prompt(`${question} ${defaultStr} `);\n\n if (!answer) {\n return defaultValue;\n }\n\n return answer.toLowerCase().startsWith(\"s\") || answer.toLowerCase().startsWith(\"y\");\n}\n\n/**\n * Prompt for platform URL\n */\nexport async function promptPlatformUrl(defaultUrl: string): Promise<string> {\n println();\n println(`URL da plataforma (default: ${defaultUrl}):`);\n\n const url = await prompt(\"> \");\n\n return url || defaultUrl;\n}\n\nexport async function promptCourseSelection(courses: CourseContext[]): Promise<string | null> {\n if (courses.length === 0) {\n return null;\n }\n\n println();\n println(\"Cursos ativos:\");\n\n courses.forEach((course, index) => {\n println(` ${index + 1}. ${course.title} — ${course.progressPercent}% completo`);\n });\n\n const answer = await prompt(`Selecione um curso [1-${courses.length}] (default: 1): `);\n\n if (!answer) {\n return courses[0]?.id ?? null;\n }\n\n const index = Number.parseInt(answer, 10);\n\n if (!Number.isInteger(index) || index < 1 || index > courses.length) {\n println(\"Seleção inválida.\");\n return null;\n }\n\n return courses[index - 1]?.id ?? null;\n}\n","/**\n * IDE Detection Module\n *\n * Detects installed IDEs (VS Code, JetBrains) for MCP configuration.\n */\n\nimport { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir, platform } from 'node:os';\n\nexport type IDEType = 'vscode' | 'vscode-insiders' | 'cursor' | 'jetbrains';\n\nexport interface DetectedIDE {\n type: IDEType;\n name: string;\n version?: string;\n configPath: string;\n installed: boolean;\n}\n\n/**\n * Get VS Code config directory based on OS\n */\nfunction getVSCodeConfigDir(variant: 'stable' | 'insiders' | 'cursor'): string {\n const home = homedir();\n const os = platform();\n\n const folderNames = {\n stable: 'Code',\n insiders: 'Code - Insiders',\n cursor: 'Cursor',\n };\n\n const folder = folderNames[variant];\n\n switch (os) {\n case 'darwin':\n return join(home, 'Library', 'Application Support', folder, 'User');\n case 'win32':\n return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), folder, 'User');\n case 'linux':\n return join(home, '.config', folder, 'User');\n default:\n return '';\n }\n}\n\n/**\n * Get VS Code MCP settings file path\n */\nfunction getVSCodeMcpConfigPath(variant: 'stable' | 'insiders' | 'cursor'): string {\n const configDir = getVSCodeConfigDir(variant);\n if (!configDir) return '';\n return join(configDir, 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');\n}\n\n/**\n * Check if VS Code variant is installed\n */\nfunction isVSCodeInstalled(variant: 'stable' | 'insiders' | 'cursor'): boolean {\n const os = platform();\n const home = homedir();\n\n const appNames = {\n stable: ['Visual Studio Code.app', 'code'],\n insiders: ['Visual Studio Code - Insiders.app', 'code-insiders'],\n cursor: ['Cursor.app', 'cursor'],\n };\n\n const [macApp, linuxCmd] = appNames[variant];\n\n switch (os) {\n case 'darwin':\n // Check /Applications folder\n return existsSync(join('/Applications', macApp)) ||\n existsSync(join(home, 'Applications', macApp));\n\n case 'win32': {\n // Check common Windows install locations\n const programFiles = process.env.ProgramFiles || 'C:\\\\Program Files';\n const programFilesX86 = process.env['ProgramFiles(x86)'] || 'C:\\\\Program Files (x86)';\n const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');\n\n const winPaths = variant === 'cursor'\n ? [join(localAppData, 'Programs', 'cursor', 'Cursor.exe')]\n : [\n join(programFiles, 'Microsoft VS Code', 'Code.exe'),\n join(programFilesX86, 'Microsoft VS Code', 'Code.exe'),\n join(localAppData, 'Programs', 'Microsoft VS Code', 'Code.exe'),\n ];\n\n if (variant === 'insiders') {\n winPaths.push(\n join(programFiles, 'Microsoft VS Code Insiders', 'Code - Insiders.exe'),\n join(localAppData, 'Programs', 'Microsoft VS Code Insiders', 'Code - Insiders.exe'),\n );\n }\n\n return winPaths.some((p) => existsSync(p));\n }\n\n case 'linux':\n // Check if config directory exists (indicates installation)\n return existsSync(getVSCodeConfigDir(variant)) ||\n existsSync(join('/usr/bin', linuxCmd)) ||\n existsSync(join('/usr/local/bin', linuxCmd)) ||\n existsSync(join(home, '.local', 'bin', linuxCmd));\n\n default:\n return false;\n }\n}\n\n/**\n * Get JetBrains config directory based on OS\n */\nfunction getJetBrainsConfigDir(): string {\n const home = homedir();\n const os = platform();\n\n switch (os) {\n case 'darwin':\n return join(home, 'Library', 'Application Support', 'JetBrains');\n case 'win32':\n return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'JetBrains');\n case 'linux':\n return join(home, '.config', 'JetBrains');\n default:\n return '';\n }\n}\n\n/**\n * List installed JetBrains IDEs by scanning config directory\n */\nfunction getInstalledJetBrainsIDEs(): string[] {\n const configDir = getJetBrainsConfigDir();\n if (!configDir || !existsSync(configDir)) {\n return [];\n }\n\n try {\n const entries = readdirSync(configDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .filter((name) => {\n // Filter for actual IDE directories (e.g., IntelliJIdea2024.1, WebStorm2023.3)\n return /^(IntelliJIdea|WebStorm|PyCharm|PhpStorm|GoLand|Rider|CLion|RubyMine|DataGrip|Fleet)\\d{4}\\.\\d/i.test(name);\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Check if any JetBrains IDE is installed\n */\nfunction isJetBrainsInstalled(): boolean {\n const installedIDEs = getInstalledJetBrainsIDEs();\n return installedIDEs.length > 0;\n}\n\n/**\n * Get the primary JetBrains IDE name (most recently versioned)\n */\nfunction getPrimaryJetBrainsIDE(): string | null {\n const installedIDEs = getInstalledJetBrainsIDEs();\n if (installedIDEs.length === 0) return null;\n\n // Sort by version (descending) to get most recent\n const sorted = installedIDEs.sort((a, b) => {\n const versionA = a.match(/\\d{4}\\.\\d/)?.[0] || '0';\n const versionB = b.match(/\\d{4}\\.\\d/)?.[0] || '0';\n return versionB.localeCompare(versionA);\n });\n\n return sorted[0];\n}\n\n/**\n * Get JetBrains MCP config path for a specific IDE version directory\n */\nfunction getJetBrainsMcpConfigPath(ideDir?: string): string {\n const configDir = getJetBrainsConfigDir();\n if (!configDir) return '';\n\n const targetDir = ideDir || getPrimaryJetBrainsIDE();\n if (!targetDir) return '';\n\n // MCP Claude plugin stores config in options directory\n return join(configDir, targetDir, 'options', 'mcp-servers.json');\n}\n\n/**\n * Detect VS Code installation\n */\nexport function detectVSCode(): DetectedIDE {\n const installed = isVSCodeInstalled('stable');\n return {\n type: 'vscode',\n name: 'Visual Studio Code',\n configPath: getVSCodeMcpConfigPath('stable'),\n installed,\n };\n}\n\n/**\n * Detect VS Code Insiders installation\n */\nexport function detectVSCodeInsiders(): DetectedIDE {\n const installed = isVSCodeInstalled('insiders');\n return {\n type: 'vscode-insiders',\n name: 'Visual Studio Code - Insiders',\n configPath: getVSCodeMcpConfigPath('insiders'),\n installed,\n };\n}\n\n/**\n * Detect Cursor IDE installation\n */\nexport function detectCursor(): DetectedIDE {\n const installed = isVSCodeInstalled('cursor');\n return {\n type: 'cursor',\n name: 'Cursor',\n configPath: getVSCodeMcpConfigPath('cursor'),\n installed,\n };\n}\n\n/**\n * Detect JetBrains IDE installation\n */\nexport function detectJetBrains(): DetectedIDE {\n const installed = isJetBrainsInstalled();\n const primaryIDE = getPrimaryJetBrainsIDE();\n\n // Extract IDE name and version from directory name\n let name = 'JetBrains IDE';\n let version: string | undefined;\n\n if (primaryIDE) {\n const match = primaryIDE.match(/^(\\w+?)(\\d{4}\\.\\d)/);\n if (match) {\n const ideNames: Record<string, string> = {\n 'IntelliJIdea': 'IntelliJ IDEA',\n 'WebStorm': 'WebStorm',\n 'PyCharm': 'PyCharm',\n 'PhpStorm': 'PhpStorm',\n 'GoLand': 'GoLand',\n 'Rider': 'Rider',\n 'CLion': 'CLion',\n 'RubyMine': 'RubyMine',\n 'DataGrip': 'DataGrip',\n 'Fleet': 'Fleet',\n };\n name = ideNames[match[1]] || match[1];\n version = match[2];\n }\n }\n\n return {\n type: 'jetbrains',\n name,\n version,\n configPath: getJetBrainsMcpConfigPath(),\n installed,\n };\n}\n\n/**\n * Detect all supported IDEs\n */\nexport function detectAllIDEs(): DetectedIDE[] {\n return [\n detectVSCode(),\n detectVSCodeInsiders(),\n detectCursor(),\n detectJetBrains(),\n ];\n}\n\n/**\n * Get only installed IDEs\n */\nexport function getInstalledIDEs(): DetectedIDE[] {\n return detectAllIDEs().filter((ide) => ide.installed);\n}\n\n/**\n * Check if any supported IDE is installed\n */\nexport function hasAnyIDE(): boolean {\n return detectAllIDEs().some((ide) => ide.installed);\n}\n\n// CLI entry point for testing\nif (process.argv[1]?.endsWith('detect.js')) {\n const installedIDEs = getInstalledIDEs();\n\n if (installedIDEs.length === 0) {\n process.stdout.write('No supported IDEs detected.\\n');\n process.stdout.write('\\nSupported IDEs:\\n');\n process.stdout.write(' - Visual Studio Code\\n');\n process.stdout.write(' - Visual Studio Code - Insiders\\n');\n process.stdout.write(' - Cursor\\n');\n process.stdout.write(' - JetBrains IDEs (IntelliJ, WebStorm, PyCharm, etc.)\\n');\n } else {\n process.stdout.write('Detected IDEs:\\n');\n for (const ide of installedIDEs) {\n const versionStr = ide.version ? ` (${ide.version})` : '';\n process.stdout.write(` ✓ ${ide.name}${versionStr}\\n`);\n process.stdout.write(` Config: ${ide.configPath || 'N/A'}\\n`);\n }\n }\n\n // Output as JSON for programmatic use\n process.stdout.write('\\n--- JSON Output ---\\n');\n process.stdout.write(JSON.stringify(installedIDEs, null, 2) + '\\n');\n}\n","#!/usr/bin/env node\n\n/**\n * MCP Diagnostic Module\n *\n * Performs diagnostic checks for common MCP configuration issues.\n * Detects port conflicts, missing config, auth errors, and connectivity problems.\n */\n\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { createServer } from \"node:net\";\nimport chalk from \"chalk\";\nimport {\n getClaudeConfigPath,\n isClaudeInstalled,\n isTostudyMcpConfigured,\n getTostudyMcpConfig,\n readClaudeConfig,\n extractApiKey,\n extractMcpUrl,\n} from \"./config.js\";\nimport { getInstalledIDEs } from \"./detect.js\";\n\nexport type IssueSeverity = \"critical\" | \"warning\" | \"info\";\n\nexport interface DiagnosticIssue {\n id: string;\n severity: IssueSeverity;\n title: string;\n description: string;\n suggestion: string;\n autoFixable: boolean;\n}\n\nexport interface DiagnosticReport {\n timestamp: string;\n claudeInstalled: boolean;\n mcpConfigured: boolean;\n issues: DiagnosticIssue[];\n passed: boolean;\n}\n\nconst DEFAULT_MCP_PORT = 3701;\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\n/**\n * Check if a port is available\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n\n server.once(\"error\", () => {\n resolve(false);\n });\n\n server.once(\"listening\", () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port, \"127.0.0.1\");\n });\n}\n\n/**\n * Check if Claude Code is installed\n */\nfunction checkClaudeInstallation(): DiagnosticIssue | null {\n if (!isClaudeInstalled()) {\n return {\n id: \"claude-not-installed\",\n severity: \"critical\",\n title: \"Claude Code nao encontrado\",\n description: \"O diretorio de configuracao do Claude Code nao foi encontrado no sistema.\",\n suggestion: \"Instale o Claude Code em https://claude.ai/download\",\n autoFixable: false,\n };\n }\n return null;\n}\n\n/**\n * Check if config file exists and is readable\n */\nfunction checkConfigFile(): DiagnosticIssue | null {\n const configPath = getClaudeConfigPath();\n\n if (!existsSync(configPath)) {\n return {\n id: \"config-missing\",\n severity: \"warning\",\n title: \"Arquivo de configuracao nao existe\",\n description: `O arquivo ${configPath} nao foi encontrado. Sera criado durante o setup.`,\n suggestion: \"Execute o comando de setup para criar a configuracao.\",\n autoFixable: true,\n };\n }\n\n // Check if file is readable\n try {\n const stats = statSync(configPath);\n if (!stats.isFile()) {\n return {\n id: \"config-not-file\",\n severity: \"critical\",\n title: \"Configuracao nao e um arquivo\",\n description: `${configPath} existe mas nao e um arquivo valido.`,\n suggestion: \"Remova o item e execute o setup novamente.\",\n autoFixable: false,\n };\n }\n } catch {\n return {\n id: \"config-unreadable\",\n severity: \"critical\",\n title: \"Arquivo de configuracao inacessivel\",\n description: `Nao foi possivel acessar ${configPath}. Verifique as permissoes.`,\n suggestion: \"Verifique as permissoes do arquivo ou recrie-o.\",\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Check if config JSON is valid\n */\nfunction checkConfigJson(): DiagnosticIssue | null {\n const configPath = getClaudeConfigPath();\n\n if (!existsSync(configPath)) {\n return null; // Already handled by checkConfigFile\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n JSON.parse(content);\n } catch {\n return {\n id: \"config-invalid-json\",\n severity: \"critical\",\n title: \"JSON de configuracao invalido\",\n description: \"O arquivo de configuracao contem JSON invalido.\",\n suggestion:\n 'Execute \"mcp-setup repair\" para corrigir ou remova o arquivo e execute o setup novamente.',\n autoFixable: true,\n };\n }\n\n return null;\n}\n\n/**\n * Check if ToStudy MCP is configured\n */\nfunction checkMcpConfiguration(): DiagnosticIssue | null {\n if (!isTostudyMcpConfigured()) {\n return {\n id: \"mcp-not-configured\",\n severity: \"warning\",\n title: \"ToStudy MCP nao configurado\",\n description: \"O servidor MCP da ToStudy nao esta configurado no Claude Code.\",\n suggestion: \"Execute o comando de setup para configurar o MCP.\",\n autoFixable: true,\n };\n }\n return null;\n}\n\n/**\n * Check API key format (supports both SSE headers and stdio args formats)\n */\nfunction checkApiKeyFormat(): DiagnosticIssue | null {\n const mcpConfig = getTostudyMcpConfig();\n\n if (!mcpConfig) {\n return null; // Already handled by checkMcpConfiguration\n }\n\n const apiKey = extractApiKey(mcpConfig);\n\n if (!apiKey) {\n return {\n id: \"api-key-missing\",\n severity: \"critical\",\n title: \"API key nao configurada\",\n description: \"A configuracao do MCP nao possui uma API key.\",\n suggestion: \"Execute o setup novamente com uma API key valida.\",\n autoFixable: true,\n };\n }\n\n // Check API key length\n if (apiKey.length < 32) {\n return {\n id: \"api-key-too-short\",\n severity: \"warning\",\n title: \"API key parece ser muito curta\",\n description: `A API key tem apenas ${apiKey.length} caracteres. API keys validas geralmente tem 32+ caracteres.`,\n suggestion: \"Verifique se copiou a API key completa de /student/settings/mcp.\",\n autoFixable: true,\n };\n }\n\n return null;\n}\n\n/**\n * Check MCP server URL format (supports both SSE url and stdio args formats)\n */\nfunction checkServerUrl(): DiagnosticIssue | null {\n const mcpConfig = getTostudyMcpConfig();\n\n if (!mcpConfig) {\n return null;\n }\n\n const url = extractMcpUrl(mcpConfig);\n\n if (!url) {\n return {\n id: \"server-url-missing\",\n severity: \"critical\",\n title: \"URL do servidor MCP nao configurada\",\n description: \"A configuracao do MCP nao possui uma URL de servidor.\",\n suggestion: \"Execute o setup novamente para configurar a URL correta.\",\n autoFixable: true,\n };\n }\n\n // Check URL format\n try {\n const parsedUrl = new URL(url);\n\n if (![\"http:\", \"https:\"].includes(parsedUrl.protocol)) {\n return {\n id: \"server-url-invalid-protocol\",\n severity: \"critical\",\n title: \"Protocolo de URL invalido\",\n description: `O protocolo \"${parsedUrl.protocol}\" nao e suportado. Use http: ou https:.`,\n suggestion: \"Execute o setup novamente com a URL correta.\",\n autoFixable: true,\n };\n }\n\n // For SSE format: check /mcp/sse suffix; for stdio: check /mcp suffix\n const validPaths = [\"/mcp/sse\", \"/mcp\"];\n if (!validPaths.some((p) => parsedUrl.pathname.endsWith(p))) {\n return {\n id: \"server-url-missing-sse-path\",\n severity: \"warning\",\n title: \"URL do servidor pode estar incorreta\",\n description: `A URL ${url} nao termina com /mcp como esperado.`,\n suggestion: \"Verifique se a URL esta correta ou execute o setup novamente.\",\n autoFixable: true,\n };\n }\n } catch {\n return {\n id: \"server-url-invalid\",\n severity: \"critical\",\n title: \"URL do servidor invalida\",\n description: `A URL \"${url}\" nao e uma URL valida.`,\n suggestion: \"Execute o setup novamente com uma URL valida.\",\n autoFixable: true,\n };\n }\n\n return null;\n}\n\n/**\n * Check for port conflicts\n */\nasync function checkPortConflict(): Promise<DiagnosticIssue | null> {\n const isAvailable = await isPortAvailable(DEFAULT_MCP_PORT);\n\n if (!isAvailable) {\n return {\n id: \"port-conflict\",\n severity: \"warning\",\n title: `Porta ${DEFAULT_MCP_PORT} em uso`,\n description: `A porta padrao do MCP server (${DEFAULT_MCP_PORT}) esta sendo usada por outro processo.`,\n suggestion: \"Verifique qual processo esta usando a porta ou use uma porta alternativa.\",\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Check MCP server connectivity (supports both SSE and stdio formats)\n */\nasync function checkServerConnectivity(): Promise<DiagnosticIssue | null> {\n const mcpConfig = getTostudyMcpConfig();\n\n if (!mcpConfig) {\n return null;\n }\n\n const mcpUrl = extractMcpUrl(mcpConfig);\n const apiKey = extractApiKey(mcpConfig);\n\n if (!mcpUrl) {\n return null;\n }\n\n // Extract base URL (remove /mcp/sse or /mcp path)\n const baseUrl = mcpUrl.replace(/\\/mcp(\\/sse)?$/, \"\");\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`${baseUrl}/api/mcp/heartbeat`, {\n method: \"POST\",\n headers: {\n Authorization: apiKey ? `Bearer ${apiKey}` : \"\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ timestamp: new Date().toISOString() }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.status === 401 || response.status === 403) {\n return {\n id: \"auth-failed\",\n severity: \"critical\",\n title: \"Falha de autenticacao\",\n description: \"O servidor MCP rejeitou a API key. Ela pode estar expirada ou invalida.\",\n suggestion: \"Gere uma nova API key em /student/settings/mcp e execute o setup novamente.\",\n autoFixable: true,\n };\n }\n\n if (!response.ok && response.status !== 204) {\n return {\n id: \"server-error\",\n severity: \"warning\",\n title: `Servidor retornou erro ${response.status}`,\n description: `O servidor MCP retornou um status de erro: ${response.status}.`,\n suggestion:\n \"O servidor pode estar temporariamente indisponivel. Tente novamente mais tarde.\",\n autoFixable: false,\n };\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return {\n id: \"server-timeout\",\n severity: \"warning\",\n title: \"Timeout de conexao\",\n description: \"O servidor MCP nao respondeu em 5 segundos.\",\n suggestion: \"Verifique sua conexao de internet ou se o servidor esta online.\",\n autoFixable: false,\n };\n }\n\n return {\n id: \"server-unreachable\",\n severity: \"warning\",\n title: \"Servidor MCP inacessivel\",\n description: \"Nao foi possivel conectar ao servidor MCP.\",\n suggestion: \"Verifique sua conexao de internet ou se a URL do servidor esta correta.\",\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Check if any IDE is detected\n */\nfunction checkIDEInstallation(): DiagnosticIssue | null {\n const installedIDEs = getInstalledIDEs();\n\n if (installedIDEs.length === 0) {\n return {\n id: \"no-ide-detected\",\n severity: \"info\",\n title: \"Nenhuma IDE suportada detectada\",\n description: \"Nao foi encontrada nenhuma IDE compativel (VS Code, Cursor, JetBrains).\",\n suggestion: \"Instale uma IDE suportada para usar a integracao completa.\",\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Check for duplicate MCP server entries\n */\nfunction checkDuplicateServers(): DiagnosticIssue | null {\n const config = readClaudeConfig();\n\n if (!config.mcpServers) {\n return null;\n }\n\n // Check for servers with similar URLs\n const servers = Object.entries(config.mcpServers);\n const anaServers = servers.filter(\n ([key, server]) =>\n key.toLowerCase().includes(\"ana\") ||\n key.toLowerCase().includes(\"catalyst\") ||\n (server.url && server.url.includes(\"tostudy.com\"))\n );\n\n if (anaServers.length > 1) {\n return {\n id: \"duplicate-servers\",\n severity: \"warning\",\n title: \"Multiplos servidores ToStudy configurados\",\n description: `Foram encontrados ${anaServers.length} servidores relacionados a ToStudy: ${anaServers.map(([k]) => k).join(\", \")}.`,\n suggestion: 'Execute \"mcp-setup repair\" para remover duplicatas ou limpe manualmente.',\n autoFixable: true,\n };\n }\n\n return null;\n}\n\n/**\n * Run all diagnostic checks\n */\nexport async function runDiagnostics(): Promise<DiagnosticReport> {\n const issues: DiagnosticIssue[] = [];\n\n // Synchronous checks\n const syncChecks = [\n checkClaudeInstallation(),\n checkConfigFile(),\n checkConfigJson(),\n checkMcpConfiguration(),\n checkApiKeyFormat(),\n checkServerUrl(),\n checkIDEInstallation(),\n checkDuplicateServers(),\n ];\n\n for (const issue of syncChecks) {\n if (issue) {\n issues.push(issue);\n }\n }\n\n // Async checks - only run if basic config is valid\n const hasConfigIssues = issues.some((issue) =>\n [\"config-invalid-json\", \"claude-not-installed\"].includes(issue.id)\n );\n\n if (!hasConfigIssues) {\n const asyncChecks = await Promise.all([checkPortConflict(), checkServerConnectivity()]);\n\n for (const issue of asyncChecks) {\n if (issue) {\n issues.push(issue);\n }\n }\n }\n\n // Sort by severity (critical > warning > info)\n const severityOrder: Record<IssueSeverity, number> = {\n critical: 0,\n warning: 1,\n info: 2,\n };\n\n issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n\n const hasCritical = issues.some((issue) => issue.severity === \"critical\");\n\n return {\n timestamp: new Date().toISOString(),\n claudeInstalled: isClaudeInstalled(),\n mcpConfigured: isTostudyMcpConfigured(),\n issues,\n passed: !hasCritical,\n };\n}\n\n/**\n * Get severity icon\n */\nfunction getSeverityIcon(severity: IssueSeverity): string {\n switch (severity) {\n case \"critical\":\n return chalk.red(\"●\");\n case \"warning\":\n return chalk.yellow(\"●\");\n case \"info\":\n return chalk.blue(\"●\");\n }\n}\n\n/**\n * Get severity label\n */\nfunction getSeverityLabel(severity: IssueSeverity): string {\n switch (severity) {\n case \"critical\":\n return chalk.red(\"CRITICO\");\n case \"warning\":\n return chalk.yellow(\"AVISO\");\n case \"info\":\n return chalk.blue(\"INFO\");\n }\n}\n\n/**\n * Print diagnostic report to console\n */\nexport function printDiagnosticReport(report: DiagnosticReport): void {\n println();\n println(chalk.cyan(\" ╔═══════════════════════════════════════╗\"));\n println(\n chalk.cyan(\" ║\") + chalk.white.bold(\" ToStudy MCP Diagnostics \") + chalk.cyan(\"║\")\n );\n println(chalk.cyan(\" ╚═══════════════════════════════════════╝\"));\n println();\n\n // Status summary\n println(chalk.gray(\"Status:\"));\n println(\n ` Claude Code: ${report.claudeInstalled ? chalk.green(\"✓ Instalado\") : chalk.red(\"✗ Nao encontrado\")}`\n );\n println(\n ` MCP ToStudy: ${report.mcpConfigured ? chalk.green(\"✓ Configurado\") : chalk.yellow(\"○ Nao configurado\")}`\n );\n println();\n\n if (report.issues.length === 0) {\n println(chalk.green.bold(\"✓ Nenhum problema encontrado!\"));\n println();\n println(chalk.gray(\"Tudo parece estar funcionando corretamente.\"));\n println();\n return;\n }\n\n // Issues\n const criticalCount = report.issues.filter((i) => i.severity === \"critical\").length;\n const warningCount = report.issues.filter((i) => i.severity === \"warning\").length;\n const infoCount = report.issues.filter((i) => i.severity === \"info\").length;\n\n println(chalk.white.bold(\"Problemas encontrados:\"));\n if (criticalCount > 0) println(` ${chalk.red(\"●\")} ${criticalCount} critico(s)`);\n if (warningCount > 0) println(` ${chalk.yellow(\"●\")} ${warningCount} aviso(s)`);\n if (infoCount > 0) println(` ${chalk.blue(\"●\")} ${infoCount} informativo(s)`);\n println();\n\n for (const issue of report.issues) {\n println(\n `${getSeverityIcon(issue.severity)} ${getSeverityLabel(issue.severity)}: ${chalk.white(issue.title)}`\n );\n println(chalk.gray(` ${issue.description}`));\n println(chalk.cyan(` → ${issue.suggestion}`));\n if (issue.autoFixable) {\n println(chalk.green(` ✓ Corrigivel automaticamente`));\n }\n println();\n }\n\n // Summary\n if (report.passed) {\n println(chalk.yellow(\"⚠ Alguns avisos encontrados, mas o sistema deve funcionar.\"));\n } else {\n println(chalk.red(\"✗ Problemas criticos precisam ser resolvidos.\"));\n println(chalk.gray(' Execute \"npx @tostudy-ai/mcp-setup\" para corrigir a configuracao.'));\n }\n println();\n}\n\n/**\n * Export diagnostic report as JSON\n */\nexport function exportDiagnosticReportJson(report: DiagnosticReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n// CLI entry point\nif (process.argv[1]?.endsWith(\"diagnose.js\")) {\n (async () => {\n try {\n const report = await runDiagnostics();\n\n // Check for --json flag\n if (process.argv.includes(\"--json\")) {\n println(exportDiagnosticReportJson(report));\n } else {\n printDiagnosticReport(report);\n }\n\n // Exit with appropriate code\n process.exit(report.passed ? 0 : 1);\n } catch (error) {\n process.stderr.write(chalk.red(\"Erro ao executar diagnostico:\\n\"));\n process.stderr.write((error instanceof Error ? error.message : String(error)) + \"\\n\");\n process.exit(1);\n }\n })();\n}\n","#!/usr/bin/env node\n\n/**\n * MCP Auto-Repair Module\n *\n * Provides automatic repair functions for common MCP configuration issues.\n * Works in conjunction with diagnose.ts to fix detected problems.\n */\n\nimport { existsSync, mkdirSync, writeFileSync, unlinkSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n getClaudeConfigPath,\n readClaudeConfig,\n writeClaudeConfig,\n addTostudyMcpServer,\n extractApiKey,\n extractMcpUrl,\n ClaudeConfig,\n} from \"./config.js\";\nimport { runDiagnostics, DiagnosticIssue, DiagnosticReport } from \"./diagnose.js\";\n\nexport interface RepairResult {\n issueId: string;\n success: boolean;\n message: string;\n action?: string;\n}\n\nexport interface RepairReport {\n timestamp: string;\n repairsAttempted: number;\n repairsSucceeded: number;\n repairsFailed: number;\n results: RepairResult[];\n requiresUserInput: string[];\n}\n\nconst DEFAULT_PLATFORM_URL = \"https://tostudy.ai\";\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\n/**\n * Create missing config directory and empty config file\n */\nfunction repairMissingConfig(): RepairResult {\n const configPath = getClaudeConfigPath();\n const configDir = dirname(configPath);\n\n try {\n // Ensure directory exists\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n // Create empty config with mcpServers\n const initialConfig: ClaudeConfig = {\n mcpServers: {},\n };\n\n writeFileSync(configPath, JSON.stringify(initialConfig, null, 2), \"utf-8\");\n\n return {\n issueId: \"config-missing\",\n success: true,\n message: \"Arquivo de configuracao criado com sucesso.\",\n action: `Criado: ${configPath}`,\n };\n } catch (error) {\n return {\n issueId: \"config-missing\",\n success: false,\n message: `Falha ao criar arquivo de configuracao: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix invalid JSON by backing up and recreating config\n */\nfunction repairInvalidJson(): RepairResult {\n const configPath = getClaudeConfigPath();\n\n try {\n // Backup the corrupted file\n if (existsSync(configPath)) {\n const backupPath = `${configPath}.corrupted.${Date.now()}`;\n copyFileSync(configPath, backupPath);\n\n // Create fresh config\n const freshConfig: ClaudeConfig = {\n mcpServers: {},\n };\n\n writeFileSync(configPath, JSON.stringify(freshConfig, null, 2), \"utf-8\");\n\n return {\n issueId: \"config-invalid-json\",\n success: true,\n message: \"Arquivo de configuracao recriado. Backup salvo.\",\n action: `Backup: ${backupPath}`,\n };\n }\n\n return {\n issueId: \"config-invalid-json\",\n success: false,\n message: \"Arquivo de configuracao nao existe.\",\n };\n } catch (error) {\n return {\n issueId: \"config-invalid-json\",\n success: false,\n message: `Falha ao reparar JSON: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Configure MCP server with provided API key\n */\nfunction repairMcpNotConfigured(\n apiKey: string,\n platformUrl: string = DEFAULT_PLATFORM_URL\n): RepairResult {\n try {\n addTostudyMcpServer(apiKey, platformUrl);\n\n return {\n issueId: \"mcp-not-configured\",\n success: true,\n message: \"Servidor MCP da ToStudy configurado com sucesso.\",\n action: \"Servidor tostudy adicionado\",\n };\n } catch (error) {\n return {\n issueId: \"mcp-not-configured\",\n success: false,\n message: `Falha ao configurar MCP: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix missing API key header\n */\nfunction repairApiKeyMissing(\n apiKey: string,\n platformUrl: string = DEFAULT_PLATFORM_URL\n): RepairResult {\n try {\n // Re-add the server with the correct API key\n addTostudyMcpServer(apiKey, platformUrl);\n\n return {\n issueId: \"api-key-missing\",\n success: true,\n message: \"API key configurada com sucesso.\",\n action: \"Header Authorization adicionado\",\n };\n } catch (error) {\n return {\n issueId: \"api-key-missing\",\n success: false,\n message: `Falha ao configurar API key: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix invalid API key format (supports both SSE and stdio formats)\n */\nfunction repairApiKeyFormat(): RepairResult {\n const config = readClaudeConfig();\n const mcpConfig = config.mcpServers?.[\"tostudy\"];\n\n if (!mcpConfig) {\n return {\n issueId: \"api-key-invalid-format\",\n success: false,\n message: \"Servidor MCP nao esta configurado.\",\n };\n }\n\n try {\n // SSE format: fix headers\n if (mcpConfig.headers) {\n const authHeader = mcpConfig.headers[\"Authorization\"] || \"\";\n if (authHeader && !authHeader.startsWith(\"Bearer \")) {\n mcpConfig.headers[\"Authorization\"] = `Bearer ${authHeader}`;\n writeClaudeConfig(config);\n return {\n issueId: \"api-key-invalid-format\",\n success: true,\n message: \"Formato de API key corrigido.\",\n action: 'Prefixo \"Bearer \" adicionado',\n };\n }\n }\n\n // Stdio format: fix args\n if (mcpConfig.args) {\n for (let i = 0; i < mcpConfig.args.length; i++) {\n if (\n mcpConfig.args[i] === \"--header\" &&\n mcpConfig.args[i + 1]?.startsWith(\"Authorization:\")\n ) {\n const value = mcpConfig.args[i + 1].replace(\"Authorization:\", \"\");\n if (value && !value.startsWith(\"Bearer \")) {\n mcpConfig.args[i + 1] = `Authorization:Bearer ${value}`;\n writeClaudeConfig(config);\n return {\n issueId: \"api-key-invalid-format\",\n success: true,\n message: \"Formato de API key corrigido.\",\n action: 'Prefixo \"Bearer \" adicionado',\n };\n }\n }\n }\n }\n\n return {\n issueId: \"api-key-invalid-format\",\n success: false,\n message: \"API key nao encontrada para corrigir.\",\n };\n } catch (error) {\n return {\n issueId: \"api-key-invalid-format\",\n success: false,\n message: `Falha ao corrigir formato: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix missing or invalid server URL by re-adding with correct config\n */\nfunction repairServerUrl(platformUrl: string = DEFAULT_PLATFORM_URL): RepairResult {\n const config = readClaudeConfig();\n const mcpConfig = config.mcpServers?.[\"tostudy\"];\n\n if (!mcpConfig) {\n return {\n issueId: \"server-url-missing\",\n success: false,\n message: \"Servidor MCP nao esta configurado.\",\n };\n }\n\n try {\n // Extract existing API key to preserve it\n const apiKey = extractApiKey(mcpConfig);\n if (!apiKey) {\n return {\n issueId: \"server-url-missing\",\n success: false,\n message: \"API key nao encontrada para reconstruir configuracao.\",\n };\n }\n\n // Re-add with correct URL using stdio format\n addTostudyMcpServer(apiKey, platformUrl);\n\n return {\n issueId: \"server-url-missing\",\n success: true,\n message: \"URL do servidor configurada.\",\n action: `URL: ${platformUrl}/mcp`,\n };\n } catch (error) {\n return {\n issueId: \"server-url-missing\",\n success: false,\n message: `Falha ao configurar URL: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix URL with wrong protocol\n */\nfunction repairServerUrlProtocol(platformUrl: string = DEFAULT_PLATFORM_URL): RepairResult {\n const config = readClaudeConfig();\n const mcpConfig = config.mcpServers?.[\"tostudy\"];\n\n if (!mcpConfig) {\n return {\n issueId: \"server-url-invalid-protocol\",\n success: false,\n message: \"Servidor MCP nao esta configurado.\",\n };\n }\n\n const url = extractMcpUrl(mcpConfig);\n if (!url) {\n return {\n issueId: \"server-url-invalid-protocol\",\n success: false,\n message: \"URL do servidor nao configurada.\",\n };\n }\n\n try {\n // Fix the protocol to https and re-add\n const fixedUrl = url.replace(/^[a-z]+:/, \"https:\");\n // Extract base platform URL from the fixed URL\n const basePlatformUrl = fixedUrl.replace(/\\/mcp(\\/sse)?$/, \"\");\n const apiKey = extractApiKey(mcpConfig);\n\n if (!apiKey) {\n return {\n issueId: \"server-url-invalid-protocol\",\n success: false,\n message: \"API key nao encontrada para reconstruir configuracao.\",\n };\n }\n\n addTostudyMcpServer(apiKey, basePlatformUrl);\n\n return {\n issueId: \"server-url-invalid-protocol\",\n success: true,\n message: \"Protocolo da URL corrigido para HTTPS.\",\n action: `URL: ${basePlatformUrl}/mcp`,\n };\n } catch (error) {\n return {\n issueId: \"server-url-invalid-protocol\",\n success: false,\n message: `Falha ao corrigir protocolo: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Fix URL missing /mcp path\n */\nfunction repairServerUrlPath(): RepairResult {\n const config = readClaudeConfig();\n const mcpConfig = config.mcpServers?.[\"tostudy\"];\n\n if (!mcpConfig) {\n return {\n issueId: \"server-url-missing-sse-path\",\n success: false,\n message: \"Servidor MCP nao esta configurado.\",\n };\n }\n\n const url = extractMcpUrl(mcpConfig);\n if (!url) {\n return {\n issueId: \"server-url-missing-sse-path\",\n success: false,\n message: \"URL do servidor nao configurada.\",\n };\n }\n\n try {\n const parsedUrl = new URL(url);\n // Extract base URL (strip /mcp or /mcp/sse if present, then re-add /mcp)\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/(mcp(\\/sse)?)?$/, \"\");\n const basePlatformUrl = parsedUrl.toString().replace(/\\/$/, \"\");\n\n const apiKey = extractApiKey(mcpConfig);\n if (!apiKey) {\n return {\n issueId: \"server-url-missing-sse-path\",\n success: false,\n message: \"API key nao encontrada para reconstruir configuracao.\",\n };\n }\n\n addTostudyMcpServer(apiKey, basePlatformUrl);\n\n return {\n issueId: \"server-url-missing-sse-path\",\n success: true,\n message: \"Path /mcp corrigido na URL.\",\n action: `URL: ${basePlatformUrl}/mcp`,\n };\n } catch (error) {\n return {\n issueId: \"server-url-missing-sse-path\",\n success: false,\n message: `Falha ao corrigir path: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Remove duplicate ToStudy/Ana servers, keeping only tostudy\n */\nfunction repairDuplicateServers(): RepairResult {\n const config = readClaudeConfig();\n\n if (!config.mcpServers) {\n return {\n issueId: \"duplicate-servers\",\n success: false,\n message: \"Nenhum servidor MCP configurado.\",\n };\n }\n\n try {\n const servers = Object.entries(config.mcpServers);\n const anaServers = servers.filter(\n ([key, server]) =>\n key.toLowerCase().includes(\"ana\") ||\n key.toLowerCase().includes(\"catalyst\") ||\n (server.url && server.url.includes(\"tostudy.com\"))\n );\n\n if (anaServers.length <= 1) {\n return {\n issueId: \"duplicate-servers\",\n success: true,\n message: \"Nenhuma duplicata encontrada.\",\n };\n }\n\n // Keep the tostudy entry if it exists, otherwise keep the first one\n const primaryKey = anaServers.find(([key]) => key === \"tostudy\")?.[0] || anaServers[0][0];\n const removedKeys: string[] = [];\n\n for (const [key] of anaServers) {\n if (key !== primaryKey) {\n delete config.mcpServers[key];\n removedKeys.push(key);\n }\n }\n\n writeClaudeConfig(config);\n\n return {\n issueId: \"duplicate-servers\",\n success: true,\n message: `${removedKeys.length} servidor(es) duplicado(s) removido(s).`,\n action: `Removidos: ${removedKeys.join(\", \")}`,\n };\n } catch (error) {\n return {\n issueId: \"duplicate-servers\",\n success: false,\n message: `Falha ao remover duplicatas: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Map of issue IDs to their repair functions\n * Some repairs require user input (API key) and are handled separately\n */\ntype RepairFunction = (apiKey?: string, platformUrl?: string) => RepairResult;\n\nconst REPAIR_FUNCTIONS: Record<string, RepairFunction> = {\n \"config-missing\": () => repairMissingConfig(),\n \"config-invalid-json\": () => repairInvalidJson(),\n \"mcp-not-configured\": (apiKey, platformUrl) => {\n if (!apiKey) {\n return {\n issueId: \"mcp-not-configured\",\n success: false,\n message: \"API key necessaria para configurar o MCP.\",\n };\n }\n return repairMcpNotConfigured(apiKey, platformUrl);\n },\n \"api-key-missing\": (apiKey, platformUrl) => {\n if (!apiKey) {\n return {\n issueId: \"api-key-missing\",\n success: false,\n message: \"Nova API key necessaria.\",\n };\n }\n return repairApiKeyMissing(apiKey, platformUrl);\n },\n \"api-key-invalid-format\": () => repairApiKeyFormat(),\n \"api-key-too-short\": (apiKey, platformUrl) => {\n if (!apiKey) {\n return {\n issueId: \"api-key-too-short\",\n success: false,\n message: \"Nova API key necessaria.\",\n };\n }\n return repairApiKeyMissing(apiKey, platformUrl);\n },\n \"server-url-missing\": (_, platformUrl) => repairServerUrl(platformUrl),\n \"server-url-invalid\": (_, platformUrl) => repairServerUrl(platformUrl),\n \"server-url-invalid-protocol\": () => repairServerUrlProtocol(),\n \"server-url-missing-sse-path\": () => repairServerUrlPath(),\n \"auth-failed\": (apiKey, platformUrl) => {\n if (!apiKey) {\n return {\n issueId: \"auth-failed\",\n success: false,\n message: \"Nova API key necessaria. Gere em /student/settings/mcp.\",\n };\n }\n return repairMcpNotConfigured(apiKey, platformUrl);\n },\n \"duplicate-servers\": () => repairDuplicateServers(),\n};\n\n/**\n * Issues that require user input (API key)\n */\nconst ISSUES_REQUIRING_API_KEY = [\n \"mcp-not-configured\",\n \"api-key-missing\",\n \"api-key-too-short\",\n \"auth-failed\",\n];\n\n/**\n * Check if an issue requires user input to repair\n */\nexport function issueRequiresUserInput(issueId: string): boolean {\n return ISSUES_REQUIRING_API_KEY.includes(issueId);\n}\n\n/**\n * Repair a single issue\n */\nexport function repairIssue(\n issue: DiagnosticIssue,\n apiKey?: string,\n platformUrl?: string\n): RepairResult {\n const repairFn = REPAIR_FUNCTIONS[issue.id];\n\n if (!repairFn) {\n return {\n issueId: issue.id,\n success: false,\n message: `Sem funcao de reparo disponivel para: ${issue.id}`,\n };\n }\n\n return repairFn(apiKey, platformUrl);\n}\n\n/**\n * Repair all auto-fixable issues from a diagnostic report\n */\nexport function repairAllIssues(\n report: DiagnosticReport,\n apiKey?: string,\n platformUrl: string = DEFAULT_PLATFORM_URL\n): RepairReport {\n const results: RepairResult[] = [];\n const requiresUserInput: string[] = [];\n let succeeded = 0;\n let failed = 0;\n\n // Filter to auto-fixable issues only\n const fixableIssues = report.issues.filter((issue) => issue.autoFixable);\n\n for (const issue of fixableIssues) {\n // Check if this issue needs user input\n if (issueRequiresUserInput(issue.id) && !apiKey) {\n requiresUserInput.push(issue.id);\n results.push({\n issueId: issue.id,\n success: false,\n message: \"Requer API key para reparar.\",\n });\n failed++;\n continue;\n }\n\n const result = repairIssue(issue, apiKey, platformUrl);\n results.push(result);\n\n if (result.success) {\n succeeded++;\n } else {\n failed++;\n }\n }\n\n return {\n timestamp: new Date().toISOString(),\n repairsAttempted: fixableIssues.length,\n repairsSucceeded: succeeded,\n repairsFailed: failed,\n results,\n requiresUserInput,\n };\n}\n\n/**\n * Run diagnostics and repair all issues automatically\n */\nexport async function diagnoseAndRepair(\n apiKey?: string,\n platformUrl: string = DEFAULT_PLATFORM_URL\n): Promise<{ diagnostic: DiagnosticReport; repair: RepairReport }> {\n const diagnostic = await runDiagnostics();\n const repair = repairAllIssues(diagnostic, apiKey, platformUrl);\n\n return { diagnostic, repair };\n}\n\n/**\n * Print repair report to console\n */\nexport function printRepairReport(report: RepairReport): void {\n println();\n println(chalk.cyan(\" ╔═══════════════════════════════════════╗\"));\n println(\n chalk.cyan(\" ║\") + chalk.white.bold(\" ToStudy MCP Auto-Repair \") + chalk.cyan(\"║\")\n );\n println(chalk.cyan(\" ╚═══════════════════════════════════════╝\"));\n println();\n\n if (report.repairsAttempted === 0) {\n println(chalk.green.bold(\"✓ Nenhum reparo necessario!\"));\n println();\n println(chalk.gray(\"Nenhum problema corrigivel automaticamente foi encontrado.\"));\n println();\n return;\n }\n\n // Summary\n println(chalk.white.bold(\"Resumo:\"));\n println(` Reparos tentados: ${report.repairsAttempted}`);\n println(` ${chalk.green(\"✓ Sucesso:\")} ${report.repairsSucceeded}`);\n if (report.repairsFailed > 0) {\n println(` ${chalk.red(\"✗ Falha:\")} ${report.repairsFailed}`);\n }\n println();\n\n // Results\n println(chalk.white.bold(\"Detalhes:\"));\n println();\n\n for (const result of report.results) {\n if (result.success) {\n println(` ${chalk.green(\"✓\")} ${result.message}`);\n if (result.action) {\n println(chalk.gray(` ${result.action}`));\n }\n } else {\n println(` ${chalk.red(\"✗\")} ${result.message}`);\n }\n }\n println();\n\n // User input required\n if (report.requiresUserInput.length > 0) {\n println(chalk.yellow(\"⚠ Alguns reparos requerem interacao:\"));\n println();\n println(\" Para reparar problemas de API key, execute:\");\n println(chalk.cyan(\" npx @tostudy-ai/mcp-setup repair --api-key <sua-api-key>\"));\n println();\n println(\" Para gerar uma nova API key:\");\n println(chalk.cyan(\" https://tostudy.ai/student/settings/mcp\"));\n println();\n }\n\n // Final status\n if (report.repairsFailed === 0 && report.requiresUserInput.length === 0) {\n println(chalk.green.bold(\"✓ Todos os reparos concluidos com sucesso!\"));\n println(chalk.gray(\" Reinicie o Claude Code para aplicar as mudancas.\"));\n } else if (report.repairsSucceeded > 0) {\n println(chalk.yellow(\"⚠ Alguns reparos foram concluidos, mas outros falharam.\"));\n println(chalk.gray(\" Execute o diagnostico novamente para verificar o status.\"));\n } else {\n println(chalk.red(\"✗ Nenhum reparo foi concluido com sucesso.\"));\n println(chalk.gray(\" Verifique os erros acima e tente novamente.\"));\n }\n println();\n}\n\n/**\n * Export repair report as JSON\n */\nexport function exportRepairReportJson(report: RepairReport): string {\n return JSON.stringify(report, null, 2);\n}\n\n// CLI entry point\nif (process.argv[1]?.endsWith(\"repair.js\")) {\n (async () => {\n try {\n // Parse command line arguments\n let apiKey: string | undefined;\n let platformUrl = DEFAULT_PLATFORM_URL;\n let jsonOutput = false;\n\n for (let i = 2; i < process.argv.length; i++) {\n const arg = process.argv[i];\n if (arg === \"--api-key\" && process.argv[i + 1]) {\n apiKey = process.argv[++i];\n } else if (arg === \"--url\" && process.argv[i + 1]) {\n platformUrl = process.argv[++i];\n } else if (arg === \"--json\") {\n jsonOutput = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n println(\"ToStudy MCP Auto-Repair\");\n println();\n println(\"Usage: node repair.js [options]\");\n println();\n println(\"Options:\");\n println(\" --api-key <key> API key para reparos que necessitam autenticacao\");\n println(\" --url <url> URL da plataforma (default: https://tostudy.ai)\");\n println(\" --json Saida em formato JSON\");\n println(\" --help, -h Mostra esta ajuda\");\n println();\n process.exit(0);\n }\n }\n\n // Check for API key in environment\n if (!apiKey) {\n apiKey = process.env.TOSTUDY_API_KEY;\n }\n\n // Run diagnostics and repair\n const { diagnostic, repair } = await diagnoseAndRepair(apiKey, platformUrl);\n\n // Output results\n if (jsonOutput) {\n println(JSON.stringify({ diagnostic, repair }, null, 2));\n } else {\n printRepairReport(repair);\n }\n\n // Exit code based on repair results\n const hasUnfixedCritical = diagnostic.issues.some(\n (issue) =>\n issue.severity === \"critical\" &&\n !repair.results.find((r) => r.issueId === issue.id && r.success)\n );\n\n process.exit(hasUnfixedCritical ? 1 : 0);\n } catch (error) {\n process.stderr.write(chalk.red(\"Erro ao executar reparo:\\n\"));\n process.stderr.write((error instanceof Error ? error.message : String(error)) + \"\\n\");\n process.exit(1);\n }\n })();\n}\n","/**\n * Claude Code IDE Handler\n *\n * Uses `claude mcp add` CLI command to register the MCP server.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport { type IDEHandler, buildMcpRemoteArgs, verifyHeartbeat } from \"./base.js\";\nimport { prompt } from \"../prompts.js\";\n\nexport type ClaudeCodeScope = \"user\" | \"project\";\n\nexport function parseClaudeCodeScope(answer: string): ClaudeCodeScope {\n return answer.trim().toLowerCase().startsWith(\"l\") ? \"project\" : \"user\";\n}\n\nexport async function promptClaudeCodeScope(\n promptFn: (question: string) => Promise<string> = prompt\n): Promise<ClaudeCodeScope> {\n const answer = await promptFn(\n \" Claude Code: configurar global ou local? (g/l, padrão: global) \"\n );\n return parseClaudeCodeScope(answer);\n}\n\nexport function buildClaudeCodeAddArgs(\n apiKey: string,\n mcpUrl: string,\n scope: ClaudeCodeScope\n): string[] {\n return [\n \"mcp\",\n \"add\",\n \"tostudy\",\n \"--scope\",\n scope,\n \"--\",\n \"npx\",\n ...buildMcpRemoteArgs(apiKey, mcpUrl, \"claude-code\"),\n ];\n}\n\nexport function buildClaudeCodeRemoveArgs(scope: ClaudeCodeScope): string[] {\n return [\"mcp\", \"remove\", \"tostudy\", \"--scope\", scope];\n}\n\nexport class ClaudeCodeHandler implements IDEHandler {\n id = \"claude-code\";\n name = \"Claude Code\";\n\n async detect(): Promise<boolean> {\n try {\n execFileSync(\"which\", [\"claude\"], { stdio: \"ignore\" });\n return true;\n } catch {\n try {\n execFileSync(\"where\", [\"claude\"], { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n }\n }\n\n getConfigPath(): string {\n return \"Terminal (claude mcp add)\";\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const scope = await promptClaudeCodeScope();\n const addArgs = buildClaudeCodeAddArgs(apiKey, mcpUrl, scope);\n const removeArgs = buildClaudeCodeRemoveArgs(scope);\n\n try {\n // First try to remove existing entry (ignore errors if it doesn't exist)\n try {\n execFileSync(\"claude\", removeArgs, { stdio: \"ignore\" });\n } catch {\n // Ignore - entry may not exist\n }\n\n execFileSync(\"claude\", addArgs, { stdio: \"inherit\" });\n } catch (error) {\n throw new Error(\n `Failed to run 'claude mcp add'. Is Claude Code installed?\\n` +\n `Error: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * IDE Handler Interface\n *\n * Each IDE has a handler that knows how to write MCP config\n * to the correct location in the correct format.\n */\nimport { platform } from 'node:os';\n\ntype ClientOsHeader = 'macos' | 'windows' | 'linux';\n\nexport interface IDEHandler {\n /** Handler identifier (matches IDEMethod type) */\n id: string;\n /** Human-readable name */\n name: string;\n /** Check if this IDE is likely installed */\n detect(): Promise<boolean>;\n /** Path where the config file lives */\n getConfigPath(): string;\n /** Write/merge MCP config for this IDE */\n writeConfig(apiKey: string, mcpUrl: string): Promise<void>;\n /** Verify connection via heartbeat */\n verify(apiKey: string, mcpUrl: string): Promise<boolean>;\n}\n\n/**\n * Build the mcp-remote args array used by most IDE handlers.\n */\nexport function buildMcpRemoteArgs(apiKey: string, mcpUrl: string, ide: string): string[] {\n const osHeader = getClientOsHeaderValue();\n\n return [\n '-y',\n 'mcp-remote',\n `${mcpUrl}/mcp`,\n '--header',\n `Authorization:Bearer ${apiKey}`,\n '--header',\n `X-Tostudy-Client-IDE:${ide}`,\n '--header',\n `X-Tostudy-Client-OS:${osHeader}`,\n ];\n}\n\n/**\n * Build the tostudy MCP server entry for stdio-based configs.\n */\nexport function buildTostudyServerEntry(apiKey: string, mcpUrl: string, ide: string) {\n return {\n command: 'npx',\n args: buildMcpRemoteArgs(apiKey, mcpUrl, ide),\n };\n}\n\n/**\n * Normalize current OS to the MCP metadata header format.\n */\nexport function getClientOsHeaderValue(): ClientOsHeader {\n switch (platform()) {\n case 'darwin':\n return 'macos';\n case 'win32':\n return 'windows';\n default:\n return 'linux';\n }\n}\n\n/**\n * Verify connection by hitting the platform heartbeat endpoint.\n */\nexport async function verifyHeartbeat(apiKey: string, platformUrl: string): Promise<boolean> {\n try {\n const response = await fetch(`${platformUrl}/api/mcp/heartbeat`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ timestamp: new Date().toISOString() }),\n });\n return response.ok || response.status === 204;\n } catch {\n return false;\n }\n}\n","/**\n * Cursor IDE Handler\n *\n * Writes to ~/.cursor/mcp.json with { mcpServers: { tostudy: ... } }\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir, platform } from 'node:os';\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from './base.js';\n\nexport class CursorHandler implements IDEHandler {\n id = 'cursor';\n name = 'Cursor';\n\n async detect(): Promise<boolean> {\n const home = homedir();\n const os = platform();\n\n switch (os) {\n case 'darwin':\n return existsSync(join('/Applications', 'Cursor.app')) ||\n existsSync(join(home, 'Applications', 'Cursor.app'));\n case 'win32': {\n const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');\n return existsSync(join(localAppData, 'Programs', 'cursor', 'Cursor.exe'));\n }\n case 'linux':\n return existsSync(join(home, '.cursor'));\n default:\n return false;\n }\n }\n\n getConfigPath(): string {\n const home = homedir();\n return join(home, '.cursor', 'mcp.json');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n // Ensure directory exists\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n // Read existing config to preserve other servers\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n // Start fresh if config is corrupted\n }\n }\n\n // Merge - only update tostudy entry\n const mcpServers = (config.mcpServers as Record<string, unknown>) ?? {};\n mcpServers['tostudy'] = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.mcpServers = mcpServers;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * VS Code IDE Handler\n *\n * Writes to .vscode/mcp.json with { servers: { tostudy: ... } }\n * Note: VS Code uses \"servers\" (not \"mcpServers\") in its config format.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir, platform } from 'node:os';\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from './base.js';\n\nexport class VSCodeHandler implements IDEHandler {\n id = 'vscode';\n name = 'VS Code';\n\n async detect(): Promise<boolean> {\n const home = homedir();\n const os = platform();\n\n switch (os) {\n case 'darwin':\n return existsSync(join('/Applications', 'Visual Studio Code.app')) ||\n existsSync(join(home, 'Applications', 'Visual Studio Code.app'));\n case 'win32': {\n const programFiles = process.env.ProgramFiles || 'C:\\\\Program Files';\n const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');\n return existsSync(join(programFiles, 'Microsoft VS Code', 'Code.exe')) ||\n existsSync(join(localAppData, 'Programs', 'Microsoft VS Code', 'Code.exe'));\n }\n case 'linux':\n return existsSync('/usr/bin/code') || existsSync('/usr/local/bin/code');\n default:\n return false;\n }\n }\n\n getConfigPath(): string {\n // VS Code MCP config is per-workspace: .vscode/mcp.json\n return join(process.cwd(), '.vscode', 'mcp.json');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n // Start fresh\n }\n }\n\n // VS Code uses \"servers\" key\n const servers = (config.servers as Record<string, unknown>) ?? {};\n servers['tostudy'] = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.servers = servers;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * Claude Desktop IDE Handler\n *\n * Writes to ~/Library/Application Support/Claude/claude_desktop_config.json\n * using stdio transport (command + args) via mcp-remote.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from \"./base.js\";\nimport { isClaudeInstalled, getClaudeConfigPath } from \"../config.js\";\n\nexport class DesktopHandler implements IDEHandler {\n id = \"desktop\";\n name = \"Claude Desktop\";\n\n async detect(): Promise<boolean> {\n return isClaudeInstalled();\n }\n\n getConfigPath(): string {\n return getClaudeConfigPath();\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n // Ensure directory exists\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n // Read existing config to preserve other servers and preferences\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch {\n // Start fresh if config is corrupted\n }\n\n // Backup existing config\n const backupPath = `${configPath}.backup`;\n copyFileSync(configPath, backupPath);\n }\n\n // Merge - only update tostudy entry using stdio transport (command + args)\n const mcpServers = (config.mcpServers as Record<string, unknown>) ?? {};\n mcpServers[\"tostudy\"] = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.mcpServers = mcpServers;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), \"utf-8\");\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * Windsurf IDE Handler\n *\n * Writes to ~/.codeium/windsurf/mcp_config.json\n * with { mcpServers: { tostudy: ... } }.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from './base.js';\n\nexport class WindsurfHandler implements IDEHandler {\n id = 'windsurf';\n name = 'Windsurf';\n\n async detect(): Promise<boolean> {\n const home = homedir();\n return existsSync(join(home, '.codeium', 'windsurf')) ||\n existsSync(join(home, '.codeium', 'windsurf', 'mcp_config.json'));\n }\n\n getConfigPath(): string {\n return join(homedir(), '.codeium', 'windsurf', 'mcp_config.json');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n // Start fresh if config is corrupted\n }\n }\n\n const mcpServers = (config.mcpServers as Record<string, unknown>) ?? {};\n mcpServers.tostudy = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.mcpServers = mcpServers;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * OpenCode IDE Handler\n *\n * Writes to ~/.opencode/opencode.json with { mcp: { tostudy: ... } }\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from './base.js';\n\nexport class OpenCodeHandler implements IDEHandler {\n id = 'opencode';\n name = 'OpenCode';\n\n async detect(): Promise<boolean> {\n try {\n execFileSync('which', ['opencode'], { stdio: 'ignore' });\n return true;\n } catch {\n try {\n execFileSync('where', ['opencode'], { stdio: 'ignore' });\n return true;\n } catch {\n return existsSync(join(homedir(), '.opencode'));\n }\n }\n }\n\n getConfigPath(): string {\n return join(homedir(), '.opencode', 'opencode.json');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n // Start fresh\n }\n }\n\n // OpenCode uses \"mcp\" key\n const mcp = (config.mcp as Record<string, unknown>) ?? {};\n mcp['tostudy'] = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.mcp = mcp;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * Codex IDE Handler\n *\n * Uses `codex mcp add` CLI command to register the MCP server.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { type IDEHandler, buildMcpRemoteArgs, verifyHeartbeat } from './base.js';\n\nexport class CodexHandler implements IDEHandler {\n id = 'codex';\n name = 'Codex';\n\n async detect(): Promise<boolean> {\n try {\n execFileSync('which', ['codex'], { stdio: 'ignore' });\n return true;\n } catch {\n try {\n execFileSync('where', ['codex'], { stdio: 'ignore' });\n return true;\n } catch {\n return existsSync(join(homedir(), '.codex'));\n }\n }\n }\n\n getConfigPath(): string {\n return join(homedir(), '.codex', 'config.toml');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const args = buildMcpRemoteArgs(apiKey, mcpUrl, this.id);\n\n try {\n // First try to remove existing entry (ignore errors if it doesn't exist)\n try {\n execFileSync('codex', ['mcp', 'remove', 'tostudy'], { stdio: 'ignore' });\n } catch {\n // Ignore - entry may not exist\n }\n\n execFileSync('codex', ['mcp', 'add', 'tostudy', '--', 'npx', ...args], { stdio: 'inherit' });\n } catch (error) {\n throw new Error(\n `Failed to run 'codex mcp add'. Is Codex installed?\\n` +\n `Error: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * Antigravity IDE Handler\n *\n * Writes to ~/.gemini/antigravity/mcp_config.json\n * with { mcpServers: { tostudy: ... } }.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from './base.js';\n\nexport class AntigravityHandler implements IDEHandler {\n id = 'antigravity';\n name = 'Antigravity';\n\n async detect(): Promise<boolean> {\n const home = homedir();\n return existsSync(join(home, '.gemini', 'antigravity')) ||\n existsSync(join(home, '.gemini', 'antigravity', 'mcp_config.json'));\n }\n\n getConfigPath(): string {\n return join(homedir(), '.gemini', 'antigravity', 'mcp_config.json');\n }\n\n async writeConfig(apiKey: string, mcpUrl: string): Promise<void> {\n const configPath = this.getConfigPath();\n const configDir = dirname(configPath);\n\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true });\n }\n\n let config: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n try {\n config = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch {\n // Start fresh if config is corrupted\n }\n }\n\n const mcpServers = (config.mcpServers as Record<string, unknown>) ?? {};\n mcpServers.tostudy = buildTostudyServerEntry(apiKey, mcpUrl, this.id);\n config.mcpServers = mcpServers;\n\n writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * Manual Handler\n *\n * Prints the config to stdout for the user to copy-paste.\n * Does not write to any file.\n */\n\nimport chalk from \"chalk\";\nimport { type IDEHandler, buildTostudyServerEntry, verifyHeartbeat } from \"./base.js\";\n\nconst TOKEN_PLACEHOLDER = \"<SUBSTITUA_PELO_SEU_TOKEN_TOSTUDY>\";\n\nexport class ManualHandler implements IDEHandler {\n id = \"manual\";\n name = \"Manual\";\n\n async detect(): Promise<boolean> {\n return true; // Always available\n }\n\n getConfigPath(): string {\n return \"stdout\";\n }\n\n async writeConfig(_apiKey: string, mcpUrl: string): Promise<void> {\n const config = {\n mcpServers: {\n tostudy: buildTostudyServerEntry(TOKEN_PLACEHOLDER, mcpUrl, this.id),\n },\n };\n\n process.stdout.write(\"\\n\");\n process.stdout.write(\n chalk.cyan(\n \"Add the following to your MCP config and replace the token placeholder manually:\\n\"\n )\n );\n process.stdout.write(\"\\n\");\n process.stdout.write(JSON.stringify(config, null, 2));\n process.stdout.write(\"\\n\\n\");\n }\n\n async verify(apiKey: string, mcpUrl: string): Promise<boolean> {\n return verifyHeartbeat(apiKey, mcpUrl);\n }\n}\n","/**\n * IDE Handler Factory\n *\n * Registry of all supported IDE handlers.\n */\n\nimport { type IDEHandler } from './base.js';\nimport { ClaudeCodeHandler } from './claude-code.js';\nimport { CursorHandler } from './cursor.js';\nimport { VSCodeHandler } from './vscode.js';\nimport { DesktopHandler } from './desktop.js';\nimport { WindsurfHandler } from './windsurf.js';\nimport { OpenCodeHandler } from './opencode.js';\nimport { CodexHandler } from './codex.js';\nimport { AntigravityHandler } from './antigravity.js';\nimport { ManualHandler } from './manual.js';\n\nexport type SupportedIDE =\n | 'claude-code'\n | 'cursor'\n | 'vscode'\n | 'desktop'\n | 'windsurf'\n | 'opencode'\n | 'codex'\n | 'antigravity'\n | 'manual';\n\nconst handlers: Record<SupportedIDE, () => IDEHandler> = {\n 'claude-code': () => new ClaudeCodeHandler(),\n 'cursor': () => new CursorHandler(),\n 'vscode': () => new VSCodeHandler(),\n 'desktop': () => new DesktopHandler(),\n 'windsurf': () => new WindsurfHandler(),\n 'opencode': () => new OpenCodeHandler(),\n 'codex': () => new CodexHandler(),\n 'antigravity': () => new AntigravityHandler(),\n 'manual': () => new ManualHandler(),\n};\n\n/**\n * Get an IDE handler by type.\n */\nexport function getIDEHandler(ide: SupportedIDE): IDEHandler {\n const factory = handlers[ide];\n if (!factory) {\n throw new Error(`Unknown IDE: ${ide}. Supported: ${Object.keys(handlers).join(', ')}`);\n }\n return factory();\n}\n\n/**\n * Get all available IDE handlers.\n */\nexport function getAllIDEHandlers(): IDEHandler[] {\n return Object.values(handlers).map((factory) => factory());\n}\n\n/**\n * Detect which IDEs are installed.\n */\nexport async function detectInstalledIDEs(): Promise<IDEHandler[]> {\n const all = getAllIDEHandlers();\n const results: IDEHandler[] = [];\n\n for (const handler of all) {\n if (await handler.detect()) {\n results.push(handler);\n }\n }\n\n return results;\n}\n\nexport { type IDEHandler } from './base.js';\n","export const NEXT_STEPS_TITLE = \" Próximos passos:\";\nexport const ASSISTANT_COURSES_PROMPT = ' Peça ao assistente: \"mostre meus cursos\"';\nexport const COURSES_TOOL_HINT = ' Use a ferramenta \"courses\" para ver seus cursos';\n\nexport const API_KEY_DEPRECATION_WARNING =\n \"⚠ The --api-key flag is deprecated and will be removed in a future version. Use the default OAuth flow instead: npx @tostudy-ai/mcp-setup\";\n","/**\n * Local HTTP server that captures the OAuth callback code.\n *\n * Listens on a given port for the browser redirect from\n * /api/cli/auth/authorize, extracts the code parameter,\n * serves a polished success page, and resolves.\n */\nimport http from \"node:http\";\nimport { getCallbackPageHtml } from \"./callback-page.js\";\n\nexport function startCallbackServer(port: number): Promise<{ code: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url!, `http://localhost:${port}`);\n if (url.pathname === \"/callback\") {\n const code = url.searchParams.get(\"code\");\n if (code) {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(getCallbackPageHtml());\n server.close();\n resolve({ code });\n } else {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing code\");\n }\n } else {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Not found\");\n }\n });\n\n server.listen(port, () => {});\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n reject(new Error(`Porta ${port} em uso. Tente novamente ou use --api-key.`));\n } else {\n reject(err);\n }\n });\n\n // Timeout after 2 minutes (unref so it doesn't block process exit)\n const timeoutId = setTimeout(() => {\n server.close();\n reject(new Error(\"Login timeout — nenhuma resposta em 2 minutos.\"));\n }, 120_000);\n timeoutId.unref();\n });\n}\n","/**\n * Polished HTML callback page served after successful OAuth.\n * Dark theme, animated checkmark, auto-close after 3 seconds.\n */\nexport function getCallbackPageHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>ToStudy — Autenticado</title>\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n background: #0a0a0a;\n color: #fafafa;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n }\n .container {\n text-align: center;\n padding: 2rem;\n }\n .checkmark-circle {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n border: 3px solid #22d3ee;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 1.5rem;\n animation: scaleIn 0.4s ease-out;\n }\n .checkmark {\n width: 40px;\n height: 40px;\n stroke: #22d3ee;\n stroke-width: 3;\n fill: none;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-dasharray: 50;\n stroke-dashoffset: 50;\n animation: draw 0.5s ease-out 0.3s forwards;\n }\n h1 {\n font-size: 1.5rem;\n font-weight: 600;\n margin-bottom: 0.5rem;\n }\n .subtitle {\n color: #a1a1aa;\n font-size: 0.95rem;\n margin-bottom: 0.25rem;\n }\n .brand {\n color: #22d3ee;\n font-size: 0.85rem;\n margin-top: 2rem;\n letter-spacing: 0.05em;\n }\n @keyframes scaleIn {\n from { transform: scale(0); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n @keyframes draw {\n to { stroke-dashoffset: 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"checkmark-circle\">\n <svg class=\"checkmark\" viewBox=\"0 0 40 40\">\n <polyline points=\"12,20 18,26 28,14\" />\n </svg>\n </div>\n <h1>Autenticado com sucesso!</h1>\n <p class=\"subtitle\">Pode voltar ao terminal.</p>\n <p class=\"subtitle\" id=\"close-msg\">Esta aba será fechada automaticamente.</p>\n <p class=\"brand\">ToStudy</p>\n </div>\n <script>\n setTimeout(function() {\n window.close();\n document.getElementById('close-msg').textContent = 'Pode fechar esta aba manualmente.';\n }, 3000);\n </script>\n</body>\n</html>`;\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport {\n detectRunningIDE as detectRunningIDECore,\n detectWorkspaceScenario as detectWorkspaceScenarioCore,\n generateInstructions,\n renderForIDE,\n type CourseContext,\n type IDEInfo,\n type WorkspaceInfo,\n} from \"@repo/mcp-cli-core\";\nimport { confirm, promptCourseSelection } from \"../prompts.js\";\nimport { verifyHeartbeat } from \"../ide-handlers/base.js\";\nimport {\n appendCourseMetadata,\n detectInstructionMode,\n fetchCourses as fetchCoursesContext,\n fetchCourseContext,\n resolveDetectedIde,\n} from \"./shared.js\";\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\nexport interface InitOptions {\n apiKey: string;\n platformUrl: string;\n courseId?: string;\n}\n\ninterface InitDependencies {\n cwd?: string;\n detectRunningIDE?: () => Promise<IDEInfo | null>;\n detectWorkspaceScenario?: (cwd: string) => Promise<WorkspaceInfo>;\n verifyHeartbeat?: (apiKey: string, platformUrl: string) => Promise<boolean>;\n fetchCourses?: (apiKey: string, platformUrl: string) => Promise<CourseContext[]>;\n fetchCourse?: (\n courseId: string,\n apiKey: string,\n platformUrl: string\n ) => Promise<CourseContext | null>;\n promptForCourse?: (courses: CourseContext[]) => Promise<string | null>;\n confirmOverwrite?: (question: string, defaultValue?: boolean) => Promise<boolean>;\n}\n\nexport type InitResult =\n | { ok: true; outputPath: string; mode: \"mcp\" | \"cli\"; courseId: string }\n | { ok: false; reason: \"course_required\" | \"course_not_found\" | \"cancelled\" };\n\nexport async function runInit(\n options: InitOptions,\n dependencies: InitDependencies = {}\n): Promise<InitResult> {\n const cwd = dependencies.cwd ?? process.cwd();\n const detectRunningIDE = dependencies.detectRunningIDE ?? detectRunningIDECore;\n const detectWorkspaceScenario =\n dependencies.detectWorkspaceScenario ?? detectWorkspaceScenarioCore;\n const verify = dependencies.verifyHeartbeat ?? verifyHeartbeat;\n const fetchCourses = dependencies.fetchCourses ?? fetchCoursesContext;\n const fetchCourse = dependencies.fetchCourse ?? fetchCourseContext;\n const promptForCourse = dependencies.promptForCourse ?? promptCourseSelection;\n const confirmOverwrite = dependencies.confirmOverwrite ?? confirm;\n let selectedCourseId = options.courseId;\n let course = selectedCourseId\n ? await fetchCourse(selectedCourseId, options.apiKey, options.platformUrl)\n : null;\n\n if (!selectedCourseId) {\n const availableCourses = await fetchCourses(options.apiKey, options.platformUrl);\n\n if (availableCourses.length === 0) {\n println(\n chalk.yellow(\n ' Nenhum curso MCP ativo encontrado. Use \"--course <id>\" ou configure um curso compatível na plataforma.'\n )\n );\n return { ok: false, reason: \"course_required\" };\n }\n\n if (availableCourses.length === 1) {\n course = availableCourses[0] ?? null;\n selectedCourseId = course?.id;\n println(chalk.cyan(` Curso selecionado automaticamente: ${course?.title}`));\n } else {\n const promptedCourseId = await promptForCourse(availableCourses);\n\n if (!promptedCourseId) {\n println(chalk.yellow(\" Seleção de curso cancelada.\"));\n return { ok: false, reason: \"cancelled\" };\n }\n\n selectedCourseId = promptedCourseId;\n course =\n availableCourses.find((availableCourse) => availableCourse.id === selectedCourseId) ?? null;\n }\n }\n\n const ide = await detectRunningIDE();\n const workspace = await detectWorkspaceScenario(cwd);\n const mode = await detectInstructionMode(options.apiKey, options.platformUrl, verify);\n\n if (!course) {\n println(chalk.red(` Não foi possível carregar o curso ${selectedCourseId ?? \"selecionado\"}.`));\n return { ok: false, reason: \"course_not_found\" };\n }\n\n const instructionContent = appendCourseMetadata(\n generateInstructions(course, {\n mode,\n ide: resolveDetectedIde(ide),\n locale: \"pt-BR\",\n }),\n course.id\n );\n const rendered = renderForIDE(instructionContent, resolveDetectedIde(ide), workspace.scenario);\n const outputPath = join(cwd, rendered.filePath);\n\n if (existsSync(outputPath)) {\n const shouldOverwrite = await confirmOverwrite(\n ` ${rendered.filePath} já existe. Sobrescrever?`,\n true\n );\n\n if (!shouldOverwrite) {\n println(chalk.yellow(\" Cancelado pelo usuário.\"));\n return { ok: false, reason: \"cancelled\" };\n }\n }\n\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, rendered.content, \"utf-8\");\n\n println(chalk.green(` ✓ Workspace configurado em ${rendered.filePath}`));\n return {\n ok: true,\n outputPath,\n mode,\n courseId: course.id,\n };\n}\n","import type { IDEInfo, SupportedIDE } from \"./types.js\";\n\ninterface IDEDetectionRule {\n id: SupportedIDE;\n name: string;\n envVars: string[];\n}\n\nconst IDE_DETECTION_RULES: IDEDetectionRule[] = [\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n envVars: [\"CLAUDE_CODE\"],\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n envVars: [\"CURSOR_TRACE_ID\", \"CURSOR_CHANNEL\"],\n },\n {\n id: \"codex\",\n name: \"Codex\",\n envVars: [\"CODEX\"],\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n envVars: [\"WINDSURF_PID\"],\n },\n {\n id: \"vscode\",\n name: \"VS Code\",\n envVars: [\"VSCODE_PID\", \"VSCODE_IPC_HOOK\"],\n },\n];\n\nexport async function detectRunningIDE(): Promise<IDEInfo | null> {\n for (const rule of IDE_DETECTION_RULES) {\n if (rule.envVars.some((envVar) => process.env[envVar] !== undefined)) {\n return {\n id: rule.id,\n name: rule.name,\n detected: true,\n };\n }\n }\n\n if (process.env.TERM_PROGRAM?.toLowerCase().includes(\"vscode\")) {\n return {\n id: \"vscode\",\n name: \"VS Code\",\n detected: true,\n };\n }\n\n return null;\n}\n","import * as childProcess from \"node:child_process\";\n\nimport type { NodeInfo } from \"./types.js\";\n\ntype ExecFileSync = typeof childProcess.execFileSync;\n\nexport async function detectNodeJS(\n execFileSyncImpl: ExecFileSync = childProcess.execFileSync\n): Promise<NodeInfo | null> {\n try {\n const versionOutput = execFileSyncImpl(\"node\", [\"--version\"], {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const version = versionOutput.trim().replace(/^v/, \"\");\n const major = Number.parseInt(version.split(\".\")[0] ?? \"\", 10);\n\n if (Number.isNaN(major)) {\n return null;\n }\n\n let path = \"node\";\n\n try {\n path = execFileSyncImpl(\"which\", [\"node\"], {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n try {\n path =\n execFileSyncImpl(\"where\", [\"node\"], {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n })\n .trim()\n .split(/\\r?\\n/)[0] || \"node\";\n } catch {\n path = \"node\";\n }\n }\n\n return {\n version,\n path,\n major,\n };\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport type { WorkspaceInfo } from \"./types.js\";\n\nexport async function detectWorkspaceScenario(cwd: string): Promise<WorkspaceInfo> {\n const hasAgentsMd = existsSync(join(cwd, \"AGENTS.md\")) || existsSync(join(cwd, \"CLAUDE.md\"));\n const hasCursorRules = existsSync(join(cwd, \".cursor\", \"rules\"));\n const hasCopilotInstructions = existsSync(join(cwd, \".github\", \"copilot-instructions.md\"));\n\n return {\n scenario: hasAgentsMd ? \"existing\" : \"empty\",\n cwd,\n hasAgentsMd,\n hasCursorRules,\n hasCopilotInstructions,\n };\n}\n","import type { CourseContext, CourseModule, InstructionOptions, ToolInfo } from \"./types.js\";\n\nconst CLI_COMMANDS: ToolInfo[] = [\n { command: \"tostudy start\", description: \"Carrega o próximo módulo\", category: \"learning\" },\n { command: \"tostudy next\", description: \"Avança para a próxima lição\", category: \"learning\" },\n {\n command: \"tostudy hint\",\n description: \"Mostra dicas progressivas para o exercício atual\",\n category: \"learning\",\n },\n {\n command: \"tostudy validate\",\n description: \"Valida o exercício antes de avançar\",\n category: \"learning\",\n },\n { command: \"tostudy progress\", description: \"Mostra o progresso do curso\", category: \"learning\" },\n {\n command: \"tostudy workspace\",\n description: \"Cria ou atualiza o workspace local\",\n category: \"workspace\",\n },\n];\n\nfunction formatModuleMarker(module: CourseModule, currentModule: number): string {\n if (module.completed) {\n return \"✅\";\n }\n\n if (module.order === currentModule) {\n return \"🔄\";\n }\n\n return \"⬚\";\n}\n\nfunction formatModuleList(modules: CourseModule[], currentModule: number): string {\n return [...modules]\n .sort((left, right) => left.order - right.order)\n .map((module) => {\n const suffix = module.order === currentModule ? \" (atual)\" : \"\";\n return `${module.order}. ${formatModuleMarker(module, currentModule)} ${module.title}${suffix}`;\n })\n .join(\"\\n\");\n}\n\nfunction formatToolList(tools: ToolInfo[]): string {\n return tools.map((tool) => `- \\`${tool.command}\\` — ${tool.description}`).join(\"\\n\");\n}\n\nfunction generateMcpContent(course: CourseContext): string {\n const learningTools = course.availableTools.filter((tool) => tool.category === \"learning\");\n const workspaceTools = course.availableTools.filter((tool) => tool.category === \"workspace\");\n const hintTool = learningTools.find((tool) => tool.command.includes(\"hint\"));\n const validateTool = learningTools.find((tool) => tool.command.includes(\"validate\"));\n\n return `# ${course.title} — Guia de Estudo\n\n## Progresso Atual\n\n- Módulo ${course.currentModule} de ${course.totalModules} (${course.progressPercent}% completo)\n- Lição atual: ${course.currentModule}.${course.currentLesson} — ${course.currentLessonTitle}\n\n## Tools Disponíveis (MCP)\n\n### Aprendizado\n\n${formatToolList(learningTools)}\n\n${\n workspaceTools.length > 0\n ? `### Workspace\n\n${formatToolList(workspaceTools)}\n\n`\n : \"\"\n}## Como Guiar o Aluno\n\n- Apresente o conteúdo da lição antes de propor exercícios\n${hintTool ? `- Use \\`${hintTool.command}\\` antes de entregar a resposta` : \"\"}\n${validateTool ? `- Valide com \\`${validateTool.command}\\` antes de avançar` : \"\"}\n- Respeite a sequência dos módulos\n\n## Módulos\n\n${formatModuleList(course.modules, course.currentModule)}\n\n---\n\n_ToStudy Platform — Criado por ${course.creator.name}_\n_Atualizado via \\`tostudy sync\\`_`;\n}\n\nfunction generateCliContent(course: CourseContext): string {\n const learningCommands = CLI_COMMANDS.filter((tool) => tool.category === \"learning\");\n const workspaceCommands = CLI_COMMANDS.filter((tool) => tool.category === \"workspace\");\n\n return `# ${course.title} — Guia de Estudo\n\n## Progresso Atual\n\n- Módulo ${course.currentModule} de ${course.totalModules} (${course.progressPercent}% completo)\n- Lição atual: ${course.currentModule}.${course.currentLesson} — ${course.currentLessonTitle}\n\n## Comandos CLI Disponíveis\n\n### Aprendizado\n\n${formatToolList(learningCommands)}\n\n### Workspace\n\n${formatToolList(workspaceCommands)}\n\n## Como Guiar o Aluno\n\n- Instrua o aluno a rodar comandos no terminal\n- Leia a saída dos comandos para orientar o próximo passo\n- Use \\`tostudy hint\\` antes de dar respostas diretas\n- Respeite a sequência dos módulos\n\n## Módulos\n\n${formatModuleList(course.modules, course.currentModule)}\n\n---\n\n_ToStudy Platform — Criado por ${course.creator.name}_\n_Atualizado via \\`tostudy sync\\`_`;\n}\n\nexport function generateInstructions(course: CourseContext, options: InstructionOptions): string {\n if (options.mode === \"cli\") {\n return generateCliContent(course);\n }\n\n return generateMcpContent(course);\n}\n","import type { RenderedInstruction, SupportedIDE, WorkspaceScenario } from \"./types.js\";\n\nfunction getAgentsMdPath(scenario: WorkspaceScenario): string {\n return scenario === \"existing\" ? \".tostudy/AGENTS.md\" : \"AGENTS.md\";\n}\n\nfunction renderCursorMdc(content: string): RenderedInstruction {\n const title = content.match(/^# (.+)$/m)?.[1] ?? \"ToStudy Course Guide\";\n\n return {\n filePath: \".cursor/rules/tostudy.mdc\",\n content: `---\ndescription: ${title}\nglobs: [\"**/*\"]\nalwaysApply: true\n---\n\n${content}`,\n };\n}\n\nexport function renderForIDE(\n content: string,\n ide: SupportedIDE,\n scenario: WorkspaceScenario\n): RenderedInstruction {\n switch (ide) {\n case \"cursor\":\n return renderCursorMdc(content);\n case \"copilot\":\n return {\n filePath: \".github/copilot-instructions.md\",\n content,\n };\n case \"claude-code\":\n case \"codex\":\n case \"vscode\":\n case \"windsurf\":\n case \"opencode\":\n case \"antigravity\":\n case \"manual\":\n default:\n return {\n filePath: getAgentsMdPath(scenario),\n content,\n };\n }\n}\n","import type {\n CourseContext,\n IDEInfo,\n InstructionMode,\n SupportedIDE,\n WorkspaceScenario,\n} from \"@repo/mcp-cli-core\";\n\nexport const COURSE_ID_COMMENT_PREFIX = \"<!-- tostudy-course-id:\";\n\nconst DEFAULT_AVAILABLE_TOOLS: CourseContext[\"availableTools\"] = [\n { command: \"start_module\", description: \"Carrega o próximo módulo\", category: \"learning\" },\n { command: \"next_lesson\", description: \"Avança para a próxima lição\", category: \"learning\" },\n { command: \"get_hint\", description: \"Mostra dicas progressivas\", category: \"learning\" },\n { command: \"validate_solution\", description: \"Valida o exercício atual\", category: \"learning\" },\n { command: \"get_progress\", description: \"Mostra o progresso do curso\", category: \"learning\" },\n {\n command: \"setup_workspace\",\n description: \"Configura o workspace do aluno\",\n category: \"workspace\",\n },\n];\n\ninterface PlatformCourseModule {\n title: string;\n order: number;\n completed: boolean;\n}\n\ninterface PlatformCourseSummary {\n id: string;\n title: string;\n description: string | null;\n modules: PlatformCourseModule[];\n currentModule: number;\n currentLesson: number;\n currentLessonTitle: string;\n progressPercent: number;\n totalModules: number;\n creator: { name: string };\n}\n\ninterface PlatformCourseSummaryResponse {\n courses: PlatformCourseSummary[];\n}\n\nexport function normalizeCourseContext(\n course: CourseContext | PlatformCourseSummary\n): CourseContext {\n if (\"availableTools\" in course) {\n return course;\n }\n\n return {\n id: course.id,\n title: course.title,\n description: course.description ?? \"\",\n modules: course.modules,\n currentModule: course.currentModule,\n currentLesson: course.currentLesson,\n currentLessonTitle: course.currentLessonTitle,\n progressPercent: course.progressPercent,\n totalModules: course.totalModules || course.modules.length || 1,\n creator: { name: course.creator.name },\n availableTools: DEFAULT_AVAILABLE_TOOLS,\n };\n}\n\nexport async function fetchCourses(apiKey: string, platformUrl: string): Promise<CourseContext[]> {\n try {\n const baseUrl = platformUrl.replace(/\\/$/, \"\");\n const response = await fetch(`${baseUrl}/api/mcp/courses`, {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as PlatformCourseSummaryResponse;\n return (Array.isArray(data.courses) ? data.courses : []).map((course) =>\n normalizeCourseContext(course)\n );\n } catch {\n return [];\n }\n}\n\nexport async function fetchCourseContext(\n courseId: string,\n apiKey: string,\n platformUrl: string\n): Promise<CourseContext | null> {\n const courses = await fetchCourses(apiKey, platformUrl);\n return courses.find((course) => course.id === courseId) ?? null;\n}\n\nexport async function detectInstructionMode(\n apiKey: string,\n platformUrl: string,\n verifyHeartbeat: (apiKey: string, platformUrl: string) => Promise<boolean>\n): Promise<InstructionMode> {\n return (await verifyHeartbeat(apiKey, platformUrl)) ? \"mcp\" : \"cli\";\n}\n\nexport function appendCourseMetadata(content: string, courseId: string): string {\n return `${content}\\n\\n${COURSE_ID_COMMENT_PREFIX} ${courseId} -->`;\n}\n\nexport function extractCourseId(content: string): string | null {\n const match = content.match(/<!-- tostudy-course-id:\\s*([a-zA-Z0-9-_]+)\\s*-->/);\n return match?.[1] ?? null;\n}\n\nexport function inferInstructionTarget(filePath: string): {\n ide: SupportedIDE;\n scenario: WorkspaceScenario;\n} {\n if (filePath === \".cursor/rules/tostudy.mdc\") {\n return { ide: \"cursor\", scenario: \"empty\" };\n }\n\n if (filePath === \".github/copilot-instructions.md\") {\n return { ide: \"copilot\", scenario: \"empty\" };\n }\n\n if (filePath === \".tostudy/AGENTS.md\") {\n return { ide: \"codex\", scenario: \"existing\" };\n }\n\n return { ide: \"manual\", scenario: \"empty\" };\n}\n\nexport function resolveDetectedIde(ide: IDEInfo | null): SupportedIDE {\n return ide?.id ?? \"manual\";\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { generateInstructions, renderForIDE, type CourseContext } from \"@repo/mcp-cli-core\";\nimport { verifyHeartbeat } from \"../ide-handlers/base.js\";\nimport {\n appendCourseMetadata,\n detectInstructionMode,\n extractCourseId,\n fetchCourseContext,\n inferInstructionTarget,\n} from \"./shared.js\";\n\nfunction println(message = \"\"): void {\n process.stdout.write(`${message}\\n`);\n}\n\nexport interface SyncOptions {\n apiKey: string;\n platformUrl: string;\n courseId?: string;\n}\n\ninterface SyncDependencies {\n cwd?: string;\n verifyHeartbeat?: (apiKey: string, platformUrl: string) => Promise<boolean>;\n fetchCourse?: (\n courseId: string,\n apiKey: string,\n platformUrl: string\n ) => Promise<CourseContext | null>;\n}\n\nexport type SyncResult =\n | { ok: true; outputPath: string; courseId: string; mode: \"mcp\" | \"cli\" }\n | { ok: false; reason: \"instruction_missing\" | \"course_metadata_missing\" | \"course_not_found\" };\n\nconst INSTRUCTION_CANDIDATES = [\n \"AGENTS.md\",\n \".tostudy/AGENTS.md\",\n \".cursor/rules/tostudy.mdc\",\n \".github/copilot-instructions.md\",\n] as const;\n\nfunction findExistingInstruction(cwd: string): { relativePath: string; content: string } | null {\n for (const candidate of INSTRUCTION_CANDIDATES) {\n const fullPath = join(cwd, candidate);\n if (existsSync(fullPath)) {\n return {\n relativePath: candidate,\n content: readFileSync(fullPath, \"utf-8\"),\n };\n }\n }\n\n return null;\n}\n\nexport async function runSync(\n options: SyncOptions,\n dependencies: SyncDependencies = {}\n): Promise<SyncResult> {\n const cwd = dependencies.cwd ?? process.cwd();\n const verify = dependencies.verifyHeartbeat ?? verifyHeartbeat;\n const fetchCourse = dependencies.fetchCourse ?? fetchCourseContext;\n const existing = findExistingInstruction(cwd);\n\n if (!existing) {\n println(\n chalk.yellow(' Nenhum arquivo ToStudy encontrado. Rode \"tostudy-mcp-setup init\" primeiro.')\n );\n return { ok: false, reason: \"instruction_missing\" };\n }\n\n const courseId = options.courseId ?? extractCourseId(existing.content);\n\n if (!courseId) {\n println(\n chalk.yellow(\n ' Metadata do curso ausente. Rode \"tostudy-mcp-setup init --course <id>\" novamente.'\n )\n );\n return { ok: false, reason: \"course_metadata_missing\" };\n }\n\n const mode = await detectInstructionMode(options.apiKey, options.platformUrl, verify);\n const course = await fetchCourse(courseId, options.apiKey, options.platformUrl);\n\n if (!course) {\n println(chalk.red(` Não foi possível sincronizar o curso ${courseId}.`));\n return { ok: false, reason: \"course_not_found\" };\n }\n\n const target = inferInstructionTarget(existing.relativePath);\n const instructionContent = appendCourseMetadata(\n generateInstructions(course, {\n mode,\n ide: target.ide,\n locale: \"pt-BR\",\n }),\n course.id\n );\n const rendered = renderForIDE(instructionContent, target.ide, target.scenario);\n const outputPath = join(cwd, rendered.filePath);\n\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, rendered.content, \"utf-8\");\n\n println(chalk.green(` ✓ ${rendered.filePath} sincronizado`));\n return {\n ok: true,\n outputPath,\n courseId: course.id,\n mode,\n };\n}\n"],"mappings":"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","names":["chalk","createInterface","index","existsSync","join","homedir","platform","existsSync","readFileSync","println","existsSync","readFileSync","existsSync","mkdirSync","writeFileSync","copyFileSync","dirname","chalk","println","dirname","existsSync","mkdirSync","writeFileSync","copyFileSync","chalk","println","chalk","platform","getClientOsHeaderValue","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","platform","homedir","platform","existsSync","join","dirname","mkdirSync","readFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","platform","homedir","platform","existsSync","join","dirname","mkdirSync","readFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","dirname","dirname","existsSync","mkdirSync","readFileSync","copyFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","homedir","existsSync","join","dirname","mkdirSync","readFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","execFileSync","join","dirname","homedir","execFileSync","existsSync","join","homedir","dirname","mkdirSync","readFileSync","writeFileSync","execFileSync","existsSync","join","homedir","execFileSync","existsSync","join","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","homedir","homedir","existsSync","join","dirname","mkdirSync","readFileSync","writeFileSync","chalk","chalk","existsSync","mkdirSync","writeFileSync","dirname","join","chalk","existsSync","join","verifyHeartbeat","println","detectRunningIDE","detectWorkspaceScenario","fetchCourses","chalk","join","existsSync","mkdirSync","dirname","writeFileSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","chalk","println","join","existsSync","readFileSync","chalk","mkdirSync","dirname","writeFileSync","DEFAULT_PLATFORM_URL","println","chalk","execFileSync","configured"]}
|