@snapback/cli 1.0.2 → 1.0.3

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 (42) hide show
  1. package/dist/SkippedTestDetector-B3JZUE5G.js +5 -0
  2. package/dist/{SkippedTestDetector-JY4EF5BN.js.map → SkippedTestDetector-B3JZUE5G.js.map} +1 -1
  3. package/dist/{analysis-B4NVULM4.js → analysis-Z53F5FT2.js} +6 -5
  4. package/dist/{analysis-B4NVULM4.js.map → analysis-Z53F5FT2.js.map} +1 -1
  5. package/dist/{chunk-BCIXMIPW.js → chunk-6MR2TINI.js} +4 -3
  6. package/dist/chunk-6MR2TINI.js.map +1 -0
  7. package/dist/{chunk-WCQVDF3K.js → chunk-BW7RALUZ.js} +3 -2
  8. package/dist/{chunk-WCQVDF3K.js.map → chunk-BW7RALUZ.js.map} +1 -1
  9. package/dist/{chunk-VSJ33PLA.js → chunk-G7QXHNGB.js} +5 -4
  10. package/dist/chunk-G7QXHNGB.js.map +1 -0
  11. package/dist/{chunk-MTQ6ESQR.js → chunk-ISVRGBWT.js} +6 -5
  12. package/dist/chunk-ISVRGBWT.js.map +1 -0
  13. package/dist/{chunk-KSPLKCVF.js → chunk-NKBZIXCN.js} +7 -6
  14. package/dist/chunk-NKBZIXCN.js.map +1 -0
  15. package/dist/{chunk-RU7BOXR3.js → chunk-P2F6HU3P.js} +4 -3
  16. package/dist/chunk-P2F6HU3P.js.map +1 -0
  17. package/dist/{chunk-BJS6XH2V.js → chunk-QAKFE3NE.js} +4 -3
  18. package/dist/chunk-QAKFE3NE.js.map +1 -0
  19. package/dist/{chunk-WALLF2AH.js → chunk-YOVA65PS.js} +4 -3
  20. package/dist/chunk-YOVA65PS.js.map +1 -0
  21. package/dist/{dist-FBRR6YHP.js → dist-7UKXVKH3.js} +5 -4
  22. package/dist/{dist-7GPVXUEA.js.map → dist-7UKXVKH3.js.map} +1 -1
  23. package/dist/{dist-7GPVXUEA.js → dist-JX77JABV.js} +5 -4
  24. package/dist/{dist-DVM64QIS.js.map → dist-JX77JABV.js.map} +1 -1
  25. package/dist/{dist-DVM64QIS.js → dist-WKLJSPJT.js} +8 -7
  26. package/dist/{dist-FBRR6YHP.js.map → dist-WKLJSPJT.js.map} +1 -1
  27. package/dist/index.js +19 -18
  28. package/dist/index.js.map +1 -1
  29. package/dist/{secure-credentials-YKZHAZNB.js → secure-credentials-6UMEU22H.js} +4 -3
  30. package/dist/secure-credentials-6UMEU22H.js.map +1 -0
  31. package/dist/{snapback-dir-4QRR2IPV.js → snapback-dir-T3CRQRY6.js} +6 -5
  32. package/dist/{snapback-dir-4QRR2IPV.js.map → snapback-dir-T3CRQRY6.js.map} +1 -1
  33. package/package.json +5 -5
  34. package/dist/SkippedTestDetector-JY4EF5BN.js +0 -4
  35. package/dist/chunk-BCIXMIPW.js.map +0 -1
  36. package/dist/chunk-BJS6XH2V.js.map +0 -1
  37. package/dist/chunk-KSPLKCVF.js.map +0 -1
  38. package/dist/chunk-MTQ6ESQR.js.map +0 -1
  39. package/dist/chunk-RU7BOXR3.js.map +0 -1
  40. package/dist/chunk-VSJ33PLA.js.map +0 -1
  41. package/dist/chunk-WALLF2AH.js.map +0 -1
  42. package/dist/secure-credentials-YKZHAZNB.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/mcp-config/src/detect.ts","../../../packages/mcp-config/src/validate.ts","../../../packages/mcp-config/src/write.ts","../../../packages/mcp-config/src/repair.ts"],"names":["CLIENT_CONFIGS","claude","home","platform","join","process","env","APPDATA","cursor","__name","_home","cwd","windsurf","continue","vscode","zed","cline","gemini","aider","qoder","CLIENT_DISPLAY_NAMES","detectAIClients","options","homedir","clients","seenPaths","Set","name","getPaths","Object","entries","paths","configPath","has","add","exists","existsSync","hasSnapback","content","readFileSync","endsWith","includes","parsed","JSON","parse","checkForSnapback","push","displayName","format","detected","filter","c","needsSetup","getClient","clientName","result","find","getConfiguredClients","config","configObj","mcpServers","servers","experimental","Array","isArray","modelContextProtocolServers","some","server","getClientConfigPath","undefined","readClientConfig","client","validateClientConfig","issues","severity","code","message","fix","valid","configContent","parsedConfig","error","Error","snapbackConfig","extractSnapbackConfig","validateSnapbackConfig","command","args","workspaceIdx","indexOf","length","workspacePath","wsValidation","validateWorkspacePath","hasMarkers","i","absPath","resolve","path","hasGit","hasPackageJson","snapback","s","url","URL","SNAPBACK_API_KEY","SNAPBACK_WORKSPACE_ID","getSnapbackMCPConfig","apiKey","workspaceId","serverUrl","useBinary","customCommand","additionalEnv","workspaceRoot","useLocalDev","localCliPath","keys","tier","writeClientConfig","mcpConfig","configDir","dirname","mkdirSync","recursive","existingConfig","hasExistingConfig","backup","Date","now","writeFileSync","stringify","newConfig","mergeConfig","success","removeSnapbackConfig","existing","continueConfig","filteredServers","validateConfig","Boolean","expCfg","srvs","repairClientConfig","fixed","remaining","validation","force","performFullReconfiguration","issue","fixResult","attemptFix","hasCriticalErrors","msg","injectWorkspacePath","detectedWorkspace","detectWorkspaceRoot","hasWorkspace","_validation","workspace","findCliPath","writeResult","startPath","currentPath","maxIterations","iterations","parent","candidates"],"mappings":"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","file":"chunk-RU7BOXR3.js","sourcesContent":["/**\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\";\n\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\twindsurf: (home) => [join(home, \".codeium/windsurf/mcp_config.json\")],\n\tcontinue: (home) => [join(home, \".continue/config.json\")],\n\t// New clients\n\tvscode: (_home, cwd) => [...(cwd ? [join(cwd, \".vscode/mcp.json\")] : [])],\n\tzed: (home) => [join(home, \".config/zed/settings.json\")],\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) => {\n\t\tswitch (platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\treturn [join(home, \"Library/Application Support/Qoder/SharedClientCache/extension/local/mcp.json\")];\n\t\t\tcase \"win32\":\n\t\t\t\treturn [join(process.env.APPDATA || \"\", \"Qoder/mcp.json\")];\n\t\t\tdefault:\n\t\t\t\treturn [join(home, \".config/Qoder/mcp.json\")];\n\t\t}\n\t},\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};\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 * console.log(`Found ${result.detected.length} AI assistants`);\n *\n * for (const client of result.needsSetup) {\n * console.log(`${client.displayName} needs SnapBack 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 paths = getPaths(home, cwd);\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 hasSnapback = false;\n\n\t\t\tif (exists) {\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\thasSnapback = content.includes(\"snapback\");\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\thasSnapback = checkForSnapback(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 snapback\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\thasSnapback,\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\tconst needsSetup = detected.filter((c) => !c.hasSnapback);\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 SnapBack configured\n *\n * @returns Array of configured clients\n */\nexport function getConfiguredClients(): AIClientConfig[] {\n\tconst result = detectAIClients();\n\treturn result.detected.filter((c) => c.hasSnapback);\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Check if SnapBack is configured in a config object\n */\nfunction checkForSnapback(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 \"vscode\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"qoder\":\n\t\t\t// These use mcpServers.snapback 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\treturn \"snapback\" in servers;\n\t\t\t}\n\t\t\treturn false;\n\n\t\tcase \"gemini\":\n\t\tcase \"zed\":\n\t\t\t// These embed mcpServers inside a settings object\n\t\t\t// Check both top-level and nested mcpServers\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 \"snapback\" in servers;\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\t(server as Record<string, unknown>).name === \"snapback\",\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 * @returns The config path or undefined if unknown client\n */\nexport function getClientConfigPath(clientName: string): string | undefined {\n\tconst getPaths = CLIENT_CONFIGS[clientName];\n\tif (!getPaths) {\n\t\treturn undefined;\n\t}\n\n\tconst paths = getPaths(homedir());\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 * 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 { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nimport type { AIClientConfig, MCPServerConfig } from \"./types.js\";\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 snapback 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, .snapback) */\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) console.log(`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: snap 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: snap tools configure --${client.name} --force`,\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Check if SnapBack is configured\n\tif (!client.hasSnapback) {\n\t\tissues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"SNAPBACK_NOT_CONFIGURED\",\n\t\t\tmessage: \"SnapBack MCP server not found in config\",\n\t\t\tfix: `Run: snap tools configure --${client.name}`,\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Extract snapback config based on format\n\tconst snapbackConfig = extractSnapbackConfig(parsedConfig, client.format);\n\tif (!snapbackConfig) {\n\t\tissues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"SNAPBACK_CONFIG_INVALID\",\n\t\t\tmessage: \"SnapBack config found but cannot be parsed\",\n\t\t});\n\t\treturn { valid: false, issues };\n\t}\n\n\t// Validate snapback config structure\n\tvalidateSnapbackConfig(snapbackConfig, issues);\n\n\t// Validate workspace path if present\n\tif (snapbackConfig.command && snapbackConfig.args) {\n\t\tconst workspaceIdx = snapbackConfig.args.indexOf(\"--workspace\");\n\t\tif (workspaceIdx !== -1 && workspaceIdx + 1 < snapbackConfig.args.length) {\n\t\t\tconst workspacePath = snapbackConfig.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: snap 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, .snapback): ${workspacePath}`,\n\t\t\t\t\tfix: \"Run: snap 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: snapbackConfig,\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 hasSnapback = existsSync(resolve(absPath, \".snapback\"));\n\n\treturn {\n\t\texists: true,\n\t\thasMarkers: hasGit || hasPackageJson || hasSnapback,\n\t\tpath: absPath,\n\t};\n}\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Extract SnapBack config from parsed config file\n */\nfunction extractSnapbackConfig(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 \"claude\":\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"vscode\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"qoder\":\n\t\tcase \"gemini\":\n\t\tcase \"zed\":\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\tif (\"snapback\" in servers) {\n\t\t\t\t\treturn servers.snapback as MCPServerConfig;\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\" && s !== null && (s as Record<string, unknown>).name === \"snapback\",\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 SnapBack config structure\n */\nfunction validateSnapbackConfig(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: snap 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\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: snap 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: snap 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: snap tools configure --force\",\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: snap tools configure --force\",\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: snap 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.SNAPBACK_API_KEY && !config.env.SNAPBACK_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 * MCP Config Writer Module\n *\n * Writes SnapBack MCP configuration to AI client config files.\n * Handles backup creation, merging with existing config, and various formats.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nimport type {\n\tAIClientConfig,\n\tMCPConfig,\n\tMCPServerConfig,\n\tRemoveResult,\n\tSnapbackConfigOptions,\n\tWriteResult,\n} from \"./types.js\";\n\n// =============================================================================\n// CONFIG GENERATION\n// =============================================================================\n\n/**\n * Generate SnapBack MCP server configuration\n *\n * @param options - Configuration options\n * @returns MCP server config for SnapBack\n *\n * @example\n * ```ts\n * // Preferred: Workspace ID auth (no API key in config)\n * const config = getSnapbackMCPConfig({\n * workspaceId: 'ws_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'\n * });\n *\n * // Legacy: API key auth (still supported)\n * const legacyConfig = getSnapbackMCPConfig({ apiKey: 'sb_live_xxx' });\n *\n * // Local development mode\n * const devConfig = getSnapbackMCPConfig({\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 = getSnapbackMCPConfig({\n * serverUrl: 'https://custom-mcp.example.com',\n * workspaceId: 'ws_xxx'\n * });\n *\n * // Legacy stdio mode (using binary)\n * const stdioConfig = getSnapbackMCPConfig({\n * useBinary: true,\n * apiKey: 'sb_live_xxx'\n * });\n * ```\n */\nexport function getSnapbackMCPConfig(options: SnapbackConfigOptions = {}): 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} = options;\n\n\t// Build environment variables\n\tconst env: Record<string, string> = { ...additionalEnv };\n\n\t// Workspace ID is preferred over API key for MCP authentication\n\t// When workspaceId is set, tier is resolved server-side via workspace_links table\n\tif (workspaceId) {\n\t\tenv.SNAPBACK_WORKSPACE_ID = workspaceId;\n\t}\n\n\t// API key can still be provided for backwards compatibility or direct auth\n\tif (apiKey) {\n\t\tenv.SNAPBACK_API_KEY = apiKey;\n\t}\n\n\t// Determine 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: Remote HTTP server (Fly.io) - NEW DEFAULT\n\tif (serverUrl || (!useLocalDev && !useBinary)) {\n\t\tconst url = serverUrl || \"https://snapback-mcp.fly.dev\";\n\t\treturn {\n\t\t\turl,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Priority 2: Local development mode - direct node execution with workspace\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\treturn {\n\t\t\tcommand: \"node\",\n\t\t\targs,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Priority 3: Binary mode (legacy stdio transport)\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: \"snapback\",\n\t\t\targs,\n\t\t\t...(Object.keys(env).length > 0 && { env }),\n\t\t};\n\t}\n\n\t// Fallback: Should not reach here due to Priority 1, but kept for safety\n\treturn {\n\t\turl: \"https://snapback-mcp.fly.dev\",\n\t\t...(Object.keys(env).length > 0 && { env }),\n\t};\n}\n\n// =============================================================================\n// CONFIG WRITING\n// =============================================================================\n\n/**\n * Write SnapBack 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 = getSnapbackMCPConfig({ apiKey: 'sk_...' });\n *\n * const result = writeClientConfig(client, mcpConfig);\n * if (result.success) {\n * console.log('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 SnapBack configuration from an AI client\n *\n * @param client - The AI client to remove config from\n * @returns Result of the removal operation\n */\nexport function removeSnapbackConfig(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\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\t\tif (config.mcpServers?.snapback) {\n\t\t\t\t\tdelete config.mcpServers.snapback;\n\t\t\t\t}\n\t\t\t\tbreak;\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\texperimental.modelContextProtocolServers = servers.filter((s) => s.name !== \"snapback\");\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\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 * Merge SnapBack config into existing config based on format\n */\nfunction mergeConfig(\n\texisting: MCPConfig,\n\tsnapbackConfig: MCPServerConfig,\n\tformat: AIClientConfig[\"format\"],\n): MCPConfig | Record<string, unknown> {\n\tswitch (format) {\n\t\tcase \"claude\":\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"vscode\":\n\t\tcase \"cline\":\n\t\tcase \"roo-code\":\n\t\tcase \"gemini\":\n\t\tcase \"zed\":\n\t\tcase \"qoder\":\n\t\t\t// Standard mcpServers format\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\tsnapback: snapbackConfig,\n\t\t\t\t},\n\t\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 snapback if present\n\t\t\tconst filteredServers = servers.filter((s) => s.name !== \"snapback\");\n\n\t\t\t// Add new snapback config\n\t\t\tfilteredServers.push({\n\t\t\t\tname: \"snapback\",\n\t\t\t\t...snapbackConfig,\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\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\tsnapback: snapbackConfig,\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/**\n * Validate that a config was written correctly\n *\n * @param client - Client to validate\n * @returns True if SnapBack 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\n\t\tswitch (client.format) {\n\t\t\tcase \"claude\":\n\t\t\tcase \"cursor\":\n\t\t\tcase \"windsurf\":\n\t\t\tcase \"vscode\":\n\t\t\tcase \"cline\":\n\t\t\tcase \"roo-code\":\n\t\t\tcase \"gemini\":\n\t\t\tcase \"zed\":\n\t\t\tcase \"qoder\":\n\t\t\t\t// Valid if has either command (stdio) or url (HTTP)\n\t\t\t\treturn Boolean(config.mcpServers?.snapback?.command || config.mcpServers?.snapback?.url);\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\treturn Boolean(srvs?.some((s) => s.name === \"snapback\" && (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 { getSnapbackMCPConfig, 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 * console.log('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, .snapback)\",\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 SnapBack 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 \"SNAPBACK_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 \"INVALID_URL\":\n\t\t\t// These require full reconfiguration\n\t\t\treturn performFullReconfiguration(client, options);\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 */\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\n\t\t// Generate new config\n\t\tconst mcpConfig = getSnapbackMCPConfig({\n\t\t\tapiKey: options.apiKey,\n\t\t\tworkspaceId: options.workspaceId,\n\t\t\tworkspaceRoot: workspaceRoot || undefined,\n\t\t\tuseLocalDev: true, // Default to local dev for stdio\n\t\t\tlocalCliPath: findCliPath(),\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\"],\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 hasSnapback = existsSync(resolve(currentPath, \".snapback\"));\n\n\t\tif (hasGit || hasPackageJson || hasSnapback) {\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/core/dist/analysis/ast/SyntaxAnalyzer.js","../../../packages/core/dist/analysis/completeness/CompletenessAnalyzer.js","../../../packages/core/dist/analysis/impact/ChangeImpactAnalyzer.js","../../../packages/core/dist/analysis/security/SecurityAnalyzer.js","../../../packages/core/dist/analysis/static/OrphanDetector.js","../../../packages/core/dist/analysis/static/index.js"],"names":["SyntaxAnalyzer","id","name","filePatterns","analyze","context","startTime","performance","now","issues","filesAnalyzed","nodesVisited","parseErrors","file","content","contents","shouldAnalyzeFile","ast","parse","sourceType","ecmaFeatures","jsx","endsWith","ecmaVersion","errorOnUnknownASTType","countNodes","checkSyntaxPatterns","error","parseError","extractParseError","push","message","line","severity","type","column","fix","analyzer","success","coverage","Math","max","files","length","duration","metadata","shouldRun","some","f","ext","split","pop","toLowerCase","includes","Error","match","Number","parseInt","String","node","count","key","Object","keys","value","Array","isArray","item","lines","i","lineNum","indexOf","snippet","trim","test","assignMatch","CompletenessAnalyzer","todoPatterns","placeholderPatterns","parserOptions","plugins","errorRecovery","checkTodoComments","checkPlaceholderPatterns","getPluginsForFile","result","analyzeAST","patternsChecked","pattern","lastIndex","todoContent","slice","_content","traverse","enter","CatchClause","path","body","loc","start","stmt","FunctionDeclaration","funcName","ClassMethod","abstract","kind","methodName","ArrowFunctionExpression","parent","varName","CallExpression","callee","object","property","firstArg","arguments","msg","EXPORT_PATTERNS","PERFORMANCE_PATTERNS","risk","TEST_FILE_PATTERNS","ChangeImpactAnalyzer","workspaceRoot","dependencyGraph","Map","reverseDependencyGraph","p","RegExp","replace","Date","buildDependencyGraph","get","breakingChanges","detectBreakingChanges","bc","symbol","toUpperCase","description","migration","perfImpacts","detectPerformanceImpacts","pi","component","recommendation","affectedTests","findAffectedTests","getFullImpact","performanceImpacts","dependentFiles","recommendations","tests","breaks","perfs","deps","findDependentFiles","impactScore","calculateImpactScore","dedupeItems","clear","imports","extractImports","set","imp","existing","fromFile","importRegex","requireRegex","exec","importPath","resolveImportPath","startsWith","dir","dirname","extensions","resolved","relPath","relative","fileName","basename","directTestPatterns","reason","level","importers","importer","isTestFile","regex","source","flags","symbolName","interfaceRegex","interfaceName","impacts","getPerformanceRecommendation","dependents","visited","Set","current","depth","has","add","score","min","filter","items","seen","createChangeImpactAnalyzer","SecurityAnalyzer","fileIssues","fileContext","isDaemon","hasSignalHandler","isStaticString","MemberExpression","parentPath","isCallExpression","pathMethods","isStaticPath","NewExpression","JSXAttribute","VariableDeclarator","init","checkForHardcodedSecret","ClassProperty","Program","exit","expressions","every","arg","secretIndicators","s","valueStr","DEFAULT_OPTIONS","fileExtensions","excludePatterns","detectOrphans","entryPoint","options","mergedOptions","madgeModule","madge","default","excludeRegExp","map","regexPattern","tsConfig","tsConfigPath","detectiveOptions","ts","skipTypeImports","orphans","allFiles","obj","totalFiles","filterOrphansToFiles","orphanResult","targetFiles","targetSet","orphan","normalizedOrphan","t","checkFilesForOrphanStatus","baseDir","runStaticAnalysis","_workspaceRoot","skippedTests","orphanedFiles","errors","skipTestDetection","analyzeSkippedTests","testResults","testResult","parsed","skipped","skipOrphanDetection"],"mappings":"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","file":"chunk-VSJ33PLA.js","sourcesContent":["/**\n * Syntax Analyzer\n *\n * Uses @typescript-eslint/parser for real AST-based syntax validation.\n * Replaces bracket counting with proper parsing.\n *\n * @module analysis/ast/SyntaxAnalyzer\n */\nimport * as eslintParser from \"@typescript-eslint/parser\";\n/**\n * AST-based syntax analyzer using @typescript-eslint/parser\n */\nexport class SyntaxAnalyzer {\n id = \"syntax\";\n name = \"Syntax Analysis\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file))\n continue;\n filesAnalyzed++;\n try {\n // Parse with @typescript-eslint/parser\n const ast = eslintParser.parse(content, {\n sourceType: \"module\",\n ecmaFeatures: {\n jsx: file.endsWith(\".tsx\") || file.endsWith(\".jsx\"),\n },\n ecmaVersion: \"latest\",\n // Error recovery mode to get partial AST even with errors\n errorOnUnknownASTType: false,\n });\n // Count nodes for coverage metric\n nodesVisited += this.countNodes(ast);\n // Check for syntax issues that the parser didn't catch but still parsed\n this.checkSyntaxPatterns(content, file, issues);\n }\n catch (error) {\n // Parse error - this is a real syntax issue\n const parseError = this.extractParseError(error);\n parseErrors.push(`${file}: ${parseError.message}`);\n issues.push({\n id: `syntax/parse-error/${file}/${parseError.line}`,\n severity: \"critical\",\n type: \"SYNTAX_ERROR\",\n message: parseError.message,\n file,\n line: parseError.line,\n column: parseError.column,\n fix: \"Fix the syntax error to allow parsing\",\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n /**\n * Extract parse error information from parser exception\n */\n extractParseError(error) {\n if (error instanceof Error) {\n // @typescript-eslint/parser errors have line/column info\n const match = error.message.match(/\\((\\d+):(\\d+)\\)/);\n if (match) {\n return {\n message: error.message,\n line: Number.parseInt(match[1], 10),\n column: Number.parseInt(match[2], 10),\n };\n }\n return {\n message: error.message,\n line: 1,\n column: 1,\n };\n }\n return {\n message: String(error),\n line: 1,\n column: 1,\n };\n }\n /**\n * Count AST nodes for coverage metrics\n */\n countNodes(node) {\n if (!node || typeof node !== \"object\")\n return 0;\n let count = 1;\n for (const key of Object.keys(node)) {\n const value = node[key];\n if (Array.isArray(value)) {\n for (const item of value) {\n count += this.countNodes(item);\n }\n }\n else if (value && typeof value === \"object\" && \"type\" in value) {\n count += this.countNodes(value);\n }\n }\n return count;\n }\n /**\n * Check for additional syntax patterns that may indicate issues\n */\n checkSyntaxPatterns(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n // Check for double semicolons\n if (line.includes(\";;\")) {\n issues.push({\n id: `syntax/double-semicolon/${file}/${lineNum}`,\n severity: \"low\",\n type: \"SYNTAX_WARNING\",\n message: \"Double semicolon detected\",\n file,\n line: lineNum,\n column: line.indexOf(\";;\") + 1,\n fix: \"Remove extra semicolon\",\n snippet: line.trim(),\n });\n }\n // Check for console.assert with empty second argument\n if (/console\\.assert\\([^,]+,\\s*\\)/.test(line)) {\n issues.push({\n id: `syntax/empty-assert/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"SYNTAX_WARNING\",\n message: \"console.assert with empty message\",\n file,\n line: lineNum,\n fix: \"Add assertion message for debugging\",\n snippet: line.trim(),\n });\n }\n // Check for likely typos: = instead of === in conditions\n if (/if\\s*\\([^=]*=\\s*[^=]/.test(line) && !/if\\s*\\([^=]*[=!]==/.test(line)) {\n // Only warn if it looks like an assignment in a condition\n const assignMatch = line.match(/if\\s*\\(\\s*(\\w+)\\s*=\\s*[^=]/);\n if (assignMatch) {\n issues.push({\n id: `syntax/assignment-in-condition/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"SYNTAX_WARNING\",\n message: \"Possible assignment in condition (did you mean ===?)\",\n file,\n line: lineNum,\n fix: \"Use === for comparison, or wrap in extra parentheses if intentional\",\n snippet: line.trim(),\n });\n }\n }\n }\n }\n}\n","/**\n * Completeness Analyzer\n *\n * Detects incomplete implementations: TODO comments, empty catch blocks,\n * NotImplementedError, empty function bodies, placeholder code.\n *\n * Uses @babel/parser + @babel/traverse for AST-based detection.\n *\n * @module analysis/completeness/CompletenessAnalyzer\n */\nimport { parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\n/**\n * AST-based completeness analyzer\n */\nexport class CompletenessAnalyzer {\n id = \"completeness\";\n name = \"Completeness Detection\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n todoPatterns = [\n /\\/\\/\\s*TODO\\b/gi,\n /\\/\\/\\s*FIXME\\b/gi,\n /\\/\\/\\s*XXX\\b/gi,\n /\\/\\/\\s*HACK\\b/gi,\n /\\/\\*\\s*TODO\\b/gi,\n /\\/\\*\\s*FIXME\\b/gi,\n ];\n placeholderPatterns = [\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`].*not\\s*implemented.*['\"`]\\s*\\)/gi,\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`]TODO.*['\"`]\\s*\\)/gi,\n /NotImplementedError/gi,\n /throw\\s+new\\s+Error\\s*\\(\\s*['\"`]STUB['\"`]\\s*\\)/gi,\n ];\n parserOptions = {\n sourceType: \"module\",\n plugins: [\"typescript\", \"jsx\"],\n errorRecovery: true,\n };\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file))\n continue;\n filesAnalyzed++;\n // Line-based detection for comments\n this.checkTodoComments(content, file, issues);\n this.checkPlaceholderPatterns(content, file, issues);\n // AST-based detection for structural issues\n try {\n const ast = parse(content, {\n ...this.parserOptions,\n plugins: this.getPluginsForFile(file),\n });\n const result = this.analyzeAST(ast, content, file);\n issues.push(...result.issues);\n nodesVisited += result.nodesVisited;\n }\n catch (error) {\n parseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n // Parsing errors are handled by SyntaxAnalyzer, don't duplicate\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n patternsChecked: [\"TODO\", \"FIXME\", \"EMPTY_CATCH\", \"EMPTY_FUNCTION\", \"NOT_IMPLEMENTED\", \"PLACEHOLDER\"],\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n getPluginsForFile(file) {\n const plugins = [\"typescript\"];\n if (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n plugins.push(\"jsx\");\n }\n return plugins;\n }\n /**\n * Check for TODO/FIXME comments\n */\n checkTodoComments(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n for (const pattern of this.todoPatterns) {\n // Reset lastIndex for global patterns\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n // Extract the TODO content\n const todoContent = line.trim().slice(0, 100);\n issues.push({\n id: `completeness/todo/${file}/${lineNum}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `TODO/FIXME: ${todoContent}`,\n file,\n line: lineNum,\n snippet: todoContent,\n });\n break; // Only report once per line\n }\n }\n }\n }\n /**\n * Check for placeholder/stub patterns\n */\n checkPlaceholderPatterns(content, file, issues) {\n const lines = content.split(\"\\n\");\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNum = i + 1;\n for (const pattern of this.placeholderPatterns) {\n pattern.lastIndex = 0;\n if (pattern.test(line)) {\n issues.push({\n id: `completeness/placeholder/${file}/${lineNum}`,\n severity: \"high\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: 'Placeholder implementation: \"not implemented\" or similar',\n file,\n line: lineNum,\n fix: \"Implement the functionality or remove the placeholder\",\n snippet: line.trim().slice(0, 100),\n });\n break;\n }\n }\n }\n }\n /**\n * AST-based detection of empty/incomplete code\n */\n analyzeAST(ast, _content, file) {\n const issues = [];\n let nodesVisited = 0;\n traverse(ast, {\n enter() {\n nodesVisited++;\n },\n // Empty catch blocks\n CatchClause: (path) => {\n const body = path.node.body;\n if (body.body.length === 0) {\n issues.push({\n id: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: \"Empty catch block - errors silently swallowed\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Add error handling, rethrow, or log the error\",\n });\n }\n else if (body.body.length === 1) {\n // Check for comment-only catch blocks\n const stmt = body.body[0];\n if (stmt.type === \"EmptyStatement\") {\n issues.push({\n id: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: \"Catch block contains only empty statement\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Add proper error handling\",\n });\n }\n }\n },\n // Empty function bodies (excluding type declarations and interface methods)\n FunctionDeclaration: (path) => {\n if (path.node.body.body.length === 0) {\n const funcName = path.node.id?.name || \"anonymous\";\n // Skip if it's likely a stub for interface implementation\n const hasOverrideDecorator = false; // Would need to check decorators\n if (!hasOverrideDecorator) {\n issues.push({\n id: `completeness/empty-fn/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty function body: ${funcName}()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the function or mark as abstract/stub if intentional\",\n });\n }\n }\n },\n // Empty method bodies\n ClassMethod: (path) => {\n // Skip abstract methods, getters with explicit return, etc.\n if (path.node.abstract)\n return;\n if (path.node.kind === \"get\" || path.node.kind === \"set\")\n return;\n const body = path.node.body;\n if (body && body.body.length === 0) {\n const methodName = path.node.key.type === \"Identifier\" ? path.node.key.name : \"anonymous\";\n // Skip constructor with only super() call\n if (methodName === \"constructor\")\n return;\n issues.push({\n id: `completeness/empty-method/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty method body: ${methodName}()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the method or mark as abstract if intentional\",\n });\n }\n },\n // Arrow functions that just throw or are empty (might be intentional)\n ArrowFunctionExpression: (path) => {\n const body = path.node.body;\n // Check if it's a block body that's empty\n if (body.type === \"BlockStatement\" && body.body.length === 0) {\n // Only warn if it's assigned to a variable (likely meant to be implemented)\n const parent = path.parent;\n if (parent.type === \"VariableDeclarator\") {\n const varName = parent.id.type === \"Identifier\" ? parent.id.name : \"anonymous\";\n issues.push({\n id: `completeness/empty-arrow/${file}/${path.node.loc?.start.line}`,\n severity: \"low\",\n type: \"INCOMPLETE_IMPLEMENTATION\",\n message: `Empty arrow function: ${varName}`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Implement the function or use () => {} if intentionally empty\",\n });\n }\n }\n },\n // Check for console.log that might be debug code\n CallExpression: (path) => {\n const callee = path.node.callee;\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"console\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"log\") {\n // Check if it looks like debug code\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n const msg = firstArg.value.toLowerCase();\n if (msg.includes(\"debug\") ||\n msg.includes(\"test\") ||\n msg.includes(\"todo\") ||\n msg.includes(\"remove\")) {\n issues.push({\n id: `completeness/debug-log/${file}/${path.node.loc?.start.line}`,\n severity: \"low\",\n type: \"DEBUG_CODE\",\n message: `Debug console.log left in code: \"${firstArg.value.slice(0, 50)}\"`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Remove debug logging before commit\",\n });\n }\n }\n }\n },\n });\n return { issues, nodesVisited };\n }\n}\n","/**\n * ChangeImpactAnalyzer\n *\n * Predicts the impact of code changes across the codebase:\n * - Affected tests (which tests might fail)\n * - Breaking changes (API/interface changes)\n * - Performance implications (hot path modifications)\n * - Dependency ripple effects\n *\n * @module analysis/impact/ChangeImpactAnalyzer\n */\nimport { basename, dirname, relative } from \"node:path\";\n// =============================================================================\n// Pattern Matchers\n// =============================================================================\n/**\n * Patterns that indicate exported API\n */\nconst EXPORT_PATTERNS = [\n /export\\s+(const|function|class|interface|type|enum)\\s+(\\w+)/g,\n /export\\s+default\\s+(function|class)?\\s*(\\w+)?/g,\n /export\\s+\\{([^}]+)\\}/g,\n];\n/**\n * Patterns that indicate function signatures\n */\nconst _SIGNATURE_PATTERNS = [\n // Function with parameters\n /(?:async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/g,\n // Arrow function\n /(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?::\\s*\\w+)?\\s*=>/g,\n // Method in class\n /(?:public|private|protected)?\\s*(?:async\\s+)?(\\w+)\\s*\\(([^)]*)\\)/g,\n];\n/**\n * Patterns indicating performance-sensitive code\n */\nconst PERFORMANCE_PATTERNS = [\n { pattern: /\\.forEach\\s*\\(/g, type: \"computation\", risk: \"low\" },\n { pattern: /for\\s*\\(\\s*let\\s+\\w+\\s*=\\s*0/g, type: \"computation\", risk: \"low\" },\n { pattern: /while\\s*\\(/g, type: \"computation\", risk: \"medium\" },\n { pattern: /async\\s+function|await\\s+/g, type: \"io\", risk: \"medium\" },\n { pattern: /new\\s+(Map|Set|Array)\\s*\\(/g, type: \"memory\", risk: \"low\" },\n { pattern: /JSON\\.(parse|stringify)/g, type: \"computation\", risk: \"medium\" },\n { pattern: /readFileSync|writeFileSync/g, type: \"io\", risk: \"high\" },\n { pattern: /spawn|exec\\s*\\(/g, type: \"io\", risk: \"high\" },\n { pattern: /import\\s*\\(/g, type: \"bundle\", risk: \"low\" },\n { pattern: /require\\s*\\(/g, type: \"bundle\", risk: \"medium\" },\n];\n/**\n * File patterns that indicate test files\n */\nconst TEST_FILE_PATTERNS = [/\\.test\\.[tj]sx?$/, /\\.spec\\.[tj]sx?$/, /__tests__\\//, /test\\//, /tests\\//];\n// =============================================================================\n// ChangeImpactAnalyzer\n// =============================================================================\nexport class ChangeImpactAnalyzer {\n id = \"change-impact\";\n name = \"Change Impact Analyzer\";\n filePatterns = [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"];\n workspaceRoot;\n dependencyGraph = new Map();\n reverseDependencyGraph = new Map();\n constructor(workspaceRoot) {\n this.workspaceRoot = workspaceRoot;\n }\n /**\n * Check if this analyzer should run\n */\n shouldRun(context) {\n return context.files.some((f) => this.filePatterns.some((p) => new RegExp(p.replace(/\\*/g, \".*\")).test(f)));\n }\n /**\n * Run impact analysis\n */\n async analyze(context) {\n const start = Date.now();\n const issues = [];\n try {\n // Build dependency graph from context\n await this.buildDependencyGraph(context);\n // Analyze each file\n for (const file of context.files) {\n const content = context.contents.get(file);\n if (!content) {\n continue;\n }\n // Detect breaking changes\n const breakingChanges = this.detectBreakingChanges(content, file);\n for (const bc of breakingChanges) {\n issues.push({\n id: `impact/breaking/${bc.type}/${file}/${bc.symbol}`,\n severity: bc.severity,\n type: `BREAKING_${bc.type.toUpperCase()}`,\n message: bc.description,\n file,\n fix: bc.migration,\n });\n }\n // Detect performance impacts\n const perfImpacts = this.detectPerformanceImpacts(content, file);\n for (const pi of perfImpacts) {\n if (pi.risk === \"high\" || pi.risk === \"critical\") {\n issues.push({\n id: `impact/perf/${pi.type}/${file}/${pi.component}`,\n severity: pi.risk === \"critical\" ? \"critical\" : \"high\",\n type: `PERF_${pi.type.toUpperCase()}`,\n message: pi.description,\n file,\n fix: pi.recommendation,\n });\n }\n }\n // Check for affected tests\n const affectedTests = this.findAffectedTests(file);\n if (affectedTests.length > 5) {\n issues.push({\n id: `impact/tests/${file}`,\n severity: \"medium\",\n type: \"HIGH_TEST_IMPACT\",\n message: `Change affects ${affectedTests.length} test files - consider running full test suite`,\n file,\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: 1,\n duration: Date.now() - start,\n metadata: {\n filesAnalyzed: context.files.length,\n },\n };\n }\n catch (error) {\n return {\n analyzer: this.id,\n success: false,\n issues: [\n {\n id: \"impact/error\",\n severity: \"high\",\n type: \"ANALYSIS_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n },\n ],\n coverage: 0,\n duration: Date.now() - start,\n };\n }\n }\n /**\n * Get full impact analysis (more detailed than standard analyze)\n */\n async getFullImpact(files, contents) {\n const start = Date.now();\n // Build context\n const context = {\n workspaceRoot: this.workspaceRoot,\n files,\n contents,\n };\n await this.buildDependencyGraph(context);\n const affectedTests = [];\n const breakingChanges = [];\n const performanceImpacts = [];\n const dependentFiles = [];\n const recommendations = [];\n for (const file of files) {\n const content = contents.get(file) || \"\";\n // Find affected tests\n const tests = this.findAffectedTests(file);\n affectedTests.push(...tests);\n // Detect breaking changes\n const breaks = this.detectBreakingChanges(content, file);\n breakingChanges.push(...breaks);\n // Detect performance impacts\n const perfs = this.detectPerformanceImpacts(content, file);\n performanceImpacts.push(...perfs);\n // Find dependent files\n const deps = this.findDependentFiles(file);\n dependentFiles.push(...deps);\n }\n // Calculate impact score\n const impactScore = this.calculateImpactScore(affectedTests, breakingChanges, performanceImpacts, dependentFiles);\n // Generate recommendations\n if (breakingChanges.length > 0) {\n recommendations.push(`⚠️ ${breakingChanges.length} breaking change(s) detected - update dependent code`);\n }\n if (affectedTests.length > 10) {\n recommendations.push(`🧪 Run full test suite - ${affectedTests.length} tests potentially affected`);\n }\n if (performanceImpacts.some((p) => p.risk === \"high\" || p.risk === \"critical\")) {\n recommendations.push(\"⚡ Performance-sensitive code modified - run benchmarks\");\n }\n if (dependentFiles.length > 20) {\n recommendations.push(\"🔗 High ripple effect - consider incremental rollout\");\n }\n return {\n filesAnalyzed: files.length,\n affectedTests: this.dedupeItems(affectedTests),\n breakingChanges,\n performanceImpacts,\n dependentFiles: this.dedupeItems(dependentFiles),\n impactScore,\n recommendations,\n duration: Date.now() - start,\n };\n }\n // =========================================================================\n // Private Methods\n // =========================================================================\n /**\n * Build dependency graph from file contents\n */\n async buildDependencyGraph(context) {\n this.dependencyGraph.clear();\n this.reverseDependencyGraph.clear();\n for (const file of context.files) {\n const content = context.contents.get(file);\n if (!content) {\n continue;\n }\n const imports = this.extractImports(content, file);\n this.dependencyGraph.set(file, imports);\n // Build reverse graph\n for (const imp of imports) {\n const existing = this.reverseDependencyGraph.get(imp) || [];\n existing.push(file);\n this.reverseDependencyGraph.set(imp, existing);\n }\n }\n }\n /**\n * Extract import statements from file content\n */\n extractImports(content, fromFile) {\n const imports = [];\n const importRegex = /import\\s+(?:.*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n const requireRegex = /require\\s*\\(['\"]([^'\"]+)['\"]\\)/g;\n let match;\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = this.resolveImportPath(match[1], fromFile);\n if (importPath) {\n imports.push(importPath);\n }\n }\n while ((match = requireRegex.exec(content)) !== null) {\n const importPath = this.resolveImportPath(match[1], fromFile);\n if (importPath) {\n imports.push(importPath);\n }\n }\n return imports;\n }\n /**\n * Resolve import path to absolute file path\n */\n resolveImportPath(importPath, fromFile) {\n // Skip external packages\n if (!importPath.startsWith(\".\") && !importPath.startsWith(\"/\")) {\n return null;\n }\n const dir = dirname(fromFile);\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \"/index.ts\", \"/index.tsx\", \"/index.js\"];\n for (const ext of extensions) {\n const resolved = `${dir}/${importPath}${ext}`.replace(/\\/\\.\\//g, \"/\");\n return resolved;\n }\n return null;\n }\n /**\n * Find test files that might be affected by a change\n */\n findAffectedTests(file) {\n const tests = [];\n const relPath = relative(this.workspaceRoot, file);\n const fileName = basename(file).replace(/\\.[tj]sx?$/, \"\");\n // Direct test files for this source\n const directTestPatterns = [\n `${fileName}.test.ts`,\n `${fileName}.test.tsx`,\n `${fileName}.spec.ts`,\n `${fileName}.spec.tsx`,\n `__tests__/${fileName}.test.ts`,\n `__tests__/${fileName}.test.tsx`,\n ];\n for (const pattern of directTestPatterns) {\n tests.push({\n path: pattern,\n reason: \"Direct test file for changed source\",\n level: \"high\",\n });\n }\n // Files that import this file might have tests\n const importers = this.reverseDependencyGraph.get(file) || [];\n for (const importer of importers) {\n if (this.isTestFile(importer)) {\n tests.push({\n path: relative(this.workspaceRoot, importer),\n reason: \"Test file imports changed module\",\n level: \"medium\",\n });\n }\n }\n // Integration tests if this is a core module\n if (relPath.includes(\"/core/\") || relPath.includes(\"/services/\")) {\n tests.push({\n path: \"**/*.integration.test.ts\",\n reason: \"Core module change may affect integration tests\",\n level: \"low\",\n });\n }\n return tests;\n }\n /**\n * Check if a file is a test file\n */\n isTestFile(file) {\n return TEST_FILE_PATTERNS.some((p) => p.test(file));\n }\n /**\n * Detect breaking changes in content\n */\n detectBreakingChanges(content, file) {\n const breaks = [];\n // Check for exported symbols\n for (const pattern of EXPORT_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match;\n while ((match = regex.exec(content)) !== null) {\n const symbolName = match[2] || match[1];\n if (symbolName) {\n // Check if this is a potential breaking change\n // (In a real implementation, we'd compare with previous version)\n breaks.push({\n type: \"export\",\n symbol: symbolName,\n file,\n description: `Exported symbol '${symbolName}' may have changed`,\n severity: \"medium\",\n migration: `Verify consumers of '${symbolName}' are updated`,\n });\n }\n }\n }\n // Check for interface/type changes\n const interfaceRegex = /(?:export\\s+)?interface\\s+(\\w+)\\s*\\{([^}]+)\\}/g;\n let match;\n while ((match = interfaceRegex.exec(content)) !== null) {\n const interfaceName = match[1];\n const body = match[2];\n // Check for optional vs required changes (simplified)\n if (body.includes(\"?:\") || body.includes(\": \")) {\n breaks.push({\n type: \"type\",\n symbol: interfaceName,\n file,\n description: `Interface '${interfaceName}' definition changed`,\n severity: \"medium\",\n });\n }\n }\n return breaks;\n }\n /**\n * Detect performance-sensitive code changes\n */\n detectPerformanceImpacts(content, file) {\n const impacts = [];\n for (const { pattern, type, risk } of PERFORMANCE_PATTERNS) {\n const regex = new RegExp(pattern.source, pattern.flags);\n let match;\n while ((match = regex.exec(content)) !== null) {\n impacts.push({\n type,\n description: `${type} operation detected: ${match[0]}`,\n risk,\n component: basename(file),\n recommendation: this.getPerformanceRecommendation(type),\n });\n }\n }\n return impacts;\n }\n /**\n * Get recommendation for performance issue type\n */\n getPerformanceRecommendation(type) {\n switch (type) {\n case \"hotpath\":\n return \"Consider memoization or caching for hot paths\";\n case \"memory\":\n return \"Monitor memory usage, consider object pooling\";\n case \"io\":\n return \"Use async operations, consider batching\";\n case \"computation\":\n return \"Profile for bottlenecks, consider Web Workers\";\n case \"bundle\":\n return \"Use dynamic imports for code splitting\";\n default:\n return \"Profile before optimizing\";\n }\n }\n /**\n * Find files that depend on changed file\n */\n findDependentFiles(file) {\n const dependents = [];\n const visited = new Set();\n const traverse = (current, depth) => {\n if (visited.has(current) || depth > 3) {\n return;\n }\n visited.add(current);\n const importers = this.reverseDependencyGraph.get(current) || [];\n for (const importer of importers) {\n dependents.push({\n path: relative(this.workspaceRoot, importer),\n reason: depth === 0 ? \"Directly imports changed file\" : `Transitive dependency (depth ${depth})`,\n level: depth === 0 ? \"high\" : depth === 1 ? \"medium\" : \"low\",\n });\n traverse(importer, depth + 1);\n }\n };\n traverse(file, 0);\n return dependents;\n }\n /**\n * Calculate overall impact score\n */\n calculateImpactScore(tests, breaks, perfs, deps) {\n let score = 0;\n // Weight by category\n score += Math.min(tests.length * 0.05, 0.25);\n score += Math.min(breaks.length * 0.15, 0.35);\n score += Math.min(perfs.filter((p) => p.risk === \"high\").length * 0.1, 0.2);\n score += Math.min(deps.length * 0.02, 0.2);\n return Math.min(score, 1);\n }\n /**\n * Deduplicate impact items\n */\n dedupeItems(items) {\n const seen = new Set();\n return items.filter((item) => {\n if (seen.has(item.path)) {\n return false;\n }\n seen.add(item.path);\n return true;\n });\n }\n}\n// =============================================================================\n// Factory\n// =============================================================================\n/**\n * Create ChangeImpactAnalyzer instance\n */\nexport function createChangeImpactAnalyzer(workspaceRoot) {\n return new ChangeImpactAnalyzer(workspaceRoot);\n}\n","/**\n * Security Analyzer\n *\n * Uses @babel/parser + @babel/traverse for AST-based security analysis.\n * Detects eval, path traversal, missing signal handlers, and other security issues.\n *\n * @module analysis/security/SecurityAnalyzer\n */\nimport { parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\n/**\n * AST-based security analyzer using Babel\n */\nexport class SecurityAnalyzer {\n id = \"security\";\n name = \"Security Analysis\";\n filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n parserOptions = {\n sourceType: \"module\",\n plugins: [\"typescript\", \"jsx\"],\n errorRecovery: true,\n };\n async analyze(context) {\n const startTime = performance.now();\n const issues = [];\n let filesAnalyzed = 0;\n let nodesVisited = 0;\n const parseErrors = [];\n for (const [file, content] of context.contents) {\n if (!this.shouldAnalyzeFile(file))\n continue;\n filesAnalyzed++;\n try {\n const ast = parse(content, {\n ...this.parserOptions,\n plugins: this.getPluginsForFile(file),\n });\n const fileIssues = this.analyzeAST(ast, content, file);\n issues.push(...fileIssues.issues);\n nodesVisited += fileIssues.nodesVisited;\n }\n catch (error) {\n parseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n issues.push({\n id: `security/parse-error/${file}`,\n severity: \"info\",\n type: \"PARSE_ERROR\",\n message: `Could not parse for security analysis: ${error instanceof Error ? error.message : String(error)}`,\n file,\n });\n }\n }\n return {\n analyzer: this.id,\n success: true,\n issues,\n coverage: filesAnalyzed / Math.max(context.files.length, 1),\n duration: performance.now() - startTime,\n metadata: {\n filesAnalyzed,\n nodesVisited,\n patternsChecked: [\n \"UNSAFE_EVAL\",\n \"PATH_TRAVERSAL\",\n \"MISSING_SIGNAL_HANDLER\",\n \"COMMAND_INJECTION\",\n \"SQL_INJECTION\",\n \"XSS_RISK\",\n \"HARDCODED_SECRET\",\n \"UNSAFE_REGEX\",\n ],\n parseErrors,\n },\n };\n }\n shouldRun(context) {\n return context.files.some((f) => this.shouldAnalyzeFile(f));\n }\n shouldAnalyzeFile(file) {\n const ext = file.split(\".\").pop()?.toLowerCase();\n return [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n }\n getPluginsForFile(file) {\n const plugins = [\"typescript\"];\n if (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n plugins.push(\"jsx\");\n }\n return plugins;\n }\n /**\n * Analyze AST for security issues\n */\n analyzeAST(ast, content, file) {\n const issues = [];\n let nodesVisited = 0;\n // Track context for daemon/server detection\n const fileContext = {\n isDaemon: false,\n hasSignalHandler: false,\n hasSocketPermissions: false,\n hasBufferLimits: false,\n };\n // Pre-scan content for daemon indicators\n fileContext.isDaemon =\n content.includes(\".listen(\") ||\n file.includes(\"daemon\") ||\n file.includes(\"server\") ||\n file.includes(\"worker\");\n traverse(ast, {\n enter() {\n nodesVisited++;\n },\n // Detect eval()\n CallExpression: (path) => {\n const callee = path.node.callee;\n // eval() detection\n if (callee.type === \"Identifier\" && callee.name === \"eval\") {\n issues.push({\n id: `security/eval/${file}/${path.node.loc?.start.line}`,\n severity: \"critical\",\n type: \"UNSAFE_EVAL\",\n message: \"eval() allows arbitrary code execution\",\n file,\n line: path.node.loc?.start.line,\n column: path.node.loc?.start.column,\n fix: \"Use JSON.parse() for data or refactor logic to avoid eval\",\n });\n }\n // new Function() detection\n if (callee.type === \"Identifier\" && callee.name === \"Function\") {\n issues.push({\n id: `security/function-constructor/${file}/${path.node.loc?.start.line}`,\n severity: \"critical\",\n type: \"UNSAFE_EVAL\",\n message: \"new Function() is equivalent to eval() and allows arbitrary code execution\",\n file,\n line: path.node.loc?.start.line,\n column: path.node.loc?.start.column,\n fix: \"Refactor to avoid dynamic code generation\",\n });\n }\n // setTimeout/setInterval with string (like eval)\n if (callee.type === \"Identifier\" && (callee.name === \"setTimeout\" || callee.name === \"setInterval\")) {\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n issues.push({\n id: `security/string-timer/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"UNSAFE_EVAL\",\n message: `${callee.name} with string argument executes code like eval()`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Pass a function instead of a string\",\n });\n }\n }\n // exec/execSync (command injection risk)\n if (callee.type === \"Identifier\" && (callee.name === \"exec\" || callee.name === \"execSync\")) {\n const firstArg = path.node.arguments[0];\n if (firstArg && !this.isStaticString(firstArg)) {\n issues.push({\n id: `security/command-injection/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"COMMAND_INJECTION\",\n message: \"exec with dynamic command - potential command injection\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Validate/sanitize input or use execFile with explicit arguments\",\n });\n }\n }\n // Signal handler detection for daemons\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"process\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"on\") {\n const firstArg = path.node.arguments[0];\n if (firstArg && firstArg.type === \"StringLiteral\") {\n if (firstArg.value === \"SIGTERM\" || firstArg.value === \"SIGINT\") {\n fileContext.hasSignalHandler = true;\n }\n }\n }\n },\n // Detect fs operations with dynamic paths\n MemberExpression: (path) => {\n const node = path.node;\n if (node.object.type === \"Identifier\" && (node.object.name === \"fs\" || node.object.name === \"fsp\")) {\n const parent = path.parentPath;\n if (parent.isCallExpression()) {\n const methodName = node.property.type === \"Identifier\"\n ? node.property.name\n : node.property.value;\n // fs operations that take paths\n const pathMethods = [\n \"readFile\",\n \"readFileSync\",\n \"writeFile\",\n \"writeFileSync\",\n \"readdir\",\n \"readdirSync\",\n \"stat\",\n \"statSync\",\n \"unlink\",\n \"unlinkSync\",\n \"mkdir\",\n \"mkdirSync\",\n \"rmdir\",\n \"rmdirSync\",\n \"access\",\n \"accessSync\",\n ];\n if (pathMethods.includes(methodName)) {\n const firstArg = parent.node.arguments[0];\n if (firstArg && !this.isStaticPath(firstArg)) {\n issues.push({\n id: `security/path-traversal/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"PATH_TRAVERSAL\",\n message: `fs.${methodName} with dynamic path - potential path traversal`,\n file,\n line: path.node.loc?.start.line,\n fix: \"Validate paths against workspace root before use\",\n });\n }\n }\n }\n }\n },\n // Check for dangerous regex patterns\n NewExpression: (path) => {\n if (path.node.callee.type === \"Identifier\" && path.node.callee.name === \"RegExp\") {\n const firstArg = path.node.arguments[0];\n if (firstArg && !this.isStaticString(firstArg)) {\n issues.push({\n id: `security/unsafe-regex/${file}/${path.node.loc?.start.line}`,\n severity: \"medium\",\n type: \"UNSAFE_REGEX\",\n message: \"Dynamic RegExp - potential ReDoS or injection vulnerability\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Use static regex patterns or validate input\",\n });\n }\n }\n },\n // Check for innerHTML/dangerouslySetInnerHTML (XSS)\n JSXAttribute: (path) => {\n const name = path.node.name;\n if (name.type === \"JSXIdentifier\" && name.name === \"dangerouslySetInnerHTML\") {\n issues.push({\n id: `security/xss-risk/${file}/${path.node.loc?.start.line}`,\n severity: \"high\",\n type: \"XSS_RISK\",\n message: \"dangerouslySetInnerHTML can lead to XSS if content is not sanitized\",\n file,\n line: path.node.loc?.start.line,\n fix: \"Sanitize HTML content before rendering or avoid using dangerouslySetInnerHTML\",\n });\n }\n },\n // Check for hardcoded secrets in variable declarations\n VariableDeclarator: (path) => {\n const id = path.node.id;\n const init = path.node.init;\n if (id.type === \"Identifier\" && init) {\n this.checkForHardcodedSecret(id.name, init, file, path.node.loc?.start.line, issues);\n }\n },\n // Check for hardcoded secrets in class properties\n ClassProperty: (path) => {\n const key = path.node.key;\n const value = path.node.value;\n if (key.type === \"Identifier\" && value) {\n this.checkForHardcodedSecret(key.name, value, file, path.node.loc?.start.line, issues);\n }\n },\n // After traversal is complete, check daemon-specific patterns\n Program: {\n exit: () => {\n if (fileContext.isDaemon && !fileContext.hasSignalHandler) {\n issues.push({\n id: `security/signal-handler/${file}`,\n severity: \"high\",\n type: \"MISSING_SIGNAL_HANDLER\",\n message: \"Daemon/server missing signal handlers (SIGTERM/SIGINT)\",\n file,\n fix: \"Add process.on('SIGTERM', gracefulShutdown) for clean shutdown\",\n });\n }\n },\n },\n });\n return { issues, nodesVisited };\n }\n /**\n * Check if expression is a static string (safe)\n */\n isStaticString(node) {\n if (node.type === \"StringLiteral\")\n return true;\n if (node.type === \"TemplateLiteral\" && node.expressions.length === 0)\n return true;\n return false;\n }\n /**\n * Check if expression is a static path (safe)\n */\n isStaticPath(node) {\n // Static string literal\n if (node.type === \"StringLiteral\")\n return true;\n // Template literal with no interpolation\n if (node.type === \"TemplateLiteral\" && node.expressions.length === 0)\n return true;\n // path.join(__dirname, 'static') is somewhat safe\n if (node.type === \"CallExpression\") {\n const callee = node.callee;\n if (callee.type === \"MemberExpression\" &&\n callee.object.type === \"Identifier\" &&\n callee.object.name === \"path\" &&\n callee.property.type === \"Identifier\" &&\n callee.property.name === \"join\") {\n // Check if all arguments are static or __dirname\n return node.arguments.every((arg) => {\n if (arg.type === \"StringLiteral\")\n return true;\n if (arg.type === \"Identifier\" && (arg.name === \"__dirname\" || arg.name === \"__filename\"))\n return true;\n return false;\n });\n }\n }\n return false;\n }\n /**\n * Check if a value looks like a hardcoded secret\n */\n checkForHardcodedSecret(name, value, file, line, issues) {\n if (!value) {\n return;\n }\n const varName = name.toLowerCase();\n const secretIndicators = [\"apikey\", \"api_key\", \"secret\", \"password\", \"token\", \"credential\", \"auth\", \"key\"];\n if (secretIndicators.some((s) => varName.includes(s))) {\n if (value.type === \"StringLiteral\" && value.value.length > 8) {\n // Skip obvious placeholders\n const valueStr = value.value.toLowerCase();\n if (!valueStr.includes(\"placeholder\") &&\n !valueStr.includes(\"example\") &&\n !valueStr.includes(\"xxx\") &&\n !valueStr.includes(\"todo\") &&\n !valueStr.includes(\"your_\") &&\n !valueStr.includes(\"env.\")) {\n issues.push({\n id: `security/hardcoded-secret/${file}/${line}`,\n severity: \"critical\",\n type: \"HARDCODED_SECRET\",\n message: `Possible hardcoded secret in \"${name}\"`,\n file,\n line,\n fix: \"Use environment variables for secrets\",\n });\n }\n }\n }\n }\n}\n","/**\n * Orphan File Detector\n *\n * Uses madge to detect orphaned files (files with no dependents).\n * These are potential dead code that may be safe to delete.\n *\n * Note: madge is a dev dependency, so this module handles the case\n * where it's not available gracefully.\n *\n * @module analysis/static/OrphanDetector\n */\nconst DEFAULT_OPTIONS = {\n fileExtensions: [\"ts\", \"tsx\", \"js\", \"jsx\"],\n excludePatterns: [\n \"node_modules\",\n \"dist\",\n \".next\",\n \"coverage\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/__tests__/**\",\n \"**/__mocks__/**\",\n ],\n};\n/**\n * Detect orphaned files in a directory\n *\n * @param entryPoint - Entry file or directory to analyze\n * @param options - Detection options\n * @returns Detection result with orphan list\n *\n * @example\n * ```typescript\n * const result = await detectOrphans(\"src/index.ts\", {\n * fileExtensions: [\"ts\", \"tsx\"],\n * excludePatterns: [\"node_modules\", \"dist\"]\n * });\n *\n * if (result.success && result.orphans.length > 0) {\n * console.log(\"Potential dead code:\", result.orphans);\n * }\n * ```\n */\nexport async function detectOrphans(entryPoint, options = {}) {\n const startTime = Date.now();\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n try {\n // Dynamic import madge - it's a dev dependency\n const madgeModule = await import(\"madge\");\n const madge = madgeModule.default || madgeModule;\n const result = await madge(entryPoint, {\n fileExtensions: mergedOptions.fileExtensions,\n excludeRegExp: mergedOptions.excludePatterns.map((p) => {\n // Convert glob patterns to regex\n const regexPattern = p.replace(/\\*\\*/g, \".*\").replace(/\\*/g, \"[^/]*\").replace(/\\./g, \"\\\\.\");\n return new RegExp(regexPattern);\n }),\n tsConfig: mergedOptions.tsConfigPath,\n detectiveOptions: {\n ts: {\n skipTypeImports: true,\n },\n },\n });\n const orphans = result.orphans();\n const allFiles = Object.keys(result.obj());\n return {\n orphans,\n totalFiles: allFiles.length,\n success: true,\n duration: Date.now() - startTime,\n };\n }\n catch (error) {\n return {\n orphans: [],\n totalFiles: 0,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n/**\n * Filter orphans to only include files from a specific list\n *\n * Useful for focusing on files the AI agent plans to modify.\n *\n * @param orphanResult - Result from detectOrphans\n * @param targetFiles - Files to filter to\n * @returns Filtered orphan list\n */\nexport function filterOrphansToFiles(orphanResult, targetFiles) {\n if (!orphanResult.success) {\n return [];\n }\n const targetSet = new Set(targetFiles.map((f) => f.replace(/\\\\/g, \"/\")));\n return orphanResult.orphans.filter((orphan) => {\n const normalizedOrphan = orphan.replace(/\\\\/g, \"/\");\n return targetSet.has(normalizedOrphan) || targetFiles.some((t) => normalizedOrphan.endsWith(t));\n });\n}\n/**\n * Check if specific files are orphans\n *\n * More efficient than full orphan detection when you only care\n * about specific files.\n *\n * @param files - Files to check\n * @param workspaceRoot - Workspace root directory\n * @returns Which of the provided files are orphans\n */\nexport async function checkFilesForOrphanStatus(files, workspaceRoot) {\n // For efficiency, we analyze the whole workspace once\n // then filter to the requested files\n const result = await detectOrphans(workspaceRoot, {\n baseDir: workspaceRoot,\n });\n if (!result.success) {\n return { orphans: [], success: false, error: result.error };\n }\n const orphans = filterOrphansToFiles(result, files);\n return { orphans, success: true };\n}\n","/**\n * Static Analysis Module\n *\n * Lightweight static analysis tools for AI agent assistance.\n * These tools help agents identify issues upfront, saving exploration tokens.\n *\n * Features:\n * - Skipped test detection (describe.skip, it.skip, test.skip)\n * - Orphaned file detection (dead code candidates)\n *\n * @module analysis/static\n */\n// Circular Dependency Detection\nexport { detectCircular, detectCircularInMonorepo, formatCycles, summarizeCircular, } from \"./CircularDetector.js\";\n// Orphan Detection\nexport { checkFilesForOrphanStatus, detectOrphans, filterOrphansToFiles, } from \"./OrphanDetector.js\";\n// Skipped Test Detection\nexport { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary, } from \"./SkippedTestDetector.js\";\n/**\n * Run lightweight static analysis on target files\n *\n * This is designed to be fast enough to run in begin_task\n * without significantly impacting latency.\n *\n * @param files - Files to analyze (map of path to content)\n * @param workspaceRoot - Workspace root for orphan detection\n * @param options - Analysis options\n * @returns Combined analysis result\n */\nexport async function runStaticAnalysis(files, _workspaceRoot, options = {}) {\n const startTime = Date.now();\n const result = {\n skippedTests: [],\n orphanedFiles: [],\n duration: 0,\n success: true,\n errors: [],\n };\n // 1. Detect skipped tests (fast - just AST parsing)\n if (!options.skipTestDetection) {\n try {\n const { analyzeSkippedTests } = await import(\"./SkippedTestDetector.js\");\n const testResults = analyzeSkippedTests(files);\n for (const testResult of testResults) {\n if (!testResult.parsed && testResult.error) {\n result.errors.push(`Parse error in ${testResult.file}: ${testResult.error}`);\n }\n for (const skipped of testResult.skipped) {\n result.skippedTests.push({\n file: skipped.file,\n type: skipped.type,\n name: skipped.name,\n line: skipped.line,\n });\n }\n }\n }\n catch (error) {\n result.errors.push(`Skipped test detection failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n // 2. Orphan detection is disabled by default in begin_task\n // because it requires analyzing the full dependency graph\n // which can be slow for large codebases (500ms+)\n // Enable with options.skipOrphanDetection = false\n if (!options.skipOrphanDetection) {\n // Orphan detection is expensive - skip by default\n // Will be enabled in a future version with caching\n }\n result.duration = Date.now() - startTime;\n result.success = result.errors.length === 0;\n return result;\n}\n"]}