pcl-mcp 0.2.4 → 0.3.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 (114) hide show
  1. package/README.md +137 -28
  2. package/dist/benchmarks/evaluators/context-retrieval-quality.d.ts +30 -0
  3. package/dist/benchmarks/evaluators/context-retrieval-quality.d.ts.map +1 -0
  4. package/dist/benchmarks/evaluators/context-retrieval-quality.js +50 -0
  5. package/dist/benchmarks/evaluators/context-retrieval-quality.js.map +1 -0
  6. package/dist/benchmarks/evaluators/ir-metrics.d.ts +32 -0
  7. package/dist/benchmarks/evaluators/ir-metrics.d.ts.map +1 -0
  8. package/dist/benchmarks/evaluators/ir-metrics.js +98 -0
  9. package/dist/benchmarks/evaluators/ir-metrics.js.map +1 -0
  10. package/dist/benchmarks/evaluators/structured-judge.d.ts +34 -0
  11. package/dist/benchmarks/evaluators/structured-judge.d.ts.map +1 -0
  12. package/dist/benchmarks/evaluators/structured-judge.js +153 -0
  13. package/dist/benchmarks/evaluators/structured-judge.js.map +1 -0
  14. package/dist/benchmarks/evaluators/token-counter.d.ts +9 -0
  15. package/dist/benchmarks/evaluators/token-counter.d.ts.map +1 -0
  16. package/dist/benchmarks/evaluators/token-counter.js +24 -0
  17. package/dist/benchmarks/evaluators/token-counter.js.map +1 -0
  18. package/dist/benchmarks/generators/generate-corpus.d.ts +2 -0
  19. package/dist/benchmarks/generators/generate-corpus.d.ts.map +1 -0
  20. package/dist/benchmarks/generators/generate-corpus.js +243 -0
  21. package/dist/benchmarks/generators/generate-corpus.js.map +1 -0
  22. package/dist/benchmarks/lib/harness.d.ts +23 -0
  23. package/dist/benchmarks/lib/harness.d.ts.map +1 -0
  24. package/dist/benchmarks/lib/harness.js +44 -0
  25. package/dist/benchmarks/lib/harness.js.map +1 -0
  26. package/dist/benchmarks/lib/types.d.ts +79 -0
  27. package/dist/benchmarks/lib/types.d.ts.map +1 -0
  28. package/dist/benchmarks/lib/types.js +2 -0
  29. package/dist/benchmarks/lib/types.js.map +1 -0
  30. package/dist/benchmarks/reporters/markdown-reporter.d.ts +2 -0
  31. package/dist/benchmarks/reporters/markdown-reporter.d.ts.map +1 -0
  32. package/dist/benchmarks/reporters/markdown-reporter.js +80 -0
  33. package/dist/benchmarks/reporters/markdown-reporter.js.map +1 -0
  34. package/dist/benchmarks/runners/bench-ablation.d.ts +2 -0
  35. package/dist/benchmarks/runners/bench-ablation.d.ts.map +1 -0
  36. package/dist/benchmarks/runners/bench-ablation.js +49 -0
  37. package/dist/benchmarks/runners/bench-ablation.js.map +1 -0
  38. package/dist/benchmarks/runners/bench-ai-quality.d.ts +2 -0
  39. package/dist/benchmarks/runners/bench-ai-quality.d.ts.map +1 -0
  40. package/dist/benchmarks/runners/bench-ai-quality.js +297 -0
  41. package/dist/benchmarks/runners/bench-ai-quality.js.map +1 -0
  42. package/dist/benchmarks/runners/bench-interactive-eval.d.ts +2 -0
  43. package/dist/benchmarks/runners/bench-interactive-eval.d.ts.map +1 -0
  44. package/dist/benchmarks/runners/bench-interactive-eval.js +119 -0
  45. package/dist/benchmarks/runners/bench-interactive-eval.js.map +1 -0
  46. package/dist/benchmarks/runners/bench-performance.bench.d.ts +2 -0
  47. package/dist/benchmarks/runners/bench-performance.bench.d.ts.map +1 -0
  48. package/dist/benchmarks/runners/bench-performance.bench.js +50 -0
  49. package/dist/benchmarks/runners/bench-performance.bench.js.map +1 -0
  50. package/dist/benchmarks/runners/bench-search-quality.d.ts +2 -0
  51. package/dist/benchmarks/runners/bench-search-quality.d.ts.map +1 -0
  52. package/dist/benchmarks/runners/bench-search-quality.js +70 -0
  53. package/dist/benchmarks/runners/bench-search-quality.js.map +1 -0
  54. package/dist/benchmarks/runners/bench-token-efficiency.d.ts +2 -0
  55. package/dist/benchmarks/runners/bench-token-efficiency.d.ts.map +1 -0
  56. package/dist/benchmarks/runners/bench-token-efficiency.js +89 -0
  57. package/dist/benchmarks/runners/bench-token-efficiency.js.map +1 -0
  58. package/dist/benchmarks/runners/diag.d.ts +2 -0
  59. package/dist/benchmarks/runners/diag.d.ts.map +1 -0
  60. package/dist/benchmarks/runners/diag.js +30 -0
  61. package/dist/benchmarks/runners/diag.js.map +1 -0
  62. package/dist/benchmarks/vitest.config.bench.d.ts +3 -0
  63. package/dist/benchmarks/vitest.config.bench.d.ts.map +1 -0
  64. package/dist/benchmarks/vitest.config.bench.js +14 -0
  65. package/dist/benchmarks/vitest.config.bench.js.map +1 -0
  66. package/dist/bin/pcl.js +36 -23
  67. package/dist/bin/pcl.js.map +1 -1
  68. package/dist/src/db.d.ts +2 -1
  69. package/dist/src/db.d.ts.map +1 -1
  70. package/dist/src/db.js +25 -21
  71. package/dist/src/db.js.map +1 -1
  72. package/dist/src/embeddings.d.ts +1 -1
  73. package/dist/src/embeddings.js +2 -2
  74. package/dist/src/embeddings.js.map +1 -1
  75. package/dist/src/indexer.d.ts +1 -1
  76. package/dist/src/indexer.d.ts.map +1 -1
  77. package/dist/src/indexer.js +6 -2
  78. package/dist/src/indexer.js.map +1 -1
  79. package/dist/src/search.d.ts.map +1 -1
  80. package/dist/src/search.js +138 -26
  81. package/dist/src/search.js.map +1 -1
  82. package/dist/src/server.js +6 -0
  83. package/dist/src/server.js.map +1 -1
  84. package/dist/src/types.d.ts +1 -0
  85. package/dist/src/types.d.ts.map +1 -1
  86. package/dist/tests/db.test.d.ts +2 -0
  87. package/dist/tests/db.test.d.ts.map +1 -0
  88. package/dist/tests/db.test.js +459 -0
  89. package/dist/tests/db.test.js.map +1 -0
  90. package/dist/tests/embeddings.test.d.ts +2 -0
  91. package/dist/tests/embeddings.test.d.ts.map +1 -0
  92. package/dist/tests/embeddings.test.js +165 -0
  93. package/dist/tests/embeddings.test.js.map +1 -0
  94. package/dist/tests/helpers/test-harness.d.ts +26 -0
  95. package/dist/tests/helpers/test-harness.d.ts.map +1 -0
  96. package/dist/tests/helpers/test-harness.js +80 -0
  97. package/dist/tests/helpers/test-harness.js.map +1 -0
  98. package/dist/tests/indexer.test.d.ts +2 -0
  99. package/dist/tests/indexer.test.d.ts.map +1 -0
  100. package/dist/tests/indexer.test.js +299 -0
  101. package/dist/tests/indexer.test.js.map +1 -0
  102. package/dist/tests/schemas.test.d.ts +2 -0
  103. package/dist/tests/schemas.test.d.ts.map +1 -0
  104. package/dist/tests/schemas.test.js +378 -0
  105. package/dist/tests/schemas.test.js.map +1 -0
  106. package/dist/tests/search.test.d.ts +2 -0
  107. package/dist/tests/search.test.d.ts.map +1 -0
  108. package/dist/tests/search.test.js +129 -0
  109. package/dist/tests/search.test.js.map +1 -0
  110. package/dist/tests/tools.test.d.ts +2 -0
  111. package/dist/tests/tools.test.d.ts.map +1 -0
  112. package/dist/tests/tools.test.js +232 -0
  113. package/dist/tests/tools.test.js.map +1 -0
  114. package/package.json +14 -2
