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,458 @@
1
+ /**
2
+ * Semantic code search using TF-IDF scoring.
3
+ * No external model dependencies — works offline, instant startup.
4
+ *
5
+ * Answers queries like "find authentication logic" or "error handling code"
6
+ * by matching against function names, comments, imports, and string literals.
7
+ */
8
+ import { readFile } from 'node:fs/promises';
9
+ import path from 'node:path';
10
+ // Concept synonyms for expanding queries
11
+ const CONCEPT_MAP = {
12
+ auth: [
13
+ 'auth',
14
+ 'login',
15
+ 'logout',
16
+ 'session',
17
+ 'token',
18
+ 'jwt',
19
+ 'oauth',
20
+ 'password',
21
+ 'credential',
22
+ 'authenticate',
23
+ 'authorize',
24
+ 'permission',
25
+ 'role',
26
+ 'rbac',
27
+ ],
28
+ database: [
29
+ 'database',
30
+ 'db',
31
+ 'sql',
32
+ 'query',
33
+ 'table',
34
+ 'schema',
35
+ 'migration',
36
+ 'model',
37
+ 'orm',
38
+ 'repository',
39
+ 'entity',
40
+ 'record',
41
+ 'row',
42
+ 'column',
43
+ 'index',
44
+ ],
45
+ api: [
46
+ 'api',
47
+ 'endpoint',
48
+ 'route',
49
+ 'handler',
50
+ 'controller',
51
+ 'middleware',
52
+ 'request',
53
+ 'response',
54
+ 'rest',
55
+ 'graphql',
56
+ 'grpc',
57
+ 'webhook',
58
+ ],
59
+ error: [
60
+ 'error',
61
+ 'exception',
62
+ 'catch',
63
+ 'throw',
64
+ 'try',
65
+ 'finally',
66
+ 'fault',
67
+ 'failure',
68
+ 'retry',
69
+ 'fallback',
70
+ 'recovery',
71
+ 'panic',
72
+ ],
73
+ test: [
74
+ 'test',
75
+ 'spec',
76
+ 'describe',
77
+ 'it',
78
+ 'expect',
79
+ 'assert',
80
+ 'mock',
81
+ 'stub',
82
+ 'fixture',
83
+ 'beforeEach',
84
+ 'afterEach',
85
+ 'jest',
86
+ 'mocha',
87
+ 'pytest',
88
+ ],
89
+ config: [
90
+ 'config',
91
+ 'configuration',
92
+ 'settings',
93
+ 'env',
94
+ 'environment',
95
+ 'option',
96
+ 'preference',
97
+ 'parameter',
98
+ 'setup',
99
+ 'initialize',
100
+ ],
101
+ cache: ['cache', 'memoize', 'redis', 'memcache', 'ttl', 'invalidate', 'expire', 'store', 'lru'],
102
+ log: [
103
+ 'log',
104
+ 'logger',
105
+ 'logging',
106
+ 'debug',
107
+ 'trace',
108
+ 'info',
109
+ 'warn',
110
+ 'console',
111
+ 'print',
112
+ 'output',
113
+ 'telemetry',
114
+ 'metric',
115
+ ],
116
+ security: [
117
+ 'security',
118
+ 'encrypt',
119
+ 'decrypt',
120
+ 'hash',
121
+ 'salt',
122
+ 'csrf',
123
+ 'xss',
124
+ 'sanitize',
125
+ 'validate',
126
+ 'escape',
127
+ 'cors',
128
+ 'helmet',
129
+ ],
130
+ ui: [
131
+ 'ui',
132
+ 'component',
133
+ 'render',
134
+ 'template',
135
+ 'view',
136
+ 'layout',
137
+ 'style',
138
+ 'css',
139
+ 'html',
140
+ 'dom',
141
+ 'element',
142
+ 'widget',
143
+ 'page',
144
+ ],
145
+ network: [
146
+ 'network',
147
+ 'http',
148
+ 'https',
149
+ 'fetch',
150
+ 'axios',
151
+ 'socket',
152
+ 'websocket',
153
+ 'tcp',
154
+ 'udp',
155
+ 'connection',
156
+ 'client',
157
+ 'server',
158
+ ],
159
+ file: ['file', 'filesystem', 'fs', 'read', 'write', 'stream', 'buffer', 'path', 'directory', 'upload', 'download'],
160
+ async: [
161
+ 'async',
162
+ 'await',
163
+ 'promise',
164
+ 'callback',
165
+ 'event',
166
+ 'emitter',
167
+ 'observable',
168
+ 'future',
169
+ 'channel',
170
+ 'concurrent',
171
+ 'parallel',
172
+ 'thread',
173
+ 'worker',
174
+ ],
175
+ validation: [
176
+ 'validate',
177
+ 'validation',
178
+ 'schema',
179
+ 'check',
180
+ 'verify',
181
+ 'constraint',
182
+ 'rule',
183
+ 'sanitize',
184
+ 'parse',
185
+ 'zod',
186
+ 'joi',
187
+ 'yup',
188
+ ],
189
+ payment: [
190
+ 'payment',
191
+ 'stripe',
192
+ 'billing',
193
+ 'invoice',
194
+ 'subscription',
195
+ 'charge',
196
+ 'refund',
197
+ 'checkout',
198
+ 'cart',
199
+ 'order',
200
+ 'price',
201
+ ],
202
+ };
203
+ /**
204
+ * Tokenize code into meaningful words.
205
+ * Splits camelCase, snake_case, removes noise.
206
+ * @param text - The code text to tokenize.
207
+ * @returns An array of unique meaningful tokens.
208
+ */
209
+ function tokenize(text) {
210
+ // Remove string contents, keep identifiers
211
+ const cleaned = text
212
+ .replace(/(['"`])[\s\S]*?\1/g, '')
213
+ // Keep comments (useful signals)
214
+ .replace(/\/\/.*$/gm, (m) => m)
215
+ // Keep block comments
216
+ .replace(/\/\*[\s\S]*?\*\//g, (m) => m);
217
+ // Extract words, split camelCase and snake_case
218
+ const words = cleaned
219
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
220
+ .replace(/[_\-./\\]/g, ' ')
221
+ .replace(/[^a-zA-Z0-9\s]/g, ' ')
222
+ .toLowerCase()
223
+ .split(/\s+/)
224
+ .filter((w) => w.length > 2 && !STOP_WORDS.has(w));
225
+ // Deduplicate
226
+ return [...new Set(words)];
227
+ }
228
+ const STOP_WORDS = new Set([
229
+ 'the',
230
+ 'and',
231
+ 'for',
232
+ 'are',
233
+ 'but',
234
+ 'not',
235
+ 'you',
236
+ 'all',
237
+ 'can',
238
+ 'had',
239
+ 'her',
240
+ 'was',
241
+ 'one',
242
+ 'our',
243
+ 'out',
244
+ 'has',
245
+ 'its',
246
+ 'let',
247
+ 'var',
248
+ 'const',
249
+ 'new',
250
+ 'this',
251
+ 'that',
252
+ 'with',
253
+ 'from',
254
+ 'will',
255
+ 'have',
256
+ 'been',
257
+ 'more',
258
+ 'when',
259
+ 'who',
260
+ 'than',
261
+ 'them',
262
+ 'some',
263
+ 'what',
264
+ 'then',
265
+ 'each',
266
+ 'make',
267
+ 'like',
268
+ 'just',
269
+ 'use',
270
+ 'null',
271
+ 'void',
272
+ 'true',
273
+ 'false',
274
+ 'else',
275
+ 'case',
276
+ 'return',
277
+ 'import',
278
+ 'export',
279
+ 'default',
280
+ 'require',
281
+ 'module',
282
+ 'string',
283
+ 'number',
284
+ 'boolean',
285
+ 'object',
286
+ 'array',
287
+ 'type',
288
+ 'interface',
289
+ 'class',
290
+ 'function',
291
+ 'extends',
292
+ 'implements',
293
+ 'public',
294
+ 'private',
295
+ 'protected',
296
+ 'static',
297
+ 'abstract',
298
+ 'override',
299
+ 'readonly',
300
+ 'any',
301
+ 'undefined',
302
+ ]);
303
+ /**
304
+ * Chunk a file into logical blocks (functions, classes, or fixed-size blocks).
305
+ * @param content - The file content to chunk.
306
+ * @param _filePath - The file path (unused, reserved for future language-specific chunking).
307
+ * @returns An array of chunks with line ranges.
308
+ */
309
+ function chunkFile(content, _filePath) {
310
+ const lines = content.split('\n');
311
+ const chunks = [];
312
+ // Simple heuristic: split on function/class definitions or every 30 lines
313
+ let currentChunk = [];
314
+ let startLine = 1;
315
+ const funcPattern = /^(?:export\s+)?(?:async\s+)?(?:function|class|def|fn|func|pub\s+fn|pub\s+async\s+fn|module|impl)\b/;
316
+ const methodPattern = /^\s+(?:async\s+)?(?:public|private|protected|static)?\s*(?:function|def|fn)?\s*\w+\s*\(/;
317
+ for (let i = 0; i < lines.length; i++) {
318
+ const line = lines[i];
319
+ const isDefinition = funcPattern.test(line.trim()) || methodPattern.test(line);
320
+ if (isDefinition && currentChunk.length > 5) {
321
+ // Save current chunk and start new one
322
+ chunks.push({
323
+ chunk: currentChunk.join('\n'),
324
+ startLine,
325
+ endLine: i,
326
+ });
327
+ currentChunk = [line];
328
+ startLine = i + 1;
329
+ }
330
+ else {
331
+ currentChunk.push(line);
332
+ // Also split if chunk is too large
333
+ if (currentChunk.length >= 50) {
334
+ chunks.push({
335
+ chunk: currentChunk.join('\n'),
336
+ startLine,
337
+ endLine: i + 1,
338
+ });
339
+ currentChunk = [];
340
+ startLine = i + 2;
341
+ }
342
+ }
343
+ }
344
+ if (currentChunk.length > 0) {
345
+ chunks.push({
346
+ chunk: currentChunk.join('\n'),
347
+ startLine,
348
+ endLine: lines.length,
349
+ });
350
+ }
351
+ return chunks;
352
+ }
353
+ /**
354
+ * Expand query using concept synonyms.
355
+ * @param query - The search query to expand.
356
+ * @returns An expanded array of query terms.
357
+ */
358
+ function expandQuery(query) {
359
+ const queryTokens = tokenize(query);
360
+ const expanded = new Set(queryTokens);
361
+ for (const token of queryTokens) {
362
+ for (const [concept, synonyms] of Object.entries(CONCEPT_MAP)) {
363
+ if (synonyms.includes(token) || concept === token) {
364
+ for (const syn of synonyms) {
365
+ expanded.add(syn);
366
+ }
367
+ }
368
+ }
369
+ }
370
+ return [...expanded];
371
+ }
372
+ /**
373
+ * Calculate TF-IDF score for a chunk against expanded query terms.
374
+ * @param chunkTokens - Tokens from the code chunk.
375
+ * @param queryTerms - Expanded query terms.
376
+ * @param idf - Inverse document frequency map.
377
+ * @returns The score and list of matched terms.
378
+ */
379
+ function scoreTfIdf(chunkTokens, queryTerms, idf) {
380
+ const tf = new Map();
381
+ for (const token of chunkTokens) {
382
+ tf.set(token, (tf.get(token) || 0) + 1);
383
+ }
384
+ let score = 0;
385
+ const matched = [];
386
+ for (const term of queryTerms) {
387
+ const termTf = tf.get(term) || 0;
388
+ if (termTf > 0) {
389
+ const termIdf = idf.get(term) || 1;
390
+ score += (1 + Math.log(termTf)) * termIdf;
391
+ matched.push(term);
392
+ }
393
+ }
394
+ return { score, matched };
395
+ }
396
+ /**
397
+ * Perform semantic search across files.
398
+ * @param files - List of file paths to search.
399
+ * @param query - The search query string.
400
+ * @param cwd - The working directory.
401
+ * @param maxResults - Maximum number of results to return.
402
+ * @returns Ranked search results with scores and snippets.
403
+ */
404
+ export async function semanticSearch(files, query, cwd, maxResults = 20) {
405
+ const expandedQuery = expandQuery(query);
406
+ // Index all chunks
407
+ const docs = [];
408
+ // Document frequency for IDF
409
+ const docFreq = new Map();
410
+ for (const file of files.slice(0, 500)) {
411
+ try {
412
+ const fullPath = path.join(cwd, file);
413
+ const content = await readFile(fullPath, 'utf-8');
414
+ const chunks = chunkFile(content, file);
415
+ for (const { chunk, startLine, endLine } of chunks) {
416
+ const tokens = tokenize(chunk);
417
+ docs.push({ file, chunk, startLine, endLine, tokens });
418
+ // Update document frequency
419
+ const uniqueTokens = new Set(tokens);
420
+ for (const token of uniqueTokens) {
421
+ docFreq.set(token, (docFreq.get(token) || 0) + 1);
422
+ }
423
+ }
424
+ }
425
+ catch {
426
+ /* skip unreadable files */
427
+ }
428
+ }
429
+ if (docs.length === 0)
430
+ return [];
431
+ // Calculate IDF
432
+ const idf = new Map();
433
+ const N = docs.length;
434
+ for (const [term, df] of docFreq) {
435
+ idf.set(term, Math.log(N / (1 + df)));
436
+ }
437
+ // Score each chunk
438
+ const scored = [];
439
+ for (const doc of docs) {
440
+ const { score, matched } = scoreTfIdf(doc.tokens, expandedQuery, idf);
441
+ if (score > 0 && matched.length > 0) {
442
+ // Get a snippet (first few lines of the chunk)
443
+ const snippetLines = doc.chunk.split('\n').slice(0, 5);
444
+ scored.push({
445
+ file: doc.file,
446
+ startLine: doc.startLine,
447
+ endLine: doc.endLine,
448
+ score,
449
+ snippet: snippetLines.join('\n'),
450
+ matchedTerms: matched,
451
+ });
452
+ }
453
+ }
454
+ // Sort by score descending
455
+ scored.sort((a, b) => b.score - a.score);
456
+ return scored.slice(0, maxResults);
457
+ }
458
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/search/semantic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAqB7B,yCAAyC;AACzC,MAAM,WAAW,GAA6B;IAC5C,IAAI,EAAE;QACJ,MAAM;QACN,OAAO;QACP,QAAQ;QACR,SAAS;QACT,OAAO;QACP,KAAK;QACL,OAAO;QACP,UAAU;QACV,YAAY;QACZ,cAAc;QACd,WAAW;QACX,YAAY;QACZ,MAAM;QACN,MAAM;KACP;IACD,QAAQ,EAAE;QACR,UAAU;QACV,IAAI;QACJ,KAAK;QACL,OAAO;QACP,OAAO;QACP,QAAQ;QACR,WAAW;QACX,OAAO;QACP,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,OAAO;KACR;IACD,GAAG,EAAE;QACH,KAAK;QACL,UAAU;QACV,OAAO;QACP,SAAS;QACT,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,UAAU;QACV,MAAM;QACN,SAAS;QACT,MAAM;QACN,SAAS;KACV;IACD,KAAK,EAAE;QACL,OAAO;QACP,WAAW;QACX,OAAO;QACP,OAAO;QACP,KAAK;QACL,SAAS;QACT,OAAO;QACP,SAAS;QACT,OAAO;QACP,UAAU;QACV,UAAU;QACV,OAAO;KACR;IACD,IAAI,EAAE;QACJ,MAAM;QACN,MAAM;QACN,UAAU;QACV,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,MAAM;QACN,SAAS;QACT,YAAY;QACZ,WAAW;QACX,MAAM;QACN,OAAO;QACP,QAAQ;KACT;IACD,MAAM,EAAE;QACN,QAAQ;QACR,eAAe;QACf,UAAU;QACV,KAAK;QACL,aAAa;QACb,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,YAAY;KACb;IACD,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;IAC/F,GAAG,EAAE;QACH,KAAK;QACL,QAAQ;QACR,SAAS;QACT,OAAO;QACP,OAAO;QACP,MAAM;QACN,MAAM;QACN,SAAS;QACT,OAAO;QACP,QAAQ;QACR,WAAW;QACX,QAAQ;KACT;IACD,QAAQ,EAAE;QACR,UAAU;QACV,SAAS;QACT,SAAS;QACT,MAAM;QACN,MAAM;QACN,MAAM;QACN,KAAK;QACL,UAAU;QACV,UAAU;QACV,QAAQ;QACR,MAAM;QACN,QAAQ;KACT;IACD,EAAE,EAAE;QACF,IAAI;QACJ,WAAW;QACX,QAAQ;QACR,UAAU;QACV,MAAM;QACN,QAAQ;QACR,OAAO;QACP,KAAK;QACL,MAAM;QACN,KAAK;QACL,SAAS;QACT,QAAQ;QACR,MAAM;KACP;IACD,OAAO,EAAE;QACP,SAAS;QACT,MAAM;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,QAAQ;QACR,WAAW;QACX,KAAK;QACL,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,QAAQ;KACT;IACD,IAAI,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC;IAClH,KAAK,EAAE;QACL,OAAO;QACP,OAAO;QACP,SAAS;QACT,UAAU;QACV,OAAO;QACP,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,YAAY;QACZ,UAAU;QACV,QAAQ;QACR,QAAQ;KACT;IACD,UAAU,EAAE;QACV,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,MAAM;QACN,UAAU;QACV,OAAO;QACP,KAAK;QACL,KAAK;QACL,KAAK;KACN;IACD,OAAO,EAAE;QACP,SAAS;QACT,QAAQ;QACR,SAAS;QACT,SAAS;QACT,cAAc;QACd,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,MAAM;QACN,OAAO;QACP,OAAO;KACR;CACF,CAAC;AAEF;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAY;IAC5B,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI;SACjB,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAClC,iCAAiC;SAChC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/B,sBAAsB;SACrB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1C,gDAAgD;IAChD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;SAC1B,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC;SAC/B,WAAW,EAAE;SACb,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,cAAc;IACd,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,UAAU;IACV,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,WAAW;IACX,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,KAAK;IACL,WAAW;CACZ,CAAC,CAAC;AAEH;;;;;GAKG;AACH,SAAS,SAAS,CAAC,OAAe,EAAE,SAAiB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAA4D,EAAE,CAAC;IAE3E,0EAA0E;IAC1E,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,WAAW,GACf,oGAAoG,CAAC;IACvG,MAAM,aAAa,GAAG,yFAAyF,CAAC;IAEhH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/E,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,uCAAuC;YACvC,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC9B,SAAS;gBACT,OAAO,EAAE,CAAC;aACX,CAAC,CAAC;YACH,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC;YACtB,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,mCAAmC;YACnC,IAAI,YAAY,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC9B,SAAS;oBACT,OAAO,EAAE,CAAC,GAAG,CAAC;iBACf,CAAC,CAAC;gBACH,YAAY,GAAG,EAAE,CAAC;gBAClB,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9B,SAAS;YACT,OAAO,EAAE,KAAK,CAAC,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;IAEtC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9D,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBAClD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;oBAC3B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CACjB,WAAqB,EACrB,UAAoB,EACpB,GAAwB;IAExB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAe,EACf,KAAa,EACb,GAAW,EACX,UAAU,GAAG,EAAE;IAEf,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAEzC,mBAAmB;IACnB,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAExC,KAAK,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAEvD,4BAA4B;gBAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;gBACrC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,gBAAgB;IAChB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,+CAA+C;YAC/C,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK;gBACL,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,YAAY,EAAE,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Registers analysis tools for codebase mapping, file analysis, dependency graphing, metrics, call graphs, and test coverage.
4
+ * @param server - The MCP server instance to register tools on.
5
+ */
6
+ export declare function registerAnalysisTools(server: McpServer): void;
7
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../src/tools/analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAyhBtD"}