codesift-mcp 0.1.0 → 0.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 (299) hide show
  1. package/LICENSE +66 -21
  2. package/README.md +346 -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 +10 -4
  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,400 @@
1
+ // ---------------------------------------------------------------------------
2
+ // CLI setup command — configure codesift-mcp in AI coding tools
3
+ // ---------------------------------------------------------------------------
4
+ import { homedir } from "node:os";
5
+ import { join, dirname } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
8
+ import { existsSync } from "node:fs";
9
+ import { createHash } from "node:crypto";
10
+ // ---------------------------------------------------------------------------
11
+ // Types
12
+ // ---------------------------------------------------------------------------
13
+ export const SUPPORTED_PLATFORMS = ["codex", "claude", "cursor", "gemini"];
14
+ // ---------------------------------------------------------------------------
15
+ // Platform configs
16
+ // ---------------------------------------------------------------------------
17
+ const CODEX_TOML_BLOCK = `
18
+ [mcp_servers.codesift]
19
+ command = "npx"
20
+ args = ["-y", "codesift-mcp"]
21
+ tool_timeout_sec = 120
22
+ `;
23
+ const MCP_SERVER_ENTRY = {
24
+ command: "npx",
25
+ args: ["-y", "codesift-mcp"],
26
+ };
27
+ // ---------------------------------------------------------------------------
28
+ // Helpers
29
+ // ---------------------------------------------------------------------------
30
+ async function ensureDir(dir) {
31
+ if (!existsSync(dir)) {
32
+ await mkdir(dir, { recursive: true });
33
+ }
34
+ }
35
+ async function readJsonFile(path) {
36
+ const raw = await readFile(path, "utf-8");
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(raw);
40
+ }
41
+ catch {
42
+ throw new Error(`Failed to parse ${path} as JSON. Fix the file and retry.`);
43
+ }
44
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
45
+ throw new Error(`Expected an object in ${path}, got ${typeof parsed}.`);
46
+ }
47
+ return parsed;
48
+ }
49
+ async function writeJsonFile(path, data) {
50
+ await writeFile(path, JSON.stringify(data, null, 2) + "\n", "utf-8");
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // resolvePackageFile — find a file relative to the package root
54
+ // ---------------------------------------------------------------------------
55
+ function resolvePackageFile(relativePath) {
56
+ const thisDir = dirname(fileURLToPath(import.meta.url));
57
+ // Try dist/../<path> first, then src/../../<path>
58
+ for (const base of [join(thisDir, ".."), join(thisDir, "..", "..")]) {
59
+ const candidate = join(base, relativePath);
60
+ if (existsSync(candidate)) {
61
+ return candidate;
62
+ }
63
+ }
64
+ throw new Error(`Could not resolve package file: ${relativePath}`);
65
+ }
66
+ function sha256(content) {
67
+ return createHash("sha256").update(content).digest("hex").slice(0, 16);
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // installRules — install platform-specific rules file
71
+ // ---------------------------------------------------------------------------
72
+ const RULES_FILES = {
73
+ claude: { source: "rules/codesift.md", targetDir: ".claude/rules", targetFile: "codesift.md" },
74
+ cursor: { source: "rules/codesift.mdc", targetDir: ".cursor/rules", targetFile: "codesift.mdc" },
75
+ };
76
+ // Append-mode platforms write a delimited block into a file in the cwd
77
+ const APPEND_MODE_PLATFORMS = {
78
+ codex: { source: "rules/codex.md", targetFile: "AGENTS.md" },
79
+ gemini: { source: "rules/gemini.md", targetFile: "GEMINI.md" },
80
+ };
81
+ const DELIMITER_START = "<!-- codesift-rules-start -->";
82
+ const DELIMITER_END = "<!-- codesift-rules-end -->";
83
+ async function installRulesAppendMode(platform, _options) {
84
+ const config = APPEND_MODE_PLATFORMS[platform];
85
+ if (!config)
86
+ return { path: "", action: "error", error: `No append config for ${platform}` };
87
+ const targetPath = join(process.cwd(), config.targetFile);
88
+ try {
89
+ const sourcePath = resolvePackageFile(config.source);
90
+ const sourceContent = (await readFile(sourcePath, "utf-8")).trimEnd();
91
+ const block = `${DELIMITER_START}\n${sourceContent}\n${DELIMITER_END}`;
92
+ if (existsSync(targetPath)) {
93
+ const existing = await readFile(targetPath, "utf-8");
94
+ if (existing.includes(DELIMITER_START) && existing.includes(DELIMITER_END)) {
95
+ // Replace the delimited block in-place
96
+ const replaced = existing.replace(new RegExp(`${escapeRegex(DELIMITER_START)}[\\s\\S]*?${escapeRegex(DELIMITER_END)}`), block);
97
+ await writeFile(targetPath, replaced, "utf-8");
98
+ return { path: targetPath, action: "updated" };
99
+ }
100
+ // Append block to existing content
101
+ const newContent = existing.trimEnd() + "\n\n" + block + "\n";
102
+ await writeFile(targetPath, newContent, "utf-8");
103
+ return { path: targetPath, action: "updated" };
104
+ }
105
+ // Create new file with block
106
+ await writeFile(targetPath, block + "\n", "utf-8");
107
+ return { path: targetPath, action: "created" };
108
+ }
109
+ catch (err) {
110
+ const msg = err instanceof Error ? err.message : String(err);
111
+ return { path: targetPath, action: "error", error: msg };
112
+ }
113
+ }
114
+ function escapeRegex(str) {
115
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
116
+ }
117
+ const HEADER_REGEX = /^<!-- codesift-rules v([\d.]+) hash:(\w+) -->/;
118
+ export async function installRules(platform, homeDir, options) {
119
+ // Append-mode platforms (codex, gemini) write into cwd
120
+ if (APPEND_MODE_PLATFORMS[platform]) {
121
+ return installRulesAppendMode(platform, options);
122
+ }
123
+ const rulesConfig = RULES_FILES[platform];
124
+ if (!rulesConfig) {
125
+ return { path: "", action: "skipped" };
126
+ }
127
+ const targetPath = join(homeDir, rulesConfig.targetDir, rulesConfig.targetFile);
128
+ try {
129
+ // Resolve source file and read it
130
+ const sourcePath = resolvePackageFile(rulesConfig.source);
131
+ const sourceContent = await readFile(sourcePath, "utf-8");
132
+ // Read version from package.json
133
+ const pkgPath = resolvePackageFile("package.json");
134
+ const pkgRaw = await readFile(pkgPath, "utf-8");
135
+ const pkg = JSON.parse(pkgRaw);
136
+ const version = typeof pkg === "object" && pkg !== null && "version" in pkg
137
+ ? String(pkg["version"])
138
+ : "unknown";
139
+ // Compute hash of the source content body (everything after the header line)
140
+ const sourceBody = sourceContent.replace(HEADER_REGEX, "").trimStart();
141
+ const sourceHash = sha256(sourceBody);
142
+ // Build the new file content with updated header
143
+ const header = `<!-- codesift-rules v${version} hash:${sourceHash} -->`;
144
+ const newContent = header + "\n" + sourceBody;
145
+ // Check if target already exists
146
+ if (existsSync(targetPath)) {
147
+ const existingContent = await readFile(targetPath, "utf-8");
148
+ const firstLine = existingContent.split("\n")[0] ?? "";
149
+ const match = HEADER_REGEX.exec(firstLine);
150
+ if (match) {
151
+ const existingVersion = match[1];
152
+ const existingHash = match[2];
153
+ // Always verify actual body hash to detect user edits
154
+ const existingBody = existingContent.replace(HEADER_REGEX, "").trimStart();
155
+ const existingBodyHash = sha256(existingBody);
156
+ const bodyUnmodified = existingBodyHash === sourceHash;
157
+ if (bodyUnmodified) {
158
+ // Body matches source template
159
+ if (existingVersion === version && existingHash === sourceHash) {
160
+ // Same version, same hash, same body → nothing to do
161
+ return { path: targetPath, action: "skipped" };
162
+ }
163
+ // Version or header hash differs but body matches → safe update
164
+ await writeFile(targetPath, newContent, "utf-8");
165
+ return { path: targetPath, action: "updated" };
166
+ }
167
+ // Body has been modified by user
168
+ if (!options?.force) {
169
+ return {
170
+ path: targetPath,
171
+ action: "skipped",
172
+ warning: `Rules file has been modified by user. Use --force to overwrite.`,
173
+ };
174
+ }
175
+ // Force overwrite
176
+ await writeFile(targetPath, newContent, "utf-8");
177
+ return { path: targetPath, action: "force-updated" };
178
+ }
179
+ // No valid header found — treat as user-owned file
180
+ if (!options?.force) {
181
+ return {
182
+ path: targetPath,
183
+ action: "skipped",
184
+ warning: `Rules file has been modified by user. Use --force to overwrite.`,
185
+ };
186
+ }
187
+ await writeFile(targetPath, newContent, "utf-8");
188
+ return { path: targetPath, action: "force-updated" };
189
+ }
190
+ // Target doesn't exist — create dir and write
191
+ const targetDir = join(homeDir, rulesConfig.targetDir);
192
+ await ensureDir(targetDir);
193
+ await writeFile(targetPath, newContent, "utf-8");
194
+ return { path: targetPath, action: "created" };
195
+ }
196
+ catch (err) {
197
+ const msg = err instanceof Error ? err.message : String(err);
198
+ return { path: targetPath, action: "error", error: msg };
199
+ }
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Codex — ~/.codex/config.toml
203
+ // ---------------------------------------------------------------------------
204
+ async function setupCodex() {
205
+ const configDir = join(homedir(), ".codex");
206
+ const configPath = join(configDir, "config.toml");
207
+ await ensureDir(configDir);
208
+ if (existsSync(configPath)) {
209
+ const content = await readFile(configPath, "utf-8");
210
+ if (content.includes("[mcp_servers.codesift]")) {
211
+ return { platform: "codex", config_path: configPath, status: "already_configured" };
212
+ }
213
+ // Append to existing file
214
+ const newContent = content.trimEnd() + "\n" + CODEX_TOML_BLOCK;
215
+ await writeFile(configPath, newContent, "utf-8");
216
+ return { platform: "codex", config_path: configPath, status: "updated" };
217
+ }
218
+ // Create new file
219
+ await writeFile(configPath, CODEX_TOML_BLOCK.trimStart(), "utf-8");
220
+ return { platform: "codex", config_path: configPath, status: "created" };
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Claude Code — ~/.claude/settings.json
224
+ // ---------------------------------------------------------------------------
225
+ async function setupClaude() {
226
+ const configDir = join(homedir(), ".claude");
227
+ const configPath = join(configDir, "settings.json");
228
+ await ensureDir(configDir);
229
+ if (existsSync(configPath)) {
230
+ const settings = await readJsonFile(configPath);
231
+ const mcpServers = settings["mcpServers"];
232
+ if (mcpServers?.["codesift"]) {
233
+ return { platform: "claude", config_path: configPath, status: "already_configured" };
234
+ }
235
+ if (!settings["mcpServers"]) {
236
+ settings["mcpServers"] = {};
237
+ }
238
+ settings["mcpServers"]["codesift"] = { ...MCP_SERVER_ENTRY };
239
+ await writeJsonFile(configPath, settings);
240
+ return { platform: "claude", config_path: configPath, status: "updated" };
241
+ }
242
+ // Create new file
243
+ await writeJsonFile(configPath, { mcpServers: { codesift: { ...MCP_SERVER_ENTRY } } });
244
+ return { platform: "claude", config_path: configPath, status: "created" };
245
+ }
246
+ // ---------------------------------------------------------------------------
247
+ // Cursor — ~/.cursor/mcp.json
248
+ // ---------------------------------------------------------------------------
249
+ async function setupCursor() {
250
+ const configDir = join(homedir(), ".cursor");
251
+ const configPath = join(configDir, "mcp.json");
252
+ await ensureDir(configDir);
253
+ if (existsSync(configPath)) {
254
+ const config = await readJsonFile(configPath);
255
+ const mcpServers = config["mcpServers"];
256
+ if (mcpServers?.["codesift"]) {
257
+ return { platform: "cursor", config_path: configPath, status: "already_configured" };
258
+ }
259
+ if (!config["mcpServers"]) {
260
+ config["mcpServers"] = {};
261
+ }
262
+ config["mcpServers"]["codesift"] = { ...MCP_SERVER_ENTRY };
263
+ await writeJsonFile(configPath, config);
264
+ return { platform: "cursor", config_path: configPath, status: "updated" };
265
+ }
266
+ await writeJsonFile(configPath, { mcpServers: { codesift: { ...MCP_SERVER_ENTRY } } });
267
+ return { platform: "cursor", config_path: configPath, status: "created" };
268
+ }
269
+ // ---------------------------------------------------------------------------
270
+ // Gemini CLI — ~/.gemini/settings.json
271
+ // ---------------------------------------------------------------------------
272
+ async function setupGemini() {
273
+ const configDir = join(homedir(), ".gemini");
274
+ const configPath = join(configDir, "settings.json");
275
+ await ensureDir(configDir);
276
+ if (existsSync(configPath)) {
277
+ const settings = await readJsonFile(configPath);
278
+ const mcpServers = settings["mcpServers"];
279
+ if (mcpServers?.["codesift"]) {
280
+ return { platform: "gemini", config_path: configPath, status: "already_configured" };
281
+ }
282
+ if (!settings["mcpServers"]) {
283
+ settings["mcpServers"] = {};
284
+ }
285
+ settings["mcpServers"]["codesift"] = { ...MCP_SERVER_ENTRY };
286
+ await writeJsonFile(configPath, settings);
287
+ return { platform: "gemini", config_path: configPath, status: "updated" };
288
+ }
289
+ await writeJsonFile(configPath, { mcpServers: { codesift: { ...MCP_SERVER_ENTRY } } });
290
+ return { platform: "gemini", config_path: configPath, status: "created" };
291
+ }
292
+ // ---------------------------------------------------------------------------
293
+ // Claude Code hooks — .claude/settings.local.json
294
+ // ---------------------------------------------------------------------------
295
+ const PRE_TOOL_USE_HOOK = {
296
+ matcher: "Read",
297
+ hooks: [{ type: "command", command: "codesift precheck-read" }],
298
+ };
299
+ const POST_TOOL_USE_HOOK = {
300
+ matcher: "Write|Edit",
301
+ hooks: [{ type: "command", command: "codesift postindex-file" }],
302
+ };
303
+ export async function setupClaudeHooks() {
304
+ const configDir = join(homedir(), ".claude");
305
+ const settingsPath = join(configDir, "settings.local.json");
306
+ await ensureDir(configDir);
307
+ let settings = {};
308
+ if (existsSync(settingsPath)) {
309
+ settings = await readJsonFile(settingsPath);
310
+ }
311
+ if (typeof settings["hooks"] !== "object" || settings["hooks"] === null) {
312
+ settings["hooks"] = {};
313
+ }
314
+ const hooks = settings["hooks"];
315
+ // PreToolUse — add if not already present for matcher "Read"
316
+ if (!Array.isArray(hooks["PreToolUse"])) {
317
+ hooks["PreToolUse"] = [];
318
+ }
319
+ if (!hooks["PreToolUse"].some((h) => h.matcher === PRE_TOOL_USE_HOOK.matcher)) {
320
+ hooks["PreToolUse"].push(PRE_TOOL_USE_HOOK);
321
+ }
322
+ // PostToolUse — add if not already present for matcher "Write|Edit"
323
+ if (!Array.isArray(hooks["PostToolUse"])) {
324
+ hooks["PostToolUse"] = [];
325
+ }
326
+ if (!hooks["PostToolUse"].some((h) => h.matcher === POST_TOOL_USE_HOOK.matcher)) {
327
+ hooks["PostToolUse"].push(POST_TOOL_USE_HOOK);
328
+ }
329
+ await writeJsonFile(settingsPath, settings);
330
+ }
331
+ const PLATFORM_HANDLERS = {
332
+ codex: setupCodex,
333
+ claude: setupClaude,
334
+ cursor: setupCursor,
335
+ gemini: setupGemini,
336
+ };
337
+ export async function setup(platform, options) {
338
+ const handler = PLATFORM_HANDLERS[platform];
339
+ if (!handler) {
340
+ throw new Error(`Unknown platform: "${platform}". Supported: ${SUPPORTED_PLATFORMS.join(", ")}, all`);
341
+ }
342
+ const result = await handler();
343
+ if (platform === "claude" && options?.hooks) {
344
+ await setupClaudeHooks();
345
+ }
346
+ if (options?.rules) {
347
+ await installRules(platform, homedir(), options);
348
+ }
349
+ return result;
350
+ }
351
+ export async function setupAll(options) {
352
+ const results = [];
353
+ for (const platform of SUPPORTED_PLATFORMS) {
354
+ const result = await setup(platform, platform === "claude" ? options : undefined);
355
+ results.push(result);
356
+ }
357
+ return results;
358
+ }
359
+ // ---------------------------------------------------------------------------
360
+ // Human-readable output
361
+ // ---------------------------------------------------------------------------
362
+ const STATUS_MESSAGES = {
363
+ created: (r) => `✓ Created ${r.config_path}`,
364
+ updated: (r) => `✓ Added CodeSift MCP server to ${r.config_path}`,
365
+ already_configured: (r) => `✓ already configured ${r.config_path}`,
366
+ };
367
+ const RULES_ACTION_LABELS = {
368
+ created: "created",
369
+ updated: "updated",
370
+ "force-updated": "force-updated",
371
+ };
372
+ export function formatSetupResult(result, rulesResult) {
373
+ const lines = [STATUS_MESSAGES[result.status](result)];
374
+ if (rulesResult && RULES_ACTION_LABELS[rulesResult.action] && rulesResult.path) {
375
+ lines.push(`✓ ${RULES_ACTION_LABELS[rulesResult.action]} ${rulesResult.path}`);
376
+ }
377
+ return lines.join("\n");
378
+ }
379
+ export async function formatSetupLines(platform, options) {
380
+ const handler = PLATFORM_HANDLERS[platform];
381
+ if (!handler) {
382
+ throw new Error(`Unknown platform: "${platform}". Supported: ${SUPPORTED_PLATFORMS.join(", ")}, all`);
383
+ }
384
+ const result = await handler();
385
+ const lines = [STATUS_MESSAGES[result.status](result)];
386
+ if (options?.rules) {
387
+ const rulesResult = await installRules(platform, homedir(), options);
388
+ const label = RULES_ACTION_LABELS[rulesResult.action];
389
+ if (label && rulesResult.path) {
390
+ lines.push(`✓ ${label} ${rulesResult.path}`);
391
+ }
392
+ }
393
+ if (platform === "claude" && options?.hooks) {
394
+ await setupClaudeHooks();
395
+ const hooksPath = join(homedir(), ".claude", "settings.local.json");
396
+ lines.push(`✓ hooks configured ${hooksPath}`);
397
+ }
398
+ return lines;
399
+ }
400
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -8,6 +8,7 @@ export interface Config {
8
8
  signature: number;
9
9
  docstring: number;
10
10
  body: number;
11
+ comments: number;
11
12
  };
12
13
  embeddingProvider: EmbeddingProvider;
13
14
  voyageApiKey: string | null;
@@ -16,6 +17,7 @@ export interface Config {
16
17
  embeddingBatchSize: number;
17
18
  defaultTokenBudget: number;
18
19
  defaultTopK: number;
20
+ secretScanEnabled: boolean;
19
21
  }
20
22
  export declare function loadConfig(): Config;
21
23
  /** Reset cached config — for testing only. */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtE,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAGrB,eAAe,EAAE,MAAM,CAAC;IAGxB,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IAGF,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAG3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,UAAU,IAAI,MAAM,CAoCnC;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtE,MAAM,WAAW,MAAM;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAGrB,eAAe,EAAE,MAAM,CAAC;IAGxB,gBAAgB,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAGF,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAG3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IAGpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAID,wBAAgB,UAAU,IAAI,MAAM,CAuCnC;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
package/dist/config.js CHANGED
@@ -24,6 +24,7 @@ export function loadConfig() {
24
24
  signature: 2.5,
25
25
  docstring: 1.5,
26
26
  body: 0.5,
27
+ comments: 0.2,
27
28
  },
28
29
  embeddingProvider,
29
30
  voyageApiKey,
@@ -32,6 +33,7 @@ export function loadConfig() {
32
33
  embeddingBatchSize: parseIntEnv("CODESIFT_EMBEDDING_BATCH_SIZE", 128),
33
34
  defaultTokenBudget: parseIntEnv("CODESIFT_DEFAULT_TOKEN_BUDGET", 8000),
34
35
  defaultTopK: parseIntEnv("CODESIFT_DEFAULT_TOP_K", 50),
36
+ secretScanEnabled: process.env["CODESIFT_SECRET_SCAN"] !== "false",
35
37
  };
36
38
  return cachedConfig;
37
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgCjC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC;IAE7D,IAAI,iBAAiB,GAAsB,IAAI,CAAC;IAChD,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC1C,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC/C,IAAI,SAAS;QAAE,iBAAiB,GAAG,QAAQ,CAAC;IAEjD,YAAY,GAAG;QACb,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAE5C,eAAe,EAAE,WAAW,CAAC,4BAA4B,EAAE,GAAG,CAAC;QAE/D,gBAAgB,EAAE;YAChB,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,GAAG;SACV;QAED,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,GAAG,CAAC;QAErE,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,IAAI,CAAC;QACtE,WAAW,EAAE,WAAW,CAAC,wBAAwB,EAAE,EAAE,CAAC;KACvD,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,YAAoB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoCjC,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,IAAI,CAAC;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC;IAE7D,IAAI,iBAAiB,GAAsB,IAAI,CAAC;IAChD,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC1C,IAAI,YAAY;QAAE,iBAAiB,GAAG,QAAQ,CAAC;SAC/C,IAAI,SAAS;QAAE,iBAAiB,GAAG,QAAQ,CAAC;IAEjD,YAAY,GAAG;QACb,OAAO;QACP,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC;QAE5C,eAAe,EAAE,WAAW,CAAC,4BAA4B,EAAE,GAAG,CAAC;QAE/D,gBAAgB,EAAE;YAChB,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,GAAG;SACd;QAED,iBAAiB;QACjB,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,GAAG,CAAC;QAErE,kBAAkB,EAAE,WAAW,CAAC,+BAA+B,EAAE,IAAI,CAAC;QACtE,WAAW,EAAE,WAAW,CAAC,wBAAwB,EAAE,EAAE,CAAC;QAEtD,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,OAAO;KACnE,CAAC;IACF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,YAAoB;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function formatComplexityCompact(raw: unknown): string;
2
+ export declare function formatComplexityCounts(raw: unknown): string;
3
+ export declare function formatClonesCompact(raw: unknown): string;
4
+ export declare function formatClonesCounts(raw: unknown): string;
5
+ export declare function formatHotspotsCompact(raw: unknown): string;
6
+ export declare function formatHotspotsCounts(raw: unknown): string;
7
+ //# sourceMappingURL=formatters-shortening.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters-shortening.d.ts","sourceRoot":"","sources":["../src/formatters-shortening.ts"],"names":[],"mappings":"AAqCA,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAW5D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAI3D;AAWD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAaxD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGvD;AAMD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAU1D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Compact and counts formatters for progressive response shortening.
3
+ * Used by registerShortener() to reduce large tool responses.
4
+ */
5
+ import { formatTable } from "./formatters.js";
6
+ // ── Analyze complexity ─────────────────────────────
7
+ const MAX_COMPLEXITY_COMPACT = 25;
8
+ export function formatComplexityCompact(raw) {
9
+ const data = raw;
10
+ if (data.functions.length === 0)
11
+ return "(no functions found)";
12
+ const capped = data.functions.slice(0, MAX_COMPLEXITY_COMPACT);
13
+ const rows = capped.map((f) => [
14
+ String(f.cyclomatic_complexity),
15
+ String(f.lines),
16
+ `${f.file}:${f.start_line}`,
17
+ f.name,
18
+ ]);
19
+ return formatTable(["CC", "LINES", "FILE:LINE", "NAME"], rows);
20
+ }
21
+ export function formatComplexityCounts(raw) {
22
+ const data = raw;
23
+ const s = data.summary;
24
+ return `${s.total_functions} functions, avg_cc=${s.avg_complexity}, max_cc=${s.max_complexity}`;
25
+ }
26
+ // ── Find clones ────────────────────────────────────
27
+ const MAX_CLONES_COMPACT = 20;
28
+ function basename(filePath) {
29
+ const parts = filePath.replace(/\\/g, "/").split("/");
30
+ return parts[parts.length - 1] ?? filePath;
31
+ }
32
+ export function formatClonesCompact(raw) {
33
+ const data = raw;
34
+ if (data.clones.length === 0) {
35
+ return `(no clones found, threshold=${data.threshold}, scanned ${data.scanned_symbols} symbols)`;
36
+ }
37
+ const capped = data.clones.slice(0, MAX_CLONES_COMPACT);
38
+ const rows = capped.map((c) => [
39
+ `${Math.round(c.similarity * 100)}%`,
40
+ String(c.shared_lines),
41
+ `${basename(c.symbol_a.file)} ${c.symbol_a.name}`,
42
+ `${basename(c.symbol_b.file)} ${c.symbol_b.name}`,
43
+ ]);
44
+ return formatTable(["SIM%", "SHARED", "SYMBOL_A", "SYMBOL_B"], rows);
45
+ }
46
+ export function formatClonesCounts(raw) {
47
+ const data = raw;
48
+ return `${data.clones.length} clone pairs (threshold=${data.threshold}, scanned ${data.scanned_symbols})`;
49
+ }
50
+ // ── Analyze hotspots ───────────────────────────────
51
+ const MAX_HOTSPOTS_COMPACT = 15;
52
+ export function formatHotspotsCompact(raw) {
53
+ const data = raw;
54
+ if (data.hotspots.length === 0)
55
+ return `(no hotspots found, period: ${data.period})`;
56
+ const capped = data.hotspots.slice(0, MAX_HOTSPOTS_COMPACT);
57
+ const rows = capped.map((h) => [
58
+ String(h.hotspot_score),
59
+ String(h.commits),
60
+ h.file,
61
+ ]);
62
+ return formatTable(["SCORE", "COMMITS", "FILE"], rows);
63
+ }
64
+ export function formatHotspotsCounts(raw) {
65
+ const data = raw;
66
+ return `${data.hotspots.length} hotspots, period: ${data.period}`;
67
+ }
68
+ //# sourceMappingURL=formatters-shortening.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters-shortening.js","sourceRoot":"","sources":["../src/formatters-shortening.ts"],"names":[],"mappings":"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"}