@@ -0,0 +1,459 @@
1
+ import { describe, it, expect, afterEach } from "vitest";
2
+ import { existsSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { closeDB, packEmbedding, unpackEmbedding, hashContent, upsertFile, deleteFile, getFileByPath, getFileById, getProductFile, listByType, getCritical, getAllWithEmbeddings, getAllWithoutEmbeddings, keywordSearch, } from "../src/db.js";
5
+ import { createTestDB, createTestFile } from "./helpers/test-harness.js";
6
+ // ─── packEmbedding / unpackEmbedding ────────────────────────────────────────
7
+ describe("packEmbedding / unpackEmbedding", () => {
8
+ it("round-trips a 384-dim float vector exactly", () => {
9
+ const vec = Array.from({ length: 384 }, (_, i) => i * 0.001);
10
+ const packed = packEmbedding(vec);
11
+ const unpacked = unpackEmbedding(packed);
12
+ expect(unpacked).toHaveLength(384);
13
+ for (let i = 0; i < vec.length; i++) {
14
+ expect(unpacked[i]).toBeCloseTo(vec[i], 5);
15
+ }
16
+ });
17
+ it("round-trips an empty vector", () => {
18
+ const packed = packEmbedding([]);
19
+ const unpacked = unpackEmbedding(packed);
20
+ expect(unpacked).toEqual([]);
21
+ });
22
+ it("preserves negative values", () => {
23
+ const vec = [-1.5, -0.001, 0, 0.001, 1.5];
24
+ const unpacked = unpackEmbedding(packEmbedding(vec));
25
+ for (let i = 0; i < vec.length; i++) {
26
+ expect(unpacked[i]).toBeCloseTo(vec[i], 5);
27
+ }
28
+ });
29
+ it("maintains Float32 precision", () => {
30
+ // Float32 has ~7 significant digits
31
+ const vec = [Math.PI, Math.E, 1.23456789];
32
+ const unpacked = unpackEmbedding(packEmbedding(vec));
33
+ for (let i = 0; i < vec.length; i++) {
34
+ // Float32 rounds to ~6 decimal precision
35
+ expect(unpacked[i]).toBeCloseTo(vec[i], 5);
36
+ }
37
+ });
38
+ });
39
+ // ─── hashContent ─────────────────────────────────────────────────────────────
40
+ describe("hashContent", () => {
41
+ it("returns a 16-char hex string", () => {
42
+ const hash = hashContent("hello world");
43
+ expect(hash).toHaveLength(16);
44
+ expect(hash).toMatch(/^[0-9a-f]{16}$/);
45
+ });
46
+ it("is deterministic", () => {
47
+ const a = hashContent("test content");
48
+ const b = hashContent("test content");
49
+ expect(a).toBe(b);
50
+ });
51
+ it("different content produces different hash", () => {
52
+ const a = hashContent("content A");
53
+ const b = hashContent("content B");
54
+ expect(a).not.toBe(b);
55
+ });
56
+ it("whitespace differences produce different hashes", () => {
57
+ const a = hashContent("hello world");
58
+ const b = hashContent("hello world");
59
+ expect(a).not.toBe(b);
60
+ });
61
+ });
62
+ // ─── openDB / closeDB ──────────────────────────────────────────────────────
63
+ describe("openDB / closeDB", () => {
64
+ let harness;
65
+ afterEach(async () => {
66
+ if (harness)
67
+ await harness.cleanup();
68
+ });
69
+ it("creates .pcl.db in productDir", async () => {
70
+ harness = await createTestDB();
71
+ const dbPath = join(harness.productDir, ".pcl.db");
72
+ expect(existsSync(dbPath)).toBe(true);
73
+ });
74
+ it("closeDB allows re-opening with new path", async () => {
75
+ harness = await createTestDB();
76
+ const file = createTestFile({ path: join(harness.productDir, "personas/p.md") });
77
+ upsertFile(harness.db, file);
78
+ // Close and re-open with a fresh harness
79
+ closeDB();
80
+ const harness2 = await createTestDB();
81
+ // New DB should be empty since it is a different temp dir
82
+ const result = getFileByPath(harness2.db, file.path);
83
+ expect(result).toBeNull();
84
+ await harness2.cleanup();
85
+ });
86
+ });
87
+ // ─── upsertFile ─────────────────────────────────────────────────────────────
88
+ describe("upsertFile", () => {
89
+ let harness;
90
+ afterEach(async () => {
91
+ if (harness)
92
+ await harness.cleanup();
93
+ });
94
+ it("inserts a new file", async () => {
95
+ harness = await createTestDB();
96
+ const file = createTestFile({ path: join(harness.productDir, "personas/dev.md") });
97
+ upsertFile(harness.db, file);
98
+ const retrieved = getFileByPath(harness.db, file.path);
99
+ expect(retrieved).not.toBeNull();
100
+ expect(retrieved.id).toBe(file.id);
101
+ expect(retrieved.type).toBe(file.type);
102
+ expect(retrieved.body).toBe(file.body);
103
+ });
104
+ it("updates existing file at same path", async () => {
105
+ harness = await createTestDB();
106
+ const path = join(harness.productDir, "personas/dev.md");
107
+ const file = createTestFile({ path });
108
+ upsertFile(harness.db, file);
109
+ const updated = createTestFile({ path, body: "Updated body content" });
110
+ upsertFile(harness.db, updated);
111
+ const retrieved = getFileByPath(harness.db, path);
112
+ expect(retrieved).not.toBeNull();
113
+ expect(retrieved.body).toBe("Updated body content");
114
+ // Should still be one row, not two
115
+ const allPersonas = listByType(harness.db, "persona");
116
+ expect(allPersonas).toHaveLength(1);
117
+ });
118
+ it("is idempotent: same file twice produces same result", async () => {
119
+ harness = await createTestDB();
120
+ const file = createTestFile({ path: join(harness.productDir, "personas/dev.md") });
121
+ upsertFile(harness.db, file);
122
+ upsertFile(harness.db, file);
123
+ const allPersonas = listByType(harness.db, "persona");
124
+ expect(allPersonas).toHaveLength(1);
125
+ });
126
+ it("handles file move: same (id,type) different path replaces old", async () => {
127
+ harness = await createTestDB();
128
+ const oldPath = join(harness.productDir, "personas/old-name.md");
129
+ const newPath = join(harness.productDir, "personas/new-name.md");
130
+ const file = createTestFile({ id: "dev-dan", path: oldPath });
131
+ upsertFile(harness.db, file);
132
+ const moved = createTestFile({ id: "dev-dan", path: newPath });
133
+ upsertFile(harness.db, moved);
134
+ // Old path should no longer exist
135
+ expect(getFileByPath(harness.db, oldPath)).toBeNull();
136
+ // New path should exist
137
+ expect(getFileByPath(harness.db, newPath)).not.toBeNull();
138
+ // Only one record for this id/type
139
+ const allPersonas = listByType(harness.db, "persona");
140
+ expect(allPersonas).toHaveLength(1);
141
+ });
142
+ it("stores embedding as BLOB", async () => {
143
+ harness = await createTestDB();
144
+ const embedding = Array.from({ length: 384 }, () => Math.random());
145
+ const file = createTestFile({
146
+ path: join(harness.productDir, "personas/dev.md"),
147
+ embedding,
148
+ });
149
+ upsertFile(harness.db, file);
150
+ const retrieved = getFileByPath(harness.db, file.path);
151
+ expect(retrieved).not.toBeNull();
152
+ expect(retrieved.embedding).toHaveLength(384);
153
+ for (let i = 0; i < 384; i++) {
154
+ expect(retrieved.embedding[i]).toBeCloseTo(embedding[i], 5);
155
+ }
156
+ });
157
+ it("stores null embedding when empty array", async () => {
158
+ harness = await createTestDB();
159
+ const file = createTestFile({
160
+ path: join(harness.productDir, "personas/dev.md"),
161
+ embedding: [],
162
+ });
163
+ upsertFile(harness.db, file);
164
+ // File with no embedding should appear in "without embeddings" list
165
+ const withoutEmb = getAllWithoutEmbeddings(harness.db);
166
+ expect(withoutEmb).toHaveLength(1);
167
+ expect(withoutEmb[0].embedding).toEqual([]);
168
+ });
169
+ });
170
+ // ─── queries ─────────────────────────────────────────────────────────────────
171
+ describe("queries", () => {
172
+ let harness;
173
+ afterEach(async () => {
174
+ if (harness)
175
+ await harness.cleanup();
176
+ });
177
+ it("getFileByPath returns file for existing path", async () => {
178
+ harness = await createTestDB();
179
+ const file = createTestFile({ path: join(harness.productDir, "personas/dev.md") });
180
+ upsertFile(harness.db, file);
181
+ const result = getFileByPath(harness.db, file.path);
182
+ expect(result).not.toBeNull();
183
+ expect(result.path).toBe(file.path);
184
+ });
185
+ it("getFileByPath returns null for non-existent path", async () => {
186
+ harness = await createTestDB();
187
+ const result = getFileByPath(harness.db, "/does/not/exist.md");
188
+ expect(result).toBeNull();
189
+ });
190
+ it("getFileById returns file matching (type, id)", async () => {
191
+ harness = await createTestDB();
192
+ const file = createTestFile({
193
+ id: "dev-dan",
194
+ type: "persona",
195
+ path: join(harness.productDir, "personas/dev-dan.md"),
196
+ });
197
+ upsertFile(harness.db, file);
198
+ const result = getFileById(harness.db, "persona", "dev-dan");
199
+ expect(result).not.toBeNull();
200
+ expect(result.id).toBe("dev-dan");
201
+ expect(result.type).toBe("persona");
202
+ });
203
+ it("getFileById returns null for non-existent id", async () => {
204
+ harness = await createTestDB();
205
+ const result = getFileById(harness.db, "persona", "does-not-exist");
206
+ expect(result).toBeNull();
207
+ });
208
+ it("getProductFile returns product file", async () => {
209
+ harness = await createTestDB();
210
+ const product = createTestFile({
211
+ id: "acme",
212
+ type: "product",
213
+ path: join(harness.productDir, "product.md"),
214
+ title: "Acme Widget",
215
+ });
216
+ upsertFile(harness.db, product);
217
+ const result = getProductFile(harness.db);
218
+ expect(result).not.toBeNull();
219
+ expect(result.type).toBe("product");
220
+ expect(result.title).toBe("Acme Widget");
221
+ });
222
+ it("getProductFile returns null on empty DB", async () => {
223
+ harness = await createTestDB();
224
+ expect(getProductFile(harness.db)).toBeNull();
225
+ });
226
+ it("listByType returns all files of type sorted by id", async () => {
227
+ harness = await createTestDB();
228
+ const files = ["charlie", "alice", "bob"].map((name) => createTestFile({
229
+ id: name,
230
+ path: join(harness.productDir, `personas/${name}.md`),
231
+ }));
232
+ for (const f of files)
233
+ upsertFile(harness.db, f);
234
+ const result = listByType(harness.db, "persona");
235
+ expect(result).toHaveLength(3);
236
+ expect(result.map((r) => r.id)).toEqual(["alice", "bob", "charlie"]);
237
+ });
238
+ it("listByType returns empty array for type with no files", async () => {
239
+ harness = await createTestDB();
240
+ const result = listByType(harness.db, "journey");
241
+ expect(result).toEqual([]);
242
+ });
243
+ it("getCritical returns only critical files", async () => {
244
+ harness = await createTestDB();
245
+ const critical = createTestFile({
246
+ id: "important",
247
+ type: "domain",
248
+ path: join(harness.productDir, "domain/important.md"),
249
+ critical: true,
250
+ });
251
+ const normal = createTestFile({
252
+ id: "normal",
253
+ type: "domain",
254
+ path: join(harness.productDir, "domain/normal.md"),
255
+ critical: false,
256
+ });
257
+ upsertFile(harness.db, critical);
258
+ upsertFile(harness.db, normal);
259
+ const result = getCritical(harness.db);
260
+ expect(result).toHaveLength(1);
261
+ expect(result[0].id).toBe("important");
262
+ expect(result[0].critical).toBe(true);
263
+ });
264
+ it("getCritical returns empty on no critical files", async () => {
265
+ harness = await createTestDB();
266
+ const file = createTestFile({
267
+ id: "normal",
268
+ type: "domain",
269
+ path: join(harness.productDir, "domain/normal.md"),
270
+ critical: false,
271
+ });
272
+ upsertFile(harness.db, file);
273
+ expect(getCritical(harness.db)).toEqual([]);
274
+ });
275
+ it("getAllWithEmbeddings returns only files with embeddings", async () => {
276
+ harness = await createTestDB();
277
+ const withEmb = createTestFile({
278
+ id: "with-emb",
279
+ path: join(harness.productDir, "personas/with-emb.md"),
280
+ embedding: Array.from({ length: 384 }, () => 0.5),
281
+ });
282
+ const withoutEmb = createTestFile({
283
+ id: "without-emb",
284
+ path: join(harness.productDir, "personas/without-emb.md"),
285
+ embedding: [],
286
+ });
287
+ upsertFile(harness.db, withEmb);
288
+ upsertFile(harness.db, withoutEmb);
289
+ const result = getAllWithEmbeddings(harness.db);
290
+ expect(result).toHaveLength(1);
291
+ expect(result[0].id).toBe("with-emb");
292
+ });
293
+ it("getAllWithoutEmbeddings returns only files without embeddings", async () => {
294
+ harness = await createTestDB();
295
+ const withEmb = createTestFile({
296
+ id: "with-emb",
297
+ path: join(harness.productDir, "personas/with-emb.md"),
298
+ embedding: Array.from({ length: 384 }, () => 0.5),
299
+ });
300
+ const withoutEmb = createTestFile({
301
+ id: "without-emb",
302
+ path: join(harness.productDir, "personas/without-emb.md"),
303
+ embedding: [],
304
+ });
305
+ upsertFile(harness.db, withEmb);
306
+ upsertFile(harness.db, withoutEmb);
307
+ const result = getAllWithoutEmbeddings(harness.db);
308
+ expect(result).toHaveLength(1);
309
+ expect(result[0].id).toBe("without-emb");
310
+ });
311
+ });
312
+ // ─── embedding cache ─────────────────────────────────────────────────────────
313
+ describe("embedding cache", () => {
314
+ let harness;
315
+ afterEach(async () => {
316
+ if (harness)
317
+ await harness.cleanup();
318
+ });
319
+ it("getAllWithEmbeddings caches results", async () => {
320
+ harness = await createTestDB();
321
+ const file = createTestFile({
322
+ id: "cached",
323
+ path: join(harness.productDir, "personas/cached.md"),
324
+ embedding: Array.from({ length: 384 }, () => 0.5),
325
+ });
326
+ upsertFile(harness.db, file);
327
+ const first = getAllWithEmbeddings(harness.db);
328
+ const second = getAllWithEmbeddings(harness.db);
329
+ // Cache returns the same array reference
330
+ expect(first).toBe(second);
331
+ });
332
+ it("cache invalidated after upsertFile", async () => {
333
+ harness = await createTestDB();
334
+ const file = createTestFile({
335
+ id: "cached",
336
+ path: join(harness.productDir, "personas/cached.md"),
337
+ embedding: Array.from({ length: 384 }, () => 0.5),
338
+ });
339
+ upsertFile(harness.db, file);
340
+ const first = getAllWithEmbeddings(harness.db);
341
+ // Upsert a new file to invalidate cache
342
+ const file2 = createTestFile({
343
+ id: "new-file",
344
+ path: join(harness.productDir, "personas/new-file.md"),
345
+ embedding: Array.from({ length: 384 }, () => 0.1),
346
+ });
347
+ upsertFile(harness.db, file2);
348
+ const second = getAllWithEmbeddings(harness.db);
349
+ // Should be a different reference because cache was invalidated
350
+ expect(first).not.toBe(second);
351
+ expect(second).toHaveLength(2);
352
+ });
353
+ it("cache invalidated after deleteFile", async () => {
354
+ harness = await createTestDB();
355
+ const file = createTestFile({
356
+ id: "to-delete",
357
+ path: join(harness.productDir, "personas/to-delete.md"),
358
+ embedding: Array.from({ length: 384 }, () => 0.5),
359
+ });
360
+ upsertFile(harness.db, file);
361
+ const first = getAllWithEmbeddings(harness.db);
362
+ expect(first).toHaveLength(1);
363
+ deleteFile(harness.db, file.path);
364
+ const second = getAllWithEmbeddings(harness.db);
365
+ expect(first).not.toBe(second);
366
+ expect(second).toHaveLength(0);
367
+ });
368
+ });
369
+ // ─── keywordSearch ───────────────────────────────────────────────────────────
370
+ describe("keywordSearch", () => {
371
+ let harness;
372
+ afterEach(async () => {
373
+ if (harness)
374
+ await harness.cleanup();
375
+ });
376
+ it("returns matching documents", async () => {
377
+ harness = await createTestDB();
378
+ const file = createTestFile({
379
+ id: "searchable",
380
+ path: join(harness.productDir, "personas/searchable.md"),
381
+ title: "Semantic Search Expert",
382
+ body: "This persona specializes in building vector search engines.",
383
+ });
384
+ upsertFile(harness.db, file);
385
+ const results = keywordSearch(harness.db, "vector search");
386
+ expect(results.length).toBeGreaterThan(0);
387
+ expect(results[0].id).toBe("searchable");
388
+ });
389
+ it("respects limit parameter", async () => {
390
+ harness = await createTestDB();
391
+ for (let i = 0; i < 5; i++) {
392
+ const file = createTestFile({
393
+ id: `file-${i}`,
394
+ path: join(harness.productDir, `personas/file-${i}.md`),
395
+ title: `Widget maker ${i}`,
396
+ body: `This persona makes widgets in factory ${i}.`,
397
+ });
398
+ upsertFile(harness.db, file);
399
+ }
400
+ const results = keywordSearch(harness.db, "widget", 2);
401
+ expect(results).toHaveLength(2);
402
+ });
403
+ it("returns empty for empty query", async () => {
404
+ harness = await createTestDB();
405
+ const file = createTestFile({
406
+ path: join(harness.productDir, "personas/dev.md"),
407
+ });
408
+ upsertFile(harness.db, file);
409
+ const results = keywordSearch(harness.db, "");
410
+ expect(results).toEqual([]);
411
+ });
412
+ it("handles special FTS5 characters without throwing", async () => {
413
+ harness = await createTestDB();
414
+ const file = createTestFile({
415
+ path: join(harness.productDir, "personas/dev.md"),
416
+ });
417
+ upsertFile(harness.db, file);
418
+ // These characters are special in FTS5 syntax — should not throw
419
+ expect(() => keywordSearch(harness.db, "hello* world^2")).not.toThrow();
420
+ expect(() => keywordSearch(harness.db, '"unclosed quote')).not.toThrow();
421
+ expect(() => keywordSearch(harness.db, "a'b'c")).not.toThrow();
422
+ });
423
+ });
424
+ // ─── deleteFile ─────────────────────────────────────────────────────────────
425
+ describe("deleteFile", () => {
426
+ let harness;
427
+ afterEach(async () => {
428
+ if (harness)
429
+ await harness.cleanup();
430
+ });
431
+ it("removes file from DB", async () => {
432
+ harness = await createTestDB();
433
+ const file = createTestFile({
434
+ path: join(harness.productDir, "personas/dev.md"),
435
+ });
436
+ upsertFile(harness.db, file);
437
+ expect(getFileByPath(harness.db, file.path)).not.toBeNull();
438
+ deleteFile(harness.db, file.path);
439
+ expect(getFileByPath(harness.db, file.path)).toBeNull();
440
+ });
441
+ it("FTS no longer matches deleted file", async () => {
442
+ harness = await createTestDB();
443
+ const file = createTestFile({
444
+ id: "deleteme",
445
+ path: join(harness.productDir, "personas/deleteme.md"),
446
+ title: "Unique unicorn title",
447
+ body: "Completely unique zebra content for search verification.",
448
+ });
449
+ upsertFile(harness.db, file);
450
+ // Verify it is searchable before deletion
451
+ const before = keywordSearch(harness.db, "unicorn");
452
+ expect(before.length).toBeGreaterThan(0);
453
+ deleteFile(harness.db, file.path);
454
+ // Should no longer appear in search results
455
+ const after = keywordSearch(harness.db, "unicorn");
456
+ expect(after).toHaveLength(0);
457
+ });
458
+ });
459
+ //# sourceMappingURL=db.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../tests/db.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=embeddings.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.test.d.ts","sourceRoot":"","sources":["../../tests/embeddings.test.ts"],"names":[],"mappings":""}