codeguardian-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +348 -0
- package/dist/agent/agentTools.d.ts +26 -0
- package/dist/agent/agentTools.d.ts.map +1 -0
- package/dist/agent/agentTools.js +699 -0
- package/dist/agent/agentTools.js.map +1 -0
- package/dist/agent/autoValidator.d.ts +110 -0
- package/dist/agent/autoValidator.d.ts.map +1 -0
- package/dist/agent/autoValidator.js +964 -0
- package/dist/agent/autoValidator.js.map +1 -0
- package/dist/agent/fileWatcher.d.ts +28 -0
- package/dist/agent/fileWatcher.d.ts.map +1 -0
- package/dist/agent/fileWatcher.js +88 -0
- package/dist/agent/fileWatcher.js.map +1 -0
- package/dist/agent/guardianPersistence.d.ts +98 -0
- package/dist/agent/guardianPersistence.d.ts.map +1 -0
- package/dist/agent/guardianPersistence.js +296 -0
- package/dist/agent/guardianPersistence.js.map +1 -0
- package/dist/agent/mcpNotifications.d.ts +38 -0
- package/dist/agent/mcpNotifications.d.ts.map +1 -0
- package/dist/agent/mcpNotifications.js +81 -0
- package/dist/agent/mcpNotifications.js.map +1 -0
- package/dist/analyzers/aiPatterns.d.ts +16 -0
- package/dist/analyzers/aiPatterns.d.ts.map +1 -0
- package/dist/analyzers/aiPatterns.js +103 -0
- package/dist/analyzers/aiPatterns.js.map +1 -0
- package/dist/analyzers/antiPatterns.d.ts +60 -0
- package/dist/analyzers/antiPatterns.d.ts.map +1 -0
- package/dist/analyzers/antiPatterns.js +198 -0
- package/dist/analyzers/antiPatterns.js.map +1 -0
- package/dist/analyzers/builtinTypes.d.ts +18 -0
- package/dist/analyzers/builtinTypes.d.ts.map +1 -0
- package/dist/analyzers/builtinTypes.js +1275 -0
- package/dist/analyzers/builtinTypes.js.map +1 -0
- package/dist/analyzers/complexity.d.ts +14 -0
- package/dist/analyzers/complexity.d.ts.map +1 -0
- package/dist/analyzers/complexity.js +610 -0
- package/dist/analyzers/complexity.js.map +1 -0
- package/dist/analyzers/findingVerifier.d.ts +59 -0
- package/dist/analyzers/findingVerifier.d.ts.map +1 -0
- package/dist/analyzers/findingVerifier.js +1169 -0
- package/dist/analyzers/findingVerifier.js.map +1 -0
- package/dist/analyzers/impactAnalyzer.d.ts +53 -0
- package/dist/analyzers/impactAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/impactAnalyzer.js +152 -0
- package/dist/analyzers/impactAnalyzer.js.map +1 -0
- package/dist/analyzers/languageDetector.d.ts +48 -0
- package/dist/analyzers/languageDetector.d.ts.map +1 -0
- package/dist/analyzers/languageDetector.js +404 -0
- package/dist/analyzers/languageDetector.js.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts +53 -0
- package/dist/analyzers/parsers/incrementalParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/incrementalParser.js +193 -0
- package/dist/analyzers/parsers/incrementalParser.js.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts +92 -0
- package/dist/analyzers/parsers/scopeResolver.d.ts.map +1 -0
- package/dist/analyzers/parsers/scopeResolver.js +324 -0
- package/dist/analyzers/parsers/scopeResolver.js.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts +127 -0
- package/dist/analyzers/parsers/semanticIndex.d.ts.map +1 -0
- package/dist/analyzers/parsers/semanticIndex.js +429 -0
- package/dist/analyzers/parsers/semanticIndex.js.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts +42 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js +233 -0
- package/dist/analyzers/parsers/sessionDiffAnalyzer.js.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts +76 -0
- package/dist/analyzers/parsers/treeSitterParser.d.ts.map +1 -0
- package/dist/analyzers/parsers/treeSitterParser.js +709 -0
- package/dist/analyzers/parsers/treeSitterParser.js.map +1 -0
- package/dist/analyzers/relevanceScorer.d.ts +43 -0
- package/dist/analyzers/relevanceScorer.d.ts.map +1 -0
- package/dist/analyzers/relevanceScorer.js +200 -0
- package/dist/analyzers/relevanceScorer.js.map +1 -0
- package/dist/analyzers/standardLibrary.d.ts +22 -0
- package/dist/analyzers/standardLibrary.d.ts.map +1 -0
- package/dist/analyzers/standardLibrary.js +211 -0
- package/dist/analyzers/standardLibrary.js.map +1 -0
- package/dist/analyzers/symbolGraph.d.ts +30 -0
- package/dist/analyzers/symbolGraph.d.ts.map +1 -0
- package/dist/analyzers/symbolGraph.js +380 -0
- package/dist/analyzers/symbolGraph.js.map +1 -0
- package/dist/analyzers/symbolTable.d.ts +18 -0
- package/dist/analyzers/symbolTable.d.ts.map +1 -0
- package/dist/analyzers/symbolTable.js +176 -0
- package/dist/analyzers/symbolTable.js.map +1 -0
- package/dist/analyzers/typeChecker.d.ts +13 -0
- package/dist/analyzers/typeChecker.d.ts.map +1 -0
- package/dist/analyzers/typeChecker.js +580 -0
- package/dist/analyzers/typeChecker.js.map +1 -0
- package/dist/analyzers/usagePatterns.d.ts +42 -0
- package/dist/analyzers/usagePatterns.d.ts.map +1 -0
- package/dist/analyzers/usagePatterns.js +75 -0
- package/dist/analyzers/usagePatterns.js.map +1 -0
- package/dist/api-contract/context/backend.d.ts +19 -0
- package/dist/api-contract/context/backend.d.ts.map +1 -0
- package/dist/api-contract/context/backend.js +64 -0
- package/dist/api-contract/context/backend.js.map +1 -0
- package/dist/api-contract/context/contract.d.ts +34 -0
- package/dist/api-contract/context/contract.d.ts.map +1 -0
- package/dist/api-contract/context/contract.js +306 -0
- package/dist/api-contract/context/contract.js.map +1 -0
- package/dist/api-contract/context/frontend.d.ts +19 -0
- package/dist/api-contract/context/frontend.d.ts.map +1 -0
- package/dist/api-contract/context/frontend.js +64 -0
- package/dist/api-contract/context/frontend.js.map +1 -0
- package/dist/api-contract/detector.d.ts +28 -0
- package/dist/api-contract/detector.d.ts.map +1 -0
- package/dist/api-contract/detector.js +393 -0
- package/dist/api-contract/detector.js.map +1 -0
- package/dist/api-contract/extractors/python.d.ts +32 -0
- package/dist/api-contract/extractors/python.d.ts.map +1 -0
- package/dist/api-contract/extractors/python.js +521 -0
- package/dist/api-contract/extractors/python.js.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts +44 -0
- package/dist/api-contract/extractors/pythonAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/pythonAstUtils.js +489 -0
- package/dist/api-contract/extractors/pythonAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts +47 -0
- package/dist/api-contract/extractors/tsAstUtils.d.ts.map +1 -0
- package/dist/api-contract/extractors/tsAstUtils.js +173 -0
- package/dist/api-contract/extractors/tsAstUtils.js.map +1 -0
- package/dist/api-contract/extractors/typescript.d.ts +32 -0
- package/dist/api-contract/extractors/typescript.d.ts.map +1 -0
- package/dist/api-contract/extractors/typescript.js +666 -0
- package/dist/api-contract/extractors/typescript.js.map +1 -0
- package/dist/api-contract/index.d.ts +104 -0
- package/dist/api-contract/index.d.ts.map +1 -0
- package/dist/api-contract/index.js +232 -0
- package/dist/api-contract/index.js.map +1 -0
- package/dist/api-contract/types.d.ts +151 -0
- package/dist/api-contract/types.d.ts.map +1 -0
- package/dist/api-contract/types.js +19 -0
- package/dist/api-contract/types.js.map +1 -0
- package/dist/api-contract/validators/endpoint.d.ts +21 -0
- package/dist/api-contract/validators/endpoint.d.ts.map +1 -0
- package/dist/api-contract/validators/endpoint.js +224 -0
- package/dist/api-contract/validators/endpoint.js.map +1 -0
- package/dist/api-contract/validators/index.d.ts +40 -0
- package/dist/api-contract/validators/index.d.ts.map +1 -0
- package/dist/api-contract/validators/index.js +875 -0
- package/dist/api-contract/validators/index.js.map +1 -0
- package/dist/api-contract/validators/parameter.d.ts +17 -0
- package/dist/api-contract/validators/parameter.d.ts.map +1 -0
- package/dist/api-contract/validators/parameter.js +250 -0
- package/dist/api-contract/validators/parameter.js.map +1 -0
- package/dist/api-contract/validators/type.d.ts +38 -0
- package/dist/api-contract/validators/type.d.ts.map +1 -0
- package/dist/api-contract/validators/type.js +244 -0
- package/dist/api-contract/validators/type.js.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts +83 -0
- package/dist/context/apiContract/complexTypeSupport.d.ts.map +1 -0
- package/dist/context/apiContract/complexTypeSupport.js +665 -0
- package/dist/context/apiContract/complexTypeSupport.js.map +1 -0
- package/dist/context/apiContract/graphqlSupport.d.ts +105 -0
- package/dist/context/apiContract/graphqlSupport.d.ts.map +1 -0
- package/dist/context/apiContract/graphqlSupport.js +671 -0
- package/dist/context/apiContract/graphqlSupport.js.map +1 -0
- package/dist/context/apiContract/index.d.ts +14 -0
- package/dist/context/apiContract/index.d.ts.map +1 -0
- package/dist/context/apiContract/index.js +17 -0
- package/dist/context/apiContract/index.js.map +1 -0
- package/dist/context/apiContract/webSocketSupport.d.ts +104 -0
- package/dist/context/apiContract/webSocketSupport.d.ts.map +1 -0
- package/dist/context/apiContract/webSocketSupport.js +465 -0
- package/dist/context/apiContract/webSocketSupport.js.map +1 -0
- package/dist/context/apiContractContext.d.ts +15 -0
- package/dist/context/apiContractContext.d.ts.map +1 -0
- package/dist/context/apiContractContext.js +979 -0
- package/dist/context/apiContractContext.js.map +1 -0
- package/dist/context/apiContractExtraction.d.ts +52 -0
- package/dist/context/apiContractExtraction.d.ts.map +1 -0
- package/dist/context/apiContractExtraction.js +438 -0
- package/dist/context/apiContractExtraction.js.map +1 -0
- package/dist/context/contextLineage.d.ts +79 -0
- package/dist/context/contextLineage.d.ts.map +1 -0
- package/dist/context/contextLineage.js +259 -0
- package/dist/context/contextLineage.js.map +1 -0
- package/dist/context/contextOrchestrator.d.ts +57 -0
- package/dist/context/contextOrchestrator.d.ts.map +1 -0
- package/dist/context/contextOrchestrator.js +162 -0
- package/dist/context/contextOrchestrator.js.map +1 -0
- package/dist/context/intentTracker.d.ts +73 -0
- package/dist/context/intentTracker.d.ts.map +1 -0
- package/dist/context/intentTracker.js +168 -0
- package/dist/context/intentTracker.js.map +1 -0
- package/dist/context/projectContext.d.ts +219 -0
- package/dist/context/projectContext.d.ts.map +1 -0
- package/dist/context/projectContext.js +1984 -0
- package/dist/context/projectContext.js.map +1 -0
- package/dist/prompts/index.d.ts +17 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +260 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/library.d.ts +51 -0
- package/dist/prompts/library.d.ts.map +1 -0
- package/dist/prompts/library.js +65 -0
- package/dist/prompts/library.js.map +1 -0
- package/dist/prompts/templates.d.ts +44 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +97 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/queue/jobPersistence.d.ts +46 -0
- package/dist/queue/jobPersistence.d.ts.map +1 -0
- package/dist/queue/jobPersistence.js +158 -0
- package/dist/queue/jobPersistence.js.map +1 -0
- package/dist/queue/jobQueue.d.ts +116 -0
- package/dist/queue/jobQueue.d.ts.map +1 -0
- package/dist/queue/jobQueue.js +275 -0
- package/dist/queue/jobQueue.js.map +1 -0
- package/dist/queue/validationJob.d.ts +69 -0
- package/dist/queue/validationJob.d.ts.map +1 -0
- package/dist/queue/validationJob.js +435 -0
- package/dist/queue/validationJob.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +328 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/validationReportStore.d.ts +170 -0
- package/dist/resources/validationReportStore.d.ts.map +1 -0
- package/dist/resources/validationReportStore.js +515 -0
- package/dist/resources/validationReportStore.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +102 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/asyncValidation.d.ts +19 -0
- package/dist/tools/asyncValidation.d.ts.map +1 -0
- package/dist/tools/asyncValidation.js +346 -0
- package/dist/tools/asyncValidation.js.map +1 -0
- package/dist/tools/buildContext.d.ts +17 -0
- package/dist/tools/buildContext.d.ts.map +1 -0
- package/dist/tools/buildContext.js +188 -0
- package/dist/tools/buildContext.js.map +1 -0
- package/dist/tools/getDependencyGraph.d.ts +16 -0
- package/dist/tools/getDependencyGraph.d.ts.map +1 -0
- package/dist/tools/getDependencyGraph.js +436 -0
- package/dist/tools/getDependencyGraph.js.map +1 -0
- package/dist/tools/incrementalValidation.d.ts +71 -0
- package/dist/tools/incrementalValidation.d.ts.map +1 -0
- package/dist/tools/incrementalValidation.js +203 -0
- package/dist/tools/incrementalValidation.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/validateCode.d.ts +17 -0
- package/dist/tools/validateCode.d.ts.map +1 -0
- package/dist/tools/validateCode.js +368 -0
- package/dist/tools/validateCode.js.map +1 -0
- package/dist/tools/validateCodeLite.d.ts +2 -0
- package/dist/tools/validateCodeLite.d.ts.map +1 -0
- package/dist/tools/validateCodeLite.js +2 -0
- package/dist/tools/validateCodeLite.js.map +1 -0
- package/dist/tools/validation/builtins.d.ts +92 -0
- package/dist/tools/validation/builtins.d.ts.map +1 -0
- package/dist/tools/validation/builtins.js +2184 -0
- package/dist/tools/validation/builtins.js.map +1 -0
- package/dist/tools/validation/contextualNaming.d.ts +99 -0
- package/dist/tools/validation/contextualNaming.d.ts.map +1 -0
- package/dist/tools/validation/contextualNaming.js +959 -0
- package/dist/tools/validation/contextualNaming.js.map +1 -0
- package/dist/tools/validation/deadCode.d.ts +115 -0
- package/dist/tools/validation/deadCode.d.ts.map +1 -0
- package/dist/tools/validation/deadCode.js +861 -0
- package/dist/tools/validation/deadCode.js.map +1 -0
- package/dist/tools/validation/extractors/index.d.ts +131 -0
- package/dist/tools/validation/extractors/index.d.ts.map +1 -0
- package/dist/tools/validation/extractors/index.js +233 -0
- package/dist/tools/validation/extractors/index.js.map +1 -0
- package/dist/tools/validation/extractors/javascript.d.ts +73 -0
- package/dist/tools/validation/extractors/javascript.d.ts.map +1 -0
- package/dist/tools/validation/extractors/javascript.js +1841 -0
- package/dist/tools/validation/extractors/javascript.js.map +1 -0
- package/dist/tools/validation/extractors/python.d.ts +93 -0
- package/dist/tools/validation/extractors/python.d.ts.map +1 -0
- package/dist/tools/validation/extractors/python.js +799 -0
- package/dist/tools/validation/extractors/python.js.map +1 -0
- package/dist/tools/validation/manifest.d.ts +45 -0
- package/dist/tools/validation/manifest.d.ts.map +1 -0
- package/dist/tools/validation/manifest.js +719 -0
- package/dist/tools/validation/manifest.js.map +1 -0
- package/dist/tools/validation/parser.d.ts +58 -0
- package/dist/tools/validation/parser.d.ts.map +1 -0
- package/dist/tools/validation/parser.js +232 -0
- package/dist/tools/validation/parser.js.map +1 -0
- package/dist/tools/validation/registry.d.ts +15 -0
- package/dist/tools/validation/registry.d.ts.map +1 -0
- package/dist/tools/validation/registry.js +169 -0
- package/dist/tools/validation/registry.js.map +1 -0
- package/dist/tools/validation/scoring.d.ts +54 -0
- package/dist/tools/validation/scoring.d.ts.map +1 -0
- package/dist/tools/validation/scoring.js +242 -0
- package/dist/tools/validation/scoring.js.map +1 -0
- package/dist/tools/validation/types.d.ts +120 -0
- package/dist/tools/validation/types.d.ts.map +1 -0
- package/dist/tools/validation/types.js +11 -0
- package/dist/tools/validation/types.js.map +1 -0
- package/dist/tools/validation/unusedLocals.d.ts +36 -0
- package/dist/tools/validation/unusedLocals.d.ts.map +1 -0
- package/dist/tools/validation/unusedLocals.js +333 -0
- package/dist/tools/validation/unusedLocals.js.map +1 -0
- package/dist/tools/validation/validation.d.ts +98 -0
- package/dist/tools/validation/validation.d.ts.map +1 -0
- package/dist/tools/validation/validation.js +1837 -0
- package/dist/tools/validation/validation.js.map +1 -0
- package/dist/types/codeGraph.d.ts +163 -0
- package/dist/types/codeGraph.d.ts.map +1 -0
- package/dist/types/codeGraph.js +9 -0
- package/dist/types/codeGraph.js.map +1 -0
- package/dist/types/symbolGraph.d.ts +68 -0
- package/dist/types/symbolGraph.d.ts.map +1 -0
- package/dist/types/symbolGraph.js +10 -0
- package/dist/types/symbolGraph.js.map +1 -0
- package/dist/types/tools.d.ts +43 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +7 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/fileFilter.d.ts +37 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +91 -0
- package/dist/utils/fileFilter.js.map +1 -0
- package/dist/utils/gitUtils.d.ts +28 -0
- package/dist/utils/gitUtils.d.ts.map +1 -0
- package/dist/utils/gitUtils.js +81 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +38 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/serialization.d.ts +25 -0
- package/dist/utils/serialization.d.ts.map +1 -0
- package/dist/utils/serialization.js +53 -0
- package/dist/utils/serialization.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol Graph Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds symbol-level dependency graphs to understand relationships between
|
|
5
|
+
* functions, classes, and other symbols across the codebase.
|
|
6
|
+
*
|
|
7
|
+
* Inspired by Augment Code's semantic dependency analysis.
|
|
8
|
+
*
|
|
9
|
+
* @format
|
|
10
|
+
*/
|
|
11
|
+
import { extractUsagesAST, extractImportsAST, } from "../tools/validation/extractors/index.js";
|
|
12
|
+
import { logger } from "../utils/logger.js";
|
|
13
|
+
/**
|
|
14
|
+
* Build symbol-level dependency graph from project context
|
|
15
|
+
*/
|
|
16
|
+
export async function buildSymbolGraph(context, options = {}) {
|
|
17
|
+
const { includeCallRelationships = true, includeCoOccurrence = true, minCoOccurrenceCount = 2, } = options;
|
|
18
|
+
logger.debug("Building symbol graph...");
|
|
19
|
+
const startTime = Date.now();
|
|
20
|
+
const graph = {
|
|
21
|
+
relationships: [],
|
|
22
|
+
usage: new Map(),
|
|
23
|
+
symbolToFiles: new Map(),
|
|
24
|
+
fileToSymbols: new Map(),
|
|
25
|
+
coOccurrence: new Map(),
|
|
26
|
+
};
|
|
27
|
+
// Step 1: Build basic symbol-to-file mappings
|
|
28
|
+
await buildSymbolMappings(context, graph);
|
|
29
|
+
// Step 2: Extract import relationships
|
|
30
|
+
await extractImportRelationships(context, graph);
|
|
31
|
+
// Step 3: Extract call relationships (if enabled)
|
|
32
|
+
if (includeCallRelationships) {
|
|
33
|
+
await extractCallRelationships(context, graph);
|
|
34
|
+
}
|
|
35
|
+
// Step 4: Build co-occurrence matrix (if enabled)
|
|
36
|
+
if (includeCoOccurrence) {
|
|
37
|
+
await buildCoOccurrenceMatrix(context, graph, minCoOccurrenceCount);
|
|
38
|
+
}
|
|
39
|
+
// Step 5: Link Semantic Bridge (Cross-Language)
|
|
40
|
+
await linkSemanticBridge(graph);
|
|
41
|
+
// Step 5: Calculate usage statistics
|
|
42
|
+
calculateUsageStats(graph);
|
|
43
|
+
const elapsed = Date.now() - startTime;
|
|
44
|
+
logger.debug(`Symbol graph built in ${elapsed}ms (${graph.relationships.length} relationships, ${graph.usage.size} symbols)`);
|
|
45
|
+
return graph;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build basic symbol-to-file and file-to-symbol mappings
|
|
49
|
+
*/
|
|
50
|
+
async function buildSymbolMappings(context, graph) {
|
|
51
|
+
let i = 0;
|
|
52
|
+
for (const [filePath, fileInfo] of context.files) {
|
|
53
|
+
i++;
|
|
54
|
+
const symbolsInFile = new Set();
|
|
55
|
+
for (const symbol of fileInfo.symbols) {
|
|
56
|
+
// Track symbol -> files
|
|
57
|
+
if (!graph.symbolToFiles.has(symbol.name)) {
|
|
58
|
+
graph.symbolToFiles.set(symbol.name, new Set());
|
|
59
|
+
}
|
|
60
|
+
graph.symbolToFiles.get(symbol.name).add(filePath);
|
|
61
|
+
// Track file -> symbols
|
|
62
|
+
symbolsInFile.add(symbol.name);
|
|
63
|
+
// Initialize usage stats
|
|
64
|
+
if (!graph.usage.has(symbol.name)) {
|
|
65
|
+
graph.usage.set(symbol.name, {
|
|
66
|
+
symbol: symbol.name,
|
|
67
|
+
usageCount: 0,
|
|
68
|
+
importCount: 0,
|
|
69
|
+
calledBy: new Set(),
|
|
70
|
+
calls: new Set(),
|
|
71
|
+
coOccurs: new Map(),
|
|
72
|
+
files: new Set(),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
graph.usage.get(symbol.name).files.add(filePath);
|
|
76
|
+
}
|
|
77
|
+
graph.fileToSymbols.set(filePath, symbolsInFile);
|
|
78
|
+
// Yield every 50 files
|
|
79
|
+
if (i % 50 === 0) {
|
|
80
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extract import relationships between symbols
|
|
86
|
+
*/
|
|
87
|
+
async function extractImportRelationships(context, graph) {
|
|
88
|
+
let i = 0;
|
|
89
|
+
for (const [filePath, fileInfo] of context.files) {
|
|
90
|
+
i++;
|
|
91
|
+
for (const imp of fileInfo.imports) {
|
|
92
|
+
// For each imported symbol, create a relationship
|
|
93
|
+
const importedSymbols = [
|
|
94
|
+
...imp.namedImports,
|
|
95
|
+
...(imp.defaultImport ? [imp.defaultImport] : []),
|
|
96
|
+
];
|
|
97
|
+
for (const importedSymbol of importedSymbols) {
|
|
98
|
+
// Find which file defines this symbol
|
|
99
|
+
const definingFiles = graph.symbolToFiles.get(importedSymbol);
|
|
100
|
+
if (!definingFiles)
|
|
101
|
+
continue;
|
|
102
|
+
for (const definingFile of definingFiles) {
|
|
103
|
+
graph.relationships.push({
|
|
104
|
+
from: filePath,
|
|
105
|
+
to: importedSymbol,
|
|
106
|
+
type: "imports",
|
|
107
|
+
file: filePath,
|
|
108
|
+
line: imp.line,
|
|
109
|
+
confidence: 1.0,
|
|
110
|
+
reason: "AST-based import",
|
|
111
|
+
});
|
|
112
|
+
// Update usage stats
|
|
113
|
+
const usage = graph.usage.get(importedSymbol);
|
|
114
|
+
if (usage) {
|
|
115
|
+
usage.importCount++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Yield every 50 files
|
|
121
|
+
if (i % 50 === 0) {
|
|
122
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Extract call relationships by analyzing function calls using AST
|
|
128
|
+
*/
|
|
129
|
+
async function extractCallRelationships(context, graph) {
|
|
130
|
+
const fs = await import("fs/promises");
|
|
131
|
+
let i = 0;
|
|
132
|
+
for (const [filePath, fileInfo] of context.files) {
|
|
133
|
+
i++;
|
|
134
|
+
try {
|
|
135
|
+
// Skip files that are too large to parse repeatedly or not source files
|
|
136
|
+
if (fileInfo.size > 500000)
|
|
137
|
+
continue;
|
|
138
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
139
|
+
const lang = fileInfo.language === "python" ? "python" :
|
|
140
|
+
fileInfo.language === "go" ? "go" :
|
|
141
|
+
"typescript";
|
|
142
|
+
const imports = extractImportsAST(content, lang);
|
|
143
|
+
const usages = extractUsagesAST(content, lang, imports);
|
|
144
|
+
// Heuristic: identify which symbol in the file contains these usages
|
|
145
|
+
// (For now, we attribute them to the containing file or top-level symbols)
|
|
146
|
+
const symbolsInFile = fileInfo.symbols;
|
|
147
|
+
for (const usage of usages) {
|
|
148
|
+
// Find which symbol defines this name
|
|
149
|
+
const definingFiles = graph.symbolToFiles.get(usage.name);
|
|
150
|
+
if (!definingFiles)
|
|
151
|
+
continue;
|
|
152
|
+
for (const definingFile of definingFiles) {
|
|
153
|
+
// If we have a current symbol scope (e.g., we're in a function), we'd use that.
|
|
154
|
+
// Since our AST extraction for usages doesn't yet return the containing symbol,
|
|
155
|
+
// we associate the usage with the file for now, or with all symbols in the file
|
|
156
|
+
// if it's a small file.
|
|
157
|
+
graph.relationships.push({
|
|
158
|
+
from: filePath, // Association with file
|
|
159
|
+
to: usage.name,
|
|
160
|
+
type: usage.type === "call" ? "calls" : "references",
|
|
161
|
+
file: filePath,
|
|
162
|
+
line: usage.line,
|
|
163
|
+
confidence: 0.95, // High confidence (AST-based)
|
|
164
|
+
reason: "AST-based call",
|
|
165
|
+
});
|
|
166
|
+
// Update usage stats
|
|
167
|
+
const toUsage = graph.usage.get(usage.name);
|
|
168
|
+
if (toUsage) {
|
|
169
|
+
toUsage.calledBy.add(filePath);
|
|
170
|
+
toUsage.usageCount++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
logger.debug(`Could not extract call relationships for ${filePath}:`, error);
|
|
177
|
+
}
|
|
178
|
+
// Yield every 10 files
|
|
179
|
+
if (i % 10 === 0) {
|
|
180
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Build co-occurrence matrix: which symbols are often used together
|
|
186
|
+
*/
|
|
187
|
+
async function buildCoOccurrenceMatrix(context, graph, minCount) {
|
|
188
|
+
let i = 0;
|
|
189
|
+
// For each file, track which symbols appear together
|
|
190
|
+
for (const [filePath, fileInfo] of context.files) {
|
|
191
|
+
i++;
|
|
192
|
+
const symbolsInFile = new Set();
|
|
193
|
+
// Collect all symbols used in this file (defined + imported)
|
|
194
|
+
for (const symbol of fileInfo.symbols) {
|
|
195
|
+
symbolsInFile.add(symbol.name);
|
|
196
|
+
}
|
|
197
|
+
for (const imp of fileInfo.imports) {
|
|
198
|
+
imp.namedImports.forEach((s) => symbolsInFile.add(s));
|
|
199
|
+
if (imp.defaultImport)
|
|
200
|
+
symbolsInFile.add(imp.defaultImport);
|
|
201
|
+
}
|
|
202
|
+
// Add symbols from call relationships in this file
|
|
203
|
+
const callRelationships = graph.relationships.filter((r) => r.file === filePath && r.type === "calls");
|
|
204
|
+
for (const rel of callRelationships) {
|
|
205
|
+
symbolsInFile.add(rel.to);
|
|
206
|
+
}
|
|
207
|
+
const symbolArray = Array.from(symbolsInFile);
|
|
208
|
+
for (let j = 0; j < symbolArray.length; j++) {
|
|
209
|
+
for (let k = j + 1; k < symbolArray.length; k++) {
|
|
210
|
+
const sym1 = symbolArray[j];
|
|
211
|
+
const sym2 = symbolArray[k];
|
|
212
|
+
// Update co-occurrence for sym1 and sym2
|
|
213
|
+
incrementCoOccurrence(graph, sym1, sym2);
|
|
214
|
+
incrementCoOccurrence(graph, sym2, sym1);
|
|
215
|
+
// Update usage stats (legacy)
|
|
216
|
+
const usage1 = graph.usage.get(sym1);
|
|
217
|
+
const usage2 = graph.usage.get(sym2);
|
|
218
|
+
if (usage1)
|
|
219
|
+
usage1.coOccurs.set(sym2, (usage1.coOccurs.get(sym2) || 0) + 1);
|
|
220
|
+
if (usage2)
|
|
221
|
+
usage2.coOccurs.set(sym1, (usage2.coOccurs.get(sym1) || 0) + 1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Yield every 20 files
|
|
225
|
+
if (i % 20 === 0) {
|
|
226
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Filter out low-frequency co-occurrences
|
|
230
|
+
for (const [symbol, coOccurs] of graph.coOccurrence) {
|
|
231
|
+
for (const [otherSymbol, count] of coOccurs) {
|
|
232
|
+
if (count < minCount) {
|
|
233
|
+
coOccurs.delete(otherSymbol);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Helper to increment co-occurrence count
|
|
240
|
+
*/
|
|
241
|
+
function incrementCoOccurrence(graph, s1, s2) {
|
|
242
|
+
let map = graph.coOccurrence.get(s1);
|
|
243
|
+
if (!map) {
|
|
244
|
+
map = new Map();
|
|
245
|
+
graph.coOccurrence.set(s1, map);
|
|
246
|
+
}
|
|
247
|
+
map.set(s2, (map.get(s2) || 0) + 1);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Calculate final usage statistics
|
|
251
|
+
*/
|
|
252
|
+
function calculateUsageStats(graph) {
|
|
253
|
+
for (const usage of graph.usage.values()) {
|
|
254
|
+
// Count total usages (imports + calls)
|
|
255
|
+
usage.usageCount = usage.importCount + usage.calledBy.size;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Link Semantic Bridge: Connect frontend API calls (TS) to backend routes (Python)
|
|
260
|
+
*/
|
|
261
|
+
async function linkSemanticBridge(graph) {
|
|
262
|
+
logger.debug("Linking Semantic Bridge (Cross-Language Tracing)...");
|
|
263
|
+
// 1. Identify all route symbols (mostly from Python)
|
|
264
|
+
const routeSymbols = [];
|
|
265
|
+
for (const [symbol, files] of graph.symbolToFiles.entries()) {
|
|
266
|
+
// We need to check if ANY of these files define this as a 'route'
|
|
267
|
+
// For now, we assume if it starts with / and is tracked, it's a route
|
|
268
|
+
if (symbol.startsWith("/")) {
|
|
269
|
+
for (const file of files) {
|
|
270
|
+
routeSymbols.push({ name: symbol, file });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (routeSymbols.length === 0)
|
|
275
|
+
return;
|
|
276
|
+
// 2. Scan for TS usages that match these routes
|
|
277
|
+
for (const [symbolName, usage] of graph.usage.entries()) {
|
|
278
|
+
// If a TS file "references" a string that matches a route
|
|
279
|
+
if (symbolName.startsWith("/")) {
|
|
280
|
+
const matchingRoute = routeSymbols.find(r => r.name === symbolName);
|
|
281
|
+
if (matchingRoute) {
|
|
282
|
+
// Link the files that USE this URL to the file that DEFINES the route
|
|
283
|
+
for (const callerFile of usage.calledBy) {
|
|
284
|
+
// Avoid self-linking (unlikely for cross-language)
|
|
285
|
+
if (callerFile === matchingRoute.file)
|
|
286
|
+
continue;
|
|
287
|
+
graph.relationships.push({
|
|
288
|
+
from: callerFile,
|
|
289
|
+
to: matchingRoute.name,
|
|
290
|
+
type: "calls", // We treat API access as a semantic call
|
|
291
|
+
file: callerFile,
|
|
292
|
+
line: 0, // General relationship
|
|
293
|
+
confidence: 0.9,
|
|
294
|
+
reason: `Semantic Bridge: API access to ${matchingRoute.name}`,
|
|
295
|
+
});
|
|
296
|
+
// Update usage stats for the route
|
|
297
|
+
const routeUsage = graph.usage.get(matchingRoute.name);
|
|
298
|
+
if (routeUsage) {
|
|
299
|
+
routeUsage.calledBy.add(callerFile);
|
|
300
|
+
routeUsage.usageCount++;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Find symbols related to a given symbol
|
|
309
|
+
*/
|
|
310
|
+
export function findRelatedSymbols(graph, symbolName, maxResults = 10) {
|
|
311
|
+
const related = [];
|
|
312
|
+
const usage = graph.usage.get(symbolName);
|
|
313
|
+
if (!usage) {
|
|
314
|
+
return { symbol: symbolName, related: [] };
|
|
315
|
+
}
|
|
316
|
+
// Add symbols this one calls
|
|
317
|
+
for (const calledSymbol of usage.calls) {
|
|
318
|
+
related.push({
|
|
319
|
+
symbol: calledSymbol,
|
|
320
|
+
relationship: "calls",
|
|
321
|
+
score: 0.9,
|
|
322
|
+
reason: `${symbolName} calls ${calledSymbol}`,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
// Add symbols that call this one
|
|
326
|
+
for (const callerSymbol of usage.calledBy) {
|
|
327
|
+
related.push({
|
|
328
|
+
symbol: callerSymbol,
|
|
329
|
+
relationship: "calls",
|
|
330
|
+
score: 0.8,
|
|
331
|
+
reason: `${callerSymbol} calls ${symbolName}`,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
// Add frequently co-occurring symbols
|
|
335
|
+
const coOccurArray = Array.from(usage.coOccurs.entries())
|
|
336
|
+
.sort((a, b) => b[1] - a[1])
|
|
337
|
+
.slice(0, 5);
|
|
338
|
+
for (const [coSymbol, count] of coOccurArray) {
|
|
339
|
+
const score = Math.min(0.7, count / 10); // Max score 0.7 for co-occurrence
|
|
340
|
+
related.push({
|
|
341
|
+
symbol: coSymbol,
|
|
342
|
+
relationship: "co-occurs",
|
|
343
|
+
score,
|
|
344
|
+
reason: `Often used together (${count} times)`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// Sort by score and limit results
|
|
348
|
+
related.sort((a, b) => b.score - a.score);
|
|
349
|
+
return {
|
|
350
|
+
symbol: symbolName,
|
|
351
|
+
related: related.slice(0, maxResults),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Get symbols that are most relevant to a set of imports
|
|
356
|
+
* This is useful for validation - given what's imported, what else is likely needed?
|
|
357
|
+
*/
|
|
358
|
+
export function getRelevantSymbols(graph, importedSymbols, maxResults = 20) {
|
|
359
|
+
const relevanceScores = new Map();
|
|
360
|
+
for (const importedSymbol of importedSymbols) {
|
|
361
|
+
const related = findRelatedSymbols(graph, importedSymbol, 20);
|
|
362
|
+
for (const rel of related.related) {
|
|
363
|
+
const currentScore = relevanceScores.get(rel.symbol) || 0;
|
|
364
|
+
relevanceScores.set(rel.symbol, currentScore + rel.score);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// Sort by relevance score
|
|
368
|
+
const sorted = Array.from(relevanceScores.entries())
|
|
369
|
+
.sort((a, b) => b[1] - a[1])
|
|
370
|
+
.slice(0, maxResults)
|
|
371
|
+
.map(([symbol]) => symbol);
|
|
372
|
+
return sorted;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get usage statistics for a symbol
|
|
376
|
+
*/
|
|
377
|
+
export function getSymbolUsage(graph, symbolName) {
|
|
378
|
+
return graph.usage.get(symbolName) || null;
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=symbolGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolGraph.js","sourceRoot":"","sources":["../../src/analyzers/symbolGraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol Table Builder (AST-based)
|
|
3
|
+
*
|
|
4
|
+
* NOTE: This file is intentionally separate from the validation pipeline.
|
|
5
|
+
* The flagship validator uses [`src/tools/validation/extractors/index.ts`](src/tools/validation/extractors/index.ts)
|
|
6
|
+
* + project context indexing.
|
|
7
|
+
*
|
|
8
|
+
* This module provides a lightweight, snippet-level symbol table used by
|
|
9
|
+
* legacy analyzers/tests (e.g. type consistency heuristics).
|
|
10
|
+
*
|
|
11
|
+
* @format
|
|
12
|
+
*/
|
|
13
|
+
import { SymbolTable } from "../types/tools.js";
|
|
14
|
+
/**
|
|
15
|
+
* Build symbol table from codebase
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildSymbolTable(codebase: string, language: string): Promise<SymbolTable>;
|
|
18
|
+
//# sourceMappingURL=symbolTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolTable.d.ts","sourceRoot":"","sources":["../../src/analyzers/symbolTable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC,CA+BtB"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol Table Builder (AST-based)
|
|
3
|
+
*
|
|
4
|
+
* NOTE: This file is intentionally separate from the validation pipeline.
|
|
5
|
+
* The flagship validator uses [`src/tools/validation/extractors/index.ts`](src/tools/validation/extractors/index.ts)
|
|
6
|
+
* + project context indexing.
|
|
7
|
+
*
|
|
8
|
+
* This module provides a lightweight, snippet-level symbol table used by
|
|
9
|
+
* legacy analyzers/tests (e.g. type consistency heuristics).
|
|
10
|
+
*
|
|
11
|
+
* @format
|
|
12
|
+
*/
|
|
13
|
+
import { logger } from "../utils/logger.js";
|
|
14
|
+
import { extractSymbolsAST, extractImportsAST, } from "../tools/validation/extractors/index.js";
|
|
15
|
+
/**
|
|
16
|
+
* Build symbol table from codebase
|
|
17
|
+
*/
|
|
18
|
+
export async function buildSymbolTable(codebase, language) {
|
|
19
|
+
logger.debug(`Building symbol table for ${language}...`);
|
|
20
|
+
const symbolTable = {
|
|
21
|
+
functions: [],
|
|
22
|
+
classes: [],
|
|
23
|
+
interfaces: [],
|
|
24
|
+
variables: [],
|
|
25
|
+
imports: [],
|
|
26
|
+
dependencies: [],
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
switch (language) {
|
|
30
|
+
case "javascript":
|
|
31
|
+
case "typescript":
|
|
32
|
+
return await buildJavaScriptSymbolTable(codebase, language);
|
|
33
|
+
case "python":
|
|
34
|
+
return await buildPythonSymbolTable(codebase);
|
|
35
|
+
case "go":
|
|
36
|
+
return await buildGoSymbolTable(codebase);
|
|
37
|
+
default:
|
|
38
|
+
logger.warn(`Symbol table building not fully implemented for ${language}`);
|
|
39
|
+
return symbolTable;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.error("Error building symbol table:", error);
|
|
44
|
+
return symbolTable;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build symbol table for JavaScript/TypeScript using Tree-sitter AST extractors.
|
|
49
|
+
*
|
|
50
|
+
* This replaces legacy regex patterns (which were prone to false positives in
|
|
51
|
+
* comments/strings and missed destructuring/object-literal methods).
|
|
52
|
+
*/
|
|
53
|
+
async function buildJavaScriptSymbolTable(code, language) {
|
|
54
|
+
const functions = new Set();
|
|
55
|
+
const classes = new Set();
|
|
56
|
+
const interfaces = new Set();
|
|
57
|
+
const variables = new Set();
|
|
58
|
+
const imports = new Set();
|
|
59
|
+
// 1) Symbols (AST)
|
|
60
|
+
const symbols = extractSymbolsAST(code, "", language);
|
|
61
|
+
for (const sym of symbols) {
|
|
62
|
+
switch (sym.type) {
|
|
63
|
+
case "function":
|
|
64
|
+
case "method":
|
|
65
|
+
functions.add(sym.name);
|
|
66
|
+
break;
|
|
67
|
+
case "class":
|
|
68
|
+
classes.add(sym.name);
|
|
69
|
+
break;
|
|
70
|
+
case "interface":
|
|
71
|
+
case "type":
|
|
72
|
+
interfaces.add(sym.name);
|
|
73
|
+
break;
|
|
74
|
+
case "variable":
|
|
75
|
+
variables.add(sym.name);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// 2) Imports (AST)
|
|
80
|
+
const astImports = extractImportsAST(code, language);
|
|
81
|
+
for (const imp of astImports) {
|
|
82
|
+
if (imp.module)
|
|
83
|
+
imports.add(imp.module);
|
|
84
|
+
}
|
|
85
|
+
logger.debug(`Found ${functions.size} functions, ${classes.size} classes, ${interfaces.size} interfaces (AST-based)`);
|
|
86
|
+
return {
|
|
87
|
+
functions: Array.from(functions),
|
|
88
|
+
classes: Array.from(classes),
|
|
89
|
+
interfaces: Array.from(interfaces),
|
|
90
|
+
variables: Array.from(variables),
|
|
91
|
+
imports: Array.from(imports),
|
|
92
|
+
dependencies: [],
|
|
93
|
+
classFields: {},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Build symbol table for Python - ENHANCED
|
|
98
|
+
*/
|
|
99
|
+
async function buildPythonSymbolTable(code) {
|
|
100
|
+
const functions = new Set();
|
|
101
|
+
const classes = new Set();
|
|
102
|
+
const variables = new Set();
|
|
103
|
+
const imports = new Set();
|
|
104
|
+
// 1) Symbols (AST)
|
|
105
|
+
const symbols = extractSymbolsAST(code, "", "python");
|
|
106
|
+
for (const sym of symbols) {
|
|
107
|
+
switch (sym.type) {
|
|
108
|
+
case "function":
|
|
109
|
+
case "method":
|
|
110
|
+
functions.add(sym.name);
|
|
111
|
+
break;
|
|
112
|
+
case "class":
|
|
113
|
+
classes.add(sym.name);
|
|
114
|
+
break;
|
|
115
|
+
case "variable":
|
|
116
|
+
variables.add(sym.name);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// 2) Imports (AST) - normalize to base package (matches validator logic)
|
|
121
|
+
const astImports = extractImportsAST(code, "python");
|
|
122
|
+
for (const imp of astImports) {
|
|
123
|
+
const base = imp.module?.split(".")[0];
|
|
124
|
+
if (base)
|
|
125
|
+
imports.add(base);
|
|
126
|
+
}
|
|
127
|
+
logger.debug(`Found ${functions.size} functions, ${classes.size} classes (AST-based)`);
|
|
128
|
+
// For Python we also expose classFields for class attributes if present
|
|
129
|
+
const classFields = {};
|
|
130
|
+
for (const sym of symbols) {
|
|
131
|
+
if (sym.type === "variable" && sym.scope) {
|
|
132
|
+
if (!classFields[sym.scope])
|
|
133
|
+
classFields[sym.scope] = [];
|
|
134
|
+
classFields[sym.scope].push(sym.name);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
functions: Array.from(functions),
|
|
139
|
+
classes: Array.from(classes),
|
|
140
|
+
variables: Array.from(variables),
|
|
141
|
+
imports: Array.from(imports),
|
|
142
|
+
dependencies: [],
|
|
143
|
+
classFields,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build symbol table for Go
|
|
148
|
+
*/
|
|
149
|
+
async function buildGoSymbolTable(code) {
|
|
150
|
+
const symbolTable = {
|
|
151
|
+
functions: [],
|
|
152
|
+
classes: [],
|
|
153
|
+
variables: [],
|
|
154
|
+
imports: [],
|
|
155
|
+
dependencies: [],
|
|
156
|
+
};
|
|
157
|
+
// Extract functions
|
|
158
|
+
const functionPattern = /func\s+(\w+)\s*\(/g;
|
|
159
|
+
let match;
|
|
160
|
+
while ((match = functionPattern.exec(code)) !== null) {
|
|
161
|
+
symbolTable.functions.push(match[1]);
|
|
162
|
+
}
|
|
163
|
+
// Extract structs (Go's equivalent of classes)
|
|
164
|
+
const structPattern = /type\s+(\w+)\s+struct/g;
|
|
165
|
+
while ((match = structPattern.exec(code)) !== null) {
|
|
166
|
+
symbolTable.classes.push(match[1]);
|
|
167
|
+
}
|
|
168
|
+
// Extract imports
|
|
169
|
+
const importPattern = /import\s+.*?["']([^"']+)["']/g;
|
|
170
|
+
while ((match = importPattern.exec(code)) !== null) {
|
|
171
|
+
symbolTable.imports.push(match[1]);
|
|
172
|
+
}
|
|
173
|
+
logger.debug(`Found ${symbolTable.functions.length} functions, ${symbolTable.classes.length} structs`);
|
|
174
|
+
return symbolTable;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=symbolTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolTable.js","sourceRoot":"","sources":["../../src/analyzers/symbolTable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Consistency Checker
|
|
3
|
+
*
|
|
4
|
+
* Validates type consistency in AI-generated code
|
|
5
|
+
*
|
|
6
|
+
* @format
|
|
7
|
+
*/
|
|
8
|
+
import { SymbolTable, Issue } from "../types/tools.js";
|
|
9
|
+
/**
|
|
10
|
+
* Check type consistency in new code
|
|
11
|
+
*/
|
|
12
|
+
export declare function checkTypeConsistency(newCode: string, symbolTable: SymbolTable, language: string): Promise<Issue[]>;
|
|
13
|
+
//# sourceMappingURL=typeChecker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeChecker.d.ts","sourceRoot":"","sources":["../../src/analyzers/typeChecker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAKvD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,EAAE,CAAC,CAkElB"}
|