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.
- package/README.md +259 -259
- package/SCHEMA.md +292 -292
- package/dist/scripts/cc-memory-bulk-sync.d.ts.map +1 -1
- package/dist/scripts/cc-memory-bulk-sync.js +4 -2
- package/dist/scripts/cc-memory-bulk-sync.js.map +1 -1
- package/dist/scripts/cc-session-sync.d.ts.map +1 -1
- package/dist/scripts/cc-session-sync.js +9 -7
- package/dist/scripts/cc-session-sync.js.map +1 -1
- package/dist/scripts/fetch-raw.js +5 -4
- package/dist/scripts/fetch-raw.js.map +1 -1
- package/dist/scripts/init.js +16 -12
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/consolidation.js +10 -10
- package/dist/scripts/lib/constants.d.ts +3 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +11 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/decay.js +9 -9
- package/dist/scripts/lib/episodes.js +23 -23
- package/dist/scripts/lib/err-msg.d.ts +2 -0
- package/dist/scripts/lib/err-msg.d.ts.map +1 -0
- package/dist/scripts/lib/err-msg.js +7 -0
- package/dist/scripts/lib/err-msg.js.map +1 -0
- package/dist/scripts/lib/mcp-namespace.d.ts +2 -0
- package/dist/scripts/lib/mcp-namespace.d.ts.map +1 -0
- package/dist/scripts/lib/mcp-namespace.js +21 -0
- package/dist/scripts/lib/mcp-namespace.js.map +1 -0
- package/dist/scripts/lib/mcp-telemetry.d.ts +11 -0
- package/dist/scripts/lib/mcp-telemetry.d.ts.map +1 -0
- package/dist/scripts/lib/mcp-telemetry.js +37 -0
- package/dist/scripts/lib/mcp-telemetry.js.map +1 -0
- package/dist/scripts/lib/mcp-tools.d.ts +10 -0
- package/dist/scripts/lib/mcp-tools.d.ts.map +1 -0
- package/dist/scripts/lib/mcp-tools.js +121 -0
- package/dist/scripts/lib/mcp-tools.js.map +1 -0
- package/dist/scripts/lib/migrations-v061.js +21 -21
- package/dist/scripts/lib/migrations-v062.js +11 -11
- package/dist/scripts/lib/migrations-v063.js +14 -14
- package/dist/scripts/lib/migrations-v067.js +11 -11
- package/dist/scripts/lib/rrf.d.ts.map +1 -1
- package/dist/scripts/lib/rrf.js +2 -1
- package/dist/scripts/lib/rrf.js.map +1 -1
- package/dist/scripts/lib/schema-version.js +6 -6
- package/dist/scripts/lib/search-cache.js +11 -11
- package/dist/scripts/lib/search-engine.d.ts +1 -0
- package/dist/scripts/lib/search-engine.d.ts.map +1 -1
- package/dist/scripts/lib/search-engine.js +9 -5
- package/dist/scripts/lib/search-engine.js.map +1 -1
- package/dist/scripts/lib/secure-io.d.ts +11 -0
- package/dist/scripts/lib/secure-io.d.ts.map +1 -0
- package/dist/scripts/lib/secure-io.js +26 -0
- package/dist/scripts/lib/secure-io.js.map +1 -0
- package/dist/scripts/lib/session-payload.js +7 -7
- package/dist/scripts/lib/slugify.d.ts +2 -0
- package/dist/scripts/lib/slugify.d.ts.map +1 -0
- package/dist/scripts/lib/slugify.js +13 -0
- package/dist/scripts/lib/slugify.js.map +1 -0
- package/dist/scripts/lib/smart-snippet.d.ts +9 -0
- package/dist/scripts/lib/smart-snippet.d.ts.map +1 -0
- package/dist/scripts/lib/smart-snippet.js +47 -0
- package/dist/scripts/lib/smart-snippet.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/brief-adapter.d.ts +15 -0
- package/dist/scripts/lib/tool-adapters/brief-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/brief-adapter.js +66 -0
- package/dist/scripts/lib/tool-adapters/brief-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts +31 -0
- package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/decide-adapter.js +71 -0
- package/dist/scripts/lib/tool-adapters/decide-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/ingest-adapter.d.ts +16 -0
- package/dist/scripts/lib/tool-adapters/ingest-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/ingest-adapter.js +58 -0
- package/dist/scripts/lib/tool-adapters/ingest-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/recall-adapter.d.ts +20 -0
- package/dist/scripts/lib/tool-adapters/recall-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/recall-adapter.js +69 -0
- package/dist/scripts/lib/tool-adapters/recall-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.d.ts +22 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.js +32 -0
- package/dist/scripts/lib/tool-adapters/search-adapter.js.map +1 -0
- package/dist/scripts/lib/tool-adapters/stats-adapter.d.ts +15 -0
- package/dist/scripts/lib/tool-adapters/stats-adapter.d.ts.map +1 -0
- package/dist/scripts/lib/tool-adapters/stats-adapter.js +66 -0
- package/dist/scripts/lib/tool-adapters/stats-adapter.js.map +1 -0
- package/dist/scripts/lib/triage.js +3 -3
- package/dist/scripts/lib/validate-manifest.d.ts +8 -0
- package/dist/scripts/lib/validate-manifest.d.ts.map +1 -0
- package/dist/scripts/lib/validate-manifest.js +80 -0
- package/dist/scripts/lib/validate-manifest.js.map +1 -0
- package/dist/scripts/maintain-cleanup.d.ts.map +1 -1
- package/dist/scripts/maintain-cleanup.js +3 -2
- package/dist/scripts/maintain-cleanup.js.map +1 -1
- package/dist/scripts/mcp-server.d.ts +3 -0
- package/dist/scripts/mcp-server.d.ts.map +1 -0
- package/dist/scripts/mcp-server.js +85 -0
- package/dist/scripts/mcp-server.js.map +1 -0
- package/dist/scripts/mindlore-backup.js +9 -9
- package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
- package/dist/scripts/mindlore-doctor.js +4 -6
- package/dist/scripts/mindlore-doctor.js.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +12 -12
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
- package/dist/scripts/mindlore-health-check.js +2 -2
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/scripts/validate-manifest-cli.d.ts +2 -0
- package/dist/scripts/validate-manifest-cli.d.ts.map +1 -0
- package/dist/scripts/validate-manifest-cli.js +38 -0
- package/dist/scripts/validate-manifest-cli.js.map +1 -0
- package/dist/tests/cc-memory-sync.test.js +3 -3
- package/dist/tests/chunks-migration.test.js +1 -1
- package/dist/tests/compaction-snapshot.test.js +2 -2
- package/dist/tests/consolidation.test.js +3 -3
- package/dist/tests/decay.test.js +9 -9
- package/dist/tests/diary.test.js +4 -4
- package/dist/tests/episode-file.test.js +2 -1
- package/dist/tests/episode-file.test.js.map +1 -1
- package/dist/tests/episodes-inject.test.js +9 -9
- package/dist/tests/err-msg.test.d.ts +2 -0
- package/dist/tests/err-msg.test.d.ts.map +1 -0
- package/dist/tests/err-msg.test.js +24 -0
- package/dist/tests/err-msg.test.js.map +1 -0
- package/dist/tests/fetch-raw.test.js +1 -2
- package/dist/tests/fetch-raw.test.js.map +1 -1
- package/dist/tests/fts5.test.js +75 -75
- package/dist/tests/fuzzy.test.js +1 -1
- package/dist/tests/git-snapshot.test.js +3 -5
- package/dist/tests/git-snapshot.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts +1 -2
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +18 -26
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/manifest-v2.test.d.ts +2 -0
- package/dist/tests/manifest-v2.test.d.ts.map +1 -0
- package/dist/tests/manifest-v2.test.js +67 -0
- package/dist/tests/manifest-v2.test.js.map +1 -0
- package/dist/tests/mcp-server.test.d.ts +2 -0
- package/dist/tests/mcp-server.test.d.ts.map +1 -0
- package/dist/tests/mcp-server.test.js +118 -0
- package/dist/tests/mcp-server.test.js.map +1 -0
- package/dist/tests/mcp-tools.test.d.ts +2 -0
- package/dist/tests/mcp-tools.test.d.ts.map +1 -0
- package/dist/tests/mcp-tools.test.js +243 -0
- package/dist/tests/mcp-tools.test.js.map +1 -0
- package/dist/tests/migrations-v053.test.js +16 -16
- package/dist/tests/migrations-v061.test.js +10 -10
- package/dist/tests/migrations-v063.test.js +4 -4
- package/dist/tests/migrations-v068.test.js +6 -3
- package/dist/tests/migrations-v068.test.js.map +1 -1
- package/dist/tests/nomination-counts.test.js +6 -6
- package/dist/tests/nomination-counts.test.js.map +1 -1
- package/dist/tests/pre-compact.test.js +2 -1
- package/dist/tests/pre-compact.test.js.map +1 -1
- package/dist/tests/recall-telemetry.test.js +12 -11
- package/dist/tests/recall-telemetry.test.js.map +1 -1
- package/dist/tests/rrf.test.js +3 -3
- package/dist/tests/search-engine.test.js +1 -1
- package/dist/tests/search-hook.test.js +2 -2
- package/dist/tests/search-offload.test.js +1 -1
- package/dist/tests/search-offload.test.js.map +1 -1
- package/dist/tests/secure-io.test.d.ts +2 -0
- package/dist/tests/secure-io.test.d.ts.map +1 -0
- package/dist/tests/secure-io.test.js +65 -0
- package/dist/tests/secure-io.test.js.map +1 -0
- package/dist/tests/session-payload.test.js +1 -1
- package/dist/tests/session-summary.test.js +1 -1
- package/dist/tests/similarity.test.js +1 -1
- package/dist/tests/skill-path-resolution.test.js +22 -3
- package/dist/tests/skill-path-resolution.test.js.map +1 -1
- package/dist/tests/smart-snippet.test.d.ts +2 -0
- package/dist/tests/smart-snippet.test.d.ts.map +1 -0
- package/dist/tests/smart-snippet.test.js +67 -0
- package/dist/tests/smart-snippet.test.js.map +1 -0
- package/dist/tests/triage.test.js +1 -1
- package/hooks/lib/constants.cjs +15 -15
- package/hooks/lib/mindlore-common.cjs +975 -974
- package/hooks/mindlore-cwd-changed.cjs +57 -57
- package/hooks/mindlore-decision-detector.cjs +54 -54
- package/hooks/mindlore-dont-repeat.cjs +222 -222
- package/hooks/mindlore-fts5-sync.cjs +98 -97
- package/hooks/mindlore-index.cjs +230 -229
- package/hooks/mindlore-model-router.cjs +54 -54
- package/hooks/mindlore-post-compact.cjs +69 -69
- package/hooks/mindlore-post-read.cjs +106 -106
- package/hooks/mindlore-pre-compact.cjs +154 -154
- package/hooks/mindlore-read-guard.cjs +105 -105
- package/hooks/mindlore-research-guard.cjs +176 -176
- package/hooks/mindlore-search.cjs +200 -200
- package/hooks/mindlore-session-end.cjs +510 -509
- package/hooks/mindlore-session-focus.cjs +256 -256
- package/package.json +77 -75
- package/plugin.json +8 -1
- package/skills/mindlore-diary/SKILL.md +85 -85
- package/skills/mindlore-evolve/SKILL.md +126 -126
- package/skills/mindlore-explore/SKILL.md +109 -109
- package/skills/mindlore-ingest/SKILL.md +195 -195
- package/skills/mindlore-maintain/SKILL.md +125 -125
- package/skills/mindlore-query/SKILL.md +151 -151
- package/skills/mindlore-reflect/SKILL.md +141 -141
- package/skills/mindlore-stats/SKILL.md +106 -106
- package/templates/INDEX.md +14 -14
- package/templates/SCHEMA.md +292 -292
- package/templates/config.json +1 -1
- package/templates/extraction/article.md +15 -15
- package/templates/extraction/changelog.md +15 -15
- package/templates/extraction/default.md +15 -15
- package/templates/extraction/docs.md +15 -15
- 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 @@
|
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
15
|
+
let tmpDir;
|
|
16
|
+
let dbPath;
|
|
16
17
|
beforeEach(() => {
|
|
17
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
13
|
+
let tmpDir;
|
|
14
|
+
let dbPath;
|
|
17
15
|
beforeEach(() => {
|
|
18
|
-
|
|
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.
|
|
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":";;;;;AACA,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AACpB,2CAA4E;AAE5E,
|
|
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(
|
|
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,
|
|
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
|
-
|
|
16
|
-
|
|
15
|
+
let tmpDir;
|
|
16
|
+
let dbPath;
|
|
17
17
|
beforeEach(() => {
|
|
18
|
-
fs_1.default.
|
|
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
|
});
|