mcp-adr-analysis-server 2.1.19 → 2.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/config/ai-config.d.ts +54 -6
- package/dist/src/config/ai-config.d.ts.map +1 -1
- package/dist/src/config/ai-config.js +69 -6
- package/dist/src/config/ai-config.js.map +1 -1
- package/dist/src/config/ape-descriptions.d.ts +77 -0
- package/dist/src/config/ape-descriptions.d.ts.map +1 -0
- package/dist/src/config/ape-descriptions.js +177 -0
- package/dist/src/config/ape-descriptions.js.map +1 -0
- package/dist/src/index.d.ts +40 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +564 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.d.ts +5 -0
- package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.js +22 -1
- package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
- package/dist/src/prompts/prompt-catalog.d.ts +95 -0
- package/dist/src/prompts/prompt-catalog.d.ts.map +1 -0
- package/dist/src/prompts/prompt-catalog.js +300 -0
- package/dist/src/prompts/prompt-catalog.js.map +1 -0
- package/dist/src/resources/adrs-discovered-resource.d.ts +124 -0
- package/dist/src/resources/adrs-discovered-resource.d.ts.map +1 -0
- package/dist/src/resources/adrs-discovered-resource.js +174 -0
- package/dist/src/resources/adrs-discovered-resource.js.map +1 -0
- package/dist/src/resources/adrs-review-resource.d.ts +82 -0
- package/dist/src/resources/adrs-review-resource.d.ts.map +1 -0
- package/dist/src/resources/adrs-review-resource.js +160 -0
- package/dist/src/resources/adrs-review-resource.js.map +1 -0
- package/dist/src/resources/architectural-context-resource.d.ts +95 -0
- package/dist/src/resources/architectural-context-resource.d.ts.map +1 -0
- package/dist/src/resources/architectural-context-resource.js +428 -0
- package/dist/src/resources/architectural-context-resource.js.map +1 -0
- package/dist/src/resources/conversation-snapshot-resource.d.ts +92 -0
- package/dist/src/resources/conversation-snapshot-resource.d.ts.map +1 -0
- package/dist/src/resources/conversation-snapshot-resource.js +122 -0
- package/dist/src/resources/conversation-snapshot-resource.js.map +1 -0
- package/dist/src/resources/deployment-status-resource.js +1 -1
- package/dist/src/resources/deployment-status-resource.js.map +1 -1
- package/dist/src/resources/environment-analysis-resource.js +1 -1
- package/dist/src/resources/environment-analysis-resource.js.map +1 -1
- package/dist/src/resources/knowledge-graph-resource.d.ts +129 -0
- package/dist/src/resources/knowledge-graph-resource.d.ts.map +1 -0
- package/dist/src/resources/knowledge-graph-resource.js +217 -0
- package/dist/src/resources/knowledge-graph-resource.js.map +1 -0
- package/dist/src/resources/memory-expand-resource.d.ts +90 -0
- package/dist/src/resources/memory-expand-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-expand-resource.js +176 -0
- package/dist/src/resources/memory-expand-resource.js.map +1 -0
- package/dist/src/resources/memory-stats-resource.d.ts +77 -0
- package/dist/src/resources/memory-stats-resource.d.ts.map +1 -0
- package/dist/src/resources/memory-stats-resource.js +108 -0
- package/dist/src/resources/memory-stats-resource.js.map +1 -0
- package/dist/src/resources/project-metrics-resource.js +1 -1
- package/dist/src/resources/project-metrics-resource.js.map +1 -1
- package/dist/src/resources/resource-cache.d.ts.map +1 -1
- package/dist/src/resources/resource-cache.js +2 -1
- package/dist/src/resources/resource-cache.js.map +1 -1
- package/dist/src/resources/server-context-resource.d.ts +69 -0
- package/dist/src/resources/server-context-resource.d.ts.map +1 -0
- package/dist/src/resources/server-context-resource.js +104 -0
- package/dist/src/resources/server-context-resource.js.map +1 -0
- package/dist/src/resources/tool-catalog-resource.d.ts +122 -0
- package/dist/src/resources/tool-catalog-resource.d.ts.map +1 -0
- package/dist/src/resources/tool-catalog-resource.js +167 -0
- package/dist/src/resources/tool-catalog-resource.js.map +1 -0
- package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-bootstrap-validation-tool.js +7 -6
- package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +5 -0
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +40 -71
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +23 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
- package/dist/src/tools/bootstrap-validation-loop-tool.js +15 -5
- package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
- package/dist/src/tools/ce-mcp-tools.d.ts +291 -0
- package/dist/src/tools/ce-mcp-tools.d.ts.map +1 -0
- package/dist/src/tools/ce-mcp-tools.js +1188 -0
- package/dist/src/tools/ce-mcp-tools.js.map +1 -0
- package/dist/src/tools/content-masking-tool.d.ts +11 -0
- package/dist/src/tools/content-masking-tool.d.ts.map +1 -1
- package/dist/src/tools/content-masking-tool.js +13 -6
- package/dist/src/tools/content-masking-tool.js.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.d.ts +11 -0
- package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
- package/dist/src/tools/deployment-readiness-tool.js +10 -4
- package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
- package/dist/src/tools/environment-analysis-tool.d.ts +96 -1
- package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
- package/dist/src/tools/environment-analysis-tool.js +38 -46
- package/dist/src/tools/environment-analysis-tool.js.map +1 -1
- package/dist/src/tools/research-question-tool.d.ts.map +1 -1
- package/dist/src/tools/research-question-tool.js +3 -2
- package/dist/src/tools/research-question-tool.js.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.d.ts +5 -0
- package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
- package/dist/src/tools/review-existing-adrs-tool.js +123 -42
- package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
- package/dist/src/tools/rule-generation-tool.d.ts.map +1 -1
- package/dist/src/tools/rule-generation-tool.js +3 -5
- package/dist/src/tools/rule-generation-tool.js.map +1 -1
- package/dist/src/tools/search-codebase-tool.d.ts +148 -0
- package/dist/src/tools/search-codebase-tool.d.ts.map +1 -0
- package/dist/src/tools/search-codebase-tool.js +406 -0
- package/dist/src/tools/search-codebase-tool.js.map +1 -0
- package/dist/src/tools/smart-git-push-tool-v2.js +1 -1
- package/dist/src/tools/smart-git-push-tool-v2.js.map +1 -1
- package/dist/src/tools/tool-catalog.d.ts +134 -0
- package/dist/src/tools/tool-catalog.d.ts.map +1 -0
- package/dist/src/tools/tool-catalog.js +1431 -0
- package/dist/src/tools/tool-catalog.js.map +1 -0
- package/dist/src/tools/tool-chain-orchestrator.d.ts +11 -2
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
- package/dist/src/tools/tool-chain-orchestrator.js +11 -2
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
- package/dist/src/tools/tool-dispatcher.d.ts +98 -0
- package/dist/src/tools/tool-dispatcher.d.ts.map +1 -0
- package/dist/src/tools/tool-dispatcher.js +225 -0
- package/dist/src/tools/tool-dispatcher.js.map +1 -0
- package/dist/src/tools/tree-sitter-code-tools.d.ts +184 -0
- package/dist/src/tools/tree-sitter-code-tools.d.ts.map +1 -0
- package/dist/src/tools/tree-sitter-code-tools.js +642 -0
- package/dist/src/tools/tree-sitter-code-tools.js.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +22 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +20 -3
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
- package/dist/src/tools/update-knowledge-tool.d.ts +89 -0
- package/dist/src/tools/update-knowledge-tool.d.ts.map +1 -0
- package/dist/src/tools/update-knowledge-tool.js +222 -0
- package/dist/src/tools/update-knowledge-tool.js.map +1 -0
- package/dist/src/types/ce-mcp.d.ts +248 -0
- package/dist/src/types/ce-mcp.d.ts.map +1 -0
- package/dist/src/types/ce-mcp.js +27 -0
- package/dist/src/types/ce-mcp.js.map +1 -0
- package/dist/src/utils/adr-context-detector.js +1 -1
- package/dist/src/utils/adr-context-detector.js.map +1 -1
- package/dist/src/utils/adr-planning-task-integration.d.ts +260 -0
- package/dist/src/utils/adr-planning-task-integration.d.ts.map +1 -0
- package/dist/src/utils/adr-planning-task-integration.js +466 -0
- package/dist/src/utils/adr-planning-task-integration.js.map +1 -0
- package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -1
- package/dist/src/utils/adr-timeline-extractor.js +3 -2
- package/dist/src/utils/adr-timeline-extractor.js.map +1 -1
- package/dist/src/utils/ai-executor.d.ts +10 -0
- package/dist/src/utils/ai-executor.d.ts.map +1 -1
- package/dist/src/utils/ai-executor.js +14 -3
- package/dist/src/utils/ai-executor.js.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.d.ts +5 -0
- package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
- package/dist/src/utils/automatic-prompt-engineering.js +10 -90
- package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
- package/dist/src/utils/bootstrap-task-integration.d.ts +214 -0
- package/dist/src/utils/bootstrap-task-integration.d.ts.map +1 -0
- package/dist/src/utils/bootstrap-task-integration.js +365 -0
- package/dist/src/utils/bootstrap-task-integration.js.map +1 -0
- package/dist/src/utils/dag-executor.d.ts.map +1 -1
- package/dist/src/utils/dag-executor.js +48 -15
- package/dist/src/utils/dag-executor.js.map +1 -1
- package/dist/src/utils/deployment-task-integration.d.ts +260 -0
- package/dist/src/utils/deployment-task-integration.d.ts.map +1 -0
- package/dist/src/utils/deployment-task-integration.js +393 -0
- package/dist/src/utils/deployment-task-integration.js.map +1 -0
- package/dist/src/utils/dynamic-deployment-intelligence.js +1 -1
- package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -1
- package/dist/src/utils/enhanced-logging.d.ts +3 -0
- package/dist/src/utils/enhanced-logging.d.ts.map +1 -1
- package/dist/src/utils/enhanced-logging.js +9 -30
- package/dist/src/utils/enhanced-logging.js.map +1 -1
- package/dist/src/utils/environment-capability-registry.js +1 -1
- package/dist/src/utils/environment-capability-registry.js.map +1 -1
- package/dist/src/utils/file-system.d.ts.map +1 -1
- package/dist/src/utils/file-system.js +33 -3
- package/dist/src/utils/file-system.js.map +1 -1
- package/dist/src/utils/gitleaks-detector.js +1 -1
- package/dist/src/utils/gitleaks-detector.js.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.d.ts +13 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
- package/dist/src/utils/knowledge-graph-manager.js +13 -0
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
- package/dist/src/utils/prompt-execution.d.ts +29 -1
- package/dist/src/utils/prompt-execution.d.ts.map +1 -1
- package/dist/src/utils/prompt-execution.js +29 -1
- package/dist/src/utils/prompt-execution.js.map +1 -1
- package/dist/src/utils/research-orchestrator.d.ts +87 -1
- package/dist/src/utils/research-orchestrator.d.ts.map +1 -1
- package/dist/src/utils/research-orchestrator.js +121 -17
- package/dist/src/utils/research-orchestrator.js.map +1 -1
- package/dist/src/utils/research-task-integration.d.ts +297 -0
- package/dist/src/utils/research-task-integration.d.ts.map +1 -0
- package/dist/src/utils/research-task-integration.js +449 -0
- package/dist/src/utils/research-task-integration.js.map +1 -0
- package/dist/src/utils/ripgrep-wrapper.d.ts.map +1 -1
- package/dist/src/utils/ripgrep-wrapper.js +17 -3
- package/dist/src/utils/ripgrep-wrapper.js.map +1 -1
- package/dist/src/utils/sandbox-executor.d.ts +145 -0
- package/dist/src/utils/sandbox-executor.d.ts.map +1 -0
- package/dist/src/utils/sandbox-executor.js +642 -0
- package/dist/src/utils/sandbox-executor.js.map +1 -0
- package/dist/src/utils/server-context-generator.d.ts +5 -0
- package/dist/src/utils/server-context-generator.d.ts.map +1 -1
- package/dist/src/utils/server-context-generator.js +38 -0
- package/dist/src/utils/server-context-generator.js.map +1 -1
- package/dist/src/utils/task-manager.d.ts +239 -0
- package/dist/src/utils/task-manager.d.ts.map +1 -0
- package/dist/src/utils/task-manager.js +528 -0
- package/dist/src/utils/task-manager.js.map +1 -0
- package/dist/src/utils/task-persistence.d.ts +82 -0
- package/dist/src/utils/task-persistence.d.ts.map +1 -0
- package/dist/src/utils/task-persistence.js +248 -0
- package/dist/src/utils/task-persistence.js.map +1 -0
- package/dist/src/utils/test-aware-defaults.d.ts +57 -0
- package/dist/src/utils/test-aware-defaults.d.ts.map +1 -0
- package/dist/src/utils/test-aware-defaults.js +71 -0
- package/dist/src/utils/test-aware-defaults.js.map +1 -0
- package/dist/src/utils/tree-sitter-analyzer.d.ts +42 -5
- package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
- package/dist/src/utils/tree-sitter-analyzer.js +499 -17
- package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
- package/package.json +25 -20
- package/dist/src/tools/smart-git-push-tool.d.ts +0 -55
- package/dist/src/tools/smart-git-push-tool.d.ts.map +0 -1
- package/dist/src/tools/smart-git-push-tool.js +0 -1011
- package/dist/src/tools/smart-git-push-tool.js.map +0 -1
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Tree-sitter Integration for Enterprise DevOps Code Analysis
|
|
3
3
|
*
|
|
4
4
|
* Provides intelligent code analysis for multi-language DevOps stacks including:
|
|
5
|
-
* -
|
|
6
|
-
* - Terraform/HCL infrastructure
|
|
5
|
+
* - TypeScript/JavaScript applications
|
|
7
6
|
* - Python microservices
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
7
|
+
* - Java/Quarkus applications
|
|
8
|
+
* - Go cloud-native services
|
|
9
|
+
* - Rust system components
|
|
10
|
+
* - C/C++ native code
|
|
11
|
+
* - Ruby scripts and Rails apps
|
|
12
|
+
* - Ansible playbooks and roles
|
|
13
|
+
* - Kubernetes/Docker configurations
|
|
10
14
|
* - CI/CD pipelines
|
|
11
15
|
*
|
|
12
16
|
* Enterprise Features:
|
|
@@ -14,6 +18,9 @@
|
|
|
14
18
|
* - Architectural boundary validation
|
|
15
19
|
* - Multi-language dependency analysis
|
|
16
20
|
* - Security pattern recognition
|
|
21
|
+
*
|
|
22
|
+
* Note: Uses tree-sitter 0.21.x for maximum language compatibility.
|
|
23
|
+
* See ADR-017 for version strategy details.
|
|
17
24
|
*/
|
|
18
25
|
import { readFileSync } from 'fs';
|
|
19
26
|
import { extname, basename } from 'path';
|
|
@@ -36,15 +43,21 @@ export class TreeSitterAnalyzer {
|
|
|
36
43
|
return;
|
|
37
44
|
}
|
|
38
45
|
try {
|
|
39
|
-
// Initialize core parsers for enterprise stack
|
|
46
|
+
// Initialize core parsers for enterprise stack (tree-sitter 0.21.x compatible)
|
|
47
|
+
// See ADR-017 for version strategy details
|
|
40
48
|
await this.loadParser('typescript', 'tree-sitter-typescript');
|
|
41
49
|
await this.loadParser('javascript', 'tree-sitter-javascript');
|
|
42
50
|
await this.loadParser('python', 'tree-sitter-python');
|
|
51
|
+
await this.loadParser('java', 'tree-sitter-java');
|
|
52
|
+
await this.loadParser('go', 'tree-sitter-go');
|
|
53
|
+
await this.loadParser('rust', 'tree-sitter-rust');
|
|
54
|
+
await this.loadParser('c', 'tree-sitter-c');
|
|
55
|
+
await this.loadParser('cpp', 'tree-sitter-cpp');
|
|
56
|
+
await this.loadParser('ruby', 'tree-sitter-ruby');
|
|
43
57
|
await this.loadParser('yaml', 'tree-sitter-yaml');
|
|
44
58
|
await this.loadParser('json', 'tree-sitter-json');
|
|
45
59
|
await this.loadParser('bash', 'tree-sitter-bash');
|
|
46
|
-
await this.loadParser('
|
|
47
|
-
await this.loadParser('hcl', '@tree-sitter-grammars/tree-sitter-hcl');
|
|
60
|
+
await this.loadParser('css', 'tree-sitter-css');
|
|
48
61
|
this.initialized = true;
|
|
49
62
|
}
|
|
50
63
|
catch (error) {
|
|
@@ -62,12 +75,9 @@ export class TreeSitterAnalyzer {
|
|
|
62
75
|
const TreeSitter = TreeSitterModule.default || TreeSitterModule;
|
|
63
76
|
let Parser;
|
|
64
77
|
if (language === 'typescript') {
|
|
78
|
+
// TypeScript parser exports { typescript, tsx } objects
|
|
65
79
|
const tsModule = await import('tree-sitter-typescript');
|
|
66
|
-
Parser = tsModule.typescript;
|
|
67
|
-
}
|
|
68
|
-
else if (language === 'hcl') {
|
|
69
|
-
const hclModule = await import('@tree-sitter-grammars/tree-sitter-hcl');
|
|
70
|
-
Parser = hclModule.default || hclModule;
|
|
80
|
+
Parser = tsModule.typescript || tsModule.default?.typescript;
|
|
71
81
|
}
|
|
72
82
|
else {
|
|
73
83
|
const module = await import(packageName);
|
|
@@ -132,6 +142,27 @@ export class TreeSitterAnalyzer {
|
|
|
132
142
|
case '.py':
|
|
133
143
|
case '.pyi':
|
|
134
144
|
return 'python';
|
|
145
|
+
case '.java':
|
|
146
|
+
return 'java';
|
|
147
|
+
case '.go':
|
|
148
|
+
return 'go';
|
|
149
|
+
case '.rs':
|
|
150
|
+
return 'rust';
|
|
151
|
+
case '.c':
|
|
152
|
+
case '.h':
|
|
153
|
+
return 'c';
|
|
154
|
+
case '.cpp':
|
|
155
|
+
case '.cc':
|
|
156
|
+
case '.cxx':
|
|
157
|
+
case '.hpp':
|
|
158
|
+
case '.hxx':
|
|
159
|
+
return 'cpp';
|
|
160
|
+
case '.rb':
|
|
161
|
+
case '.rake':
|
|
162
|
+
case '.gemspec':
|
|
163
|
+
return 'ruby';
|
|
164
|
+
case '.css':
|
|
165
|
+
return 'css';
|
|
135
166
|
case '.yml':
|
|
136
167
|
case '.yaml':
|
|
137
168
|
return 'yaml';
|
|
@@ -142,6 +173,8 @@ export class TreeSitterAnalyzer {
|
|
|
142
173
|
return 'bash';
|
|
143
174
|
case '.tf':
|
|
144
175
|
case '.tfvars':
|
|
176
|
+
// HCL support removed in 0.21.x downgrade - see ADR-017
|
|
177
|
+
// Falls back to text-based analysis
|
|
145
178
|
return 'hcl';
|
|
146
179
|
default:
|
|
147
180
|
return 'text';
|
|
@@ -172,12 +205,32 @@ export class TreeSitterAnalyzer {
|
|
|
172
205
|
case 'javascript':
|
|
173
206
|
await this.analyzeJavaScript(tree.rootNode, lines, result);
|
|
174
207
|
break;
|
|
208
|
+
case 'java':
|
|
209
|
+
await this.analyzeJava(tree.rootNode, lines, result);
|
|
210
|
+
break;
|
|
211
|
+
case 'go':
|
|
212
|
+
await this.analyzeGo(tree.rootNode, lines, result);
|
|
213
|
+
break;
|
|
214
|
+
case 'rust':
|
|
215
|
+
await this.analyzeRust(tree.rootNode, lines, result);
|
|
216
|
+
break;
|
|
217
|
+
case 'c':
|
|
218
|
+
case 'cpp':
|
|
219
|
+
await this.analyzeCCpp(tree.rootNode, lines, result);
|
|
220
|
+
break;
|
|
221
|
+
case 'ruby':
|
|
222
|
+
await this.analyzeRuby(tree.rootNode, lines, result);
|
|
223
|
+
break;
|
|
224
|
+
case 'css':
|
|
225
|
+
await this.analyzeCSS(tree.rootNode, lines, result);
|
|
226
|
+
break;
|
|
175
227
|
case 'yaml':
|
|
176
228
|
await this.analyzeYAML(tree.rootNode, lines, result, filePath);
|
|
177
229
|
break;
|
|
178
230
|
case 'hcl':
|
|
179
|
-
|
|
180
|
-
|
|
231
|
+
// HCL parser removed in 0.21.x - use fallback regex analysis
|
|
232
|
+
// See ADR-017 for details
|
|
233
|
+
return this.fallbackAnalysis(filePath, content, language);
|
|
181
234
|
case 'dockerfile':
|
|
182
235
|
await this.analyzeDockerfile(tree.rootNode, lines, result);
|
|
183
236
|
break;
|
|
@@ -335,8 +388,11 @@ export class TreeSitterAnalyzer {
|
|
|
335
388
|
}
|
|
336
389
|
/**
|
|
337
390
|
* Terraform/HCL analysis for infrastructure
|
|
391
|
+
* Note: HCL parser removed in 0.21.x downgrade - see ADR-017
|
|
392
|
+
* Kept for potential future use when tree-sitter-hcl becomes 0.21.x compatible
|
|
338
393
|
*/
|
|
339
|
-
|
|
394
|
+
// @ts-expect-error Intentionally unused - kept for future HCL support
|
|
395
|
+
async _analyzeTerraform(node, _lines, result) {
|
|
340
396
|
// Find resource blocks
|
|
341
397
|
const resources = node.descendantsOfType('block');
|
|
342
398
|
for (const resource of resources) {
|
|
@@ -409,6 +465,420 @@ export class TreeSitterAnalyzer {
|
|
|
409
465
|
}
|
|
410
466
|
}
|
|
411
467
|
}
|
|
468
|
+
/**
|
|
469
|
+
* Java analysis for enterprise applications (Quarkus, Spring)
|
|
470
|
+
*/
|
|
471
|
+
async analyzeJava(node, _lines, result) {
|
|
472
|
+
// Find imports
|
|
473
|
+
const imports = node.descendantsOfType('import_declaration');
|
|
474
|
+
for (const importNode of imports) {
|
|
475
|
+
const moduleNode = importNode.childForFieldName('name');
|
|
476
|
+
if (moduleNode) {
|
|
477
|
+
result.imports.push({
|
|
478
|
+
module: moduleNode.text,
|
|
479
|
+
type: 'import',
|
|
480
|
+
location: {
|
|
481
|
+
line: importNode.startPosition.row + 1,
|
|
482
|
+
column: importNode.startPosition.column,
|
|
483
|
+
},
|
|
484
|
+
isExternal: true,
|
|
485
|
+
isDangerous: this.checkDangerousImport(moduleNode.text, 'java'),
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// Find method declarations
|
|
490
|
+
const methods = node.descendantsOfType('method_declaration');
|
|
491
|
+
for (const methodNode of methods) {
|
|
492
|
+
const nameNode = methodNode.childForFieldName('name');
|
|
493
|
+
if (nameNode) {
|
|
494
|
+
result.functions.push({
|
|
495
|
+
name: nameNode.text,
|
|
496
|
+
type: 'method',
|
|
497
|
+
parameters: this.extractJavaParameters(methodNode),
|
|
498
|
+
location: {
|
|
499
|
+
line: methodNode.startPosition.row + 1,
|
|
500
|
+
column: methodNode.startPosition.column,
|
|
501
|
+
},
|
|
502
|
+
complexity: this.calculateComplexity(methodNode),
|
|
503
|
+
securitySensitive: this.isSecuritySensitive(nameNode.text),
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
// Find field declarations (potential secrets)
|
|
508
|
+
const fields = node.descendantsOfType('field_declaration');
|
|
509
|
+
for (const field of fields) {
|
|
510
|
+
const declarator = field.descendantsOfType('variable_declarator')[0];
|
|
511
|
+
if (declarator) {
|
|
512
|
+
const nameNode = declarator.childForFieldName('name');
|
|
513
|
+
const valueNode = declarator.childForFieldName('value');
|
|
514
|
+
if (nameNode) {
|
|
515
|
+
const varValue = valueNode?.text || '';
|
|
516
|
+
result.variables.push({
|
|
517
|
+
name: nameNode.text,
|
|
518
|
+
type: 'var',
|
|
519
|
+
...(varValue && { value: varValue }),
|
|
520
|
+
location: {
|
|
521
|
+
line: field.startPosition.row + 1,
|
|
522
|
+
column: field.startPosition.column,
|
|
523
|
+
},
|
|
524
|
+
isSensitive: this.isSensitiveVariable(nameNode.text, varValue),
|
|
525
|
+
scope: 'class',
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
extractJavaParameters(methodNode) {
|
|
532
|
+
const paramsNode = methodNode.childForFieldName('parameters');
|
|
533
|
+
if (!paramsNode)
|
|
534
|
+
return [];
|
|
535
|
+
return paramsNode.namedChildren
|
|
536
|
+
.filter(child => child.type === 'formal_parameter')
|
|
537
|
+
.map(child => {
|
|
538
|
+
const nameNode = child.childForFieldName('name');
|
|
539
|
+
return nameNode?.text || '';
|
|
540
|
+
})
|
|
541
|
+
.filter(name => name !== '');
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Go analysis for cloud-native services
|
|
545
|
+
*/
|
|
546
|
+
async analyzeGo(node, _lines, result) {
|
|
547
|
+
// Find imports
|
|
548
|
+
const importDecls = node.descendantsOfType('import_declaration');
|
|
549
|
+
for (const importDecl of importDecls) {
|
|
550
|
+
const specs = importDecl.descendantsOfType('import_spec');
|
|
551
|
+
for (const spec of specs) {
|
|
552
|
+
const pathNode = spec.childForFieldName('path');
|
|
553
|
+
if (pathNode) {
|
|
554
|
+
const module = pathNode.text.replace(/"/g, '');
|
|
555
|
+
result.imports.push({
|
|
556
|
+
module,
|
|
557
|
+
type: 'import',
|
|
558
|
+
location: {
|
|
559
|
+
line: spec.startPosition.row + 1,
|
|
560
|
+
column: spec.startPosition.column,
|
|
561
|
+
},
|
|
562
|
+
isExternal: !module.startsWith('./') && !module.startsWith('../'),
|
|
563
|
+
isDangerous: this.checkDangerousImport(module, 'go'),
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
// Find function declarations
|
|
569
|
+
const functions = node.descendantsOfType('function_declaration');
|
|
570
|
+
for (const funcNode of functions) {
|
|
571
|
+
const nameNode = funcNode.childForFieldName('name');
|
|
572
|
+
if (nameNode) {
|
|
573
|
+
result.functions.push({
|
|
574
|
+
name: nameNode.text,
|
|
575
|
+
type: 'function',
|
|
576
|
+
parameters: this.extractGoParameters(funcNode),
|
|
577
|
+
location: {
|
|
578
|
+
line: funcNode.startPosition.row + 1,
|
|
579
|
+
column: funcNode.startPosition.column,
|
|
580
|
+
},
|
|
581
|
+
complexity: this.calculateComplexity(funcNode),
|
|
582
|
+
securitySensitive: this.isSecuritySensitive(nameNode.text),
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
// Find variable declarations
|
|
587
|
+
const varDecls = node.descendantsOfType('var_declaration');
|
|
588
|
+
for (const varDecl of varDecls) {
|
|
589
|
+
const specs = varDecl.descendantsOfType('var_spec');
|
|
590
|
+
for (const spec of specs) {
|
|
591
|
+
const nameNode = spec.childForFieldName('name');
|
|
592
|
+
const valueNode = spec.childForFieldName('value');
|
|
593
|
+
if (nameNode) {
|
|
594
|
+
const varValue = valueNode?.text || '';
|
|
595
|
+
result.variables.push({
|
|
596
|
+
name: nameNode.text,
|
|
597
|
+
type: 'var',
|
|
598
|
+
...(varValue && { value: varValue }),
|
|
599
|
+
location: {
|
|
600
|
+
line: spec.startPosition.row + 1,
|
|
601
|
+
column: spec.startPosition.column,
|
|
602
|
+
},
|
|
603
|
+
isSensitive: this.isSensitiveVariable(nameNode.text, varValue),
|
|
604
|
+
scope: 'package',
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
extractGoParameters(funcNode) {
|
|
611
|
+
const paramsNode = funcNode.childForFieldName('parameters');
|
|
612
|
+
if (!paramsNode)
|
|
613
|
+
return [];
|
|
614
|
+
return paramsNode.namedChildren
|
|
615
|
+
.filter(child => child.type === 'parameter_declaration')
|
|
616
|
+
.map(child => {
|
|
617
|
+
const nameNode = child.childForFieldName('name');
|
|
618
|
+
return nameNode?.text || '';
|
|
619
|
+
})
|
|
620
|
+
.filter(name => name !== '');
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Rust analysis for system components
|
|
624
|
+
*/
|
|
625
|
+
async analyzeRust(node, _lines, result) {
|
|
626
|
+
// Find use declarations (imports)
|
|
627
|
+
const useDecls = node.descendantsOfType('use_declaration');
|
|
628
|
+
for (const useDecl of useDecls) {
|
|
629
|
+
result.imports.push({
|
|
630
|
+
module: useDecl.text.replace(/^use\s+/, '').replace(/;$/, ''),
|
|
631
|
+
type: 'import',
|
|
632
|
+
location: {
|
|
633
|
+
line: useDecl.startPosition.row + 1,
|
|
634
|
+
column: useDecl.startPosition.column,
|
|
635
|
+
},
|
|
636
|
+
isExternal: !useDecl.text.includes('crate::'),
|
|
637
|
+
isDangerous: this.checkDangerousImport(useDecl.text, 'rust'),
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
// Find function declarations
|
|
641
|
+
const functions = node.descendantsOfType('function_item');
|
|
642
|
+
for (const funcNode of functions) {
|
|
643
|
+
const nameNode = funcNode.childForFieldName('name');
|
|
644
|
+
if (nameNode) {
|
|
645
|
+
result.functions.push({
|
|
646
|
+
name: nameNode.text,
|
|
647
|
+
type: 'function',
|
|
648
|
+
parameters: this.extractRustParameters(funcNode),
|
|
649
|
+
location: {
|
|
650
|
+
line: funcNode.startPosition.row + 1,
|
|
651
|
+
column: funcNode.startPosition.column,
|
|
652
|
+
},
|
|
653
|
+
complexity: this.calculateComplexity(funcNode),
|
|
654
|
+
securitySensitive: this.isSecuritySensitive(nameNode.text) || funcNode.text.includes('unsafe'),
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
// Check for unsafe blocks
|
|
659
|
+
const unsafeBlocks = node.descendantsOfType('unsafe_block');
|
|
660
|
+
for (const block of unsafeBlocks) {
|
|
661
|
+
result.securityIssues.push({
|
|
662
|
+
type: 'dangerous_function',
|
|
663
|
+
severity: 'medium',
|
|
664
|
+
message: 'Unsafe block detected',
|
|
665
|
+
location: {
|
|
666
|
+
line: block.startPosition.row + 1,
|
|
667
|
+
column: block.startPosition.column,
|
|
668
|
+
},
|
|
669
|
+
suggestion: 'Review unsafe code for memory safety issues',
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
extractRustParameters(funcNode) {
|
|
674
|
+
const paramsNode = funcNode.childForFieldName('parameters');
|
|
675
|
+
if (!paramsNode)
|
|
676
|
+
return [];
|
|
677
|
+
return paramsNode.namedChildren
|
|
678
|
+
.filter(child => child.type === 'parameter')
|
|
679
|
+
.map(child => {
|
|
680
|
+
const patternNode = child.childForFieldName('pattern');
|
|
681
|
+
return patternNode?.text || '';
|
|
682
|
+
})
|
|
683
|
+
.filter(name => name !== '');
|
|
684
|
+
}
|
|
685
|
+
/**
|
|
686
|
+
* C/C++ analysis for native code
|
|
687
|
+
*/
|
|
688
|
+
async analyzeCCpp(node, _lines, result) {
|
|
689
|
+
// Find includes
|
|
690
|
+
const includes = node.descendantsOfType('preproc_include');
|
|
691
|
+
for (const includeNode of includes) {
|
|
692
|
+
const pathNode = includeNode.descendantsOfType('string_literal')[0] ||
|
|
693
|
+
includeNode.descendantsOfType('system_lib_string')[0];
|
|
694
|
+
if (pathNode) {
|
|
695
|
+
result.imports.push({
|
|
696
|
+
module: pathNode.text.replace(/[<>"]/g, ''),
|
|
697
|
+
type: 'include',
|
|
698
|
+
location: {
|
|
699
|
+
line: includeNode.startPosition.row + 1,
|
|
700
|
+
column: includeNode.startPosition.column,
|
|
701
|
+
},
|
|
702
|
+
isExternal: pathNode.type === 'system_lib_string',
|
|
703
|
+
isDangerous: this.checkDangerousImport(pathNode.text, 'c'),
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// Find function definitions
|
|
708
|
+
const functions = node.descendantsOfType('function_definition');
|
|
709
|
+
for (const funcNode of functions) {
|
|
710
|
+
const declaratorNode = funcNode.childForFieldName('declarator');
|
|
711
|
+
if (declaratorNode) {
|
|
712
|
+
const nameNode = declaratorNode.childForFieldName('declarator');
|
|
713
|
+
const name = nameNode?.text || declaratorNode.text.split('(')[0] || 'unknown';
|
|
714
|
+
result.functions.push({
|
|
715
|
+
name,
|
|
716
|
+
type: 'function',
|
|
717
|
+
parameters: [],
|
|
718
|
+
location: {
|
|
719
|
+
line: funcNode.startPosition.row + 1,
|
|
720
|
+
column: funcNode.startPosition.column,
|
|
721
|
+
},
|
|
722
|
+
complexity: this.calculateComplexity(funcNode),
|
|
723
|
+
securitySensitive: this.isSecuritySensitive(name),
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
// Check for dangerous functions
|
|
728
|
+
const dangerousFunctions = ['strcpy', 'strcat', 'sprintf', 'gets', 'scanf'];
|
|
729
|
+
const calls = node.descendantsOfType('call_expression');
|
|
730
|
+
for (const call of calls) {
|
|
731
|
+
const funcName = call.children[0]?.text;
|
|
732
|
+
if (funcName && dangerousFunctions.includes(funcName)) {
|
|
733
|
+
result.securityIssues.push({
|
|
734
|
+
type: 'dangerous_function',
|
|
735
|
+
severity: 'high',
|
|
736
|
+
message: `Dangerous function ${funcName} detected`,
|
|
737
|
+
location: {
|
|
738
|
+
line: call.startPosition.row + 1,
|
|
739
|
+
column: call.startPosition.column,
|
|
740
|
+
},
|
|
741
|
+
suggestion: `Use safe alternatives (${funcName}_s or snprintf)`,
|
|
742
|
+
});
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
/**
|
|
747
|
+
* Ruby analysis for scripts and Rails apps
|
|
748
|
+
*/
|
|
749
|
+
async analyzeRuby(node, _lines, result) {
|
|
750
|
+
// Find requires
|
|
751
|
+
const calls = node.descendantsOfType('call');
|
|
752
|
+
for (const call of calls) {
|
|
753
|
+
const methodNode = call.childForFieldName('method');
|
|
754
|
+
if (methodNode && (methodNode.text === 'require' || methodNode.text === 'require_relative')) {
|
|
755
|
+
const argsNode = call.childForFieldName('arguments');
|
|
756
|
+
const argNode = argsNode?.namedChildren[0];
|
|
757
|
+
if (argNode) {
|
|
758
|
+
result.imports.push({
|
|
759
|
+
module: argNode.text.replace(/['"]/g, ''),
|
|
760
|
+
type: methodNode.text === 'require' ? 'require' : 'require',
|
|
761
|
+
location: {
|
|
762
|
+
line: call.startPosition.row + 1,
|
|
763
|
+
column: call.startPosition.column,
|
|
764
|
+
},
|
|
765
|
+
isExternal: methodNode.text === 'require',
|
|
766
|
+
isDangerous: this.checkDangerousImport(argNode.text, 'ruby'),
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
// Find method definitions
|
|
772
|
+
const methods = node.descendantsOfType('method');
|
|
773
|
+
for (const methodNode of methods) {
|
|
774
|
+
const nameNode = methodNode.childForFieldName('name');
|
|
775
|
+
if (nameNode) {
|
|
776
|
+
result.functions.push({
|
|
777
|
+
name: nameNode.text,
|
|
778
|
+
type: 'method',
|
|
779
|
+
parameters: this.extractRubyParameters(methodNode),
|
|
780
|
+
location: {
|
|
781
|
+
line: methodNode.startPosition.row + 1,
|
|
782
|
+
column: methodNode.startPosition.column,
|
|
783
|
+
},
|
|
784
|
+
complexity: this.calculateComplexity(methodNode),
|
|
785
|
+
securitySensitive: this.isSecuritySensitive(nameNode.text),
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
// Find assignments (potential secrets)
|
|
790
|
+
const assignments = node.descendantsOfType('assignment');
|
|
791
|
+
for (const assignment of assignments) {
|
|
792
|
+
const leftNode = assignment.children[0];
|
|
793
|
+
const rightNode = assignment.children[2];
|
|
794
|
+
if (leftNode && rightNode) {
|
|
795
|
+
result.variables.push({
|
|
796
|
+
name: leftNode.text,
|
|
797
|
+
type: 'var',
|
|
798
|
+
value: rightNode.text,
|
|
799
|
+
location: {
|
|
800
|
+
line: assignment.startPosition.row + 1,
|
|
801
|
+
column: assignment.startPosition.column,
|
|
802
|
+
},
|
|
803
|
+
isSensitive: this.isSensitiveVariable(leftNode.text, rightNode.text),
|
|
804
|
+
scope: 'local',
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
extractRubyParameters(methodNode) {
|
|
810
|
+
const paramsNode = methodNode.childForFieldName('parameters');
|
|
811
|
+
if (!paramsNode)
|
|
812
|
+
return [];
|
|
813
|
+
return paramsNode.namedChildren
|
|
814
|
+
.filter(child => child.type === 'identifier' ||
|
|
815
|
+
child.type === 'optional_parameter' ||
|
|
816
|
+
child.type === 'keyword_parameter')
|
|
817
|
+
.map(child => child.text)
|
|
818
|
+
.filter(name => name !== '');
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* CSS analysis for stylesheet security
|
|
822
|
+
*/
|
|
823
|
+
async analyzeCSS(node, _lines, result) {
|
|
824
|
+
// Find @import rules
|
|
825
|
+
const imports = node.descendantsOfType('import_statement');
|
|
826
|
+
for (const importNode of imports) {
|
|
827
|
+
const urlNode = importNode.descendantsOfType('call_expression')[0];
|
|
828
|
+
const stringNode = importNode.descendantsOfType('string_value')[0];
|
|
829
|
+
const target = urlNode?.text || stringNode?.text || '';
|
|
830
|
+
if (target) {
|
|
831
|
+
result.imports.push({
|
|
832
|
+
module: target.replace(/['"url()]/g, ''),
|
|
833
|
+
type: 'import',
|
|
834
|
+
location: {
|
|
835
|
+
line: importNode.startPosition.row + 1,
|
|
836
|
+
column: importNode.startPosition.column,
|
|
837
|
+
},
|
|
838
|
+
isExternal: target.includes('http') || target.includes('//'),
|
|
839
|
+
isDangerous: target.includes('http:') && !target.includes('https:'),
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
// Check for potentially dangerous CSS
|
|
844
|
+
const declarations = node.descendantsOfType('declaration');
|
|
845
|
+
for (const decl of declarations) {
|
|
846
|
+
const propNode = decl.childForFieldName('property');
|
|
847
|
+
const valueNode = decl.childForFieldName('value');
|
|
848
|
+
if (propNode && valueNode) {
|
|
849
|
+
const propName = propNode.text;
|
|
850
|
+
const propValue = valueNode.text;
|
|
851
|
+
// Check for dangerous expressions
|
|
852
|
+
if (propValue.includes('expression(') || propValue.includes('javascript:')) {
|
|
853
|
+
result.securityIssues.push({
|
|
854
|
+
type: 'insecure_config',
|
|
855
|
+
severity: 'high',
|
|
856
|
+
message: 'Potentially dangerous CSS expression detected',
|
|
857
|
+
location: {
|
|
858
|
+
line: decl.startPosition.row + 1,
|
|
859
|
+
column: decl.startPosition.column,
|
|
860
|
+
},
|
|
861
|
+
suggestion: 'Remove JavaScript expressions from CSS',
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
// Check for external URLs without HTTPS
|
|
865
|
+
if (propValue.includes('url(') &&
|
|
866
|
+
propValue.includes('http:') &&
|
|
867
|
+
!propValue.includes('https:')) {
|
|
868
|
+
result.securityIssues.push({
|
|
869
|
+
type: 'insecure_config',
|
|
870
|
+
severity: 'medium',
|
|
871
|
+
message: `CSS property ${propName} references non-HTTPS URL`,
|
|
872
|
+
location: {
|
|
873
|
+
line: decl.startPosition.row + 1,
|
|
874
|
+
column: decl.startPosition.column,
|
|
875
|
+
},
|
|
876
|
+
suggestion: 'Use HTTPS for external resources',
|
|
877
|
+
});
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
412
882
|
/**
|
|
413
883
|
* JSON analysis for configuration files
|
|
414
884
|
*/
|
|
@@ -545,8 +1015,20 @@ export class TreeSitterAnalyzer {
|
|
|
545
1015
|
// Helper methods
|
|
546
1016
|
checkDangerousImport(importText, language) {
|
|
547
1017
|
const dangerousModules = {
|
|
548
|
-
python: ['eval', 'exec', 'subprocess', 'os.system'],
|
|
549
|
-
javascript: ['eval', 'child_process', 'vm'],
|
|
1018
|
+
python: ['eval', 'exec', 'subprocess', 'os.system', 'pickle', 'marshal'],
|
|
1019
|
+
javascript: ['eval', 'child_process', 'vm', 'unsafe-eval'],
|
|
1020
|
+
java: [
|
|
1021
|
+
'Runtime.exec',
|
|
1022
|
+
'ProcessBuilder',
|
|
1023
|
+
'ScriptEngine',
|
|
1024
|
+
'Reflection',
|
|
1025
|
+
'javax.script',
|
|
1026
|
+
'java.lang.invoke',
|
|
1027
|
+
],
|
|
1028
|
+
go: ['os/exec', 'unsafe', 'syscall', 'reflect'],
|
|
1029
|
+
rust: ['std::process::Command', 'libc', 'std::ffi', 'std::mem::transmute'],
|
|
1030
|
+
c: ['system', 'exec', 'popen', 'dlopen'],
|
|
1031
|
+
ruby: ['eval', 'system', 'exec', 'backtick', 'Open3', 'Kernel.system'],
|
|
550
1032
|
};
|
|
551
1033
|
const dangerous = dangerousModules[language] || [];
|
|
552
1034
|
return dangerous.some(module => importText.includes(module));
|