ralph-hero-knowledge-index 0.1.38 → 0.1.39

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 (40) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.mcp.json +1 -1
  3. package/coverage/coverage-summary.json +3 -3
  4. package/coverage/lcov-report/chunker.ts.html +1 -1
  5. package/coverage/lcov-report/config.ts.html +1 -1
  6. package/coverage/lcov-report/db.ts.html +129 -24
  7. package/coverage/lcov-report/embedder.ts.html +1 -1
  8. package/coverage/lcov-report/file-scanner.ts.html +1 -1
  9. package/coverage/lcov-report/format.ts.html +1 -1
  10. package/coverage/lcov-report/generate-indexes.ts.html +1 -1
  11. package/coverage/lcov-report/graph-builder.ts.html +1 -1
  12. package/coverage/lcov-report/graph-tools.ts.html +1 -1
  13. package/coverage/lcov-report/hybrid-search.ts.html +1 -1
  14. package/coverage/lcov-report/ignore.ts.html +1 -1
  15. package/coverage/lcov-report/index.html +16 -16
  16. package/coverage/lcov-report/index.ts.html +17 -11
  17. package/coverage/lcov-report/llm-client.ts.html +1 -1
  18. package/coverage/lcov-report/parser.ts.html +33 -33
  19. package/coverage/lcov-report/reindex.ts.html +1 -1
  20. package/coverage/lcov-report/reranker.ts.html +1 -1
  21. package/coverage/lcov-report/search.ts.html +2 -2
  22. package/coverage/lcov-report/traverse.ts.html +1 -1
  23. package/coverage/lcov-report/vector-search.ts.html +1 -1
  24. package/coverage/lcov.info +340 -330
  25. package/dist/db.js +38 -3
  26. package/dist/db.js.map +1 -1
  27. package/dist/index.js +7 -5
  28. package/dist/index.js.map +1 -1
  29. package/dist/parser.js +5 -5
  30. package/dist/parser.js.map +1 -1
  31. package/dist/search.d.ts +1 -1
  32. package/package.json +1 -1
  33. package/skills/curate/SKILL.md +275 -0
  34. package/src/__tests__/db.test.ts +70 -0
  35. package/src/__tests__/memory-stats.test.ts +9 -9
  36. package/src/__tests__/parser.test.ts +6 -0
  37. package/src/db.ts +38 -3
  38. package/src/index.ts +9 -7
  39. package/src/parser.ts +5 -5
  40. package/src/search.ts +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ralph-knowledge",
3
- "version": "0.1.38",
3
+ "version": "0.1.39",
4
4
  "description": "Knowledge graph for ralph-hero: semantic search, relationship traversal, and document indexing across thoughts/ documents. Optional companion to ralph-hero.",
5
5
  "author": {
6
6
  "name": "Chad Dubiel",
package/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "ralph-knowledge": {
4
4
  "command": "npx",
5
- "args": ["-y", "ralph-hero-knowledge-index@0.1.38"]
5
+ "args": ["-y", "ralph-hero-knowledge-index@0.1.39"]
6
6
  }
7
7
  }
8
8
  }
