@vreko/cli 3.3.1 → 3.3.2

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 (37) hide show
  1. package/dist/{InitApp-2J6XGUNQ.js → InitApp-ZMT3KED7.js} +3 -3
  2. package/dist/{InitApp-2J6XGUNQ.js.map → InitApp-ZMT3KED7.js.map} +1 -1
  3. package/dist/{analysis-ABEO6RTN.js → analysis-PHENF2QA.js} +3 -3
  4. package/dist/{analysis-ABEO6RTN.js.map → analysis-PHENF2QA.js.map} +1 -1
  5. package/dist/{chunk-F7GEJLP7.js → chunk-53CCA4NS.js} +21 -11
  6. package/dist/chunk-53CCA4NS.js.map +1 -0
  7. package/dist/{chunk-B42UQ2W7.js → chunk-7TRHJ4SF.js} +4 -4
  8. package/dist/{chunk-B42UQ2W7.js.map → chunk-7TRHJ4SF.js.map} +1 -1
  9. package/dist/{chunk-AXNZWZ26.js → chunk-V2YKHPZH.js} +3 -3
  10. package/dist/{chunk-AXNZWZ26.js.map → chunk-V2YKHPZH.js.map} +1 -1
  11. package/dist/{chunk-2OPUNVDJ.js → chunk-XB7D22SX.js} +4 -4
  12. package/dist/{chunk-2OPUNVDJ.js.map → chunk-XB7D22SX.js.map} +1 -1
  13. package/dist/index.js +10 -11
  14. package/dist/index.js.map +1 -1
  15. package/dist/init-command-WJMWYVZN.js +7 -0
  16. package/dist/{init-command-ZUISJBCT.js.map → init-command-WJMWYVZN.js.map} +1 -1
  17. package/dist/{init-core-FQYDSJWC.js → init-core-DX4VN3IY.js} +4 -4
  18. package/dist/{init-core-FQYDSJWC.js.map → init-core-DX4VN3IY.js.map} +1 -1
  19. package/package.json +1 -2
  20. package/dist/chunk-F7GEJLP7.js.map +0 -1
  21. package/dist/init-command-ZUISJBCT.js +0 -7
  22. /package/dist/{._InitApp-2J6XGUNQ.js → ._InitApp-ZMT3KED7.js} +0 -0
  23. /package/dist/{._InitApp-2J6XGUNQ.js.map → ._InitApp-ZMT3KED7.js.map} +0 -0
  24. /package/dist/{._analysis-ABEO6RTN.js → ._analysis-PHENF2QA.js} +0 -0
  25. /package/dist/{._analysis-ABEO6RTN.js.map → ._analysis-PHENF2QA.js.map} +0 -0
  26. /package/dist/{._chunk-2OPUNVDJ.js → ._chunk-53CCA4NS.js} +0 -0
  27. /package/dist/{._chunk-2OPUNVDJ.js.map → ._chunk-53CCA4NS.js.map} +0 -0
  28. /package/dist/{._chunk-AXNZWZ26.js → ._chunk-7TRHJ4SF.js} +0 -0
  29. /package/dist/{._chunk-AXNZWZ26.js.map → ._chunk-7TRHJ4SF.js.map} +0 -0
  30. /package/dist/{._chunk-B42UQ2W7.js → ._chunk-V2YKHPZH.js} +0 -0
  31. /package/dist/{._chunk-B42UQ2W7.js.map → ._chunk-V2YKHPZH.js.map} +0 -0
  32. /package/dist/{._chunk-F7GEJLP7.js → ._chunk-XB7D22SX.js} +0 -0
  33. /package/dist/{._chunk-F7GEJLP7.js.map → ._chunk-XB7D22SX.js.map} +0 -0
  34. /package/dist/{._init-command-ZUISJBCT.js → ._init-command-WJMWYVZN.js} +0 -0
  35. /package/dist/{._init-command-ZUISJBCT.js.map → ._init-command-WJMWYVZN.js.map} +0 -0
  36. /package/dist/{._init-core-FQYDSJWC.js → ._init-core-DX4VN3IY.js} +0 -0
  37. /package/dist/{._init-core-FQYDSJWC.js.map → ._init-core-DX4VN3IY.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ export { createInitCommand } from './chunk-XB7D22SX.js';
3
+ import './chunk-EWOJGXRX.js';
4
+
5
+ process.env.VREKO_CLI='true';process.env.NODE_NO_WARNINGS='1';
6
+ //# sourceMappingURL=init-command-WJMWYVZN.js.map
7
+ //# sourceMappingURL=init-command-WJMWYVZN.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"init-command-ZUISJBCT.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"init-command-WJMWYVZN.js"}
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- export { createInitCommand } from './chunk-B42UQ2W7.js';
2
+ export { createInitCommand } from './chunk-7TRHJ4SF.js';
3
3
  import './chunk-GRMRYWYS.js';
4
4
  import './chunk-MWTSOZTM.js';
5
- import './chunk-AXNZWZ26.js';
5
+ import './chunk-V2YKHPZH.js';
6
6
  import './chunk-AV5Y3YR6.js';
7
7
  import './chunk-AHZGBIQG.js';
8
8
  import './chunk-BZ7DRTR7.js';
9
9
  import './chunk-EWOJGXRX.js';
10
10
 
11
11
  process.env.VREKO_CLI='true';process.env.NODE_NO_WARNINGS='1';
12
- //# sourceMappingURL=init-core-FQYDSJWC.js.map
13
- //# sourceMappingURL=init-core-FQYDSJWC.js.map
12
+ //# sourceMappingURL=init-core-DX4VN3IY.js.map
13
+ //# sourceMappingURL=init-core-DX4VN3IY.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"init-core-FQYDSJWC.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"init-core-DX4VN3IY.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vreko/cli",
3
- "version": "3.3.1",
3
+ "version": "3.3.2",
4
4
  "description": "Vreko CLI — AI-aware developer intelligence for the command line",
5
5
  "homepage": "https://vreko.dev",
6
6
  "repository": {
@@ -60,7 +60,6 @@
60
60
  "@react-email/render": "1.1.4",
61
61
  "@sentry/node": "10.32.1",
62
62
  "@sindresorhus/slugify": "3.0.0",
63
- "@typescript-eslint/parser": "8.46.2",
64
63
  "better-auth": "1.6.19",
65
64
  "boxen": "8.0.1",
66
65
  "chalk": "4.1.2",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages/core/src/analysis/ast/parser.ts","../../../packages/core/src/analysis/ast/ComplexityAnalyzer.ts","../../../packages/core/src/analysis/ast/import-extractor.ts","../../../packages/core/src/analysis/ast/ImportGraphAnalyzer.ts","../../../packages/core/src/analysis/ast/SyntaxAnalyzer.ts","../../../packages/core/src/analysis/completeness/CompletenessAnalyzer.ts","../../../packages/core/src/analysis/impact/ChangeImpactAnalyzer.ts","../../../packages/core/src/analysis/security/SecurityAnalyzer.ts","../../../packages/core/src/analysis/static/SkippedTestDetector.ts"],"names":["lang","JSX_EXTENSIONS","ext","errors","program","oxcParseSync","error","type","sourceType","message","Error","parseSource","node","visitor","value","key","Array","isArray","walkAST","count","countASTNodes","offset","source","length","line","offsetToLine","lastDot","normalizeError","getExtension","content","success","body","parent","n","item","filePath","lastIndexOf","e","err","labels","String","maxCyclomaticPerFunction","maxNestingDepth","maxParameters","maxFunctionsPerFile","maxCyclomaticPerFile","BRANCH_NODES","LOGICAL_OPERATORS","FUNCTION_NODES","ComplexityAnalyzer","startTime","performance","issues","file","filesAnalyzed","fileComplexity","parseErrors","push","totalNodesVisited","id","severity","fn","fix","THRESHOLDS","functionCount","analyzer","coverage","duration","metadata","nodesVisited","patternsChecked","shouldRun","context","some","shouldAnalyzeFile","f","analyzeFile","isSupportedFile","functions","fileMaxNesting","maxNesting","totalCyclomatic","averageCyclomatic","getFunctionBody","walkForComplexity","cyclomatic","depth","name","params","ALL_EXTENSIONS","result","Object","keys","substring","extractImports","imports","parseSuccess","handleImportDeclaration","handleExportDeclaration","handleImportExpression","handleCallExpression","extractImportSources","sources","imp","extractImportsBatch","files","results","Map","getStringValue","spec","s","imported","specifiers","getIdentifierName","kind","typeOnly","TS_EXTENSIONS","importKind","Boolean","isTypeOnly","start","local","args","callee","undefined","highFanIn","highFanOut","minCycleLength","ImportGraphAnalyzer","analyze","now","contents","ecmaFeatures","ecmaVersion","parseError","column","includes","extractParseError","match","Number","parseInt","countNodes","lines","i","lineNum","indexOf","trim","assignMatch","todoPatterns","placeholderPatterns","parserOptions","plugins","errorRecovery","checkTodoComments","checkPlaceholderPatterns","ast","getPluginsForFile","split","endsWith","pattern","lastIndex","test","todoContent","snippet","_content","enter","CatchClause","path","loc","FunctionDeclaration","ClassMethod","methodName","ArrowFunctionExpression","varName","CallExpression","firstArg","arguments","msg","toLowerCase","EXPORT_PATTERNS","risk","ChangeImpactAnalyzer","workspaceRoot","breakingChanges","bc","perfImpacts","pi","description","recommendation","affectedTests","traverse","parse","fileIssues","analyzeAST","fileContext","hasSignalHandler","isDaemon","MemberExpression","object","parentPath","isCallExpression","NewExpression","isStaticString","JSXAttribute","VariableDeclarator","init","checkForHardcodedSecret","ClassProperty","exit","isStaticPath","arg","secretIndicators","valueStr","Set","filePatterns","visit","skipped","analyzeSkippedTests"],"mappings":"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","file":"chunk-F7GEJLP7.js","sourcesContent":["/**\n * Shared AST Parser Utility\n *\n * Wraps oxc-parser for high-performance TypeScript/JavaScript AST parsing.\n * oxc-parser is 3x faster than SWC and 5x faster than Biome (2026 benchmarks).\n * Outputs ESTree/TS-ESTree compatible AST for broad tooling compatibility.\n *\n * @module analysis/ast/parser\n */\n\nimport { parseSync as oxcParseSync } from \"oxc-parser\";\n\n/** Supported source file extensions */\nconst TS_EXTENSIONS = new Set([\".ts\", \".tsx\", \".mts\", \".cts\"]);\nconst JSX_EXTENSIONS = new Set([\".tsx\", \".jsx\"]);\nconst ALL_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mts\", \".cts\", \".mjs\", \".cjs\"]);\n\n/**\n * Result of parsing a source file\n */\nexport interface ParseResult {\n\t/** ESTree-compatible AST program node */\n\tprogram: OxcProgram;\n\t/** Parse errors (empty array if successful) */\n\terrors: OxcError[];\n\t/** Whether parsing succeeded without fatal errors */\n\tsuccess: boolean;\n}\n\n/**\n * Minimal ESTree Program type from oxc-parser output\n */\nexport interface OxcProgram {\n\ttype: \"Program\";\n\tbody: OxcNode[];\n\tsourceType: \"module\" | \"script\";\n\t[key: string]: unknown;\n}\n\n/**\n * Generic ESTree node with a type discriminator\n */\nexport interface OxcNode {\n\ttype: string;\n\tstart?: number;\n\tend?: number;\n\t[key: string]: unknown;\n}\n\n/**\n * Parse error from oxc-parser\n */\nexport interface OxcError {\n\tmessage: string;\n\tseverity: string;\n\tlabels?: Array<{ span: { start: number; end: number } }>;\n}\n\n/**\n * Determine if a file path is a supported source file\n */\nexport function isSupportedFile(filePath: string): boolean {\n\tconst ext = getExtension(filePath);\n\treturn ALL_EXTENSIONS.has(ext);\n}\n\n/**\n * Parse a source file into an ESTree-compatible AST using oxc-parser.\n *\n * Uses synchronous parsing for maximum throughput (no async overhead).\n * Includes error recovery - partial ASTs are returned even with errors.\n *\n * @param content - Source code content\n * @param filePath - File path (used for language detection: TS/JSX)\n * @returns ParseResult with AST and any errors\n */\nexport function parseSource(content: string, filePath: string): ParseResult {\n\tconst ext = getExtension(filePath);\n\n\ttry {\n\t\t// oxc-parser API: parseSync(filename, sourceText, options?)\n\t\tconst lang = JSX_EXTENSIONS.has(ext)\n\t\t\t? TS_EXTENSIONS.has(ext)\n\t\t\t\t? \"tsx\"\n\t\t\t\t: \"jsx\"\n\t\t\t: TS_EXTENSIONS.has(ext)\n\t\t\t\t? \"ts\"\n\t\t\t\t: \"js\";\n\n\t\tconst result = oxcParseSync(filePath, content, {\n\t\t\tsourceType: \"module\",\n\t\t\tlang: lang as \"ts\" | \"tsx\" | \"js\" | \"jsx\",\n\t\t});\n\n\t\tconst errors: OxcError[] = Array.isArray(result.errors)\n\t\t\t? result.errors.map((e: unknown) => normalizeError(e))\n\t\t\t: [];\n\n\t\treturn {\n\t\t\tprogram: result.program as unknown as OxcProgram,\n\t\t\terrors,\n\t\t\tsuccess: errors.length === 0,\n\t\t};\n\t} catch (error) {\n\t\t// Fatal parse failure - return empty program\n\t\treturn {\n\t\t\tprogram: { type: \"Program\", body: [], sourceType: \"module\" },\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tseverity: \"error\",\n\t\t\t\t},\n\t\t\t],\n\t\t\tsuccess: false,\n\t\t};\n\t}\n}\n\n/**\n * Simple recursive AST visitor.\n * Walks every node in the tree and calls the visitor function.\n */\nexport function walkAST(node: unknown, visitor: (node: OxcNode, parent?: OxcNode) => void, parent?: OxcNode): void {\n\tif (!node || typeof node !== \"object\") {\n\t\treturn;\n\t}\n\n\tconst n = node as OxcNode;\n\n\t// Only visit objects that look like AST nodes (have a 'type' string property)\n\tif (typeof n.type === \"string\") {\n\t\tvisitor(n, parent);\n\t}\n\n\t// Recurse into all properties\n\tfor (const key of Object.keys(n)) {\n\t\tif (key === \"type\" || key === \"start\" || key === \"end\" || key === \"loc\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst value = n[key];\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const item of value) {\n\t\t\t\tif (item && typeof item === \"object\" && typeof (item as OxcNode).type === \"string\") {\n\t\t\t\t\twalkAST(item, visitor, n);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (value && typeof value === \"object\" && typeof (value as OxcNode).type === \"string\") {\n\t\t\twalkAST(value, visitor, n);\n\t\t}\n\t}\n}\n\n/**\n * Count total AST nodes in a program\n */\nexport function countASTNodes(program: OxcProgram): number {\n\tlet count = 0;\n\twalkAST(program, () => {\n\t\tcount++;\n\t});\n\treturn count;\n}\n\n/**\n * Convert character offset to 1-based line number (Task #11h)\n *\n * Used for mapping AST node positions (start/end offsets) to human-readable\n * line numbers in error messages. This is faster than regex-based approaches\n * and avoids expensive line splitting.\n *\n * @param source - Full source code string\n * @param offset - Character offset (0-based)\n * @returns 1-based line number\n *\n * @example\n * const line = offsetToLine(\"hello\\nworld\", 7); // returns 2\n */\nexport function offsetToLine(source: string, offset: number): number {\n\tif (offset < 0 || offset > source.length) {\n\t\treturn 1;\n\t}\n\n\tlet line = 1;\n\tfor (let i = 0; i < offset; i++) {\n\t\tif (source[i] === \"\\n\") {\n\t\t\tline++;\n\t\t}\n\t}\n\treturn line;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction getExtension(filePath: string): string {\n\tconst lastDot = filePath.lastIndexOf(\".\");\n\treturn lastDot >= 0 ? filePath.substring(lastDot).toLowerCase() : \"\";\n}\n\nfunction normalizeError(e: unknown): OxcError {\n\tif (typeof e === \"object\" && e !== null) {\n\t\tconst err = e as Record<string, unknown>;\n\t\treturn {\n\t\t\tmessage: String(err.message ?? err),\n\t\t\tseverity: String(err.severity ?? \"error\"),\n\t\t\tlabels: Array.isArray(err.labels) ? err.labels : undefined,\n\t\t};\n\t}\n\treturn { message: String(e), severity: \"error\" };\n}\n","/**\n * Complexity Analyzer\n *\n * AST-based code complexity analysis using oxc-parser.\n * Replaces regex-based complexity calculation in engine/risk-score.ts.\n *\n * Calculates per-function and per-file metrics:\n * - Cyclomatic complexity (branches, loops, ternaries, logical operators)\n * - Cognitive complexity (nesting penalty + structural complexity)\n * - Maximum nesting depth\n * - Function count\n * - Parameter count\n *\n * Returns AnalysisIssues for functions exceeding complexity thresholds.\n *\n * @module analysis/ast/ComplexityAnalyzer\n */\n\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult } from \"../types.js\";\nimport { isSupportedFile, type OxcNode, parseSource, walkAST } from \"./parser.js\";\n\n/** Thresholds for flagging complexity issues */\nconst THRESHOLDS = {\n\t/** Cyclomatic complexity per function */\n\tmaxCyclomaticPerFunction: 15,\n\t/** Maximum nesting depth per function */\n\tmaxNestingDepth: 5,\n\t/** Maximum parameters per function */\n\tmaxParameters: 5,\n\t/** Maximum functions per file */\n\tmaxFunctionsPerFile: 30,\n\t/** File-level aggregate cyclomatic complexity */\n\tmaxCyclomaticPerFile: 50,\n};\n\n/** Complexity metrics for a single function */\nexport interface FunctionComplexity {\n\tname: string;\n\tline: number;\n\tcyclomatic: number;\n\tmaxNesting: number;\n\tparameters: number;\n}\n\n/** Complexity metrics for a file */\nexport interface FileComplexity {\n\tfilePath: string;\n\tfunctions: FunctionComplexity[];\n\ttotalCyclomatic: number;\n\tmaxNesting: number;\n\tfunctionCount: number;\n\taverageCyclomatic: number;\n}\n\n/** Node types that increment cyclomatic complexity */\nconst BRANCH_NODES = new Set([\n\t\"IfStatement\",\n\t\"ConditionalExpression\",\n\t\"SwitchCase\",\n\t\"ForStatement\",\n\t\"ForInStatement\",\n\t\"ForOfStatement\",\n\t\"WhileStatement\",\n\t\"DoWhileStatement\",\n\t\"CatchClause\",\n]);\n\n/** Node types that contribute to logical branching */\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\", \"??\"]);\n\n/** Node types that represent function declarations */\nconst FUNCTION_NODES = new Set([\n\t\"FunctionDeclaration\",\n\t\"FunctionExpression\",\n\t\"ArrowFunctionExpression\",\n\t\"MethodDefinition\",\n]);\n\n/**\n * AST-based complexity analyzer.\n * Implements the Analyzer interface for the analysis pipeline.\n */\nexport class ComplexityAnalyzer implements Analyzer {\n\treadonly id = \"complexity\";\n\treadonly name = \"Complexity Analysis\";\n\treadonly filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst startTime = performance.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet filesAnalyzed = 0;\n\t\tlet totalNodesVisited = 0;\n\t\tconst parseErrors: string[] = [];\n\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (!this.shouldAnalyzeFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesAnalyzed++;\n\n\t\t\tconst fileComplexity = this.analyzeFile(content, file);\n\n\t\t\tif (!fileComplexity) {\n\t\t\t\tparseErrors.push(`${file}: Failed to parse`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttotalNodesVisited += fileComplexity.functions.length;\n\n\t\t\t// Check per-function thresholds\n\t\t\tfor (const fn of fileComplexity.functions) {\n\t\t\t\tif (fn.cyclomatic > THRESHOLDS.maxCyclomaticPerFunction) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `complexity/cyclomatic/${file}/${fn.line}`,\n\t\t\t\t\t\tseverity: fn.cyclomatic > THRESHOLDS.maxCyclomaticPerFunction * 2 ? \"high\" : \"medium\",\n\t\t\t\t\t\ttype: \"HIGH_CYCLOMATIC_COMPLEXITY\",\n\t\t\t\t\t\tmessage: `Function \"${fn.name}\" has cyclomatic complexity ${fn.cyclomatic} (max: ${THRESHOLDS.maxCyclomaticPerFunction})`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: fn.line,\n\t\t\t\t\t\tfix: \"Extract helper functions or simplify branching logic\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (fn.maxNesting > THRESHOLDS.maxNestingDepth) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `complexity/nesting/${file}/${fn.line}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"DEEP_NESTING\",\n\t\t\t\t\t\tmessage: `Function \"${fn.name}\" has nesting depth ${fn.maxNesting} (max: ${THRESHOLDS.maxNestingDepth})`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: fn.line,\n\t\t\t\t\t\tfix: \"Use early returns or extract nested logic into helper functions\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (fn.parameters > THRESHOLDS.maxParameters) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `complexity/parameters/${file}/${fn.line}`,\n\t\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\t\ttype: \"TOO_MANY_PARAMETERS\",\n\t\t\t\t\t\tmessage: `Function \"${fn.name}\" has ${fn.parameters} parameters (max: ${THRESHOLDS.maxParameters})`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: fn.line,\n\t\t\t\t\t\tfix: \"Use an options object pattern to reduce parameter count\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check file-level thresholds\n\t\t\tif (fileComplexity.functionCount > THRESHOLDS.maxFunctionsPerFile) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `complexity/function-count/${file}`,\n\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\ttype: \"TOO_MANY_FUNCTIONS\",\n\t\t\t\t\tmessage: `${file} has ${fileComplexity.functionCount} functions (max: ${THRESHOLDS.maxFunctionsPerFile})`,\n\t\t\t\t\tfile,\n\t\t\t\t\tfix: \"Split into multiple focused modules\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (fileComplexity.totalCyclomatic > THRESHOLDS.maxCyclomaticPerFile) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `complexity/file-complexity/${file}`,\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\ttype: \"HIGH_FILE_COMPLEXITY\",\n\t\t\t\t\tmessage: `${file} has total cyclomatic complexity ${fileComplexity.totalCyclomatic} (max: ${THRESHOLDS.maxCyclomaticPerFile})`,\n\t\t\t\t\tfile,\n\t\t\t\t\tfix: \"Consider splitting this file into smaller modules\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tanalyzer: this.id,\n\t\t\tsuccess: true,\n\t\t\tissues,\n\t\t\tcoverage: filesAnalyzed / Math.max(context.files.length, 1),\n\t\t\tduration: performance.now() - startTime,\n\t\t\tmetadata: {\n\t\t\t\tfilesAnalyzed,\n\t\t\t\tnodesVisited: totalNodesVisited,\n\t\t\t\tpatternsChecked: [\n\t\t\t\t\t\"HIGH_CYCLOMATIC_COMPLEXITY\",\n\t\t\t\t\t\"DEEP_NESTING\",\n\t\t\t\t\t\"TOO_MANY_PARAMETERS\",\n\t\t\t\t\t\"TOO_MANY_FUNCTIONS\",\n\t\t\t\t\t\"HIGH_FILE_COMPLEXITY\",\n\t\t\t\t],\n\t\t\t\tparseErrors,\n\t\t\t},\n\t\t};\n\t}\n\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.shouldAnalyzeFile(f));\n\t}\n\n\t/**\n\t * Analyze a single file and return complexity metrics.\n\t * Useful for external callers that just want metrics, not issues.\n\t */\n\tanalyzeFile(content: string, filePath: string): FileComplexity | null {\n\t\tif (!isSupportedFile(filePath)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { program, success } = parseSource(content, filePath);\n\t\tif (!success && program.body.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst functions: FunctionComplexity[] = [];\n\t\tlet fileMaxNesting = 0;\n\n\t\t// Find all function nodes and compute per-function metrics\n\t\twalkAST(program, (node: OxcNode) => {\n\t\t\tif (!FUNCTION_NODES.has(node.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst fn = this.analyzeFunctionNode(node);\n\t\t\tfunctions.push(fn);\n\t\t\tif (fn.maxNesting > fileMaxNesting) {\n\t\t\t\tfileMaxNesting = fn.maxNesting;\n\t\t\t}\n\t\t});\n\n\t\tconst totalCyclomatic = functions.reduce((sum, fn) => sum + fn.cyclomatic, 0);\n\n\t\treturn {\n\t\t\tfilePath,\n\t\t\tfunctions,\n\t\t\ttotalCyclomatic,\n\t\t\tmaxNesting: fileMaxNesting,\n\t\t\tfunctionCount: functions.length,\n\t\t\taverageCyclomatic: functions.length > 0 ? totalCyclomatic / functions.length : 0,\n\t\t};\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Per-function analysis\n\t// -----------------------------------------------------------------------\n\n\tprivate analyzeFunctionNode(node: OxcNode): FunctionComplexity {\n\t\tconst name = this.getFunctionName(node);\n\t\tconst line = node.start ?? 0;\n\t\tconst params = this.getParameterCount(node);\n\n\t\t// Cyclomatic complexity: start at 1 (base path)\n\t\tlet cyclomatic = 1;\n\t\tlet maxNesting = 0;\n\n\t\t// Walk the function body\n\t\tconst body = this.getFunctionBody(node);\n\t\tif (body) {\n\t\t\tthis.walkForComplexity(body, (n, depth) => {\n\t\t\t\t// Increment cyclomatic for branch nodes\n\t\t\t\tif (BRANCH_NODES.has(n.type)) {\n\t\t\t\t\tcyclomatic++;\n\t\t\t\t}\n\n\t\t\t\t// Check for logical operators (&&, ||, ??)\n\t\t\t\tif (n.type === \"LogicalExpression\") {\n\t\t\t\t\tconst operator = n.operator as string;\n\t\t\t\t\tif (LOGICAL_OPERATORS.has(operator)) {\n\t\t\t\t\t\tcyclomatic++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track nesting for block-like structures\n\t\t\t\tif (depth > maxNesting) {\n\t\t\t\t\tmaxNesting = depth;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn { name, line, cyclomatic, maxNesting, parameters: params };\n\t}\n\n\t/**\n\t * Walk AST nodes counting nesting depth for complexity metrics\n\t */\n\tprivate walkForComplexity(node: unknown, callback: (node: OxcNode, depth: number) => void, depth = 0): void {\n\t\tif (!node || typeof node !== \"object\") {\n\t\t\treturn;\n\t\t}\n\t\tconst n = node as OxcNode;\n\t\tif (typeof n.type !== \"string\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Nesting-increasing nodes\n\t\tconst nestingNodes = new Set([\n\t\t\t\"IfStatement\",\n\t\t\t\"ForStatement\",\n\t\t\t\"ForInStatement\",\n\t\t\t\"ForOfStatement\",\n\t\t\t\"WhileStatement\",\n\t\t\t\"DoWhileStatement\",\n\t\t\t\"SwitchStatement\",\n\t\t\t\"TryStatement\",\n\t\t]);\n\n\t\tconst newDepth = nestingNodes.has(n.type) ? depth + 1 : depth;\n\t\tcallback(n, newDepth);\n\n\t\t// Recurse into children\n\t\tfor (const key of Object.keys(n)) {\n\t\t\tif (key === \"type\" || key === \"start\" || key === \"end\" || key === \"loc\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst value = n[key];\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tthis.walkForComplexity(item, callback, newDepth);\n\t\t\t\t}\n\t\t\t} else if (value && typeof value === \"object\" && typeof (value as OxcNode).type === \"string\") {\n\t\t\t\tthis.walkForComplexity(value, callback, newDepth);\n\t\t\t}\n\t\t}\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Helpers\n\t// -----------------------------------------------------------------------\n\n\tprivate getFunctionName(node: OxcNode): string {\n\t\t// FunctionDeclaration / FunctionExpression\n\t\tif (node.id && typeof node.id === \"object\") {\n\t\t\tconst id = node.id as OxcNode;\n\t\t\tif (typeof id.name === \"string\") {\n\t\t\t\treturn id.name;\n\t\t\t}\n\t\t}\n\n\t\t// MethodDefinition\n\t\tif (node.key && typeof node.key === \"object\") {\n\t\t\tconst key = node.key as OxcNode;\n\t\t\tif (typeof key.name === \"string\") {\n\t\t\t\treturn key.name;\n\t\t\t}\n\t\t\tif (typeof key.value === \"string\") {\n\t\t\t\treturn key.value;\n\t\t\t}\n\t\t}\n\n\t\t// ArrowFunctionExpression assigned to a variable\n\t\t// (parent context not available - return anonymous)\n\t\treturn \"<anonymous>\";\n\t}\n\n\tprivate getParameterCount(node: OxcNode): number {\n\t\tif (node.type === \"MethodDefinition\") {\n\t\t\tconst value = node.value as OxcNode | undefined;\n\t\t\tif (value && Array.isArray(value.params)) {\n\t\t\t\treturn value.params.length;\n\t\t\t}\n\t\t}\n\t\tif (Array.isArray(node.params)) {\n\t\t\treturn node.params.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tprivate getFunctionBody(node: OxcNode): OxcNode | null {\n\t\tif (node.type === \"MethodDefinition\") {\n\t\t\tconst value = node.value as OxcNode | undefined;\n\t\t\tif (value?.body) {\n\t\t\t\treturn value.body as OxcNode;\n\t\t\t}\n\t\t}\n\t\tif (node.body) {\n\t\t\treturn node.body as OxcNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate shouldAnalyzeFile(file: string): boolean {\n\t\tconst ext = file.split(\".\").pop()?.toLowerCase();\n\t\treturn [\"ts\", \"tsx\", \"js\", \"jsx\", \"mts\", \"cts\"].includes(ext ?? \"\");\n\t}\n}\n","/**\n * AST-based Import Extractor\n *\n * Replaces regex-based import extraction with proper AST walking.\n * Uses oxc-parser's ESTree output to accurately detect:\n * - Static imports (import ... from '...')\n * - Dynamic imports (import('...'))\n * - Re-exports (export ... from '...')\n * - CommonJS require() calls\n *\n * This eliminates false positives from strings/comments that look like imports.\n *\n * @module analysis/ast/import-extractor\n */\n\nimport { isSupportedFile, type OxcNode, parseSource, walkAST } from \"./parser.js\";\n\n/**\n * A single import found in a source file\n */\nexport interface ImportInfo {\n\t/** The import source/specifier (e.g., './utils', 'react', '@vreko/core') */\n\tsource: string;\n\t/** Type of import */\n\tkind: \"static\" | \"dynamic\" | \"require\" | \"re-export\";\n\t/** Whether this is a type-only import (import type { ... }) */\n\ttypeOnly: boolean;\n\t/** Line number where the import appears */\n\tline?: number;\n\t/** Named specifiers imported (empty for namespace/default-only imports) */\n\tspecifiers: string[];\n}\n\n/**\n * Result of extracting imports from a file\n */\nexport interface ImportExtractionResult {\n\t/** File path that was analyzed */\n\tfilePath: string;\n\t/** All imports found */\n\timports: ImportInfo[];\n\t/** Whether parsing succeeded */\n\tparseSuccess: boolean;\n\t/** Parse errors (if any) */\n\tparseErrors: string[];\n}\n\n/**\n * Extract all imports from a source file using AST analysis.\n *\n * @param content - Source code content\n * @param filePath - File path (for language detection)\n * @returns ImportExtractionResult with all found imports\n */\nexport function extractImports(content: string, filePath: string): ImportExtractionResult {\n\tif (!isSupportedFile(filePath)) {\n\t\treturn {\n\t\t\tfilePath,\n\t\t\timports: [],\n\t\t\tparseSuccess: false,\n\t\t\tparseErrors: [`Unsupported file type: ${filePath}`],\n\t\t};\n\t}\n\n\tconst { program, errors, success } = parseSource(content, filePath);\n\tconst imports: ImportInfo[] = [];\n\n\t// Walk the AST to find all import-related nodes\n\twalkAST(program, (node: OxcNode) => {\n\t\tswitch (node.type) {\n\t\t\t// import ... from 'source'\n\t\t\tcase \"ImportDeclaration\":\n\t\t\t\thandleImportDeclaration(node, imports);\n\t\t\t\tbreak;\n\n\t\t\t// export { ... } from 'source' OR export * from 'source'\n\t\t\tcase \"ExportNamedDeclaration\":\n\t\t\tcase \"ExportAllDeclaration\":\n\t\t\t\thandleExportDeclaration(node, imports);\n\t\t\t\tbreak;\n\n\t\t\t// import('source') - ESTree ImportExpression\n\t\t\tcase \"ImportExpression\":\n\t\t\t\thandleImportExpression(node, imports);\n\t\t\t\tbreak;\n\n\t\t\t// require('source') OR legacy import('source') as CallExpression\n\t\t\tcase \"CallExpression\":\n\t\t\t\thandleCallExpression(node, imports);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\treturn {\n\t\tfilePath,\n\t\timports,\n\t\tparseSuccess: success,\n\t\tparseErrors: errors.map((e) => e.message),\n\t};\n}\n\n/**\n * Convenience: extract just the import source strings (deduplicated)\n */\nexport function extractImportSources(content: string, filePath: string): string[] {\n\tconst result = extractImports(content, filePath);\n\tconst sources = new Set<string>();\n\tfor (const imp of result.imports) {\n\t\tsources.add(imp.source);\n\t}\n\treturn [...sources];\n}\n\n/**\n * Batch extract imports from multiple files.\n * Useful for building dependency graphs efficiently.\n */\nexport function extractImportsBatch(files: Map<string, string>): Map<string, ImportExtractionResult> {\n\tconst results = new Map<string, ImportExtractionResult>();\n\tfor (const [filePath, content] of files) {\n\t\tresults.set(filePath, extractImports(content, filePath));\n\t}\n\treturn results;\n}\n\n// ---------------------------------------------------------------------------\n// Node handlers\n// ---------------------------------------------------------------------------\n\nfunction handleImportDeclaration(node: OxcNode, imports: ImportInfo[]): void {\n\tconst source = getStringValue(node.source);\n\tif (!source) {\n\t\treturn;\n\t}\n\n\tconst specifiers: string[] = [];\n\tif (Array.isArray(node.specifiers)) {\n\t\tfor (const spec of node.specifiers) {\n\t\t\tconst s = spec as OxcNode;\n\t\t\tif (s.type === \"ImportSpecifier\") {\n\t\t\t\tconst imported = s.imported as OxcNode | undefined;\n\t\t\t\tspecifiers.push(getIdentifierName(imported) ?? \"unknown\");\n\t\t\t} else if (s.type === \"ImportDefaultSpecifier\") {\n\t\t\t\tspecifiers.push(\"default\");\n\t\t\t} else if (s.type === \"ImportNamespaceSpecifier\") {\n\t\t\t\tspecifiers.push(\"*\");\n\t\t\t}\n\t\t}\n\t}\n\n\timports.push({\n\t\tsource,\n\t\tkind: \"static\",\n\t\ttypeOnly: node.importKind === \"type\" || Boolean(node.isTypeOnly),\n\t\tline: node.start != null ? node.start : undefined,\n\t\tspecifiers,\n\t});\n}\n\nfunction handleExportDeclaration(node: OxcNode, imports: ImportInfo[]): void {\n\tconst source = getStringValue(node.source);\n\tif (!source) {\n\t\treturn; // export without source (local export)\n\t}\n\n\tconst specifiers: string[] = [];\n\tif (node.type === \"ExportAllDeclaration\") {\n\t\tspecifiers.push(\"*\");\n\t} else if (Array.isArray(node.specifiers)) {\n\t\tfor (const spec of node.specifiers) {\n\t\t\tconst s = spec as OxcNode;\n\t\t\tconst local = s.local as OxcNode | undefined;\n\t\t\tspecifiers.push(getIdentifierName(local) ?? \"unknown\");\n\t\t}\n\t}\n\n\timports.push({\n\t\tsource,\n\t\tkind: \"re-export\",\n\t\ttypeOnly: node.exportKind === \"type\" || Boolean(node.isTypeOnly),\n\t\tline: node.start != null ? node.start : undefined,\n\t\tspecifiers,\n\t});\n}\n\nfunction handleImportExpression(node: OxcNode, imports: ImportInfo[]): void {\n\t// oxc-parser ESTree: ImportExpression has .source directly\n\tconst source = getStringValue(node.source);\n\tif (source) {\n\t\timports.push({\n\t\t\tsource,\n\t\t\tkind: \"dynamic\",\n\t\t\ttypeOnly: false,\n\t\t\tline: node.start != null ? node.start : undefined,\n\t\t\tspecifiers: [],\n\t\t});\n\t}\n}\n\nfunction handleCallExpression(node: OxcNode, imports: ImportInfo[]): void {\n\tconst callee = node.callee as OxcNode | undefined;\n\tif (!callee) {\n\t\treturn;\n\t}\n\n\t// Dynamic import: import('source') - fallback for non-ESTree parsers\n\tif (node.type === \"CallExpression\" && callee.type === \"Import\") {\n\t\tconst args = node.arguments as OxcNode[] | undefined;\n\t\tif (args && args.length > 0) {\n\t\t\tconst source = getStringValue(args[0]);\n\t\t\tif (source) {\n\t\t\t\timports.push({\n\t\t\t\t\tsource,\n\t\t\t\t\tkind: \"dynamic\",\n\t\t\t\t\ttypeOnly: false,\n\t\t\t\t\tline: node.start != null ? node.start : undefined,\n\t\t\t\t\tspecifiers: [],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\n\t// require('source')\n\tif (callee.type === \"Identifier\" && callee.name === \"require\") {\n\t\tconst args = node.arguments as OxcNode[] | undefined;\n\t\tif (args && args.length > 0) {\n\t\t\tconst source = getStringValue(args[0]);\n\t\t\tif (source) {\n\t\t\t\timports.push({\n\t\t\t\t\tsource,\n\t\t\t\t\tkind: \"require\",\n\t\t\t\t\ttypeOnly: false,\n\t\t\t\t\tline: node.start != null ? node.start : undefined,\n\t\t\t\t\tspecifiers: [],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\nfunction getStringValue(node: unknown): string | undefined {\n\tif (!node || typeof node !== \"object\") {\n\t\treturn undefined;\n\t}\n\tconst n = node as OxcNode;\n\tif (n.type === \"StringLiteral\" || n.type === \"Literal\") {\n\t\treturn typeof n.value === \"string\" ? n.value : undefined;\n\t}\n\treturn undefined;\n}\n\nfunction getIdentifierName(node: unknown): string | undefined {\n\tif (!node || typeof node !== \"object\") {\n\t\treturn undefined;\n\t}\n\tconst n = node as OxcNode;\n\tif (n.type === \"Identifier\" || n.type === \"IdentifierName\" || n.type === \"IdentifierReference\") {\n\t\treturn typeof n.name === \"string\" ? n.name : undefined;\n\t}\n\treturn undefined;\n}\n","/**\n * Import Graph Analyzer\n *\n * AST-based analyzer that builds a file dependency graph and detects:\n * - Circular dependencies\n * - Orphan files (not imported by anything)\n * - High fan-in files (imported by too many files - fragility risk)\n * - High fan-out files (imports too many things - complexity risk)\n * - Cross-boundary imports (monorepo package boundary violations)\n *\n * Uses oxc-parser via the shared parser utility for maximum speed.\n * Replaces regex-based import extraction in intelligence/ast-analyzer.ts.\n *\n * @module analysis/ast/ImportGraphAnalyzer\n */\n\nimport { dirname, resolve } from \"node:path\";\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult } from \"../types.js\";\nimport { extractImports, type ImportExtractionResult } from \"./import-extractor.js\";\n\n/** Thresholds for flagging issues */\nconst THRESHOLDS = {\n\t/** Max files that can import a single file before it's flagged as high fan-in */\n\thighFanIn: 15,\n\t/** Max imports a single file can have before it's flagged as high fan-out */\n\thighFanOut: 20,\n\t/** Minimum cycle length to report (avoids noise from self-imports) */\n\tminCycleLength: 2,\n};\n\n/**\n * A node in the import dependency graph\n */\nexport interface GraphNode {\n\tfilePath: string;\n\timports: string[];\n\timportedBy: string[];\n\t/** Type-only import sources (don't contribute to runtime coupling) */\n\ttypeOnlyImports: string[];\n}\n\n/**\n * The full import graph for a set of files\n */\nexport interface ImportGraph {\n\tnodes: Map<string, GraphNode>;\n\t/** Forward edges: file → set of files it imports */\n\tedges: Map<string, Set<string>>;\n\t/** Reverse edges: file → set of files that import it */\n\treverseEdges: Map<string, Set<string>>;\n\t/** Detected circular dependency cycles */\n\tcycles: string[][];\n}\n\n/**\n * AST-based import graph analyzer.\n * Implements the Analyzer interface for integration with the analysis pipeline.\n */\nexport class ImportGraphAnalyzer implements Analyzer {\n\treadonly id = \"import-graph\";\n\treadonly name = \"Import Graph Analysis\";\n\treadonly filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst startTime = performance.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet filesAnalyzed = 0;\n\t\tconst parseErrors: string[] = [];\n\n\t\t// Step 1: Extract imports from all files via AST\n\t\tconst extractions = new Map<string, ImportExtractionResult>();\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (!this.shouldAnalyzeFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesAnalyzed++;\n\t\t\tconst result = extractImports(content, file);\n\t\t\textractions.set(file, result);\n\t\t\tif (!result.parseSuccess) {\n\t\t\t\tparseErrors.push(...result.parseErrors);\n\t\t\t}\n\t\t}\n\n\t\t// Step 2: Build the import graph\n\t\tconst graph = this.buildGraph(extractions, context.workspaceRoot);\n\n\t\t// Step 3: Detect circular dependencies\n\t\tconst cycles = this.detectCycles(graph.edges);\n\t\tgraph.cycles = cycles;\n\n\t\tfor (const cycle of cycles) {\n\t\t\tissues.push({\n\t\t\t\tid: `import-graph/circular/${cycle.join(\"->\")}`,\n\t\t\t\tseverity: \"high\",\n\t\t\t\ttype: \"CIRCULAR_DEPENDENCY\",\n\t\t\t\tmessage: `Circular dependency: ${cycle.join(\" → \")}`,\n\t\t\t\tfile: cycle[0],\n\t\t\t\tfix: \"Break the cycle by extracting shared code or using dependency injection\",\n\t\t\t});\n\t\t}\n\n\t\t// Step 4: Detect high fan-in (fragile hub files)\n\t\tfor (const [file, node] of graph.nodes) {\n\t\t\tif (node.importedBy.length > THRESHOLDS.highFanIn) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `import-graph/high-fan-in/${file}`,\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\ttype: \"HIGH_FAN_IN\",\n\t\t\t\t\tmessage: `${file} is imported by ${node.importedBy.length} files - changes here have high blast radius`,\n\t\t\t\t\tfile,\n\t\t\t\t\tfix: \"Consider splitting into smaller, more focused modules\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Step 5: Detect high fan-out (overly coupled files)\n\t\tfor (const [file, node] of graph.nodes) {\n\t\t\tconst runtimeImports = node.imports.filter((imp) => !node.typeOnlyImports.includes(imp));\n\t\t\tif (runtimeImports.length > THRESHOLDS.highFanOut) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `import-graph/high-fan-out/${file}`,\n\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\ttype: \"HIGH_FAN_OUT\",\n\t\t\t\t\tmessage: `${file} imports ${runtimeImports.length} modules - high coupling`,\n\t\t\t\t\tfile,\n\t\t\t\t\tfix: \"Consider using a facade or consolidating related imports\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Step 6: Detect orphan files (not imported by anything, not entry points)\n\t\tfor (const [file, node] of graph.nodes) {\n\t\t\tif (node.importedBy.length === 0 && !this.isEntryPoint(file)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `import-graph/orphan/${file}`,\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\ttype: \"ORPHAN_FILE\",\n\t\t\t\t\tmessage: `${file} is not imported by any other analyzed file`,\n\t\t\t\t\tfile,\n\t\t\t\t\tfix: \"Verify this file is needed - it may be dead code\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tanalyzer: this.id,\n\t\t\tsuccess: true,\n\t\t\tissues,\n\t\t\tcoverage: filesAnalyzed / Math.max(context.files.length, 1),\n\t\t\tduration: performance.now() - startTime,\n\t\t\tmetadata: {\n\t\t\t\tfilesAnalyzed,\n\t\t\t\tnodesVisited: graph.nodes.size,\n\t\t\t\tpatternsChecked: [\"CIRCULAR_DEPENDENCY\", \"HIGH_FAN_IN\", \"HIGH_FAN_OUT\", \"ORPHAN_FILE\"],\n\t\t\t\tparseErrors,\n\t\t\t},\n\t\t};\n\t}\n\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.shouldAnalyzeFile(f));\n\t}\n\n\t/**\n\t * Build the import graph and return it for external consumption.\n\t * Useful for other tools (momentum scoring, risk propagation, etc.).\n\t */\n\tbuildGraphFromContext(context: AnalysisContext): ImportGraph {\n\t\tconst extractions = new Map<string, ImportExtractionResult>();\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (this.shouldAnalyzeFile(file)) {\n\t\t\t\textractions.set(file, extractImports(content, file));\n\t\t\t}\n\t\t}\n\t\tconst graph = this.buildGraph(extractions, context.workspaceRoot);\n\t\tgraph.cycles = this.detectCycles(graph.edges);\n\t\treturn graph;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Graph construction\n\t// -----------------------------------------------------------------------\n\n\tprivate buildGraph(extractions: Map<string, ImportExtractionResult>, workspaceRoot: string): ImportGraph {\n\t\tconst nodes = new Map<string, GraphNode>();\n\t\tconst edges = new Map<string, Set<string>>();\n\t\tconst reverseEdges = new Map<string, Set<string>>();\n\n\t\t// Initialize nodes for all analyzed files\n\t\tfor (const filePath of extractions.keys()) {\n\t\t\tconst normalized = this.normalizePath(filePath);\n\t\t\tnodes.set(normalized, {\n\t\t\t\tfilePath: normalized,\n\t\t\t\timports: [],\n\t\t\t\timportedBy: [],\n\t\t\t\ttypeOnlyImports: [],\n\t\t\t});\n\t\t\tedges.set(normalized, new Set());\n\t\t}\n\n\t\t// Build edges from import data\n\t\tfor (const [filePath, extraction] of extractions) {\n\t\t\tconst normalized = this.normalizePath(filePath);\n\n\t\t\tfor (const imp of extraction.imports) {\n\t\t\t\tconst resolved = this.resolveImport(imp.source, filePath, workspaceRoot);\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst resolvedNorm = this.normalizePath(resolved);\n\n\t\t\t\t// Add forward edge\n\t\t\t\tedges.get(normalized)?.add(resolvedNorm);\n\n\t\t\t\t// Track in node\n\t\t\t\tconst node = nodes.get(normalized);\n\t\t\t\tif (node && !node.imports.includes(resolvedNorm)) {\n\t\t\t\t\tnode.imports.push(resolvedNorm);\n\t\t\t\t\tif (imp.typeOnly) {\n\t\t\t\t\t\tnode.typeOnlyImports.push(resolvedNorm);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add reverse edge (ensure target node exists)\n\t\t\t\tif (!reverseEdges.has(resolvedNorm)) {\n\t\t\t\t\treverseEdges.set(resolvedNorm, new Set());\n\t\t\t\t}\n\t\t\t\treverseEdges.get(resolvedNorm)?.add(normalized);\n\n\t\t\t\t// Ensure target node exists\n\t\t\t\tif (!nodes.has(resolvedNorm)) {\n\t\t\t\t\tnodes.set(resolvedNorm, {\n\t\t\t\t\t\tfilePath: resolvedNorm,\n\t\t\t\t\t\timports: [],\n\t\t\t\t\t\timportedBy: [],\n\t\t\t\t\t\ttypeOnlyImports: [],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Populate importedBy from reverse edges\n\t\tfor (const [file, importers] of reverseEdges) {\n\t\t\tconst node = nodes.get(file);\n\t\t\tif (node) {\n\t\t\t\tnode.importedBy = [...importers];\n\t\t\t}\n\t\t}\n\n\t\treturn { nodes, edges, reverseEdges, cycles: [] };\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Cycle detection (Tarjan's SCC adapted for cycles)\n\t// -----------------------------------------------------------------------\n\n\tprivate detectCycles(edges: Map<string, Set<string>>): string[][] {\n\t\tconst cycles: string[][] = [];\n\t\tconst visited = new Set<string>();\n\t\tconst inStack = new Set<string>();\n\t\tconst stack: string[] = [];\n\n\t\tconst dfs = (node: string): void => {\n\t\t\tif (inStack.has(node)) {\n\t\t\t\t// Found a cycle: extract it from the stack\n\t\t\t\tconst cycleStart = stack.indexOf(node);\n\t\t\t\tif (cycleStart >= 0) {\n\t\t\t\t\tconst cycle = stack.slice(cycleStart);\n\t\t\t\t\tif (cycle.length >= THRESHOLDS.minCycleLength) {\n\t\t\t\t\t\tcycles.push([...cycle, node]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (visited.has(node)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvisited.add(node);\n\t\t\tinStack.add(node);\n\t\t\tstack.push(node);\n\n\t\t\tconst neighbors = edges.get(node) ?? new Set();\n\t\t\tfor (const neighbor of neighbors) {\n\t\t\t\tdfs(neighbor);\n\t\t\t}\n\n\t\t\tstack.pop();\n\t\t\tinStack.delete(node);\n\t\t};\n\n\t\tfor (const node of edges.keys()) {\n\t\t\tdfs(node);\n\t\t}\n\n\t\treturn cycles;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Import resolution\n\t// -----------------------------------------------------------------------\n\n\tprivate resolveImport(importSource: string, fromFile: string, _workspaceRoot: string): string | null {\n\t\t// Skip external packages (bare specifiers)\n\t\tif (!importSource.startsWith(\".\") && !importSource.startsWith(\"/\")) {\n\t\t\t// Handle workspace packages like @vreko/core\n\t\t\tif (importSource.startsWith(\"@\")) {\n\t\t\t\tconst parts = importSource.split(\"/\");\n\t\t\t\tif (parts.length >= 2) {\n\t\t\t\t\tconst pkg = parts[1];\n\t\t\t\t\treturn `packages/${pkg}/src/index.ts`;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t// Resolve relative imports\n\t\tconst fromDir = dirname(fromFile);\n\t\tlet resolved = resolve(fromDir, importSource);\n\n\t\t// Add .ts extension if missing\n\t\tif (!resolved.match(/\\.(ts|tsx|js|jsx|mts|cts|mjs|cjs)$/)) {\n\t\t\tresolved += \".ts\";\n\t\t}\n\n\t\t// Strip .js → .ts for TypeScript projects (common pattern)\n\t\tresolved = resolved.replace(/\\.js$/, \".ts\").replace(/\\.jsx$/, \".tsx\");\n\n\t\treturn resolved;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Helpers\n\t// -----------------------------------------------------------------------\n\n\tprivate shouldAnalyzeFile(file: string): boolean {\n\t\tconst ext = file.split(\".\").pop()?.toLowerCase();\n\t\treturn [\"ts\", \"tsx\", \"js\", \"jsx\", \"mts\", \"cts\"].includes(ext ?? \"\");\n\t}\n\n\tprivate isEntryPoint(file: string): boolean {\n\t\treturn (\n\t\t\tfile.includes(\"index.\") ||\n\t\t\tfile.includes(\"main.\") ||\n\t\t\tfile.includes(\"entry.\") ||\n\t\t\tfile.includes(\"server.\") ||\n\t\t\tfile.includes(\"app.\") ||\n\t\t\tfile.endsWith(\"/page.tsx\") ||\n\t\t\tfile.endsWith(\"/layout.tsx\") ||\n\t\t\tfile.endsWith(\"/route.ts\") ||\n\t\t\tfile.includes(\"__tests__\") ||\n\t\t\tfile.includes(\".test.\") ||\n\t\t\tfile.includes(\".spec.\")\n\t\t);\n\t}\n\n\tprivate normalizePath(filePath: string): string {\n\t\treturn filePath.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n\t}\n}\n","/**\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 */\n\nimport * as eslintParser from \"@typescript-eslint/parser\";\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult } from \"../types.js\";\n\ninterface ParseError {\n\tmessage: string;\n\tline: number;\n\tcolumn: number;\n}\n\n/**\n * AST-based syntax analyzer using @typescript-eslint/parser\n */\nexport class SyntaxAnalyzer implements Analyzer {\n\treadonly id = \"syntax\";\n\treadonly name = \"Syntax Analysis\";\n\treadonly filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst startTime = performance.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet filesAnalyzed = 0;\n\t\tlet nodesVisited = 0;\n\t\tconst parseErrors: string[] = [];\n\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (!this.shouldAnalyzeFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesAnalyzed++;\n\n\t\t\ttry {\n\t\t\t\t// Parse with @typescript-eslint/parser\n\t\t\t\tconst ast = eslintParser.parse(content, {\n\t\t\t\t\tsourceType: \"module\",\n\t\t\t\t\tecmaFeatures: {\n\t\t\t\t\t\tjsx: file.endsWith(\".tsx\") || file.endsWith(\".jsx\"),\n\t\t\t\t\t},\n\t\t\t\t\tecmaVersion: \"latest\",\n\t\t\t\t\t// Error recovery mode to get partial AST even with errors\n\t\t\t\t\terrorOnUnknownASTType: false,\n\t\t\t\t});\n\n\t\t\t\t// Count nodes for coverage metric\n\t\t\t\tnodesVisited += this.countNodes(ast);\n\n\t\t\t\t// Check for syntax issues that the parser didn't catch but still parsed\n\t\t\t\tthis.checkSyntaxPatterns(content, file, issues);\n\t\t\t} catch (error) {\n\t\t\t\t// Parse error - this is a real syntax issue\n\t\t\t\tconst parseError = this.extractParseError(error);\n\t\t\t\tparseErrors.push(`${file}: ${parseError.message}`);\n\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `syntax/parse-error/${file}/${parseError.line}`,\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\ttype: \"SYNTAX_ERROR\",\n\t\t\t\t\tmessage: parseError.message,\n\t\t\t\t\tfile,\n\t\t\t\t\tline: parseError.line,\n\t\t\t\t\tcolumn: parseError.column,\n\t\t\t\t\tfix: \"Fix the syntax error to allow parsing\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tanalyzer: this.id,\n\t\t\tsuccess: true,\n\t\t\tissues,\n\t\t\tcoverage: filesAnalyzed / Math.max(context.files.length, 1),\n\t\t\tduration: performance.now() - startTime,\n\t\t\tmetadata: {\n\t\t\t\tfilesAnalyzed,\n\t\t\t\tnodesVisited,\n\t\t\t\tparseErrors,\n\t\t\t},\n\t\t};\n\t}\n\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.shouldAnalyzeFile(f));\n\t}\n\n\tprivate shouldAnalyzeFile(file: string): boolean {\n\t\tconst ext = file.split(\".\").pop()?.toLowerCase();\n\t\treturn [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n\t}\n\n\t/**\n\t * Extract parse error information from parser exception\n\t */\n\tprivate extractParseError(error: unknown): ParseError {\n\t\tif (error instanceof Error) {\n\t\t\t// @typescript-eslint/parser errors have line/column info\n\t\t\tconst match = error.message.match(/\\((\\d+):(\\d+)\\)/);\n\t\t\tif (match) {\n\t\t\t\treturn {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tline: Number.parseInt(match[1], 10),\n\t\t\t\t\tcolumn: Number.parseInt(match[2], 10),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmessage: error.message,\n\t\t\t\tline: 1,\n\t\t\t\tcolumn: 1,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tmessage: String(error),\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Count AST nodes for coverage metrics\n\t */\n\tprivate countNodes(node: unknown): number {\n\t\tif (!node || typeof node !== \"object\") {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet count = 1;\n\t\tfor (const key of Object.keys(node)) {\n\t\t\tconst value = (node as Record<string, unknown>)[key];\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tfor (const item of value) {\n\t\t\t\t\tcount += this.countNodes(item);\n\t\t\t\t}\n\t\t\t} else if (value && typeof value === \"object\" && \"type\" in value) {\n\t\t\t\tcount += this.countNodes(value);\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\n\t/**\n\t * Check for additional syntax patterns that may indicate issues\n\t */\n\tprivate checkSyntaxPatterns(content: string, file: string, issues: AnalysisIssue[]): void {\n\t\tconst lines = content.split(\"\\n\");\n\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tconst lineNum = i + 1;\n\n\t\t\t// Check for double semicolons\n\t\t\tif (line.includes(\";;\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `syntax/double-semicolon/${file}/${lineNum}`,\n\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\ttype: \"SYNTAX_WARNING\",\n\t\t\t\t\tmessage: \"Double semicolon detected\",\n\t\t\t\t\tfile,\n\t\t\t\t\tline: lineNum,\n\t\t\t\t\tcolumn: line.indexOf(\";;\") + 1,\n\t\t\t\t\tfix: \"Remove extra semicolon\",\n\t\t\t\t\tsnippet: line.trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Check for console.assert with empty second argument\n\t\t\tif (/console\\.assert\\([^,]+,\\s*\\)/.test(line)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `syntax/empty-assert/${file}/${lineNum}`,\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\ttype: \"SYNTAX_WARNING\",\n\t\t\t\t\tmessage: \"console.assert with empty message\",\n\t\t\t\t\tfile,\n\t\t\t\t\tline: lineNum,\n\t\t\t\t\tfix: \"Add assertion message for debugging\",\n\t\t\t\t\tsnippet: line.trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Check for likely typos: = instead of === in conditions\n\t\t\tif (/if\\s*\\([^=]*=\\s*[^=]/.test(line) && !/if\\s*\\([^=]*[=!]==/.test(line)) {\n\t\t\t\t// Only warn if it looks like an assignment in a condition\n\t\t\t\tconst assignMatch = line.match(/if\\s*\\(\\s*(\\w+)\\s*=\\s*[^=]/);\n\t\t\t\tif (assignMatch) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `syntax/assignment-in-condition/${file}/${lineNum}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"SYNTAX_WARNING\",\n\t\t\t\t\t\tmessage: \"Possible assignment in condition (did you mean ===?)\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: lineNum,\n\t\t\t\t\t\tfix: \"Use === for comparison, or wrap in extra parentheses if intentional\",\n\t\t\t\t\t\tsnippet: line.trim(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Completeness Analyzer\n *\n * Detects incomplete implementations: TODO comments, empty catch blocks, // Issue: LIN-0000\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 */\n\nimport { type ParserOptions, parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult } from \"../types.js\";\n\n/**\n * AST-based completeness analyzer\n */\nexport class CompletenessAnalyzer implements Analyzer {\n\treadonly id = \"completeness\";\n\treadonly name = \"Completeness Detection\";\n\treadonly filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n\n\tprivate readonly todoPatterns = [\n\t\t/\\/\\/\\s*TODO\\b/gi, // Issue: LIN-1013\n\t\t/\\/\\/\\s*FIXME\\b/gi, // Issue: LIN-1014\n\t\t/\\/\\/\\s*XXX\\b/gi,\n\t\t/\\/\\/\\s*HACK\\b/gi,\n\t\t/\\/\\*\\s*TODO\\b/gi, // Issue: LIN-1015\n\t\t/\\/\\*\\s*FIXME\\b/gi, // Issue: LIN-1016\n\t];\n\n\tprivate readonly placeholderPatterns = [\n\t\t/throw\\s+new\\s+Error\\s*\\(\\s*['\"`].*not\\s*implemented.*['\"`]\\s*\\)/gi,\n\t\t/throw\\s+new\\s+Error\\s*\\(\\s*['\"`]TODO.*['\"`]\\s*\\)/gi, // Issue: LIN-1017\n\t\t/NotImplementedError/gi,\n\t\t/throw\\s+new\\s+Error\\s*\\(\\s*['\"`]STUB['\"`]\\s*\\)/gi,\n\t];\n\n\tprivate readonly parserOptions: ParserOptions = {\n\t\tsourceType: \"module\",\n\t\tplugins: [\"typescript\", \"jsx\"],\n\t\terrorRecovery: true,\n\t};\n\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst startTime = performance.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet filesAnalyzed = 0;\n\t\tlet nodesVisited = 0;\n\t\tconst parseErrors: string[] = [];\n\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (!this.shouldAnalyzeFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesAnalyzed++;\n\n\t\t\t// Line-based detection for comments\n\t\t\tthis.checkTodoComments(content, file, issues);\n\t\t\tthis.checkPlaceholderPatterns(content, file, issues);\n\n\t\t\t// AST-based detection for structural issues\n\t\t\ttry {\n\t\t\t\tconst ast = parse(content, {\n\t\t\t\t\t...this.parserOptions,\n\t\t\t\t\tplugins: this.getPluginsForFile(file),\n\t\t\t\t});\n\n\t\t\t\tconst result = this.analyzeAST(ast, content, file);\n\t\t\t\tissues.push(...result.issues);\n\t\t\t\tnodesVisited += result.nodesVisited;\n\t\t\t} catch (error) {\n\t\t\t\tparseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\t// Parsing errors are handled by SyntaxAnalyzer, don't duplicate\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tanalyzer: this.id,\n\t\t\tsuccess: true,\n\t\t\tissues,\n\t\t\tcoverage: filesAnalyzed / Math.max(context.files.length, 1),\n\t\t\tduration: performance.now() - startTime,\n\t\t\tmetadata: {\n\t\t\t\tfilesAnalyzed,\n\t\t\t\tnodesVisited,\n\t\t\t\tpatternsChecked: [\"TODO\", \"FIXME\", \"EMPTY_CATCH\", \"EMPTY_FUNCTION\", \"NOT_IMPLEMENTED\", \"PLACEHOLDER\"], // Issue: LIN-0000\n\t\t\t\tparseErrors,\n\t\t\t},\n\t\t};\n\t}\n\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.shouldAnalyzeFile(f));\n\t}\n\n\tprivate shouldAnalyzeFile(file: string): boolean {\n\t\tconst ext = file.split(\".\").pop()?.toLowerCase();\n\t\treturn [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n\t}\n\n\tprivate getPluginsForFile(file: string): ParserOptions[\"plugins\"] {\n\t\tconst plugins: ParserOptions[\"plugins\"] = [\"typescript\"];\n\t\tif (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n\t\t\tplugins.push(\"jsx\");\n\t\t}\n\t\treturn plugins;\n\t}\n\n\t/**\n\t * Check for TODO/FIXME comments // Issue: LIN-0000\n\t */\n\tprivate checkTodoComments(content: string, file: string, issues: AnalysisIssue[]): void {\n\t\tconst lines = content.split(\"\\n\");\n\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tconst lineNum = i + 1;\n\n\t\t\tfor (const pattern of this.todoPatterns) {\n\t\t\t\t// Reset lastIndex for global patterns\n\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\tif (pattern.test(line)) {\n\t\t\t\t\t// Extract the TODO content // Issue: LIN-1018\n\t\t\t\t\tconst todoContent = line.trim().slice(0, 100);\n\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `completeness/todo/${file}/${lineNum}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\tmessage: `TODO/FIXME: ${todoContent}`, // Issue: LIN-0000\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: lineNum,\n\t\t\t\t\t\tsnippet: todoContent,\n\t\t\t\t\t});\n\t\t\t\t\tbreak; // Only report once per line\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for placeholder/stub patterns\n\t */\n\tprivate checkPlaceholderPatterns(content: string, file: string, issues: AnalysisIssue[]): void {\n\t\tconst lines = content.split(\"\\n\");\n\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i];\n\t\t\tconst lineNum = i + 1;\n\n\t\t\tfor (const pattern of this.placeholderPatterns) {\n\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\tif (pattern.test(line)) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `completeness/placeholder/${file}/${lineNum}`,\n\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\tmessage: 'Placeholder implementation: \"not implemented\" or similar',\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: lineNum,\n\t\t\t\t\t\tfix: \"Implement the functionality or remove the placeholder\",\n\t\t\t\t\t\tsnippet: line.trim().slice(0, 100),\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * AST-based detection of empty/incomplete code\n\t */\n\tprivate analyzeAST(\n\t\tast: ReturnType<typeof parse>,\n\t\t_content: string,\n\t\tfile: string,\n\t): { issues: AnalysisIssue[]; nodesVisited: number } {\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet nodesVisited = 0;\n\n\t\ttraverse(ast, {\n\t\t\tenter() {\n\t\t\t\tnodesVisited++;\n\t\t\t},\n\n\t\t\t// Empty catch blocks\n\t\t\tCatchClause: (path) => {\n\t\t\t\tconst body = path.node.body;\n\t\t\t\tif (body.body.length === 0) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\tmessage: \"Empty catch block - errors silently swallowed\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\tfix: \"Add error handling, rethrow, or log the error\",\n\t\t\t\t\t});\n\t\t\t\t} else if (body.body.length === 1) {\n\t\t\t\t\t// Check for comment-only catch blocks\n\t\t\t\t\tconst stmt = body.body[0];\n\t\t\t\t\tif (stmt.type === \"EmptyStatement\") {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `completeness/empty-catch/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\t\tmessage: \"Catch block contains only empty statement\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Add proper error handling\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Empty function bodies (excluding type declarations and interface methods)\n\t\t\tFunctionDeclaration: (path) => {\n\t\t\t\tif (path.node.body.body.length === 0) {\n\t\t\t\t\tconst funcName = path.node.id?.name || \"anonymous\";\n\t\t\t\t\t// Skip if it's likely a stub for interface implementation\n\t\t\t\t\tconst hasOverrideDecorator = false; // Would need to check decorators\n\n\t\t\t\t\tif (!hasOverrideDecorator) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `completeness/empty-fn/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\t\tmessage: `Empty function body: ${funcName}()`,\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Implement the function or mark as abstract/stub if intentional\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Empty method bodies\n\t\t\tClassMethod: (path) => {\n\t\t\t\t// Skip abstract methods, getters with explicit return, etc.\n\t\t\t\tif (path.node.abstract) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (path.node.kind === \"get\" || path.node.kind === \"set\") {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst body = path.node.body;\n\t\t\t\tif (body && body.body.length === 0) {\n\t\t\t\t\tconst methodName = path.node.key.type === \"Identifier\" ? path.node.key.name : \"anonymous\";\n\n\t\t\t\t\t// Skip constructor with only super() call\n\t\t\t\t\tif (methodName === \"constructor\") {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `completeness/empty-method/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\tmessage: `Empty method body: ${methodName}()`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\tfix: \"Implement the method or mark as abstract if intentional\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Arrow functions that just throw or are empty (might be intentional)\n\t\t\tArrowFunctionExpression: (path) => {\n\t\t\t\tconst body = path.node.body;\n\n\t\t\t\t// Check if it's a block body that's empty\n\t\t\t\tif (body.type === \"BlockStatement\" && body.body.length === 0) {\n\t\t\t\t\t// Only warn if it's assigned to a variable (likely meant to be implemented)\n\t\t\t\t\tconst parent = path.parent;\n\t\t\t\t\tif (parent.type === \"VariableDeclarator\") {\n\t\t\t\t\t\tconst varName = parent.id.type === \"Identifier\" ? parent.id.name : \"anonymous\";\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `completeness/empty-arrow/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\t\t\ttype: \"INCOMPLETE_IMPLEMENTATION\",\n\t\t\t\t\t\t\tmessage: `Empty arrow function: ${varName}`,\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Implement the function or use () => { /* intentionally empty */ } if intentionally empty\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Check for structured-log that might be debug code\n\t\t\tCallExpression: (path) => {\n\t\t\t\tconst callee = path.node.callee;\n\t\t\t\tif (\n\t\t\t\t\tcallee.type === \"MemberExpression\" &&\n\t\t\t\t\tcallee.object.type === \"Identifier\" &&\n\t\t\t\t\tcallee.object.name === \"console\" &&\n\t\t\t\t\tcallee.property.type === \"Identifier\" &&\n\t\t\t\t\tcallee.property.name === \"log\"\n\t\t\t\t) {\n\t\t\t\t\t// Check if it looks like debug code\n\t\t\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\t\t\tif (firstArg && firstArg.type === \"StringLiteral\") {\n\t\t\t\t\t\tconst msg = firstArg.value.toLowerCase();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmsg.includes(\"debug\") ||\n\t\t\t\t\t\t\tmsg.includes(\"test\") ||\n\t\t\t\t\t\t\tmsg.includes(\"todo\") ||\n\t\t\t\t\t\t\tmsg.includes(\"remove\")\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\tid: `completeness/debug-log/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\t\tseverity: \"low\",\n\t\t\t\t\t\t\t\ttype: \"DEBUG_CODE\",\n\t\t\t\t\t\t\t\tmessage: `Debug process.stdout.write left in code: \"${firstArg.value.slice(0, 50)}\"`,\n\t\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\t\tfix: \"Remove debug logging before commit\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\treturn { issues, nodesVisited };\n\t}\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 */\n\nimport { basename, dirname, relative } from \"node:path\";\nimport { extractImportSources } from \"../ast/import-extractor.js\";\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult, Severity } from \"../types.js\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Change type classification\n */\nexport type ChangeType =\n\t| \"addition\" // New code/file added\n\t| \"modification\" // Existing code changed\n\t| \"deletion\" // Code/file removed\n\t| \"rename\"; // File/symbol renamed\n\n/**\n * Impact severity levels\n */\nexport type ImpactLevel = \"critical\" | \"high\" | \"medium\" | \"low\" | \"none\";\n\n/**\n * Single impacted item\n */\nexport interface ImpactedItem {\n\t/** File path or test name */\n\tpath: string;\n\t/** Why this is impacted */\n\treason: string;\n\t/** How severe the impact is */\n\tlevel: ImpactLevel;\n\t/** Specific lines affected (if known) */\n\tlines?: number[];\n}\n\n/**\n * Breaking change detection result\n */\nexport interface BreakingChange {\n\t/** Type of breaking change */\n\ttype: \"signature\" | \"export\" | \"type\" | \"behavior\" | \"deprecation\";\n\t/** What was changed */\n\tsymbol: string;\n\t/** File containing the change */\n\tfile: string;\n\t/** Human-readable description */\n\tdescription: string;\n\t/** Severity of the break */\n\tseverity: Severity;\n\t/** Suggested migration */\n\tmigration?: string;\n}\n\n/**\n * Performance impact prediction\n */\nexport interface PerformanceImpact {\n\t/** Type of performance concern */\n\ttype: \"hotpath\" | \"memory\" | \"io\" | \"computation\" | \"bundle\";\n\t/** Description of the concern */\n\tdescription: string;\n\t/** Risk level */\n\trisk: ImpactLevel;\n\t/** Affected component/function */\n\tcomponent: string;\n\t/** Recommendation */\n\trecommendation?: string;\n}\n\n/**\n * Complete impact analysis result\n */\nexport interface ChangeImpactResult {\n\t/** Files analyzed */\n\tfilesAnalyzed: number;\n\t/** Affected tests that should be run */\n\taffectedTests: ImpactedItem[];\n\t/** Detected breaking changes */\n\tbreakingChanges: BreakingChange[];\n\t/** Performance implications */\n\tperformanceImpacts: PerformanceImpact[];\n\t/** Files that import changed files (ripple effect) */\n\tdependentFiles: ImpactedItem[];\n\t/** Overall impact score (0-1) */\n\timpactScore: number;\n\t/** Recommended actions */\n\trecommendations: string[];\n\t/** Duration of analysis */\n\tduration: number;\n}\n\n// =============================================================================\n// Pattern Matchers\n// =============================================================================\n\n/**\n * Patterns that indicate exported API\n */\nconst EXPORT_PATTERNS = [\n\t/export\\s+(const|function|class|interface|type|enum)\\s+(\\w+)/g,\n\t/export\\s+default\\s+(function|class)?\\s*(\\w+)?/g,\n\t/export\\s+\\{([^}]+)\\}/g,\n];\n\n/**\n * Patterns that indicate function signatures (reserved for future use)\n */\n// const _SIGNATURE_PATTERNS = [\n// \t// Function with parameters\n// \t/(?:async\\s+)?function\\s+(\\w+)\\s*\\(([^)]*)\\)/g,\n// \t// Arrow function\n// \t/(?:const|let)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\(([^)]*)\\)\\s*(?::\\s*\\w+)?\\s*=>/g,\n// \t// Method in class\n// \t/(?:public|private|protected)?\\s*(?:async\\s+)?(\\w+)\\s*\\(([^)]*)\\)/g,\n// ];\n\n/**\n * Patterns indicating performance-sensitive code\n */\nconst PERFORMANCE_PATTERNS = [\n\t{ pattern: /\\.forEach\\s*\\(/g, type: \"computation\" as const, risk: \"low\" as ImpactLevel },\n\t{ pattern: /for\\s*\\(\\s*let\\s+\\w+\\s*=\\s*0/g, type: \"computation\" as const, risk: \"low\" as ImpactLevel },\n\t{ pattern: /while\\s*\\(/g, type: \"computation\" as const, risk: \"medium\" as ImpactLevel },\n\t{ pattern: /async\\s+function|await\\s+/g, type: \"io\" as const, risk: \"medium\" as ImpactLevel },\n\t{ pattern: /new\\s+(Map|Set|Array)\\s*\\(/g, type: \"memory\" as const, risk: \"low\" as ImpactLevel },\n\t{ pattern: /JSON\\.(parse|stringify)/g, type: \"computation\" as const, risk: \"medium\" as ImpactLevel },\n\t{ pattern: /readFileSync|writeFileSync/g, type: \"io\" as const, risk: \"high\" as ImpactLevel },\n\t{ pattern: /spawn|exec\\s*\\(/g, type: \"io\" as const, risk: \"high\" as ImpactLevel },\n\t{ pattern: /import\\s*\\(/g, type: \"bundle\" as const, risk: \"low\" as ImpactLevel },\n\t{ pattern: /require\\s*\\(/g, type: \"bundle\" as const, risk: \"medium\" as ImpactLevel },\n];\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// =============================================================================\n// ChangeImpactAnalyzer\n// =============================================================================\n\nexport class ChangeImpactAnalyzer implements Analyzer {\n\treadonly id = \"change-impact\";\n\treadonly name = \"Change Impact Analyzer\";\n\treadonly filePatterns = [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"];\n\n\tprivate workspaceRoot: string;\n\tprivate dependencyGraph: Map<string, string[]> = new Map();\n\tprivate reverseDependencyGraph: Map<string, string[]> = new Map();\n\n\tconstructor(workspaceRoot: string) {\n\t\tthis.workspaceRoot = workspaceRoot;\n\t}\n\n\t/**\n\t * Check if this analyzer should run\n\t */\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.filePatterns.some((p) => new RegExp(p.replace(/\\*/g, \".*\")).test(f)));\n\t}\n\n\t/**\n\t * Run impact analysis\n\t */\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst start = Date.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\n\t\ttry {\n\t\t\t// Build dependency graph from context\n\t\t\tawait this.buildDependencyGraph(context);\n\n\t\t\t// Analyze each file\n\t\t\tfor (const file of context.files) {\n\t\t\t\tconst content = context.contents.get(file);\n\t\t\t\tif (!content) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Detect breaking changes\n\t\t\t\tconst breakingChanges = this.detectBreakingChanges(content, file);\n\t\t\t\tfor (const bc of breakingChanges) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `impact/breaking/${bc.type}/${file}/${bc.symbol}`,\n\t\t\t\t\t\tseverity: bc.severity,\n\t\t\t\t\t\ttype: `BREAKING_${bc.type.toUpperCase()}`,\n\t\t\t\t\t\tmessage: bc.description,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: bc.migration,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Detect performance impacts\n\t\t\t\tconst perfImpacts = this.detectPerformanceImpacts(content, file);\n\t\t\t\tfor (const pi of perfImpacts) {\n\t\t\t\t\tif (pi.risk === \"high\" || pi.risk === \"critical\") {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `impact/perf/${pi.type}/${file}/${pi.component}`,\n\t\t\t\t\t\t\tseverity: pi.risk === \"critical\" ? \"critical\" : \"high\",\n\t\t\t\t\t\t\ttype: `PERF_${pi.type.toUpperCase()}`,\n\t\t\t\t\t\t\tmessage: pi.description,\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tfix: pi.recommendation,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check for affected tests\n\t\t\t\tconst affectedTests = this.findAffectedTests(file);\n\t\t\t\tif (affectedTests.length > 5) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `impact/tests/${file}`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\ttype: \"HIGH_TEST_IMPACT\",\n\t\t\t\t\t\tmessage: `Change affects ${affectedTests.length} test files - consider running full test suite`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tanalyzer: this.id,\n\t\t\t\tsuccess: true,\n\t\t\t\tissues,\n\t\t\t\tcoverage: 1,\n\t\t\t\tduration: Date.now() - start,\n\t\t\t\tmetadata: {\n\t\t\t\t\tfilesAnalyzed: context.files.length,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tanalyzer: this.id,\n\t\t\t\tsuccess: false,\n\t\t\t\tissues: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"impact/error\",\n\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\ttype: \"ANALYSIS_ERROR\",\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcoverage: 0,\n\t\t\t\tduration: Date.now() - start,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get full impact analysis (more detailed than standard analyze)\n\t */\n\tasync getFullImpact(files: string[], contents: Map<string, string>): Promise<ChangeImpactResult> {\n\t\tconst start = Date.now();\n\n\t\t// Build context\n\t\tconst context: AnalysisContext = {\n\t\t\tworkspaceRoot: this.workspaceRoot,\n\t\t\tfiles,\n\t\t\tcontents,\n\t\t};\n\n\t\tawait this.buildDependencyGraph(context);\n\n\t\tconst affectedTests: ImpactedItem[] = [];\n\t\tconst breakingChanges: BreakingChange[] = [];\n\t\tconst performanceImpacts: PerformanceImpact[] = [];\n\t\tconst dependentFiles: ImpactedItem[] = [];\n\t\tconst recommendations: string[] = [];\n\n\t\tfor (const file of files) {\n\t\t\tconst content = contents.get(file) || \"\";\n\n\t\t\t// Find affected tests\n\t\t\tconst tests = this.findAffectedTests(file);\n\t\t\taffectedTests.push(...tests);\n\n\t\t\t// Detect breaking changes\n\t\t\tconst breaks = this.detectBreakingChanges(content, file);\n\t\t\tbreakingChanges.push(...breaks);\n\n\t\t\t// Detect performance impacts\n\t\t\tconst perfs = this.detectPerformanceImpacts(content, file);\n\t\t\tperformanceImpacts.push(...perfs);\n\n\t\t\t// Find dependent files\n\t\t\tconst deps = this.findDependentFiles(file);\n\t\t\tdependentFiles.push(...deps);\n\t\t}\n\n\t\t// Calculate impact score\n\t\tconst impactScore = this.calculateImpactScore(\n\t\t\taffectedTests,\n\t\t\tbreakingChanges,\n\t\t\tperformanceImpacts,\n\t\t\tdependentFiles,\n\t\t);\n\n\t\t// Generate recommendations\n\t\tif (breakingChanges.length > 0) {\n\t\t\trecommendations.push(`⚠️ ${breakingChanges.length} breaking change(s) detected - update dependent code`);\n\t\t}\n\t\tif (affectedTests.length > 10) {\n\t\t\trecommendations.push(`🧪 Run full test suite - ${affectedTests.length} tests potentially affected`);\n\t\t}\n\t\tif (performanceImpacts.some((p) => p.risk === \"high\" || p.risk === \"critical\")) {\n\t\t\trecommendations.push(\"⚡ Performance-sensitive code modified - run benchmarks\");\n\t\t}\n\t\tif (dependentFiles.length > 20) {\n\t\t\trecommendations.push(\"🔗 High ripple effect - consider incremental rollout\");\n\t\t}\n\n\t\treturn {\n\t\t\tfilesAnalyzed: files.length,\n\t\t\taffectedTests: this.dedupeItems(affectedTests),\n\t\t\tbreakingChanges,\n\t\t\tperformanceImpacts,\n\t\t\tdependentFiles: this.dedupeItems(dependentFiles),\n\t\t\timpactScore,\n\t\t\trecommendations,\n\t\t\tduration: Date.now() - start,\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Private Methods\n\t// =========================================================================\n\n\t/**\n\t * Build dependency graph from file contents\n\t */\n\tprivate async buildDependencyGraph(context: AnalysisContext): Promise<void> {\n\t\tthis.dependencyGraph.clear();\n\t\tthis.reverseDependencyGraph.clear();\n\n\t\tfor (const file of context.files) {\n\t\t\tconst content = context.contents.get(file);\n\t\t\tif (!content) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst imports = this.extractImports(content, file);\n\t\t\tthis.dependencyGraph.set(file, imports);\n\n\t\t\t// Build reverse graph\n\t\t\tfor (const imp of imports) {\n\t\t\t\tconst existing = this.reverseDependencyGraph.get(imp) || [];\n\t\t\t\texisting.push(file);\n\t\t\t\tthis.reverseDependencyGraph.set(imp, existing);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract import statements from file content using AST analysis.\n\t *\n\t * UPGRADED (11b): Replaces regex-based import extraction with proper AST walking\n\t * via packages/core/src/analysis/ast/import-extractor.ts (oxc-parser based).\n\t * This eliminates false positives from imports in strings/comments and correctly\n\t * handles dynamic imports, re-exports, and type-only imports.\n\t */\n\tprivate extractImports(content: string, fromFile: string): string[] {\n\t\t// AST-first: Use oxc-parser AST walking for accurate import extraction\n\t\tconst rawSources = extractImportSources(content, fromFile);\n\n\t\tconst imports: string[] = [];\n\t\tfor (const source of rawSources) {\n\t\t\tconst importPath = this.resolveImportPath(source, fromFile);\n\t\t\tif (importPath) {\n\t\t\t\timports.push(importPath);\n\t\t\t}\n\t\t}\n\t\treturn imports;\n\t}\n\n\t/**\n\t * Resolve import path to absolute file path\n\t */\n\tprivate resolveImportPath(importPath: string, fromFile: string): string | null {\n\t\t// Skip external packages\n\t\tif (!importPath.startsWith(\".\") && !importPath.startsWith(\"/\")) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst dir = dirname(fromFile);\n\t\tconst normalized = `${dir}/${importPath}`.replace(/\\/\\.\\//g, \"/\");\n\n\t\tif (/\\.[cm]?[jt]sx?$/.test(importPath)) {\n\t\t\treturn normalized;\n\t\t}\n\n\t\treturn `${normalized}.ts`;\n\t}\n\n\t/**\n\t * Find test files that might be affected by a change\n\t */\n\tprivate findAffectedTests(file: string): ImpactedItem[] {\n\t\tconst tests: ImpactedItem[] = [];\n\t\tconst relPath = relative(this.workspaceRoot, file);\n\t\tconst fileName = basename(file).replace(/\\.[tj]sx?$/, \"\");\n\n\t\t// Direct test files for this source\n\t\tconst directTestPatterns = [\n\t\t\t`${fileName}.test.ts`,\n\t\t\t`${fileName}.test.tsx`,\n\t\t\t`${fileName}.spec.ts`,\n\t\t\t`${fileName}.spec.tsx`,\n\t\t\t`__tests__/${fileName}.test.ts`,\n\t\t\t`__tests__/${fileName}.test.tsx`,\n\t\t];\n\n\t\tfor (const pattern of directTestPatterns) {\n\t\t\ttests.push({\n\t\t\t\tpath: pattern,\n\t\t\t\treason: \"Direct test file for changed source\",\n\t\t\t\tlevel: \"high\",\n\t\t\t});\n\t\t}\n\n\t\t// Files that import this file might have tests\n\t\tconst importers = this.reverseDependencyGraph.get(file) || [];\n\t\tfor (const importer of importers) {\n\t\t\tif (this.isTestFile(importer)) {\n\t\t\t\ttests.push({\n\t\t\t\t\tpath: relative(this.workspaceRoot, importer),\n\t\t\t\t\treason: \"Test file imports changed module\",\n\t\t\t\t\tlevel: \"medium\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Integration tests if this is a core module\n\t\tif (relPath.includes(\"/core/\") || relPath.includes(\"/services/\")) {\n\t\t\ttests.push({\n\t\t\t\tpath: \"**/*.integration.test.ts\",\n\t\t\t\treason: \"Core module change may affect integration tests\",\n\t\t\t\tlevel: \"low\",\n\t\t\t});\n\t\t}\n\n\t\treturn tests;\n\t}\n\n\t/**\n\t * Check if a file is a test file\n\t */\n\tprivate isTestFile(file: string): boolean {\n\t\treturn TEST_FILE_PATTERNS.some((p) => p.test(file));\n\t}\n\n\t/**\n\t * Detect breaking changes in content\n\t */\n\tprivate detectBreakingChanges(content: string, file: string): BreakingChange[] {\n\t\tconst breaks: BreakingChange[] = [];\n\n\t\t// Check for exported symbols\n\t\tfor (const pattern of EXPORT_PATTERNS) {\n\t\t\tconst regex = new RegExp(pattern.source, pattern.flags);\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = regex.exec(content)) !== null) {\n\t\t\t\tconst symbolName = match[2] || match[1];\n\t\t\t\tif (symbolName) {\n\t\t\t\t\t// Check if this is a potential breaking change\n\t\t\t\t\t// (In a real implementation, we'd compare with previous version)\n\t\t\t\t\tbreaks.push({\n\t\t\t\t\t\ttype: \"export\",\n\t\t\t\t\t\tsymbol: symbolName,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tdescription: `Exported symbol '${symbolName}' may have changed`,\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\tmigration: `Verify consumers of '${symbolName}' are updated`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check for interface/type changes\n\t\tconst interfaceRegex = /(?:export\\s+)?interface\\s+(\\w+)\\s*\\{([^}]+)\\}/g;\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = interfaceRegex.exec(content)) !== null) {\n\t\t\tconst interfaceName = match[1];\n\t\t\tconst body = match[2];\n\n\t\t\t// Check for optional vs required changes (simplified)\n\t\t\tif (body.includes(\"?:\") || body.includes(\": \")) {\n\t\t\t\tbreaks.push({\n\t\t\t\t\ttype: \"type\",\n\t\t\t\t\tsymbol: interfaceName,\n\t\t\t\t\tfile,\n\t\t\t\t\tdescription: `Interface '${interfaceName}' definition changed`,\n\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn breaks;\n\t}\n\n\t/**\n\t * Detect performance-sensitive code changes\n\t */\n\tprivate detectPerformanceImpacts(content: string, file: string): PerformanceImpact[] {\n\t\tconst impacts: PerformanceImpact[] = [];\n\n\t\tfor (const { pattern, type, risk } of PERFORMANCE_PATTERNS) {\n\t\t\tconst regex = new RegExp(pattern.source, pattern.flags);\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = regex.exec(content)) !== null) {\n\t\t\t\timpacts.push({\n\t\t\t\t\ttype,\n\t\t\t\t\tdescription: `${type} operation detected: ${match[0]}`,\n\t\t\t\t\trisk,\n\t\t\t\t\tcomponent: basename(file),\n\t\t\t\t\trecommendation: this.getPerformanceRecommendation(type),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn impacts;\n\t}\n\n\t/**\n\t * Get recommendation for performance issue type\n\t */\n\tprivate getPerformanceRecommendation(type: PerformanceImpact[\"type\"]): string {\n\t\tswitch (type) {\n\t\t\tcase \"hotpath\":\n\t\t\t\treturn \"Consider memoization or caching for hot paths\";\n\t\t\tcase \"memory\":\n\t\t\t\treturn \"Monitor memory usage, consider object pooling\";\n\t\t\tcase \"io\":\n\t\t\t\treturn \"Use async operations, consider batching\";\n\t\t\tcase \"computation\":\n\t\t\t\treturn \"Profile for bottlenecks, consider Web Workers\";\n\t\t\tcase \"bundle\":\n\t\t\t\treturn \"Use dynamic imports for code splitting\";\n\t\t\tdefault:\n\t\t\t\treturn \"Profile before optimizing\";\n\t\t}\n\t}\n\n\t/**\n\t * Find files that depend on changed file\n\t */\n\tprivate findDependentFiles(file: string): ImpactedItem[] {\n\t\tconst dependents: ImpactedItem[] = [];\n\t\tconst visited = new Set<string>();\n\n\t\tconst traverse = (current: string, depth: number) => {\n\t\t\tif (visited.has(current) || depth > 3) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvisited.add(current);\n\n\t\t\tconst importers = this.reverseDependencyGraph.get(current) || [];\n\t\t\tfor (const importer of importers) {\n\t\t\t\tdependents.push({\n\t\t\t\t\tpath: relative(this.workspaceRoot, importer),\n\t\t\t\t\treason: depth === 0 ? \"Directly imports changed file\" : `Transitive dependency (depth ${depth})`,\n\t\t\t\t\tlevel: depth === 0 ? \"high\" : depth === 1 ? \"medium\" : \"low\",\n\t\t\t\t});\n\t\t\t\ttraverse(importer, depth + 1);\n\t\t\t}\n\t\t};\n\n\t\ttraverse(file, 0);\n\t\treturn dependents;\n\t}\n\n\t/**\n\t * Calculate overall impact score\n\t */\n\tprivate calculateImpactScore(\n\t\ttests: ImpactedItem[],\n\t\tbreaks: BreakingChange[],\n\t\tperfs: PerformanceImpact[],\n\t\tdeps: ImpactedItem[],\n\t): number {\n\t\tlet score = 0;\n\n\t\t// Weight by category\n\t\tscore += Math.min(tests.length * 0.05, 0.25);\n\t\tscore += Math.min(breaks.length * 0.15, 0.35);\n\t\tscore += Math.min(perfs.filter((p) => p.risk === \"high\").length * 0.1, 0.2);\n\t\tscore += Math.min(deps.length * 0.02, 0.2);\n\n\t\treturn Math.min(score, 1);\n\t}\n\n\t/**\n\t * Deduplicate impact items\n\t */\n\tprivate dedupeItems(items: ImpactedItem[]): ImpactedItem[] {\n\t\tconst seen = new Set<string>();\n\t\treturn items.filter((item) => {\n\t\t\tif (seen.has(item.path)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tseen.add(item.path);\n\t\t\treturn true;\n\t\t});\n\t}\n}\n\n// =============================================================================\n// Factory\n// =============================================================================\n\n/**\n * Create ChangeImpactAnalyzer instance\n */\nexport function createChangeImpactAnalyzer(workspaceRoot: string): ChangeImpactAnalyzer {\n\treturn 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 */\n\nimport { type ParserOptions, parse } from \"@babel/parser\";\nimport traverse from \"@babel/traverse\";\nimport type * as t from \"@babel/types\";\nimport type { AnalysisContext, AnalysisIssue, Analyzer, AnalyzerResult } from \"../types.js\";\n\n/**\n * AST-based security analyzer using Babel\n */\nexport class SecurityAnalyzer implements Analyzer {\n\treadonly id = \"security\";\n\treadonly name = \"Security Analysis\";\n\treadonly filePatterns = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\n\n\tprivate readonly parserOptions: ParserOptions = {\n\t\tsourceType: \"module\",\n\t\tplugins: [\"typescript\", \"jsx\"],\n\t\terrorRecovery: true,\n\t};\n\n\tasync analyze(context: AnalysisContext): Promise<AnalyzerResult> {\n\t\tconst startTime = performance.now();\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet filesAnalyzed = 0;\n\t\tlet nodesVisited = 0;\n\t\tconst parseErrors: string[] = [];\n\n\t\tfor (const [file, content] of context.contents) {\n\t\t\tif (!this.shouldAnalyzeFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfilesAnalyzed++;\n\n\t\t\ttry {\n\t\t\t\tconst ast = parse(content, {\n\t\t\t\t\t...this.parserOptions,\n\t\t\t\t\tplugins: this.getPluginsForFile(file),\n\t\t\t\t});\n\n\t\t\t\tconst fileIssues = this.analyzeAST(ast, content, file);\n\t\t\t\tissues.push(...fileIssues.issues);\n\t\t\t\tnodesVisited += fileIssues.nodesVisited;\n\t\t\t} catch (error) {\n\t\t\t\tparseErrors.push(`${file}: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\tissues.push({\n\t\t\t\t\tid: `security/parse-error/${file}`,\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\ttype: \"PARSE_ERROR\",\n\t\t\t\t\tmessage: `Could not parse for security analysis: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\tfile,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tanalyzer: this.id,\n\t\t\tsuccess: true,\n\t\t\tissues,\n\t\t\tcoverage: filesAnalyzed / Math.max(context.files.length, 1),\n\t\t\tduration: performance.now() - startTime,\n\t\t\tmetadata: {\n\t\t\t\tfilesAnalyzed,\n\t\t\t\tnodesVisited,\n\t\t\t\tpatternsChecked: [\n\t\t\t\t\t\"UNSAFE_EVAL\",\n\t\t\t\t\t\"PATH_TRAVERSAL\",\n\t\t\t\t\t\"MISSING_SIGNAL_HANDLER\",\n\t\t\t\t\t\"COMMAND_INJECTION\",\n\t\t\t\t\t\"SQL_INJECTION\",\n\t\t\t\t\t\"XSS_RISK\",\n\t\t\t\t\t\"HARDCODED_SECRET\",\n\t\t\t\t\t\"UNSAFE_REGEX\",\n\t\t\t\t],\n\t\t\t\tparseErrors,\n\t\t\t},\n\t\t};\n\t}\n\n\tshouldRun(context: AnalysisContext): boolean {\n\t\treturn context.files.some((f) => this.shouldAnalyzeFile(f));\n\t}\n\n\tprivate shouldAnalyzeFile(file: string): boolean {\n\t\tconst ext = file.split(\".\").pop()?.toLowerCase();\n\t\treturn [\"ts\", \"tsx\", \"js\", \"jsx\"].includes(ext || \"\");\n\t}\n\n\tprivate getPluginsForFile(file: string): ParserOptions[\"plugins\"] {\n\t\tconst plugins: ParserOptions[\"plugins\"] = [\"typescript\"];\n\t\tif (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) {\n\t\t\tplugins.push(\"jsx\");\n\t\t}\n\t\treturn plugins;\n\t}\n\n\t/**\n\t * Analyze AST for security issues\n\t */\n\tprivate analyzeAST(\n\t\tast: ReturnType<typeof parse>,\n\t\tcontent: string,\n\t\tfile: string,\n\t): { issues: AnalysisIssue[]; nodesVisited: number } {\n\t\tconst issues: AnalysisIssue[] = [];\n\t\tlet nodesVisited = 0;\n\n\t\t// Track context for daemon/server detection\n\t\tconst fileContext = {\n\t\t\tisDaemon: false,\n\t\t\thasSignalHandler: false,\n\t\t\thasSocketPermissions: false,\n\t\t\thasBufferLimits: false,\n\t\t};\n\n\t\t// Pre-scan content for daemon indicators\n\t\tfileContext.isDaemon =\n\t\t\tcontent.includes(\".listen(\") ||\n\t\t\tfile.includes(\"daemon\") ||\n\t\t\tfile.includes(\"server\") ||\n\t\t\tfile.includes(\"worker\");\n\n\t\ttraverse(ast, {\n\t\t\tenter() {\n\t\t\t\tnodesVisited++;\n\t\t\t},\n\n\t\t\t// Detect eval()\n\t\t\tCallExpression: (path) => {\n\t\t\t\tconst callee = path.node.callee;\n\n\t\t\t\t// eval() detection\n\t\t\t\tif (callee.type === \"Identifier\" && callee.name === \"eval\") {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `security/eval/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\t\ttype: \"UNSAFE_EVAL\",\n\t\t\t\t\t\tmessage: \"eval() allows arbitrary code execution\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\tcolumn: path.node.loc?.start.column,\n\t\t\t\t\t\tfix: \"Use JSON.parse() for data or refactor logic to avoid eval\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// new Function() detection\n\t\t\t\tif (callee.type === \"Identifier\" && callee.name === \"Function\") {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `security/function-constructor/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\t\ttype: \"UNSAFE_EVAL\",\n\t\t\t\t\t\tmessage: \"new Function() is equivalent to eval() and allows arbitrary code execution\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\tcolumn: path.node.loc?.start.column,\n\t\t\t\t\t\tfix: \"Refactor to avoid dynamic code generation\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// setTimeout/setInterval with string (like eval)\n\t\t\t\tif (callee.type === \"Identifier\" && (callee.name === \"setTimeout\" || callee.name === \"setInterval\")) {\n\t\t\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\t\t\tif (firstArg && firstArg.type === \"StringLiteral\") {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `security/string-timer/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\t\ttype: \"UNSAFE_EVAL\",\n\t\t\t\t\t\t\tmessage: `${callee.name} with string argument executes code like eval()`,\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Pass a function instead of a string\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// exec/execSync (command injection risk)\n\t\t\t\tif (callee.type === \"Identifier\" && (callee.name === \"exec\" || callee.name === \"execSync\")) {\n\t\t\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\t\t\tif (firstArg && !this.isStaticString(firstArg as t.Expression)) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `security/command-injection/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\t\ttype: \"COMMAND_INJECTION\",\n\t\t\t\t\t\t\tmessage: \"exec with dynamic command - potential command injection\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Validate/sanitize input or use execFile with explicit arguments\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Signal handler detection for daemons\n\t\t\t\tif (\n\t\t\t\t\tcallee.type === \"MemberExpression\" &&\n\t\t\t\t\tcallee.object.type === \"Identifier\" &&\n\t\t\t\t\tcallee.object.name === \"process\" &&\n\t\t\t\t\tcallee.property.type === \"Identifier\" &&\n\t\t\t\t\tcallee.property.name === \"on\"\n\t\t\t\t) {\n\t\t\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\t\t\tif (firstArg && firstArg.type === \"StringLiteral\") {\n\t\t\t\t\t\tif (firstArg.value === \"SIGTERM\" || firstArg.value === \"SIGINT\") {\n\t\t\t\t\t\t\tfileContext.hasSignalHandler = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Detect fs operations with dynamic paths\n\t\t\tMemberExpression: (path) => {\n\t\t\t\tconst node = path.node;\n\t\t\t\tif (node.object.type === \"Identifier\" && (node.object.name === \"fs\" || node.object.name === \"fsp\")) {\n\t\t\t\t\tconst parent = path.parentPath;\n\t\t\t\t\tif (parent.isCallExpression()) {\n\t\t\t\t\t\tconst methodName =\n\t\t\t\t\t\t\tnode.property.type === \"Identifier\"\n\t\t\t\t\t\t\t\t? node.property.name\n\t\t\t\t\t\t\t\t: (node.property as t.StringLiteral).value;\n\n\t\t\t\t\t\t// fs operations that take paths\n\t\t\t\t\t\tconst pathMethods = [\n\t\t\t\t\t\t\t\"readFile\",\n\t\t\t\t\t\t\t\"readFileSync\",\n\t\t\t\t\t\t\t\"writeFile\",\n\t\t\t\t\t\t\t\"writeFileSync\",\n\t\t\t\t\t\t\t\"readdir\",\n\t\t\t\t\t\t\t\"readdirSync\",\n\t\t\t\t\t\t\t\"stat\",\n\t\t\t\t\t\t\t\"statSync\",\n\t\t\t\t\t\t\t\"unlink\",\n\t\t\t\t\t\t\t\"unlinkSync\",\n\t\t\t\t\t\t\t\"mkdir\",\n\t\t\t\t\t\t\t\"mkdirSync\",\n\t\t\t\t\t\t\t\"rmdir\",\n\t\t\t\t\t\t\t\"rmdirSync\",\n\t\t\t\t\t\t\t\"access\",\n\t\t\t\t\t\t\t\"accessSync\",\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tif (pathMethods.includes(methodName)) {\n\t\t\t\t\t\t\tconst firstArg = parent.node.arguments[0];\n\t\t\t\t\t\t\tif (firstArg && !this.isStaticPath(firstArg as t.Expression)) {\n\t\t\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\t\t\tid: `security/path-traversal/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\t\t\t\ttype: \"PATH_TRAVERSAL\",\n\t\t\t\t\t\t\t\t\tmessage: `fs.${methodName} with dynamic path - potential path traversal`,\n\t\t\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\t\t\tfix: \"Validate paths against workspace root before use\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Check for dangerous regex patterns\n\t\t\tNewExpression: (path) => {\n\t\t\t\tif (path.node.callee.type === \"Identifier\" && path.node.callee.name === \"RegExp\") {\n\t\t\t\t\tconst firstArg = path.node.arguments[0];\n\t\t\t\t\tif (firstArg && !this.isStaticString(firstArg as t.Expression)) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `security/unsafe-regex/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\t\ttype: \"UNSAFE_REGEX\",\n\t\t\t\t\t\t\tmessage: \"Dynamic RegExp - potential ReDoS or injection vulnerability\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\t\tfix: \"Use static regex patterns or validate input\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Check for innerHTML/dangerouslySetInnerHTML (XSS)\n\t\t\tJSXAttribute: (path) => {\n\t\t\t\tconst name = path.node.name;\n\t\t\t\tif (name.type === \"JSXIdentifier\" && name.name === \"dangerouslySetInnerHTML\") {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `security/xss-risk/${file}/${path.node.loc?.start.line}`,\n\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\ttype: \"XSS_RISK\",\n\t\t\t\t\t\tmessage: \"dangerouslySetInnerHTML can lead to XSS if content is not sanitized\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline: path.node.loc?.start.line,\n\t\t\t\t\t\tfix: \"Sanitize HTML content before rendering or avoid using dangerouslySetInnerHTML\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Check for hardcoded secrets in variable declarations\n\t\t\tVariableDeclarator: (path) => {\n\t\t\t\tconst id = path.node.id;\n\t\t\t\tconst init = path.node.init;\n\n\t\t\t\tif (id.type === \"Identifier\" && init) {\n\t\t\t\t\tthis.checkForHardcodedSecret(id.name, init, file, path.node.loc?.start.line, issues);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Check for hardcoded secrets in class properties\n\t\t\tClassProperty: (path) => {\n\t\t\t\tconst key = path.node.key;\n\t\t\t\tconst value = path.node.value;\n\n\t\t\t\tif (key.type === \"Identifier\" && value) {\n\t\t\t\t\tthis.checkForHardcodedSecret(key.name, value, file, path.node.loc?.start.line, issues);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// After traversal is complete, check daemon-specific patterns\n\t\t\tProgram: {\n\t\t\t\texit: () => {\n\t\t\t\t\tif (fileContext.isDaemon && !fileContext.hasSignalHandler) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tid: `security/signal-handler/${file}`,\n\t\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\t\ttype: \"MISSING_SIGNAL_HANDLER\",\n\t\t\t\t\t\t\tmessage: \"Daemon/server missing signal handlers (SIGTERM/SIGINT)\",\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tfix: \"Add process.on('SIGTERM', gracefulShutdown) for clean shutdown\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn { issues, nodesVisited };\n\t}\n\n\t/**\n\t * Check if expression is a static string (safe)\n\t */\n\tprivate isStaticString(node: t.Expression | t.SpreadElement): boolean {\n\t\tif (node.type === \"StringLiteral\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (node.type === \"TemplateLiteral\" && node.expressions.length === 0) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if expression is a static path (safe)\n\t */\n\tprivate isStaticPath(node: t.Expression | t.SpreadElement): boolean {\n\t\t// Static string literal\n\t\tif (node.type === \"StringLiteral\") {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Template literal with no interpolation\n\t\tif (node.type === \"TemplateLiteral\" && node.expressions.length === 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// path.join(__dirname, 'static') is somewhat safe\n\t\tif (node.type === \"CallExpression\") {\n\t\t\tconst callee = node.callee;\n\t\t\tif (\n\t\t\t\tcallee.type === \"MemberExpression\" &&\n\t\t\t\tcallee.object.type === \"Identifier\" &&\n\t\t\t\tcallee.object.name === \"path\" &&\n\t\t\t\tcallee.property.type === \"Identifier\" &&\n\t\t\t\tcallee.property.name === \"join\"\n\t\t\t) {\n\t\t\t\t// Check if all arguments are static or __dirname\n\t\t\t\treturn node.arguments.every((arg: t.Node) => {\n\t\t\t\t\tif (arg.type === \"StringLiteral\") {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (arg.type === \"Identifier\" && (arg.name === \"__dirname\" || arg.name === \"__filename\")) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Check if a value looks like a hardcoded secret\n\t */\n\tprivate checkForHardcodedSecret(\n\t\tname: string,\n\t\tvalue: t.Expression | null,\n\t\tfile: string,\n\t\tline: number | undefined,\n\t\tissues: AnalysisIssue[],\n\t): void {\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst varName = name.toLowerCase();\n\t\tconst secretIndicators = [\"apikey\", \"api_key\", \"secret\", \"password\", \"token\", \"credential\", \"auth\", \"key\"];\n\n\t\tif (secretIndicators.some((s) => varName.includes(s))) {\n\t\t\tif (value.type === \"StringLiteral\" && value.value.length > 8) {\n\t\t\t\t// Skip obvious placeholders\n\t\t\t\tconst valueStr = value.value.toLowerCase();\n\t\t\t\tif (\n\t\t\t\t\t!valueStr.includes(\"placeholder\") &&\n\t\t\t\t\t!valueStr.includes(\"example\") &&\n\t\t\t\t\t!valueStr.includes(\"xxx\") &&\n\t\t\t\t\t!valueStr.includes(\"todo\") &&\n\t\t\t\t\t!valueStr.includes(\"your_\") &&\n\t\t\t\t\t!valueStr.includes(\"env.\")\n\t\t\t\t) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: `security/hardcoded-secret/${file}/${line}`,\n\t\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\t\ttype: \"HARDCODED_SECRET\",\n\t\t\t\t\t\tmessage: `Possible hardcoded secret in \"${name}\"`,\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline,\n\t\t\t\t\t\tfix: \"Use environment variables for secrets\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Skipped Test Detector\n *\n * Uses @babel/parser to detect skipped tests (describe.skip, it.skip, test.skip)\n * in test files. This helps AI agents identify RED PHASE TDD tests that may\n * be ready to enable.\n *\n * @module analysis/static/SkippedTestDetector\n */\n\nimport { parse } from \"@babel/parser\";\nimport type { Node } from \"@babel/types\";\n\nexport interface SkippedTest {\n\t/** Test type: describe, it, or test */\n\ttype: \"describe\" | \"it\" | \"test\";\n\t/** Test name if extractable */\n\tname?: string;\n\t/** Line number (1-indexed) */\n\tline: number;\n\t/** Column number (1-indexed) */\n\tcolumn: number;\n\t/** File path */\n\tfile: string;\n}\n\nexport interface SkippedTestResult {\n\t/** File analyzed */\n\tfile: string;\n\t/** Skipped tests found */\n\tskipped: SkippedTest[];\n\t/** Whether parsing succeeded */\n\tparsed: boolean;\n\t/** Parse error if any */\n\terror?: string;\n}\n\n/**\n * Detect skipped tests in a file's source code\n *\n * @param code - Source code to analyze\n * @param filePath - Path to file (for error reporting)\n * @returns Detection result with skipped tests\n *\n * @example\n * ```typescript\n * const result = detectSkippedTests(`\n * describe.skip(\"Feature\", () => {\n * it(\"should work\", () => {});\n * });\n * `, \"feature.test.ts\");\n *\n * // result.skipped = [{ type: \"describe\", name: \"Feature\", line: 2, ... }]\n * ```\n */\nexport function detectSkippedTests(code: string, filePath: string): SkippedTestResult {\n\tconst skipped: SkippedTest[] = [];\n\n\ttry {\n\t\tconst ast = parse(code, {\n\t\t\tsourceType: \"module\",\n\t\t\tplugins: [\"typescript\", \"jsx\"],\n\t\t\terrorRecovery: true,\n\t\t});\n\n\t\t// Simple AST traversal without @babel/traverse (to avoid extra dependency in MCP)\n\t\tfunction visit(node: Node) {\n\t\t\tif (node.type === \"CallExpression\") {\n\t\t\t\tconst callee = node.callee;\n\n\t\t\t\t// Check for .skip pattern: describe.skip, it.skip, test.skip\n\t\t\t\tif (\n\t\t\t\t\tcallee.type === \"MemberExpression\" &&\n\t\t\t\t\tcallee.property.type === \"Identifier\" &&\n\t\t\t\t\tcallee.property.name === \"skip\" &&\n\t\t\t\t\tcallee.object.type === \"Identifier\"\n\t\t\t\t) {\n\t\t\t\t\tconst testType = callee.object.name;\n\t\t\t\t\tif (testType === \"describe\" || testType === \"it\" || testType === \"test\") {\n\t\t\t\t\t\t// Try to extract test name from first argument\n\t\t\t\t\t\tlet name: string | undefined;\n\t\t\t\t\t\tif (node.arguments.length > 0) {\n\t\t\t\t\t\t\tconst firstArg = node.arguments[0];\n\t\t\t\t\t\t\tif (firstArg.type === \"StringLiteral\") {\n\t\t\t\t\t\t\t\tname = firstArg.value;\n\t\t\t\t\t\t\t} else if (firstArg.type === \"TemplateLiteral\" && firstArg.quasis.length === 1) {\n\t\t\t\t\t\t\t\tname = firstArg.quasis[0].value.raw;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tskipped.push({\n\t\t\t\t\t\t\ttype: testType as \"describe\" | \"it\" | \"test\",\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tline: node.loc?.start.line ?? 0,\n\t\t\t\t\t\t\tcolumn: node.loc?.start.column ?? 0,\n\t\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Also check for skip() as method call: describe(\"name\", () => { /* intentionally empty */ }).skip\n\t\t\t\t// This is less common but supported by some frameworks\n\t\t\t}\n\n\t\t\t// Recursively visit all properties that could contain nodes\n\t\t\tfor (const key of Object.keys(node)) {\n\t\t\t\tconst value = (node as unknown as Record<string, unknown>)[key];\n\t\t\t\tif (value && typeof value === \"object\") {\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tfor (const item of value) {\n\t\t\t\t\t\t\tif (item && typeof item === \"object\" && \"type\" in item) {\n\t\t\t\t\t\t\t\tvisit(item as Node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (\"type\" in value) {\n\t\t\t\t\t\tvisit(value as Node);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvisit(ast.program as unknown as Node);\n\n\t\treturn { file: filePath, skipped, parsed: true };\n\t} catch (error) {\n\t\treturn {\n\t\t\tfile: filePath,\n\t\t\tskipped: [],\n\t\t\tparsed: false,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t};\n\t}\n}\n\n/**\n * Analyze multiple files for skipped tests\n *\n * @param files - Map of file path to content\n * @returns Array of results for each file\n */\nexport function analyzeSkippedTests(files: Map<string, string>): SkippedTestResult[] {\n\tconst results: SkippedTestResult[] = [];\n\n\tfor (const [filePath, content] of files) {\n\t\t// Only analyze test files\n\t\tif (filePath.includes(\".test.\") || filePath.includes(\".spec.\") || filePath.includes(\"__tests__\")) {\n\t\t\tresults.push(detectSkippedTests(content, filePath));\n\t\t}\n\t}\n\n\treturn results;\n}\n\n/**\n * Get summary of skipped tests across all files\n */\nexport function getSkippedTestSummary(results: SkippedTestResult[]): {\n\ttotalSkipped: number;\n\tbyType: { describe: number; it: number; test: number };\n\tfilesWithSkipped: string[];\n} {\n\tconst summary = {\n\t\ttotalSkipped: 0,\n\t\tbyType: { describe: 0, it: 0, test: 0 },\n\t\tfilesWithSkipped: [] as string[],\n\t};\n\n\tfor (const result of results) {\n\t\tif (result.skipped.length > 0) {\n\t\t\tsummary.filesWithSkipped.push(result.file);\n\t\t\tsummary.totalSkipped += result.skipped.length;\n\t\t\tfor (const test of result.skipped) {\n\t\t\t\tsummary.byType[test.type]++;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn summary;\n}\n"]}
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env node
2
- export { createInitCommand } from './chunk-2OPUNVDJ.js';
3
- import './chunk-EWOJGXRX.js';
4
-
5
- process.env.VREKO_CLI='true';process.env.NODE_NO_WARNINGS='1';
6
- //# sourceMappingURL=init-command-ZUISJBCT.js.map
7
- //# sourceMappingURL=init-command-ZUISJBCT.js.map