@vreko/cli 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/CeremonyView-LQS7FTMK.js +134 -0
  4. package/dist/CeremonyView-LQS7FTMK.js.map +1 -0
  5. package/dist/InitApp-7K5DTYSW.js +1479 -0
  6. package/dist/InitApp-7K5DTYSW.js.map +1 -0
  7. package/dist/SkippedTestDetector-PJSKSOZR.js +7 -0
  8. package/dist/SkippedTestDetector-PJSKSOZR.js.map +1 -0
  9. package/dist/TuiApp-FX23XQBK.js +8 -0
  10. package/dist/TuiApp-FX23XQBK.js.map +1 -0
  11. package/dist/analysis-ABEO6RTN.js +8 -0
  12. package/dist/analysis-ABEO6RTN.js.map +1 -0
  13. package/dist/auth-XNBEBNPY.js +7669 -0
  14. package/dist/auth-XNBEBNPY.js.map +1 -0
  15. package/dist/ceremony-M7CXVBVA.js +45 -0
  16. package/dist/ceremony-M7CXVBVA.js.map +1 -0
  17. package/dist/chunk-A3QSZJPD.js +3147 -0
  18. package/dist/chunk-A3QSZJPD.js.map +1 -0
  19. package/dist/chunk-ASGZ5B6C.js +3969 -0
  20. package/dist/chunk-ASGZ5B6C.js.map +1 -0
  21. package/dist/chunk-DMXC2JTC.js +58 -0
  22. package/dist/chunk-DMXC2JTC.js.map +1 -0
  23. package/dist/chunk-EEBSK2IH.js +161 -0
  24. package/dist/chunk-EEBSK2IH.js.map +1 -0
  25. package/dist/chunk-EWOJGXRX.js +22 -0
  26. package/dist/chunk-EWOJGXRX.js.map +1 -0
  27. package/dist/chunk-F7GEJLP7.js +2389 -0
  28. package/dist/chunk-F7GEJLP7.js.map +1 -0
  29. package/dist/chunk-GOYL3F4T.js +605 -0
  30. package/dist/chunk-GOYL3F4T.js.map +1 -0
  31. package/dist/chunk-GRMRYWYS.js +17 -0
  32. package/dist/chunk-GRMRYWYS.js.map +1 -0
  33. package/dist/chunk-GSUGROXB.js +1951 -0
  34. package/dist/chunk-GSUGROXB.js.map +1 -0
  35. package/dist/chunk-H7773ONB.js +50 -0
  36. package/dist/chunk-H7773ONB.js.map +1 -0
  37. package/dist/chunk-HFQHU5LC.js +445 -0
  38. package/dist/chunk-HFQHU5LC.js.map +1 -0
  39. package/dist/chunk-IVHUBLJD.js +318 -0
  40. package/dist/chunk-IVHUBLJD.js.map +1 -0
  41. package/dist/chunk-KJWKY4L4.js +14 -0
  42. package/dist/chunk-KJWKY4L4.js.map +1 -0
  43. package/dist/chunk-MJVY2XUN.js +1793 -0
  44. package/dist/chunk-MJVY2XUN.js.map +1 -0
  45. package/dist/chunk-QWZVCJII.js +1797 -0
  46. package/dist/chunk-QWZVCJII.js.map +1 -0
  47. package/dist/chunk-VTSNRV3V.js +3237 -0
  48. package/dist/chunk-VTSNRV3V.js.map +1 -0
  49. package/dist/chunk-W5B4GTXR.js +1466 -0
  50. package/dist/chunk-W5B4GTXR.js.map +1 -0
  51. package/dist/chunk-WZEZLVOW.js +4995 -0
  52. package/dist/chunk-WZEZLVOW.js.map +1 -0
  53. package/dist/chunk-YPTTIXKC.js +199 -0
  54. package/dist/chunk-YPTTIXKC.js.map +1 -0
  55. package/dist/chunk-Z55UGM6X.js +6360 -0
  56. package/dist/chunk-Z55UGM6X.js.map +1 -0
  57. package/dist/chunk-ZIIRQODJ.js +110 -0
  58. package/dist/chunk-ZIIRQODJ.js.map +1 -0
  59. package/dist/chunk-ZSUQ4FMB.js +77 -0
  60. package/dist/chunk-ZSUQ4FMB.js.map +1 -0
  61. package/dist/client-JMTSZS3V.js +10 -0
  62. package/dist/client-JMTSZS3V.js.map +1 -0
  63. package/dist/deprecated-snap.js +19 -0
  64. package/dist/deprecated-snap.js.map +1 -0
  65. package/dist/dist-2KWBZFLA.js +14 -0
  66. package/dist/dist-2KWBZFLA.js.map +1 -0
  67. package/dist/dist-5ZYKNNU3.js +7 -0
  68. package/dist/dist-5ZYKNNU3.js.map +1 -0
  69. package/dist/dist-CP3RFHPI.js +11 -0
  70. package/dist/dist-CP3RFHPI.js.map +1 -0
  71. package/dist/gecko-53ITAGG6.js +56 -0
  72. package/dist/gecko-53ITAGG6.js.map +1 -0
  73. package/dist/guards-QAFC64NO.js +7 -0
  74. package/dist/guards-QAFC64NO.js.map +1 -0
  75. package/dist/index.js +57785 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/init-command-246JIVXM.js +7 -0
  78. package/dist/init-command-246JIVXM.js.map +1 -0
  79. package/dist/init-core-KAI7LCXZ.js +12 -0
  80. package/dist/init-core-KAI7LCXZ.js.map +1 -0
  81. package/dist/init-scan-RZNYDTUV.js +1919 -0
  82. package/dist/init-scan-RZNYDTUV.js.map +1 -0
  83. package/dist/local-service-adapter-6KNN6WQL.js +8 -0
  84. package/dist/local-service-adapter-6KNN6WQL.js.map +1 -0
  85. package/dist/secure-credentials-JXWAQLS2.js +306 -0
  86. package/dist/secure-credentials-JXWAQLS2.js.map +1 -0
  87. package/dist/tui-TPJPUS2R.js +111 -0
  88. package/dist/tui-TPJPUS2R.js.map +1 -0
  89. package/dist/vreko-dir-O3RLG7PI.js +8 -0
  90. package/dist/vreko-dir-O3RLG7PI.js.map +1 -0
  91. package/package.json +132 -0
  92. package/scripts/check-banned-words.ts +152 -0
  93. package/scripts/hooks/posttooluse-file-notify.sh +108 -0
  94. package/scripts/hooks/pretooluse-fragile-guard.sh +82 -0
  95. package/scripts/post-install-notice.js +24 -0
  96. package/scripts/postinstall.mjs +84 -0
  97. package/scripts/preuninstall.mjs +34 -0
  98. package/scripts/verify-jsx-transform.mjs +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/mcp-config/src/path-cache.ts","../../../packages/mcp-config/src/detect.ts","../../../packages/mcp-config/src/identity.ts","../../../packages/mcp-config/src/process-check.ts","../../../packages/mcp-config/src/validate.ts","../../../packages/mcp-config/src/write.ts","../../../packages/mcp-config/src/repair.ts"],"names":["CACHE_TTL_MS","getCacheFilePath","join","homedir","readCache","raw","readFileSync","parsed","JSON","parse","version","discovered","writeCache","cache","dir","mkdirSync","recursive","writeFileSync","stringify","getCachedPath","clientName","entry","age","Date","now","discoveredAt","getTime","existsSync","path","setCachedPath","configPath","toISOString","platform","process","evictCachedPath","getAllCachedPaths","CLIENT_CONFIGS","claude","home","env","APPDATA","cursor","__name","_home","cwd","windsurf","continue","vscode","zed","cline","gemini","aider","qoder","workspaceConfig","globalConfigs","CLIENT_DISPLAY_NAMES","UNSUPPORTED_DEFAULT_INIT_CLIENTS","Set","hasVrekoServerName","name","format","startsWith","detectAIClients","options","clients","seenPaths","getPaths","Object","entries","candidates","cachedPath","paths","includes","filter","p","has","add","exists","hasVreko","content","endsWith","checkForVreko","push","displayName","detected","c","needsSetup","getClient","result","find","getConfiguredClients","config","configObj","mcpServers","servers","keys","some","serverName","k","context_servers","experimental","Array","isArray","modelContextProtocolServers","server","getClientConfigPath","undefined","readClientConfig","client","detectWorkspaceConfig","workspaceRoot","root","claudeCodeConfig","type","qoderConfig","cursorConfig","vscodeConfig","windsurfConfig","getVrekoConfigDir","isWindows","getConfigDirWithMigration","newDir","oldDir","stat","statSync","isDirectory","isSymbolicLink","oldIdentity","copyFileSync","getIdentityFilePath","cachedIdentity","getOrCreateIdentity","identityPath","identity","userId","installId","randomUUID","createdAt","configDir","getCLIVersion","packagePaths","__dirname","pkgPath","pkg","createManagedMetadata","workspaceId","cliVersion","updatedAt","transport","isOwnedByThisInstall","metadata","resetIdentityCache","execAsync","promisify","exec","detectMCPProcesses","stdout","timeout","processes","parseProcessOutput","vrekoProcesses","isVreko","allProcesses","vrekoRunning","length","totalCount","checkedAt","output","lines","trim","split","line","match","pidStr","command","pid","Number","parseInt","isNaN","extractServerName","toLowerCase","patterns","pattern","isVrekoMCPRunning","health","isVrekoServerName","validateClientConfig","issues","severity","code","message","fix","valid","configContent","parsedConfig","error","Error","vrekoConfig","extractVrekoConfig","validateVrekoConfig","args","workspaceIdx","indexOf","workspacePath","wsValidation","validateWorkspacePath","hasMarkers","i","absPath","resolve","hasGit","hasPackageJson","s","url","isCommandExecutable","cliPath","URL","VREKO_API_KEY","VREKO_WORKSPACE_ID","cmd","execSync","encoding","cachedNodePath","resolveNodePath","nodePath","commonPaths","resolveVrekoBinaryPath","binaryPath","getVrekoMCPConfig","apiKey","serverUrl","useBinary","customCommand","additionalEnv","useLocalDev","localCliPath","useDoppler","dopplerProject","dopplerConfig","useSse","useStreamableHttp","useNpx","tier","headers","dopplerBase","dopplerArgs","writeClientConfig","mcpConfig","dirname","existingConfig","hasExistingConfig","backup","newConfig","mergeConfig","success","removeVrekoConfig","key","zedConfig","contextServers","getServerKey","serverKey","existing","disabled","alwaysAllow","qoderType","isLocal","_","rest","continueConfig","filteredServers","patchApiKeyInClientConfig","patched","patchEntry","e","Authorization","exp","list","item","validateConfig","serverConfig","Boolean","expCfg","srvs","repairClientConfig","fixed","remaining","validation","force","performFullReconfiguration","issue","fixResult","attemptFix","hasCriticalErrors","msg","injectWorkspacePath","detectedWorkspace","detectWorkspaceRoot","hasWorkspace","_validation","findCliPath","workspace","_nodePath","writeResult","startPath","currentPath","maxIterations","iterations","parent"],"mappings":"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","file":"chunk-MJVY2XUN.js","sourcesContent":["/**\n * MCP Config Path Discovery Cache\n *\n * Persists discovered AI client config paths to ~/.vreko/mcp-configs/paths.json\n * so that detection is instant on subsequent runs instead of probing all candidates.\n *\n * Cache TTL is 7 days - long enough to avoid redundant I/O, short enough to\n * pick up path changes when clients update their storage layout.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface CachedPath {\n\t/** Absolute path that was verified to exist */\n\tpath: string;\n\t/** ISO timestamp when the path was last confirmed */\n\tdiscoveredAt: string;\n\t/** OS platform string (darwin/win32/linux) */\n\tplatform: string;\n}\n\ninterface PathCacheFile {\n\tversion: 1;\n\t/** client name → confirmed path entry */\n\tdiscovered: Record<string, CachedPath>;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\n\nfunction getCacheFilePath(): string {\n\treturn join(homedir(), \".vreko\", \"mcp-configs\", \"paths.json\");\n}\n\n// =============================================================================\n// READ / WRITE\n// =============================================================================\n\nfunction readCache(): PathCacheFile {\n\ttry {\n\t\tconst raw = readFileSync(getCacheFilePath(), \"utf-8\");\n\t\tconst parsed = JSON.parse(raw) as PathCacheFile;\n\t\tif (parsed.version === 1 && typeof parsed.discovered === \"object\") {\n\t\t\treturn parsed;\n\t\t}\n\t} catch {\n\t\t// File missing or corrupt - return empty cache\n\t}\n\treturn { version: 1, discovered: {} };\n}\n\nfunction writeCache(cache: PathCacheFile): void {\n\ttry {\n\t\tconst dir = join(homedir(), \".vreko\", \"mcp-configs\");\n\t\tmkdirSync(dir, { recursive: true });\n\t\twriteFileSync(getCacheFilePath(), JSON.stringify(cache, null, 2));\n\t} catch {\n\t\t// Non-fatal - cache write failure silently ignored\n\t}\n}\n\n// =============================================================================\n// PUBLIC API\n// =============================================================================\n\n/**\n * Look up a cached config path for a client.\n * Returns the path if it was cached recently AND the file still exists.\n * Returns null if cache miss, expired, or the cached path no longer exists.\n */\nexport function getCachedPath(clientName: string): string | null {\n\tconst cache = readCache();\n\tconst entry = cache.discovered[clientName];\n\tif (!entry) {\n\t\treturn null;\n\t}\n\n\t// Expire stale entries\n\tconst age = Date.now() - new Date(entry.discoveredAt).getTime();\n\tif (age > CACHE_TTL_MS) {\n\t\treturn null;\n\t}\n\n\t// Verify the file still exists (client may have been uninstalled)\n\tif (!existsSync(entry.path)) {\n\t\t// Evict the stale entry\n\t\tdelete cache.discovered[clientName];\n\t\twriteCache(cache);\n\t\treturn null;\n\t}\n\n\treturn entry.path;\n}\n\n/**\n * Record a successfully discovered path for a client.\n * Called by detectAIClients after confirming a candidate exists.\n */\nexport function setCachedPath(clientName: string, configPath: string): void {\n\tconst cache = readCache();\n\tcache.discovered[clientName] = {\n\t\tpath: configPath,\n\t\tdiscoveredAt: new Date().toISOString(),\n\t\tplatform: process.platform,\n\t};\n\twriteCache(cache);\n}\n\n/**\n * Evict a client's cached path (e.g. after `vreko mcp unlink`).\n */\nexport function evictCachedPath(clientName: string): void {\n\tconst cache = readCache();\n\tif (cache.discovered[clientName]) {\n\t\tdelete cache.discovered[clientName];\n\t\twriteCache(cache);\n\t}\n}\n\n/**\n * Return the full contents of the cache for diagnostics / `vreko mcp scan`.\n */\nexport function getAllCachedPaths(): Record<string, CachedPath> {\n\treturn readCache().discovered;\n}\n","/**\n * AI Client Detection Module\n *\n * Detects installed AI assistants (Claude Desktop, Cursor, Windsurf, Continue)\n * and checks their MCP configuration status.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getCachedPath, setCachedPath } from \"./path-cache.js\";\nimport type { AIClientConfig, AIClientFormat, DetectionResult, MCPConfig } from \"./types.js\";\n\n// =============================================================================\n// CLIENT PATH CONFIGURATION\n// =============================================================================\n\n/**\n * Platform-specific config path resolvers for each AI client\n * Note: User preference is project-level configs where supported\n */\nconst CLIENT_CONFIGS: Record<string, (home: string, cwd?: string) => string[]> = {\n\tclaude: (home) => {\n\t\tswitch (platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\treturn [join(home, \"Library/Application Support/Claude/claude_desktop_config.json\")];\n\t\t\tcase \"win32\":\n\t\t\t\treturn [join(process.env.APPDATA || \"\", \"Claude/claude_desktop_config.json\")];\n\t\t\tdefault:\n\t\t\t\treturn [join(home, \".config/Claude/claude_desktop_config.json\")];\n\t\t}\n\t},\n\t// Project-level first (user preference), then global fallback\n\tcursor: (_home, cwd) => [...(cwd ? [join(cwd, \".cursor/mcp.json\")] : []), join(_home, \".cursor/mcp.json\")],\n\t// Windsurf only has a global config - no project-level support (confirmed by Windsurf docs, June 2025)\n\twindsurf: (home) => [join(home, \".codeium/windsurf/mcp_config.json\")],\n\t// Continue: global config.json or config.yaml; project-level .continue/mcpServers/mcp.json\n\tcontinue: (home, cwd) => [\n\t\t...(cwd ? [join(cwd, \".continue/mcpServers/mcp.json\")] : []),\n\t\tjoin(home, \".continue/config.json\"),\n\t\tjoin(home, \".continue/config.yaml\"),\n\t],\n\t// New clients\n\tvscode: (_home, cwd) => [...(cwd ? [join(cwd, \".vscode/mcp.json\")] : [])],\n\t// Zed: global ~/.config/zed/settings.json, plus project-level .zed/settings.json\n\tzed: (home, cwd) => [...(cwd ? [join(cwd, \".zed/settings.json\")] : []), join(home, \".config/zed/settings.json\")],\n\t// Cline / Roo Code store their actual settings in VS Code extension globalStorage,\n\t// but `vreko tools configure --cline/--roo-code` writes to these paths as a side-channel.\n\t// Detection via these paths is best-effort; users may need `vreko mcp link --client cline` instead.\n\tcline: (home) => [join(home, \".cline/mcp.json\")],\n\tgemini: (home) => [join(home, \".gemini/settings.json\")],\n\taider: (home) => [join(home, \".aider/mcp.yaml\")],\n\t\"roo-code\": (home) => [join(home, \".roo-code/mcp.json\")],\n\t// Qoder (VS Code fork) - supports both project-level and global configs\n\tqoder: (home, cwd) => {\n\t\tconst workspaceConfig = cwd ? [join(cwd, \".qoder-mcp-config.json\")] : [];\n\t\tconst globalConfigs: string[] = (() => {\n\t\t\tswitch (platform()) {\n\t\t\t\tcase \"darwin\":\n\t\t\t\t\t// Primary location (SharedClientCache/mcp.json) is where Qoder actually writes\n\t\t\t\t\t// Legacy path (extension/local/mcp.json) kept for backwards compatibility\n\t\t\t\t\treturn [\n\t\t\t\t\t\tjoin(home, \"Library/Application Support/Qoder/SharedClientCache/mcp.json\"),\n\t\t\t\t\t\tjoin(home, \"Library/Application Support/Qoder/SharedClientCache/extension/local/mcp.json\"),\n\t\t\t\t\t];\n\t\t\t\tcase \"win32\":\n\t\t\t\t\treturn [join(process.env.APPDATA || \"\", \"Qoder/mcp.json\")];\n\t\t\t\tdefault:\n\t\t\t\t\treturn [join(home, \".config/Qoder/mcp.json\")];\n\t\t\t}\n\t\t})();\n\t\treturn [...workspaceConfig, ...globalConfigs];\n\t},\n\t// Claude Code CLI - project-scoped .mcp.json at workspace root\n\t\"claude-code\": (_home, cwd) => [...(cwd ? [join(cwd, \".mcp.json\")] : [join(process.cwd(), \".mcp.json\")])],\n};\n\n/**\n * Display names for AI clients\n */\nconst CLIENT_DISPLAY_NAMES: Record<string, string> = {\n\tclaude: \"Claude Desktop\",\n\tcursor: \"Cursor\",\n\twindsurf: \"Windsurf\",\n\tcontinue: \"Continue\",\n\tvscode: \"VS Code\",\n\tzed: \"Zed\",\n\tcline: \"Cline\",\n\tgemini: \"Gemini/Antigravity\",\n\taider: \"Aider\",\n\t\"roo-code\": \"Roo Code\",\n\tqoder: \"Qoder\",\n\t\"claude-code\": \"Claude Code\",\n};\n\n/**\n * Clients whose MCP config format Vreko cannot write correctly.\n * These clients are detected (so explicit `vreko tools configure --<client>` still works)\n * but are excluded from the `needsSetup` list returned by detectAIClients().\n * Zed: uses extension-based context_servers format that differs from mcpServers JSON.\n * Continue: uses experimental.modelContextProtocolServers array; no confirmed working transport.\n */\nconst UNSUPPORTED_DEFAULT_INIT_CLIENTS: ReadonlySet<string> = new Set([\"zed\", \"continue\"]);\n\nfunction hasVrekoServerName(name: string, format?: AIClientFormat): boolean {\n\tif (name === \"vreko\") {\n\t\treturn true;\n\t}\n\tif (format && name === `vreko-${format}`) {\n\t\treturn true;\n\t}\n\treturn name.startsWith(\"vreko-\");\n}\n\n// =============================================================================\n// DETECTION FUNCTIONS\n// =============================================================================\n\n/**\n * Detect all AI clients and their configuration status\n *\n * @param options - Detection options\n * @param options.cwd - Current working directory for project-level configs\n * @returns Detection result with all clients, detected clients, and clients needing setup\n *\n * @example\n * ```ts\n * const result = detectAIClients();\n * // output:(`Found ${result.detected.length} AI assistants`);\n *\n * for (const client of result.needsSetup) {\n * // output:(`${client.displayName} needs Vreko configuration`);\n * }\n * ```\n */\nexport function detectAIClients(options: { cwd?: string } = {}): DetectionResult {\n\tconst home = homedir();\n\tconst cwd = options.cwd || process.cwd();\n\tconst clients: AIClientConfig[] = [];\n\tconst seenPaths = new Set<string>();\n\n\tfor (const [name, getPaths] of Object.entries(CLIENT_CONFIGS)) {\n\t\tconst candidates = getPaths(home, cwd);\n\n\t\t// Check the path cache first - avoids re-probing all candidates on every run.\n\t\t// The cache entry is only valid if the file still exists (getCachedPath verifies this).\n\t\tconst cachedPath = getCachedPath(name);\n\t\tconst paths =\n\t\t\tcachedPath && candidates.includes(cachedPath)\n\t\t\t\t? [cachedPath, ...candidates.filter((p) => p !== cachedPath)]\n\t\t\t\t: candidates;\n\n\t\tfor (const configPath of paths) {\n\t\t\t// Avoid duplicate entries for same path\n\t\t\tif (seenPaths.has(configPath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tseenPaths.add(configPath);\n\n\t\t\tconst exists = existsSync(configPath);\n\t\t\tlet hasVreko = false;\n\n\t\t\tif (exists) {\n\t\t\t\t// Cache this path so future runs skip the other candidates\n\t\t\t\tsetCachedPath(name, configPath);\n\t\t\t\ttry {\n\t\t\t\t\tconst content = readFileSync(configPath, \"utf-8\");\n\t\t\t\t\t// Handle YAML for aider\n\t\t\t\t\tif (configPath.endsWith(\".yaml\") || configPath.endsWith(\".yml\")) {\n\t\t\t\t\t\thasVreko = content.includes(\"vreko\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst parsed = JSON.parse(content) as unknown;\n\t\t\t\t\t\thasVreko = checkForVreko(parsed, name as AIClientFormat);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Invalid JSON/YAML or read error - treat as no vreko\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tclients.push({\n\t\t\t\tname,\n\t\t\t\tdisplayName: CLIENT_DISPLAY_NAMES[name] || name,\n\t\t\t\tconfigPath,\n\t\t\t\texists,\n\t\t\t\thasVreko,\n\t\t\t\tformat: name as AIClientFormat,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst detected = clients.filter((c) => c.exists);\n\t// Exclude clients whose config format is not supported for automatic init.\n\t// They remain in `detected` so explicit tool commands can still target them.\n\tconst needsSetup = detected.filter((c) => !c.hasVreko && !UNSUPPORTED_DEFAULT_INIT_CLIENTS.has(c.name));\n\n\treturn { clients, detected, needsSetup };\n}\n\n/**\n * Check if a specific AI client is installed\n *\n * @param clientName - Name of the client to check (claude, cursor, windsurf, continue)\n * @returns The client config if found, undefined otherwise\n */\nexport function getClient(clientName: string): AIClientConfig | undefined {\n\tconst result = detectAIClients();\n\treturn result.clients.find((c) => c.name === clientName && c.exists);\n}\n\n/**\n * Get all clients that have Vreko configured\n *\n * @returns Array of configured clients\n */\nexport function getConfiguredClients(): AIClientConfig[] {\n\tconst result = detectAIClients();\n\treturn result.detected.filter((c) => c.hasVreko);\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Check if Vreko is configured in a config object\n */\nfunction checkForVreko(config: unknown, format: AIClientFormat): boolean {\n\tif (!config || typeof config !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst configObj = config as Record<string, unknown>;\n\n\tswitch (format) {\n\t\tcase \"claude\":\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"claude-code\":\n\t\t\t// These use mcpServers.vreko format\n\t\t\tif (\n\t\t\t\t\"mcpServers\" in configObj &&\n\t\t\t\ttypeof configObj.mcpServers === \"object\" &&\n\t\t\t\tconfigObj.mcpServers !== null\n\t\t\t) {\n\t\t\t\tconst servers = configObj.mcpServers as Record<string, unknown>;\n\t\t\t\t// Check for namespaced key\n\t\t\t\treturn Object.keys(servers).some((serverName) => hasVrekoServerName(serverName, format));\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"qoder\":\n\t\t\t// Qoder uses mcpServers format but may have multiple vreko entries\n\t\t\t// (e.g. vreko-local and vreko-remote) from vreko mcp link\n\t\t\tif (\n\t\t\t\t\"mcpServers\" in configObj &&\n\t\t\t\ttypeof configObj.mcpServers === \"object\" &&\n\t\t\t\tconfigObj.mcpServers !== null\n\t\t\t) {\n\t\t\t\tconst servers = configObj.mcpServers as Record<string, unknown>;\n\t\t\t\t// Check for any vreko-prefixed key\n\t\t\t\treturn Object.keys(servers).some((k) => hasVrekoServerName(k));\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"vscode\":\n\t\t\t// VS Code uses \"servers\" not \"mcpServers\"\n\t\t\tif (\"servers\" in configObj && typeof configObj.servers === \"object\" && configObj.servers !== null) {\n\t\t\t\tconst servers = configObj.servers as Record<string, unknown>;\n\t\t\t\t// Check for namespaced key\n\t\t\t\treturn Object.keys(servers).some((serverName) => hasVrekoServerName(serverName, \"vscode\"));\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"gemini\":\n\t\tcase \"zed\":\n\t\t\t// Zed uses \"context_servers\" not \"mcpServers\"\n\t\t\tif (\n\t\t\t\t\"context_servers\" in configObj &&\n\t\t\t\ttypeof configObj.context_servers === \"object\" &&\n\t\t\t\tconfigObj.context_servers !== null\n\t\t\t) {\n\t\t\t\tconst servers = configObj.context_servers as Record<string, unknown>;\n\t\t\t\t// Check for namespaced key\n\t\t\t\treturn Object.keys(servers).some((serverName) => hasVrekoServerName(serverName, \"zed\"));\n\t\t\t}\n\t\t\t// Fallback: also check mcpServers for gemini\n\t\t\tif (\n\t\t\t\t\"mcpServers\" in configObj &&\n\t\t\t\ttypeof configObj.mcpServers === \"object\" &&\n\t\t\t\tconfigObj.mcpServers !== null\n\t\t\t) {\n\t\t\t\tconst servers = configObj.mcpServers as Record<string, unknown>;\n\t\t\t\treturn Object.keys(servers).some((serverName) => hasVrekoServerName(serverName, format));\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"continue\":\n\t\t\t// Continue uses a different structure - check for experimental.modelContextProtocolServers\n\t\t\tif (\n\t\t\t\t\"experimental\" in configObj &&\n\t\t\t\ttypeof configObj.experimental === \"object\" &&\n\t\t\t\tconfigObj.experimental !== null\n\t\t\t) {\n\t\t\t\tconst experimental = configObj.experimental as Record<string, unknown>;\n\t\t\t\tif (\n\t\t\t\t\t\"modelContextProtocolServers\" in experimental &&\n\t\t\t\t\tArray.isArray(experimental.modelContextProtocolServers)\n\t\t\t\t) {\n\t\t\t\t\treturn experimental.modelContextProtocolServers.some(\n\t\t\t\t\t\t(server: unknown) =>\n\t\t\t\t\t\t\ttypeof server === \"object\" &&\n\t\t\t\t\t\t\tserver !== null &&\n\t\t\t\t\t\t\ttypeof (server as Record<string, unknown>).name === \"string\" &&\n\t\t\t\t\t\t\thasVrekoServerName((server as Record<string, unknown>).name as string),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"aider\":\n\t\t\t// Aider uses YAML - handled separately in detectAIClients\n\t\t\treturn false;\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n/**\n * Get the expected config path for a client on the current platform\n *\n * @param clientName - Name of the client\n * @param cwd - Current working directory (for project-level configs)\n * @returns The config path or undefined if unknown client\n */\nexport function getClientConfigPath(clientName: string, cwd?: string): string | undefined {\n\tconst getPaths = CLIENT_CONFIGS[clientName];\n\tif (!getPaths) {\n\t\treturn undefined;\n\t}\n\n\tconst paths = getPaths(homedir(), cwd);\n\treturn paths[0];\n}\n\n/**\n * Read and parse a client's MCP config file\n *\n * @param client - The client to read config for\n * @returns Parsed config or undefined if not found/invalid\n */\nexport function readClientConfig(client: AIClientConfig): MCPConfig | undefined {\n\ttry {\n\t\tconst content = readFileSync(client.configPath, \"utf-8\");\n\t\treturn JSON.parse(content) as MCPConfig;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Detect workspace-specific MCP configurations\n * Checks for project-level configs that take precedence over global ones\n *\n * @param workspaceRoot - Workspace root directory (defaults to cwd)\n * @returns Config info if found, null otherwise\n *\n * @example\n * ```ts\n * const wsConfig = detectWorkspaceConfig();\n * if (wsConfig) {\n * // output:(`Found workspace config: ${wsConfig.path}`);\n * // Skip adding global config to prevent conflicts\n * }\n * ```\n */\nexport function detectWorkspaceConfig(\n\tworkspaceRoot?: string,\n): { path: string; type: \"qoder\" | \"vscode\" | \"cursor\" | \"windsurf\" | \"claude-code\" } | null {\n\tconst root = workspaceRoot || process.cwd();\n\n\t// Check Claude Code project config (.mcp.json at workspace root)\n\tconst claudeCodeConfig = join(root, \".mcp.json\");\n\tif (existsSync(claudeCodeConfig)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(claudeCodeConfig, \"utf-8\");\n\t\t\tif (content.includes(\"vreko\")) {\n\t\t\t\treturn { path: claudeCodeConfig, type: \"claude-code\" };\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid JSON or read error\n\t\t}\n\t}\n\n\t// Check Qoder workspace config (.qoder-mcp-config.json)\n\tconst qoderConfig = join(root, \".qoder-mcp-config.json\");\n\tif (existsSync(qoderConfig)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(qoderConfig, \"utf-8\");\n\t\t\tif (content.includes(\"vreko\")) {\n\t\t\t\treturn { path: qoderConfig, type: \"qoder\" };\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid JSON or read error\n\t\t}\n\t}\n\n\t// Check Cursor project config (.cursor/mcp.json)\n\tconst cursorConfig = join(root, \".cursor\", \"mcp.json\");\n\tif (existsSync(cursorConfig)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(cursorConfig, \"utf-8\");\n\t\t\tif (content.includes(\"vreko\")) {\n\t\t\t\treturn { path: cursorConfig, type: \"cursor\" };\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid JSON or read error\n\t\t}\n\t}\n\n\t// Check VS Code project config (.vscode/mcp.json)\n\tconst vscodeConfig = join(root, \".vscode\", \"mcp.json\");\n\tif (existsSync(vscodeConfig)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(vscodeConfig, \"utf-8\");\n\t\t\tif (content.includes(\"vreko\")) {\n\t\t\t\treturn { path: vscodeConfig, type: \"vscode\" };\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid JSON or read error\n\t\t}\n\t}\n\n\t// Check Windsurf project config (.windsurf/mcp.json)\n\tconst windsurfConfig = join(root, \".windsurf\", \"mcp.json\");\n\tif (existsSync(windsurfConfig)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(windsurfConfig, \"utf-8\");\n\t\t\tif (content.includes(\"vreko\")) {\n\t\t\t\treturn { path: windsurfConfig, type: \"windsurf\" };\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid JSON or read error\n\t\t}\n\t}\n\n\treturn null;\n}\n","/**\n * Identity Module for MCP Config\n *\n * §10.2: Manages persistent identifiers for managed MCP config entries:\n * - userId: Stable user identifier (persists across reinstalls on same machine)\n * - installId: Per-installation identifier (regenerated on reinstall)\n *\n * @packageDocumentation\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { copyFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { AIClientFormat, VrekoManagedMetadata } from \"./types.js\";\n\n// =============================================================================\n// PATHS\n// =============================================================================\n\n/**\n * Get Vreko config directory path (primary)\n */\nexport function getVrekoConfigDir(): string {\n\tconst isWindows = process.platform === \"win32\";\n\tif (isWindows) {\n\t\treturn join(process.env.APPDATA || homedir(), \"Vreko\");\n\t}\n\treturn join(homedir(), \".vreko\");\n}\n\n/**\n * Get config directory with automatic migration from ~/.snapback to ~/.vreko.\n *\n * On first use: if ~/.vreko/ does not exist but ~/.snapback/ exists (and is a real\n * directory, not a symlink), seeds ~/.vreko/ by copying identity.json.\n *\n * Security (T-07.1-03-03): validates that oldDir is a real directory before reading.\n */\nexport function getConfigDirWithMigration(): string {\n\tconst newDir = getVrekoConfigDir();\n\t// oldDir is the legacy snapback config path (migration source)\n\tconst oldDir = join(homedir(), \".snapback\");\n\n\tif (!existsSync(newDir) && existsSync(oldDir)) {\n\t\ttry {\n\t\t\t// Validate oldDir is a real directory, not a symlink (T-07.1-03-03)\n\t\t\tconst stat = statSync(oldDir);\n\t\t\tif (stat.isDirectory() && !stat.isSymbolicLink()) {\n\t\t\t\tmkdirSync(newDir, { recursive: true });\n\t\t\t\tconst oldIdentity = join(oldDir, \"identity.json\");\n\t\t\t\tif (existsSync(oldIdentity)) {\n\t\t\t\t\tcopyFileSync(oldIdentity, join(newDir, \"identity.json\"));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Migration is best-effort - if it fails, just use the new dir\n\t\t}\n\t}\n\n\treturn newDir;\n}\n\n/**\n * Get identity file path\n */\nfunction getIdentityFilePath(): string {\n\treturn join(getVrekoConfigDir(), \"identity.json\");\n}\n\n// =============================================================================\n// IDENTITY TYPES\n// =============================================================================\n\ninterface StoredIdentity {\n\t/** User ID - stable across sessions */\n\tuserId: string;\n\t/** Install ID - per machine install */\n\tinstallId: string;\n\t/** Created timestamp */\n\tcreatedAt: string;\n}\n\n// =============================================================================\n// IDENTITY MANAGEMENT\n// =============================================================================\n\n/** Cached identity to avoid repeated disk reads */\nlet cachedIdentity: StoredIdentity | null = null;\n\n/**\n * Get or create stored identity\n *\n * §5.2: Generates and persists userId and installId\n */\nexport function getOrCreateIdentity(): StoredIdentity {\n\tif (cachedIdentity) {\n\t\treturn cachedIdentity;\n\t}\n\n\tconst identityPath = getIdentityFilePath();\n\n\t// Try to read existing identity\n\tif (existsSync(identityPath)) {\n\t\ttry {\n\t\t\tconst content = readFileSync(identityPath, \"utf-8\");\n\t\t\tconst identity = JSON.parse(content) as StoredIdentity;\n\t\t\tif (identity.userId && identity.installId) {\n\t\t\t\tcachedIdentity = identity;\n\t\t\t\treturn identity;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid file, will regenerate\n\t\t}\n\t}\n\n\t// Create new identity\n\tconst identity: StoredIdentity = {\n\t\tuserId: randomUUID(),\n\t\tinstallId: randomUUID(),\n\t\tcreatedAt: new Date().toISOString(),\n\t};\n\n\t// Ensure directory exists\n\tconst configDir = getVrekoConfigDir();\n\tmkdirSync(configDir, { recursive: true });\n\n\t// Write identity file\n\twriteFileSync(identityPath, JSON.stringify(identity, null, 2));\n\n\tcachedIdentity = identity;\n\treturn identity;\n}\n\n/**\n * Get current CLI version from package.json\n */\nfunction getCLIVersion(): string {\n\ttry {\n\t\t// Try to read from node_modules or nearby package.json\n\t\tconst packagePaths = [\n\t\t\tjoin(__dirname, \"../package.json\"),\n\t\t\tjoin(__dirname, \"../../package.json\"),\n\t\t\tjoin(process.cwd(), \"package.json\"),\n\t\t];\n\n\t\tfor (const pkgPath of packagePaths) {\n\t\t\tif (existsSync(pkgPath)) {\n\t\t\t\tconst content = readFileSync(pkgPath, \"utf-8\");\n\t\t\t\tconst pkg = JSON.parse(content);\n\t\t\t\tif (pkg.name?.includes(\"vreko\") || pkg.name?.includes(\"vreko\")) {\n\t\t\t\t\treturn pkg.version || \"1.0.0\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fallback\n\t}\n\treturn \"1.0.0\";\n}\n\n// =============================================================================\n// MANAGED METADATA\n// =============================================================================\n\n/**\n * Generate managed metadata for MCP config entries\n *\n * §10.2: Creates the vrekoManaged object for config entries\n *\n * @param client - Target client\n * @param options - Additional options\n * @returns Managed metadata object\n */\nexport function createManagedMetadata(\n\tclient: AIClientFormat | \"other\",\n\toptions: {\n\t\tworkspaceId?: string;\n\t\ttransport: \"stdio\" | \"stdio-shim\" | \"http\";\n\t},\n): VrekoManagedMetadata {\n\tconst identity = getOrCreateIdentity();\n\n\treturn {\n\t\tuserId: identity.userId,\n\t\tinstallId: identity.installId,\n\t\tclient,\n\t\tworkspaceId: options.workspaceId,\n\t\tcliVersion: getCLIVersion(),\n\t\tupdatedAt: new Date().toISOString(),\n\t\ttransport: options.transport,\n\t};\n}\n\n/**\n * Check if a managed metadata object belongs to this installation\n *\n * §10.3: Used to determine if we can auto-modify an entry\n *\n * @param metadata - Metadata from existing config entry\n * @returns True if this install owns the entry\n */\nexport function isOwnedByThisInstall(metadata: VrekoManagedMetadata | undefined): boolean {\n\tif (!metadata?.installId) {\n\t\treturn false;\n\t}\n\n\tconst identity = getOrCreateIdentity();\n\treturn metadata.installId === identity.installId;\n}\n\n/**\n * Reset cached identity (for testing)\n */\nexport function resetIdentityCache(): void {\n\tcachedIdentity = null;\n}\n","/**\n * MCP Process Detection Module\n *\n * Detects running MCP stdio processes spawned by AI clients.\n * This helps verify that MCP configuration is not just present,\n * but actually functional with processes running.\n *\n * @packageDocumentation\n */\n\nimport { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\n/**\n * Running MCP process information\n */\nexport interface MCPProcess {\n\t/** Process ID */\n\tpid: number;\n\t/** Command being executed */\n\tcommand: string;\n\t/** MCP server name (e.g., \"vreko\", \"context7\") */\n\tserverName: string;\n\t/** Whether this is a Vreko MCP process */\n\tisVreko: boolean;\n}\n\n/**\n * MCP process health status\n */\nexport interface MCPProcessHealth {\n\t/** All detected MCP stdio processes */\n\tallProcesses: MCPProcess[];\n\t/** Vreko-specific processes */\n\tvrekoProcesses: MCPProcess[];\n\t/** Whether any Vreko MCP process is running */\n\tvrekoRunning: boolean;\n\t/** Total count of all MCP processes */\n\ttotalCount: number;\n\t/** Timestamp of check */\n\tcheckedAt: Date;\n}\n\n/**\n * Detect running MCP stdio processes\n *\n * Uses `ps` command to find processes matching MCP stdio patterns:\n * - node ... mcp --stdio\n * - vreko mcp --stdio\n * - uvx mcp-server-*\n * - npx ... mcp ...\n *\n * @returns Health status of MCP processes\n *\n * @example\n * ```ts\n * const health = await detectMCPProcesses();\n * if (health.vrekoRunning) {\n * // output:(`✓ Vreko MCP running (${health.vrekoProcesses.length} processes)`);\n * } else {\n * // output:('⚠ Vreko MCP not running');\n * }\n * ```\n */\nexport async function detectMCPProcesses(): Promise<MCPProcessHealth> {\n\ttry {\n\t\t// Use ps to find MCP-related processes\n\t\t// grep for common patterns: stdio, mcp, server names\n\t\tconst { stdout } = await execAsync(\n\t\t\t'ps aux | grep -E \"(mcp.*--stdio|--stdio.*mcp|uvx.*mcp-server|npx.*mcp|node.*mcp)\" | grep -v grep',\n\t\t\t{\n\t\t\t\ttimeout: 5000, // 5s timeout\n\t\t\t},\n\t\t);\n\n\t\tconst processes = parseProcessOutput(stdout);\n\t\tconst vrekoProcesses = processes.filter((p) => p.isVreko);\n\n\t\treturn {\n\t\t\tallProcesses: processes,\n\t\t\tvrekoProcesses,\n\t\t\tvrekoRunning: vrekoProcesses.length > 0,\n\t\t\ttotalCount: processes.length,\n\t\t\tcheckedAt: new Date(),\n\t\t};\n\t} catch {\n\t\t// ps command failed or no processes found (grep returns exit code 1)\n\t\t// Return empty result rather than throwing\n\t\treturn {\n\t\t\tallProcesses: [],\n\t\t\tvrekoProcesses: [],\n\t\t\tvrekoRunning: false,\n\t\t\ttotalCount: 0,\n\t\t\tcheckedAt: new Date(),\n\t\t};\n\t}\n}\n\n/**\n * Parse ps output into MCPProcess objects\n */\nfunction parseProcessOutput(output: string): MCPProcess[] {\n\tconst lines = output\n\t\t.trim()\n\t\t.split(\"\\n\")\n\t\t.filter((line) => line.trim());\n\n\tconst processes: MCPProcess[] = [];\n\n\tfor (const line of lines) {\n\t\t// ps aux output format: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND\n\t\t// We need PID and COMMAND\n\t\tconst match = line.match(/^(\\S+)\\s+(\\d+)\\s+.*?\\s+(.+)$/);\n\t\tif (!match) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [, , pidStr, command] = match;\n\t\tconst pid = Number.parseInt(pidStr, 10);\n\n\t\tif (Number.isNaN(pid)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Determine server name from command\n\t\tconst serverName = extractServerName(command);\n\t\tconst isVreko = command.toLowerCase().includes(\"vreko\");\n\n\t\tprocesses.push({\n\t\t\tpid,\n\t\t\tcommand: command.trim(),\n\t\t\tserverName,\n\t\t\tisVreko,\n\t\t});\n\t}\n\n\treturn processes;\n}\n\n/**\n * Extract MCP server name from command string\n */\nfunction extractServerName(command: string): string {\n\t// Try to extract server name from common patterns\n\tconst patterns = [\n\t\t// vreko mcp --stdio\n\t\t/vreko[/\\s]/i,\n\t\t// mcp-server-fetch\n\t\t/mcp-server-(\\w+)/,\n\t\t// @modelcontextprotocol/server-sequential-thinking\n\t\t/server-(\\w+)/,\n\t\t// context7-mcp\n\t\t/(\\w+)-mcp/,\n\t\t// fly mcp server\n\t\t/fly.*mcp/i,\n\t\t// supabase-mcp\n\t\t/supabase-mcp/i,\n\t];\n\n\tfor (const pattern of patterns) {\n\t\tconst match = command.match(pattern);\n\t\tif (match) {\n\t\t\t// Return first capture group or full match\n\t\t\treturn match[1] || match[0];\n\t\t}\n\t}\n\n\t// Fallback: just say \"mcp\"\n\treturn \"mcp\";\n}\n\n/**\n * Quick check if Vreko MCP is running\n *\n * Lightweight version that just returns boolean.\n *\n * @returns true if Vreko MCP process detected\n */\nexport async function isVrekoMCPRunning(): Promise<boolean> {\n\tconst health = await detectMCPProcesses();\n\treturn health.vrekoRunning;\n}\n","/**\n * MCP Config Validation Module\n *\n * Validates MCP configurations and detects common issues.\n * Provides detailed diagnostics for troubleshooting.\n *\n * @packageDocumentation\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type { AIClientConfig, MCPServerConfig } from \"./types.js\";\n\nfunction isVrekoServerName(name: string, format?: AIClientConfig[\"format\"]): boolean {\n\tif (name === \"vreko\") {\n\t\treturn true;\n\t}\n\n\tif (format && name === `vreko-${format}`) {\n\t\treturn true;\n\t}\n\n\treturn name.startsWith(\"vreko-\");\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface ValidationIssue {\n\t/** Severity of the issue */\n\tseverity: \"error\" | \"warning\" | \"info\";\n\t/** Issue code for programmatic handling */\n\tcode: string;\n\t/** Human-readable message */\n\tmessage: string;\n\t/** Suggested fix */\n\tfix?: string;\n}\n\nexport interface ValidationResult {\n\t/** Whether the config is valid */\n\tvalid: boolean;\n\t/** List of issues found */\n\tissues: ValidationIssue[];\n\t/** The parsed vreko config (if found) */\n\tconfig?: MCPServerConfig;\n}\n\nexport interface WorkspaceValidation {\n\t/** Whether workspace path exists */\n\texists: boolean;\n\t/** Whether workspace has markers (.git, package.json, .vreko) */\n\thasMarkers: boolean;\n\t/** Workspace path being validated */\n\tpath?: string;\n}\n\n// =============================================================================\n// VALIDATION FUNCTIONS\n// =============================================================================\n\n/**\n * Validate an AI client's MCP configuration\n *\n * @param client - The client to validate\n * @returns Validation result with issues\n *\n * @example\n * ```ts\n * const client = getClient('qoder');\n * const result = validateClientConfig(client);\n *\n * if (!result.valid) {\n * for (const issue of result.issues) {\n * console.error(`${issue.severity}: ${issue.message}`);\n * if (issue.fix) process.stdout.write(`Fix: ${issue.fix}`);\n * }\n * }\n * ```\n */\nexport function validateClientConfig(client: AIClientConfig): ValidationResult {\n\tconst issues: ValidationIssue[] = [];\n\n\t// Check if config file exists\n\tif (!existsSync(client.configPath)) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"CONFIG_NOT_FOUND\",\n\t\t\tmessage: `Config file not found: ${client.configPath}`,\n\t\t\tfix: `Run: vreko tools configure --${client.name}`,\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Try to read and parse config\n\tlet configContent: string;\n\tlet parsedConfig: unknown;\n\n\ttry {\n\t\tconfigContent = readFileSync(client.configPath, \"utf-8\");\n\t} catch (error) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"CONFIG_READ_ERROR\",\n\t\t\tmessage: `Cannot read config file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\tfix: \"Check file permissions\",\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\ttry {\n\t\tparsedConfig = JSON.parse(configContent);\n\t} catch (error) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"CONFIG_PARSE_ERROR\",\n\t\t\tmessage: `Invalid JSON in config file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\tfix: `Edit ${client.configPath} to fix JSON syntax, or run: vreko tools configure --${client.name} --force`,\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Check if Vreko is configured\n\tif (!client.hasVreko) {\n\t\tissues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"VREKO_NOT_CONFIGURED\",\n\t\t\tmessage: \"Vreko MCP server not found in config\",\n\t\t\tfix: `Run: vreko tools configure --${client.name}`,\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Extract vreko config based on format\n\tconst vrekoConfig = extractVrekoConfig(parsedConfig, client.format);\n\tif (!vrekoConfig) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"VREKO_CONFIG_INVALID\",\n\t\t\tmessage: \"Vreko config found but cannot be parsed\",\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Validate vreko config structure\n\tvalidateVrekoConfig(vrekoConfig, issues);\n\n\t// Validate workspace path if present\n\tif (vrekoConfig.command && vrekoConfig.args) {\n\t\tconst workspaceIdx = vrekoConfig.args.indexOf(\"--workspace\");\n\t\tif (workspaceIdx !== -1 && workspaceIdx + 1 < vrekoConfig.args.length) {\n\t\t\tconst workspacePath = vrekoConfig.args[workspaceIdx + 1];\n\t\t\tconst wsValidation = validateWorkspacePath(workspacePath);\n\n\t\t\tif (!wsValidation.exists) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"WORKSPACE_NOT_FOUND\",\n\t\t\t\t\tmessage: `Workspace path does not exist: ${workspacePath}`,\n\t\t\t\t\tfix: \"Update workspace path or run: vreko tools configure --force\",\n\t\t\t\t});\n\t\t\t} else if (!wsValidation.hasMarkers) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"WORKSPACE_NO_MARKERS\",\n\t\t\t\t\tmessage: `Workspace path has no markers (.git, package.json, .vreko): ${workspacePath}`,\n\t\t\t\t\tfix: \"Run: vreko init\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: issues.filter((i) => i.severity === \"error\").length === 0,\n\t\tissues,\n\t\tconfig: vrekoConfig,\n\t};\n}\n\n/**\n * Validate workspace path\n */\nexport function validateWorkspacePath(workspacePath: string): WorkspaceValidation {\n\tconst absPath = resolve(workspacePath);\n\n\tif (!existsSync(absPath)) {\n\t\treturn { exists: false, hasMarkers: false, path: absPath };\n\t}\n\n\t// Check for workspace markers\n\tconst hasGit = existsSync(resolve(absPath, \".git\"));\n\tconst hasPackageJson = existsSync(resolve(absPath, \"package.json\"));\n\tconst hasVreko = existsSync(resolve(absPath, \".vreko\"));\n\n\treturn {\n\t\texists: true,\n\t\thasMarkers: hasGit || hasPackageJson || hasVreko,\n\t\tpath: absPath,\n\t};\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Extract Vreko config from parsed config file\n */\nfunction extractVrekoConfig(parsed: unknown, format: AIClientConfig[\"format\"]): MCPServerConfig | null {\n\tif (!parsed || typeof parsed !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst config = parsed as Record<string, unknown>;\n\n\tswitch (format) {\n\t\tcase \"vscode\":\n\t\t\t// VS Code .vscode/mcp.json uses \"servers\" key, not \"mcpServers\"\n\t\t\tif (\"servers\" in config && typeof config.servers === \"object\" && config.servers !== null) {\n\t\t\t\tconst servers = config.servers as Record<string, unknown>;\n\t\t\t\tfor (const [name, server] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, format) && typeof server === \"object\" && server !== null) {\n\t\t\t\t\t\treturn server as MCPServerConfig;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\n\t\tcase \"claude\":\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"qoder\":\n\t\tcase \"gemini\":\n\t\tcase \"zed\":\n\t\tcase \"claude-code\":\n\t\t\t// Standard mcpServers format\n\t\t\tif (\"mcpServers\" in config && typeof config.mcpServers === \"object\" && config.mcpServers !== null) {\n\t\t\t\tconst servers = config.mcpServers as Record<string, unknown>;\n\t\t\t\t// Check namespaced key first\n\t\t\t\tfor (const [name, server] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, format) && typeof server === \"object\" && server !== null) {\n\t\t\t\t\t\treturn server as MCPServerConfig;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\n\t\tcase \"continue\":\n\t\t\t// Continue uses experimental.modelContextProtocolServers array\n\t\t\tif (\"experimental\" in config && typeof config.experimental === \"object\" && config.experimental !== null) {\n\t\t\t\tconst experimental = config.experimental as Record<string, unknown>;\n\t\t\t\tif (\n\t\t\t\t\t\"modelContextProtocolServers\" in experimental &&\n\t\t\t\t\tArray.isArray(experimental.modelContextProtocolServers)\n\t\t\t\t) {\n\t\t\t\t\tconst server = experimental.modelContextProtocolServers.find(\n\t\t\t\t\t\t(s: unknown) =>\n\t\t\t\t\t\t\ttypeof s === \"object\" &&\n\t\t\t\t\t\t\ts !== null &&\n\t\t\t\t\t\t\ttypeof (s as Record<string, unknown>).name === \"string\" &&\n\t\t\t\t\t\t\tisVrekoServerName((s as Record<string, unknown>).name as string),\n\t\t\t\t\t);\n\t\t\t\t\treturn server ? (server as MCPServerConfig) : null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/**\n * Validate Vreko config structure\n */\nfunction validateVrekoConfig(config: MCPServerConfig, issues: ValidationIssue[]): void {\n\t// Must have either command or url\n\tif (!config.command && !config.url) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"MISSING_COMMAND_OR_URL\",\n\t\t\tmessage: \"Config must have either 'command' (stdio) or 'url' (HTTP)\",\n\t\t\tfix: \"Run: vreko tools configure --force\",\n\t\t});\n\t\treturn;\n\t}\n\n\t// If using stdio transport (command), validate structure\n\tif (config.command) {\n\t\t// CRITICAL: Validate that command is executable\n\t\tif (!isCommandExecutable(config.command)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"COMMAND_NOT_EXECUTABLE\",\n\t\t\t\tmessage: `Command not found or not executable: ${config.command}`,\n\t\t\t\tfix: \"Run: vreko tools repair (will auto-fix node path)\",\n\t\t\t});\n\t\t}\n\n\t\tif (!config.args || !Array.isArray(config.args)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"MISSING_ARGS\",\n\t\t\t\tmessage: \"Command-based config must have 'args' array\",\n\t\t\t\tfix: \"Run: vreko tools configure --force\",\n\t\t\t});\n\t\t} else {\n\t\t\t// Check for required args\n\t\t\tif (!config.args.includes(\"mcp\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"MISSING_MCP_ARG\",\n\t\t\t\t\tmessage: \"Args must include 'mcp' command\",\n\t\t\t\t\tfix: \"Run: vreko tools configure --force\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!config.args.includes(\"--stdio\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"MISSING_STDIO_ARG\",\n\t\t\t\t\tmessage: \"Args must include '--stdio' flag\",\n\t\t\t\t\tfix: \"Run: vreko mcp repair --client <name>\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Check for deprecated 'shim' command (removed in favor of --stdio)\n\t\t\tif (config.args.includes(\"shim\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\tcode: \"DEPRECATED_SHIM_COMMAND\",\n\t\t\t\t\tmessage: \"Args contain deprecated 'shim' command - use '--stdio' instead\",\n\t\t\t\t\tfix: \"Run: vreko mcp repair --client <name>\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Warn if missing workspace\n\t\t\tif (!config.args.includes(\"--workspace\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tcode: \"MISSING_WORKSPACE_ARG\",\n\t\t\t\t\tmessage: \"Args should include '--workspace' path for reliability\",\n\t\t\t\t\tfix: \"Run: vreko tools configure --force\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Validate CLI path exists (first arg after command)\n\t\t\tif (config.args.length > 0) {\n\t\t\t\tconst cliPath = config.args[0];\n\t\t\t\tif (cliPath?.endsWith(\".js\") && !existsSync(cliPath)) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: \"error\",\n\t\t\t\t\t\tcode: \"CLI_PATH_NOT_FOUND\",\n\t\t\t\t\t\tmessage: `CLI script not found: ${cliPath}`,\n\t\t\t\t\t\tfix: \"Rebuild CLI: pnpm --filter @vreko/cli build\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// If using HTTP transport (url), validate\n\tif (config.url) {\n\t\ttry {\n\t\t\tnew URL(config.url);\n\t\t} catch {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"error\",\n\t\t\t\tcode: \"INVALID_URL\",\n\t\t\t\tmessage: `Invalid server URL: ${config.url}`,\n\t\t\t\tfix: \"Run: vreko tools configure --force\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Check for API key or workspace ID in env\n\tif (config.env) {\n\t\tif (!config.env.VREKO_API_KEY && !config.env.VREKO_WORKSPACE_ID) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\tcode: \"NO_AUTH\",\n\t\t\t\tmessage: \"No API key or workspace ID found (free tier will be used)\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Check if a command is executable (exists in PATH or is absolute path)\n *\n * @param command - Command to check\n * @returns True if command is likely executable\n */\nfunction isCommandExecutable(command: string): boolean {\n\t// If it's an absolute path, check if file exists\n\tif (command.startsWith(\"/\") || command.match(/^[A-Z]:\\\\/i)) {\n\t\treturn existsSync(command);\n\t}\n\n\t// For relative commands, try to find them\n\ttry {\n\t\tconst isWindows = process.platform === \"win32\";\n\t\tconst cmd = isWindows ? `where ${command}` : `which ${command}`;\n\t\texecSync(cmd, { encoding: \"utf-8\", timeout: 5000 });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n","/**\n * MCP Config Writer Module\n *\n * Writes Vreko MCP configuration to AI client config files.\n * Handles backup creation, merging with existing config, and various formats.\n *\n * @packageDocumentation\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { evictCachedPath } from \"./path-cache.js\";\nimport type {\n\tAIClientConfig,\n\tAIClientFormat,\n\tMCPConfig,\n\tMCPServerConfig,\n\tRemoveResult,\n\tVrekoConfigOptions,\n\tWriteResult,\n} from \"./types.js\";\n\n// =============================================================================\n// PATH RESOLUTION UTILITIES\n// =============================================================================\n\n/** Cached node path to avoid repeated lookups */\nlet cachedNodePath: string | null = null;\n\n/**\n * Resolve the absolute path to the Node.js executable\n *\n * This is critical for MCP reliability - using just \"node\" depends on PATH\n * which varies between environments (terminal vs IDE vs system service).\n *\n * @returns Absolute path to node, or \"node\" as fallback\n */\nexport function resolveNodePath(): string {\n\tif (cachedNodePath) {\n\t\treturn cachedNodePath;\n\t}\n\n\ttry {\n\t\t// Try `which node` (Unix) or `where node` (Windows)\n\t\tconst isWindows = process.platform === \"win32\";\n\t\tconst command = isWindows ? \"where node\" : \"which node\";\n\t\tconst result = execSync(command, { encoding: \"utf-8\", timeout: 5000 }).trim();\n\n\t\t// On Windows, `where` may return multiple paths - take the first\n\t\tconst nodePath = result.split(/\\r?\\n/)[0].trim();\n\n\t\tif (nodePath && existsSync(nodePath)) {\n\t\t\tcachedNodePath = nodePath;\n\t\t\treturn nodePath;\n\t\t}\n\t} catch {\n\t\t// Fallback: try common paths\n\t\tconst commonPaths = [\n\t\t\t\"/opt/homebrew/bin/node\", // macOS ARM (Homebrew)\n\t\t\t\"/usr/local/bin/node\", // macOS Intel (Homebrew)\n\t\t\t\"/usr/bin/node\", // Linux\n\t\t\t\"C:\\\\Program Files\\\\nodejs\\\\node.exe\", // Windows\n\t\t];\n\n\t\tfor (const path of commonPaths) {\n\t\t\tif (existsSync(path)) {\n\t\t\t\tcachedNodePath = path;\n\t\t\t\treturn path;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Final fallback - use \"node\" and hope PATH is set\n\treturn \"node\";\n}\n\n/**\n * Resolve the absolute path to the Vreko CLI binary.\n *\n * Shell aliases (e.g., `vreko`) are NEVER usable as MCP server commands because\n * IDE and service processes spawn without a shell - aliases are invisible to them.\n * Always resolve to an absolute path or a verifiable PATH entry.\n *\n * @returns Absolute path to vreko binary, or \"vreko\" as fallback\n */\nexport function resolveVrekoBinaryPath(): string {\n\ttry {\n\t\tconst isWindows = process.platform === \"win32\";\n\t\tconst command = isWindows ? \"where vreko\" : \"which vreko\";\n\t\tconst result = execSync(command, { encoding: \"utf-8\", timeout: 5000 }).trim();\n\t\tconst binaryPath = result.split(/\\r?\\n/)[0].trim();\n\t\tif (binaryPath && existsSync(binaryPath)) {\n\t\t\treturn binaryPath;\n\t\t}\n\t} catch {\n\t\t// PATH resolution failed - fall through to well-known paths\n\t}\n\n\t// Well-known absolute paths for Homebrew and npm-global installs.\n\t// These are stable across shell sessions and IDE spawned processes.\n\tconst commonPaths = [\n\t\t\"/opt/homebrew/bin/vreko\", // macOS ARM (Homebrew)\n\t\t\"/usr/local/bin/vreko\", // macOS Intel (Homebrew / nvm)\n\t\t\"/usr/bin/vreko\", // Linux system\n\t];\n\n\tfor (const p of commonPaths) {\n\t\tif (existsSync(p)) {\n\t\t\treturn p;\n\t\t}\n\t}\n\n\t// Final fallback - will fail in IDE environments without a corrected PATH,\n\t// but doctor/probe will catch this and report ENOENT with a clear fix message.\n\treturn \"vreko\";\n}\n\n/**\n * Check if a command is executable (exists in PATH or is absolute path)\n *\n * @param command - Command to check\n * @returns True if command is likely executable\n */\nexport function isCommandExecutable(command: string): boolean {\n\t// If it's an absolute path, check if file exists\n\tif (command.startsWith(\"/\") || command.match(/^[A-Z]:\\\\/i)) {\n\t\treturn existsSync(command);\n\t}\n\n\t// For relative commands, try to find them\n\ttry {\n\t\tconst isWindows = process.platform === \"win32\";\n\t\tconst cmd = isWindows ? `where ${command}` : `which ${command}`;\n\t\texecSync(cmd, { encoding: \"utf-8\", timeout: 5000 });\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n// =============================================================================\n// CONFIG GENERATION\n// =============================================================================\n\n/**\n * Clients that require remote HTTP transport (cannot use local stdio).\n * Currently unused - remote HTTP is now the default transport.\n * Retained for future use if a client requires local stdio override.\n */\nconst _REMOTE_ONLY_CLIENTS: Set<string> = new Set([\n\t// Currently none\n]);\n\n/**\n * Generate Vreko MCP server configuration\n *\n * @param options - Configuration options\n * @returns MCP server config for Vreko\n *\n * @example\n * ```ts\n * // RECOMMENDED: NPX mode for npm-installed CLI\n * // Best for users who installed via: npm install -g @vreko/cli\n * const npxConfig = getVrekoMCPConfig({\n * useNpx: true,\n * workspaceRoot: '/path/to/project'\n * });\n * // Generates: npx @vreko/cli mcp --stdio --workspace /path/to/project\n *\n * // Workspace ID auth (no API key in config)\n * const config = getVrekoMCPConfig({\n * workspaceId: 'ws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'\n * });\n *\n * // Legacy: API key auth (still supported)\n * const legacyConfig = getVrekoMCPConfig({ apiKey: 'sb_live_xxx' });\n *\n * // Local development mode\n * const devConfig = getVrekoMCPConfig({\n * useLocalDev: true,\n * localCliPath: '/path/to/apps/cli/dist/index.js',\n * workspaceRoot: '/path/to/project'\n * });\n *\n * // Custom remote server\n * const customConfig = getVrekoMCPConfig({\n * serverUrl: 'https://custom-mcp.example.com',\n * workspaceId: 'ws_xxx'\n * });\n *\n * // Legacy stdio mode (using binary)\n * const stdioConfig = getVrekoMCPConfig({\n * useBinary: true,\n * apiKey: 'sb_live_xxx'\n * });\n *\n * // Claude Desktop (auto-uses npx since Claude Desktop requires stdio)\n * const claudeConfig = getVrekoMCPConfig({\n * client: 'claude',\n * workspaceRoot: '/path/to/project'\n * });\n * ```\n */\nexport function getVrekoMCPConfig(options: VrekoConfigOptions = {}): MCPServerConfig {\n\tconst {\n\t\tapiKey,\n\t\tworkspaceId,\n\t\tserverUrl,\n\t\tuseBinary = false,\n\t\tcustomCommand,\n\t\tadditionalEnv,\n\t\tworkspaceRoot,\n\t\tuseLocalDev = false,\n\t\tlocalCliPath,\n\t\tuseDoppler = false,\n\t\tdopplerProject = \"vreko-shared\",\n\t\tdopplerConfig = \"dev\",\n\t\tuseSse = false,\n\t\tuseStreamableHttp = false,\n\t\tclient,\n\t} = options;\n\n\t// NPX is only engaged when explicitly requested.\n\t// The default transport is remote HTTP (Fly.io remote intelligence orchestrator).\n\tconst useNpx = options.useNpx === true;\n\n\t// Build environment variables - only relevant for stdio transports.\n\t// HTTP transport uses headers, not env vars.\n\tconst env: Record<string, string> = { ...additionalEnv };\n\tif (apiKey) {\n\t\tenv.VREKO_API_KEY = apiKey;\n\t}\n\n\t// Priority 1: Custom command\n\tif (customCommand) {\n\t\treturn {\n\t\t\tcommand: customCommand,\n\t\t\targs: [],\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Priority 1.5: Claude Desktop - stdio-only client, always use npx\n\t// Claude Desktop does not support HTTP transport; a URL config is silently ignored.\n\t// Guard fires when client is \"claude\" and no explicit transport override is set.\n\tif (\n\t\tclient === \"claude\" &&\n\t\t!customCommand &&\n\t\t!useSse &&\n\t\t!useStreamableHttp &&\n\t\t!useDoppler &&\n\t\t!useNpx &&\n\t\t!localCliPath\n\t) {\n\t\tconst tier = apiKey ? \"pro\" : \"free\";\n\t\tconst args = [\"--yes\", \"@vreko/cli\", \"mcp\", \"--stdio\", \"--tier\", tier];\n\t\tif (workspaceRoot) {\n\t\t\targs.push(\"--workspace\", workspaceRoot);\n\t\t}\n\t\treturn { command: \"npx\", args };\n\t}\n\n\t// Priority 2: Explicit SSE/Streamable-HTTP transport\n\t// Uses /mcp endpoint (single endpoint for POST/GET/DELETE).\n\t// NOTE: env vars don't work for HTTP - use headers instead.\n\tif (useSse || useStreamableHttp) {\n\t\tconst url = serverUrl || \"https://mcp.vreko.dev/mcp\";\n\t\tconst headers: Record<string, string> = {};\n\t\tif (workspaceId) {\n\t\t\theaders[\"x-workspace-id\"] = workspaceId;\n\t\t}\n\t\tif (apiKey) {\n\t\t\theaders[\"x-api-key\"] = apiKey;\n\t\t}\n\t\treturn {\n\t\t\turl,\n\t\t\t...(Object.keys(headers).length > 0 && { headers }),\n\t\t};\n\t}\n\n\t// Priority 3: Doppler mode - wraps with `doppler run` for env injection\n\tif (useDoppler && localCliPath) {\n\t\tconst nodePath = resolveNodePath();\n\t\tconst dopplerBase = [\"run\", \"--project\", dopplerProject, \"--config\", dopplerConfig, \"--\"];\n\t\tconst tier = apiKey ? \"pro\" : \"free\";\n\t\tconst dopplerArgs = [...dopplerBase, nodePath, localCliPath, \"mcp\", \"--stdio\", \"--tier\", tier];\n\t\tif (workspaceRoot) {\n\t\t\tdopplerArgs.push(\"--workspace\", workspaceRoot);\n\t\t}\n\t\treturn { command: \"doppler\", args: dopplerArgs };\n\t}\n\n\t// Priority 4: Explicit NPX mode (stdio, npm-installed CLI)\n\tif (useNpx) {\n\t\tconst tier = apiKey ? \"pro\" : \"free\";\n\t\tconst args = [\"--yes\", \"@vreko/cli\", \"mcp\", \"--stdio\", \"--tier\", tier];\n\t\tif (workspaceRoot) {\n\t\t\targs.push(\"--workspace\", workspaceRoot);\n\t\t}\n\t\treturn {\n\t\t\tcommand: \"npx\",\n\t\t\targs,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Priority 5: Local development mode - direct node execution\n\t// CRITICAL: resolves absolute node path to avoid PATH issues in IDE processes\n\tif (useLocalDev && localCliPath) {\n\t\tconst tier = apiKey ? \"pro\" : \"free\";\n\t\tconst args = [localCliPath, \"mcp\", \"--stdio\", \"--tier\", tier];\n\t\tif (workspaceRoot) {\n\t\t\targs.push(\"--workspace\", workspaceRoot);\n\t\t}\n\t\tconst nodePath = resolveNodePath();\n\t\treturn {\n\t\t\tcommand: nodePath,\n\t\t\targs,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Priority 6: Binary mode (legacy stdio transport)\n\t// CRITICAL: resolves absolute binary path - relative \"vreko\" fails in IDE\n\t// processes that spawn without a shell (no PATH augmentation, no aliases).\n\tif (useBinary) {\n\t\tconst tier = apiKey ? \"pro\" : \"free\";\n\t\tconst args = [\"mcp\", \"--stdio\", \"--tier\", tier];\n\t\tif (workspaceRoot) {\n\t\t\targs.push(\"--workspace\", workspaceRoot);\n\t\t}\n\t\treturn {\n\t\t\tcommand: resolveVrekoBinaryPath(),\n\t\t\targs,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Default: remote HTTP (Fly.io remote intelligence orchestrator)\n\t// apiKey and workspaceId go in headers - secure, not logged in URL.\n\t// additionalEnv is not forwarded for HTTP transport.\n\tconst url = serverUrl || \"https://mcp.vreko.dev/mcp\";\n\tconst headers: Record<string, string> = {};\n\tif (workspaceId) {\n\t\theaders[\"x-workspace-id\"] = workspaceId;\n\t}\n\tif (apiKey) {\n\t\theaders[\"x-api-key\"] = apiKey;\n\t}\n\treturn {\n\t\turl,\n\t\t...(Object.keys(headers).length > 0 && { headers }),\n\t};\n}\n\n// =============================================================================\n// CONFIG WRITING\n// =============================================================================\n\n/**\n * Write Vreko MCP config to an AI client's config file\n *\n * @param client - The AI client to configure\n * @param mcpConfig - The MCP server configuration\n * @returns Result of the write operation\n *\n * @example\n * ```ts\n * const client = getClient('cursor');\n * const mcpConfig = getVrekoMCPConfig({ apiKey: 'sk_...' });\n *\n * const result = writeClientConfig(client, mcpConfig);\n * if (result.success) {\n * // output:('Configured! Backup at:', result.backup);\n * } else {\n * console.error('Failed:', result.error);\n * }\n * ```\n */\nexport function writeClientConfig(client: AIClientConfig, mcpConfig: MCPServerConfig): WriteResult {\n\ttry {\n\t\t// Ensure directory exists\n\t\tconst configDir = dirname(client.configPath);\n\t\tmkdirSync(configDir, { recursive: true });\n\n\t\t// Read existing config or start fresh\n\t\tlet existingConfig: MCPConfig = { mcpServers: {} };\n\t\tlet hasExistingConfig = false;\n\n\t\tif (existsSync(client.configPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(client.configPath, \"utf-8\");\n\t\t\t\texistingConfig = JSON.parse(content) as MCPConfig;\n\t\t\t\thasExistingConfig = Object.keys(existingConfig).length > 0;\n\t\t\t} catch {\n\t\t\t\t// Invalid JSON, will overwrite\n\t\t\t}\n\t\t}\n\n\t\t// Create backup if there's existing content\n\t\tlet backup: string | undefined;\n\t\tif (hasExistingConfig) {\n\t\t\tbackup = `${client.configPath}.backup.${Date.now()}`;\n\t\t\twriteFileSync(backup, JSON.stringify(existingConfig, null, 2));\n\t\t}\n\n\t\t// Merge configs based on format\n\t\tconst newConfig = mergeConfig(existingConfig, mcpConfig, client.format);\n\n\t\t// Write updated config\n\t\twriteFileSync(client.configPath, JSON.stringify(newConfig, null, 2));\n\n\t\treturn { success: true, backup };\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Remove Vreko configuration from an AI client\n * §10.1: Removes namespaced entries (vreko-<client>)\n *\n * @param client - The AI client to remove config from\n * @returns Result of the removal operation\n */\nexport function removeVrekoConfig(client: AIClientConfig): RemoveResult {\n\ttry {\n\t\tif (!existsSync(client.configPath)) {\n\t\t\treturn { success: true }; // Nothing to remove\n\t\t}\n\n\t\tconst content = readFileSync(client.configPath, \"utf-8\");\n\t\tconst config = JSON.parse(content) as MCPConfig;\n\t\t// Remove based on format\n\t\tswitch (client.format) {\n\t\t\tcase \"claude\":\n\t\t\tcase \"cursor\":\n\t\t\tcase \"windsurf\":\n\t\t\tcase \"cline\":\n\t\t\tcase \"roo-code\":\n\t\t\tcase \"gemini\":\n\t\t\tcase \"claude-code\":\n\t\t\tcase \"qoder\": {\n\t\t\t\t// Remove namespaced keys\n\t\t\t\tfor (const key of Object.keys(config.mcpServers ?? {})) {\n\t\t\t\t\tif (isVrekoServerName(key, client.format)) {\n\t\t\t\t\t\tdelete config.mcpServers[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"vscode\": {\n\t\t\t\t// VS Code uses \"servers\" not \"mcpServers\"\n\t\t\t\tconst vscodeConfig = config as unknown as Record<string, unknown>;\n\t\t\t\tconst servers = vscodeConfig.servers as Record<string, unknown> | undefined;\n\t\t\t\tfor (const key of Object.keys(servers ?? {})) {\n\t\t\t\t\tif (servers && isVrekoServerName(key, client.format)) {\n\t\t\t\t\t\tdelete servers[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"zed\": {\n\t\t\t\t// Zed uses \"context_servers\" not \"mcpServers\"\n\t\t\t\tconst zedConfig = config as unknown as Record<string, unknown>;\n\t\t\t\tconst contextServers = zedConfig.context_servers as Record<string, unknown> | undefined;\n\t\t\t\tfor (const key of Object.keys(contextServers ?? {})) {\n\t\t\t\t\tif (contextServers && isVrekoServerName(key, client.format)) {\n\t\t\t\t\t\tdelete contextServers[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"continue\": {\n\t\t\t\t// Continue uses different structure\n\t\t\t\tconst experimental = (config as unknown as Record<string, unknown>).experimental as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| undefined;\n\t\t\t\tif (experimental?.modelContextProtocolServers) {\n\t\t\t\t\tconst servers = experimental.modelContextProtocolServers as Array<{ name: string }>;\n\t\t\t\t\t// Remove all vreko entries\n\t\t\t\t\texperimental.modelContextProtocolServers = servers.filter(\n\t\t\t\t\t\t(s) => !isVrekoServerName(s.name, \"continue\"),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\twriteFileSync(client.configPath, JSON.stringify(config, null, 2));\n\n\t\t// Evict the path cache so the next detectAIClients re-probes all candidates\n\t\tevictCachedPath(client.name);\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * §10.1: Generate namespaced server key for client\n * Vreko SHALL NEVER use just \"vreko\" - always \"vreko-<client>\"\n *\n * @param client - Client format (e.g., \"claude\", \"cursor\")\n * @returns Namespaced server key (e.g., \"vreko-claude\")\n */\nexport function getServerKey(client: AIClientFormat | undefined): string {\n\tif (!client) {\n\t\treturn \"vreko\"; // Primary server key\n\t}\n\treturn `vreko-${client}`;\n}\n\nfunction isVrekoServerName(name: string, client: AIClientFormat | undefined): boolean {\n\tconst serverKey = getServerKey(client);\n\treturn name === serverKey || name === \"vreko\" || name.startsWith(\"vreko-\");\n}\n\n/**\n * Merge Vreko config into existing config based on format\n * §10.1: Uses namespaced server keys (vreko-<client>)\n */\nfunction mergeConfig(\n\texisting: MCPConfig,\n\tvrekoConfig: MCPServerConfig,\n\tformat: AIClientConfig[\"format\"],\n): MCPConfig | Record<string, unknown> {\n\t// §10.1: Use namespaced server key\n\tconst serverKey = getServerKey(format);\n\n\tswitch (format) {\n\t\tcase \"claude\":\n\t\tcase \"cursor\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"gemini\":\n\t\tcase \"claude-code\":\n\t\t\t// Standard mcpServers format with namespaced key\n\t\t\treturn {\n\t\t\t\t...existing,\n\t\t\t\tmcpServers: {\n\t\t\t\t\t...(existing.mcpServers || {}),\n\t\t\t\t\t[serverKey]: vrekoConfig,\n\t\t\t\t},\n\t\t\t};\n\n\t\tcase \"windsurf\":\n\t\t\t// Windsurf uses standard format but supports disabled and alwaysAllow fields for UX\n\t\t\treturn {\n\t\t\t\t...existing,\n\t\t\t\tmcpServers: {\n\t\t\t\t\t...(existing.mcpServers || {}),\n\t\t\t\t\t[serverKey]: {\n\t\t\t\t\t\t...vrekoConfig,\n\t\t\t\t\t\tdisabled: false, // Explicitly enable\n\t\t\t\t\t\talwaysAllow: [], // Empty by default, user can configure\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\tcase \"qoder\": {\n\t\t\t// Qoder requires an explicit `type` field for every MCP server entry.\n\t\t\t//\n\t\t\t// Type mapping:\n\t\t\t// \"stdio\" - command-based (local daemon via IPC)\n\t\t\t// \"sse\" - SSE transport for local dev servers (localhost/127.0.0.1)\n\t\t\t// \"http\" - MCP Streamable HTTP for remote production servers\n\t\t\t// (e.g. mcp.vreko.dev/mcp uses POST/GET/DELETE on one endpoint)\n\t\t\tlet qoderType: \"stdio\" | \"sse\" | \"http\";\n\t\t\tif (vrekoConfig.url) {\n\t\t\t\tconst isLocal =\n\t\t\t\t\tvrekoConfig.url.startsWith(\"http://localhost\") || vrekoConfig.url.startsWith(\"http://127.0.0.1\");\n\t\t\t\tqoderType = isLocal ? \"sse\" : \"http\";\n\t\t\t} else {\n\t\t\t\tqoderType = \"stdio\";\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...existing,\n\t\t\t\tmcpServers: {\n\t\t\t\t\t...(existing.mcpServers || {}),\n\t\t\t\t\t[serverKey]: {\n\t\t\t\t\t\ttype: qoderType,\n\t\t\t\t\t\t...vrekoConfig,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"vscode\": {\n\t\t\t// VS Code uses \"servers\" not \"mcpServers\" and requires explicit type\n\t\t\tconst vscodeConfig = existing as unknown as Record<string, unknown>;\n\t\t\tconst servers = (vscodeConfig.servers || {}) as Record<string, unknown>;\n\t\t\t// Remove mcpServers if it exists (shouldn't be there for VS Code)\n\t\t\tconst { mcpServers: _, ...rest } = vscodeConfig;\n\t\t\treturn {\n\t\t\t\t...rest,\n\t\t\t\tservers: {\n\t\t\t\t\t...servers,\n\t\t\t\t\t[serverKey]: {\n\t\t\t\t\t\ttype: \"stdio\", // Required by VS Code\n\t\t\t\t\t\t...vrekoConfig,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"zed\": {\n\t\t\t// Zed uses \"context_servers\" not \"mcpServers\"\n\t\t\tconst zedConfig = existing as unknown as Record<string, unknown>;\n\t\t\tconst contextServers = (zedConfig.context_servers || {}) as Record<string, unknown>;\n\t\t\t// Remove mcpServers if it exists (shouldn't be there for Zed)\n\t\t\tconst { mcpServers: _, ...rest } = zedConfig;\n\t\t\treturn {\n\t\t\t\t...rest,\n\t\t\t\tcontext_servers: {\n\t\t\t\t\t...contextServers,\n\t\t\t\t\t[serverKey]: vrekoConfig,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"continue\": {\n\t\t\t// Continue uses experimental.modelContextProtocolServers array\n\t\t\tconst continueConfig = existing as unknown as Record<string, unknown>;\n\t\t\tconst experimental = (continueConfig.experimental || {}) as Record<string, unknown>;\n\t\t\tconst servers = (experimental.modelContextProtocolServers || []) as Array<Record<string, unknown>>;\n\n\t\t\t// Remove existing vreko entries if present\n\t\t\tconst filteredServers = servers.filter((s) => {\n\t\t\t\tconst name = s.name as string;\n\t\t\t\treturn !name?.startsWith(\"vreko\");\n\t\t\t});\n\n\t\t\t// Add new vreko config with namespaced name\n\t\t\tfilteredServers.push({\n\t\t\t\tname: serverKey,\n\t\t\t\t...vrekoConfig,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...continueConfig,\n\t\t\t\texperimental: {\n\t\t\t\t\t...experimental,\n\t\t\t\t\tmodelContextProtocolServers: filteredServers,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase \"aider\":\n\t\t\t// Aider uses YAML - handled separately (this shouldn't be called)\n\t\t\t// For now, return existing config unchanged\n\t\t\treturn existing;\n\n\t\tdefault:\n\t\t\t// Fallback to standard format with namespaced key\n\t\t\treturn {\n\t\t\t\t...existing,\n\t\t\t\tmcpServers: {\n\t\t\t\t\t...(existing.mcpServers || {}),\n\t\t\t\t\t[serverKey]: vrekoConfig,\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/**\n * Patch VREKO_API_KEY in an existing Vreko MCP server entry.\n *\n * Reads the client config, finds any vreko-* server entry, updates (or\n * adds) the env.VREKO_API_KEY value, and writes the file back. This is\n * called after `vreko login` to upgrade any pre-existing zero-config configs\n * with the newly provisioned sk_live_* key.\n *\n * @param client - The AI client whose config should be patched\n * @param apiKey - The sk_live_* key to inject\n * @returns Whether the patch succeeded\n */\nexport function patchApiKeyInClientConfig(client: AIClientConfig, apiKey: string): boolean {\n\ttry {\n\t\tif (!existsSync(client.configPath)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst raw = readFileSync(client.configPath, \"utf-8\");\n\t\tconst config = JSON.parse(raw) as Record<string, unknown>;\n\t\tlet patched = false;\n\n\t\tconst patchEntry = (entry: unknown): boolean => {\n\t\t\tif (typeof entry !== \"object\" || entry === null) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst e = entry as Record<string, unknown>;\n\t\t\t// HTTP transport (has URL): inject key into headers so it reaches the remote server\n\t\t\tif (e.url && typeof e.url === \"string\") {\n\t\t\t\tif (!e.headers || typeof e.headers !== \"object\") {\n\t\t\t\t\te.headers = {};\n\t\t\t\t}\n\t\t\t\t(e.headers as Record<string, string>)[\"x-api-key\"] = apiKey;\n\t\t\t\t// Remove stale placeholder Authorization header if present\n\t\t\t\tconst headers = e.headers as Record<string, string>;\n\t\t\t\tif (headers.Authorization?.includes(\"<your-token>\")) {\n\t\t\t\t\tdelete headers.Authorization;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t// Stdio transport: inject key into env\n\t\t\tif (!e.env || typeof e.env !== \"object\") {\n\t\t\t\te.env = {};\n\t\t\t}\n\t\t\t(e.env as Record<string, string>).VREKO_API_KEY = apiKey;\n\t\t\treturn true;\n\t\t};\n\n\t\tswitch (client.format) {\n\t\t\tcase \"claude\":\n\t\t\tcase \"cursor\":\n\t\t\tcase \"windsurf\":\n\t\t\tcase \"cline\":\n\t\t\tcase \"roo-code\":\n\t\t\tcase \"gemini\":\n\t\t\tcase \"claude-code\": {\n\t\t\t\tconst servers = (config.mcpServers || {}) as Record<string, unknown>;\n\t\t\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, client.format)) {\n\t\t\t\t\t\tpatched = patchEntry(entry) || patched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"qoder\": {\n\t\t\t\t// Patch all vreko entries\n\t\t\t\tconst servers = (config.mcpServers || {}) as Record<string, unknown>;\n\t\t\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, client.format)) {\n\t\t\t\t\t\tpatched = patchEntry(entry) || patched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"vscode\": {\n\t\t\t\tconst servers = (config.servers || {}) as Record<string, unknown>;\n\t\t\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, client.format)) {\n\t\t\t\t\t\tpatched = patchEntry(entry) || patched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"zed\": {\n\t\t\t\tconst servers = (config.context_servers || {}) as Record<string, unknown>;\n\t\t\t\tfor (const [name, entry] of Object.entries(servers)) {\n\t\t\t\t\tif (isVrekoServerName(name, client.format)) {\n\t\t\t\t\t\tpatched = patchEntry(entry) || patched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"continue\": {\n\t\t\t\tconst exp = (config.experimental || {}) as Record<string, unknown>;\n\t\t\t\tconst list = (exp.modelContextProtocolServers || []) as Array<Record<string, unknown>>;\n\t\t\t\tfor (const item of list) {\n\t\t\t\t\tif (typeof item.name === \"string\" && isVrekoServerName(item.name, \"continue\")) {\n\t\t\t\t\t\tpatched = patchEntry(item) || patched;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (patched) {\n\t\t\twriteFileSync(client.configPath, JSON.stringify(config, null, 2));\n\t\t}\n\t\treturn patched;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Validate that a config was written correctly\n * §10.1: Checks for namespaced server keys (vreko-<client>)\n *\n * @param client - Client to validate\n * @returns True if Vreko is properly configured\n */\nexport function validateConfig(client: AIClientConfig): boolean {\n\ttry {\n\t\tconst content = readFileSync(client.configPath, \"utf-8\");\n\t\tconst config = JSON.parse(content) as MCPConfig;\n\t\tswitch (client.format) {\n\t\t\tcase \"claude\":\n\t\t\tcase \"cursor\":\n\t\t\tcase \"windsurf\":\n\t\t\tcase \"cline\":\n\t\t\tcase \"roo-code\":\n\t\t\tcase \"gemini\":\n\t\t\tcase \"claude-code\":\n\t\t\tcase \"qoder\": {\n\t\t\t\t// Check namespaced keys\n\t\t\t\tconst servers = config.mcpServers ?? {};\n\t\t\t\treturn Object.entries(servers).some(\n\t\t\t\t\t([name, serverConfig]) =>\n\t\t\t\t\t\tisVrekoServerName(name, client.format) &&\n\t\t\t\t\t\ttypeof serverConfig === \"object\" &&\n\t\t\t\t\t\tserverConfig !== null &&\n\t\t\t\t\t\tBoolean(\n\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).command ||\n\t\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).url,\n\t\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"vscode\": {\n\t\t\t\t// VS Code uses \"servers\" not \"mcpServers\"\n\t\t\t\tconst vscodeConfig = config as unknown as Record<string, unknown>;\n\t\t\t\tconst servers = vscodeConfig.servers as Record<string, unknown> | undefined;\n\t\t\t\treturn Boolean(\n\t\t\t\t\tObject.entries(servers ?? {}).some(\n\t\t\t\t\t\t([name, serverConfig]) =>\n\t\t\t\t\t\t\tisVrekoServerName(name, client.format) &&\n\t\t\t\t\t\t\ttypeof serverConfig === \"object\" &&\n\t\t\t\t\t\t\tserverConfig !== null &&\n\t\t\t\t\t\t\tBoolean(\n\t\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).command ||\n\t\t\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).url,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"zed\": {\n\t\t\t\t// Zed uses \"context_servers\" not \"mcpServers\"\n\t\t\t\tconst zedConfig = config as unknown as Record<string, unknown>;\n\t\t\t\tconst contextServers = zedConfig.context_servers as Record<string, unknown> | undefined;\n\t\t\t\treturn Boolean(\n\t\t\t\t\tObject.entries(contextServers ?? {}).some(\n\t\t\t\t\t\t([name, serverConfig]) =>\n\t\t\t\t\t\t\tisVrekoServerName(name, client.format) &&\n\t\t\t\t\t\t\ttypeof serverConfig === \"object\" &&\n\t\t\t\t\t\t\tserverConfig !== null &&\n\t\t\t\t\t\t\tBoolean(\n\t\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).command ||\n\t\t\t\t\t\t\t\t\t(serverConfig as { command?: string; url?: string }).url,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"continue\": {\n\t\t\t\tconst expCfg = (config as unknown as Record<string, unknown>).experimental as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| undefined;\n\t\t\t\tconst srvs = expCfg?.modelContextProtocolServers as\n\t\t\t\t\t| Array<{ name: string; command?: string; url?: string }>\n\t\t\t\t\t| undefined;\n\t\t\t\t// Check for any vreko entry\n\t\t\t\treturn Boolean(srvs?.some((s) => isVrekoServerName(s.name, \"continue\") && (s.command || s.url)));\n\t\t\t}\n\n\t\t\tcase \"aider\":\n\t\t\t\t// YAML validation would need a YAML parser\n\t\t\t\treturn false;\n\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n","/**\n * MCP Config Repair Module\n *\n * Automatically repairs broken or incomplete MCP configurations.\n * Provides autonomous recovery for common failure scenarios.\n *\n * @packageDocumentation\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type { AIClientConfig } from \"./types.js\";\nimport { type ValidationResult, validateClientConfig } from \"./validate.js\";\nimport { getVrekoMCPConfig, resolveNodePath, writeClientConfig } from \"./write.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface RepairResult {\n\t/** Whether repair was successful */\n\tsuccess: boolean;\n\t/** Issues that were fixed */\n\tfixed: string[];\n\t/** Issues that remain unfixed */\n\tremaining: string[];\n\t/** Error message if repair failed */\n\terror?: string;\n}\n\nexport interface RepairOptions {\n\t/** API key for Pro features */\n\tapiKey?: string;\n\t/** Workspace ID for tier resolution */\n\tworkspaceId?: string;\n\t/** Workspace root path (auto-detected if not provided) */\n\tworkspaceRoot?: string;\n\t/** Whether to force complete reconfiguration */\n\tforce?: boolean;\n}\n\n// =============================================================================\n// REPAIR FUNCTIONS\n// =============================================================================\n\n/**\n * Automatically repair a client's MCP configuration\n *\n * @param client - The client to repair\n * @param options - Repair options\n * @returns Repair result with fixes applied\n *\n * @example\n * ```ts\n * const client = getClient('qoder');\n * const result = await repairClientConfig(client, {\n * workspaceRoot: process.cwd()\n * });\n *\n * if (result.success) {\n * // output:('Fixed:', result.fixed);\n * } else {\n * console.error('Remaining issues:', result.remaining);\n * }\n * ```\n */\nexport function repairClientConfig(client: AIClientConfig, options: RepairOptions = {}): RepairResult {\n\tconst fixed: string[] = [];\n\tconst remaining: string[] = [];\n\n\t// Validate current config\n\tconst validation = validateClientConfig(client);\n\n\t// If force, just reconfigure completely\n\tif (options.force) {\n\t\treturn performFullReconfiguration(client, options);\n\t}\n\n\t// If no issues, no repair needed\n\tif (validation.valid && validation.issues.length === 0) {\n\t\treturn { success: true, fixed: [], remaining: [] };\n\t}\n\n\t// Try to fix each issue\n\tfor (const issue of validation.issues) {\n\t\tconst fixResult = attemptFix(client, issue, validation, options);\n\t\tif (fixResult.success) {\n\t\t\tfixed.push(issue.message);\n\t\t} else {\n\t\t\tremaining.push(issue.message);\n\t\t}\n\t}\n\n\t// If critical issues remain, do full reconfiguration\n\tconst hasCriticalErrors = remaining.some((msg) =>\n\t\tvalidation.issues.find((i) => i.message === msg && i.severity === \"error\"),\n\t);\n\n\tif (hasCriticalErrors) {\n\t\treturn performFullReconfiguration(client, options);\n\t}\n\n\treturn {\n\t\tsuccess: remaining.length === 0,\n\t\tfixed,\n\t\tremaining,\n\t};\n}\n\n/**\n * Auto-inject workspace path into MCP config\n *\n * This is the most common repair needed - automatically detecting\n * and injecting the correct workspace path when missing.\n *\n * @param client - The client to update\n * @param workspaceRoot - Workspace path (auto-detected if not provided)\n * @returns Result of the injection\n */\nexport function injectWorkspacePath(client: AIClientConfig, workspaceRoot?: string): RepairResult {\n\tconst fixed: string[] = [];\n\tconst remaining: string[] = [];\n\n\t// Detect workspace if not provided\n\tconst detectedWorkspace = workspaceRoot || detectWorkspaceRoot(process.cwd());\n\n\tif (!detectedWorkspace) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tfixed,\n\t\t\tremaining: [\"Could not auto-detect workspace root\"],\n\t\t\terror: \"No workspace markers found (.git, package.json, .vreko)\",\n\t\t};\n\t}\n\n\t// Validate detected workspace\n\tif (!existsSync(detectedWorkspace)) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tfixed,\n\t\t\tremaining: [`Workspace path does not exist: ${detectedWorkspace}`],\n\t\t\terror: \"Invalid workspace path\",\n\t\t};\n\t}\n\n\t// Get current config\n\tconst validation = validateClientConfig(client);\n\tif (!validation.config) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tfixed,\n\t\t\tremaining: [\"No existing Vreko config found\"],\n\t\t\terror: \"Must run initial configuration first\",\n\t\t};\n\t}\n\n\t// Check if using stdio transport\n\tif (!validation.config.command) {\n\t\t// Using HTTP transport, no workspace injection needed\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tfixed: [\"Config uses HTTP transport - no workspace path needed\"],\n\t\t\tremaining: [],\n\t\t};\n\t}\n\n\t// Check if workspace already set\n\tconst hasWorkspace = validation.config.args?.includes(\"--workspace\");\n\tif (hasWorkspace) {\n\t\tfixed.push(\"Workspace path already configured\");\n\t\treturn { success: true, fixed, remaining };\n\t}\n\n\t// Inject workspace by full reconfiguration\n\tconst result = performFullReconfiguration(client, {\n\t\tworkspaceRoot: detectedWorkspace,\n\t});\n\n\tif (result.success) {\n\t\tfixed.push(`Injected workspace path: ${detectedWorkspace}`);\n\t}\n\n\treturn { success: result.success, fixed, remaining };\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Attempt to fix a specific issue\n */\nfunction attemptFix(\n\tclient: AIClientConfig,\n\tissue: ValidationResult[\"issues\"][0],\n\t_validation: ValidationResult,\n\toptions: RepairOptions,\n): { success: boolean } {\n\tswitch (issue.code) {\n\t\tcase \"CONFIG_NOT_FOUND\":\n\t\tcase \"CONFIG_PARSE_ERROR\":\n\t\tcase \"VREKO_NOT_CONFIGURED\":\n\t\tcase \"MISSING_COMMAND_OR_URL\":\n\t\tcase \"MISSING_ARGS\":\n\t\tcase \"MISSING_MCP_ARG\":\n\t\tcase \"MISSING_STDIO_ARG\":\n\t\tcase \"DEPRECATED_SHIM_COMMAND\":\n\t\tcase \"INVALID_URL\":\n\t\t\t// These require full reconfiguration\n\t\t\treturn performFullReconfiguration(client, options);\n\n\t\tcase \"COMMAND_NOT_EXECUTABLE\": {\n\t\t\t// Auto-fix by resolving correct node path\n\t\t\t// This is the most common issue in IDE environments\n\t\t\treturn performFullReconfiguration(client, options);\n\t\t}\n\n\t\tcase \"CLI_PATH_NOT_FOUND\": {\n\t\t\t// Try to find CLI path automatically\n\t\t\tconst cliPath = findCliPath();\n\t\t\tif (cliPath) {\n\t\t\t\treturn performFullReconfiguration(client, options);\n\t\t\t}\n\t\t\treturn { success: false };\n\t\t}\n\n\t\tcase \"MISSING_WORKSPACE_ARG\": {\n\t\t\t// Try to inject workspace\n\t\t\tconst workspace = options.workspaceRoot || detectWorkspaceRoot(process.cwd());\n\t\t\tif (workspace) {\n\t\t\t\treturn performFullReconfiguration(client, { ...options, workspaceRoot: workspace });\n\t\t\t}\n\t\t\treturn { success: false };\n\t\t}\n\n\t\tcase \"WORKSPACE_NOT_FOUND\": {\n\t\t\t// Try to detect correct workspace\n\t\t\tconst detected = detectWorkspaceRoot(process.cwd());\n\t\t\tif (detected) {\n\t\t\t\treturn performFullReconfiguration(client, { ...options, workspaceRoot: detected });\n\t\t\t}\n\t\t\treturn { success: false };\n\t\t}\n\n\t\tcase \"WORKSPACE_NO_MARKERS\":\n\t\t\t// Warn but don't fail - workspace might be valid\n\t\t\treturn { success: true };\n\n\t\tcase \"NO_AUTH\":\n\t\t\t// Info only, not an error\n\t\t\treturn { success: true };\n\n\t\tdefault:\n\t\t\treturn { success: false };\n\t}\n}\n\n/**\n * Perform full reconfiguration\n * Auto-fixes node path issues by using resolveNodePath()\n */\nfunction performFullReconfiguration(client: AIClientConfig, options: RepairOptions): RepairResult {\n\ttry {\n\t\t// Detect workspace if not provided\n\t\tconst workspaceRoot = options.workspaceRoot || detectWorkspaceRoot(process.cwd());\n\t\tconst cliPath = findCliPath();\n\n\t\t// Determine config mode based on available paths\n\t\t// biome-ignore lint/suspicious/noImplicitAnyLet: type inferred from getVrekoMCPConfig return type\n\t\tlet mcpConfig;\n\n\t\tif (cliPath && workspaceRoot) {\n\t\t\t// Local dev mode with proper node path resolution\n\t\t\tmcpConfig = getVrekoMCPConfig({\n\t\t\t\tapiKey: options.apiKey,\n\t\t\t\tworkspaceId: options.workspaceId,\n\t\t\t\tworkspaceRoot,\n\t\t\t\tuseLocalDev: true,\n\t\t\t\tlocalCliPath: cliPath,\n\t\t\t\tclient: client.format, // Pass client format for transport selection\n\t\t\t});\n\n\t\t\t// Log the node path being used for debugging\n\t\t\tconst _nodePath = resolveNodePath();\n\t\t} else {\n\t\t\t// Fallback mode - pass client format so stdio-only clients (like Claude Desktop) use npx\n\t\t\tmcpConfig = getVrekoMCPConfig({\n\t\t\t\tapiKey: options.apiKey,\n\t\t\t\tworkspaceId: options.workspaceId,\n\t\t\t\tuseLocalDev: false,\n\t\t\t\tclient: client.format, // Pass client format for transport selection\n\t\t\t});\n\t\t}\n\n\t\t// Write config\n\t\tconst writeResult = writeClientConfig(client, mcpConfig);\n\n\t\tif (writeResult.success) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tfixed: [\"Full reconfiguration completed (node path resolved)\"],\n\t\t\t\tremaining: [],\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tfixed: [],\n\t\t\tremaining: [\"Write failed\"],\n\t\t\terror: writeResult.error,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tfixed: [],\n\t\t\tremaining: [\"Reconfiguration failed\"],\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Detect workspace root by traversing upward from current directory\n */\nfunction detectWorkspaceRoot(startPath: string): string | null {\n\tlet currentPath = resolve(startPath);\n\tconst maxIterations = 50;\n\tlet iterations = 0;\n\n\twhile (iterations < maxIterations) {\n\t\titerations++;\n\n\t\t// Check for workspace markers\n\t\tconst hasGit = existsSync(resolve(currentPath, \".git\"));\n\t\tconst hasPackageJson = existsSync(resolve(currentPath, \"package.json\"));\n\t\tconst hasVreko = existsSync(resolve(currentPath, \".vreko\"));\n\n\t\tif (hasGit || hasPackageJson || hasVreko) {\n\t\t\treturn currentPath;\n\t\t}\n\n\t\t// Move up one directory\n\t\tconst parent = resolve(currentPath, \"..\");\n\t\tif (parent === currentPath) {\n\t\t\t// Reached filesystem root\n\t\t\tbreak;\n\t\t}\n\n\t\tcurrentPath = parent;\n\t}\n\n\treturn null;\n}\n\n/**\n * Find CLI path for local dev mode\n * Tries common locations relative to current directory\n */\nfunction findCliPath(): string | undefined {\n\tconst cwd = process.cwd();\n\n\t// Try common paths\n\tconst candidates = [\n\t\tresolve(cwd, \"apps/cli/dist/index.js\"), // Monorepo\n\t\tresolve(cwd, \"dist/index.js\"), // Direct CLI repo\n\t\tresolve(cwd, \"../cli/dist/index.js\"), // Sibling directory\n\t\tresolve(cwd, \"../../apps/cli/dist/index.js\"), // Nested monorepo\n\t];\n\n\tfor (const path of candidates) {\n\t\tif (existsSync(path)) {\n\t\t\treturn path;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n"]}