@@ -1,7 +1,7 @@
1
- {"total": {"lines":{"total":1303,"covered":1214,"skipped":0,"pct":93.16},"statements":{"total":1424,"covered":1313,"skipped":0,"pct":92.2},"functions":{"total":200,"covered":186,"skipped":0,"pct":93},"branches":{"total":836,"covered":694,"skipped":0,"pct":83.01},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
1
+ {"total": {"lines":{"total":1307,"covered":1218,"skipped":0,"pct":93.19},"statements":{"total":1428,"covered":1317,"skipped":0,"pct":92.22},"functions":{"total":200,"covered":186,"skipped":0,"pct":93},"branches":{"total":842,"covered":698,"skipped":0,"pct":82.89},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":"Unknown"}}
2
2
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/chunker.ts": {"lines":{"total":91,"covered":85,"skipped":0,"pct":93.4},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":94,"covered":88,"skipped":0,"pct":93.61},"branches":{"total":45,"covered":39,"skipped":0,"pct":86.66}}
3
3
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/config.ts": {"lines":{"total":34,"covered":32,"skipped":0,"pct":94.11},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":36,"covered":34,"skipped":0,"pct":94.44},"branches":{"total":31,"covered":31,"skipped":0,"pct":100}}
4
- ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/db.ts": {"lines":{"total":115,"covered":113,"skipped":0,"pct":98.26},"functions":{"total":31,"covered":31,"skipped":0,"pct":100},"statements":{"total":121,"covered":118,"skipped":0,"pct":97.52},"branches":{"total":74,"covered":64,"skipped":0,"pct":86.48}}
4
+ ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/db.ts": {"lines":{"total":119,"covered":117,"skipped":0,"pct":98.31},"functions":{"total":31,"covered":31,"skipped":0,"pct":100},"statements":{"total":125,"covered":122,"skipped":0,"pct":97.6},"branches":{"total":78,"covered":68,"skipped":0,"pct":87.17}}
5
5
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/embedder.ts": {"lines":{"total":32,"covered":32,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":35,"covered":35,"skipped":0,"pct":100},"branches":{"total":24,"covered":22,"skipped":0,"pct":91.66}}
6
6
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/file-scanner.ts": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":21,"covered":21,"skipped":0,"pct":100}}
7
7
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/format.ts": {"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}}
@@ -10,7 +10,7 @@
10
10
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/graph-tools.ts": {"lines":{"total":242,"covered":230,"skipped":0,"pct":95.04},"functions":{"total":34,"covered":32,"skipped":0,"pct":94.11},"statements":{"total":257,"covered":243,"skipped":0,"pct":94.55},"branches":{"total":151,"covered":120,"skipped":0,"pct":79.47}}
11
11
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/hybrid-search.ts": {"lines":{"total":174,"covered":173,"skipped":0,"pct":99.42},"functions":{"total":19,"covered":19,"skipped":0,"pct":100},"statements":{"total":203,"covered":195,"skipped":0,"pct":96.05},"branches":{"total":129,"covered":110,"skipped":0,"pct":85.27}}
12
12
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/ignore.ts": {"lines":{"total":17,"covered":16,"skipped":0,"pct":94.11},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":18,"skipped":0,"pct":94.73},"branches":{"total":12,"covered":11,"skipped":0,"pct":91.66}}
13
- ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/index.ts": {"lines":{"total":112,"covered":91,"skipped":0,"pct":81.25},"functions":{"total":16,"covered":13,"skipped":0,"pct":81.25},"statements":{"total":128,"covered":105,"skipped":0,"pct":82.03},"branches":{"total":81,"covered":57,"skipped":0,"pct":70.37}}
13
+ ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/index.ts": {"lines":{"total":112,"covered":91,"skipped":0,"pct":81.25},"functions":{"total":16,"covered":13,"skipped":0,"pct":81.25},"statements":{"total":128,"covered":105,"skipped":0,"pct":82.03},"branches":{"total":83,"covered":57,"skipped":0,"pct":68.67}}
14
14
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/llm-client.ts": {"lines":{"total":31,"covered":31,"skipped":0,"pct":100},"functions":{"total":6,"covered":5,"skipped":0,"pct":83.33},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":13,"covered":13,"skipped":0,"pct":100}}
15
15
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/parser.ts": {"lines":{"total":49,"covered":49,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":53,"covered":53,"skipped":0,"pct":100},"branches":{"total":46,"covered":41,"skipped":0,"pct":89.13}}
16
16
  ,"/home/runner/work/ralph-hero/ralph-hero/plugin/ralph-knowledge/src/reindex.ts": {"lines":{"total":153,"covered":120,"skipped":0,"pct":78.43},"functions":{"total":11,"covered":5,"skipped":0,"pct":45.45},"statements":{"total":162,"covered":122,"skipped":0,"pct":75.3},"branches":{"total":73,"covered":46,"skipped":0,"pct":63.01}}
