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,378 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { validateFrontmatter, deriveTitle, } from "../src/schemas.js";
3
+ // ─── Minimal valid frontmatter fixtures ─────────────────────────────────────
4
+ function validProduct(overrides = {}) {
5
+ return {
6
+ name: "Acme Widget",
7
+ tagline: "Widgets for everyone",
8
+ problem: "No good widgets exist",
9
+ solution: "Build great widgets",
10
+ primary_persona: "dev-dan",
11
+ tech_stack: ["TypeScript", "Node.js"],
12
+ stage: "prototype",
13
+ ...overrides,
14
+ };
15
+ }
16
+ function validPersona(overrides = {}) {
17
+ return {
18
+ id: "dev-dan",
19
+ name: "Developer Dan",
20
+ role: "Full-stack developer",
21
+ primary_goal: "Ship features fast",
22
+ jobs_to_be_done: ["Write code", "Review PRs"],
23
+ ...overrides,
24
+ };
25
+ }
26
+ function validJourney(overrides = {}) {
27
+ return {
28
+ id: "onboarding",
29
+ name: "First-time onboarding",
30
+ persona: "dev-dan",
31
+ trigger: "Signs up for the first time",
32
+ success_state: "Completes onboarding wizard",
33
+ failure_modes: ["Abandons at step 2"],
34
+ steps: ["sign-up", "configure", "deploy"],
35
+ ...overrides,
36
+ };
37
+ }
38
+ function validSpec(overrides = {}) {
39
+ return {
40
+ id: "spec-001",
41
+ title: "Widget creation flow",
42
+ persona: "dev-dan",
43
+ journey: "onboarding",
44
+ status: "draft",
45
+ acceptance_criteria: ["User can create widget"],
46
+ out_of_scope: ["Admin panel"],
47
+ ...overrides,
48
+ };
49
+ }
50
+ function validDecision(overrides = {}) {
51
+ return {
52
+ id: "adr-001",
53
+ title: "Use SQLite for local storage",
54
+ status: "accepted",
55
+ date: "2026-01-15",
56
+ context: "Need local persistence without external DB",
57
+ decision: "Use better-sqlite3 with WAL mode",
58
+ consequences: ["Fast reads", "Single-writer limitation"],
59
+ alternatives_rejected: ["PostgreSQL", "LevelDB"],
60
+ ...overrides,
61
+ };
62
+ }
63
+ function validDomain(overrides = {}) {
64
+ return {
65
+ id: "naming-conventions",
66
+ critical: false,
67
+ title: "Naming conventions",
68
+ ...overrides,
69
+ };
70
+ }
71
+ // ─── validateFrontmatter ────────────────────────────────────────────────────
72
+ describe("validateFrontmatter", () => {
73
+ describe("ProductSchema", () => {
74
+ it("accepts valid product with all required fields", () => {
75
+ const result = validateFrontmatter("product", validProduct());
76
+ expect(result.success).toBe(true);
77
+ if (result.success) {
78
+ expect(result.data.name).toBe("Acme Widget");
79
+ expect(result.data.stage).toBe("prototype");
80
+ }
81
+ });
82
+ it("rejects missing name field", () => {
83
+ const { name, ...rest } = validProduct();
84
+ const result = validateFrontmatter("product", rest);
85
+ expect(result.success).toBe(false);
86
+ if (!result.success) {
87
+ expect(result.error).toContain("name");
88
+ }
89
+ });
90
+ it("rejects invalid stage enum", () => {
91
+ const result = validateFrontmatter("product", validProduct({ stage: "beta" }));
92
+ expect(result.success).toBe(false);
93
+ if (!result.success) {
94
+ expect(result.error).toContain("stage");
95
+ }
96
+ });
97
+ it("defaults tech_stack to empty array when missing", () => {
98
+ const { tech_stack, ...rest } = validProduct();
99
+ const result = validateFrontmatter("product", rest);
100
+ expect(result.success).toBe(true);
101
+ if (result.success) {
102
+ expect(result.data.tech_stack).toEqual([]);
103
+ }
104
+ });
105
+ it("accepts optional repo and url fields", () => {
106
+ const result = validateFrontmatter("product", validProduct({ repo: "https://github.com/example/repo", url: "https://example.com" }));
107
+ expect(result.success).toBe(true);
108
+ if (result.success) {
109
+ expect(result.data.repo).toBe("https://github.com/example/repo");
110
+ expect(result.data.url).toBe("https://example.com");
111
+ }
112
+ });
113
+ });
114
+ describe("PersonaSchema", () => {
115
+ it("accepts valid persona with required fields", () => {
116
+ const result = validateFrontmatter("persona", validPersona());
117
+ expect(result.success).toBe(true);
118
+ if (result.success) {
119
+ expect(result.data.id).toBe("dev-dan");
120
+ expect(result.data.name).toBe("Developer Dan");
121
+ }
122
+ });
123
+ it("rejects missing id", () => {
124
+ const { id, ...rest } = validPersona();
125
+ const result = validateFrontmatter("persona", rest);
126
+ expect(result.success).toBe(false);
127
+ if (!result.success) {
128
+ expect(result.error).toContain("id");
129
+ }
130
+ });
131
+ it("rejects missing primary_goal", () => {
132
+ const { primary_goal, ...rest } = validPersona();
133
+ const result = validateFrontmatter("persona", rest);
134
+ expect(result.success).toBe(false);
135
+ if (!result.success) {
136
+ expect(result.error).toContain("primary_goal");
137
+ }
138
+ });
139
+ it("defaults jobs_to_be_done to empty array", () => {
140
+ const { jobs_to_be_done, ...rest } = validPersona();
141
+ const result = validateFrontmatter("persona", rest);
142
+ expect(result.success).toBe(true);
143
+ if (result.success) {
144
+ expect(result.data.jobs_to_be_done).toEqual([]);
145
+ }
146
+ });
147
+ it("accepts optional tech_level with valid enum", () => {
148
+ const result = validateFrontmatter("persona", validPersona({ tech_level: "high" }));
149
+ expect(result.success).toBe(true);
150
+ if (result.success) {
151
+ expect(result.data.tech_level).toBe("high");
152
+ }
153
+ });
154
+ it("rejects invalid tech_level enum", () => {
155
+ const result = validateFrontmatter("persona", validPersona({ tech_level: "expert" }));
156
+ expect(result.success).toBe(false);
157
+ if (!result.success) {
158
+ expect(result.error).toContain("tech_level");
159
+ }
160
+ });
161
+ });
162
+ describe("JourneySchema", () => {
163
+ it("accepts valid journey", () => {
164
+ const result = validateFrontmatter("journey", validJourney());
165
+ expect(result.success).toBe(true);
166
+ if (result.success) {
167
+ expect(result.data.id).toBe("onboarding");
168
+ expect(result.data.persona).toBe("dev-dan");
169
+ }
170
+ });
171
+ it("rejects missing persona field", () => {
172
+ const { persona, ...rest } = validJourney();
173
+ const result = validateFrontmatter("journey", rest);
174
+ expect(result.success).toBe(false);
175
+ if (!result.success) {
176
+ expect(result.error).toContain("persona");
177
+ }
178
+ });
179
+ it("rejects missing trigger", () => {
180
+ const { trigger, ...rest } = validJourney();
181
+ const result = validateFrontmatter("journey", rest);
182
+ expect(result.success).toBe(false);
183
+ if (!result.success) {
184
+ expect(result.error).toContain("trigger");
185
+ }
186
+ });
187
+ it("defaults failure_modes to empty array", () => {
188
+ const { failure_modes, ...rest } = validJourney();
189
+ const result = validateFrontmatter("journey", rest);
190
+ expect(result.success).toBe(true);
191
+ if (result.success) {
192
+ expect(result.data.failure_modes).toEqual([]);
193
+ }
194
+ });
195
+ it("accepts steps as array of strings", () => {
196
+ const result = validateFrontmatter("journey", validJourney());
197
+ expect(result.success).toBe(true);
198
+ if (result.success) {
199
+ expect(result.data.steps).toEqual(["sign-up", "configure", "deploy"]);
200
+ }
201
+ });
202
+ });
203
+ describe("SpecSchema", () => {
204
+ it("accepts valid spec", () => {
205
+ const result = validateFrontmatter("spec", validSpec());
206
+ expect(result.success).toBe(true);
207
+ if (result.success) {
208
+ expect(result.data.title).toBe("Widget creation flow");
209
+ expect(result.data.status).toBe("draft");
210
+ }
211
+ });
212
+ it("rejects missing title", () => {
213
+ const { title, ...rest } = validSpec();
214
+ const result = validateFrontmatter("spec", rest);
215
+ expect(result.success).toBe(false);
216
+ if (!result.success) {
217
+ expect(result.error).toContain("title");
218
+ }
219
+ });
220
+ it("validates status enum", () => {
221
+ for (const status of ["draft", "approved", "in-progress", "done", "deprecated"]) {
222
+ const result = validateFrontmatter("spec", validSpec({ status }));
223
+ expect(result.success).toBe(true);
224
+ }
225
+ });
226
+ it("rejects invalid status", () => {
227
+ const result = validateFrontmatter("spec", validSpec({ status: "cancelled" }));
228
+ expect(result.success).toBe(false);
229
+ if (!result.success) {
230
+ expect(result.error).toContain("status");
231
+ }
232
+ });
233
+ it("defaults acceptance_criteria to empty array", () => {
234
+ const { acceptance_criteria, ...rest } = validSpec();
235
+ const result = validateFrontmatter("spec", rest);
236
+ expect(result.success).toBe(true);
237
+ if (result.success) {
238
+ expect(result.data.acceptance_criteria).toEqual([]);
239
+ }
240
+ });
241
+ });
242
+ describe("DecisionSchema", () => {
243
+ it("accepts valid decision", () => {
244
+ const result = validateFrontmatter("decision", validDecision());
245
+ expect(result.success).toBe(true);
246
+ if (result.success) {
247
+ expect(result.data.title).toBe("Use SQLite for local storage");
248
+ expect(result.data.date).toBe("2026-01-15");
249
+ }
250
+ });
251
+ it("rejects missing date", () => {
252
+ const { date, ...rest } = validDecision();
253
+ const result = validateFrontmatter("decision", rest);
254
+ expect(result.success).toBe(false);
255
+ if (!result.success) {
256
+ expect(result.error).toContain("date");
257
+ }
258
+ });
259
+ it("rejects missing context", () => {
260
+ const { context, ...rest } = validDecision();
261
+ const result = validateFrontmatter("decision", rest);
262
+ expect(result.success).toBe(false);
263
+ if (!result.success) {
264
+ expect(result.error).toContain("context");
265
+ }
266
+ });
267
+ it("rejects missing decision field", () => {
268
+ const { decision, ...rest } = validDecision();
269
+ const result = validateFrontmatter("decision", rest);
270
+ expect(result.success).toBe(false);
271
+ if (!result.success) {
272
+ expect(result.error).toContain("decision");
273
+ }
274
+ });
275
+ it("defaults consequences to empty array", () => {
276
+ const { consequences, ...rest } = validDecision();
277
+ const result = validateFrontmatter("decision", rest);
278
+ expect(result.success).toBe(true);
279
+ if (result.success) {
280
+ expect(result.data.consequences).toEqual([]);
281
+ }
282
+ });
283
+ });
284
+ describe("DomainSchema", () => {
285
+ it("accepts valid domain", () => {
286
+ const result = validateFrontmatter("domain", validDomain());
287
+ expect(result.success).toBe(true);
288
+ if (result.success) {
289
+ expect(result.data.id).toBe("naming-conventions");
290
+ }
291
+ });
292
+ it("defaults critical to false", () => {
293
+ const { critical, ...rest } = validDomain();
294
+ const result = validateFrontmatter("domain", rest);
295
+ expect(result.success).toBe(true);
296
+ if (result.success) {
297
+ expect(result.data.critical).toBe(false);
298
+ }
299
+ });
300
+ it("accepts critical: true", () => {
301
+ const result = validateFrontmatter("domain", validDomain({ critical: true }));
302
+ expect(result.success).toBe(true);
303
+ if (result.success) {
304
+ expect(result.data.critical).toBe(true);
305
+ }
306
+ });
307
+ it("accepts optional title", () => {
308
+ const { title, ...rest } = validDomain();
309
+ const result = validateFrontmatter("domain", rest);
310
+ expect(result.success).toBe(true);
311
+ if (result.success) {
312
+ expect(result.data.title).toBeUndefined();
313
+ }
314
+ });
315
+ });
316
+ describe("error format", () => {
317
+ it("error string includes field path", () => {
318
+ const result = validateFrontmatter("product", {});
319
+ expect(result.success).toBe(false);
320
+ if (!result.success) {
321
+ expect(result.error).toContain("name");
322
+ }
323
+ });
324
+ it("error string includes validation message", () => {
325
+ const result = validateFrontmatter("product", {});
326
+ expect(result.success).toBe(false);
327
+ if (!result.success) {
328
+ // Zod messages like "Required" appear after the field path
329
+ expect(result.error).toMatch(/:\s*.+/);
330
+ }
331
+ });
332
+ it("multiple errors are joined with semicolon", () => {
333
+ // Missing all required fields should produce multiple errors joined by "; "
334
+ const result = validateFrontmatter("product", {});
335
+ expect(result.success).toBe(false);
336
+ if (!result.success) {
337
+ expect(result.error).toContain("; ");
338
+ }
339
+ });
340
+ });
341
+ });
342
+ // ─── deriveTitle ─────────────────────────────────────────────────────────────
343
+ describe("deriveTitle", () => {
344
+ it("returns fm.name for product type", () => {
345
+ expect(deriveTitle("product", { name: "Acme Widget" })).toBe("Acme Widget");
346
+ });
347
+ it("returns 'Untitled product' when product has no name", () => {
348
+ expect(deriveTitle("product", {})).toBe("Untitled product");
349
+ });
350
+ it("returns fm.name for persona", () => {
351
+ expect(deriveTitle("persona", { name: "Dev Dan", id: "dev-dan" })).toBe("Dev Dan");
352
+ });
353
+ it("falls back to fm.id when persona has no name", () => {
354
+ expect(deriveTitle("persona", { id: "dev-dan" })).toBe("dev-dan");
355
+ });
356
+ it("returns 'Unnamed persona' when no name or id", () => {
357
+ expect(deriveTitle("persona", {})).toBe("Unnamed persona");
358
+ });
359
+ it("returns fm.title for spec", () => {
360
+ expect(deriveTitle("spec", { title: "Widget spec" })).toBe("Widget spec");
361
+ });
362
+ it("returns fm.title for decision", () => {
363
+ expect(deriveTitle("decision", { title: "Use SQLite" })).toBe("Use SQLite");
364
+ });
365
+ it("returns fm.title for domain", () => {
366
+ expect(deriveTitle("domain", { title: "Naming rules" })).toBe("Naming rules");
367
+ });
368
+ it("falls back to fm.id for domain without title", () => {
369
+ expect(deriveTitle("domain", { id: "naming-conventions" })).toBe("naming-conventions");
370
+ });
371
+ it("returns 'Domain rules' when domain has no title or id", () => {
372
+ expect(deriveTitle("domain", {})).toBe("Domain rules");
373
+ });
374
+ it("returns 'Unknown' for unrecognized type", () => {
375
+ expect(deriveTitle("widget", {})).toBe("Unknown");
376
+ });
377
+ });
378
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../tests/schemas.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../tests/search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
2
+ import { createTestDB } from "./helpers/test-harness.js";
3
+ import { fullIndex } from "../src/indexer.js";
4
+ import { search, findRelated } from "../src/search.js";
5
+ let harness;
6
+ beforeAll(async () => {
7
+ harness = await createTestDB({ copyCorpus: true });
8
+ await fullIndex(harness.db, harness.productDir);
9
+ }, 120_000);
10
+ afterAll(async () => {
11
+ await harness?.cleanup();
12
+ });
13
+ // ─── search ────────────────────────────────────────────────────────────────────
14
+ describe("search", () => {
15
+ describe("hybrid mode", () => {
16
+ it("returns results for a valid query", async () => {
17
+ const results = await search(harness.db, "project management");
18
+ expect(results.length).toBeGreaterThan(0);
19
+ });
20
+ it("scores are in [0, 1] range", async () => {
21
+ const results = await search(harness.db, "project management");
22
+ for (const r of results) {
23
+ expect(r.score).toBeGreaterThanOrEqual(0);
24
+ expect(r.score).toBeLessThanOrEqual(1);
25
+ }
26
+ });
27
+ it("top result has score 1.0 (normalized)", async () => {
28
+ const results = await search(harness.db, "project management");
29
+ expect(results.length).toBeGreaterThan(0);
30
+ expect(results[0].score).toBe(1.0);
31
+ });
32
+ it("results are sorted by score descending", async () => {
33
+ const results = await search(harness.db, "project management");
34
+ for (let i = 1; i < results.length; i++) {
35
+ expect(results[i].score).toBeLessThanOrEqual(results[i - 1].score);
36
+ }
37
+ });
38
+ it("respects topK parameter", async () => {
39
+ // topK limits core results; cross-reference resolution may add extras
40
+ const results = await search(harness.db, "project management", { topK: 2 });
41
+ // Should return at least 1 result and not explode
42
+ expect(results.length).toBeGreaterThanOrEqual(1);
43
+ expect(results.length).toBeLessThanOrEqual(10); // reasonable upper bound
44
+ });
45
+ });
46
+ describe("keyword mode", () => {
47
+ it("returns results matching exact terms", async () => {
48
+ const results = await search(harness.db, "billing", { mode: "keyword" });
49
+ expect(results.length).toBeGreaterThan(0);
50
+ // At least one result should be the billing-rules domain file
51
+ const hasBilling = results.some(r => r.id === "billing-rules");
52
+ expect(hasBilling).toBe(true);
53
+ });
54
+ it("returns empty for query with no keyword matches", async () => {
55
+ const results = await search(harness.db, "xyzzyplughnotaword", { mode: "keyword" });
56
+ expect(results).toHaveLength(0);
57
+ });
58
+ });
59
+ describe("semantic mode", () => {
60
+ it("returns conceptually similar results", async () => {
61
+ const results = await search(harness.db, "user experience and onboarding", { mode: "semantic" });
62
+ expect(results.length).toBeGreaterThan(0);
63
+ });
64
+ it("finds related content even without exact keyword match", async () => {
65
+ // "payment processing rules" should find billing-rules even though
66
+ // the query terms differ from the exact title
67
+ const results = await search(harness.db, "payment processing rules", { mode: "semantic" });
68
+ expect(results.length).toBeGreaterThan(0);
69
+ });
70
+ });
71
+ describe("type filtering", () => {
72
+ it("returns only files of specified types (plus cross-refs)", async () => {
73
+ const results = await search(harness.db, "project", { types: ["persona"] });
74
+ // Core results are filtered to the requested type
75
+ // Cross-reference resolution may add related docs of other types
76
+ const personaResults = results.filter(r => r.type === "persona");
77
+ expect(personaResults.length).toBeGreaterThan(0);
78
+ });
79
+ it("empty types array returns all types", async () => {
80
+ const results = await search(harness.db, "project", { types: [] });
81
+ const types = new Set(results.map(r => r.type));
82
+ expect(types.size).toBeGreaterThan(1);
83
+ });
84
+ it("non-existent type returns empty results", async () => {
85
+ const results = await search(harness.db, "project", { types: ["nonexistent"] });
86
+ expect(results).toHaveLength(0);
87
+ });
88
+ });
89
+ describe("edge cases", () => {
90
+ it("empty query returns empty results for keyword mode", async () => {
91
+ const results = await search(harness.db, "", { mode: "keyword" });
92
+ expect(results).toHaveLength(0);
93
+ });
94
+ it("returns results even with special characters in query", async () => {
95
+ const results = await search(harness.db, "project's \"management\" & billing*", { mode: "hybrid" });
96
+ // Should not throw and should return some results or empty gracefully
97
+ expect(Array.isArray(results)).toBe(true);
98
+ });
99
+ });
100
+ });
101
+ // ─── findRelated ───────────────────────────────────────────────────────────────
102
+ describe("findRelated", () => {
103
+ it("returns related documents", async () => {
104
+ const results = await findRelated(harness.db, "sarah-pm");
105
+ expect(results.length).toBeGreaterThan(0);
106
+ });
107
+ it("excludes the source document from results", async () => {
108
+ const results = await findRelated(harness.db, "sarah-pm");
109
+ const ids = results.map(r => r.id);
110
+ expect(ids).not.toContain("sarah-pm");
111
+ });
112
+ it("returns empty for non-existent source ID", async () => {
113
+ const results = await findRelated(harness.db, "does-not-exist-at-all");
114
+ expect(results).toHaveLength(0);
115
+ });
116
+ it("respects topK parameter", async () => {
117
+ const results = await findRelated(harness.db, "sarah-pm", 2);
118
+ expect(results.length).toBeLessThanOrEqual(2);
119
+ });
120
+ it("scores represent similarity values", async () => {
121
+ const results = await findRelated(harness.db, "sarah-pm");
122
+ for (const r of results) {
123
+ expect(typeof r.score).toBe("number");
124
+ expect(r.score).toBeGreaterThanOrEqual(0);
125
+ expect(r.score).toBeLessThanOrEqual(1);
126
+ }
127
+ });
128
+ });
129
+ //# sourceMappingURL=search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../tests/search.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,YAAY,EAAoB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAmB,MAAM,kBAAkB,CAAC;AAExE,IAAI,OAAoB,CAAC;AAEzB,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,GAAG,MAAM,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;AAClD,CAAC,EAAE,OAAO,CAAC,CAAC;AAEZ,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,OAAO,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;gBAC1C,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC/D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;YAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,sEAAsE;YACtE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5E,kDAAkD;YAClD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACzE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,8DAA8D;YAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC;YAC/D,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,gCAAgC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACjG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,mEAAmE;YACnE,8CAA8C;YAC9C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,0BAA0B,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YAC3F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC5E,kDAAkD;YAClD,iEAAiE;YACjE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YACjE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YACnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAChF,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,qCAAqC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpG,sEAAsE;YACtE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kFAAkF;AAElF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../tests/tools.test.ts"],"names":[],"mappings":""}