claude-local-docs 1.0.13 → 1.0.15

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 (60) hide show
  1. package/.mcp.json +2 -1
  2. package/README.md +124 -58
  3. package/commands/fetch-docs.md +54 -28
  4. package/commands/index-codebase.md +53 -0
  5. package/dist/code-indexer.d.ts +14 -0
  6. package/dist/code-indexer.js +519 -0
  7. package/dist/code-indexer.js.map +1 -0
  8. package/dist/code-search.d.ts +14 -0
  9. package/dist/code-search.js +155 -0
  10. package/dist/code-search.js.map +1 -0
  11. package/dist/code-store.d.ts +39 -0
  12. package/dist/code-store.js +206 -0
  13. package/dist/code-store.js.map +1 -0
  14. package/dist/code.test.d.ts +7 -0
  15. package/dist/code.test.js +197 -0
  16. package/dist/code.test.js.map +1 -0
  17. package/dist/discovery.js +56 -4
  18. package/dist/discovery.js.map +1 -1
  19. package/dist/docs.test.d.ts +7 -0
  20. package/dist/docs.test.js +105 -0
  21. package/dist/docs.test.js.map +1 -0
  22. package/dist/file-walker.d.ts +34 -0
  23. package/dist/file-walker.js +199 -0
  24. package/dist/file-walker.js.map +1 -0
  25. package/dist/index.js +321 -22
  26. package/dist/index.js.map +1 -1
  27. package/dist/indexer.js +4 -23
  28. package/dist/indexer.js.map +1 -1
  29. package/dist/integration.test.d.ts +3 -2
  30. package/dist/integration.test.js +461 -11
  31. package/dist/integration.test.js.map +1 -1
  32. package/dist/reranker.d.ts +2 -2
  33. package/dist/reranker.js +10 -12
  34. package/dist/reranker.js.map +1 -1
  35. package/dist/rrf.d.ts +17 -0
  36. package/dist/rrf.js +25 -0
  37. package/dist/rrf.js.map +1 -0
  38. package/dist/search.d.ts +2 -0
  39. package/dist/search.js +30 -52
  40. package/dist/search.js.map +1 -1
  41. package/dist/sfc-extractor.d.ts +14 -0
  42. package/dist/sfc-extractor.js +70 -0
  43. package/dist/sfc-extractor.js.map +1 -0
  44. package/dist/store.d.ts +2 -0
  45. package/dist/store.js +39 -24
  46. package/dist/store.js.map +1 -1
  47. package/dist/tei-client.d.ts +70 -0
  48. package/dist/tei-client.js +153 -0
  49. package/dist/tei-client.js.map +1 -0
  50. package/dist/types.d.ts +49 -0
  51. package/dist/types.js +4 -1
  52. package/dist/types.js.map +1 -1
  53. package/dist/unit.test.d.ts +8 -0
  54. package/dist/unit.test.js +1241 -0
  55. package/dist/unit.test.js.map +1 -0
  56. package/docker-compose.nvidia.yml +7 -0
  57. package/docker-compose.yml +9 -0
  58. package/package.json +8 -2
  59. package/scripts/ensure-tei.sh +93 -19
  60. package/start-tei.sh +17 -3
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Integration test: fetch Prisma llms-full.txt, index it, and run searches.
2
+ * Test suite for claude-local-docs.
3
3
  *
4
- * Exercises the full fetch -> chunk -> embed -> store -> search -> rerank pipeline.
4
+ * Unit tests: RRF fusion, file-walker, code-indexer chunking (no TEI needed)
5
+ * Integration tests: full doc pipeline, full code pipeline (TEI required)
5
6
  *
6
7
  * Run: npm test
7
8
  */
@@ -11,17 +12,359 @@ import { mkdtemp, rm, readFile, writeFile, mkdir } from "node:fs/promises";
11
12
  import { tmpdir } from "node:os";
12
13
  import { join } from "node:path";
13
14
  import { existsSync } from "node:fs";
