codesift-mcp 0.1.0 → 0.2.1

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 (299) hide show
  1. package/LICENSE +66 -21
  2. package/README.md +402 -56
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +11 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/commands.d.ts.map +1 -1
  8. package/dist/cli/commands.js +177 -67
  9. package/dist/cli/commands.js.map +1 -1
  10. package/dist/cli/help.d.ts +1 -1
  11. package/dist/cli/help.d.ts.map +1 -1
  12. package/dist/cli/help.js +157 -0
  13. package/dist/cli/help.js.map +1 -1
  14. package/dist/cli/hooks.d.ts +3 -0
  15. package/dist/cli/hooks.d.ts.map +1 -0
  16. package/dist/cli/hooks.js +163 -0
  17. package/dist/cli/hooks.js.map +1 -0
  18. package/dist/cli/setup.d.ts +25 -0
  19. package/dist/cli/setup.d.ts.map +1 -0
  20. package/dist/cli/setup.js +400 -0
  21. package/dist/cli/setup.js.map +1 -0
  22. package/dist/config.d.ts +2 -0
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +2 -0
  25. package/dist/config.js.map +1 -1
  26. package/dist/formatters-shortening.d.ts +7 -0
  27. package/dist/formatters-shortening.d.ts.map +1 -0
  28. package/dist/formatters-shortening.js +68 -0
  29. package/dist/formatters-shortening.js.map +1 -0
  30. package/dist/formatters.d.ts +314 -0
  31. package/dist/formatters.d.ts.map +1 -0
  32. package/dist/formatters.js +396 -0
  33. package/dist/formatters.js.map +1 -0
  34. package/dist/instructions.d.ts +6 -0
  35. package/dist/instructions.d.ts.map +1 -0
  36. package/dist/instructions.js +72 -0
  37. package/dist/instructions.js.map +1 -0
  38. package/dist/lsp/lsp-client.d.ts +21 -0
  39. package/dist/lsp/lsp-client.d.ts.map +1 -0
  40. package/dist/lsp/lsp-client.js +122 -0
  41. package/dist/lsp/lsp-client.js.map +1 -0
  42. package/dist/lsp/lsp-manager.d.ts +12 -0
  43. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  44. package/dist/lsp/lsp-manager.js +82 -0
  45. package/dist/lsp/lsp-manager.js.map +1 -0
  46. package/dist/lsp/lsp-servers.d.ts +13 -0
  47. package/dist/lsp/lsp-servers.d.ts.map +1 -0
  48. package/dist/lsp/lsp-servers.js +57 -0
  49. package/dist/lsp/lsp-servers.js.map +1 -0
  50. package/dist/lsp/lsp-tools.d.ts +67 -0
  51. package/dist/lsp/lsp-tools.d.ts.map +1 -0
  52. package/dist/lsp/lsp-tools.js +359 -0
  53. package/dist/lsp/lsp-tools.js.map +1 -0
  54. package/dist/parser/extractors/_shared.d.ts +11 -0
  55. package/dist/parser/extractors/_shared.d.ts.map +1 -0
  56. package/dist/parser/extractors/_shared.js +38 -0
  57. package/dist/parser/extractors/_shared.js.map +1 -0
  58. package/dist/parser/extractors/astro.d.ts +15 -0
  59. package/dist/parser/extractors/astro.d.ts.map +1 -0
  60. package/dist/parser/extractors/astro.js +104 -0
  61. package/dist/parser/extractors/astro.js.map +1 -0
  62. package/dist/parser/extractors/conversation.d.ts +16 -0
  63. package/dist/parser/extractors/conversation.d.ts.map +1 -0
  64. package/dist/parser/extractors/conversation.js +196 -0
  65. package/dist/parser/extractors/conversation.js.map +1 -0
  66. package/dist/parser/extractors/go.d.ts.map +1 -1
  67. package/dist/parser/extractors/go.js +22 -45
  68. package/dist/parser/extractors/go.js.map +1 -1
  69. package/dist/parser/extractors/python.d.ts +1 -1
  70. package/dist/parser/extractors/python.d.ts.map +1 -1
  71. package/dist/parser/extractors/python.js +19 -50
  72. package/dist/parser/extractors/python.js.map +1 -1
  73. package/dist/parser/extractors/rust.d.ts +1 -1
  74. package/dist/parser/extractors/rust.d.ts.map +1 -1
  75. package/dist/parser/extractors/rust.js +7 -34
  76. package/dist/parser/extractors/rust.js.map +1 -1
  77. package/dist/parser/extractors/typescript.d.ts +1 -1
  78. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  79. package/dist/parser/extractors/typescript.js +99 -68
  80. package/dist/parser/extractors/typescript.js.map +1 -1
  81. package/dist/parser/parser-manager.d.ts.map +1 -1
  82. package/dist/parser/parser-manager.js +12 -2
  83. package/dist/parser/parser-manager.js.map +1 -1
  84. package/dist/parser/symbol-extractor.d.ts +2 -0
  85. package/dist/parser/symbol-extractor.d.ts.map +1 -1
  86. package/dist/parser/symbol-extractor.js +2 -0
  87. package/dist/parser/symbol-extractor.js.map +1 -1
  88. package/dist/register-tools.d.ts +127 -0
  89. package/dist/register-tools.d.ts.map +1 -0
  90. package/dist/register-tools.js +1453 -0
  91. package/dist/register-tools.js.map +1 -0
  92. package/dist/retrieval/codebase-retrieval.d.ts +4 -26
  93. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
  94. package/dist/retrieval/codebase-retrieval.js +105 -403
  95. package/dist/retrieval/codebase-retrieval.js.map +1 -1
  96. package/dist/retrieval/retrieval-constants.d.ts +27 -0
  97. package/dist/retrieval/retrieval-constants.d.ts.map +1 -0
  98. package/dist/retrieval/retrieval-constants.js +27 -0
  99. package/dist/retrieval/retrieval-constants.js.map +1 -0
  100. package/dist/retrieval/retrieval-schemas.d.ts +107 -0
  101. package/dist/retrieval/retrieval-schemas.d.ts.map +1 -0
  102. package/dist/retrieval/retrieval-schemas.js +102 -0
  103. package/dist/retrieval/retrieval-schemas.js.map +1 -0
  104. package/dist/retrieval/retrieval-utils.d.ts +40 -0
  105. package/dist/retrieval/retrieval-utils.d.ts.map +1 -0
  106. package/dist/retrieval/retrieval-utils.js +139 -0
  107. package/dist/retrieval/retrieval-utils.js.map +1 -0
  108. package/dist/retrieval/semantic-handlers.d.ts +8 -0
  109. package/dist/retrieval/semantic-handlers.d.ts.map +1 -0
  110. package/dist/retrieval/semantic-handlers.js +152 -0
  111. package/dist/retrieval/semantic-handlers.js.map +1 -0
  112. package/dist/search/bm25.d.ts +6 -1
  113. package/dist/search/bm25.d.ts.map +1 -1
  114. package/dist/search/bm25.js +95 -32
  115. package/dist/search/bm25.js.map +1 -1
  116. package/dist/search/chunker.d.ts +10 -0
  117. package/dist/search/chunker.d.ts.map +1 -1
  118. package/dist/search/chunker.js +63 -11
  119. package/dist/search/chunker.js.map +1 -1
  120. package/dist/search/reranker.d.ts +15 -0
  121. package/dist/search/reranker.d.ts.map +1 -0
  122. package/dist/search/reranker.js +126 -0
  123. package/dist/search/reranker.js.map +1 -0
  124. package/dist/search/semantic.d.ts +1 -1
  125. package/dist/search/semantic.d.ts.map +1 -1
  126. package/dist/search/semantic.js +40 -45
  127. package/dist/search/semantic.js.map +1 -1
  128. package/dist/server-helpers.d.ts +29 -0
  129. package/dist/server-helpers.d.ts.map +1 -0
  130. package/dist/server-helpers.js +312 -0
  131. package/dist/server-helpers.js.map +1 -0
  132. package/dist/server.d.ts +1 -1
  133. package/dist/server.d.ts.map +1 -1
  134. package/dist/server.js +11 -271
  135. package/dist/server.js.map +1 -1
  136. package/dist/storage/_shared.d.ts +9 -0
  137. package/dist/storage/_shared.d.ts.map +1 -0
  138. package/dist/storage/_shared.js +26 -0
  139. package/dist/storage/_shared.js.map +1 -0
  140. package/dist/storage/chunk-store.d.ts.map +1 -1
  141. package/dist/storage/chunk-store.js +23 -63
  142. package/dist/storage/chunk-store.js.map +1 -1
  143. package/dist/storage/embedding-store.d.ts +6 -3
  144. package/dist/storage/embedding-store.d.ts.map +1 -1
  145. package/dist/storage/embedding-store.js +54 -30
  146. package/dist/storage/embedding-store.js.map +1 -1
  147. package/dist/storage/graph-store.d.ts +48 -0
  148. package/dist/storage/graph-store.d.ts.map +1 -0
  149. package/dist/storage/graph-store.js +52 -0
  150. package/dist/storage/graph-store.js.map +1 -0
  151. package/dist/storage/index-store.d.ts +5 -0
  152. package/dist/storage/index-store.d.ts.map +1 -1
  153. package/dist/storage/index-store.js +28 -16
  154. package/dist/storage/index-store.js.map +1 -1
  155. package/dist/storage/registry.d.ts +4 -0
  156. package/dist/storage/registry.d.ts.map +1 -1
  157. package/dist/storage/registry.js +16 -16
  158. package/dist/storage/registry.js.map +1 -1
  159. package/dist/storage/usage-stats.d.ts +6 -0
  160. package/dist/storage/usage-stats.d.ts.map +1 -1
  161. package/dist/storage/usage-stats.js +59 -11
  162. package/dist/storage/usage-stats.js.map +1 -1
  163. package/dist/storage/usage-tracker.d.ts +3 -0
  164. package/dist/storage/usage-tracker.d.ts.map +1 -1
  165. package/dist/storage/usage-tracker.js +50 -132
  166. package/dist/storage/usage-tracker.js.map +1 -1
  167. package/dist/storage/watcher.d.ts +2 -1
  168. package/dist/storage/watcher.d.ts.map +1 -1
  169. package/dist/storage/watcher.js +16 -16
  170. package/dist/storage/watcher.js.map +1 -1
  171. package/dist/tools/ast-query-tools.d.ts +29 -0
  172. package/dist/tools/ast-query-tools.d.ts.map +1 -0
  173. package/dist/tools/ast-query-tools.js +110 -0
  174. package/dist/tools/ast-query-tools.js.map +1 -0
  175. package/dist/tools/boundary-tools.d.ts +31 -0
  176. package/dist/tools/boundary-tools.d.ts.map +1 -0
  177. package/dist/tools/boundary-tools.js +62 -0
  178. package/dist/tools/boundary-tools.js.map +1 -0
  179. package/dist/tools/clone-tools.d.ts +35 -0
  180. package/dist/tools/clone-tools.d.ts.map +1 -0
  181. package/dist/tools/clone-tools.js +181 -0
  182. package/dist/tools/clone-tools.js.map +1 -0
  183. package/dist/tools/community-tools.d.ts +23 -0
  184. package/dist/tools/community-tools.d.ts.map +1 -0
  185. package/dist/tools/community-tools.js +297 -0
  186. package/dist/tools/community-tools.js.map +1 -0
  187. package/dist/tools/complexity-tools.d.ts +34 -0
  188. package/dist/tools/complexity-tools.d.ts.map +1 -0
  189. package/dist/tools/complexity-tools.js +135 -0
  190. package/dist/tools/complexity-tools.js.map +1 -0
  191. package/dist/tools/context-tools.d.ts +44 -3
  192. package/dist/tools/context-tools.d.ts.map +1 -1
  193. package/dist/tools/context-tools.js +329 -99
  194. package/dist/tools/context-tools.js.map +1 -1
  195. package/dist/tools/conversation-tools.d.ts +107 -0
  196. package/dist/tools/conversation-tools.d.ts.map +1 -0
  197. package/dist/tools/conversation-tools.js +419 -0
  198. package/dist/tools/conversation-tools.js.map +1 -0
  199. package/dist/tools/coordinator-tools.d.ts +73 -0
  200. package/dist/tools/coordinator-tools.d.ts.map +1 -0
  201. package/dist/tools/coordinator-tools.js +153 -0
  202. package/dist/tools/coordinator-tools.js.map +1 -0
  203. package/dist/tools/cross-repo-tools.d.ts +43 -0
  204. package/dist/tools/cross-repo-tools.d.ts.map +1 -0
  205. package/dist/tools/cross-repo-tools.js +55 -0
  206. package/dist/tools/cross-repo-tools.js.map +1 -0
  207. package/dist/tools/diff-tools.d.ts +4 -1
  208. package/dist/tools/diff-tools.d.ts.map +1 -1
  209. package/dist/tools/diff-tools.js +23 -5
  210. package/dist/tools/diff-tools.js.map +1 -1
  211. package/dist/tools/frequency-tools.d.ts +46 -0
  212. package/dist/tools/frequency-tools.d.ts.map +1 -0
  213. package/dist/tools/frequency-tools.js +184 -0
  214. package/dist/tools/frequency-tools.js.map +1 -0
  215. package/dist/tools/generate-tools.d.ts.map +1 -1
  216. package/dist/tools/generate-tools.js +13 -2
  217. package/dist/tools/generate-tools.js.map +1 -1
  218. package/dist/tools/graph-tools.d.ts +44 -11
  219. package/dist/tools/graph-tools.d.ts.map +1 -1
  220. package/dist/tools/graph-tools.js +147 -104
  221. package/dist/tools/graph-tools.js.map +1 -1
  222. package/dist/tools/hotspot-tools.d.ts +24 -0
  223. package/dist/tools/hotspot-tools.d.ts.map +1 -0
  224. package/dist/tools/hotspot-tools.js +122 -0
  225. package/dist/tools/hotspot-tools.js.map +1 -0
  226. package/dist/tools/impact-tools.d.ts +13 -0
  227. package/dist/tools/impact-tools.d.ts.map +1 -0
  228. package/dist/tools/impact-tools.js +238 -0
  229. package/dist/tools/impact-tools.js.map +1 -0
  230. package/dist/tools/index-tools.d.ts +44 -3
  231. package/dist/tools/index-tools.d.ts.map +1 -1
  232. package/dist/tools/index-tools.js +530 -222
  233. package/dist/tools/index-tools.js.map +1 -1
  234. package/dist/tools/memory-tools.d.ts +35 -0
  235. package/dist/tools/memory-tools.d.ts.map +1 -0
  236. package/dist/tools/memory-tools.js +229 -0
  237. package/dist/tools/memory-tools.js.map +1 -0
  238. package/dist/tools/outline-tools.d.ts +24 -13
  239. package/dist/tools/outline-tools.d.ts.map +1 -1
  240. package/dist/tools/outline-tools.js +113 -87
  241. package/dist/tools/outline-tools.js.map +1 -1
  242. package/dist/tools/pattern-tools.d.ts +32 -0
  243. package/dist/tools/pattern-tools.d.ts.map +1 -0
  244. package/dist/tools/pattern-tools.js +116 -0
  245. package/dist/tools/pattern-tools.js.map +1 -0
  246. package/dist/tools/report-tools.d.ts +5 -0
  247. package/dist/tools/report-tools.d.ts.map +1 -0
  248. package/dist/tools/report-tools.js +167 -0
  249. package/dist/tools/report-tools.js.map +1 -0
  250. package/dist/tools/review-diff-tools.d.ts +148 -0
  251. package/dist/tools/review-diff-tools.d.ts.map +1 -0
  252. package/dist/tools/review-diff-tools.js +852 -0
  253. package/dist/tools/review-diff-tools.js.map +1 -0
  254. package/dist/tools/route-tools.d.ts +32 -0
  255. package/dist/tools/route-tools.d.ts.map +1 -0
  256. package/dist/tools/route-tools.js +276 -0
  257. package/dist/tools/route-tools.js.map +1 -0
  258. package/dist/tools/search-ranker.d.ts +5 -0
  259. package/dist/tools/search-ranker.d.ts.map +1 -0
  260. package/dist/tools/search-ranker.js +142 -0
  261. package/dist/tools/search-ranker.js.map +1 -0
  262. package/dist/tools/search-tools.d.ts +24 -1
  263. package/dist/tools/search-tools.d.ts.map +1 -1
  264. package/dist/tools/search-tools.js +459 -225
  265. package/dist/tools/search-tools.js.map +1 -1
  266. package/dist/tools/secret-tools.d.ts +104 -0
  267. package/dist/tools/secret-tools.d.ts.map +1 -0
  268. package/dist/tools/secret-tools.js +410 -0
  269. package/dist/tools/secret-tools.js.map +1 -0
  270. package/dist/tools/symbol-tools.d.ts +90 -2
  271. package/dist/tools/symbol-tools.d.ts.map +1 -1
  272. package/dist/tools/symbol-tools.js +576 -42
  273. package/dist/tools/symbol-tools.js.map +1 -1
  274. package/dist/types.d.ts +34 -1
  275. package/dist/types.d.ts.map +1 -1
  276. package/dist/utils/framework-detect.d.ts +5 -0
  277. package/dist/utils/framework-detect.d.ts.map +1 -0
  278. package/dist/utils/framework-detect.js +36 -0
  279. package/dist/utils/framework-detect.js.map +1 -0
  280. package/dist/utils/glob.d.ts +19 -0
  281. package/dist/utils/glob.d.ts.map +1 -0
  282. package/dist/utils/glob.js +74 -0
  283. package/dist/utils/glob.js.map +1 -0
  284. package/dist/utils/import-graph.d.ts +29 -0
  285. package/dist/utils/import-graph.d.ts.map +1 -0
  286. package/dist/utils/import-graph.js +125 -0
  287. package/dist/utils/import-graph.js.map +1 -0
  288. package/dist/utils/test-file.d.ts.map +1 -1
  289. package/dist/utils/test-file.js +1 -0
  290. package/dist/utils/test-file.js.map +1 -1
  291. package/dist/utils/walk.d.ts +45 -0
  292. package/dist/utils/walk.d.ts.map +1 -0
  293. package/dist/utils/walk.js +87 -0
  294. package/dist/utils/walk.js.map +1 -0
  295. package/package.json +12 -5
  296. package/rules/codesift.md +187 -0
  297. package/rules/codesift.mdc +192 -0
  298. package/rules/codex.md +187 -0
  299. package/rules/gemini.md +187 -0
