codedev-mcp 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/LICENSE +21 -0
  3. package/README.md +760 -0
  4. package/dist/analyzers/api-contract.d.ts +46 -0
  5. package/dist/analyzers/api-contract.d.ts.map +1 -0
  6. package/dist/analyzers/api-contract.js +319 -0
  7. package/dist/analyzers/api-contract.js.map +1 -0
  8. package/dist/analyzers/architecture.d.ts +37 -0
  9. package/dist/analyzers/architecture.d.ts.map +1 -0
  10. package/dist/analyzers/architecture.js +149 -0
  11. package/dist/analyzers/architecture.js.map +1 -0
  12. package/dist/analyzers/branch-compare.d.ts +46 -0
  13. package/dist/analyzers/branch-compare.d.ts.map +1 -0
  14. package/dist/analyzers/branch-compare.js +128 -0
  15. package/dist/analyzers/branch-compare.js.map +1 -0
  16. package/dist/analyzers/cicd.d.ts +42 -0
  17. package/dist/analyzers/cicd.d.ts.map +1 -0
  18. package/dist/analyzers/cicd.js +237 -0
  19. package/dist/analyzers/cicd.js.map +1 -0
  20. package/dist/analyzers/codebase.d.ts +64 -0
  21. package/dist/analyzers/codebase.d.ts.map +1 -0
  22. package/dist/analyzers/codebase.js +354 -0
  23. package/dist/analyzers/codebase.js.map +1 -0
  24. package/dist/analyzers/complexity-heatmap.d.ts +50 -0
  25. package/dist/analyzers/complexity-heatmap.d.ts.map +1 -0
  26. package/dist/analyzers/complexity-heatmap.js +156 -0
  27. package/dist/analyzers/complexity-heatmap.js.map +1 -0
  28. package/dist/analyzers/context-pack.d.ts +43 -0
  29. package/dist/analyzers/context-pack.d.ts.map +1 -0
  30. package/dist/analyzers/context-pack.js +232 -0
  31. package/dist/analyzers/context-pack.js.map +1 -0
  32. package/dist/analyzers/coverage.d.ts +70 -0
  33. package/dist/analyzers/coverage.d.ts.map +1 -0
  34. package/dist/analyzers/coverage.js +313 -0
  35. package/dist/analyzers/coverage.js.map +1 -0
  36. package/dist/analyzers/db-schema.d.ts +55 -0
  37. package/dist/analyzers/db-schema.d.ts.map +1 -0
  38. package/dist/analyzers/db-schema.js +237 -0
  39. package/dist/analyzers/db-schema.js.map +1 -0
  40. package/dist/analyzers/dead-code.d.ts +34 -0
  41. package/dist/analyzers/dead-code.d.ts.map +1 -0
  42. package/dist/analyzers/dead-code.js +131 -0
  43. package/dist/analyzers/dead-code.js.map +1 -0
  44. package/dist/analyzers/dep-vuln.d.ts +36 -0
  45. package/dist/analyzers/dep-vuln.d.ts.map +1 -0
  46. package/dist/analyzers/dep-vuln.js +342 -0
  47. package/dist/analyzers/dep-vuln.js.map +1 -0
  48. package/dist/analyzers/docs.d.ts +47 -0
  49. package/dist/analyzers/docs.d.ts.map +1 -0
  50. package/dist/analyzers/docs.js +473 -0
  51. package/dist/analyzers/docs.js.map +1 -0
  52. package/dist/analyzers/git.d.ts +115 -0
  53. package/dist/analyzers/git.d.ts.map +1 -0
  54. package/dist/analyzers/git.js +214 -0
  55. package/dist/analyzers/git.js.map +1 -0
  56. package/dist/analyzers/iac.d.ts +39 -0
  57. package/dist/analyzers/iac.d.ts.map +1 -0
  58. package/dist/analyzers/iac.js +233 -0
  59. package/dist/analyzers/iac.js.map +1 -0
  60. package/dist/analyzers/impact.d.ts +51 -0
  61. package/dist/analyzers/impact.d.ts.map +1 -0
  62. package/dist/analyzers/impact.js +235 -0
  63. package/dist/analyzers/impact.js.map +1 -0
  64. package/dist/analyzers/monorepo.d.ts +36 -0
  65. package/dist/analyzers/monorepo.d.ts.map +1 -0
  66. package/dist/analyzers/monorepo.js +233 -0
  67. package/dist/analyzers/monorepo.js.map +1 -0
  68. package/dist/analyzers/notebook.d.ts +53 -0
  69. package/dist/analyzers/notebook.d.ts.map +1 -0
  70. package/dist/analyzers/notebook.js +149 -0
  71. package/dist/analyzers/notebook.js.map +1 -0
  72. package/dist/analyzers/perf-profile.d.ts +39 -0
  73. package/dist/analyzers/perf-profile.d.ts.map +1 -0
  74. package/dist/analyzers/perf-profile.js +222 -0
  75. package/dist/analyzers/perf-profile.js.map +1 -0
  76. package/dist/analyzers/scaffold.d.ts +46 -0
  77. package/dist/analyzers/scaffold.d.ts.map +1 -0
  78. package/dist/analyzers/scaffold.js +313 -0
  79. package/dist/analyzers/scaffold.js.map +1 -0
  80. package/dist/analyzers/security.d.ts +42 -0
  81. package/dist/analyzers/security.d.ts.map +1 -0
  82. package/dist/analyzers/security.js +281 -0
  83. package/dist/analyzers/security.js.map +1 -0
  84. package/dist/analyzers/symbols.d.ts +49 -0
  85. package/dist/analyzers/symbols.d.ts.map +1 -0
  86. package/dist/analyzers/symbols.js +212 -0
  87. package/dist/analyzers/symbols.js.map +1 -0
  88. package/dist/analyzers/tree-sitter.d.ts +71 -0
  89. package/dist/analyzers/tree-sitter.d.ts.map +1 -0
  90. package/dist/analyzers/tree-sitter.js +333 -0
  91. package/dist/analyzers/tree-sitter.js.map +1 -0
  92. package/dist/analyzers/type-flow.d.ts +39 -0
  93. package/dist/analyzers/type-flow.d.ts.map +1 -0
  94. package/dist/analyzers/type-flow.js +75 -0
  95. package/dist/analyzers/type-flow.js.map +1 -0
  96. package/dist/cache/memory-cache.d.ts +130 -0
  97. package/dist/cache/memory-cache.d.ts.map +1 -0
  98. package/dist/cache/memory-cache.js +273 -0
  99. package/dist/cache/memory-cache.js.map +1 -0
  100. package/dist/config.d.ts +32 -0
  101. package/dist/config.d.ts.map +1 -0
  102. package/dist/config.js +57 -0
  103. package/dist/config.js.map +1 -0
  104. package/dist/constants/instructions.d.ts +2 -0
  105. package/dist/constants/instructions.d.ts.map +1 -0
  106. package/dist/constants/instructions.js +82 -0
  107. package/dist/constants/instructions.js.map +1 -0
  108. package/dist/db/connection.d.ts +12 -0
  109. package/dist/db/connection.d.ts.map +1 -0
  110. package/dist/db/connection.js +34 -0
  111. package/dist/db/connection.js.map +1 -0
  112. package/dist/db/json-store.d.ts +111 -0
  113. package/dist/db/json-store.d.ts.map +1 -0
  114. package/dist/db/json-store.js +201 -0
  115. package/dist/db/json-store.js.map +1 -0
  116. package/dist/db/sqlite-store.d.ts +153 -0
  117. package/dist/db/sqlite-store.d.ts.map +1 -0
  118. package/dist/db/sqlite-store.js +388 -0
  119. package/dist/db/sqlite-store.js.map +1 -0
  120. package/dist/index.d.ts +17 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +116 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/resources/health.d.ts +35 -0
  125. package/dist/resources/health.d.ts.map +1 -0
  126. package/dist/resources/health.js +81 -0
  127. package/dist/resources/health.js.map +1 -0
  128. package/dist/schemas/output-schemas.d.ts +517 -0
  129. package/dist/schemas/output-schemas.d.ts.map +1 -0
  130. package/dist/schemas/output-schemas.js +296 -0
  131. package/dist/schemas/output-schemas.js.map +1 -0
  132. package/dist/search/fast-search.d.ts +90 -0
  133. package/dist/search/fast-search.d.ts.map +1 -0
  134. package/dist/search/fast-search.js +387 -0
  135. package/dist/search/fast-search.js.map +1 -0
  136. package/dist/search/semantic.d.ts +26 -0
  137. package/dist/search/semantic.d.ts.map +1 -0
  138. package/dist/search/semantic.js +458 -0
  139. package/dist/search/semantic.js.map +1 -0
  140. package/dist/tools/analysis.d.ts +7 -0
  141. package/dist/tools/analysis.d.ts.map +1 -0
  142. package/dist/tools/analysis.js +491 -0
  143. package/dist/tools/analysis.js.map +1 -0
  144. package/dist/tools/architecture.d.ts +7 -0
  145. package/dist/tools/architecture.d.ts.map +1 -0
  146. package/dist/tools/architecture.js +176 -0
  147. package/dist/tools/architecture.js.map +1 -0
  148. package/dist/tools/devops.d.ts +7 -0
  149. package/dist/tools/devops.d.ts.map +1 -0
  150. package/dist/tools/devops.js +179 -0
  151. package/dist/tools/devops.js.map +1 -0
  152. package/dist/tools/docs.d.ts +7 -0
  153. package/dist/tools/docs.d.ts.map +1 -0
  154. package/dist/tools/docs.js +102 -0
  155. package/dist/tools/docs.js.map +1 -0
  156. package/dist/tools/git.d.ts +7 -0
  157. package/dist/tools/git.d.ts.map +1 -0
  158. package/dist/tools/git.js +475 -0
  159. package/dist/tools/git.js.map +1 -0
  160. package/dist/tools/nav.d.ts +7 -0
  161. package/dist/tools/nav.d.ts.map +1 -0
  162. package/dist/tools/nav.js +275 -0
  163. package/dist/tools/nav.js.map +1 -0
  164. package/dist/tools/notebook.d.ts +7 -0
  165. package/dist/tools/notebook.d.ts.map +1 -0
  166. package/dist/tools/notebook.js +102 -0
  167. package/dist/tools/notebook.js.map +1 -0
  168. package/dist/tools/performance.d.ts +7 -0
  169. package/dist/tools/performance.d.ts.map +1 -0
  170. package/dist/tools/performance.js +59 -0
  171. package/dist/tools/performance.js.map +1 -0
  172. package/dist/tools/quality.d.ts +7 -0
  173. package/dist/tools/quality.d.ts.map +1 -0
  174. package/dist/tools/quality.js +279 -0
  175. package/dist/tools/quality.js.map +1 -0
  176. package/dist/tools/scaffold.d.ts +7 -0
  177. package/dist/tools/scaffold.d.ts.map +1 -0
  178. package/dist/tools/scaffold.js +80 -0
  179. package/dist/tools/scaffold.js.map +1 -0
  180. package/dist/tools/search.d.ts +7 -0
  181. package/dist/tools/search.d.ts.map +1 -0
  182. package/dist/tools/search.js +308 -0
  183. package/dist/tools/search.js.map +1 -0
  184. package/dist/tools/security.d.ts +7 -0
  185. package/dist/tools/security.d.ts.map +1 -0
  186. package/dist/tools/security.js +138 -0
  187. package/dist/tools/security.js.map +1 -0
  188. package/dist/utils/analytics.d.ts +69 -0
  189. package/dist/utils/analytics.d.ts.map +1 -0
  190. package/dist/utils/analytics.js +144 -0
  191. package/dist/utils/analytics.js.map +1 -0
  192. package/dist/utils/concurrency.d.ts +43 -0
  193. package/dist/utils/concurrency.d.ts.map +1 -0
  194. package/dist/utils/concurrency.js +78 -0
  195. package/dist/utils/concurrency.js.map +1 -0
  196. package/dist/utils/fallback.d.ts +52 -0
  197. package/dist/utils/fallback.d.ts.map +1 -0
  198. package/dist/utils/fallback.js +137 -0
  199. package/dist/utils/fallback.js.map +1 -0
  200. package/dist/utils/git-hooks.d.ts +24 -0
  201. package/dist/utils/git-hooks.d.ts.map +1 -0
  202. package/dist/utils/git-hooks.js +108 -0
  203. package/dist/utils/git-hooks.js.map +1 -0
  204. package/dist/utils/languages.d.ts +72 -0
  205. package/dist/utils/languages.d.ts.map +1 -0
  206. package/dist/utils/languages.js +463 -0
  207. package/dist/utils/languages.js.map +1 -0
  208. package/dist/utils/logger.d.ts +13 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +34 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/plugins.d.ts +105 -0
  213. package/dist/utils/plugins.d.ts.map +1 -0
  214. package/dist/utils/plugins.js +325 -0
  215. package/dist/utils/plugins.js.map +1 -0
  216. package/dist/utils/security.d.ts +17 -0
  217. package/dist/utils/security.d.ts.map +1 -0
  218. package/dist/utils/security.js +48 -0
  219. package/dist/utils/security.js.map +1 -0
  220. package/dist/utils/streaming.d.ts +56 -0
  221. package/dist/utils/streaming.d.ts.map +1 -0
  222. package/dist/utils/streaming.js +95 -0
  223. package/dist/utils/streaming.js.map +1 -0
  224. package/dist/version.d.ts +3 -0
  225. package/dist/version.d.ts.map +1 -0
  226. package/dist/version.js +3 -0
  227. package/dist/version.js.map +1 -0
  228. package/mcp.json +100 -0
  229. package/package.json +89 -0