15
+ // ============================================================
16
+ // Unit Tests — no TEI needed
17
+ // ============================================================
18
+ // --- RRF Fusion ---
19
+ import { reciprocalRankFusion } from "./rrf.js";
20
+ describe("reciprocalRankFusion", () => {
21
+ it("merges two ranked lists with default k=60", () => {
22
+ const list1 = [
23
+ { id: 1, text: "alpha" },
24
+ { id: 2, text: "beta" },
25
+ { id: 3, text: "gamma" },
26
+ ];
27
+ const list2 = [
28
+ { id: 2, text: "beta" },
29
+ { id: 4, text: "delta" },
30
+ { id: 1, text: "alpha" },
31
+ ];
32
+ const fused = reciprocalRankFusion([
33
+ { docs: list1, weight: 1.0 },
34
+ { docs: list2, weight: 1.0 },
35
+ ]);
36
+ // doc 2 appears in both lists (rank 1 in list1, rank 0 in list2) → highest
37
+ // doc 1 appears in both lists (rank 0 in list1, rank 2 in list2) → also high
38
+ assert.ok(fused.length >= 4);
39
+ assert.ok(fused[0].rrfScore > 0);
40
+ // IDs 1 and 2 should be top-2 (they appear in both lists)
41
+ const topIds = new Set(fused.slice(0, 2).map(f => f.id));
42
+ assert.ok(topIds.has(1) || topIds.has(2), "Expected overlapping docs to rank highly");
43
+ });
44
+ it("respects weights (higher weight = more influence)", () => {
45
+ const list1 = [{ id: 10, text: "only-in-list1" }];
46
+ const list2 = [{ id: 20, text: "only-in-list2" }];
47
+ const fused = reciprocalRankFusion([
48
+ { docs: list1, weight: 10.0 },
49
+ { docs: list2, weight: 1.0 },
50
+ ]);
51
+ assert.equal(fused[0].id, 10, "Higher-weighted list should dominate");
52
+ });
53
+ it("handles empty lists", () => {
54
+ const fused = reciprocalRankFusion([
55
+ { docs: [], weight: 1.0 },
56
+ { docs: [], weight: 1.0 },
57
+ ]);
58
+ assert.equal(fused.length, 0);
59
+ });
60
+ it("handles single list", () => {
61
+ const list = [
62
+ { id: 1, text: "alpha" },
63
+ { id: 2, text: "beta" },
64
+ ];
65
+ const fused = reciprocalRankFusion([{ docs: list, weight: 1.0 }]);
66
+ assert.equal(fused.length, 2);
67
+ assert.ok(fused[0].rrfScore > fused[1].rrfScore);
68
+ });
69
+ it("passes through extra fields on RankedDoc", () => {
70
+ const list = [{ id: 1, text: "t", filePath: "src/a.ts", language: "typescript" }];
71
+ const fused = reciprocalRankFusion([{ docs: list, weight: 1.0 }]);
72
+ assert.equal(fused[0].filePath, "src/a.ts");
73
+ assert.equal(fused[0].language, "typescript");
74
+ });
75
+ it("produces results sorted by rrfScore descending", () => {
76
+ const docs = Array.from({ length: 20 }, (_, i) => ({ id: i, text: `doc-${i}` }));
77
+ const fused = reciprocalRankFusion([{ docs, weight: 1.0 }]);
78
+ for (let i = 1; i < fused.length; i++) {
79
+ assert.ok(fused[i - 1].rrfScore >= fused[i].rrfScore, `Not sorted at index ${i}`);
80
+ }
81
+ });
82
+ });
83
+ // --- File Walker ---
84
+ import { walkProjectFiles, computeFileHash, detectLanguage } from "./file-walker.js";
85
+ describe("detectLanguage", () => {
86
+ it("detects TypeScript files", () => {
87
+ assert.equal(detectLanguage("foo.ts"), "typescript");
88
+ assert.equal(detectLanguage("bar.tsx"), "typescript");
89
+ assert.equal(detectLanguage("baz.mts"), "typescript");
90
+ assert.equal(detectLanguage("qux.cts"), "typescript");
91
+ });
92
+ it("detects JavaScript files", () => {
93
+ assert.equal(detectLanguage("foo.js"), "javascript");
94
+ assert.equal(detectLanguage("bar.jsx"), "javascript");
95
+ assert.equal(detectLanguage("baz.mjs"), "javascript");
96
+ assert.equal(detectLanguage("qux.cjs"), "javascript");
97
+ });
98
+ it("returns null for unsupported extensions", () => {
99
+ assert.equal(detectLanguage("foo.py"), null);
100
+ assert.equal(detectLanguage("bar.rs"), null);
101
+ assert.equal(detectLanguage("README.md"), null);
102
+ });
103
+ });
104
+ describe("walkProjectFiles", () => {
105
+ let tempDir;
106
+ before(async () => {
107
+ tempDir = await mkdtemp(join(tmpdir(), "file-walker-test-"));
108
+ // Create test file structure
109
+ await mkdir(join(tempDir, "src"), { recursive: true });
110
+ await mkdir(join(tempDir, "node_modules", "pkg"), { recursive: true });
111
+ await mkdir(join(tempDir, "dist"), { recursive: true });
112
+ await mkdir(join(tempDir, "lib"), { recursive: true });
113
+ await writeFile(join(tempDir, "src", "index.ts"), "export const hello = 42;");
114
+ await writeFile(join(tempDir, "src", "utils.js"), "module.exports = {};");
115
+ await writeFile(join(tempDir, "src", "README.md"), "# Docs");
116
+ await writeFile(join(tempDir, "node_modules", "pkg", "index.js"), "module.exports = {};");
117
+ await writeFile(join(tempDir, "dist", "index.js"), "var hello = 42;");
118
+ await writeFile(join(tempDir, "lib", "helper.ts"), "export function help() {}");
119
+ await writeFile(join(tempDir, "package.json"), "{}");
120
+ });
121
+ after(async () => {
122
+ await rm(tempDir, { recursive: true, force: true });
123
+ });
124
+ it("finds JS/TS files and skips node_modules and dist", async () => {
125
+ const files = await walkProjectFiles({ projectRoot: tempDir });
126
+ const paths = files.map(f => f.relativePath).sort();
127
+ assert.ok(paths.includes("src/index.ts"), "Should find src/index.ts");
128
+ assert.ok(paths.includes("src/utils.js"), "Should find src/utils.js");
129
+ assert.ok(paths.includes("lib/helper.ts"), "Should find lib/helper.ts");
130
+ assert.ok(!paths.some(p => p.includes("node_modules")), "Should skip node_modules");
131
+ assert.ok(!paths.some(p => p.startsWith("dist/")), "Should skip dist");
132
+ assert.ok(!paths.some(p => p.endsWith(".md")), "Should skip non-JS/TS files");
133
+ });
134
+ it("respects excludePaths", async () => {
135
+ const files = await walkProjectFiles({
136
+ projectRoot: tempDir,
137
+ excludePaths: ["lib/**"],
138
+ });
139
+ const paths = files.map(f => f.relativePath);
140
+ assert.ok(!paths.includes("lib/helper.ts"), "Should exclude lib/ via pattern");
141
+ assert.ok(paths.includes("src/index.ts"), "Should still include src/");
142
+ });
143
+ it("detects correct language per file", async () => {
144
+ const files = await walkProjectFiles({ projectRoot: tempDir });
145
+ const tsFile = files.find(f => f.relativePath === "src/index.ts");
146
+ const jsFile = files.find(f => f.relativePath === "src/utils.js");
147
+ assert.equal(tsFile?.language, "typescript");
148
+ assert.equal(jsFile?.language, "javascript");
149
+ });
150
+ it("skips empty files", async () => {
151
+ await writeFile(join(tempDir, "src", "empty.ts"), "");
152
+ const files = await walkProjectFiles({ projectRoot: tempDir });
153
+ assert.ok(!files.some(f => f.relativePath === "src/empty.ts"), "Should skip empty files");
154
+ });
155
+ });
156
+ describe("computeFileHash", () => {
157
+ let tempDir;
158
+ before(async () => {
159
+ tempDir = await mkdtemp(join(tmpdir(), "hash-test-"));
160
+ });
161
+ after(async () => {
162
+ await rm(tempDir, { recursive: true, force: true });
163
+ });
164
+ it("returns consistent SHA-256 hash", async () => {
165
+ const filePath = join(tempDir, "test.ts");
166
+ await writeFile(filePath, "const x = 42;");
167
+ const hash1 = await computeFileHash(filePath);
168
+ const hash2 = await computeFileHash(filePath);
169
+ assert.equal(hash1, hash2);
170
+ assert.equal(hash1.length, 64, "SHA-256 hex is 64 chars");
171
+ assert.match(hash1, /^[a-f0-9]+$/);
172
+ });
173
+ it("returns different hash for different content", async () => {
174
+ const file1 = join(tempDir, "a.ts");
175
+ const file2 = join(tempDir, "b.ts");
176
+ await writeFile(file1, "const a = 1;");
177
+ await writeFile(file2, "const b = 2;");
178
+ const hash1 = await computeFileHash(file1);
179
+ const hash2 = await computeFileHash(file2);
180
+ assert.notEqual(hash1, hash2);
181
+ });
182
+ });
183
+ // --- Code Indexer (AST chunking, no embedding) ---
184
+ import { chunkCodeFile } from "./code-indexer.js";
185
+ describe("chunkCodeFile", { timeout: 30_000 }, () => {
186
+ it("extracts functions from TypeScript", async () => {
187
+ const source = `
188
+ export function greet(name: string): string {
189
+ return "Hello, " + name;
190
+ }
191
+
192
+ export function farewell(name: string): string {
193
+ return "Goodbye, " + name;
194
+ }
195
+ `.trim();
196
+ const chunks = await chunkCodeFile(source, "src/greet.ts", "typescript");
197
+ assert.ok(chunks.length >= 2, `Expected >=2 chunks, got ${chunks.length}`);
198
+ const greetChunk = chunks.find(c => c.entityName === "greet");
199
+ assert.ok(greetChunk, "Should find 'greet' entity");
200
+ assert.equal(greetChunk.entityType, "function");
201
+ assert.equal(greetChunk.filePath, "src/greet.ts");
202
+ assert.equal(greetChunk.language, "typescript");
203
+ assert.ok(greetChunk.text.includes("// File: src/greet.ts"), "Should have contextual header");
204
+ assert.ok(greetChunk.text.includes("Hello"), "Should contain function body");
205
+ });
206
+ it("extracts classes and methods", async () => {
207
+ // Make the class large enough (>1500 non-ws chars) to trigger method extraction
208
+ const longBody = ` return "${Array(200).fill("x").join("")}";`;
209
+ const source = `
210
+ export class UserService {
211
+ private db: any;
212
+
213
+ constructor(db: any) {
214
+ this.db = db;
215
+ }
216
+
217
+ async findUser(id: string): Promise<any> {
218
+ ${longBody}
219
+ }
220
+
221
+ async createUser(data: any): Promise<any> {
222
+ ${longBody}
223
+ }
224
+
225
+ async deleteUser(id: string): Promise<void> {
226
+ ${longBody}
227
+ }
228
+ }
229
+ `.trim();
230
+ const chunks = await chunkCodeFile(source, "src/user.ts", "typescript");
231
+ // Should have the class itself plus individual methods
232
+ const classChunk = chunks.find(c => c.entityType === "class");
233
+ assert.ok(classChunk, "Should extract class");
234
+ assert.equal(classChunk.entityName, "UserService");
235
+ const methodChunks = chunks.filter(c => c.entityType === "method");
236
+ assert.ok(methodChunks.length >= 2, `Expected >=2 methods, got ${methodChunks.length}`);
237
+ // Methods should have scope chain
238
+ for (const mc of methodChunks) {
239
+ const scope = JSON.parse(mc.scopeChain);
240
+ assert.ok(scope.includes("UserService"), `Method scope should include class name, got ${mc.scopeChain}`);
241
+ }
242
+ });
243
+ it("extracts arrow functions in const declarations", async () => {
244
+ const source = `
245
+ export const add = (a: number, b: number): number => {
246
+ return a + b;
247
+ };
248
+
249
+ export const subtract = (a: number, b: number): number => a - b;
250
+ `.trim();
251
+ const chunks = await chunkCodeFile(source, "src/math.ts", "typescript");
252
+ const addChunk = chunks.find(c => c.entityName === "add");
253
+ assert.ok(addChunk, "Should find 'add' arrow function");
254
+ assert.equal(addChunk.entityType, "function");
255
+ });
256
+ it("extracts interfaces and type aliases", async () => {
257
+ const source = `
258
+ export interface User {
259
+ id: string;
260
+ name: string;
261
+ email: string;
262
+ createdAt: Date;
263
+ }
264
+
265
+ export type UserRole = "admin" | "user" | "guest";
266
+ `.trim();
267
+ const chunks = await chunkCodeFile(source, "src/types.ts", "typescript");
268
+ const iface = chunks.find(c => c.entityType === "interface");
269
+ assert.ok(iface, "Should find interface");
270
+ assert.equal(iface.entityName, "User");
271
+ const typeAlias = chunks.find(c => c.entityType === "type_alias");
272
+ assert.ok(typeAlias, "Should find type alias");
273
+ assert.equal(typeAlias.entityName, "UserRole");
274
+ });
275
+ it("extracts enums", async () => {
276
+ const source = `
277
+ export enum Direction {
278
+ Up = "UP",
279
+ Down = "DOWN",
280
+ Left = "LEFT",
281
+ Right = "RIGHT",
282
+ }
283
+ `.trim();
284
+ const chunks = await chunkCodeFile(source, "src/enums.ts", "typescript");
285
+ const enumChunk = chunks.find(c => c.entityType === "enum");
286
+ assert.ok(enumChunk, "Should find enum");
287
+ assert.equal(enumChunk.entityName, "Direction");
288
+ });
289
+ it("produces contextual headers with file path, scope, and split name", async () => {
290
+ const source = `
291
+ export function validateEmailAddress(email: string): boolean {
292
+ return email.includes("@") && email.includes(".");
293
+ }
294
+ `.trim();
295
+ const chunks = await chunkCodeFile(source, "src/validators.ts", "typescript");
296
+ const chunk = chunks[0];
297
+ assert.ok(chunk.text.includes("// File: src/validators.ts"), "Header should include file path");
298
+ assert.ok(chunk.text.includes("validate email address") || chunk.text.includes("validate Email Address"), "Header should include camelCase-split name for BM25");
299
+ });
300
+ it("merges small entities (<100 non-ws chars)", async () => {
301
+ const source = `
302
+ import { foo } from "foo";
303
+ import { bar } from "bar";
304
+ import { baz } from "baz";
305
+
306
+ export const VERSION = "1.0.0";
307
+ `.trim();
308
+ const chunks = await chunkCodeFile(source, "src/index.ts", "typescript");
309
+ // Imports and the small const should be merged
310
+ assert.ok(chunks.length <= 3, `Expected small entities to be merged, got ${chunks.length} chunks`);
311
+ });
312
+ it("handles JavaScript files", async () => {
313
+ const source = `
314
+ function hello() {
315
+ console.log("hello world");
316
+ }
317
+
318
+ module.exports = { hello };
319
+ `.trim();
320
+ const chunks = await chunkCodeFile(source, "lib/hello.js", "javascript");
321
+ assert.ok(chunks.length >= 1);
322
+ const fnChunk = chunks.find(c => c.entityName === "hello");
323
+ assert.ok(fnChunk, "Should extract JS function");
324
+ assert.equal(fnChunk.language, "javascript");
325
+ });
326
+ it("creates module-level chunk for files with no extractable entities", async () => {
327
+ // A file that's just comments / bare expressions
328
+ const source = `
329
+ // This is a configuration file
330
+ console.log("bootstrap");
331
+ `.trim();
332
+ const chunks = await chunkCodeFile(source, "src/bootstrap.ts", "typescript");
333
+ assert.equal(chunks.length, 1);
334
+ assert.equal(chunks[0].entityType, "module");
335
+ assert.equal(chunks[0].entityName, "");
336
+ });
337
+ it("has 1-based line numbers", async () => {
338
+ const source = `
339
+ export function first() {
340
+ return 1;
341
+ }
342
+
343
+ export function second() {
344
+ return 2;
345
+ }
346
+ `.trim();
347
+ const chunks = await chunkCodeFile(source, "src/lines.ts", "typescript");
348
+ for (const c of chunks) {
349
+ assert.ok(c.lineStart >= 1, `lineStart should be >= 1, got ${c.lineStart}`);
350
+ assert.ok(c.lineEnd >= c.lineStart, `lineEnd should be >= lineStart`);
351
+ }
352
+ });
353
+ });
354
+ // ============================================================
355
+ // Integration Tests — require TEI containers running
356
+ // ============================================================
14
357
  import { fetchDocContent } from "./fetcher.js";
