codesift-mcp 0.1.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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -0
  3. package/dist/cli/args.d.ts +13 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +79 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/commands.d.ts +4 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +336 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/help.d.ts +3 -0
  12. package/dist/cli/help.d.ts.map +1 -0
  13. package/dist/cli/help.js +271 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +80 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +23 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +49 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/parser/extractors/go.d.ts +4 -0
  24. package/dist/parser/extractors/go.d.ts.map +1 -0
  25. package/dist/parser/extractors/go.js +185 -0
  26. package/dist/parser/extractors/go.js.map +1 -0
  27. package/dist/parser/extractors/javascript.d.ts +9 -0
  28. package/dist/parser/extractors/javascript.d.ts.map +1 -0
  29. package/dist/parser/extractors/javascript.js +10 -0
  30. package/dist/parser/extractors/javascript.js.map +1 -0
  31. package/dist/parser/extractors/markdown.d.ts +15 -0
  32. package/dist/parser/extractors/markdown.d.ts.map +1 -0
  33. package/dist/parser/extractors/markdown.js +217 -0
  34. package/dist/parser/extractors/markdown.js.map +1 -0
  35. package/dist/parser/extractors/prisma.d.ts +17 -0
  36. package/dist/parser/extractors/prisma.d.ts.map +1 -0
  37. package/dist/parser/extractors/prisma.js +121 -0
  38. package/dist/parser/extractors/prisma.js.map +1 -0
  39. package/dist/parser/extractors/python.d.ts +4 -0
  40. package/dist/parser/extractors/python.d.ts.map +1 -0
  41. package/dist/parser/extractors/python.js +203 -0
  42. package/dist/parser/extractors/python.js.map +1 -0
  43. package/dist/parser/extractors/rust.d.ts +4 -0
  44. package/dist/parser/extractors/rust.d.ts.map +1 -0
  45. package/dist/parser/extractors/rust.js +178 -0
  46. package/dist/parser/extractors/rust.js.map +1 -0
  47. package/dist/parser/extractors/typescript.d.ts +4 -0
  48. package/dist/parser/extractors/typescript.d.ts.map +1 -0
  49. package/dist/parser/extractors/typescript.js +296 -0
  50. package/dist/parser/extractors/typescript.js.map +1 -0
  51. package/dist/parser/languages/tree-sitter-css.wasm +0 -0
  52. package/dist/parser/languages/tree-sitter-go.wasm +0 -0
  53. package/dist/parser/languages/tree-sitter-java.wasm +0 -0
  54. package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
  55. package/dist/parser/languages/tree-sitter-json.wasm +0 -0
  56. package/dist/parser/languages/tree-sitter-php.wasm +0 -0
  57. package/dist/parser/languages/tree-sitter-python.wasm +0 -0
  58. package/dist/parser/languages/tree-sitter-ruby.wasm +0 -0
  59. package/dist/parser/languages/tree-sitter-rust.wasm +0 -0
  60. package/dist/parser/languages/tree-sitter-tsx.wasm +0 -0
  61. package/dist/parser/languages/tree-sitter-typescript.wasm +0 -0
  62. package/dist/parser/parser-manager.d.ts +6 -0
  63. package/dist/parser/parser-manager.d.ts.map +1 -0
  64. package/dist/parser/parser-manager.js +60 -0
  65. package/dist/parser/parser-manager.js.map +1 -0
  66. package/dist/parser/symbol-extractor.d.ts +22 -0
  67. package/dist/parser/symbol-extractor.d.ts.map +1 -0
  68. package/dist/parser/symbol-extractor.js +115 -0
  69. package/dist/parser/symbol-extractor.js.map +1 -0
  70. package/dist/retrieval/codebase-retrieval.d.ts +27 -0
  71. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -0
  72. package/dist/retrieval/codebase-retrieval.js +472 -0
  73. package/dist/retrieval/codebase-retrieval.js.map +1 -0
  74. package/dist/search/bm25.d.ts +22 -0
  75. package/dist/search/bm25.d.ts.map +1 -0
  76. package/dist/search/bm25.js +179 -0
  77. package/dist/search/bm25.js.map +1 -0
  78. package/dist/search/chunker.d.ts +9 -0
  79. package/dist/search/chunker.d.ts.map +1 -0
  80. package/dist/search/chunker.js +91 -0
  81. package/dist/search/chunker.js.map +1 -0
  82. package/dist/search/hybrid.d.ts +16 -0
  83. package/dist/search/hybrid.d.ts.map +1 -0
  84. package/dist/search/hybrid.js +51 -0
  85. package/dist/search/hybrid.js.map +1 -0
  86. package/dist/search/semantic.d.ts +44 -0
  87. package/dist/search/semantic.d.ts.map +1 -0
  88. package/dist/search/semantic.js +194 -0
  89. package/dist/search/semantic.js.map +1 -0
  90. package/dist/server.d.ts +2 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +285 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/storage/chunk-store.d.ts +32 -0
  95. package/dist/storage/chunk-store.d.ts.map +1 -0
  96. package/dist/storage/chunk-store.js +144 -0
  97. package/dist/storage/chunk-store.js.map +1 -0
  98. package/dist/storage/embedding-store.d.ts +41 -0
  99. package/dist/storage/embedding-store.d.ts.map +1 -0
  100. package/dist/storage/embedding-store.js +149 -0
  101. package/dist/storage/embedding-store.js.map +1 -0
  102. package/dist/storage/index-store.d.ts +23 -0
  103. package/dist/storage/index-store.d.ts.map +1 -0
  104. package/dist/storage/index-store.js +95 -0
  105. package/dist/storage/index-store.js.map +1 -0
  106. package/dist/storage/registry.d.ts +35 -0
  107. package/dist/storage/registry.d.ts.map +1 -0
  108. package/dist/storage/registry.js +99 -0
  109. package/dist/storage/registry.js.map +1 -0
  110. package/dist/storage/usage-stats.d.ts +32 -0
  111. package/dist/storage/usage-stats.d.ts.map +1 -0
  112. package/dist/storage/usage-stats.js +180 -0
  113. package/dist/storage/usage-stats.js.map +1 -0
  114. package/dist/storage/usage-tracker.d.ts +35 -0
  115. package/dist/storage/usage-tracker.d.ts.map +1 -0
  116. package/dist/storage/usage-tracker.js +245 -0
  117. package/dist/storage/usage-tracker.js.map +1 -0
  118. package/dist/storage/watcher.d.ts +12 -0
  119. package/dist/storage/watcher.d.ts.map +1 -0
  120. package/dist/storage/watcher.js +66 -0
  121. package/dist/storage/watcher.js.map +1 -0
  122. package/dist/tools/context-tools.d.ts +31 -0
  123. package/dist/tools/context-tools.d.ts.map +1 -0
  124. package/dist/tools/context-tools.js +219 -0
  125. package/dist/tools/context-tools.js.map +1 -0
  126. package/dist/tools/diff-tools.d.ts +22 -0
  127. package/dist/tools/diff-tools.d.ts.map +1 -0
  128. package/dist/tools/diff-tools.js +165 -0
  129. package/dist/tools/diff-tools.js.map +1 -0
  130. package/dist/tools/generate-tools.d.ts +11 -0
  131. package/dist/tools/generate-tools.d.ts.map +1 -0
  132. package/dist/tools/generate-tools.js +135 -0
  133. package/dist/tools/generate-tools.js.map +1 -0
  134. package/dist/tools/graph-tools.d.ts +60 -0
  135. package/dist/tools/graph-tools.d.ts.map +1 -0
  136. package/dist/tools/graph-tools.js +313 -0
  137. package/dist/tools/graph-tools.js.map +1 -0
  138. package/dist/tools/index-tools.d.ts +39 -0
  139. package/dist/tools/index-tools.d.ts.map +1 -0
  140. package/dist/tools/index-tools.js +451 -0
  141. package/dist/tools/index-tools.js.map +1 -0
  142. package/dist/tools/outline-tools.d.ts +59 -0
  143. package/dist/tools/outline-tools.d.ts.map +1 -0
  144. package/dist/tools/outline-tools.js +342 -0
  145. package/dist/tools/outline-tools.js.map +1 -0
  146. package/dist/tools/search-tools.d.ts +29 -0
  147. package/dist/tools/search-tools.d.ts.map +1 -0
  148. package/dist/tools/search-tools.js +309 -0
  149. package/dist/tools/search-tools.js.map +1 -0
  150. package/dist/tools/symbol-tools.d.ts +24 -0
  151. package/dist/tools/symbol-tools.d.ts.map +1 -0
  152. package/dist/tools/symbol-tools.js +172 -0
  153. package/dist/tools/symbol-tools.js.map +1 -0
  154. package/dist/types.d.ts +91 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +3 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/utils/git-validation.d.ts +11 -0
  159. package/dist/utils/git-validation.d.ts.map +1 -0
  160. package/dist/utils/git-validation.js +19 -0
  161. package/dist/utils/git-validation.js.map +1 -0
  162. package/dist/utils/test-file.d.ts +11 -0
  163. package/dist/utils/test-file.d.ts.map +1 -0
  164. package/dist/utils/test-file.js +27 -0
  165. package/dist/utils/test-file.js.map +1 -0
  166. package/package.json +62 -0
  167. package/src/parser/languages/tree-sitter-css.wasm +0 -0
  168. package/src/parser/languages/tree-sitter-go.wasm +0 -0
  169. package/src/parser/languages/tree-sitter-java.wasm +0 -0
  170. package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
  171. package/src/parser/languages/tree-sitter-json.wasm +0 -0
  172. package/src/parser/languages/tree-sitter-php.wasm +0 -0
  173. package/src/parser/languages/tree-sitter-python.wasm +0 -0
  174. package/src/parser/languages/tree-sitter-ruby.wasm +0 -0
  175. package/src/parser/languages/tree-sitter-rust.wasm +0 -0
  176. package/src/parser/languages/tree-sitter-tsx.wasm +0 -0
  177. package/src/parser/languages/tree-sitter-typescript.wasm +0 -0