@@ -0,0 +1,491 @@
1
+ import { z } from 'zod';
2
+ import path from 'node:path';
3
+ import { stat, readFile } from 'node:fs/promises';
4
+ import { extractCallGraph, isTreeSitterReady } from '../analyzers/tree-sitter.js';
5
+ import { parseCoverage, getFileCoverage, getUntestedFiles, findTestFiles } from '../analyzers/coverage.js';
6
+ import { outputSchemas } from '../schemas/output-schemas.js';
7
+ import { CWD, ROOTS, IS_MULTI_ROOT, safePath } from '../config.js';
8
+ import { mapCodebase } from '../analyzers/codebase.js';
9
+ import { analyzeFile, formatFileOutline, extractImports } from '../analyzers/symbols.js';
10
+ import { searchCode, listFiles } from '../search/fast-search.js';
11
+ import { detectLanguage } from '../utils/languages.js';
12
+ /**
13
+ * Registers analysis tools for codebase mapping, file analysis, dependency graphing, metrics, call graphs, and test coverage.
14
+ * @param server - The MCP server instance to register tools on.
15
+ */
16
+ export function registerAnalysisTools(server) {
17
+ // ═══════════════════════════════════════════════════════════════════════
18
+ // TOOL: codebase_map — Full codebase overview
19
+ // ═══════════════════════════════════════════════════════════════════════
20
+ server.registerTool('codebase_map', {
21
+ description: 'Generate a comprehensive overview of the entire codebase: languages, frameworks, directory structure, file counts, infrastructure (tests, CI, Docker). Essential first step for understanding any project.',
22
+ outputSchema: outputSchemas.codebase_map,
23
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
24
+ }, async () => {
25
+ try {
26
+ if (IS_MULTI_ROOT) {
27
+ const parts = [`## Multi-Root Workspace (${ROOTS.length} roots)\n`];
28
+ for (const root of ROOTS) {
29
+ const { tree, summary } = await mapCodebase(root);
30
+ parts.push(`### Root: ${root}\n${summary}\n\n#### Directory Tree\n\`\`\`\n${tree}\n\`\`\`\n`);
31
+ }
32
+ return {
33
+ content: [{ type: 'text', text: parts.join('\n') }],
34
+ structuredContent: { summary: parts.join('\n'), tree: '', roots: ROOTS.length },
35
+ };
36
+ }
37
+ const { tree, summary } = await mapCodebase(CWD);
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `${summary}\n\n### Directory Tree\n\`\`\`\n${tree}\n\`\`\``,
43
+ },
44
+ ],
45
+ structuredContent: { summary, tree, roots: 1 },
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `codebase_map failed: ${error.message}. Ensure the working directory is a valid project. Check that the path is accessible.`,
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ });
60
+ // ═══════════════════════════════════════════════════════════════════════
61
+ // TOOL: analyze_file — Deep analysis of a single file
62
+ // ═══════════════════════════════════════════════════════════════════════
63
+ server.registerTool('analyze_file', {
64
+ description: 'Deep analysis of a single file: symbols (functions, classes, types), imports, line counts, complexity score, and full structural outline.',
65
+ inputSchema: {
66
+ path: z.string().describe('File path relative to project root'),
67
+ },
68
+ outputSchema: outputSchemas.analyze_file,
69
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
70
+ }, async (params) => {
71
+ try {
72
+ const filePath = safePath(params.path);
73
+ const analysis = await analyzeFile(filePath);
74
+ const outline = formatFileOutline(analysis);
75
+ return {
76
+ content: [{ type: 'text', text: outline }],
77
+ structuredContent: {
78
+ file: params.path,
79
+ language: analysis.language || 'unknown',
80
+ lines: analysis.lines || 0,
81
+ outline,
82
+ },
83
+ };
84
+ }
85
+ catch (error) {
86
+ return {
87
+ content: [
88
+ {
89
+ type: 'text',
90
+ text: `analyze_file failed: ${error.message}. Verify the file path is correct and relative to the project root. Use file_tree to list available files.`,
91
+ },
92
+ ],
93
+ isError: true,
94
+ };
95
+ }
96
+ });
97
+ // ═══════════════════════════════════════════════════════════════════════
98
+ // TOOL: dependency_graph — Analyze imports and dependencies
99
+ // ═══════════════════════════════════════════════════════════════════════
100
+ server.registerTool('dependency_graph', {
101
+ description: 'Analyze import relationships and dependencies. Shows what each file imports and what imports it. Useful for understanding code architecture and impact of changes.',
102
+ inputSchema: {
103
+ file: z.string().optional().describe('Analyze dependencies for a specific file'),
104
+ directory: z.string().optional().describe('Analyze all files in a directory'),
105
+ language: z.string().optional().describe('Filter by language'),
106
+ max_files: z.number().optional().describe('Max files to analyze (default: 100)'),
107
+ },
108
+ outputSchema: outputSchemas.dependency_graph,
109
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
110
+ }, async (params) => {
111
+ try {
112
+ if (params.file) {
113
+ // Single file dependency analysis
114
+ const filePath = safePath(params.file);
115
+ const imports = await extractImports(filePath);
116
+ // Also find what imports this file
117
+ const baseName = path.basename(params.file, path.extname(params.file));
118
+ const importedBy = await searchCode({
119
+ cwd: CWD,
120
+ pattern: baseName,
121
+ isRegex: false,
122
+ maxResults: 50,
123
+ });
124
+ const importers = importedBy
125
+ .filter((r) => r.file !== params.file && r.text.match(/import|require|from|use|include/))
126
+ .map((r) => ` ${r.file}:${r.line}`);
127
+ let output = `📄 ${params.file}\n\n`;
128
+ output += `### Imports (${imports.length}):\n${imports.map((i) => ` → ${i}`).join('\n') || ' (none)'}\n\n`;
129
+ output += `### Imported by (${importers.length}):\n${importers.join('\n') || ' (none)'}`;
130
+ return {
131
+ content: [{ type: 'text', text: output }],
132
+ structuredContent: { file: params.file, imports, importers: importers.map((i) => i.trim()) },
133
+ };
134
+ }
135
+ // Directory-wide analysis
136
+ let files = await listFiles(CWD, { type: 'file' });
137
+ if (params.directory)
138
+ files = files.filter((f) => f.startsWith(params.directory));
139
+ if (params.language)
140
+ files = files.filter((f) => detectLanguage(f) === params.language);
141
+ files = files.filter((f) => detectLanguage(f) !== 'unknown').slice(0, params.max_files || 100);
142
+ const graph = [];
143
+ for (const file of files) {
144
+ try {
145
+ const imports = await extractImports(path.join(CWD, file));
146
+ if (imports.length > 0)
147
+ graph.push({ file, imports });
148
+ }
149
+ catch {
150
+ /* skip */
151
+ }
152
+ }
153
+ const output = graph
154
+ .map(({ file, imports }) => `${file}\n${imports.map((i) => ` → ${i}`).join('\n')}`)
155
+ .join('\n\n');
156
+ return {
157
+ content: [
158
+ {
159
+ type: 'text',
160
+ text: `Dependency graph (${graph.length} files with imports):\n\n${output}`,
161
+ },
162
+ ],
163
+ structuredContent: { file: params.directory || '.', imports: graph.flatMap((g) => g.imports), importers: [] },
164
+ };
165
+ }
166
+ catch (error) {
167
+ return {
168
+ content: [
169
+ {
170
+ type: 'text',
171
+ text: `dependency_graph failed: ${error.message}. Verify file/directory exists. Use file_tree to discover project structure.`,
172
+ },
173
+ ],
174
+ isError: true,
175
+ };
176
+ }
177
+ });
178
+ // ═══════════════════════════════════════════════════════════════════════
179
+ // TOOL: code_metrics — Codebase-wide metrics and statistics
180
+ // ═══════════════════════════════════════════════════════════════════════
181
+ server.registerTool('code_metrics', {
182
+ description: 'Calculate code metrics: lines of code, comment ratios, complexity scores, file size distribution. Works per-file, per-directory, or codebase-wide.',
183
+ inputSchema: {
184
+ path: z.string().optional().describe('File or directory to analyze (default: entire codebase)'),
185
+ language: z.string().optional().describe('Filter by language'),
186
+ sort_by: z
187
+ .enum(['lines', 'complexity', 'size', 'name'])
188
+ .optional()
189
+ .describe('Sort files by metric (default: lines)'),
190
+ },
191
+ outputSchema: outputSchemas.code_metrics,
192
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
193
+ }, async (params) => {
194
+ try {
195
+ const targetPath = params.path ? safePath(params.path) : CWD;
196
+ const fileStat = await stat(targetPath);
197
+ if (fileStat.isFile()) {
198
+ const analysis = await analyzeFile(targetPath);
199
+ return {
200
+ content: [{ type: 'text', text: formatFileOutline(analysis) }],
201
+ structuredContent: {
202
+ totalFiles: 1,
203
+ totalLines: analysis.lines || 0,
204
+ languages: {},
205
+ blankLines: analysis.blankLines || 0,
206
+ commentLines: analysis.commentLines || 0,
207
+ },
208
+ };
209
+ }
210
+ // Directory metrics
211
+ let files = await listFiles(targetPath, { type: 'file' });
212
+ files = files.filter((f) => detectLanguage(f) !== 'unknown');
213
+ if (params.language)
214
+ files = files.filter((f) => detectLanguage(f) === params.language);
215
+ // Limit for performance
216
+ files = files.slice(0, 300);
217
+ const analyses = [];
218
+ for (const file of files) {
219
+ try {
220
+ const analysis = await analyzeFile(path.join(targetPath, file));
221
+ analyses.push({
222
+ file,
223
+ lines: analysis.lines,
224
+ codeLines: analysis.codeLines,
225
+ commentLines: analysis.commentLines,
226
+ complexity: analysis.complexity,
227
+ size: analysis.size,
228
+ });
229
+ }
230
+ catch {
231
+ /* skip */
232
+ }
233
+ }
234
+ // Sort
235
+ const sortKey = params.sort_by || 'lines';
236
+ analyses.sort((a, b) => {
237
+ if (sortKey === 'name')
238
+ return a.file.localeCompare(b.file);
239
+ const key = sortKey === 'lines' ? 'codeLines' : sortKey;
240
+ return b[key] - a[key];
241
+ });
242
+ // Totals
243
+ const totals = analyses.reduce((acc, a) => ({
244
+ lines: acc.lines + a.lines,
245
+ code: acc.code + a.codeLines,
246
+ comments: acc.comments + a.commentLines,
247
+ avgComplexity: acc.avgComplexity + a.complexity,
248
+ }), { lines: 0, code: 0, comments: 0, avgComplexity: 0 });
249
+ let output = `## Code Metrics${params.path ? ` — ${params.path}` : ''}\n`;
250
+ output += `Total: ${totals.lines} lines (${totals.code} code, ${totals.comments} comments) across ${analyses.length} files\n`;
251
+ output += `Comment ratio: ${totals.lines > 0 ? Math.round((totals.comments / totals.lines) * 100) : 0}%\n`;
252
+ output += `Avg complexity: ${analyses.length > 0 ? Math.round(totals.avgComplexity / analyses.length) : 0}\n\n`;
253
+ output += `### Top files by ${sortKey}\n`;
254
+ output += analyses
255
+ .slice(0, 30)
256
+ .map((a) => ` ${a.file.padEnd(50)} ${String(a.codeLines).padStart(6)} loc complexity: ${a.complexity}`)
257
+ .join('\n');
258
+ return {
259
+ content: [{ type: 'text', text: output }],
260
+ structuredContent: {
261
+ totalFiles: analyses.length,
262
+ totalLines: totals.lines,
263
+ languages: {},
264
+ blankLines: 0,
265
+ commentLines: totals.comments,
266
+ },
267
+ };
268
+ }
269
+ catch (error) {
270
+ return {
271
+ content: [
272
+ {
273
+ type: 'text',
274
+ text: `code_metrics failed: ${error.message}. Verify the path exists. For directories, ensure it contains recognized source files.`,
275
+ },
276
+ ],
277
+ isError: true,
278
+ };
279
+ }
280
+ });
281
+ // ═══════════════════════════════════════════════════════════════════════
282
+ // TOOL: call_graph — Who calls what (tree-sitter or regex)
283
+ // ═══════════════════════════════════════════════════════════════════════
284
+ server.registerTool('call_graph', {
285
+ description: 'Extract function call relationships. Shows which functions call which others. Uses tree-sitter AST when available, falls back to regex.',
286
+ inputSchema: {
287
+ file: z.string().describe('File to analyze'),
288
+ function_name: z.string().optional().describe('Filter to calls from/to this function'),
289
+ direction: z
290
+ .enum(['callers', 'callees', 'both'])
291
+ .optional()
292
+ .describe('Direction: who calls it (callers), what it calls (callees), or both (default: both)'),
293
+ },
294
+ outputSchema: outputSchemas.call_graph,
295
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
296
+ }, async (params) => {
297
+ try {
298
+ const filePath = safePath(params.file);
299
+ const language = detectLanguage(params.file);
300
+ const direction = params.direction || 'both';
301
+ // Try tree-sitter first
302
+ let calls = await extractCallGraph(filePath, language);
303
+ // Fallback: regex-based call extraction
304
+ if (!calls) {
305
+ const content = await readFile(filePath, 'utf-8');
306
+ const lines = content.split('\n');
307
+ calls = [];
308
+ let currentFunc = '<module>';
309
+ const funcDef = /(?:function|def|fn|func|async\s+function)\s+(\w+)/;
310
+ const callPattern = /(\w+)\s*\(/g;
311
+ for (let i = 0; i < lines.length; i++) {
312
+ const defMatch = lines[i].match(funcDef);
313
+ if (defMatch)
314
+ currentFunc = defMatch[1];
315
+ let m;
316
+ while ((m = callPattern.exec(lines[i])) !== null) {
317
+ const callee = m[1];
318
+ if (!['if', 'for', 'while', 'switch', 'catch', 'return', 'new', 'typeof', 'console'].includes(callee)) {
319
+ calls.push({ caller: currentFunc, callee, file: params.file, line: i + 1 });
320
+ }
321
+ }
322
+ }
323
+ }
324
+ // Filter by function name
325
+ if (params.function_name) {
326
+ if (direction === 'callers' || direction === 'both') {
327
+ const callers = calls.filter((c) => c.callee === params.function_name);
328
+ if (direction === 'callers')
329
+ calls = callers;
330
+ }
331
+ if (direction === 'callees' || direction === 'both') {
332
+ const callees = calls.filter((c) => c.caller === params.function_name);
333
+ if (direction === 'callees')
334
+ calls = callees;
335
+ else
336
+ calls = [...calls.filter((c) => c.callee === params.function_name), ...callees];
337
+ }
338
+ }
339
+ // Deduplicate
340
+ const unique = new Map();
341
+ for (const c of calls)
342
+ unique.set(`${c.caller}->${c.callee}`, c);
343
+ const dedupCalls = [...unique.values()];
344
+ // Format output
345
+ const callerGroups = new Map();
346
+ for (const c of dedupCalls) {
347
+ if (!callerGroups.has(c.caller))
348
+ callerGroups.set(c.caller, []);
349
+ callerGroups.get(c.caller).push(`→ ${c.callee} (L${c.line})`);
350
+ }
351
+ let output = `Call graph for ${params.file}${params.function_name ? ` (${params.function_name})` : ''}\n`;
352
+ output += `${dedupCalls.length} call relationships found${isTreeSitterReady() ? ' (tree-sitter AST)' : ' (regex fallback)'}:\n\n`;
353
+ for (const [caller, callees] of callerGroups) {
354
+ output += `${caller}:\n${callees.map((c) => ` ${c}`).join('\n')}\n\n`;
355
+ }
356
+ return {
357
+ content: [{ type: 'text', text: output }],
358
+ structuredContent: {
359
+ file: params.file,
360
+ functions: Array.from(callerGroups).map(([name, calls]) => ({ name, calls, calledBy: [] })),
361
+ },
362
+ };
363
+ }
364
+ catch (error) {
365
+ return {
366
+ content: [
367
+ {
368
+ type: 'text',
369
+ text: `call_graph failed: ${error.message}. Verify the file exists. Use file_tree to discover files.`,
370
+ },
371
+ ],
372
+ isError: true,
373
+ };
374
+ }
375
+ });
376
+ // ═══════════════════════════════════════════════════════════════════════
377
+ // TOOL: test_coverage — Test coverage analysis
378
+ // ═══════════════════════════════════════════════════════════════════════
379
+ server.registerTool('test_coverage', {
380
+ description: 'Analyze test coverage. Reads lcov, istanbul, and cobertura formats. Shows covered/uncovered lines, untested functions, and coverage percentages.',
381
+ inputSchema: {
382
+ action: z
383
+ .enum(['summary', 'file', 'untested', 'test_files'])
384
+ .describe('summary: overall coverage stats, file: coverage for specific file, untested: list uncovered files, test_files: find test files'),
385
+ file: z.string().optional().describe('File path for file-specific coverage'),
386
+ },
387
+ outputSchema: outputSchemas.test_coverage,
388
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
389
+ }, async (params) => {
390
+ try {
391
+ if (params.action === 'test_files') {
392
+ const testFiles = await findTestFiles(CWD);
393
+ return {
394
+ content: [{ type: 'text', text: `Found ${testFiles.length} test files:\n\n${testFiles.join('\n')}` }],
395
+ structuredContent: { action: 'test_files', data: testFiles },
396
+ };
397
+ }
398
+ const coverage = await parseCoverage(CWD);
399
+ if (!coverage) {
400
+ return {
401
+ content: [
402
+ {
403
+ type: 'text',
404
+ text: 'No coverage data found. Run your test suite with coverage enabled first (e.g. "jest --coverage", "pytest --cov", "go test -coverprofile"). Supported formats: lcov, istanbul JSON, cobertura XML.',
405
+ },
406
+ ],
407
+ structuredContent: { action: 'summary', data: [] },
408
+ };
409
+ }
410
+ switch (params.action) {
411
+ case 'summary': {
412
+ let output = `## Test Coverage (${coverage.format})\n\n`;
413
+ output += `Files: ${coverage.totalFiles}\n`;
414
+ output += `Lines: ${coverage.lines.covered}/${coverage.lines.total} (${coverage.lines.percentage}%)\n`;
415
+ output += `Functions: ${coverage.functions.covered}/${coverage.functions.total} (${coverage.functions.percentage}%)\n`;
416
+ output += `Branches: ${coverage.branches.covered}/${coverage.branches.total} (${coverage.branches.percentage}%)\n\n`;
417
+ output += `### Lowest coverage files:\n`;
418
+ output += coverage.files
419
+ .slice(0, 15)
420
+ .map((f) => ` ${f.file.padEnd(50)} ${String(f.lines.percentage).padStart(3)}% lines ${String(f.functions.percentage).padStart(3)}% funcs`)
421
+ .join('\n');
422
+ return {
423
+ content: [{ type: 'text', text: output }],
424
+ structuredContent: {
425
+ action: 'summary',
426
+ data: coverage.files.slice(0, 15).map((f) => ({
427
+ file: f.file,
428
+ linesPercent: f.lines.percentage,
429
+ funcsPercent: f.functions.percentage,
430
+ })),
431
+ },
432
+ };
433
+ }
434
+ case 'file': {
435
+ if (!params.file)
436
+ return {
437
+ content: [{ type: 'text', text: 'File path required for file-specific coverage.' }],
438
+ isError: true,
439
+ };
440
+ const fc = getFileCoverage(coverage, params.file);
441
+ if (!fc)
442
+ return {
443
+ content: [
444
+ {
445
+ type: 'text',
446
+ text: `No coverage data for "${params.file}". Ensure the file is included in coverage reports.`,
447
+ },
448
+ ],
449
+ structuredContent: { action: 'file', data: [] },
450
+ };
451
+ let output = `Coverage for ${fc.file}:\n`;
452
+ output += ` Lines: ${fc.lines.covered}/${fc.lines.total} (${fc.lines.percentage}%)\n`;
453
+ output += ` Functions: ${fc.functions.covered}/${fc.functions.total} (${fc.functions.percentage}%)\n`;
454
+ output += ` Branches: ${fc.branches.covered}/${fc.branches.total} (${fc.branches.percentage}%)\n`;
455
+ if (fc.uncoveredLines.length > 0)
456
+ output += ` Uncovered lines: ${fc.uncoveredLines.slice(0, 50).join(', ')}${fc.uncoveredLines.length > 50 ? '...' : ''}\n`;
457
+ if (fc.uncoveredFunctions.length > 0)
458
+ output += ` Untested functions: ${fc.uncoveredFunctions.join(', ')}\n`;
459
+ return {
460
+ content: [{ type: 'text', text: output }],
461
+ structuredContent: {
462
+ action: 'file',
463
+ data: [{ file: params.file, linesPercent: fc.lines.percentage, funcsPercent: fc.functions.percentage }],
464
+ },
465
+ };
466
+ }
467
+ case 'untested': {
468
+ const untested = getUntestedFiles(coverage);
469
+ return {
470
+ content: [{ type: 'text', text: `${untested.length} files with 0% coverage:\n\n${untested.join('\n')}` }],
471
+ structuredContent: { action: 'untested', data: untested },
472
+ };
473
+ }
474
+ default:
475
+ return { content: [{ type: 'text', text: `Unknown action: ${params.action}` }], isError: true };
476
+ }
477
+ }
478
+ catch (error) {
479
+ return {
480
+ content: [
481
+ {
482
+ type: 'text',
483
+ text: `test_coverage failed: ${error.message}. Ensure coverage reports exist in the project.`,
484
+ },
485
+ ],
486
+ isError: true,
487
+ };
488
+ }
489
+ });
490
+ }
491
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Registers architecture tools for checking architectural constraints, database schemas, and API contracts.
4
+ * @param server - The MCP server instance to register tools on.
5
+ */
6
+ export declare function registerArchitectureTools(server: McpServer): void;
7
+ //# sourceMappingURL=architecture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture.d.ts","sourceRoot":"","sources":["../../src/tools/architecture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA2L1D"}