mindlore 0.5.1 → 0.5.3
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 +16 -2
- package/dist/scripts/cc-memory-bulk-sync.d.ts +26 -0
- package/dist/scripts/cc-memory-bulk-sync.d.ts.map +1 -0
- package/dist/scripts/cc-memory-bulk-sync.js +177 -0
- package/dist/scripts/cc-memory-bulk-sync.js.map +1 -0
- package/dist/scripts/fetch-raw.d.ts +2 -0
- package/dist/scripts/fetch-raw.d.ts.map +1 -0
- package/dist/scripts/fetch-raw.js +124 -0
- package/dist/scripts/fetch-raw.js.map +1 -0
- package/dist/scripts/lib/consolidation.d.ts +17 -0
- package/dist/scripts/lib/consolidation.d.ts.map +1 -0
- package/dist/scripts/lib/consolidation.js +55 -0
- package/dist/scripts/lib/consolidation.js.map +1 -0
- package/dist/scripts/lib/constants.d.ts +5 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +16 -4
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/db-helpers.d.ts +12 -2
- package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
- package/dist/scripts/lib/db-helpers.js +36 -0
- package/dist/scripts/lib/db-helpers.js.map +1 -1
- package/dist/scripts/lib/decay.d.ts +21 -0
- package/dist/scripts/lib/decay.d.ts.map +1 -0
- package/dist/scripts/lib/decay.js +50 -0
- package/dist/scripts/lib/decay.js.map +1 -0
- package/dist/scripts/lib/hybrid-search.d.ts +0 -2
- package/dist/scripts/lib/hybrid-search.d.ts.map +1 -1
- package/dist/scripts/lib/hybrid-search.js +7 -1
- package/dist/scripts/lib/hybrid-search.js.map +1 -1
- package/dist/scripts/lib/migrations-v052.d.ts +3 -0
- package/dist/scripts/lib/migrations-v052.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v052.js +23 -0
- package/dist/scripts/lib/migrations-v052.js.map +1 -0
- package/dist/scripts/lib/migrations-v053.d.ts +3 -0
- package/dist/scripts/lib/migrations-v053.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v053.js +52 -0
- package/dist/scripts/lib/migrations-v053.js.map +1 -0
- package/dist/scripts/lib/skeleton.d.ts +2 -0
- package/dist/scripts/lib/skeleton.d.ts.map +1 -0
- package/dist/scripts/lib/skeleton.js +99 -0
- package/dist/scripts/lib/skeleton.js.map +1 -0
- package/dist/scripts/lib/skill-memory.d.ts +13 -0
- package/dist/scripts/lib/skill-memory.d.ts.map +1 -0
- package/dist/scripts/lib/skill-memory.js +94 -0
- package/dist/scripts/lib/skill-memory.js.map +1 -0
- package/dist/scripts/mindlore-backup.d.ts +1 -1
- package/dist/scripts/mindlore-backup.d.ts.map +1 -1
- package/dist/scripts/mindlore-backup.js +23 -0
- package/dist/scripts/mindlore-backup.js.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +3 -1
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-health-check.d.ts +1 -1
- package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
- package/dist/scripts/mindlore-health-check.js +138 -136
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/tests/catch-up.test.d.ts +2 -0
- package/dist/tests/catch-up.test.d.ts.map +1 -0
- package/dist/tests/catch-up.test.js +88 -0
- package/dist/tests/catch-up.test.js.map +1 -0
- package/dist/tests/cc-memory-bulk-sync.test.d.ts +2 -0
- package/dist/tests/cc-memory-bulk-sync.test.d.ts.map +1 -0
- package/dist/tests/cc-memory-bulk-sync.test.js +116 -0
- package/dist/tests/cc-memory-bulk-sync.test.js.map +1 -0
- package/dist/tests/consolidation.test.d.ts +2 -0
- package/dist/tests/consolidation.test.d.ts.map +1 -0
- package/dist/tests/consolidation.test.js +77 -0
- package/dist/tests/consolidation.test.js.map +1 -0
- package/dist/tests/decay.test.d.ts +2 -0
- package/dist/tests/decay.test.d.ts.map +1 -0
- package/dist/tests/decay.test.js +92 -0
- package/dist/tests/decay.test.js.map +1 -0
- package/dist/tests/episode-file.test.js +9 -6
- package/dist/tests/episode-file.test.js.map +1 -1
- package/dist/tests/fetch-raw.test.d.ts +2 -0
- package/dist/tests/fetch-raw.test.d.ts.map +1 -0
- package/dist/tests/fetch-raw.test.js +43 -0
- package/dist/tests/fetch-raw.test.js.map +1 -0
- package/dist/tests/git-snapshot.test.d.ts +2 -0
- package/dist/tests/git-snapshot.test.d.ts.map +1 -0
- package/dist/tests/git-snapshot.test.js +36 -0
- package/dist/tests/git-snapshot.test.js.map +1 -0
- package/dist/tests/migrations-v053.test.d.ts +2 -0
- package/dist/tests/migrations-v053.test.d.ts.map +1 -0
- package/dist/tests/migrations-v053.test.js +113 -0
- package/dist/tests/migrations-v053.test.js.map +1 -0
- package/dist/tests/recall-telemetry.test.d.ts +2 -0
- package/dist/tests/recall-telemetry.test.d.ts.map +1 -0
- package/dist/tests/recall-telemetry.test.js +56 -0
- package/dist/tests/recall-telemetry.test.js.map +1 -0
- package/dist/tests/resolve-hook-common.test.d.ts +2 -0
- package/dist/tests/resolve-hook-common.test.d.ts.map +1 -0
- package/dist/tests/resolve-hook-common.test.js +30 -0
- package/dist/tests/resolve-hook-common.test.js.map +1 -0
- package/dist/tests/search-offload.test.d.ts +2 -0
- package/dist/tests/search-offload.test.d.ts.map +1 -0
- package/dist/tests/search-offload.test.js +34 -0
- package/dist/tests/search-offload.test.js.map +1 -0
- package/dist/tests/skeleton.test.d.ts +2 -0
- package/dist/tests/skeleton.test.d.ts.map +1 -0
- package/dist/tests/skeleton.test.js +116 -0
- package/dist/tests/skeleton.test.js.map +1 -0
- package/dist/tests/skill-memory-api.test.d.ts +2 -0
- package/dist/tests/skill-memory-api.test.d.ts.map +1 -0
- package/dist/tests/skill-memory-api.test.js +62 -0
- package/dist/tests/skill-memory-api.test.js.map +1 -0
- package/dist/tests/skill-memory.test.d.ts +2 -0
- package/dist/tests/skill-memory.test.d.ts.map +1 -0
- package/dist/tests/skill-memory.test.js +67 -0
- package/dist/tests/skill-memory.test.js.map +1 -0
- package/dist/tests/skill-path-resolution.test.d.ts +2 -0
- package/dist/tests/skill-path-resolution.test.d.ts.map +1 -0
- package/dist/tests/skill-path-resolution.test.js +42 -0
- package/dist/tests/skill-path-resolution.test.js.map +1 -0
- package/dist/tests/wiki-lint.test.d.ts +2 -0
- package/dist/tests/wiki-lint.test.d.ts.map +1 -0
- package/dist/tests/wiki-lint.test.js +47 -0
- package/dist/tests/wiki-lint.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +53 -6
- package/hooks/mindlore-cwd-changed.cjs +2 -2
- package/hooks/mindlore-decision-detector.cjs +2 -2
- package/hooks/mindlore-dont-repeat.cjs +2 -2
- package/hooks/mindlore-fts5-sync.cjs +2 -2
- package/hooks/mindlore-index.cjs +60 -2
- package/hooks/mindlore-model-router.cjs +2 -2
- package/hooks/mindlore-post-compact.cjs +2 -2
- package/hooks/mindlore-post-read.cjs +2 -2
- package/hooks/mindlore-pre-compact.cjs +2 -2
- package/hooks/mindlore-read-guard.cjs +15 -3
- package/hooks/mindlore-research-guard.cjs +2 -2
- package/hooks/mindlore-search.cjs +30 -3
- package/hooks/mindlore-session-end.cjs +1 -1
- package/hooks/mindlore-session-focus.cjs +12 -0
- package/package.json +4 -2
- package/plugin.json +34 -2
- package/skills/mindlore-decide/SKILL.md +9 -0
- package/skills/mindlore-diary/SKILL.md +85 -0
- package/skills/mindlore-evolve/SKILL.md +24 -1
- package/skills/mindlore-health/SKILL.md +10 -1
- package/skills/mindlore-ingest/SKILL.md +64 -52
- package/skills/mindlore-log/SKILL.md +12 -143
- package/skills/mindlore-maintain/SKILL.md +119 -0
- package/skills/mindlore-query/SKILL.md +9 -0
- package/skills/mindlore-reflect/SKILL.md +131 -0
- package/templates/config.json +8 -1
|
@@ -0,0 +1,113 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const schema_version_js_1 = require("../scripts/lib/schema-version.js");
|
|
11
|
+
const migrations_js_1 = require("../scripts/lib/migrations.js");
|
|
12
|
+
const migrations_v052_js_1 = require("../scripts/lib/migrations-v052.js");
|
|
13
|
+
const migrations_v053_js_1 = require("../scripts/lib/migrations-v053.js");
|
|
14
|
+
const ALL_MIGRATIONS = [...migrations_js_1.V050_MIGRATIONS, ...migrations_js_1.V051_MIGRATIONS, ...migrations_v052_js_1.V052_MIGRATIONS, ...migrations_v053_js_1.V053_MIGRATIONS];
|
|
15
|
+
const { SQL_FTS_CREATE } = require('../hooks/lib/mindlore-common.cjs');
|
|
16
|
+
function createBaseDb(dbPath) {
|
|
17
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
18
|
+
db.pragma('journal_mode = WAL');
|
|
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
|
+
);
|
|
26
|
+
`);
|
|
27
|
+
(0, schema_version_js_1.ensureSchemaTable)(db);
|
|
28
|
+
return db;
|
|
29
|
+
}
|
|
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
|
+
);
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
describe('v0.5.3 Migrations', () => {
|
|
44
|
+
let tmpDir;
|
|
45
|
+
let dbPath;
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-v053-'));
|
|
48
|
+
dbPath = path_1.default.join(tmpDir, 'test.db');
|
|
49
|
+
});
|
|
50
|
+
afterEach(() => {
|
|
51
|
+
fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
52
|
+
});
|
|
53
|
+
test('v4 should add recall_count and last_recalled_at to file_hashes', () => {
|
|
54
|
+
const db = createBaseDb(dbPath);
|
|
55
|
+
(0, schema_version_js_1.runMigrations)(db, ALL_MIGRATIONS);
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test: pragma returns array of objects
|
|
57
|
+
const cols = db.pragma('table_info(file_hashes)');
|
|
58
|
+
const colNames = cols.map(c => c.name);
|
|
59
|
+
expect(colNames).toContain('recall_count');
|
|
60
|
+
expect(colNames).toContain('last_recalled_at');
|
|
61
|
+
expect(colNames).toContain('archived_at');
|
|
62
|
+
expect(colNames).toContain('importance');
|
|
63
|
+
db.close();
|
|
64
|
+
});
|
|
65
|
+
test('v5 should add consolidation columns to episodes', () => {
|
|
66
|
+
const db = createBaseDb(dbPath);
|
|
67
|
+
addEpisodesTable(db);
|
|
68
|
+
(0, schema_version_js_1.runMigrations)(db, ALL_MIGRATIONS);
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test: pragma returns array of objects
|
|
70
|
+
const cols = db.pragma('table_info(episodes)');
|
|
71
|
+
const colNames = cols.map(c => c.name);
|
|
72
|
+
expect(colNames).toContain('consolidation_status');
|
|
73
|
+
expect(colNames).toContain('consolidated_into');
|
|
74
|
+
expect(colNames).toContain('decay_score');
|
|
75
|
+
expect(colNames).toContain('last_decay_calc');
|
|
76
|
+
db.close();
|
|
77
|
+
});
|
|
78
|
+
test('v4+v5 should not corrupt existing data (backward compat)', () => {
|
|
79
|
+
const db = createBaseDb(dbPath);
|
|
80
|
+
addEpisodesTable(db);
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run('/test/file.md', 'abc123', now);
|
|
83
|
+
db.prepare('INSERT INTO episodes (session_id, timestamp, summary, project) VALUES (?, ?, ?, ?)').run('sess-1', now, 'Test episode summary', 'mindlore');
|
|
84
|
+
(0, schema_version_js_1.runMigrations)(db, ALL_MIGRATIONS);
|
|
85
|
+
// Verify existing file_hashes row intact + new column defaults
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test: better-sqlite3 .get() returns unknown
|
|
87
|
+
const fhRow = db.prepare('SELECT * FROM file_hashes WHERE path = ?').get('/test/file.md');
|
|
88
|
+
expect(fhRow.content_hash).toBe('abc123');
|
|
89
|
+
expect(fhRow.recall_count).toBe(0);
|
|
90
|
+
expect(fhRow.importance).toBe(1.0);
|
|
91
|
+
expect(fhRow.last_recalled_at).toBeNull();
|
|
92
|
+
expect(fhRow.archived_at).toBeNull();
|
|
93
|
+
// Verify existing episodes row intact + new column defaults
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- test: better-sqlite3 .get() returns unknown
|
|
95
|
+
const epRow = db.prepare('SELECT * FROM episodes WHERE session_id = ?').get('sess-1');
|
|
96
|
+
expect(epRow.summary).toBe('Test episode summary');
|
|
97
|
+
expect(epRow.consolidation_status).toBe('raw');
|
|
98
|
+
expect(epRow.consolidated_into).toBeNull();
|
|
99
|
+
expect(epRow.decay_score).toBeNull();
|
|
100
|
+
expect(epRow.last_decay_calc).toBeNull();
|
|
101
|
+
db.close();
|
|
102
|
+
});
|
|
103
|
+
test('migrations should be idempotent', () => {
|
|
104
|
+
const db = createBaseDb(dbPath);
|
|
105
|
+
addEpisodesTable(db);
|
|
106
|
+
expect(() => {
|
|
107
|
+
(0, schema_version_js_1.runMigrations)(db, ALL_MIGRATIONS);
|
|
108
|
+
(0, schema_version_js_1.runMigrations)(db, ALL_MIGRATIONS);
|
|
109
|
+
}).not.toThrow();
|
|
110
|
+
db.close();
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=migrations-v053.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations-v053.test.js","sourceRoot":"","sources":["../../tests/migrations-v053.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-telemetry.test.d.ts","sourceRoot":"","sources":["../../tests/recall-telemetry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
10
|
+
const schema_version_js_1 = require("../scripts/lib/schema-version.js");
|
|
11
|
+
const migrations_js_1 = require("../scripts/lib/migrations.js");
|
|
12
|
+
const migrations_v052_js_1 = require("../scripts/lib/migrations-v052.js");
|
|
13
|
+
const migrations_v053_js_1 = require("../scripts/lib/migrations-v053.js");
|
|
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');
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
fs_1.default.mkdirSync(tmpDir, { recursive: true });
|
|
19
|
+
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
|
+
);
|
|
25
|
+
`);
|
|
26
|
+
(0, schema_version_js_1.ensureSchemaTable)(db);
|
|
27
|
+
(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);
|
|
31
|
+
`);
|
|
32
|
+
db.close();
|
|
33
|
+
});
|
|
34
|
+
afterEach(() => fs_1.default.rmSync(tmpDir, { recursive: true, force: true }));
|
|
35
|
+
test('incrementRecallCount should update recall_count and last_recalled_at', () => {
|
|
36
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
37
|
+
const { incrementRecallCount } = require('../hooks/lib/mindlore-common.cjs');
|
|
38
|
+
incrementRecallCount(db, '/test/file.md');
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown, narrowing to expected row shape
|
|
40
|
+
const row = db.prepare('SELECT recall_count, last_recalled_at FROM file_hashes WHERE path = ?').get('/test/file.md');
|
|
41
|
+
expect(row.recall_count).toBe(1);
|
|
42
|
+
expect(row.last_recalled_at).toBeTruthy();
|
|
43
|
+
incrementRecallCount(db, '/test/file.md');
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown, narrowing to expected row shape
|
|
45
|
+
const row2 = db.prepare('SELECT recall_count FROM file_hashes WHERE path = ?').get('/test/file.md');
|
|
46
|
+
expect(row2.recall_count).toBe(2);
|
|
47
|
+
db.close();
|
|
48
|
+
});
|
|
49
|
+
test('incrementRecallCount should not error on missing path', () => {
|
|
50
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
51
|
+
const { incrementRecallCount } = require('../hooks/lib/mindlore-common.cjs');
|
|
52
|
+
expect(() => incrementRecallCount(db, '/nonexistent.md')).not.toThrow();
|
|
53
|
+
db.close();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=recall-telemetry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-telemetry.test.js","sourceRoot":"","sources":["../../tests/recall-telemetry.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,oEAAsC;AACtC,wEAAoF;AACpF,gEAAgF;AAChF,0EAAoE;AACpE,0EAAoE;AAEpE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEhD,UAAU,CAAC,GAAG,EAAE;QACd,YAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,EAAE,CAAC,IAAI,CAAC;;;;;KAKP,CAAC,CAAC;QACH,IAAA,qCAAiB,EAAC,EAAE,CAAC,CAAC;QACtB,IAAA,iCAAa,EAAC,EAAE,EAAE,CAAC,GAAG,+BAAe,EAAE,GAAG,+BAAe,EAAE,GAAG,oCAAe,EAAE,GAAG,oCAAe,CAAC,CAAC,CAAC;QACpG,EAAE,CAAC,IAAI,CAAC;;;KAGP,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE,CAAC,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAErE,IAAI,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAChF,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC7E,oBAAoB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC1C,iJAAiJ;QACjJ,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,uEAAuE,CAAC,CAAC,GAAG,CAAC,eAAe,CAA8D,CAAC;QAClL,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE,CAAC;QAC1C,oBAAoB,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;QAC1C,iJAAiJ;QACjJ,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,eAAe,CAA6B,CAAC;QAChI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC7E,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxE,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-hook-common.test.d.ts","sourceRoot":"","sources":["../../tests/resolve-hook-common.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
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 path_1 = __importDefault(require("path"));
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const constants_1 = require("../scripts/lib/constants");
|
|
9
|
+
describe('resolveHookCommon', () => {
|
|
10
|
+
it('resolves from scripts/lib/ (source)', () => {
|
|
11
|
+
const result = (0, constants_1.resolveHookCommon)(path_1.default.join(__dirname, '..', 'scripts', 'lib'));
|
|
12
|
+
expect(fs_1.default.existsSync(result)).toBe(true);
|
|
13
|
+
expect(result).toContain('mindlore-common.cjs');
|
|
14
|
+
});
|
|
15
|
+
it('resolves from dist/scripts/lib/ (compiled)', () => {
|
|
16
|
+
const distDir = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'lib');
|
|
17
|
+
if (fs_1.default.existsSync(distDir)) {
|
|
18
|
+
const result = (0, constants_1.resolveHookCommon)(distDir);
|
|
19
|
+
expect(fs_1.default.existsSync(result)).toBe(true);
|
|
20
|
+
expect(result).toContain('mindlore-common.cjs');
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
it('resolves from deeply nested dist path', () => {
|
|
24
|
+
const projectRoot = path_1.default.join(__dirname, '..');
|
|
25
|
+
const fakeDeep = path_1.default.join(projectRoot, 'dist', 'scripts', 'lib');
|
|
26
|
+
const result = (0, constants_1.resolveHookCommon)(fakeDeep);
|
|
27
|
+
expect(result).toContain('mindlore-common.cjs');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=resolve-hook-common.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-hook-common.test.js","sourceRoot":"","sources":["../../tests/resolve-hook-common.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,wDAA6D;AAE7D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAA,6BAAiB,EAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrE,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAA,6BAAiB,EAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-offload.test.d.ts","sourceRoot":"","sources":["../../tests/search-offload.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
describe('search hook offload+pointer', () => {
|
|
10
|
+
const tmpDir = path_1.default.join(os_1.default.tmpdir(), 'mindlore-offload-' + Date.now());
|
|
11
|
+
const mindloreDir = path_1.default.join(tmpDir, '.mindlore');
|
|
12
|
+
const tmpSubDir = path_1.default.join(mindloreDir, 'tmp');
|
|
13
|
+
beforeEach(() => { fs_1.default.mkdirSync(tmpSubDir, { recursive: true }); });
|
|
14
|
+
afterEach(() => { fs_1.default.rmSync(tmpDir, { recursive: true, force: true }); });
|
|
15
|
+
it('offloads results >10KB to tmp/ and returns pointer', () => {
|
|
16
|
+
const largeContent = 'x'.repeat(12000);
|
|
17
|
+
const resultPath = path_1.default.join(tmpSubDir, 'search-result-test.md');
|
|
18
|
+
fs_1.default.writeFileSync(resultPath, largeContent, 'utf8');
|
|
19
|
+
// Verify file was written and is >10KB
|
|
20
|
+
const stat = fs_1.default.statSync(resultPath);
|
|
21
|
+
expect(stat.size).toBeGreaterThan(10240);
|
|
22
|
+
expect(fs_1.default.existsSync(resultPath)).toBe(true);
|
|
23
|
+
// Verify pointer format
|
|
24
|
+
const pointer = `[Mindlore Search: ${largeContent.length} chars offloaded to ${resultPath}]\nSummary: ${largeContent.slice(0, 500).trim()}...\n[Read full results: ${resultPath}]`;
|
|
25
|
+
expect(pointer).toContain('offloaded to');
|
|
26
|
+
expect(pointer).toContain('Read full results');
|
|
27
|
+
});
|
|
28
|
+
it('keeps results under 10KB inline', () => {
|
|
29
|
+
const smallContent = 'y'.repeat(5000);
|
|
30
|
+
// Under threshold — should not offload
|
|
31
|
+
expect(smallContent.length).toBeLessThan(10240);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=search-offload.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-offload.test.js","sourceRoot":"","sources":["../../tests/search-offload.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEhD,UAAU,CAAC,GAAG,EAAE,GAAG,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,SAAS,CAAC,GAAG,EAAE,GAAG,YAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1E,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACjE,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QAEnD,uCAAuC;QACvC,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,wBAAwB;QACxB,MAAM,OAAO,GAAG,qBAAqB,YAAY,CAAC,MAAM,uBAAuB,UAAU,eAAe,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,4BAA4B,UAAU,GAAG,CAAC;QACnL,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,uCAAuC;QACvC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.test.d.ts","sourceRoot":"","sources":["../../tests/skeleton.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const skeleton_1 = require("../scripts/lib/skeleton");
|
|
4
|
+
describe('extractSkeleton', () => {
|
|
5
|
+
describe('JavaScript/TypeScript', () => {
|
|
6
|
+
it('keeps imports and top-level declarations', () => {
|
|
7
|
+
const input = `import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
|
|
10
|
+
const THRESHOLD = 30;
|
|
11
|
+
|
|
12
|
+
function doSomething(a: string, b: number): boolean {
|
|
13
|
+
const result = a.length > b;
|
|
14
|
+
if (result) {
|
|
15
|
+
console.log('yes');
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class MyClass {
|
|
22
|
+
private name: string;
|
|
23
|
+
constructor(name: string) {
|
|
24
|
+
this.name = name;
|
|
25
|
+
}
|
|
26
|
+
getName(): string {
|
|
27
|
+
return this.name;
|
|
28
|
+
}
|
|
29
|
+
}`;
|
|
30
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'ts');
|
|
31
|
+
expect(result).toContain("import fs from 'fs'");
|
|
32
|
+
expect(result).toContain("import path from 'path'");
|
|
33
|
+
expect(result).toContain('const THRESHOLD = 30');
|
|
34
|
+
expect(result).toContain('function doSomething');
|
|
35
|
+
expect(result).toContain('export class MyClass');
|
|
36
|
+
expect(result).not.toContain("console.log('yes')");
|
|
37
|
+
expect(result).not.toContain('return this.name');
|
|
38
|
+
});
|
|
39
|
+
it('keeps interface and type declarations', () => {
|
|
40
|
+
const input = `interface Config {
|
|
41
|
+
name: string;
|
|
42
|
+
value: number;
|
|
43
|
+
nested: {
|
|
44
|
+
deep: boolean;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
type Result = Config | null;`;
|
|
49
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'ts');
|
|
50
|
+
expect(result).toContain('interface Config');
|
|
51
|
+
expect(result).toContain('type Result');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('Python', () => {
|
|
55
|
+
it('keeps imports, defs, classes', () => {
|
|
56
|
+
const input = `import os
|
|
57
|
+
from pathlib import Path
|
|
58
|
+
|
|
59
|
+
CONSTANT = 42
|
|
60
|
+
|
|
61
|
+
def process(data: list) -> dict:
|
|
62
|
+
"""Process the data."""
|
|
63
|
+
result = {}
|
|
64
|
+
for item in data:
|
|
65
|
+
result[item] = True
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
class Handler:
|
|
69
|
+
def __init__(self, name):
|
|
70
|
+
self.name = name
|
|
71
|
+
def run(self):
|
|
72
|
+
pass`;
|
|
73
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'py');
|
|
74
|
+
expect(result).toContain('import os');
|
|
75
|
+
expect(result).toContain('from pathlib import Path');
|
|
76
|
+
expect(result).toContain('CONSTANT = 42');
|
|
77
|
+
expect(result).toContain('def process');
|
|
78
|
+
expect(result).toContain('class Handler');
|
|
79
|
+
expect(result).not.toContain('for item in data');
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
describe('Markdown', () => {
|
|
83
|
+
it('keeps headings only', () => {
|
|
84
|
+
const input = `# Title
|
|
85
|
+
|
|
86
|
+
Some long paragraph about something.
|
|
87
|
+
|
|
88
|
+
## Section 1
|
|
89
|
+
|
|
90
|
+
More content here with details.
|
|
91
|
+
|
|
92
|
+
### Subsection
|
|
93
|
+
|
|
94
|
+
Even more details.`;
|
|
95
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'md');
|
|
96
|
+
expect(result).toContain('# Title');
|
|
97
|
+
expect(result).toContain('## Section 1');
|
|
98
|
+
expect(result).toContain('### Subsection');
|
|
99
|
+
expect(result).not.toContain('Some long paragraph');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
it('returns full content for unsupported extensions', () => {
|
|
103
|
+
const input = 'just plain text';
|
|
104
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'xyz');
|
|
105
|
+
expect(result).toBe(input);
|
|
106
|
+
});
|
|
107
|
+
it('returns full content if skeleton is >75% of original', () => {
|
|
108
|
+
const input = `import a from 'a';
|
|
109
|
+
import b from 'b';
|
|
110
|
+
import c from 'c';
|
|
111
|
+
const x = 1;`;
|
|
112
|
+
const result = (0, skeleton_1.extractSkeleton)(input, 'ts');
|
|
113
|
+
expect(result).toBe(input);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=skeleton.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.test.js","sourceRoot":"","sources":["../../tests/skeleton.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-memory-api.test.d.ts","sourceRoot":"","sources":["../../tests/skill-memory-api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const schema_version_1 = require("../scripts/lib/schema-version");
|
|
11
|
+
const migrations_v052_1 = require("../scripts/lib/migrations-v052");
|
|
12
|
+
const skill_memory_1 = require("../scripts/lib/skill-memory");
|
|
13
|
+
describe('skill-memory API', () => {
|
|
14
|
+
let dbPath;
|
|
15
|
+
let tmpDir;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-skillmem-api-'));
|
|
18
|
+
dbPath = path_1.default.join(tmpDir, 'test.db');
|
|
19
|
+
const db = new better_sqlite3_1.default(dbPath);
|
|
20
|
+
db.pragma('journal_mode = WAL');
|
|
21
|
+
(0, schema_version_1.ensureSchemaTable)(db);
|
|
22
|
+
(0, schema_version_1.runMigrations)(db, migrations_v052_1.V052_MIGRATIONS);
|
|
23
|
+
db.close();
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
27
|
+
});
|
|
28
|
+
it('setSkillMem + getSkillMem roundtrip', () => {
|
|
29
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-diary', 'last_date', '2026-04-18');
|
|
30
|
+
const value = (0, skill_memory_1.getSkillMem)(dbPath, 'mindlore-diary', 'last_date');
|
|
31
|
+
expect(value).toBe('2026-04-18');
|
|
32
|
+
});
|
|
33
|
+
it('getSkillMem returns null for missing key', () => {
|
|
34
|
+
const value = (0, skill_memory_1.getSkillMem)(dbPath, 'mindlore-diary', 'nonexistent');
|
|
35
|
+
expect(value).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
it('setSkillMem overwrites existing value', () => {
|
|
38
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-ingest', 'urls', '["a.com"]');
|
|
39
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-ingest', 'urls', '["a.com","b.com"]');
|
|
40
|
+
const value = (0, skill_memory_1.getSkillMem)(dbPath, 'mindlore-ingest', 'urls');
|
|
41
|
+
expect(value).toBe('["a.com","b.com"]');
|
|
42
|
+
});
|
|
43
|
+
it('bumpAccess increments access_count', () => {
|
|
44
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-query', 'log', '[]');
|
|
45
|
+
(0, skill_memory_1.bumpAccess)(dbPath, 'mindlore-query', 'log');
|
|
46
|
+
(0, skill_memory_1.bumpAccess)(dbPath, 'mindlore-query', 'log');
|
|
47
|
+
const db2 = new better_sqlite3_1.default(dbPath, { readonly: true });
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
49
|
+
const row = db2.prepare('SELECT access_count FROM skill_memory WHERE skill_name = ? AND key = ?').get('mindlore-query', 'log');
|
|
50
|
+
db2.close();
|
|
51
|
+
expect(row.access_count).toBe(2);
|
|
52
|
+
});
|
|
53
|
+
it('listSkillMem returns all keys for a skill', () => {
|
|
54
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-diary', 'last_date', '2026-04-18');
|
|
55
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-diary', 'session_count', '5');
|
|
56
|
+
(0, skill_memory_1.setSkillMem)(dbPath, 'mindlore-ingest', 'urls', '[]');
|
|
57
|
+
const keys = (0, skill_memory_1.listSkillMem)(dbPath, 'mindlore-diary');
|
|
58
|
+
expect(keys).toHaveLength(2);
|
|
59
|
+
expect(keys.map(k => k.key).sort()).toEqual(['last_date', 'session_count']);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=skill-memory-api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-memory-api.test.js","sourceRoot":"","sources":["../../tests/skill-memory-api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-memory.test.d.ts","sourceRoot":"","sources":["../../tests/skill-memory.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const schema_version_1 = require("../scripts/lib/schema-version");
|
|
11
|
+
const migrations_v052_1 = require("../scripts/lib/migrations-v052");
|
|
12
|
+
describe('skill_memory table', () => {
|
|
13
|
+
let db;
|
|
14
|
+
let tmpDir;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-skillmem-'));
|
|
17
|
+
const dbPath = path_1.default.join(tmpDir, 'test.db');
|
|
18
|
+
db = new better_sqlite3_1.default(dbPath);
|
|
19
|
+
db.pragma('journal_mode = WAL');
|
|
20
|
+
(0, schema_version_1.ensureSchemaTable)(db);
|
|
21
|
+
(0, schema_version_1.runMigrations)(db, migrations_v052_1.V052_MIGRATIONS);
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
db.close();
|
|
25
|
+
fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
it('creates skill_memory table', () => {
|
|
28
|
+
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='skill_memory'").all();
|
|
29
|
+
expect(tables).toHaveLength(1);
|
|
30
|
+
});
|
|
31
|
+
it('inserts and retrieves skill memory', () => {
|
|
32
|
+
db.prepare(`INSERT INTO skill_memory (skill_name, key, value, updated_at)
|
|
33
|
+
VALUES (?, ?, ?, ?)`).run('mindlore-ingest', 'last_ingest_urls', '["https://example.com"]', new Date().toISOString());
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
35
|
+
const row = db.prepare('SELECT * FROM skill_memory WHERE skill_name = ? AND key = ?').get('mindlore-ingest', 'last_ingest_urls');
|
|
36
|
+
expect(row).toBeDefined();
|
|
37
|
+
expect(row.value).toBe('["https://example.com"]');
|
|
38
|
+
expect(row.access_count).toBe(0);
|
|
39
|
+
});
|
|
40
|
+
it('enforces UNIQUE(skill_name, key) constraint', () => {
|
|
41
|
+
const insert = db.prepare(`INSERT INTO skill_memory (skill_name, key, value, updated_at)
|
|
42
|
+
VALUES (?, ?, ?, ?)`);
|
|
43
|
+
insert.run('mindlore-query', 'log', '[]', new Date().toISOString());
|
|
44
|
+
expect(() => {
|
|
45
|
+
insert.run('mindlore-query', 'log', '["x"]', new Date().toISOString());
|
|
46
|
+
}).toThrow();
|
|
47
|
+
});
|
|
48
|
+
it('upserts with ON CONFLICT', () => {
|
|
49
|
+
const upsert = db.prepare(`INSERT INTO skill_memory (skill_name, key, value, updated_at)
|
|
50
|
+
VALUES (?, ?, ?, ?)
|
|
51
|
+
ON CONFLICT(skill_name, key) DO UPDATE SET
|
|
52
|
+
value = excluded.value,
|
|
53
|
+
updated_at = excluded.updated_at,
|
|
54
|
+
access_count = access_count + 1`);
|
|
55
|
+
const now = new Date().toISOString();
|
|
56
|
+
upsert.run('mindlore-diary', 'last_date', '"2026-04-18"', now);
|
|
57
|
+
upsert.run('mindlore-diary', 'last_date', '"2026-04-19"', now);
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
59
|
+
const row = db.prepare('SELECT * FROM skill_memory WHERE skill_name = ? AND key = ?').get('mindlore-diary', 'last_date');
|
|
60
|
+
expect(row.value).toBe('"2026-04-19"');
|
|
61
|
+
expect(row.access_count).toBe(1);
|
|
62
|
+
});
|
|
63
|
+
it('migration is idempotent', () => {
|
|
64
|
+
expect(() => (0, schema_version_1.runMigrations)(db, migrations_v052_1.V052_MIGRATIONS)).not.toThrow();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=skill-memory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-memory.test.js","sourceRoot":"","sources":["../../tests/skill-memory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-path-resolution.test.d.ts","sourceRoot":"","sources":["../../tests/skill-path-resolution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
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 fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
describe('Skill script path resolution', () => {
|
|
11
|
+
const mindlorePkg = path_1.default.resolve(__dirname, '..');
|
|
12
|
+
const tmpDir = path_1.default.join(os_1.default.tmpdir(), `mindlore-path-res-${Date.now()}`);
|
|
13
|
+
beforeEach(() => fs_1.default.mkdirSync(tmpDir, { recursive: true }));
|
|
14
|
+
afterEach(() => fs_1.default.rmSync(tmpDir, { recursive: true, force: true }));
|
|
15
|
+
test('scripts are reachable from a different CWD via MINDLORE_PKG', () => {
|
|
16
|
+
const healthScript = path_1.default.join(mindlorePkg, 'dist', 'scripts', 'mindlore-health-check.js');
|
|
17
|
+
expect(fs_1.default.existsSync(healthScript)).toBe(true);
|
|
18
|
+
const result = (0, child_process_1.execSync)(`node "${healthScript}" "${path_1.default.join(os_1.default.homedir(), '.mindlore')}" 2>&1 || true`, { cwd: tmpDir, encoding: 'utf8', timeout: 15000 });
|
|
19
|
+
expect(result).not.toContain('Cannot find module');
|
|
20
|
+
});
|
|
21
|
+
test('skill preamble pattern resolves correctly', () => {
|
|
22
|
+
const skillBase = path_1.default.join(mindlorePkg, 'skills', 'mindlore-diary');
|
|
23
|
+
const resolvedPkg = path_1.default.resolve(skillBase, '..', '..');
|
|
24
|
+
expect(resolvedPkg).toBe(mindlorePkg);
|
|
25
|
+
expect(fs_1.default.existsSync(path_1.default.join(resolvedPkg, 'dist', 'scripts'))).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
test('no bare "node dist/" or "node scripts/" references in skill files', () => {
|
|
28
|
+
const skillsDir = path_1.default.join(mindlorePkg, 'skills');
|
|
29
|
+
const skillDirs = fs_1.default.readdirSync(skillsDir).filter(d => fs_1.default.statSync(path_1.default.join(skillsDir, d)).isDirectory());
|
|
30
|
+
for (const dir of skillDirs) {
|
|
31
|
+
const skillFile = path_1.default.join(skillsDir, dir, 'SKILL.md');
|
|
32
|
+
if (!fs_1.default.existsSync(skillFile))
|
|
33
|
+
continue;
|
|
34
|
+
const content = fs_1.default.readFileSync(skillFile, 'utf8');
|
|
35
|
+
const bareNodeDist = content.match(/node dist\//g) ?? [];
|
|
36
|
+
const bareNodeScripts = content.match(/node scripts\//g) ?? [];
|
|
37
|
+
expect(bareNodeDist).toEqual([]);
|
|
38
|
+
expect(bareNodeScripts).toEqual([]);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=skill-path-resolution.test.js.map
|