@@ -0,0 +1,22 @@
1
+ import type { CodeSymbol } from "../types.js";
2
+ export interface DiffOutlineResult {
3
+ added: CodeSymbol[];
4
+ modified: CodeSymbol[];
5
+ deleted: string[];
6
+ }
7
+ export interface ChangedFileSymbols {
8
+ file: string;
9
+ symbols: string[];
10
+ }
11
+ /**
12
+ * Outline of changes between two git refs.
13
+ * Classifies symbols as added (in new files), modified (overlapping changed hunks),
14
+ * or deleted (in removed files).
15
+ */
16
+ export declare function diffOutline(repo: string, since: string, until?: string): Promise<DiffOutlineResult>;
17
+ /**
18
+ * List all symbol names in each changed file.
19
+ * Simplified version of diffOutline that only reports symbol names per file.
20
+ */
21
+ export declare function changedSymbols(repo: string, since: string, until?: string): Promise<ChangedFileSymbols[]>;
22
+ //# sourceMappingURL=diff-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-tools.d.ts","sourceRoot":"","sources":["../../src/tools/diff-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAsGD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAsC5B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAsC/B"}
@@ -0,0 +1,165 @@
1
+ import { execSync } from "node:child_process";
2
+ import { getCodeIndex } from "./index-tools.js";
3
+ import { validateGitRef } from "../utils/git-validation.js";
4
+ /**
5
+ * Parse unified diff output to extract changed file paths and line ranges.
6
+ */
7
+ function parseDiffHunks(diffOutput) {
8
+ const hunks = [];
9
+ const newFiles = [];
10
+ const deletedFiles = [];
11
+ let currentFile = null;
12
+ let isNewFile = false;
13
+ let isDeletedFile = false;
14
+ for (const line of diffOutput.split("\n")) {
15
+ // Detect file header: diff --git a/path b/path
16
+ if (line.startsWith("diff --git")) {
17
+ const match = /diff --git a\/.+ b\/(.+)/.exec(line);
18
+ if (match?.[1]) {
19
+ currentFile = match[1];
20
+ isNewFile = false;
21
+ isDeletedFile = false;
22
+ }
23
+ continue;
24
+ }
25
+ // Detect new file
26
+ if (line.startsWith("new file mode")) {
27
+ isNewFile = true;
28
+ if (currentFile) {
29
+ newFiles.push(currentFile);
30
+ }
31
+ continue;
32
+ }
33
+ // Detect deleted file
34
+ if (line.startsWith("deleted file mode")) {
35
+ isDeletedFile = true;
36
+ if (currentFile) {
37
+ deletedFiles.push(currentFile);
38
+ }
39
+ continue;
40
+ }
41
+ // Parse hunk headers: @@ -old,count +new,count @@
42
+ if (line.startsWith("@@") && currentFile && !isNewFile && !isDeletedFile) {
43
+ const hunkMatch = /@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/.exec(line);
44
+ if (hunkMatch?.[1]) {
45
+ const startLine = parseInt(hunkMatch[1], 10);
46
+ const lineCount = hunkMatch[2] !== undefined ? parseInt(hunkMatch[2], 10) : 1;
47
+ hunks.push({ file: currentFile, startLine, lineCount });
48
+ }
49
+ }
50
+ }
51
+ return { hunks, newFiles, deletedFiles };
52
+ }
53
+ /**
54
+ * Check if a symbol overlaps with any of the changed line ranges.
55
+ */
56
+ function symbolOverlapsHunks(symbol, hunks) {
57
+ for (const hunk of hunks) {
58
+ if (hunk.file !== symbol.file)
59
+ continue;
60
+ const hunkEnd = hunk.startLine + hunk.lineCount - 1;
61
+ // Overlap: symbol range intersects hunk range
62
+ if (symbol.start_line <= hunkEnd && symbol.end_line >= hunk.startLine) {
63
+ return true;
64
+ }
65
+ }
66
+ return false;
67
+ }
68
+ /**
69
+ * Run git diff and return the raw output.
70
+ */
71
+ function runGitDiff(repoRoot, since, until, nameOnly) {
72
+ validateGitRef(since);
73
+ validateGitRef(until);
74
+ const flag = nameOnly ? "--name-only" : "";
75
+ const cmd = `git diff ${flag} ${since}..${until}`.trim();
76
+ try {
77
+ return execSync(cmd, {
78
+ cwd: repoRoot,
79
+ encoding: "utf-8",
80
+ timeout: 10_000,
81
+ maxBuffer: 10 * 1024 * 1024,
82
+ });
83
+ }
84
+ catch (err) {
85
+ const message = err instanceof Error ? err.message : String(err);
86
+ throw new Error(`Git diff failed: ${message}`);
87
+ }
88
+ }
89
+ /**
90
+ * Outline of changes between two git refs.
91
+ * Classifies symbols as added (in new files), modified (overlapping changed hunks),
92
+ * or deleted (in removed files).
93
+ */
94
+ export async function diffOutline(repo, since, until) {
95
+ const index = await getCodeIndex(repo);
96
+ if (!index) {
97
+ throw new Error(`Repository not found: ${repo}`);
98
+ }
99
+ const untilRef = until ?? "HEAD";
100
+ const diffOutput = runGitDiff(index.root, since, untilRef, false);
101
+ const { hunks, newFiles, deletedFiles } = parseDiffHunks(diffOutput);
102
+ const newFileSet = new Set(newFiles);
103
+ const deletedFileSet = new Set(deletedFiles);
104
+ const added = [];
105
+ const modified = [];
106
+ for (const sym of index.symbols) {
107
+ // Symbols in new files are "added"
108
+ if (newFileSet.has(sym.file)) {
109
+ added.push(sym);
110
+ continue;
111
+ }
112
+ // Skip symbols in deleted files (they won't be in the index anyway,
113
+ // but guard just in case)
114
+ if (deletedFileSet.has(sym.file))
115
+ continue;
116
+ // Check if symbol overlaps with any changed hunk
117
+ if (symbolOverlapsHunks(sym, hunks)) {
118
+ modified.push(sym);
119
+ }
120
+ }
121
+ return {
122
+ added,
123
+ modified,
124
+ deleted: deletedFiles,
125
+ };
126
+ }
127
+ /**
128
+ * List all symbol names in each changed file.
129
+ * Simplified version of diffOutline that only reports symbol names per file.
130
+ */
131
+ export async function changedSymbols(repo, since, until) {
132
+ const index = await getCodeIndex(repo);
133
+ if (!index) {
134
+ throw new Error(`Repository not found: ${repo}`);
135
+ }
136
+ const untilRef = until ?? "HEAD";
137
+ const output = runGitDiff(index.root, since, untilRef, true);
138
+ const changedFiles = output
139
+ .split("\n")
140
+ .map((line) => line.trim())
141
+ .filter((line) => line.length > 0);
142
+ const changedFileSet = new Set(changedFiles);
143
+ // Group symbols by file
144
+ const symbolsByFile = new Map();
145
+ for (const sym of index.symbols) {
146
+ if (!changedFileSet.has(sym.file))
147
+ continue;
148
+ const existing = symbolsByFile.get(sym.file);
149
+ if (existing) {
150
+ existing.push(sym.name);
151
+ }
152
+ else {
153
+ symbolsByFile.set(sym.file, [sym.name]);
154
+ }
155
+ }
156
+ const result = [];
157
+ for (const file of changedFiles) {
158
+ const symbols = symbolsByFile.get(file);
159
+ if (symbols && symbols.length > 0) {
160
+ result.push({ file, symbols });
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ //# sourceMappingURL=diff-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-tools.js","sourceRoot":"","sources":["../../src/tools/diff-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface GenerateClaudeMdResult {
2
+ content: string;
3
+ path?: string;
4
+ }
5
+ /**
6
+ * Generate a CLAUDE.md architecture overview for a repository.
7
+ * Analyzes the index to produce a summary of files, symbols, languages,
8
+ * and directory structure.
9
+ */
10
+ export declare function generateClaudeMd(repo: string, outputPath?: string): Promise<GenerateClaudeMdResult>;
11
+ //# sourceMappingURL=generate-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tools.d.ts","sourceRoot":"","sources":["../../src/tools/generate-tools.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuGD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAsDjC"}
@@ -0,0 +1,135 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { getCodeIndex } from "./index-tools.js";
3
+ /**
4
+ * Count symbols per top-level directory from the index.
5
+ */
6
+ function countByDirectory(index) {
7
+ const dirStats = new Map();
8
+ for (const file of index.files) {
9
+ const dir = getTopDirectory(file.path);
10
+ const existing = dirStats.get(dir);
11
+ if (existing) {
12
+ existing.fileCount += 1;
13
+ existing.symbolCount += file.symbol_count;
14
+ }
15
+ else {
16
+ dirStats.set(dir, { fileCount: 1, symbolCount: file.symbol_count });
17
+ }
18
+ }
19
+ return dirStats;
20
+ }
21
+ /**
22
+ * Get the top-level directory from a file path.
23
+ * For "src/tools/index.ts" returns "src/tools".
24
+ * For "index.ts" returns ".".
25
+ */
26
+ function getTopDirectory(filePath) {
27
+ const lastSlash = filePath.lastIndexOf("/");
28
+ if (lastSlash < 0)
29
+ return ".";
30
+ return filePath.slice(0, lastSlash);
31
+ }
32
+ /**
33
+ * Count files per language.
34
+ */
35
+ function countByLanguage(files) {
36
+ const langCounts = new Map();
37
+ for (const file of files) {
38
+ langCounts.set(file.language, (langCounts.get(file.language) ?? 0) + 1);
39
+ }
40
+ return langCounts;
41
+ }
42
+ /**
43
+ * Detect the tech stack from file patterns in the index.
44
+ */
45
+ function detectTechStack(index) {
46
+ const stack = [];
47
+ const fileSet = new Set(index.files.map((f) => f.path));
48
+ const extensions = new Set(index.files.map((f) => {
49
+ const dot = f.path.lastIndexOf(".");
50
+ return dot >= 0 ? f.path.slice(dot) : "";
51
+ }));
52
+ // TypeScript
53
+ if (extensions.has(".ts") || extensions.has(".tsx")) {
54
+ stack.push("TypeScript");
55
+ }
56
+ // JavaScript
57
+ if (extensions.has(".js") || extensions.has(".jsx")) {
58
+ stack.push("JavaScript");
59
+ }
60
+ // Python
61
+ if (extensions.has(".py")) {
62
+ stack.push("Python");
63
+ }
64
+ // Detect frameworks from common config files or paths
65
+ const hasFile = (pattern) => {
66
+ for (const path of fileSet) {
67
+ if (path.includes(pattern))
68
+ return true;
69
+ }
70
+ return false;
71
+ };
72
+ if (hasFile("next.config"))
73
+ stack.push("Next.js");
74
+ if (hasFile("vite.config"))
75
+ stack.push("Vite");
76
+ if (hasFile("nest-cli.json") || hasFile("@nestjs"))
77
+ stack.push("NestJS");
78
+ if (hasFile("prisma/schema.prisma"))
79
+ stack.push("Prisma");
80
+ if (hasFile("tailwind.config"))
81
+ stack.push("Tailwind CSS");
82
+ return stack;
83
+ }
84
+ /**
85
+ * Format the language breakdown string.
86
+ * Example: "typescript (45), javascript (12), python (3)"
87
+ */
88
+ function formatLanguageBreakdown(langCounts) {
89
+ const sorted = [...langCounts.entries()].sort((a, b) => b[1] - a[1]);
90
+ return sorted.map(([lang, count]) => `${lang} (${count})`).join(", ");
91
+ }
92
+ /**
93
+ * Generate a CLAUDE.md architecture overview for a repository.
94
+ * Analyzes the index to produce a summary of files, symbols, languages,
95
+ * and directory structure.
96
+ */
97
+ export async function generateClaudeMd(repo, outputPath) {
98
+ const index = await getCodeIndex(repo);
99
+ if (!index) {
100
+ throw new Error(`Repository not found: ${repo}`);
101
+ }
102
+ const langCounts = countByLanguage(index.files);
103
+ const dirStats = countByDirectory(index);
104
+ const techStack = detectTechStack(index);
105
+ const lines = [];
106
+ lines.push("## Architecture Overview (auto-generated by codesift)");
107
+ lines.push("");
108
+ // Summary line
109
+ const langBreakdown = formatLanguageBreakdown(langCounts);
110
+ lines.push(`**${index.file_count} files, ${index.symbol_count} symbols** | Languages: ${langBreakdown}`);
111
+ // Tech stack if detected
112
+ if (techStack.length > 0) {
113
+ lines.push(`**Tech stack:** ${techStack.join(", ")}`);
114
+ }
115
+ lines.push("");
116
+ // Directory breakdown, sorted by symbol count descending
117
+ const sortedDirs = [...dirStats.entries()].sort((a, b) => b[1].symbolCount - a[1].symbolCount);
118
+ for (const [dir, stats] of sortedDirs) {
119
+ lines.push(`**${dir}/** (${stats.fileCount} files, ${stats.symbolCount} symbols)`);
120
+ }
121
+ lines.push("");
122
+ const content = lines.join("\n");
123
+ if (outputPath) {
124
+ try {
125
+ await writeFile(outputPath, content, "utf-8");
126
+ }
127
+ catch (err) {
128
+ const message = err instanceof Error ? err.message : String(err);
129
+ throw new Error(`Failed to write CLAUDE.md: ${message}`);
130
+ }
131
+ return { content, path: outputPath };
132
+ }
133
+ return { content };
134
+ }
135
+ //# sourceMappingURL=generate-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-tools.js","sourceRoot":"","sources":["../../src/tools/generate-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { isTestFileStrict as isTestFile } from "../utils/test-file.js";
2
+ import type { CodeSymbol, Direction, CallNode, ImpactResult } from "../types.js";
3
+ /**
4
+ * Pre-computed adjacency lists for O(1) lookup during BFS.
5
+ * Built once per traceCallChain / impactAnalysis call.
6
+ */
7
+ interface AdjacencyIndex {
8
+ /** symbol id → symbols that this symbol references (callees) */
9
+ callees: Map<string, CodeSymbol[]>;
10
+ /** symbol id → symbols that reference this symbol (callers) */
11
+ callers: Map<string, CodeSymbol[]>;
12
+ }
13
+ /**
14
+ * Extract identifiers that look like function/method calls from source code.
15
+ * Matches patterns like: `functionName(`, `obj.methodName(`, `this.method(`
16
+ * Returns a Set of the called identifier names.
17
+ */
18
+ declare function extractCallSites(source: string): Set<string>;
19
+ /**
20
+ * Build caller/callee adjacency lists by extracting actual call sites from source code.
21
+ *
22
+ * For each symbol with source, extracts identifiers used as function calls (pattern: `name(`)
23
+ * and looks them up in the symbol name index. This produces much more accurate edges than
24
+ * simple word-boundary matching, which matches any mention of a symbol name.
25
+ *
26
+ * @param allSymbols - All symbols in the index
27
+ * @param skipTests - If true, exclude symbols from test files (default: true)
28
+ */
29
+ declare function buildAdjacencyIndex(allSymbols: CodeSymbol[], skipTests?: boolean): AdjacencyIndex;
30
+ /**
31
+ * BFS traversal to build a call chain tree up to the given depth.
32
+ * Uses pre-built adjacency index for O(1) neighbor lookups.
33
+ * Enforces MAX_TREE_NODES and MAX_CHILDREN_PER_NODE limits.
34
+ */
35
+ declare function buildCallTree(root: CodeSymbol, adjacency: AdjacencyIndex, direction: Direction, maxDepth: number): CallNode;
36
+ export interface TraceOptions {
37
+ depth?: number | undefined;
38
+ include_source?: boolean | undefined;
39
+ include_tests?: boolean | undefined;
40
+ }
41
+ /**
42
+ * Trace the call chain for a symbol in a repository.
43
+ * Returns a tree of callers or callees up to the specified depth.
44
+ * By default, source code is stripped from symbols to keep output compact.
45
+ * Test files are excluded by default (use include_tests: true to include them).
46
+ */
47
+ export declare function traceCallChain(repo: string, symbolName: string, direction: Direction, depthOrOptions?: number | TraceOptions): Promise<CallNode>;
48
+ export interface ImpactOptions {
49
+ depth?: number | undefined;
50
+ until?: string | undefined;
51
+ include_source?: boolean | undefined;
52
+ }
53
+ /**
54
+ * Analyze the impact of recent git changes on a repository.
55
+ * Finds changed files, affected symbols, and builds a dependency graph.
56
+ * By default, source code is stripped from symbols to keep output compact.
57
+ */
58
+ export declare function impactAnalysis(repo: string, since: string, depthOrOptions?: number | ImpactOptions, until?: string): Promise<ImpactResult>;
59
+ export { buildAdjacencyIndex, extractCallSites, buildCallTree, isTestFile };
60
+ //# sourceMappingURL=graph-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-tools.d.ts","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAa,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB5F;;;GAGG;AACH,UAAU,cAAc;IACtB,gEAAgE;IAChE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACnC,+DAA+D;IAC/D,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;CACpC;AAED;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBrD;AAcD;;;;;;;;;GASG;AACH,iBAAS,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,SAAS,UAAO,GAAG,cAAc,CAkDvF;AAED;;;;GAIG;AACH,iBAAS,aAAa,CACpB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,GACf,QAAQ,CA0BV;AAoBD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,cAAc,CAAC,EAAE,MAAM,GAAG,YAAY,GACrC,OAAO,CAAC,QAAQ,CAAC,CAsCnB;AAkGD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,GAAG,aAAa,EACvC,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CA8CvB;AAGD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC"}