mindlore 0.6.8 → 0.7.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 (209) hide show
  1. package/README.md +259 -259
  2. package/SCHEMA.md +292 -292
  3. package/dist/scripts/cc-memory-bulk-sync.d.ts.map +1 -1
  4. package/dist/scripts/cc-memory-bulk-sync.js +4 -2
  5. package/dist/scripts/cc-memory-bulk-sync.js.map +1 -1
  6. package/dist/scripts/cc-session-sync.d.ts.map +1 -1
  7. package/dist/scripts/cc-session-sync.js +9 -7
  8. package/dist/scripts/cc-session-sync.js.map +1 -1
  9. package/dist/scripts/fetch-raw.js +5 -4
  10. package/dist/scripts/fetch-raw.js.map +1 -1
  11. package/dist/scripts/init.js +16 -12
  12. package/dist/scripts/init.js.map +1 -1
  13. package/dist/scripts/lib/consolidation.js +10 -10
  14. package/dist/scripts/lib/constants.d.ts +3 -0
  15. package/dist/scripts/lib/constants.d.ts.map +1 -1
  16. package/dist/scripts/lib/constants.js +11 -1
  17. package/dist/scripts/lib/constants.js.map +1 -1
  18. package/dist/scripts/lib/decay.js +9 -9
  19. package/dist/scripts/lib/episodes.js +23 -23
  20. package/dist/scripts/lib/err-msg.d.ts +2 -0
  21. package/dist/scripts/lib/err-msg.d.ts.map +1 -0
  22. package/dist/scripts/lib/err-msg.js +7 -0
  23. package/dist/scripts/lib/err-msg.js.map +1 -0
  24. package/dist/scripts/lib/mcp-namespace.d.ts +2 -0
  25. package/dist/scripts/lib/mcp-namespace.d.ts.map +1 -0
  26. package/dist/scripts/lib/mcp-namespace.js +21 -0
  27. package/dist/scripts/lib/mcp-namespace.js.map +1 -0
  28. package/dist/scripts/lib/mcp-telemetry.d.ts +11 -0
  29. package/dist/scripts/lib/mcp-telemetry.d.ts.map +1 -0
  30. package/dist/scripts/lib/mcp-telemetry.js +37 -0
  31. package/dist/scripts/lib/mcp-telemetry.js.map +1 -0
  32. package/dist/scripts/lib/mcp-tools.d.ts +10 -0
  33. package/dist/scripts/lib/mcp-tools.d.ts.map +1 -0
  34. package/dist/scripts/lib/mcp-tools.js +121 -0
  35. package/dist/scripts/lib/mcp-tools.js.map +1 -0
  36. package/dist/scripts/lib/migrations-v061.js +21 -21
  37. package/dist/scripts/lib/migrations-v062.js +11 -11
  38. package/dist/scripts/lib/migrations-v063.js +14 -14
  39. package/dist/scripts/lib/migrations-v067.js +11 -11
  40. package/dist/scripts/lib/rrf.d.ts.map +1 -1
  41. package/dist/scripts/lib/rrf.js +2 -1
  42. package/dist/scripts/lib/rrf.js.map +1 -1
  43. package/dist/scripts/lib/schema-version.js +6 -6
  44. package/dist/scripts/lib/search-cache.js +11 -11
  45. package/dist/scripts/lib/search-engine.d.ts +1 -0
  46. package/dist/scripts/lib/search-engine.d.ts.map +1 -1
  47. package/dist/scripts/lib/search-engine.js +9 -5
  48. package/dist/scripts/lib/search-engine.js.map +1 -1
  49. package/dist/scripts/lib/secure-io.d.ts +11 -0
  50. package/dist/scripts/lib/secure-io.d.ts.map +1 -0
  51. package/dist/scripts/lib/secure-io.js +26 -0
  52. package/dist/scripts/lib/secure-io.js.map +1 -0
  53. package/dist/scripts/lib/session-payload.js +7 -7
  54. package/dist/scripts/lib/slugify.d.ts +2 -0
  55. package/dist/scripts/lib/slugify.d.ts.map +1 -0
  56. package/dist/scripts/lib/slugify.js +13 -0
  57. package/dist/scripts/lib/slugify.js.map +1 -0
  58. package/dist/scripts/lib/smart-snippet.d.ts +9 -0
  59. package/dist/scripts/lib/smart-snippet.d.ts.map +1 -0
  60. package/dist/scripts/lib/smart-snippet.js +47 -0
  61. package/dist/scripts/lib/smart-snippet.js.map +1 -0
  62. package/dist/scripts/lib/tool-adapters/brief-adapter.d.ts +15 -0
  63. package/dist/scripts/lib/tool-adapters/brief-adapter.d.ts.map +1 -0
  64. package/dist/scripts/lib/tool-adapters/brief-adapter.js +66 -0
  65. package/dist/scripts/lib/tool-adapters/brief-adapter.js.map +1 -0
  66. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts +31 -0
  67. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts.map +1 -0
  68. package/dist/scripts/lib/tool-adapters/decide-adapter.js +71 -0
  69. package/dist/scripts/lib/tool-adapters/decide-adapter.js.map +1 -0
  70. package/dist/scripts/lib/tool-adapters/ingest-adapter.d.ts +16 -0
  71. package/dist/scripts/lib/tool-adapters/ingest-adapter.d.ts.map +1 -0
  72. package/dist/scripts/lib/tool-adapters/ingest-adapter.js +58 -0
  73. package/dist/scripts/lib/tool-adapters/ingest-adapter.js.map +1 -0
  74. package/dist/scripts/lib/tool-adapters/recall-adapter.d.ts +20 -0
  75. package/dist/scripts/lib/tool-adapters/recall-adapter.d.ts.map +1 -0
  76. package/dist/scripts/lib/tool-adapters/recall-adapter.js +69 -0
  77. package/dist/scripts/lib/tool-adapters/recall-adapter.js.map +1 -0
  78. package/dist/scripts/lib/tool-adapters/search-adapter.d.ts +22 -0
  79. package/dist/scripts/lib/tool-adapters/search-adapter.d.ts.map +1 -0
  80. package/dist/scripts/lib/tool-adapters/search-adapter.js +32 -0
  81. package/dist/scripts/lib/tool-adapters/search-adapter.js.map +1 -0
  82. package/dist/scripts/lib/tool-adapters/stats-adapter.d.ts +15 -0
  83. package/dist/scripts/lib/tool-adapters/stats-adapter.d.ts.map +1 -0
  84. package/dist/scripts/lib/tool-adapters/stats-adapter.js +66 -0
  85. package/dist/scripts/lib/tool-adapters/stats-adapter.js.map +1 -0
  86. package/dist/scripts/lib/triage.js +3 -3
  87. package/dist/scripts/lib/validate-manifest.d.ts +8 -0
  88. package/dist/scripts/lib/validate-manifest.d.ts.map +1 -0
  89. package/dist/scripts/lib/validate-manifest.js +80 -0
  90. package/dist/scripts/lib/validate-manifest.js.map +1 -0
  91. package/dist/scripts/maintain-cleanup.d.ts.map +1 -1
  92. package/dist/scripts/maintain-cleanup.js +3 -2
  93. package/dist/scripts/maintain-cleanup.js.map +1 -1
  94. package/dist/scripts/mcp-server.d.ts +3 -0
  95. package/dist/scripts/mcp-server.d.ts.map +1 -0
  96. package/dist/scripts/mcp-server.js +85 -0
  97. package/dist/scripts/mcp-server.js.map +1 -0
  98. package/dist/scripts/mindlore-backup.js +9 -9
  99. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  100. package/dist/scripts/mindlore-doctor.js +4 -6
  101. package/dist/scripts/mindlore-doctor.js.map +1 -1
  102. package/dist/scripts/mindlore-fts5-index.js +12 -12
  103. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  104. package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
  105. package/dist/scripts/mindlore-health-check.js +2 -2
  106. package/dist/scripts/mindlore-health-check.js.map +1 -1
  107. package/dist/scripts/validate-manifest-cli.d.ts +2 -0
  108. package/dist/scripts/validate-manifest-cli.d.ts.map +1 -0
  109. package/dist/scripts/validate-manifest-cli.js +38 -0
  110. package/dist/scripts/validate-manifest-cli.js.map +1 -0
  111. package/dist/tests/cc-memory-sync.test.js +3 -3
  112. package/dist/tests/chunks-migration.test.js +1 -1
  113. package/dist/tests/compaction-snapshot.test.js +2 -2
  114. package/dist/tests/consolidation.test.js +3 -3
  115. package/dist/tests/decay.test.js +9 -9
  116. package/dist/tests/diary.test.js +4 -4
  117. package/dist/tests/episode-file.test.js +2 -1
  118. package/dist/tests/episode-file.test.js.map +1 -1
  119. package/dist/tests/episodes-inject.test.js +9 -9
  120. package/dist/tests/err-msg.test.d.ts +2 -0
  121. package/dist/tests/err-msg.test.d.ts.map +1 -0
  122. package/dist/tests/err-msg.test.js +24 -0
  123. package/dist/tests/err-msg.test.js.map +1 -0
  124. package/dist/tests/fetch-raw.test.js +1 -2
  125. package/dist/tests/fetch-raw.test.js.map +1 -1
  126. package/dist/tests/fts5.test.js +75 -75
  127. package/dist/tests/fuzzy.test.js +1 -1
  128. package/dist/tests/git-snapshot.test.js +3 -5
  129. package/dist/tests/git-snapshot.test.js.map +1 -1
  130. package/dist/tests/helpers/db.d.ts +1 -2
  131. package/dist/tests/helpers/db.d.ts.map +1 -1
  132. package/dist/tests/helpers/db.js +18 -26
  133. package/dist/tests/helpers/db.js.map +1 -1
  134. package/dist/tests/manifest-v2.test.d.ts +2 -0
  135. package/dist/tests/manifest-v2.test.d.ts.map +1 -0
  136. package/dist/tests/manifest-v2.test.js +67 -0
  137. package/dist/tests/manifest-v2.test.js.map +1 -0
  138. package/dist/tests/mcp-server.test.d.ts +2 -0
  139. package/dist/tests/mcp-server.test.d.ts.map +1 -0
  140. package/dist/tests/mcp-server.test.js +118 -0
  141. package/dist/tests/mcp-server.test.js.map +1 -0
  142. package/dist/tests/mcp-tools.test.d.ts +2 -0
  143. package/dist/tests/mcp-tools.test.d.ts.map +1 -0
  144. package/dist/tests/mcp-tools.test.js +243 -0
  145. package/dist/tests/mcp-tools.test.js.map +1 -0
  146. package/dist/tests/migrations-v053.test.js +16 -16
  147. package/dist/tests/migrations-v061.test.js +10 -10
  148. package/dist/tests/migrations-v063.test.js +4 -4
  149. package/dist/tests/migrations-v068.test.js +6 -3
  150. package/dist/tests/migrations-v068.test.js.map +1 -1
  151. package/dist/tests/nomination-counts.test.js +6 -6
  152. package/dist/tests/nomination-counts.test.js.map +1 -1
  153. package/dist/tests/pre-compact.test.js +2 -1
  154. package/dist/tests/pre-compact.test.js.map +1 -1
  155. package/dist/tests/recall-telemetry.test.js +12 -11
  156. package/dist/tests/recall-telemetry.test.js.map +1 -1
  157. package/dist/tests/rrf.test.js +3 -3
  158. package/dist/tests/search-engine.test.js +1 -1
  159. package/dist/tests/search-hook.test.js +2 -2
  160. package/dist/tests/search-offload.test.js +1 -1
  161. package/dist/tests/search-offload.test.js.map +1 -1
  162. package/dist/tests/secure-io.test.d.ts +2 -0
  163. package/dist/tests/secure-io.test.d.ts.map +1 -0
  164. package/dist/tests/secure-io.test.js +65 -0
  165. package/dist/tests/secure-io.test.js.map +1 -0
  166. package/dist/tests/session-payload.test.js +1 -1
  167. package/dist/tests/session-summary.test.js +1 -1
  168. package/dist/tests/similarity.test.js +1 -1
  169. package/dist/tests/skill-path-resolution.test.js +22 -3
  170. package/dist/tests/skill-path-resolution.test.js.map +1 -1
  171. package/dist/tests/smart-snippet.test.d.ts +2 -0
  172. package/dist/tests/smart-snippet.test.d.ts.map +1 -0
  173. package/dist/tests/smart-snippet.test.js +67 -0
  174. package/dist/tests/smart-snippet.test.js.map +1 -0
  175. package/dist/tests/triage.test.js +1 -1
  176. package/hooks/lib/constants.cjs +15 -15
  177. package/hooks/lib/mindlore-common.cjs +975 -974
  178. package/hooks/mindlore-cwd-changed.cjs +57 -57
  179. package/hooks/mindlore-decision-detector.cjs +54 -54
  180. package/hooks/mindlore-dont-repeat.cjs +222 -222
  181. package/hooks/mindlore-fts5-sync.cjs +98 -97
  182. package/hooks/mindlore-index.cjs +230 -229
  183. package/hooks/mindlore-model-router.cjs +54 -54
  184. package/hooks/mindlore-post-compact.cjs +69 -69
  185. package/hooks/mindlore-post-read.cjs +106 -106
  186. package/hooks/mindlore-pre-compact.cjs +154 -154
  187. package/hooks/mindlore-read-guard.cjs +105 -105
  188. package/hooks/mindlore-research-guard.cjs +176 -176
  189. package/hooks/mindlore-search.cjs +200 -200
  190. package/hooks/mindlore-session-end.cjs +510 -509
  191. package/hooks/mindlore-session-focus.cjs +256 -256
  192. package/package.json +77 -75
  193. package/plugin.json +8 -1
  194. package/skills/mindlore-diary/SKILL.md +85 -85
  195. package/skills/mindlore-evolve/SKILL.md +126 -126
  196. package/skills/mindlore-explore/SKILL.md +109 -109
  197. package/skills/mindlore-ingest/SKILL.md +195 -195
  198. package/skills/mindlore-maintain/SKILL.md +125 -125
  199. package/skills/mindlore-query/SKILL.md +151 -151
  200. package/skills/mindlore-reflect/SKILL.md +141 -141
  201. package/skills/mindlore-stats/SKILL.md +106 -106
  202. package/templates/INDEX.md +14 -14
  203. package/templates/SCHEMA.md +292 -292
  204. package/templates/config.json +1 -1
  205. package/templates/extraction/article.md +15 -15
  206. package/templates/extraction/changelog.md +15 -15
  207. package/templates/extraction/default.md +15 -15
  208. package/templates/extraction/docs.md +15 -15
  209. package/templates/extraction/github-repo.md +17 -17
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const child_process_1 = require("child_process");
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const MCP_SERVER_PATH = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'mcp-server.js');
11
+ function sendRequest(proc, request) {
12
+ return new Promise((resolve, reject) => {
13
+ const timeout = setTimeout(() => reject(new Error('MCP response timeout')), 10000);
14
+ let buffer = '';
15
+ const onData = (data) => {
16
+ buffer += data.toString();
17
+ const lines = buffer.split('\n');
18
+ for (const line of lines) {
19
+ if (!line.trim())
20
+ continue;
21
+ try {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSON.parse in test context
23
+ const parsed = JSON.parse(line);
24
+ if (parsed.id === request.id) {
25
+ clearTimeout(timeout);
26
+ proc.stdout?.removeListener('data', onData);
27
+ resolve(parsed);
28
+ return;
29
+ }
30
+ }
31
+ catch { /* partial line, keep buffering */ }
32
+ }
33
+ buffer = lines[lines.length - 1] ?? '';
34
+ };
35
+ proc.stdout?.on('data', onData);
36
+ proc.stdin?.write(JSON.stringify(request) + '\n');
37
+ });
38
+ }
39
+ describe('MCP Server stdio integration', () => {
40
+ let proc;
41
+ let testDir;
42
+ beforeAll(() => {
43
+ testDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-mcp-integ-'));
44
+ proc = (0, child_process_1.spawn)('node', [MCP_SERVER_PATH], {
45
+ env: { ...process.env, MINDLORE_HOME: testDir },
46
+ stdio: ['pipe', 'pipe', 'pipe'],
47
+ });
48
+ });
49
+ afterAll(() => {
50
+ proc.kill();
51
+ // Windows: wait briefly for process termination before rmSync
52
+ try {
53
+ fs_1.default.rmSync(testDir, { recursive: true, force: true });
54
+ }
55
+ catch {
56
+ // ignore cleanup failure on Windows EPERM
57
+ }
58
+ });
59
+ it('responds to initialize request', async () => {
60
+ const response = await sendRequest(proc, {
61
+ jsonrpc: '2.0',
62
+ id: 1,
63
+ method: 'initialize',
64
+ params: {
65
+ protocolVersion: '2024-11-05',
66
+ capabilities: {},
67
+ clientInfo: { name: 'test', version: '1.0.0' },
68
+ },
69
+ });
70
+ expect(response.result).toBeDefined();
71
+ expect(response.error).toBeUndefined();
72
+ });
73
+ it('lists tools', async () => {
74
+ const response = await sendRequest(proc, {
75
+ jsonrpc: '2.0',
76
+ id: 2,
77
+ method: 'tools/list',
78
+ });
79
+ expect(response.result).toBeDefined();
80
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test assertion context
81
+ const result = response.result;
82
+ const toolNames = result.tools.map(t => t.name);
83
+ expect(toolNames).toContain('mindlore_search');
84
+ expect(toolNames).toContain('mindlore_stats');
85
+ expect(toolNames).toContain('mindlore_ingest');
86
+ expect(toolNames).toContain('mindlore_recall');
87
+ expect(toolNames).toContain('mindlore_brief');
88
+ expect(toolNames).toContain('mindlore_decide');
89
+ expect(toolNames).toHaveLength(6);
90
+ });
91
+ it('executes mindlore_stats tool', async () => {
92
+ const response = await sendRequest(proc, {
93
+ jsonrpc: '2.0',
94
+ id: 3,
95
+ method: 'tools/call',
96
+ params: {
97
+ name: 'mindlore_stats',
98
+ arguments: {},
99
+ },
100
+ });
101
+ expect(response.result).toBeDefined();
102
+ expect(response.error).toBeUndefined();
103
+ });
104
+ it('executes mindlore_search with empty results', async () => {
105
+ const response = await sendRequest(proc, {
106
+ jsonrpc: '2.0',
107
+ id: 4,
108
+ method: 'tools/call',
109
+ params: {
110
+ name: 'mindlore_search',
111
+ arguments: { query: 'nonexistent query xyz' },
112
+ },
113
+ });
114
+ expect(response.result).toBeDefined();
115
+ expect(response.error).toBeUndefined();
116
+ });
117
+ });
118
+ //# sourceMappingURL=mcp-server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../../tests/mcp-server.test.ts"],"names":[],"mappings":";;;;;AAAA,iDAAoD;AACpD,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAEpB,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AAgBvF,SAAS,WAAW,CAAC,IAAkB,EAAE,OAAuB;IAC9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACnF,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;YACpC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,CAAC;oBACH,qGAAqG;oBACrG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;oBACnD,IAAI,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;wBAC7B,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBAC5C,OAAO,CAAC,MAAM,CAAC,CAAC;wBAChB,OAAO;oBACT,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,IAAkB,CAAC;IACvB,IAAI,OAAe,CAAC;IAEpB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACxE,IAAI,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE;YACtC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE;YAC/C,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,8DAA8D;QAC9D,IAAI,CAAC;YACH,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,eAAe,EAAE,YAAY;gBAC7B,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;aAC/C;SACF,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;QAC3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,iGAAiG;QACjG,MAAM,MAAM,GAAG,QAAQ,CAAC,MAA4C,CAAC;QACrE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,EAAE;aACd;SACF,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;YACvC,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE;gBACN,IAAI,EAAE,iBAAiB;gBACvB,SAAS,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;aAC9C;SACF,CAAC,CAAC;QACH,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.d.ts","sourceRoot":"","sources":["../../tests/mcp-tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
7
+ const search_adapter_1 = require("../scripts/lib/tool-adapters/search-adapter");
8
+ const stats_adapter_1 = require("../scripts/lib/tool-adapters/stats-adapter");
9
+ const recall_adapter_1 = require("../scripts/lib/tool-adapters/recall-adapter");
10
+ const brief_adapter_1 = require("../scripts/lib/tool-adapters/brief-adapter");
11
+ const ingest_adapter_1 = require("../scripts/lib/tool-adapters/ingest-adapter");
12
+ const decide_adapter_1 = require("../scripts/lib/tool-adapters/decide-adapter");
13
+ const path_1 = __importDefault(require("path"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const fs_1 = __importDefault(require("fs"));
16
+ function createTestContext() {
17
+ const baseDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-mcp-test-'));
18
+ for (const sub of ['sources', 'episodes', 'decisions', 'diary', 'learnings']) {
19
+ fs_1.default.mkdirSync(path_1.default.join(baseDir, sub), { recursive: true });
20
+ }
21
+ const db = new better_sqlite3_1.default(':memory:');
22
+ db.exec(`
23
+ CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts USING fts5(
24
+ path, slug, description, type, category, title, content, tags, quality, date_captured, project
25
+ );
26
+ CREATE TABLE IF NOT EXISTS chunks (
27
+ source_path TEXT NOT NULL,
28
+ chunk_index INTEGER NOT NULL,
29
+ heading TEXT,
30
+ breadcrumb TEXT DEFAULT '',
31
+ char_count INTEGER DEFAULT 0
32
+ );
33
+ CREATE TABLE IF NOT EXISTS file_hashes (
34
+ path TEXT PRIMARY KEY,
35
+ content_hash TEXT,
36
+ last_indexed TEXT,
37
+ project TEXT,
38
+ importance TEXT
39
+ );
40
+ CREATE TABLE IF NOT EXISTS vocabulary (
41
+ word TEXT PRIMARY KEY
42
+ );
43
+ `);
44
+ return {
45
+ db,
46
+ baseDir,
47
+ cleanup: () => { db.close(); fs_1.default.rmSync(baseDir, { recursive: true, force: true }); },
48
+ };
49
+ }
50
+ describe('search adapter', () => {
51
+ it('returns empty results for no-match query', () => {
52
+ const ctx = createTestContext();
53
+ try {
54
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'nonexistent' });
55
+ expect(result.results).toEqual([]);
56
+ expect(result.total).toBe(0);
57
+ expect(result.truncated).toBe(false);
58
+ }
59
+ finally {
60
+ ctx.cleanup();
61
+ }
62
+ });
63
+ it('returns results with heading for matching content', () => {
64
+ const ctx = createTestContext();
65
+ try {
66
+ ctx.db.prepare('INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)').run('/test/source.md', 'test-source', 'Test description', 'source', 'sources', 'Test Source', 'MCP protocol enables cross-host memory', 'mcp,protocol', '8', '2026-05-04', 'mindlore');
67
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'MCP protocol' });
68
+ expect(result.results.length).toBeGreaterThanOrEqual(1);
69
+ expect(result.results[0].slug).toBe('test-source');
70
+ }
71
+ finally {
72
+ ctx.cleanup();
73
+ }
74
+ });
75
+ it('respects limit parameter', () => {
76
+ const ctx = createTestContext();
77
+ try {
78
+ for (let i = 0; i < 10; i++) {
79
+ ctx.db.prepare('INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)').run(`/test/s${i}.md`, `slug-${i}`, 'desc', 'source', 'sources', `Source ${i}`, `content about topic ${i}`, 'tag', '5', '2026-05-04', 'mindlore');
80
+ }
81
+ const result = (0, search_adapter_1.handleSearch)(ctx, { query: 'content topic', limit: 3 });
82
+ expect(result.results.length).toBeLessThanOrEqual(3);
83
+ }
84
+ finally {
85
+ ctx.cleanup();
86
+ }
87
+ });
88
+ });
89
+ describe('stats adapter', () => {
90
+ it('returns basic stats', () => {
91
+ const ctx = createTestContext();
92
+ try {
93
+ const result = (0, stats_adapter_1.handleStats)(ctx);
94
+ expect(result.health).toBeDefined();
95
+ expect(typeof result.sources).toBe('number');
96
+ expect(typeof result.dbSize).toBe('string');
97
+ }
98
+ finally {
99
+ ctx.cleanup();
100
+ }
101
+ });
102
+ it('returns version string', () => {
103
+ const ctx = createTestContext();
104
+ try {
105
+ const result = (0, stats_adapter_1.handleStats)(ctx);
106
+ expect(result.version).toBeDefined();
107
+ }
108
+ finally {
109
+ ctx.cleanup();
110
+ }
111
+ });
112
+ });
113
+ describe('recall adapter', () => {
114
+ it('returns empty items for empty KB', () => {
115
+ const ctx = createTestContext();
116
+ try {
117
+ const result = (0, recall_adapter_1.handleRecall)(ctx, { type: 'all' });
118
+ expect(result.items).toEqual([]);
119
+ expect(result.total).toBe(0);
120
+ }
121
+ finally {
122
+ ctx.cleanup();
123
+ }
124
+ });
125
+ it('returns decisions when type=decisions', () => {
126
+ const ctx = createTestContext();
127
+ try {
128
+ // Create a test decision file
129
+ const decPath = path_1.default.join(ctx.baseDir, 'decisions', 'test-decision.md');
130
+ fs_1.default.writeFileSync(decPath, [
131
+ '---',
132
+ 'slug: test-decision',
133
+ 'type: decision',
134
+ 'date: 2026-05-04',
135
+ 'title: Use MCP Protocol',
136
+ 'tags: [mcp, architecture]',
137
+ '---',
138
+ '',
139
+ 'We decided to use MCP protocol for cross-host communication.',
140
+ ].join('\n'));
141
+ const result = (0, recall_adapter_1.handleRecall)(ctx, { type: 'decisions' });
142
+ expect(result.items.length).toBe(1);
143
+ expect(result.items[0].title).toBe('Use MCP Protocol');
144
+ }
145
+ finally {
146
+ ctx.cleanup();
147
+ }
148
+ });
149
+ });
150
+ describe('brief adapter', () => {
151
+ it('returns project brief for empty KB', () => {
152
+ const ctx = createTestContext();
153
+ try {
154
+ const result = (0, brief_adapter_1.handleBrief)(ctx, {});
155
+ expect(result.summary).toBeDefined();
156
+ expect(typeof result.recentDecisions).toBe('number');
157
+ expect(typeof result.recentEpisodes).toBe('number');
158
+ }
159
+ finally {
160
+ ctx.cleanup();
161
+ }
162
+ });
163
+ });
164
+ describe('ingest adapter', () => {
165
+ it('ingests text content and returns slug', () => {
166
+ const ctx = createTestContext();
167
+ try {
168
+ const result = (0, ingest_adapter_1.handleIngest)(ctx, {
169
+ type: 'text',
170
+ content: 'MCP protocol is a cross-host memory layer for AI agents.',
171
+ title: 'MCP Overview',
172
+ });
173
+ expect(result.slug).toBeDefined();
174
+ expect(result.path).toBeDefined();
175
+ expect(result.wordCount).toBeGreaterThan(0);
176
+ }
177
+ finally {
178
+ ctx.cleanup();
179
+ }
180
+ });
181
+ it('rejects empty content', () => {
182
+ const ctx = createTestContext();
183
+ try {
184
+ expect(() => (0, ingest_adapter_1.handleIngest)(ctx, { type: 'text', content: '' })).toThrow();
185
+ }
186
+ finally {
187
+ ctx.cleanup();
188
+ }
189
+ });
190
+ });
191
+ describe('decide adapter', () => {
192
+ it('saves a decision and returns slug', () => {
193
+ const ctx = createTestContext();
194
+ try {
195
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- discriminated union narrowing in test
196
+ const result = (0, decide_adapter_1.handleDecide)(ctx, {
197
+ action: 'save',
198
+ title: 'Use Stdio Transport',
199
+ rationale: 'Proven model from context-mode, 14 platform support.',
200
+ });
201
+ expect(result.slug).toBe('use-stdio-transport');
202
+ expect(result.path).toContain('decisions');
203
+ expect(fs_1.default.existsSync(result.path)).toBe(true);
204
+ }
205
+ finally {
206
+ ctx.cleanup();
207
+ }
208
+ });
209
+ it('lists decisions from empty dir', () => {
210
+ const ctx = createTestContext();
211
+ try {
212
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- discriminated union narrowing in test
213
+ const result = (0, decide_adapter_1.handleDecide)(ctx, { action: 'list' });
214
+ expect(result.decisions).toEqual([]);
215
+ expect(result.total).toBe(0);
216
+ }
217
+ finally {
218
+ ctx.cleanup();
219
+ }
220
+ });
221
+ it('lists saved decisions', () => {
222
+ const ctx = createTestContext();
223
+ try {
224
+ (0, decide_adapter_1.handleDecide)(ctx, {
225
+ action: 'save',
226
+ title: 'Decision One',
227
+ rationale: 'First reason.',
228
+ });
229
+ (0, decide_adapter_1.handleDecide)(ctx, {
230
+ action: 'save',
231
+ title: 'Decision Two',
232
+ rationale: 'Second reason.',
233
+ });
234
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- discriminated union narrowing in test
235
+ const result = (0, decide_adapter_1.handleDecide)(ctx, { action: 'list' });
236
+ expect(result.decisions.length).toBe(2);
237
+ }
238
+ finally {
239
+ ctx.cleanup();
240
+ }
241
+ });
242
+ });
243
+ //# sourceMappingURL=mcp-tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tools.test.js","sourceRoot":"","sources":["../../tests/mcp-tools.test.ts"],"names":[],"mappings":"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"}
@@ -17,27 +17,27 @@ function createBaseDb(dbPath) {
17
17
  const db = new better_sqlite3_1.default(dbPath);
18
18
  db.pragma('journal_mode = WAL');
19
19
  db.exec(SQL_FTS_CREATE);
20
- db.exec(`
21
- CREATE TABLE IF NOT EXISTS file_hashes (
22
- path TEXT PRIMARY KEY,
23
- content_hash TEXT NOT NULL,
24
- last_indexed TEXT NOT NULL
25
- );
20
+ db.exec(`
21
+ CREATE TABLE IF NOT EXISTS file_hashes (
22
+ path TEXT PRIMARY KEY,
23
+ content_hash TEXT NOT NULL,
24
+ last_indexed TEXT NOT NULL
25
+ );
26
26
  `);
27
27
  (0, schema_version_js_1.ensureSchemaTable)(db);
28
28
  return db;
29
29
  }
30
30
  function addEpisodesTable(db) {
31
- db.exec(`
32
- CREATE TABLE IF NOT EXISTS episodes (
33
- id INTEGER PRIMARY KEY AUTOINCREMENT,
34
- session_id TEXT NOT NULL,
35
- timestamp TEXT NOT NULL,
36
- summary TEXT NOT NULL,
37
- project TEXT,
38
- tags TEXT,
39
- quality REAL DEFAULT 0.5
40
- );
31
+ db.exec(`
32
+ CREATE TABLE IF NOT EXISTS episodes (
33
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
34
+ session_id TEXT NOT NULL,
35
+ timestamp TEXT NOT NULL,
36
+ summary TEXT NOT NULL,
37
+ project TEXT,
38
+ tags TEXT,
39
+ quality REAL DEFAULT 0.5
40
+ );
41
41
  `);
42
42
  }
43
43
  describe('v0.5.3 Migrations', () => {
@@ -11,16 +11,16 @@ const migrations_v052_js_1 = require("../scripts/lib/migrations-v052.js");
11
11
  const migrations_v053_js_1 = require("../scripts/lib/migrations-v053.js");
12
12
  function setupDb() {
13
13
  const db = new better_sqlite3_1.default(':memory:');
14
- db.exec(`
15
- CREATE VIRTUAL TABLE mindlore_fts USING fts5(
16
- path, slug, description, type, category, title, content, tags,
17
- quality, date_captured, project
18
- );
19
- CREATE TABLE IF NOT EXISTS file_hashes (
20
- path TEXT PRIMARY KEY, content_hash TEXT, last_indexed TEXT,
21
- recall_count INTEGER DEFAULT 0, last_recalled_at TEXT,
22
- archived_at TEXT, importance REAL DEFAULT 1.0
23
- );
14
+ db.exec(`
15
+ CREATE VIRTUAL TABLE mindlore_fts USING fts5(
16
+ path, slug, description, type, category, title, content, tags,
17
+ quality, date_captured, project
18
+ );
19
+ CREATE TABLE IF NOT EXISTS file_hashes (
20
+ path TEXT PRIMARY KEY, content_hash TEXT, last_indexed TEXT,
21
+ recall_count INTEGER DEFAULT 0, last_recalled_at TEXT,
22
+ archived_at TEXT, importance REAL DEFAULT 1.0
23
+ );
24
24
  `);
25
25
  (0, schema_version_js_1.ensureSchemaTable)(db);
26
26
  const allPrior = [...migrations_js_1.V050_MIGRATIONS, ...migrations_js_1.V051_MIGRATIONS, ...migrations_v052_js_1.V052_MIGRATIONS, ...migrations_v053_js_1.V053_MIGRATIONS];
@@ -28,7 +28,7 @@ function cleanup(dir, db) {
28
28
  describe('v0.6.3 migrations', () => {
29
29
  test('migration creates trigram table', () => {
30
30
  const dir = makeTmpDir();
31
- const db = (0, db_js_1.createTestDbWithMigrations)(path_1.default.join(dir, 'mindlore.db'));
31
+ const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
32
32
  const tables = db.prepare("SELECT name FROM sqlite_master").all();
33
33
  const names = tables.map(t => t.name);
34
34
  expect(names).toContain('mindlore_fts_trigram');
@@ -36,7 +36,7 @@ describe('v0.6.3 migrations', () => {
36
36
  });
37
37
  test('migration creates vocabulary table', () => {
38
38
  const dir = makeTmpDir();
39
- const db = (0, db_js_1.createTestDbWithMigrations)(path_1.default.join(dir, 'mindlore.db'));
39
+ const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
40
40
  const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all();
41
41
  const names = tables.map(t => t.name);
42
42
  expect(names).toContain('vocabulary');
@@ -66,14 +66,14 @@ describe('v0.6.3 migrations', () => {
66
66
  });
67
67
  test('schema version is 19 after migration', () => {
68
68
  const dir = makeTmpDir();
69
- const db = (0, db_js_1.createTestDbWithMigrations)(path_1.default.join(dir, 'mindlore.db'));
69
+ const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
70
70
  const row = db.prepare('SELECT MAX(version) as v FROM schema_versions').get();
71
71
  expect(row.v).toBe(19);
72
72
  cleanup(dir, db);
73
73
  });
74
74
  test('vocabulary table accepts inserts and dedup', () => {
75
75
  const dir = makeTmpDir();
76
- const db = (0, db_js_1.createTestDbWithMigrations)(path_1.default.join(dir, 'mindlore.db'));
76
+ const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
77
77
  db.prepare('INSERT INTO vocabulary (word) VALUES (?)').run('typescript');
78
78
  db.prepare('INSERT OR IGNORE INTO vocabulary (word) VALUES (?)').run('typescript');
79
79
  const count = db.prepare('SELECT COUNT(*) as c FROM vocabulary').get().c;
@@ -12,13 +12,16 @@ const migrations_v068_js_1 = require("../scripts/lib/migrations-v068.js");
12
12
  const schema_version_js_1 = require("../scripts/lib/schema-version.js");
13
13
  describe('V068 Migrations', () => {
14
14
  let db;
15
- const dbPath = path_1.default.join(os_1.default.tmpdir(), `mindlore-v068-test-${Date.now()}.db`);
15
+ let tmpDir;
16
+ let dbPath;
16
17
  beforeEach(() => {
17
- db = (0, db_js_1.createTestDbWithMigrations)(dbPath);
18
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-v068-test-'));
19
+ dbPath = path_1.default.join(tmpDir, 'test.db');
20
+ db = (0, db_js_1.createTestDbWithFullSchema)(dbPath);
18
21
  });
19
22
  afterEach(() => {
20
23
  db.close();
21
- fs_1.default.unlinkSync(dbPath);
24
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
22
25
  });
23
26
  test('v18: creates injected_at index', () => {
24
27
  (0, schema_version_js_1.runMigrations)(db, migrations_v068_js_1.V068_MIGRATIONS);
@@ -1 +1 @@
1
- {"version":3,"file":"migrations-v068.test.js","sourceRoot":"","sources":["../../tests/migrations-v068.test.ts"],"names":[],"mappings":";AAAA,gEAAgE;;;;;AAGhE,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,2CAA6D;AAC7D,0EAAoE;AACpE,wEAAiE;AAEjE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,EAAqB,CAAC;IAC1B,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,sBAAsB,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7E,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAA,kCAA0B,EAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,qFAAqF,CACtF,CAAC,GAAG,EAA6B,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,gEAAgE;QAChE,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG;YAChB,oBAAoB,EAAE,sBAAsB;YAC5C,sBAAsB,EAAE,+BAA+B;YACvD,gCAAgC,EAAE,8BAA8B;YAChE,yBAAyB;SAC1B,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,EAAE,CAAC,IAAI,CAAC,+BAA+B,KAAK,4BAA4B,CAAC,CAAC;QAC5E,CAAC;QACD,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,kFAAkF,CACnF,CAAC,GAAG,EAA6B,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"migrations-v068.test.js","sourceRoot":"","sources":["../../tests/migrations-v068.test.ts"],"names":[],"mappings":";AAAA,gEAAgE;;;;;AAGhE,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,2CAA6D;AAC7D,0EAAoE;AACpE,wEAAiE;AAEjE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,EAAqB,CAAC;IAC1B,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACvE,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtC,EAAE,GAAG,IAAA,kCAA0B,EAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,qFAAqF,CACtF,CAAC,GAAG,EAA6B,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,gEAAgE;QAChE,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG;YAChB,oBAAoB,EAAE,sBAAsB;YAC5C,sBAAsB,EAAE,+BAA+B;YACvD,gCAAgC,EAAE,8BAA8B;YAChE,yBAAyB;SAC1B,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;YAC9B,EAAE,CAAC,IAAI,CAAC,+BAA+B,KAAK,4BAA4B,CAAC,CAAC;QAC5E,CAAC;QACD,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,kFAAkF,CACnF,CAAC,GAAG,EAA6B,CAAC;QACnC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAa,EAAC,EAAE,EAAE,oCAAe,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -7,20 +7,20 @@ const path_1 = __importDefault(require("path"));
7
7
  const os_1 = __importDefault(require("os"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const db_js_1 = require("./helpers/db.js");
10
- // NOT: createTestDbWithMigrations kullanılıyor (createTestDbWithFullSchema değil)
11
- // çünkü bu test v18 migration'a bağımlı değil. R5 (Task 16) sonrası
12
- // createTestDbWithFullSchema'ya geçiş opsiyonel.
13
10
  const { getNominationCounts } = require('../hooks/lib/mindlore-common.cjs');
14
11
  describe('getNominationCounts', () => {
15
12
  let db;
16
- const dbPath = path_1.default.join(os_1.default.tmpdir(), `mindlore-nom-counts-${Date.now()}.db`);
13
+ let tmpDir;
14
+ let dbPath;
17
15
  beforeEach(() => {
18
- db = (0, db_js_1.createTestDbWithMigrations)(dbPath);
16
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-nom-counts-'));
17
+ dbPath = path_1.default.join(tmpDir, 'test.db');
18
+ db = (0, db_js_1.createTestDbWithFullSchema)(dbPath);
19
19
  });
20
20
  afterEach(() => {
21
21
  db.close();
22
22
  try {
23
- fs_1.default.unlinkSync(dbPath);
23
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
24
24
  }
25
25
  catch { }
26
26
  });
@@ -1 +1 @@
1
- {"version":3,"file":"nomination-counts.test.js","sourceRoot":"","sources":["../../tests/nomination-counts.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nomination-counts.test.js","sourceRoot":"","sources":["../../tests/nomination-counts.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const fs_1 = __importDefault(require("fs"));
7
7
  const path_1 = __importDefault(require("path"));
8
+ const os_1 = __importDefault(require("os"));
8
9
  const child_process_1 = require("child_process");
9
10
  const exec_js_1 = require("./helpers/exec.js");
10
11
  const HOOK_PATH = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-pre-compact.cjs');
@@ -24,7 +25,7 @@ function runHook(cwd) {
24
25
  describe('mindlore-pre-compact hook', () => {
25
26
  let testDir;
26
27
  beforeEach(() => {
27
- testDir = path_1.default.join(__dirname, `.test-pre-compact-${Date.now()}`);
28
+ testDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-pre-compact-'));
28
29
  const mindloreDir = path_1.default.join(testDir, '.mindlore');
29
30
  fs_1.default.mkdirSync(path_1.default.join(mindloreDir, 'episodes'), { recursive: true });
30
31
  fs_1.default.writeFileSync(path_1.default.join(mindloreDir, 'log.md'), '');
@@ -1 +1 @@
1
- {"version":3,"file":"pre-compact.test.js","sourceRoot":"","sources":["../../tests/pre-compact.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,iDAA6C;AAC7C,+CAAkD;AAElD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;AAElF,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,IAAA,4BAAY,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;YACvC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;YACrF,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpD,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,OAAO,CAAC,OAAO,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,YAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"pre-compact.test.js","sourceRoot":"","sources":["../../tests/pre-compact.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,iDAA6C;AAC7C,+CAAkD;AAElD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,CAAC,CAAC;AAElF,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,OAAO,IAAA,4BAAY,EAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE;YACvC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;YACrF,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,OAAe,CAAC;IAEpB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpD,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,OAAO,CAAC,OAAO,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,YAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;QACpF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -12,22 +12,23 @@ const migrations_js_1 = require("../scripts/lib/migrations.js");
12
12
  const migrations_v052_js_1 = require("../scripts/lib/migrations-v052.js");
13
13
  const migrations_v053_js_1 = require("../scripts/lib/migrations-v053.js");
14
14
  describe('Recall Telemetry', () => {
15
- const tmpDir = path_1.default.join(os_1.default.tmpdir(), `mindlore-recall-${Date.now()}`);
16
- const dbPath = path_1.default.join(tmpDir, 'mindlore.db');
15
+ let tmpDir;
16
+ let dbPath;
17
17
  beforeEach(() => {
18
- fs_1.default.mkdirSync(tmpDir, { recursive: true });
18
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-recall-'));
19
+ dbPath = path_1.default.join(tmpDir, 'mindlore.db');
19
20
  const db = new better_sqlite3_1.default(dbPath);
20
- db.exec(`
21
- CREATE TABLE IF NOT EXISTS file_hashes (path TEXT PRIMARY KEY, hash TEXT, last_indexed TEXT);
22
- CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts USING fts5(
23
- path, slug, description, type, category, title, content, tags, quality, date_captured, project
24
- );
21
+ db.exec(`
22
+ CREATE TABLE IF NOT EXISTS file_hashes (path TEXT PRIMARY KEY, hash TEXT, last_indexed TEXT);
23
+ CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts USING fts5(
24
+ path, slug, description, type, category, title, content, tags, quality, date_captured, project
25
+ );
25
26
  `);
26
27
  (0, schema_version_js_1.ensureSchemaTable)(db);
27
28
  (0, schema_version_js_1.runMigrations)(db, [...migrations_js_1.V050_MIGRATIONS, ...migrations_js_1.V051_MIGRATIONS, ...migrations_v052_js_1.V052_MIGRATIONS, ...migrations_v053_js_1.V053_MIGRATIONS]);
28
- db.exec(`
29
- INSERT INTO file_hashes (path, hash, last_indexed, recall_count, last_recalled_at)
30
- VALUES ('/test/file.md', 'abc123', '2026-01-01', 0, NULL);
29
+ db.exec(`
30
+ INSERT INTO file_hashes (path, hash, last_indexed, recall_count, last_recalled_at)
31
+ VALUES ('/test/file.md', 'abc123', '2026-01-01', 0, NULL);
31
32
  `);
32
33
  db.close();
33
34
  });