@@ -0,0 +1,167 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { getCodeIndex } from "./index-tools.js";
4
+ import { analyzeComplexity } from "./complexity-tools.js";
5
+ import { findDeadCode } from "./symbol-tools.js";
6
+ import { detectCommunities } from "./community-tools.js";
7
+ import { analyzeHotspots } from "./hotspot-tools.js";
8
+ import { getCumulativeSavings } from "../storage/usage-tracker.js";
9
+ export async function generateReport(repo) {
10
+ const index = await getCodeIndex(repo);
11
+ if (!index)
12
+ throw new Error(`Repository "${repo}" not found.`);
13
+ const [complexity, deadCode, communities, hotspots] = await Promise.allSettled([
14
+ analyzeComplexity(repo, { top_n: 10 }),
15
+ findDeadCode(repo, {}),
16
+ detectCommunities(repo),
17
+ analyzeHotspots(repo, {}),
18
+ ]);
19
+ const html = buildHtml(repo, index, {
20
+ complexity: complexity.status === "fulfilled" ? complexity.value : null,
21
+ deadCode: deadCode.status === "fulfilled" ? deadCode.value : null,
22
+ communities: communities.status === "fulfilled" ? communities.value : null,
23
+ hotspots: hotspots.status === "fulfilled" ? hotspots.value : null,
24
+ savings: getCumulativeSavings(),
25
+ });
26
+ const outPath = join(index.root, "codesift-report.html");
27
+ await writeFile(outPath, html, "utf-8");
28
+ return { path: outPath, sections: 6 };
29
+ }
30
+ function buildHtml(repo, index, data) {
31
+ const langs = Object.entries(index.files.reduce((acc, f) => {
32
+ acc[f.language] = (acc[f.language] ?? 0) + 1;
33
+ return acc;
34
+ }, {})).sort((a, b) => b[1] - a[1]);
35
+ const complexityRows = buildComplexityRows(data.complexity);
36
+ const deadCodeSection = buildDeadCodeSection(data.deadCode);
37
+ const hotspotRows = buildHotspotRows(data.hotspots);
38
+ const communitiesSection = buildCommunitiesSection(data.communities);
39
+ return `<!DOCTYPE html>
40
+ <html lang="en"><head><meta charset="utf-8"><title>CodeSift Report \u2014 ${esc(repo)}</title>
41
+ <style>
42
+ * { box-sizing: border-box; margin: 0; padding: 0; }
43
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; max-width: 960px; margin: 40px auto; padding: 0 24px; color: #1e293b; background: #f8fafc; line-height: 1.6; }
44
+ h1 { font-size: 28px; border-bottom: 3px solid #6366f1; padding-bottom: 12px; margin-bottom: 8px; }
45
+ h2 { color: #6366f1; margin-top: 36px; margin-bottom: 12px; font-size: 20px; }
46
+ p { margin: 8px 0; color: #475569; }
47
+ table { border-collapse: collapse; width: 100%; margin: 12px 0; font-size: 14px; }
48
+ th, td { border: 1px solid #e2e8f0; padding: 8px 12px; text-align: left; }
49
+ th { background: #6366f1; color: white; font-weight: 600; }
50
+ tr:nth-child(even) { background: #f1f5f9; }
51
+ .metrics { display: flex; gap: 8px; flex-wrap: wrap; margin: 16px 0; }
52
+ .metric { background: #6366f1; color: white; padding: 8px 16px; border-radius: 8px; font-size: 14px; }
53
+ .metric b { font-size: 20px; display: block; }
54
+ .warn { color: #dc2626; font-weight: 600; }
55
+ .ok { color: #16a34a; }
56
+ .empty { color: #94a3b8; font-style: italic; }
57
+ footer { margin-top: 48px; padding-top: 16px; border-top: 1px solid #e2e8f0; color: #94a3b8; font-size: 12px; }
58
+ footer a { color: #6366f1; }
59
+ </style></head><body>
60
+ <h1>CodeSift Report</h1>
61
+ <p><strong>${esc(repo)}</strong> \u2014 generated ${new Date().toISOString().slice(0, 10)}</p>
62
+
63
+ <div class="metrics">
64
+ <div class="metric"><b>${index.file_count.toLocaleString()}</b>files</div>
65
+ <div class="metric"><b>${index.symbol_count.toLocaleString()}</b>symbols</div>
66
+ <div class="metric"><b>${langs.length}</b>languages</div>
67
+ ${data.savings > 0 ? `<div class="metric"><b>${data.savings.toLocaleString()}</b>tokens saved</div>` : ""}
68
+ </div>
69
+
70
+ <h2>Languages</h2>
71
+ <table><tr><th>Language</th><th>Files</th></tr>
72
+ ${langs.map(([l, c]) => `<tr><td>${esc(l)}</td><td>${c}</td></tr>`).join("\n")}
73
+ </table>
74
+
75
+ <h2>Top Complex Functions</h2>
76
+ ${complexityRows}
77
+
78
+ <h2>Dead Code Candidates</h2>
79
+ ${deadCodeSection}
80
+
81
+ <h2>Hotspots (Churn \u00d7 Complexity)</h2>
82
+ ${hotspotRows}
83
+
84
+ <h2>Architecture (Communities)</h2>
85
+ ${communitiesSection}
86
+
87
+ <footer>Generated by <a href="https://github.com/greglas75/codesift">CodeSift</a> \u2014 Token-efficient code intelligence for AI agents</footer>
88
+ </body></html>`;
89
+ }
90
+ function buildComplexityRows(complexity) {
91
+ if (complexity !== null &&
92
+ typeof complexity === "object" &&
93
+ "functions" in complexity &&
94
+ Array.isArray(complexity["functions"])) {
95
+ const fns = complexity.functions;
96
+ if (fns.length > 0) {
97
+ return `<table><tr><th>Function</th><th>File</th><th>Complexity</th><th>Lines</th></tr>
98
+ ${fns.slice(0, 10).map((c) => {
99
+ const fn = c;
100
+ return `<tr><td>${esc(fn.name)}</td><td>${esc(fn.file)}</td><td class="${fn.cyclomatic > 10 ? "warn" : "ok"}">${fn.cyclomatic}</td><td>${fn.lines}</td></tr>`;
101
+ }).join("\n")}
102
+ </table>`;
103
+ }
104
+ }
105
+ return `<p class="empty">Analysis not available</p>`;
106
+ }
107
+ function buildDeadCodeSection(deadCode) {
108
+ if (deadCode !== null &&
109
+ typeof deadCode === "object" &&
110
+ "candidates" in deadCode &&
111
+ Array.isArray(deadCode["candidates"])) {
112
+ const candidates = deadCode.candidates;
113
+ if (candidates.length > 0) {
114
+ return `<p>${candidates.length} unused exports found</p>
115
+ <table><tr><th>Symbol</th><th>File</th><th>Kind</th></tr>
116
+ ${candidates.slice(0, 15).map((d) => {
117
+ const dc = d;
118
+ return `<tr><td>${esc(dc.name)}</td><td>${esc(dc.file)}</td><td>${esc(dc.kind)}</td></tr>`;
119
+ }).join("\n")}
120
+ </table>`;
121
+ }
122
+ }
123
+ return `<p class="empty">No dead code found (or analysis not available)</p>`;
124
+ }
125
+ function buildHotspotRows(hotspots) {
126
+ if (hotspots !== null &&
127
+ typeof hotspots === "object" &&
128
+ "hotspots" in hotspots &&
129
+ Array.isArray(hotspots["hotspots"])) {
130
+ const spots = hotspots.hotspots;
131
+ if (spots.length > 0) {
132
+ return `<table><tr><th>File</th><th>Score</th><th>Changes</th></tr>
133
+ ${spots.slice(0, 10).map((h) => {
134
+ const hs = h;
135
+ return `<tr><td>${esc(hs.file)}</td><td class="${hs.hotspot_score > 100 ? "warn" : "ok"}">${hs.hotspot_score}</td><td>${hs.change_count}</td></tr>`;
136
+ }).join("\n")}
137
+ </table>`;
138
+ }
139
+ }
140
+ return `<p class="empty">Hotspot analysis not available (requires git history)</p>`;
141
+ }
142
+ function buildCommunitiesSection(communities) {
143
+ if (communities !== null &&
144
+ typeof communities === "object" &&
145
+ "communities" in communities &&
146
+ Array.isArray(communities["communities"])) {
147
+ const result = communities;
148
+ if (result.communities.length > 0) {
149
+ return `<p>${result.communities.length} modules detected (modularity: ${result.modularity})</p>
150
+ <table><tr><th>Module</th><th>Files</th><th>Symbols</th><th>Cohesion</th></tr>
151
+ ${result.communities.slice(0, 15).map((c) => {
152
+ const cm = c;
153
+ return `<tr><td>${esc(cm.name)}</td><td>${cm.files.length}</td><td>${cm.symbol_count}</td><td>${(cm.cohesion * 100).toFixed(0)}%</td></tr>`;
154
+ }).join("\n")}
155
+ </table>`;
156
+ }
157
+ }
158
+ return `<p class="empty">Community detection not available</p>`;
159
+ }
160
+ function esc(s) {
161
+ return s
162
+ .replace(/&/g, "&amp;")
163
+ .replace(/</g, "&lt;")
164
+ .replace(/>/g, "&gt;")
165
+ .replace(/"/g, "&quot;");
166
+ }
167
+ //# sourceMappingURL=report-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-tools.js","sourceRoot":"","sources":["../../src/tools/report-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * review-diff-tools.ts
3
+ *
4
+ * Types, tier assignment, scoring, verdict, and orchestrator for the review_diff MCP tool.
5
+ * Pure functions + one async orchestrator that fans out sub-checks.
6
+ */
7
+ import type { CodeIndex } from "../types.js";
8
+ export interface ReviewDiffOptions {
9
+ repo: string;
10
+ since?: string;
11
+ /** End ref — defaults to "HEAD". Use "WORKING" for uncommitted changes. */
12
+ until?: string;
13
+ /** Comma-separated check names to run (defaults to all) */
14
+ checks?: string;
15
+ /** Token budget for responses (default 8000) */
16
+ token_budget?: number;
17
+ /** Glob patterns of files to exclude from review */
18
+ exclude_patterns?: string[];
19
+ /** Maximum files to review before capping (default 50) */
20
+ max_files?: number;
21
+ /** Per-check timeout in milliseconds (default 30000) */
22
+ check_timeout_ms?: number;
23
+ }
24
+ export interface ReviewFinding {
25
+ /** Which check produced this finding */
26
+ check: string;
27
+ severity: "error" | "warn" | "info";
28
+ message: string;
29
+ file?: string;
30
+ line?: number;
31
+ symbol?: string;
32
+ }
33
+ export interface CheckResult {
34
+ check: string;
35
+ status: "pass" | "warn" | "fail" | "error" | "timeout";
36
+ findings: ReviewFinding[];
37
+ duration_ms: number;
38
+ /** Human-readable summary line (optional) */
39
+ summary?: string;
40
+ }
41
+ export interface DiffStats {
42
+ files_changed: number;
43
+ files_reviewed: number;
44
+ }
45
+ export interface ReviewMetadata {
46
+ files_capped?: boolean;
47
+ index_warning?: string;
48
+ }
49
+ export interface ReviewDiffResult {
50
+ repo: string;
51
+ since: string;
52
+ checks: CheckResult[];
53
+ findings: ReviewFinding[];
54
+ /** 0-100 quality score */
55
+ score: number;
56
+ verdict: "pass" | "warn" | "fail";
57
+ duration_ms: number;
58
+ diff_stats: DiffStats;
59
+ metadata: ReviewMetadata;
60
+ /** Structured error (present instead of throwing) */
61
+ error?: string;
62
+ }
63
+ /**
64
+ * Returns the tier (1 | 2 | 3) for a given check name.
65
+ *
66
+ * Tier 1 — critical (−20 per finding): secrets, breaking
67
+ * Tier 2 — important (−5 per finding): coupling, complexity, dead-code,
68
+ * blast-radius, bug-patterns
69
+ * Tier 3 — advisory (−1 per finding, only if no T1/T2): test-gaps, hotspots
70
+ */
71
+ export declare function findingTier(check: string): 1 | 2 | 3;
72
+ /**
73
+ * Calculates a 0-100 quality score from findings and check results.
74
+ *
75
+ * Deductions:
76
+ * - T1 findings: −20 each, floor at 0
77
+ * - T2 findings: −5 each, floor at 20 (overridden by T1 floor)
78
+ * - T3 findings: −1 each, floor at 50 (only applied when there are no T1/T2 findings)
79
+ * - Errored checks: −3 each
80
+ * - Final floor: 0
81
+ */
82
+ export declare function calculateScore(findings: ReviewFinding[], checks: CheckResult[]): number;
83
+ /**
84
+ * Determines the overall verdict from check statuses.
85
+ *
86
+ * - Any "fail" → "fail"
87
+ * - Any "warn" (and no "fail") → "warn"
88
+ * - Otherwise → "pass"
89
+ * - "timeout" and "error" do not affect verdict direction
90
+ */
91
+ export declare function determineVerdict(checks: CheckResult[]): "pass" | "warn" | "fail";
92
+ /**
93
+ * Blast-radius check: run impactAnalysis and map affected_symbols to T2 findings.
94
+ */
95
+ export declare function checkBlastRadius(index: CodeIndex, since: string, until: string): Promise<CheckResult>;
96
+ /**
97
+ * Secrets check: run scanSecrets scoped to changedFiles and map findings to T1.
98
+ */
99
+ export declare function checkSecrets(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
100
+ /**
101
+ * Dead-code check: run findDeadCode scoped to changedFiles and map candidates to T2 findings.
102
+ */
103
+ export declare function checkDeadCode(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
104
+ /**
105
+ * Bug-patterns check: run all BUILTIN_PATTERNS via searchPatterns, merge and
106
+ * deduplicate findings across patterns.
107
+ */
108
+ export declare function checkBugPatterns(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
109
+ /**
110
+ * Hotspots check: run analyzeHotspots and filter to files in changedFiles.
111
+ * Maps high-churn files to T3 advisory findings.
112
+ */
113
+ export declare function checkHotspots(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
114
+ /**
115
+ * Complexity delta check: run analyzeComplexity and filter to functions in
116
+ * changedFiles with cyclomatic complexity > 10. Maps to T2 findings.
117
+ */
118
+ export declare function checkComplexityDelta(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
119
+ /**
120
+ * Coupling gaps check: parse git log for co-change pairs, compute Jaccard
121
+ * similarity, and flag coupled files that are missing from the diff.
122
+ */
123
+ export declare function checkCouplingGaps(repoRoot: string, changedFiles: string[]): Promise<CheckResult>;
124
+ /**
125
+ * Breaking changes check: detect exported symbols removed between `since` and
126
+ * current index. For each changed .ts/.js file, `git show` retrieves the old
127
+ * source and a regex extracts export names. These are compared against the
128
+ * current index symbols. Missing exports → T1 "breaking" findings.
129
+ *
130
+ * File-level renames (detected via `git diff --find-renames`) are suppressed
131
+ * because renames naturally lose old export names.
132
+ */
133
+ export declare function checkBreakingChanges(index: CodeIndex, repoRoot: string, changedFiles: string[], since: string, until: string): Promise<CheckResult>;
134
+ /**
135
+ * Test-gaps check: for each changed non-test source file, verify that at least
136
+ * one test file covers it — either by naming convention or by import reference.
137
+ *
138
+ * Naming convention candidates:
139
+ * foo.ts → foo.test.ts, foo.spec.ts, __tests__/foo.ts, __tests__/foo.test.ts
140
+ *
141
+ * Import graph: search index symbols from test files whose source imports the
142
+ * source file's base name (without extension).
143
+ *
144
+ * If BOTH pathways find 0 tests → T3 advisory finding.
145
+ */
146
+ export declare function checkTestGaps(index: CodeIndex, changedFiles: string[]): Promise<CheckResult>;
147
+ export declare function reviewDiff(repo: string, opts: ReviewDiffOptions): Promise<ReviewDiffResult>;
148
+ //# sourceMappingURL=review-diff-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-diff-tools.d.ts","sourceRoot":"","sources":["../../src/tools/review-diff-tools.ts"],"names":[],"mappings":"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"}