mcp-adr-analysis-server 2.1.20 → 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.
Files changed (226) hide show
  1. package/README.md +1 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/config/ai-config.d.ts +54 -6
  4. package/dist/src/config/ai-config.d.ts.map +1 -1
  5. package/dist/src/config/ai-config.js +69 -6
  6. package/dist/src/config/ai-config.js.map +1 -1
  7. package/dist/src/config/ape-descriptions.d.ts +77 -0
  8. package/dist/src/config/ape-descriptions.d.ts.map +1 -0
  9. package/dist/src/config/ape-descriptions.js +177 -0
  10. package/dist/src/config/ape-descriptions.js.map +1 -0
  11. package/dist/src/index.d.ts +40 -0
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +564 -8
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/prompts/adr-suggestion-prompts.d.ts +5 -0
  16. package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
  17. package/dist/src/prompts/adr-suggestion-prompts.js +22 -1
  18. package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
  19. package/dist/src/prompts/prompt-catalog.d.ts +95 -0
  20. package/dist/src/prompts/prompt-catalog.d.ts.map +1 -0
  21. package/dist/src/prompts/prompt-catalog.js +300 -0
  22. package/dist/src/prompts/prompt-catalog.js.map +1 -0
  23. package/dist/src/resources/adrs-discovered-resource.d.ts +124 -0
  24. package/dist/src/resources/adrs-discovered-resource.d.ts.map +1 -0
  25. package/dist/src/resources/adrs-discovered-resource.js +174 -0
  26. package/dist/src/resources/adrs-discovered-resource.js.map +1 -0
  27. package/dist/src/resources/adrs-review-resource.d.ts +82 -0
  28. package/dist/src/resources/adrs-review-resource.d.ts.map +1 -0
  29. package/dist/src/resources/adrs-review-resource.js +160 -0
  30. package/dist/src/resources/adrs-review-resource.js.map +1 -0
  31. package/dist/src/resources/architectural-context-resource.d.ts +95 -0
  32. package/dist/src/resources/architectural-context-resource.d.ts.map +1 -0
  33. package/dist/src/resources/architectural-context-resource.js +428 -0
  34. package/dist/src/resources/architectural-context-resource.js.map +1 -0
  35. package/dist/src/resources/conversation-snapshot-resource.d.ts +92 -0
  36. package/dist/src/resources/conversation-snapshot-resource.d.ts.map +1 -0
  37. package/dist/src/resources/conversation-snapshot-resource.js +122 -0
  38. package/dist/src/resources/conversation-snapshot-resource.js.map +1 -0
  39. package/dist/src/resources/deployment-status-resource.js +1 -1
  40. package/dist/src/resources/deployment-status-resource.js.map +1 -1
  41. package/dist/src/resources/environment-analysis-resource.js +1 -1
  42. package/dist/src/resources/environment-analysis-resource.js.map +1 -1
  43. package/dist/src/resources/knowledge-graph-resource.d.ts +129 -0
  44. package/dist/src/resources/knowledge-graph-resource.d.ts.map +1 -0
  45. package/dist/src/resources/knowledge-graph-resource.js +217 -0
  46. package/dist/src/resources/knowledge-graph-resource.js.map +1 -0
  47. package/dist/src/resources/memory-expand-resource.d.ts +90 -0
  48. package/dist/src/resources/memory-expand-resource.d.ts.map +1 -0
  49. package/dist/src/resources/memory-expand-resource.js +176 -0
  50. package/dist/src/resources/memory-expand-resource.js.map +1 -0
  51. package/dist/src/resources/memory-stats-resource.d.ts +77 -0
  52. package/dist/src/resources/memory-stats-resource.d.ts.map +1 -0
  53. package/dist/src/resources/memory-stats-resource.js +108 -0
  54. package/dist/src/resources/memory-stats-resource.js.map +1 -0
  55. package/dist/src/resources/project-metrics-resource.js +1 -1
  56. package/dist/src/resources/project-metrics-resource.js.map +1 -1
  57. package/dist/src/resources/resource-cache.d.ts.map +1 -1
  58. package/dist/src/resources/resource-cache.js +2 -1
  59. package/dist/src/resources/resource-cache.js.map +1 -1
  60. package/dist/src/resources/server-context-resource.d.ts +69 -0
  61. package/dist/src/resources/server-context-resource.d.ts.map +1 -0
  62. package/dist/src/resources/server-context-resource.js +104 -0
  63. package/dist/src/resources/server-context-resource.js.map +1 -0
  64. package/dist/src/resources/tool-catalog-resource.d.ts +122 -0
  65. package/dist/src/resources/tool-catalog-resource.d.ts.map +1 -0
  66. package/dist/src/resources/tool-catalog-resource.js +167 -0
  67. package/dist/src/resources/tool-catalog-resource.js.map +1 -0
  68. package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
  69. package/dist/src/tools/adr-bootstrap-validation-tool.js +7 -6
  70. package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
  71. package/dist/src/tools/adr-suggestion-tool.d.ts +5 -0
  72. package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
  73. package/dist/src/tools/adr-suggestion-tool.js +40 -71
  74. package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
  75. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +23 -1
  76. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
  77. package/dist/src/tools/bootstrap-validation-loop-tool.js +15 -5
  78. package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
  79. package/dist/src/tools/ce-mcp-tools.d.ts +291 -0
  80. package/dist/src/tools/ce-mcp-tools.d.ts.map +1 -0
  81. package/dist/src/tools/ce-mcp-tools.js +1188 -0
  82. package/dist/src/tools/ce-mcp-tools.js.map +1 -0
  83. package/dist/src/tools/content-masking-tool.d.ts +11 -0
  84. package/dist/src/tools/content-masking-tool.d.ts.map +1 -1
  85. package/dist/src/tools/content-masking-tool.js +13 -6
  86. package/dist/src/tools/content-masking-tool.js.map +1 -1
  87. package/dist/src/tools/deployment-readiness-tool.d.ts +11 -0
  88. package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
  89. package/dist/src/tools/deployment-readiness-tool.js +10 -4
  90. package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
  91. package/dist/src/tools/environment-analysis-tool.d.ts +96 -1
  92. package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
  93. package/dist/src/tools/environment-analysis-tool.js +38 -46
  94. package/dist/src/tools/environment-analysis-tool.js.map +1 -1
  95. package/dist/src/tools/research-question-tool.d.ts.map +1 -1
  96. package/dist/src/tools/research-question-tool.js +3 -2
  97. package/dist/src/tools/research-question-tool.js.map +1 -1
  98. package/dist/src/tools/review-existing-adrs-tool.d.ts +5 -0
  99. package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
  100. package/dist/src/tools/review-existing-adrs-tool.js +123 -42
  101. package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
  102. package/dist/src/tools/rule-generation-tool.d.ts.map +1 -1
  103. package/dist/src/tools/rule-generation-tool.js +3 -5
  104. package/dist/src/tools/rule-generation-tool.js.map +1 -1
  105. package/dist/src/tools/search-codebase-tool.d.ts +148 -0
  106. package/dist/src/tools/search-codebase-tool.d.ts.map +1 -0
  107. package/dist/src/tools/search-codebase-tool.js +406 -0
  108. package/dist/src/tools/search-codebase-tool.js.map +1 -0
  109. package/dist/src/tools/smart-git-push-tool-v2.js +1 -1
  110. package/dist/src/tools/smart-git-push-tool-v2.js.map +1 -1
  111. package/dist/src/tools/tool-catalog.d.ts +134 -0
  112. package/dist/src/tools/tool-catalog.d.ts.map +1 -0
  113. package/dist/src/tools/tool-catalog.js +1431 -0
  114. package/dist/src/tools/tool-catalog.js.map +1 -0
  115. package/dist/src/tools/tool-chain-orchestrator.d.ts +11 -2
  116. package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
  117. package/dist/src/tools/tool-chain-orchestrator.js +11 -2
  118. package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
  119. package/dist/src/tools/tool-dispatcher.d.ts +98 -0
  120. package/dist/src/tools/tool-dispatcher.d.ts.map +1 -0
  121. package/dist/src/tools/tool-dispatcher.js +225 -0
  122. package/dist/src/tools/tool-dispatcher.js.map +1 -0
  123. package/dist/src/tools/tree-sitter-code-tools.d.ts +184 -0
  124. package/dist/src/tools/tree-sitter-code-tools.d.ts.map +1 -0
  125. package/dist/src/tools/tree-sitter-code-tools.js +642 -0
  126. package/dist/src/tools/tree-sitter-code-tools.js.map +1 -0
  127. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +22 -0
  128. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
  129. package/dist/src/tools/troubleshoot-guided-workflow-tool.js +20 -3
  130. package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
  131. package/dist/src/tools/update-knowledge-tool.d.ts +89 -0
  132. package/dist/src/tools/update-knowledge-tool.d.ts.map +1 -0
  133. package/dist/src/tools/update-knowledge-tool.js +222 -0
  134. package/dist/src/tools/update-knowledge-tool.js.map +1 -0
  135. package/dist/src/types/ce-mcp.d.ts +248 -0
  136. package/dist/src/types/ce-mcp.d.ts.map +1 -0
  137. package/dist/src/types/ce-mcp.js +27 -0
  138. package/dist/src/types/ce-mcp.js.map +1 -0
  139. package/dist/src/utils/adr-context-detector.js +1 -1
  140. package/dist/src/utils/adr-context-detector.js.map +1 -1
  141. package/dist/src/utils/adr-planning-task-integration.d.ts +260 -0
  142. package/dist/src/utils/adr-planning-task-integration.d.ts.map +1 -0
  143. package/dist/src/utils/adr-planning-task-integration.js +466 -0
  144. package/dist/src/utils/adr-planning-task-integration.js.map +1 -0
  145. package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -1
  146. package/dist/src/utils/adr-timeline-extractor.js +3 -2
  147. package/dist/src/utils/adr-timeline-extractor.js.map +1 -1
  148. package/dist/src/utils/ai-executor.d.ts +10 -0
  149. package/dist/src/utils/ai-executor.d.ts.map +1 -1
  150. package/dist/src/utils/ai-executor.js +14 -3
  151. package/dist/src/utils/ai-executor.js.map +1 -1
  152. package/dist/src/utils/automatic-prompt-engineering.d.ts +5 -0
  153. package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
  154. package/dist/src/utils/automatic-prompt-engineering.js +10 -90
  155. package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
  156. package/dist/src/utils/bootstrap-task-integration.d.ts +214 -0
  157. package/dist/src/utils/bootstrap-task-integration.d.ts.map +1 -0
  158. package/dist/src/utils/bootstrap-task-integration.js +365 -0
  159. package/dist/src/utils/bootstrap-task-integration.js.map +1 -0
  160. package/dist/src/utils/dag-executor.js +1 -1
  161. package/dist/src/utils/dag-executor.js.map +1 -1
  162. package/dist/src/utils/deployment-task-integration.d.ts +260 -0
  163. package/dist/src/utils/deployment-task-integration.d.ts.map +1 -0
  164. package/dist/src/utils/deployment-task-integration.js +393 -0
  165. package/dist/src/utils/deployment-task-integration.js.map +1 -0
  166. package/dist/src/utils/dynamic-deployment-intelligence.js +1 -1
  167. package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -1
  168. package/dist/src/utils/enhanced-logging.d.ts +3 -0
  169. package/dist/src/utils/enhanced-logging.d.ts.map +1 -1
  170. package/dist/src/utils/enhanced-logging.js +9 -30
  171. package/dist/src/utils/enhanced-logging.js.map +1 -1
  172. package/dist/src/utils/environment-capability-registry.js +1 -1
  173. package/dist/src/utils/environment-capability-registry.js.map +1 -1
  174. package/dist/src/utils/file-system.d.ts.map +1 -1
  175. package/dist/src/utils/file-system.js +33 -3
  176. package/dist/src/utils/file-system.js.map +1 -1
  177. package/dist/src/utils/gitleaks-detector.js +1 -1
  178. package/dist/src/utils/gitleaks-detector.js.map +1 -1
  179. package/dist/src/utils/knowledge-graph-manager.d.ts +13 -0
  180. package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
  181. package/dist/src/utils/knowledge-graph-manager.js +13 -0
  182. package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
  183. package/dist/src/utils/prompt-execution.d.ts +29 -1
  184. package/dist/src/utils/prompt-execution.d.ts.map +1 -1
  185. package/dist/src/utils/prompt-execution.js +29 -1
  186. package/dist/src/utils/prompt-execution.js.map +1 -1
  187. package/dist/src/utils/research-orchestrator.d.ts +87 -1
  188. package/dist/src/utils/research-orchestrator.d.ts.map +1 -1
  189. package/dist/src/utils/research-orchestrator.js +121 -17
  190. package/dist/src/utils/research-orchestrator.js.map +1 -1
  191. package/dist/src/utils/research-task-integration.d.ts +297 -0
  192. package/dist/src/utils/research-task-integration.d.ts.map +1 -0
  193. package/dist/src/utils/research-task-integration.js +449 -0
  194. package/dist/src/utils/research-task-integration.js.map +1 -0
  195. package/dist/src/utils/ripgrep-wrapper.d.ts.map +1 -1
  196. package/dist/src/utils/ripgrep-wrapper.js +17 -3
  197. package/dist/src/utils/ripgrep-wrapper.js.map +1 -1
  198. package/dist/src/utils/sandbox-executor.d.ts +145 -0
  199. package/dist/src/utils/sandbox-executor.d.ts.map +1 -0
  200. package/dist/src/utils/sandbox-executor.js +642 -0
  201. package/dist/src/utils/sandbox-executor.js.map +1 -0
  202. package/dist/src/utils/server-context-generator.d.ts +5 -0
  203. package/dist/src/utils/server-context-generator.d.ts.map +1 -1
  204. package/dist/src/utils/server-context-generator.js +38 -0
  205. package/dist/src/utils/server-context-generator.js.map +1 -1
  206. package/dist/src/utils/task-manager.d.ts +239 -0
  207. package/dist/src/utils/task-manager.d.ts.map +1 -0
  208. package/dist/src/utils/task-manager.js +528 -0
  209. package/dist/src/utils/task-manager.js.map +1 -0
  210. package/dist/src/utils/task-persistence.d.ts +82 -0
  211. package/dist/src/utils/task-persistence.d.ts.map +1 -0
  212. package/dist/src/utils/task-persistence.js +248 -0
  213. package/dist/src/utils/task-persistence.js.map +1 -0
  214. package/dist/src/utils/test-aware-defaults.d.ts +57 -0
  215. package/dist/src/utils/test-aware-defaults.d.ts.map +1 -0
  216. package/dist/src/utils/test-aware-defaults.js +71 -0
  217. package/dist/src/utils/test-aware-defaults.js.map +1 -0
  218. package/dist/src/utils/tree-sitter-analyzer.d.ts +42 -5
  219. package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
  220. package/dist/src/utils/tree-sitter-analyzer.js +499 -17
  221. package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
  222. package/package.json +24 -19
  223. package/dist/src/tools/smart-git-push-tool.d.ts +0 -55
  224. package/dist/src/tools/smart-git-push-tool.d.ts.map +0 -1
  225. package/dist/src/tools/smart-git-push-tool.js +0 -1011
  226. 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
- * - Ansible playbooks and roles
6
- * - Terraform/HCL infrastructure
5
+ * - TypeScript/JavaScript applications
7
6
  * - Python microservices
8
- * - Node.js applications
9
- * - Container configurations
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('dockerfile', 'tree-sitter-dockerfile');
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
- await this.analyzeTerraform(tree.rootNode, lines, result);
180
- break;
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
- async analyzeTerraform(node, _lines, result) {
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));