15
358
  import { chunkMarkdown, indexDocument } from "./indexer.js";
16
359
  import { DocStore } from "./store.js";
17
360
  import { searchDocs } from "./search.js";
361
+ import { CodeStore } from "./code-store.js";
362
+ import { indexCodeFile } from "./code-indexer.js";
363
+ import { searchCode } from "./code-search.js";
18
364
  const PRISMA_URL = "https://www.prisma.io/docs/llms-full.txt";
19
365
  const CACHE_DIR = join(tmpdir(), "claude-local-docs-fixture");
20
366
  const CACHE_FILE = join(CACHE_DIR, "prisma-llms-full.txt");
21
- let tempDir;
22
- let store;
23
- let fetchedContent;
24
- /** Load from cache or fetch from network. */
367
+ /** Load Prisma docs from cache or fetch from network. */
25
368
  async function loadPrismaDoc() {
26
369
  if (existsSync(CACHE_FILE)) {
27
370
  console.log(" Using cached Prisma docs");
@@ -36,7 +379,11 @@ async function loadPrismaDoc() {
36
379
  console.log(` Fetched and cached ${result.byteLength} bytes (${(result.byteLength / 1024 / 1024).toFixed(1)} MB)`);
37
380
  return result.content;
38
381
  }
39
- describe("Prisma llms-full.txt integration", { timeout: 600_000 }, () => {
382
+ // --- Doc search integration ---
383
+ describe("Doc search pipeline (Prisma)", { timeout: 600_000 }, () => {
384
+ let tempDir;
385
+ let store;
386
+ let fetchedContent;
40
387
  before(async () => {
41
388
  tempDir = await mkdtemp(join(tmpdir(), "claude-local-docs-test-"));
42
389
  fetchedContent = await loadPrismaDoc();
@@ -46,11 +393,9 @@ describe("Prisma llms-full.txt integration", { timeout: 600_000 }, () => {
46
393
  await rm(tempDir, { recursive: true, force: true });
47
394
  }
48
395
  });
49
- // -- Fetch --
50
396
  it("fetched content is substantial", () => {
51
397
  assert.ok(fetchedContent.length > 1_000_000, `Expected > 1M chars, got ${fetchedContent.length}`);
52
398
  });
53
- // -- Chunking --
54
399
  it("chunks the markdown into reasonable pieces", () => {
55
400
  const chunks = chunkMarkdown(fetchedContent, "prisma");
56
401
  console.log(` Produced ${chunks.length} chunks`);
@@ -62,7 +407,6 @@ describe("Prisma llms-full.txt integration", { timeout: 600_000 }, () => {
62
407
  assert.ok(Array.isArray(parsed), `headingPath not an array: ${c.headingPath}`);
63
408
  }
64
409
  });
65
- // -- Index + Store --
66
410
  it("indexes and stores all chunks in LanceDB", async () => {
67
411
  store = new DocStore(tempDir);
68
412
  const chunks = await indexDocument(fetchedContent, "prisma");
@@ -76,7 +420,6 @@ describe("Prisma llms-full.txt integration", { timeout: 600_000 }, () => {
76
420
  assert.equal(result.chunkCount, chunks.length);
77
421
  assert.equal(result.indexSize, chunks.length);
78
422
  });
79
- // -- Search --
80
423
  const searchCases = [
81
424
  { query: "prisma client query", expectTerms: ["prisma", "client", "query"] },
82
425
  { query: "database migration", expectTerms: ["migrat", "schema", "database"] },
@@ -111,4 +454,111 @@ describe("Prisma llms-full.txt integration", { timeout: 600_000 }, () => {
111
454
  }
112
455
  });
113
456
  });
457
+ // --- Code search integration (indexes this project's own source) ---
458
+ describe("Code search pipeline (self-codebase)", { timeout: 300_000 }, () => {
459
+ let tempDir;
460
+ let codeStore;
461
+ // Resolve project root (parent of src/)
462
+ const projectSrcDir = join(import.meta.dirname, "..", "src");
463
+ before(async () => {
464
+ tempDir = await mkdtemp(join(tmpdir(), "code-search-test-"));
465
+ codeStore = new CodeStore(tempDir);
466
+ // Walk this project's own src/ files and index them
467
+ const files = await walkProjectFiles({
468
+ projectRoot: join(import.meta.dirname, ".."),
469
+ includePaths: ["src/**"],
470
+ excludePaths: ["src/integration.test.ts"], // skip the test file itself
471
+ });
472
+ console.log(` Found ${files.length} source files to index`);
473
+ assert.ok(files.length >= 8, `Expected >=8 src files, got ${files.length}`);
474
+ let totalChunks = 0;
475
+ for (const f of files) {
476
+ const source = await readFile(f.absolutePath, "utf-8");
477
+ const sha256 = await computeFileHash(f.absolutePath);
478
+ const chunks = await indexCodeFile(source, f.relativePath, f.language);
479
+ await codeStore.addFile(f.relativePath, f.language, sha256, chunks);
480
+ totalChunks += chunks.length;
481
+ console.log(` ${f.relativePath}: ${chunks.length} chunks`);
482
+ }
483
+ // Build FTS index
484
+ await codeStore.createFtsIndex();
485
+ console.log(` FTS index built — ${totalChunks} total chunks`);
486
+ });
487
+ after(async () => {
488
+ if (tempDir && existsSync(tempDir)) {
489
+ await rm(tempDir, { recursive: true, force: true });
490
+ }
491
+ });
492
+ it("finds RRF fusion logic by concept", async () => {
493
+ const results = await searchCode("reciprocal rank fusion", codeStore, { topK: 5 });
494
+ assert.ok(results.length > 0, "Expected at least 1 result");
495
+ const hasRrf = results.some(r => r.filePath.includes("rrf") || r.content.includes("reciprocalRankFusion") || r.content.includes("rrfScore"));
496
+ assert.ok(hasRrf, "Should find RRF-related code");
497
+ });
498
+ it("finds LanceDB table management by concept", async () => {
499
+ const results = await searchCode("LanceDB table management", codeStore, { topK: 5 });
500
+ assert.ok(results.length > 0, "Expected at least 1 result");
501
+ const hasStore = results.some(r => r.filePath.includes("store") || r.content.includes("LanceDB") || r.content.includes("openTable") || r.content.includes("createTable"));
502
+ assert.ok(hasStore, "Should find LanceDB store code");
503
+ });
504
+ it("finds heading-based markdown chunking", async () => {
505
+ const results = await searchCode("heading based markdown chunking", codeStore, { topK: 5 });
506
+ assert.ok(results.length > 0, "Expected at least 1 result");
507
+ const hasChunker = results.some(r => r.content.includes("chunkMarkdown") || r.content.includes("headingStack") || r.content.includes("splitWithOverlap"));
508
+ assert.ok(hasChunker, "Should find markdown chunking code");
509
+ });
510
+ it("finds cross-encoder reranking", async () => {
511
+ const results = await searchCode("cross encoder reranking", codeStore, { topK: 5 });
512
+ assert.ok(results.length > 0, "Expected at least 1 result");
513
+ const hasReranker = results.some(r => r.filePath.includes("reranker") || r.content.includes("rerank") || r.content.includes("rerankerScore"));
514
+ assert.ok(hasReranker, "Should find reranker code");
515
+ });
516
+ it("finds file walker / gitignore logic", async () => {
517
+ const results = await searchCode("walk project files gitignore", codeStore, { topK: 5 });
518
+ assert.ok(results.length > 0, "Expected at least 1 result");
519
+ const hasWalker = results.some(r => r.filePath.includes("file-walker") || r.content.includes("walkProjectFiles") || r.content.includes("gitignore"));
520
+ assert.ok(hasWalker, "Should find file walker code");
521
+ });
522
+ it("finds DocStore class", async () => {
523
+ const results = await searchCode("DocStore class", codeStore, { topK: 5 });
524
+ assert.ok(results.length > 0, "Expected at least 1 result");
525
+ const hasDocStore = results.some(r => r.entityName === "DocStore" || r.content.includes("class DocStore"));
526
+ assert.ok(hasDocStore, "Should find DocStore class");
527
+ });
528
+ it("returns results with valid CodeSearchResult structure", async () => {
529
+ const results = await searchCode("embed texts", codeStore, { topK: 3 });
530
+ for (const r of results) {
531
+ assert.equal(typeof r.score, "number");
532
+ assert.equal(typeof r.filePath, "string");
533
+ assert.equal(typeof r.language, "string");
534
+ assert.equal(typeof r.entityType, "string");
535
+ assert.equal(typeof r.entityName, "string");
536
+ assert.ok(Array.isArray(r.scopeChain));
537
+ assert.equal(typeof r.lineStart, "number");
538
+ assert.equal(typeof r.lineEnd, "number");
539
+ assert.equal(typeof r.content, "string");
540
+ assert.equal(typeof r.chunkId, "number");
541
+ assert.ok(r.content.length > 0);
542
+ }
543
+ });
544
+ it("returns scores in descending order", async () => {
545
+ const results = await searchCode("search pipeline", codeStore, { topK: 10 });
546
+ assert.ok(results.length > 1, "Expected multiple results");
547
+ for (let i = 1; i < results.length; i++) {
548
+ assert.ok(results[i - 1].score >= results[i].score, `Not sorted at [${i}]`);
549
+ }
550
+ });
551
+ it("filters by language", async () => {
552
+ const results = await searchCode("function", codeStore, { language: "typescript", topK: 10 });
553
+ for (const r of results) {
554
+ assert.equal(r.language, "typescript");
555
+ }
556
+ });
557
+ it("filters by filePath", async () => {
558
+ const results = await searchCode("search", codeStore, { filePath: "src/search.ts", topK: 10 });
559
+ for (const r of results) {
560
+ assert.equal(r.filePath, "src/search.ts");
561
+ }
562
+ });
563
+ });
114
564
  //# sourceMappingURL=integration.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../src/integration.test.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,14 @@
5
5
  export interface RerankCandidate {
6
6
  id: number;
7
7
  text: string;
8
- library: string;
9
- headingPath: string;
10
8
  rrfScore: number;
9
+ [key: string]: any;
11
10
  }
12
11
  export interface RerankResult extends RerankCandidate {
13
12
  rerankerScore: number;
14
13
  }
15
14
  /**
16
15
  * Rerank candidates using TEI cross-encoder endpoint.
16
+ * Batching is handled by the TeiClient.
17
17
  */
18
18
  export declare function rerank(query: string, candidates: RerankCandidate[]): Promise<RerankResult[]>;
package/dist/reranker.js CHANGED
@@ -2,24 +2,22 @@
2
2
  * Cross-encoder reranker via TEI (Text Embeddings Inference).
3
3
  * Takes query + candidate passages, returns relevance scores.
4
4
  */
5
- const TEI_RERANK_URL = process.env.TEI_RERANK_URL ?? "http://localhost:39282";
5
+ import { rerankClient } from "./tei-client.js";
6
6
  /**
7
7
  * Rerank candidates using TEI cross-encoder endpoint.
8
+ * Batching is handled by the TeiClient.
8
9
  */
9
10
  export async function rerank(query, candidates) {
10
11
  if (candidates.length === 0)
11
12
  return [];
12
- const res = await fetch(`${TEI_RERANK_URL}/rerank`, {
13
- method: "POST",
14
- headers: { "Content-Type": "application/json" },
15
- body: JSON.stringify({ query, texts: candidates.map((c) => c.text) }),
16
- });
17
- if (!res.ok) {
18
- throw new Error(`TEI rerank error: ${res.status} ${await res.text()}`);
13
+ const texts = candidates.map((c) => c.text);
14
+ const scored = await rerankClient.rerank(query, texts);
15
+ const results = [];
16
+ for (const r of scored) {
17
+ if (r.index >= 0 && r.index < candidates.length) {
18
+ results.push({ ...candidates[r.index], rerankerScore: r.score });
19
+ }
19
20
  }
20
- const results = await res.json();
21
- return results
22
- .map((r) => ({ ...candidates[r.index], rerankerScore: r.score }))
23
- .sort((a, b) => b.rerankerScore - a.rerankerScore);
21
+ return results.sort((a, b) => b.rerankerScore - a.rerankerScore);
24
22
  }
25
23
  //# sourceMappingURL=reranker.js.map