mcp-adr-analysis-server 2.1.20 → 2.1.27

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 (253) hide show
  1. package/README.md +63 -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 +934 -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-aggregator-tools.d.ts +185 -0
  69. package/dist/src/tools/adr-aggregator-tools.d.ts.map +1 -0
  70. package/dist/src/tools/adr-aggregator-tools.js +872 -0
  71. package/dist/src/tools/adr-aggregator-tools.js.map +1 -0
  72. package/dist/src/tools/adr-bootstrap-validation-tool.d.ts.map +1 -1
  73. package/dist/src/tools/adr-bootstrap-validation-tool.js +7 -6
  74. package/dist/src/tools/adr-bootstrap-validation-tool.js.map +1 -1
  75. package/dist/src/tools/adr-suggestion-tool.d.ts +5 -0
  76. package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
  77. package/dist/src/tools/adr-suggestion-tool.js +40 -71
  78. package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
  79. package/dist/src/tools/analyze-gaps-tool.d.ts +57 -0
  80. package/dist/src/tools/analyze-gaps-tool.d.ts.map +1 -0
  81. package/dist/src/tools/analyze-gaps-tool.js +727 -0
  82. package/dist/src/tools/analyze-gaps-tool.js.map +1 -0
  83. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts +23 -1
  84. package/dist/src/tools/bootstrap-validation-loop-tool.d.ts.map +1 -1
  85. package/dist/src/tools/bootstrap-validation-loop-tool.js +15 -5
  86. package/dist/src/tools/bootstrap-validation-loop-tool.js.map +1 -1
  87. package/dist/src/tools/ce-mcp-tools.d.ts +291 -0
  88. package/dist/src/tools/ce-mcp-tools.d.ts.map +1 -0
  89. package/dist/src/tools/ce-mcp-tools.js +1188 -0
  90. package/dist/src/tools/ce-mcp-tools.js.map +1 -0
  91. package/dist/src/tools/content-masking-tool.d.ts +11 -0
  92. package/dist/src/tools/content-masking-tool.d.ts.map +1 -1
  93. package/dist/src/tools/content-masking-tool.js +13 -6
  94. package/dist/src/tools/content-masking-tool.js.map +1 -1
  95. package/dist/src/tools/deployment-readiness-tool.d.ts +11 -0
  96. package/dist/src/tools/deployment-readiness-tool.d.ts.map +1 -1
  97. package/dist/src/tools/deployment-readiness-tool.js +10 -4
  98. package/dist/src/tools/deployment-readiness-tool.js.map +1 -1
  99. package/dist/src/tools/environment-analysis-tool.d.ts +96 -1
  100. package/dist/src/tools/environment-analysis-tool.d.ts.map +1 -1
  101. package/dist/src/tools/environment-analysis-tool.js +38 -46
  102. package/dist/src/tools/environment-analysis-tool.js.map +1 -1
  103. package/dist/src/tools/research-question-tool.d.ts.map +1 -1
  104. package/dist/src/tools/research-question-tool.js +3 -2
  105. package/dist/src/tools/research-question-tool.js.map +1 -1
  106. package/dist/src/tools/review-existing-adrs-tool.d.ts +5 -0
  107. package/dist/src/tools/review-existing-adrs-tool.d.ts.map +1 -1
  108. package/dist/src/tools/review-existing-adrs-tool.js +123 -42
  109. package/dist/src/tools/review-existing-adrs-tool.js.map +1 -1
  110. package/dist/src/tools/rule-generation-tool.d.ts.map +1 -1
  111. package/dist/src/tools/rule-generation-tool.js +3 -5
  112. package/dist/src/tools/rule-generation-tool.js.map +1 -1
  113. package/dist/src/tools/search-codebase-tool.d.ts +148 -0
  114. package/dist/src/tools/search-codebase-tool.d.ts.map +1 -0
  115. package/dist/src/tools/search-codebase-tool.js +406 -0
  116. package/dist/src/tools/search-codebase-tool.js.map +1 -0
  117. package/dist/src/tools/smart-git-push-tool-v2.js +1 -1
  118. package/dist/src/tools/smart-git-push-tool-v2.js.map +1 -1
  119. package/dist/src/tools/tool-catalog.d.ts +134 -0
  120. package/dist/src/tools/tool-catalog.d.ts.map +1 -0
  121. package/dist/src/tools/tool-catalog.js +1813 -0
  122. package/dist/src/tools/tool-catalog.js.map +1 -0
  123. package/dist/src/tools/tool-chain-orchestrator.d.ts +11 -2
  124. package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -1
  125. package/dist/src/tools/tool-chain-orchestrator.js +11 -2
  126. package/dist/src/tools/tool-chain-orchestrator.js.map +1 -1
  127. package/dist/src/tools/tool-dispatcher.d.ts +98 -0
  128. package/dist/src/tools/tool-dispatcher.d.ts.map +1 -0
  129. package/dist/src/tools/tool-dispatcher.js +229 -0
  130. package/dist/src/tools/tool-dispatcher.js.map +1 -0
  131. package/dist/src/tools/tree-sitter-code-tools.d.ts +184 -0
  132. package/dist/src/tools/tree-sitter-code-tools.d.ts.map +1 -0
  133. package/dist/src/tools/tree-sitter-code-tools.js +642 -0
  134. package/dist/src/tools/tree-sitter-code-tools.js.map +1 -0
  135. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +22 -0
  136. package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -1
  137. package/dist/src/tools/troubleshoot-guided-workflow-tool.js +20 -3
  138. package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -1
  139. package/dist/src/tools/update-knowledge-tool.d.ts +89 -0
  140. package/dist/src/tools/update-knowledge-tool.d.ts.map +1 -0
  141. package/dist/src/tools/update-knowledge-tool.js +222 -0
  142. package/dist/src/tools/update-knowledge-tool.js.map +1 -0
  143. package/dist/src/types/adr-aggregator.d.ts +692 -0
  144. package/dist/src/types/adr-aggregator.d.ts.map +1 -0
  145. package/dist/src/types/adr-aggregator.js +8 -0
  146. package/dist/src/types/adr-aggregator.js.map +1 -0
  147. package/dist/src/types/ce-mcp.d.ts +248 -0
  148. package/dist/src/types/ce-mcp.d.ts.map +1 -0
  149. package/dist/src/types/ce-mcp.js +27 -0
  150. package/dist/src/types/ce-mcp.js.map +1 -0
  151. package/dist/src/types/index.d.ts +3 -2
  152. package/dist/src/types/index.d.ts.map +1 -1
  153. package/dist/src/types/memory-entities.d.ts +48 -48
  154. package/dist/src/utils/adr-aggregator-client.d.ts +177 -0
  155. package/dist/src/utils/adr-aggregator-client.d.ts.map +1 -0
  156. package/dist/src/utils/adr-aggregator-client.js +396 -0
  157. package/dist/src/utils/adr-aggregator-client.js.map +1 -0
  158. package/dist/src/utils/adr-context-detector.js +1 -1
  159. package/dist/src/utils/adr-context-detector.js.map +1 -1
  160. package/dist/src/utils/adr-planning-task-integration.d.ts +260 -0
  161. package/dist/src/utils/adr-planning-task-integration.d.ts.map +1 -0
  162. package/dist/src/utils/adr-planning-task-integration.js +466 -0
  163. package/dist/src/utils/adr-planning-task-integration.js.map +1 -0
  164. package/dist/src/utils/adr-timeline-extractor.d.ts.map +1 -1
  165. package/dist/src/utils/adr-timeline-extractor.js +3 -2
  166. package/dist/src/utils/adr-timeline-extractor.js.map +1 -1
  167. package/dist/src/utils/ai-executor.d.ts +10 -0
  168. package/dist/src/utils/ai-executor.d.ts.map +1 -1
  169. package/dist/src/utils/ai-executor.js +14 -3
  170. package/dist/src/utils/ai-executor.js.map +1 -1
  171. package/dist/src/utils/automatic-prompt-engineering.d.ts +5 -0
  172. package/dist/src/utils/automatic-prompt-engineering.d.ts.map +1 -1
  173. package/dist/src/utils/automatic-prompt-engineering.js +10 -90
  174. package/dist/src/utils/automatic-prompt-engineering.js.map +1 -1
  175. package/dist/src/utils/bootstrap-task-integration.d.ts +214 -0
  176. package/dist/src/utils/bootstrap-task-integration.d.ts.map +1 -0
  177. package/dist/src/utils/bootstrap-task-integration.js +365 -0
  178. package/dist/src/utils/bootstrap-task-integration.js.map +1 -0
  179. package/dist/src/utils/config.d.ts +3 -0
  180. package/dist/src/utils/config.d.ts.map +1 -1
  181. package/dist/src/utils/config.js +13 -0
  182. package/dist/src/utils/config.js.map +1 -1
  183. package/dist/src/utils/dag-executor.js +1 -1
  184. package/dist/src/utils/dag-executor.js.map +1 -1
  185. package/dist/src/utils/deployment-task-integration.d.ts +260 -0
  186. package/dist/src/utils/deployment-task-integration.d.ts.map +1 -0
  187. package/dist/src/utils/deployment-task-integration.js +393 -0
  188. package/dist/src/utils/deployment-task-integration.js.map +1 -0
  189. package/dist/src/utils/dynamic-deployment-intelligence.js +1 -1
  190. package/dist/src/utils/dynamic-deployment-intelligence.js.map +1 -1
  191. package/dist/src/utils/enhanced-logging.d.ts +3 -0
  192. package/dist/src/utils/enhanced-logging.d.ts.map +1 -1
  193. package/dist/src/utils/enhanced-logging.js +9 -30
  194. package/dist/src/utils/enhanced-logging.js.map +1 -1
  195. package/dist/src/utils/environment-capability-registry.js +1 -1
  196. package/dist/src/utils/environment-capability-registry.js.map +1 -1
  197. package/dist/src/utils/file-system.d.ts.map +1 -1
  198. package/dist/src/utils/file-system.js +33 -3
  199. package/dist/src/utils/file-system.js.map +1 -1
  200. package/dist/src/utils/git-remote-detector.d.ts +67 -0
  201. package/dist/src/utils/git-remote-detector.d.ts.map +1 -0
  202. package/dist/src/utils/git-remote-detector.js +194 -0
  203. package/dist/src/utils/git-remote-detector.js.map +1 -0
  204. package/dist/src/utils/gitleaks-detector.js +1 -1
  205. package/dist/src/utils/gitleaks-detector.js.map +1 -1
  206. package/dist/src/utils/knowledge-graph-manager.d.ts +13 -0
  207. package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -1
  208. package/dist/src/utils/knowledge-graph-manager.js +13 -0
  209. package/dist/src/utils/knowledge-graph-manager.js.map +1 -1
  210. package/dist/src/utils/prompt-execution.d.ts +29 -1
  211. package/dist/src/utils/prompt-execution.d.ts.map +1 -1
  212. package/dist/src/utils/prompt-execution.js +29 -1
  213. package/dist/src/utils/prompt-execution.js.map +1 -1
  214. package/dist/src/utils/research-orchestrator.d.ts +87 -1
  215. package/dist/src/utils/research-orchestrator.d.ts.map +1 -1
  216. package/dist/src/utils/research-orchestrator.js +121 -17
  217. package/dist/src/utils/research-orchestrator.js.map +1 -1
  218. package/dist/src/utils/research-task-integration.d.ts +297 -0
  219. package/dist/src/utils/research-task-integration.d.ts.map +1 -0
  220. package/dist/src/utils/research-task-integration.js +449 -0
  221. package/dist/src/utils/research-task-integration.js.map +1 -0
  222. package/dist/src/utils/ripgrep-wrapper.d.ts.map +1 -1
  223. package/dist/src/utils/ripgrep-wrapper.js +17 -3
  224. package/dist/src/utils/ripgrep-wrapper.js.map +1 -1
  225. package/dist/src/utils/sandbox-executor.d.ts +145 -0
  226. package/dist/src/utils/sandbox-executor.d.ts.map +1 -0
  227. package/dist/src/utils/sandbox-executor.js +642 -0
  228. package/dist/src/utils/sandbox-executor.js.map +1 -0
  229. package/dist/src/utils/server-context-generator.d.ts +5 -0
  230. package/dist/src/utils/server-context-generator.d.ts.map +1 -1
  231. package/dist/src/utils/server-context-generator.js +38 -0
  232. package/dist/src/utils/server-context-generator.js.map +1 -1
  233. package/dist/src/utils/task-manager.d.ts +239 -0
  234. package/dist/src/utils/task-manager.d.ts.map +1 -0
  235. package/dist/src/utils/task-manager.js +528 -0
  236. package/dist/src/utils/task-manager.js.map +1 -0
  237. package/dist/src/utils/task-persistence.d.ts +82 -0
  238. package/dist/src/utils/task-persistence.d.ts.map +1 -0
  239. package/dist/src/utils/task-persistence.js +248 -0
  240. package/dist/src/utils/task-persistence.js.map +1 -0
  241. package/dist/src/utils/test-aware-defaults.d.ts +57 -0
  242. package/dist/src/utils/test-aware-defaults.d.ts.map +1 -0
  243. package/dist/src/utils/test-aware-defaults.js +71 -0
  244. package/dist/src/utils/test-aware-defaults.js.map +1 -0
  245. package/dist/src/utils/tree-sitter-analyzer.d.ts +42 -5
  246. package/dist/src/utils/tree-sitter-analyzer.d.ts.map +1 -1
  247. package/dist/src/utils/tree-sitter-analyzer.js +499 -17
  248. package/dist/src/utils/tree-sitter-analyzer.js.map +1 -1
  249. package/package.json +24 -19
  250. package/dist/src/tools/smart-git-push-tool.d.ts +0 -55
  251. package/dist/src/tools/smart-git-push-tool.d.ts.map +0 -1
  252. package/dist/src/tools/smart-git-push-tool.js +0 -1011
  253. package/dist/src/tools/smart-git-push-tool.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Search Codebase Tool