@@ -940,7 +940,7 @@ export function chunkText(text: string, opts: ChunkerOptions = {}): Chunk[] {
940
940
  <div class='footer quiet pad2 space-top1 center small'>
941
941
  Code coverage generated by
942
942
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
943
- at 2026-05-08T01:23:45.554Z
943
+ at 2026-05-09T01:59:20.386Z
944
944
  </div>
945
945
  <script src="prettify.js"></script>
946
946
  <script>
@@ -385,7 +385,7 @@ export function loadConfig(): KnowledgeConfig {
385
385
  <div class='footer quiet pad2 space-top1 center small'>
386
386
  Code coverage generated by
387
387
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
388
- at 2026-05-08T01:23:45.554Z
388
+ at 2026-05-09T01:59:20.386Z
389
389
  </div>
390
390
  <script src="prettify.js"></script>
391
391
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">97.52% </span>
26
+ <span class="strong">97.6% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>118/121</span>
28
+ <span class='fraction'>122/125</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">86.48% </span>
33
+ <span class="strong">87.17% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>64/74</span>
35
+ <span class='fraction'>68/78</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">98.26% </span>
47
+ <span class="strong">98.31% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>113/115</span>
49
+ <span class='fraction'>117/119</span>
50
50
  </div>
51
51
 
52
52
 
@@ -575,7 +575,42 @@
575
575
  <a name='L510'></a><a href='#L510'>510</a>
576
576
  <a name='L511'></a><a href='#L511'>511</a>
577
577
  <a name='L512'></a><a href='#L512'>512</a>
578
- <a name='L513'></a><a href='#L513'>513</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
579
614
  <span class="cline-any cline-neutral">&nbsp;</span>
580
615
  <span class="cline-any cline-neutral">&nbsp;</span>
581
616
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -670,14 +705,14 @@
670
705
  <span class="cline-any cline-neutral">&nbsp;</span>
671
706
  <span class="cline-any cline-neutral">&nbsp;</span>
672
707
  <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-yes">353x</span>
674
- <span class="cline-any cline-yes">353x</span>
675
- <span class="cline-any cline-yes">353x</span>
676
- <span class="cline-any cline-yes">353x</span>
708
+ <span class="cline-any cline-yes">356x</span>
709
+ <span class="cline-any cline-yes">356x</span>
710
+ <span class="cline-any cline-yes">356x</span>
711
+ <span class="cline-any cline-yes">356x</span>
677
712
  <span class="cline-any cline-neutral">&nbsp;</span>
678
713
  <span class="cline-any cline-neutral">&nbsp;</span>
679
714
  <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">353x</span>
715
+ <span class="cline-any cline-yes">356x</span>
681
716
  <span class="cline-any cline-neutral">&nbsp;</span>
682
717
  <span class="cline-any cline-neutral">&nbsp;</span>
683
718
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -754,8 +789,8 @@
754
789
  <span class="cline-any cline-neutral">&nbsp;</span>
755
790
  <span class="cline-any cline-neutral">&nbsp;</span>
756
791
  <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-yes">353x</span>
758
- <span class="cline-any cline-yes">353x</span>
792
+ <span class="cline-any cline-yes">356x</span>
793
+ <span class="cline-any cline-yes">356x</span>
759
794
  <span class="cline-any cline-neutral">&nbsp;</span>
760
795
  <span class="cline-any cline-neutral">&nbsp;</span>
761
796
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -763,22 +798,57 @@
763
798
  <span class="cline-any cline-neutral">&nbsp;</span>
764
799
  <span class="cline-any cline-neutral">&nbsp;</span>
765
800
  <span class="cline-any cline-neutral">&nbsp;</span>
766
- <span class="cline-any cline-yes">353x</span>
767
- <span class="cline-any cline-yes">353x</span>
768
801
  <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-yes">356x</span>
803
+ <span class="cline-any cline-yes">356x</span>
769
804
  <span class="cline-any cline-neutral">&nbsp;</span>
770
805
  <span class="cline-any cline-neutral">&nbsp;</span>
771
806
  <span class="cline-any cline-neutral">&nbsp;</span>
772
807
  <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-yes">353x</span>
774
808
  <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-yes">356x</span>
775
810
  <span class="cline-any cline-neutral">&nbsp;</span>
776
811
  <span class="cline-any cline-neutral">&nbsp;</span>
777
812
  <span class="cline-any cline-neutral">&nbsp;</span>
778
813
  <span class="cline-any cline-neutral">&nbsp;</span>
779
814
  <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-yes">353x</span>
781
- <span class="cline-any cline-yes">353x</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-neutral">&nbsp;</span>
818
+ <span class="cline-any cline-yes">356x</span>
819
+ <span class="cline-any cline-yes">356x</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-yes">356x</span>
823
+ <span class="cline-any cline-yes">1x</span>
824
+ <span class="cline-any cline-neutral">&nbsp;</span>
825
+ <span class="cline-any cline-neutral">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-neutral">&nbsp;</span>
828
+ <span class="cline-any cline-neutral">&nbsp;</span>
829
+ <span class="cline-any cline-neutral">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-neutral">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-neutral">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-neutral">&nbsp;</span>
845
+ <span class="cline-any cline-neutral">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-yes">356x</span>
851
+ <span class="cline-any cline-yes">356x</span>
782
852
  <span class="cline-any cline-neutral">&nbsp;</span>
783
853
  <span class="cline-any cline-yes">2x</span>
784
854
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1084,7 +1154,7 @@
1084
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
1085
1155
  <span class="cline-any cline-neutral">&nbsp;</span>
1086
1156
  <span class="cline-any cline-neutral">&nbsp;</span>
1087
- <span class="cline-any cline-yes">90x</span>
1157
+ <span class="cline-any cline-yes">91x</span>
1088
1158
  <span class="cline-any cline-neutral">&nbsp;</span>
1089
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
1090
1160
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import Database from "better-sqlite3";
@@ -1272,12 +1342,13 @@ export class KnowledgeDB {
1272
1342
  // Column already exists — expected for new databases
1273
1343
  }
1274
1344
  &nbsp;
1275
- // Migration: add memory_tier column (schema v3) for databases created before it existed.
1345
+ // Migration: add memory_tier column (schema v3+) for databases created before it existed.
1276
1346
  // Uses the same try/catch pattern as is_stub. CHECK constraint restricts values to
1277
- // 'doc' (existing documents), 'raw' (dream-loop raw memories), 'reflection' (synthesized).
1347
+ // 'doc' (existing documents), 'raw' (dream-loop raw memories), 'reflection' (synthesized),
1348
+ // 'wiki' (curated personal wiki tier — schema v4).
1278
1349
  try {
1279
1350
  this.db.exec(
1280
- "ALTER TABLE documents ADD COLUMN memory_tier TEXT NOT NULL DEFAULT 'doc' CHECK(memory_tier IN ('doc','raw','reflection'))"
1351
+ "ALTER TABLE documents ADD COLUMN memory_tier TEXT NOT NULL DEFAULT 'doc' CHECK(memory_tier IN ('doc','raw','reflection','wiki'))"
1281
1352
  );
1282
1353
  } catch {
1283
1354
  // Column already exists — expected for new databases
@@ -1285,6 +1356,40 @@ export class KnowledgeDB {
1285
1356
  this.db.exec(
1286
1357
  "CREATE INDEX IF NOT EXISTS idx_documents_memory_tier ON documents(memory_tier)"
1287
1358
  );
1359
+ &nbsp;
1360
+ // Migration v4: expand memory_tier CHECK constraint to allow 'wiki' tier.
1361
+ // SQLite cannot ALTER an existing CHECK constraint; on databases that ran the
1362
+ // earlier v3 migration (CHECK with only 'doc','raw','reflection') the ALTER above
1363
+ // throws "duplicate column" and the old CHECK stays in place. Detect that via
1364
+ // sqlite_master and rebuild the table when 'wiki' is missing from the schema text.
1365
+ try {
1366
+ const tableSchema = this.db
1367
+ .prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='documents'")
1368
+ .get() as { sql: string } | undefined;
1369
+ if (tableSchema &amp;&amp; !tableSchema.sql.includes("'wiki'")) {
1370
+ this.db.exec(`
1371
+ CREATE TABLE documents_v4 (
1372
+ id TEXT PRIMARY KEY,
1373
+ path TEXT,
1374
+ title TEXT,
1375
+ date TEXT,
1376
+ type TEXT,
1377
+ status TEXT,
1378
+ github_issue INTEGER,
1379
+ content TEXT,
1380
+ is_stub INTEGER DEFAULT 0,
1381
+ memory_tier TEXT NOT NULL DEFAULT 'doc' CHECK(memory_tier IN ('doc','raw','reflection','wiki'))
1382
+ );
1383
+ INSERT INTO documents_v4 (id, path, title, date, type, status, github_issue, content, is_stub, memory_tier)
1384
+ SELECT id, path, title, date, type, status, github_issue, content, is_stub, memory_tier FROM documents;
1385
+ DROP TABLE documents;
1386
+ ALTER TABLE documents_v4 RENAME TO documents;
1387
+ CREATE INDEX IF NOT EXISTS idx_documents_memory_tier ON documents(memory_tier);
1388
+ `);
1389
+ }
1390
+ } catch {
1391
+ // Schema introspection failed or table layout already compliant — no-op.
1392
+ }
1288
1393
  &nbsp;
1289
1394
  // Migration: rebuild relationships table for databases created before the
1290
1395
  // context column, post_mortem/untyped CHECK types, and target_id FK were added.
@@ -1606,7 +1711,7 @@ export class KnowledgeDB {
1606
1711
  <div class='footer quiet pad2 space-top1 center small'>
1607
1712
  Code coverage generated by
1608
1713
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1609
- at 2026-05-08T01:23:45.554Z
1714
+ at 2026-05-09T01:59:20.386Z
1610
1715
  </div>
1611
1716
  <script src="prettify.js"></script>
1612
1717
  <script>
@@ -547,7 +547,7 @@ export function prepareTextForEmbedding(
547
547
  <div class='footer quiet pad2 space-top1 center small'>
548
548
  Code coverage generated by
549
549
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
550
- at 2026-05-08T01:23:45.554Z
550
+ at 2026-05-09T01:59:20.386Z
551
551
  </div>
552
552
  <script src="prettify.js"></script>
553
553
  <script>
@@ -199,7 +199,7 @@ export function findMarkdownFiles(dir: string, matcher?: IgnoreMatcher): string[
199
199
  <div class='footer quiet pad2 space-top1 center small'>
200
200
  Code coverage generated by
201
201
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
202
- at 2026-05-08T01:23:45.554Z
202
+ at 2026-05-09T01:59:20.386Z
203
203
  </div>
204
204
  <script src="prettify.js"></script>
205
205
  <script>
@@ -295,7 +295,7 @@ export function formatTraverseResults(
295
295
  <div class='footer quiet pad2 space-top1 center small'>
296
296
  Code coverage generated by
297
297
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
298
- at 2026-05-08T01:23:45.554Z
298
+ at 2026-05-09T01:59:20.386Z
299
299
  </div>
300
300
  <script src="prettify.js"></script>
301
301
  <script>
@@ -946,7 +946,7 @@ export function generateIndexes(outDir: string, allDocs: ParsedDocument[]): void
946
946
  <div class='footer quiet pad2 space-top1 center small'>
947
947
  Code coverage generated by
948
948
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
949
- at 2026-05-08T01:23:45.554Z
949
+ at 2026-05-09T01:59:20.386Z
950
950
  </div>
951
951
  <script src="prettify.js"></script>
952
952
  <script>
@@ -292,7 +292,7 @@ export class GraphBuilder {
292
292
  <div class='footer quiet pad2 space-top1 center small'>
293
293
  Code coverage generated by
294
294
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
295
- at 2026-05-08T01:23:45.554Z
295
+ at 2026-05-09T01:59:20.386Z
296
296
  </div>
297
297
  <script src="prettify.js"></script>
298
298
  <script>
@@ -2821,7 +2821,7 @@ export function registerGraphTools(server: McpServer, db: KnowledgeDB): void {
2821
2821
  <div class='footer quiet pad2 space-top1 center small'>
2822
2822
  Code coverage generated by
2823
2823
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2824
- at 2026-05-08T01:23:45.554Z
2824
+ at 2026-05-09T01:59:20.386Z
2825
2825
  </div>
2826
2826
  <script src="prettify.js"></script>
2827
2827
  <script>
@@ -1606,7 +1606,7 @@ export class HybridSearch {
1606
1606
  <div class='footer quiet pad2 space-top1 center small'>
1607
1607
  Code coverage generated by
1608
1608
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1609
- at 2026-05-08T01:23:45.554Z
1609
+ at 2026-05-09T01:59:20.386Z
1610
1610
  </div>
1611
1611
  <script src="prettify.js"></script>
1612
1612
  <script>
@@ -316,7 +316,7 @@ export function loadIgnoreForRoot(
316
316
  <div class='footer quiet pad2 space-top1 center small'>
317
317
  Code coverage generated by
318
318
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
319
- at 2026-05-08T01:23:45.554Z
319
+ at 2026-05-09T01:59:20.386Z
320
320
  </div>
321
321
  <script src="prettify.js"></script>
322
322
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">92.2% </span>
26
+ <span class="strong">92.22% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>1313/1424</span>
28
+ <span class='fraction'>1317/1428</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">83.01% </span>
33
+ <span class="strong">82.89% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>694/836</span>
35
+ <span class='fraction'>698/842</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">93.16% </span>
47
+ <span class="strong">93.19% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>1214/1303</span>
49
+ <span class='fraction'>1218/1307</span>
50
50
  </div>
51
51
 
52
52
 
@@ -110,17 +110,17 @@
110
110
 
111
111
  <tr>
112
112
  <td class="file high" data-value="db.ts"><a href="db.ts.html">db.ts</a></td>
113
- <td data-value="97.52" class="pic high">
113
+ <td data-value="97.6" class="pic high">
114
114
  <div class="chart"><div class="cover-fill" style="width: 97%"></div><div class="cover-empty" style="width: 3%"></div></div>
115
115
  </td>
116
- <td data-value="97.52" class="pct high">97.52%</td>
117
- <td data-value="121" class="abs high">118/121</td>
118
- <td data-value="86.48" class="pct high">86.48%</td>
119
- <td data-value="74" class="abs high">64/74</td>
116
+ <td data-value="97.6" class="pct high">97.6%</td>
117
+ <td data-value="125" class="abs high">122/125</td>
118
+ <td data-value="87.17" class="pct high">87.17%</td>
119
+ <td data-value="78" class="abs high">68/78</td>
120
120
  <td data-value="100" class="pct high">100%</td>
121
121
  <td data-value="31" class="abs high">31/31</td>
122
- <td data-value="98.26" class="pct high">98.26%</td>
123
- <td data-value="115" class="abs high">113/115</td>
122
+ <td data-value="98.31" class="pct high">98.31%</td>
123
+ <td data-value="119" class="abs high">117/119</td>
124
124
  </tr>
125
125
 
126
126
  <tr>
@@ -250,8 +250,8 @@
250
250
  </td>
251
251
  <td data-value="82.03" class="pct high">82.03%</td>
252
252
  <td data-value="128" class="abs high">105/128</td>
253
- <td data-value="70.37" class="pct medium">70.37%</td>
254
- <td data-value="81" class="abs medium">57/81</td>
253
+ <td data-value="68.67" class="pct medium">68.67%</td>
254
+ <td data-value="83" class="abs medium">57/83</td>
255
255
  <td data-value="81.25" class="pct high">81.25%</td>
256
256
  <td data-value="16" class="abs high">13/16</td>
257
257
  <td data-value="81.25" class="pct high">81.25%</td>
@@ -371,7 +371,7 @@
371
371
  <div class='footer quiet pad2 space-top1 center small'>
372
372
  Code coverage generated by
373
373
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
374
- at 2026-05-08T01:23:45.554Z
374
+ at 2026-05-09T01:59:20.386Z
375
375
  </div>
376
376
  <script src="prettify.js"></script>
377
377
  <script>
@@ -30,9 +30,9 @@
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">70.37% </span>
33
+ <span class="strong">68.67% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>57/81</span>
35
+ <span class='fraction'>57/83</span>
36
36
  </div>
37
37
 
38
38
 
@@ -496,7 +496,9 @@
496
496
  <a name='L431'></a><a href='#L431'>431</a>
497
497
  <a name='L432'></a><a href='#L432'>432</a>
498
498
  <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
500
502
  <span class="cline-any cline-neutral">&nbsp;</span>
501
503
  <span class="cline-any cline-neutral">&nbsp;</span>
502
504
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -756,12 +758,14 @@
756
758
  <span class="cline-any cline-neutral">&nbsp;</span>
757
759
  <span class="cline-any cline-neutral">&nbsp;</span>
758
760
  <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
759
762
  <span class="cline-any cline-yes">11x</span>
760
763
  <span class="cline-any cline-neutral">&nbsp;</span>
761
764
  <span class="cline-any cline-neutral">&nbsp;</span>
762
765
  <span class="cline-any cline-neutral">&nbsp;</span>
763
766
  <span class="cline-any cline-neutral">&nbsp;</span>
764
767
  <span class="cline-any cline-neutral">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
769
  <span class="cline-any cline-yes">11x</span>
766
770
  <span class="cline-any cline-yes">11x</span>
767
771
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1034,10 +1038,10 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1034
1038
  includeSuperseded: z.boolean().optional().describe("Include superseded documents (default: false)"),
1035
1039
  brief: z.boolean().optional().describe("Return minimal metadata only (default: false)"),
1036
1040
  memory_tier: z
1037
- .enum(["doc", "raw", "reflection", "any"])
1041
+ .enum(["doc", "raw", "reflection", "wiki", "any"])
1038
1042
  .optional()
1039
1043
  .default("any")
1040
- .describe("Filter by memory tier: 'doc' (curated), 'raw' (dream-loop ingest), 'reflection' (synthesized), 'any' (default)"),
1044
+ .describe("Filter by memory tier: 'doc' (curated), 'raw' (dream-loop ingest), 'reflection' (synthesized), 'wiki' (personal wiki entries), 'any' (default)"),
1041
1045
  return_chunk_meta: z
1042
1046
  .boolean()
1043
1047
  .optional()
@@ -1137,7 +1141,7 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1137
1141
  direction: z.enum(["outgoing", "incoming"]).optional().describe("Edge direction (default: outgoing)"),
1138
1142
  brief: z.boolean().optional().describe("Return minimal metadata only (default: false)"),
1139
1143
  memory_tier: z
1140
- .enum(["doc", "raw", "reflection", "any"])
1144
+ .enum(["doc", "raw", "reflection", "wiki", "any"])
1141
1145
  .optional()
1142
1146
  .default("any")
1143
1147
  .describe("Filter traversed nodes by memory tier (default: 'any')"),
@@ -1184,15 +1188,17 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1184
1188
  .get() as { c: number };
1185
1189
  const totalDocuments = totalRow.c;
1186
1190
  &nbsp;
1187
- const byTier: Record&lt;"doc" | "raw" | "reflection", number&gt; = {
1191
+ const byTier: Record&lt;"doc" | "raw" | "reflection" | "wiki", number&gt; = {
1188
1192
  doc: 0,
1189
1193
  raw: 0,
1190
1194
  reflection: 0,
1195
+ wiki: 0,
1191
1196
  };
1192
- const newSince: Record&lt;"doc" | "raw" | "reflection", number&gt; = {
1197
+ const newSince: Record&lt;"doc" | "raw" | "reflection" | "wiki", number&gt; = {
1193
1198
  doc: 0,
1194
1199
  raw: 0,
1195
1200
  reflection: 0,
1201
+ wiki: 0,
1196
1202
  };
1197
1203
  &nbsp;
1198
1204
  if (hasTier) {
@@ -1205,7 +1211,7 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1205
1211
  )
1206
1212
  .all() as Array&lt;{ tier: string; c: number }&gt;;
1207
1213
  for (const r of rows) {
1208
- <span class="missing-if-branch" title="else path not taken" >E</span>if (r.tier === "doc" || r.tier === "raw" || r.tier === "reflection") {
1214
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (r.tier === "doc" || r.tier === "raw" || r.tier === "reflection" || <span class="branch-3 cbranch-no" title="branch not covered" >r.tier === "wiki") {</span>
1209
1215
  byTier[r.tier] = r.c;
1210
1216
  }
1211
1217
  }
@@ -1218,7 +1224,7 @@ export function createServer(dbPath: string, opts: CreateServerOptions = {}) {
1218
1224
  )
1219
1225
  .all({ since }) as Array&lt;{ tier: string; c: number }&gt;;
1220
1226
  for (const r of newRows) {
1221
- <span class="missing-if-branch" title="else path not taken" >E</span>if (r.tier === "doc" || r.tier === "raw" || r.tier === "reflection") {
1227
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (r.tier === "doc" || r.tier === "raw" || r.tier === "reflection" || <span class="branch-3 cbranch-no" title="branch not covered" >r.tier === "wiki") {</span>
1222
1228
  newSince[r.tier] = r.c;
1223
1229
  }
1224
1230
  }
@@ -1369,7 +1375,7 @@ server.connect(transport).catch(console.error);
1369
1375
  <div class='footer quiet pad2 space-top1 center small'>
1370
1376
  Code coverage generated by
1371
1377
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1372
- at 2026-05-08T01:23:45.554Z
1378
+ at 2026-05-09T01:59:20.386Z
1373
1379
  </div>
1374
1380
  <script src="prettify.js"></script>
1375
1381
  <script>
@@ -478,7 +478,7 @@ export function createLlmClient(opts: LlmClientOptions = {}): LlmClient {
478
478
  <div class='footer quiet pad2 space-top1 center small'>
479
479
  Code coverage generated by
480
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
481
- at 2026-05-08T01:23:45.554Z
481
+ at 2026-05-09T01:59:20.386Z
482
482
  </div>
483
483
  <script src="prettify.js"></script>
484
484
  <script>