3
+ *
4
+ * Atomic tool for searching codebase files based on query patterns.
5
+ * Extracted from ResearchOrchestrator per ADR-018 (Atomic Tools Architecture).
6
+ *
7
+ * This tool provides dependency-injected codebase search functionality:
8
+ * - Returns raw data (matches, files) without analysis/conclusions
9
+ * - Supports configurable file system and analyzer dependencies
10
+ * - No LLM calls or orchestration logic
11
+ * - Testable without complex ESM mocking
12
+ *
13
+ * @see ResearchOrchestrator (deprecated) - Full multi-source orchestration
14
+ * @since 3.0.0
15
+ * @category Tools
16
+ * @category Research
17
+ */
18
+ import { promises as fs } from 'fs';
19
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
20
+ import type { TreeSitterAnalyzer } from '../utils/tree-sitter-analyzer.js';
21
+ /**
22
+ * File match result with relevance scoring
23
+ */
24
+ export interface FileMatch {
25
+ /** Full path to the file */
26
+ path: string;
27
+ /** File content (if includeContent was true) */
28
+ content?: string;
29
+ /** Relevance score 0-1 */
30
+ relevance: number;
31
+ /** Tree-sitter parse analysis (if available) */
32
+ parseAnalysis?: {
33
+ language: string;
34
+ hasInfrastructure: boolean;
35
+ functionCount: number;
36
+ importCount: number;
37
+ };
38
+ }
39
+ /**
40
+ * Codebase search result
41
+ */
42
+ export interface CodebaseSearchResult {
43
+ /** Array of matching files with relevance scores */
44
+ matches: FileMatch[];
45
+ /** Total number of files discovered */
46
+ totalFiles: number;
47
+ /** Keywords extracted from query */
48
+ keywords: string[];
49
+ /** Project path searched */
50
+ projectPath: string;
51
+ /** Search duration in milliseconds */
52
+ duration: number;
53
+ }
54
+ /**
55
+ * Dependencies for search_codebase function (injectable for testing)
56
+ */
57
+ export interface SearchCodebaseDependencies {
58
+ /** File system operations */
59
+ fs: typeof fs;
60
+ /** Tree-sitter analyzer (optional) */
61
+ analyzer?: TreeSitterAnalyzer;
62
+ }
63
+ /**
64
+ * Default dependencies for production use
65
+ */
66
+ export declare const defaultDeps: SearchCodebaseDependencies;
67
+ /**
68
+ * Minimum relevance threshold for including files in results (0-1)
69
+ * Files with relevance below this threshold will be filtered out
70
+ */
71
+ export declare const DEFAULT_RELEVANCE_THRESHOLD = 0.2;
72
+ /**
73
+ * Search codebase for files matching query
74
+ *
75
+ * @description Atomic tool that searches project files based on query patterns.
76
+ * Returns raw file matches with relevance scores. Does NOT perform LLM analysis
77
+ * or synthesis - returns structured data only.
78
+ *
79
+ * Search strategy:
80
+ * 1. Extract keywords from query
81
+ * 2. Use scanProjectStructure for intent-based file discovery (Docker, K8s, etc.)
82
+ * 3. Use findFiles for glob-based keyword matching
83
+ * 4. Read and score file relevance (optional tree-sitter enhancement)
84
+ * 5. Return sorted results
85
+ *
86
+ * @param args - Search parameters
87
+ * @param args.query - Search query (e.g., "Docker configuration", "authentication")
88
+ * @param args.projectPath - Path to project root (defaults to cwd)
89
+ * @param args.scope - Optional file scope patterns (e.g., ["src/**", "config/**"])
90
+ * @param args.includeContent - Include file content in results (default: false)
91
+ * @param args.maxFiles - Maximum files to return (default: 20)
92
+ * @param args.enableTreeSitter - Use tree-sitter for enhanced analysis (default: true)
93
+ * @param deps - Injectable dependencies (for testing)
94
+ *
95
+ * @returns Promise<CodebaseSearchResult> Raw search results with matches and scores
96
+ *
97
+ * @throws {McpAdrError} When query is empty or search fails
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * // Basic search
102
+ * const result = await searchCodebase({
103
+ * query: "Docker configuration",
104
+ * projectPath: "/path/to/project"
105
+ * });
106
+ *
107
+ * console.log(`Found ${result.matches.length} files`);
108
+ * result.matches.forEach(match => {
109
+ * console.log(`${match.path}: ${(match.relevance * 100).toFixed(1)}%`);
110
+ * });
111
+ * ```
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * // Search with content and custom scope
116
+ * const result = await searchCodebase({
117
+ * query: "authentication methods",
118
+ * scope: ["src/**", "lib/**"],
119
+ * includeContent: true,
120
+ * maxFiles: 10
121
+ * });
122
+ * ```
123
+ *
124
+ * @since 3.0.0
125
+ * @category Research
126
+ * @category Atomic Tools
127
+ */
128
+ export declare function searchCodebase(args: {
129
+ query: string;
130
+ projectPath?: string;
131
+ scope?: string[];
132
+ includeContent?: boolean;
133
+ maxFiles?: number;
134
+ enableTreeSitter?: boolean;
135
+ relevanceThreshold?: number;
136
+ }, deps?: SearchCodebaseDependencies): Promise<CodebaseSearchResult>;
137
+ /**
138
+ * MCP tool wrapper for search_codebase
139
+ */
140
+ export declare function searchCodebaseTool(args: {
141
+ query: string;
142
+ projectPath?: string;
143
+ scope?: string[];
144
+ includeContent?: boolean;
145
+ maxFiles?: number;
146
+ enableTreeSitter?: boolean;
147
+ }): Promise<CallToolResult>;
148
+ //# sourceMappingURL=search-codebase-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-codebase-tool.d.ts","sourceRoot":"","sources":["../../../src/tools/search-codebase-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAI3E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,6BAA6B;IAC7B,EAAE,EAAE,OAAO,EAAE,CAAC;IACd,sCAAsC;IACtC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,0BAEzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,EACD,IAAI,GAAE,0BAAwC,GAC7C,OAAO,CAAC,oBAAoB,CAAC,CAwN/B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACA,OAAO,CAAC,cAAc,CAAC,CAyDzB"}
@@ -0,0 +1,406 @@
1
+ /**
2
+ * Search Codebase Tool
3
+ *
4
+ * Atomic tool for searching codebase files based on query patterns.
5
+ * Extracted from ResearchOrchestrator per ADR-018 (Atomic Tools Architecture).
6
+ *
7
+ * This tool provides dependency-injected codebase search functionality:
8
+ * - Returns raw data (matches, files) without analysis/conclusions
9
+ * - Supports configurable file system and analyzer dependencies
10
+ * - No LLM calls or orchestration logic
11
+ * - Testable without complex ESM mocking
12
+ *
13
+ * @see ResearchOrchestrator (deprecated) - Full multi-source orchestration
14
+ * @since 3.0.0
15
+ * @category Tools
16
+ * @category Research
17
+ */
18
+ import { promises as fs } from 'fs';
19
+ import * as path from 'path';
20
+ import { McpAdrError } from '../types/index.js';
21
+ import { findFiles } from '../utils/file-system.js';
22
+ import { scanProjectStructure } from '../utils/actual-file-operations.js';
23
+ /**
24
+ * Default dependencies for production use
25
+ */
26
+ export const defaultDeps = {
27
+ fs,
28
+ };
29
+ /**
30
+ * Minimum relevance threshold for including files in results (0-1)
31
+ * Files with relevance below this threshold will be filtered out
32
+ */
33
+ export const DEFAULT_RELEVANCE_THRESHOLD = 0.2;
34
+ /**
35
+ * Search codebase for files matching query
36
+ *
37
+ * @description Atomic tool that searches project files based on query patterns.
38
+ * Returns raw file matches with relevance scores. Does NOT perform LLM analysis
39
+ * or synthesis - returns structured data only.
40
+ *
41
+ * Search strategy:
42
+ * 1. Extract keywords from query
43
+ * 2. Use scanProjectStructure for intent-based file discovery (Docker, K8s, etc.)
44
+ * 3. Use findFiles for glob-based keyword matching
45
+ * 4. Read and score file relevance (optional tree-sitter enhancement)
46
+ * 5. Return sorted results
47
+ *
48
+ * @param args - Search parameters
49
+ * @param args.query - Search query (e.g., "Docker configuration", "authentication")
50
+ * @param args.projectPath - Path to project root (defaults to cwd)
51
+ * @param args.scope - Optional file scope patterns (e.g., ["src/**", "config/**"])
52
+ * @param args.includeContent - Include file content in results (default: false)
53
+ * @param args.maxFiles - Maximum files to return (default: 20)
54
+ * @param args.enableTreeSitter - Use tree-sitter for enhanced analysis (default: true)
55
+ * @param deps - Injectable dependencies (for testing)
56
+ *
57
+ * @returns Promise<CodebaseSearchResult> Raw search results with matches and scores
58
+ *
59
+ * @throws {McpAdrError} When query is empty or search fails
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // Basic search
64
+ * const result = await searchCodebase({
65
+ * query: "Docker configuration",
66
+ * projectPath: "/path/to/project"
67
+ * });
68
+ *
69
+ * console.log(`Found ${result.matches.length} files`);
70
+ * result.matches.forEach(match => {
71
+ * console.log(`${match.path}: ${(match.relevance * 100).toFixed(1)}%`);
72
+ * });
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Search with content and custom scope
78
+ * const result = await searchCodebase({
79
+ * query: "authentication methods",
80
+ * scope: ["src/**", "lib/**"],
81
+ * includeContent: true,
82
+ * maxFiles: 10
83
+ * });
84
+ * ```
85
+ *
86
+ * @since 3.0.0
87
+ * @category Research
88
+ * @category Atomic Tools
89
+ */
90
+ export async function searchCodebase(args, deps = defaultDeps) {
91
+ const { query, projectPath = process.cwd(), scope, includeContent = false, maxFiles = 20, enableTreeSitter = true, relevanceThreshold = DEFAULT_RELEVANCE_THRESHOLD, } = args;
92
+ if (!query || query.trim().length === 0) {
93
+ throw new McpAdrError('Search query is required', 'INVALID_INPUT');
94
+ }
95
+ const startTime = Date.now();
96
+ const keywords = extractKeywords(query);
97
+ const queryLower = query.toLowerCase();
98
+ const relevanceMap = new Map();
99
+ const contentMap = new Map();
100
+ const parseAnalysisMap = new Map();
101
+ const discoveredFiles = new Set();
102
+ try {
103
+ // PHASE 1: Intent-based file discovery using scanProjectStructure
104
+ const projectStructure = await scanProjectStructure(projectPath, {
105
+ readContent: false,
106
+ maxFileSize: 100000,
107
+ includeHidden: false,
108
+ });
109
+ // Match relevant file categories based on query intent
110
+ if (queryLower.match(/docker|container/i)) {
111
+ projectStructure.dockerFiles.forEach(f => discoveredFiles.add(f.path));
112
+ }
113
+ if (queryLower.match(/kubernetes|k8s|pod|deployment/i)) {
114
+ projectStructure.kubernetesFiles.forEach(f => discoveredFiles.add(f.path));
115
+ }
116
+ if (queryLower.match(/dependency|package|library/i)) {
117
+ projectStructure.packageFiles.forEach(f => discoveredFiles.add(f.path));
118
+ }
119
+ if (queryLower.match(/config|configuration|environment|env/i)) {
120
+ projectStructure.configFiles.forEach(f => discoveredFiles.add(f.path));
121
+ projectStructure.environmentFiles.forEach(f => discoveredFiles.add(f.path));
122
+ }
123
+ if (queryLower.match(/build|ci|cd|pipeline/i)) {
124
+ projectStructure.buildFiles.forEach(f => discoveredFiles.add(f.path));
125
+ projectStructure.ciFiles.forEach(f => discoveredFiles.add(f.path));
126
+ }
127
+ if (queryLower.match(/test|testing|spec/i)) {
128
+ const testResults = await findFiles(projectPath, [
129
+ '**/*.test.ts',
130
+ '**/*.spec.ts',
131
+ '**/*.test.js',
132
+ '**/*.spec.js',
133
+ '**/tests/**',
134
+ '**/test/**',
135
+ ]);
136
+ testResults.files.forEach(f => discoveredFiles.add(f.path));
137
+ }
138
+ // PHASE 2: Keyword-based file discovery
139
+ if (keywords.length > 0) {
140
+ try {
141
+ const keywordPatterns = keywords.slice(0, 5).map(k => `**/*${k}*`);
142
+ const keywordResults = await findFiles(projectPath, keywordPatterns, { limit: 50 });
143
+ keywordResults.files.forEach(f => discoveredFiles.add(f.path));
144
+ }
145
+ catch {
146
+ // Keyword discovery failed, continue with other methods
147
+ }
148
+ }
149
+ // PHASE 3: Apply custom scope if provided
150
+ if (scope && scope.length > 0) {
151
+ const scopedResults = await findFiles(projectPath, scope, { limit: 100 });
152
+ scopedResults.files.forEach(f => discoveredFiles.add(f.path));
153
+ }
154
+ // PHASE 4: Read and score file relevance
155
+ const fileArray = Array.from(discoveredFiles).slice(0, 50); // Limit to 50 files for performance
156
+ // Import analyzer if tree-sitter is enabled
157
+ let analyzer;
158
+ if (enableTreeSitter) {
159
+ try {
160
+ const { TreeSitterAnalyzer: TSAnalyzer } = await import('../utils/tree-sitter-analyzer.js');
161
+ analyzer = new TSAnalyzer();
162
+ }
163
+ catch {
164
+ // Tree-sitter not available (common in test environments), continue without it
165
+ // Not logging as this is expected behavior in some environments
166
+ }
167
+ }
168
+ // Process files in parallel for better performance
169
+ const fileProcessingPromises = fileArray.map(async (filePath) => {
170
+ try {
171
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(projectPath, filePath);
172
+ const content = await deps.fs.readFile(fullPath, 'utf-8');
173
+ // Calculate text-based relevance
174
+ let relevance = calculateTextRelevance(content, query, keywords);
175
+ if (includeContent) {
176
+ contentMap.set(filePath, content);
177
+ }
178
+ // PHASE 5: Enhance with tree-sitter analysis if available
179
+ if (analyzer && shouldParse(filePath)) {
180
+ try {
181
+ const analysis = await analyzer.analyzeFile(fullPath, content);
182
+ // Enhance relevance based on AST analysis
183
+ let astRelevance = relevance;
184
+ // Check for infrastructure references
185
+ if (analysis.infraStructure && analysis.infraStructure.length > 0) {
186
+ const infraProviders = analysis.infraStructure.map(i => i.provider);
187
+ const infraResources = analysis.infraStructure.map(i => i.name);
188
+ const matchingProviders = keywords.filter(k => infraProviders.some(p => p.toLowerCase().includes(k.toLowerCase())));
189
+ const matchingResources = keywords.filter(k => infraResources.some(r => r.toLowerCase().includes(k.toLowerCase())));
190
+ const totalMatches = matchingProviders.length + matchingResources.length;
191
+ if (totalMatches > 0) {
192
+ astRelevance += 0.2 * Math.min(totalMatches, 3); // Cap bonus at 0.6
193
+ }
194
+ }
195
+ // Check for imports/dependencies
196
+ if (analysis.imports && keywords.some(k => k.match(/import|require|dependency/i))) {
197
+ astRelevance += 0.1;
198
+ }
199
+ relevance = Math.min(astRelevance, 1.0);
200
+ parseAnalysisMap.set(filePath, {
201
+ language: analysis.language,
202
+ hasInfrastructure: !!analysis.infraStructure,
203
+ functionCount: analysis.functions?.length || 0,
204
+ importCount: analysis.imports?.length || 0,
205
+ });
206
+ }
207
+ catch {
208
+ // Tree-sitter parsing failed, use text-based relevance
209
+ }
210
+ }
211
+ relevanceMap.set(filePath, relevance);
212
+ return { filePath, success: true };
213
+ }
214
+ catch {
215
+ // File read failed, skip
216
+ return { filePath, success: false };
217
+ }
218
+ });
219
+ // Wait for all file processing to complete
220
+ await Promise.allSettled(fileProcessingPromises);
221
+ // PHASE 6: Build and sort results
222
+ const matches = Array.from(relevanceMap.entries())
223
+ .filter(([, relevance]) => relevance > relevanceThreshold)
224
+ .sort((a, b) => b[1] - a[1]) // Sort by relevance descending
225
+ .slice(0, maxFiles)
226
+ .map(([filePath, relevance]) => {
227
+ const match = {
228
+ path: filePath,
229
+ relevance,
230
+ };
231
+ const content = contentMap.get(filePath);
232
+ if (content !== undefined) {
233
+ match.content = content;
234
+ }
235
+ const parseAnalysis = parseAnalysisMap.get(filePath);
236
+ if (parseAnalysis !== undefined) {
237
+ match.parseAnalysis = parseAnalysis;
238
+ }
239
+ return match;
240
+ });
241
+ return {
242
+ matches,
243
+ totalFiles: discoveredFiles.size,
244
+ keywords,
245
+ projectPath,
246
+ duration: Date.now() - startTime,
247
+ };
248
+ }
249
+ catch (error) {
250
+ throw new McpAdrError(`Codebase search failed: ${error instanceof Error ? error.message : String(error)}`, 'SEARCH_ERROR', { query, projectPath });
251
+ }
252
+ }
253
+ /**
254
+ * MCP tool wrapper for search_codebase
255
+ */
256
+ export async function searchCodebaseTool(args) {
257
+ try {
258
+ const result = await searchCodebase(args);
259
+ // Format response
260
+ let output = `# Codebase Search Results\n\n`;
261
+ output += `**Query**: ${args.query}\n`;
262
+ output += `**Project**: ${result.projectPath}\n`;
263
+ output += `**Matches**: ${result.matches.length} of ${result.totalFiles} files\n`;
264
+ output += `**Duration**: ${result.duration}ms\n`;
265
+ output += `**Keywords**: ${result.keywords.join(', ')}\n\n`;
266
+ if (result.matches.length === 0) {
267
+ output += `No files found matching the query.\n`;
268
+ }
269
+ else {
270
+ output += `## Matches\n\n`;
271
+ result.matches.forEach((match, index) => {
272
+ output += `### ${index + 1}. ${match.path}\n`;
273
+ output += `**Relevance**: ${(match.relevance * 100).toFixed(1)}%\n`;
274
+ if (match.parseAnalysis) {
275
+ output += `**Language**: ${match.parseAnalysis.language}\n`;
276
+ output += `**Functions**: ${match.parseAnalysis.functionCount}\n`;
277
+ output += `**Imports**: ${match.parseAnalysis.importCount}\n`;
278
+ if (match.parseAnalysis.hasInfrastructure) {
279
+ output += `**Infrastructure**: Yes\n`;
280
+ }
281
+ }
282
+ if (match.content) {
283
+ const preview = match.content.substring(0, 500);
284
+ output += `\n**Content Preview**:\n\`\`\`\n${preview}${match.content.length > 500 ? '...' : ''}\n\`\`\`\n`;
285
+ }
286
+ output += `\n`;
287
+ });
288
+ }
289
+ return {
290
+ content: [
291
+ {
292
+ type: 'text',
293
+ text: output,
294
+ },
295
+ ],
296
+ };
297
+ }
298
+ catch (error) {
299
+ return {
300
+ content: [
301
+ {
302
+ type: 'text',
303
+ text: `❌ Search failed: ${error instanceof Error ? error.message : String(error)}`,
304
+ },
305
+ ],
306
+ isError: true,
307
+ };
308
+ }
309
+ }
310
+ /**
311
+ * Extract keywords from search query
312
+ */
313
+ function extractKeywords(query) {
314
+ const stopWords = new Set([
315
+ 'the',
316
+ 'is',
317
+ 'are',
318
+ 'was',
319
+ 'were',
320
+ 'what',
321
+ 'when',
322
+ 'where',
323
+ 'why',
324
+ 'how',
325
+ 'which',
326
+ 'who',
327
+ 'a',
328
+ 'an',
329
+ 'and',
330
+ 'or',
331
+ 'but',
332
+ 'in',
333
+ 'on',
334
+ 'at',
335
+ 'to',
336
+ 'for',
337
+ 'with',
338
+ 'about',
339
+ 'as',
340
+ 'by',
341
+ 'from',
342
+ 'of',
343
+ 'can',
344
+ 'could',
345
+ 'should',
346
+ 'would',
347
+ 'do',
348
+ 'does',
349
+ 'did',
350
+ 'have',
351
+ 'has',
352
+ 'had',
353
+ 'we',
354
+ 'our',
355
+ 'us',
356
+ ]);
357
+ const words = query
358
+ .toLowerCase()
359
+ .replace(/[^\w\s-]/g, ' ')
360
+ .split(/\s+/)
361
+ .filter(w => w.length > 2 && !stopWords.has(w));
362
+ return [...new Set(words)];
363
+ }
364
+ /**
365
+ * Calculate text-based relevance score
366
+ */
367
+ function calculateTextRelevance(content, query, keywords) {
368
+ const contentLower = content.toLowerCase();
369
+ const queryLower = query.toLowerCase();
370
+ let score = 0;
371
+ // Keyword matching
372
+ for (const keyword of keywords) {
373
+ if (contentLower.includes(keyword.toLowerCase())) {
374
+ score += 0.2;
375
+ }
376
+ }
377
+ // Query phrase matching
378
+ const queryWords = queryLower.split(/\s+/).filter(w => w.length > 3);
379
+ for (const word of queryWords) {
380
+ if (contentLower.includes(word)) {
381
+ score += 0.1;
382
+ }
383
+ }
384
+ return Math.min(score, 1.0);
385
+ }
386
+ /**
387
+ * Check if file should be parsed with tree-sitter
388
+ */
389
+ function shouldParse(filePath) {
390
+ const parsableExtensions = [
391
+ '.ts',
392
+ '.tsx',
393
+ '.js',
394
+ '.jsx',
395
+ '.py',
396
+ '.yaml',
397
+ '.yml',
398
+ '.json',
399
+ '.sh',
400
+ '.bash',
401
+ '.tf',
402
+ '.hcl',
403
+ ];
404
+ return parsableExtensions.some(ext => filePath.endsWith(ext));
405
+ }
406
+ //# sourceMappingURL=search-codebase-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-codebase-tool.js","sourceRoot":"","sources":["../../../src/tools/search-codebase-tool.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@
21
21
  * Use this tool for safe, metric-driven git pushes.
22
22
  */
23
23
  import { McpAdrError } from '../types/index.js';
24
- import { execSync } from 'child_process';
24
+ import { execSync } from 'node:child_process';
25
25
  import { readFileSync, writeFileSync, existsSync, statSync, mkdirSync } from 'fs';
26
26
  import { join, extname, basename } from 'path';
27
27
  import * as os from 'os';