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
|
@@ -1 +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,
|
|
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,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,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,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"}
|
package/dist/tests/rrf.test.js
CHANGED
|
@@ -70,7 +70,7 @@ describe('computeRRF', () => {
|
|
|
70
70
|
describe('searchPorter + searchTrigram', () => {
|
|
71
71
|
test('searchPorter returns ranked results from FTS5', () => {
|
|
72
72
|
const dir = makeTmpDir();
|
|
73
|
-
const db = (0, db_js_1.
|
|
73
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
|
|
74
74
|
(0, db_js_1.insertFts)(db, {
|
|
75
75
|
path: '/sources/ts.md',
|
|
76
76
|
slug: 'typescript-guide',
|
|
@@ -89,7 +89,7 @@ describe('searchPorter + searchTrigram', () => {
|
|
|
89
89
|
});
|
|
90
90
|
test('searchTrigram returns results from trigram table', () => {
|
|
91
91
|
const dir = makeTmpDir();
|
|
92
|
-
const db = (0, db_js_1.
|
|
92
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
|
|
93
93
|
(0, db_js_1.insertFts)(db, {
|
|
94
94
|
path: '/sources/ts.md',
|
|
95
95
|
slug: 'typescript-guide',
|
|
@@ -106,7 +106,7 @@ describe('searchPorter + searchTrigram', () => {
|
|
|
106
106
|
});
|
|
107
107
|
test('searchPorter returns empty for no match', () => {
|
|
108
108
|
const dir = makeTmpDir();
|
|
109
|
-
const db = (0, db_js_1.
|
|
109
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(path_1.default.join(dir, 'mindlore.db'));
|
|
110
110
|
const results = (0, rrf_js_1.searchPorter)(db, { query: 'nonexistentxyz', limit: 5 });
|
|
111
111
|
expect(results).toEqual([]);
|
|
112
112
|
cleanup(dir, db);
|
|
@@ -19,7 +19,7 @@ function cleanup(dir, db) {
|
|
|
19
19
|
fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
20
20
|
}
|
|
21
21
|
function seedDb(dbPath) {
|
|
22
|
-
const db = (0, db_js_1.
|
|
22
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(dbPath);
|
|
23
23
|
(0, db_js_1.insertFts)(db, {
|
|
24
24
|
path: '/sources/typescript.md',
|
|
25
25
|
slug: 'typescript',
|
|
@@ -78,8 +78,8 @@ describe('Search Hook — FTS5 Query', () => {
|
|
|
78
78
|
function queryFts(query) {
|
|
79
79
|
const db = new better_sqlite3_1.default(DB_PATH, { readonly: true });
|
|
80
80
|
try {
|
|
81
|
-
return (0, db_helpers_js_1.dbAll)(db, `SELECT path, rank FROM mindlore_fts
|
|
82
|
-
WHERE mindlore_fts MATCH ?
|
|
81
|
+
return (0, db_helpers_js_1.dbAll)(db, `SELECT path, rank FROM mindlore_fts
|
|
82
|
+
WHERE mindlore_fts MATCH ?
|
|
83
83
|
ORDER BY rank LIMIT 3`, query);
|
|
84
84
|
}
|
|
85
85
|
finally {
|
|
@@ -7,7 +7,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const os_1 = __importDefault(require("os"));
|
|
9
9
|
describe('search hook offload+pointer', () => {
|
|
10
|
-
const tmpDir = path_1.default.join(os_1.default.tmpdir(), 'mindlore-offload-'
|
|
10
|
+
const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-offload-'));
|
|
11
11
|
const mindloreDir = path_1.default.join(tmpDir, '.mindlore');
|
|
12
12
|
const tmpSubDir = path_1.default.join(mindloreDir, 'tmp');
|
|
13
13
|
beforeEach(() => { fs_1.default.mkdirSync(tmpSubDir, { recursive: true }); });
|
|
@@ -1 +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,
|
|
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,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC3E,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":"secure-io.test.d.ts","sourceRoot":"","sources":["../../tests/secure-io.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
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 os_1 = __importDefault(require("os"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const secure_io_js_1 = require("../scripts/lib/secure-io.js");
|
|
10
|
+
describe('secure-io', () => {
|
|
11
|
+
let tmpDir;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-secio-'));
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
describe('safeMkdir', () => {
|
|
19
|
+
it('creates directory with 0o700 permissions', () => {
|
|
20
|
+
const dir = path_1.default.join(tmpDir, 'subdir');
|
|
21
|
+
(0, secure_io_js_1.safeMkdir)(dir);
|
|
22
|
+
expect(fs_1.default.existsSync(dir)).toBe(true);
|
|
23
|
+
if (process.platform !== 'win32') {
|
|
24
|
+
const mode = fs_1.default.statSync(dir).mode & 0o777;
|
|
25
|
+
expect(mode).toBe(0o700);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
it('is idempotent — does not throw on existing dir', () => {
|
|
29
|
+
const dir = path_1.default.join(tmpDir, 'subdir');
|
|
30
|
+
(0, secure_io_js_1.safeMkdir)(dir);
|
|
31
|
+
expect(() => (0, secure_io_js_1.safeMkdir)(dir)).not.toThrow();
|
|
32
|
+
});
|
|
33
|
+
it('creates nested directories', () => {
|
|
34
|
+
const dir = path_1.default.join(tmpDir, 'a', 'b', 'c');
|
|
35
|
+
(0, secure_io_js_1.safeMkdir)(dir);
|
|
36
|
+
expect(fs_1.default.existsSync(dir)).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('safeWriteFile', () => {
|
|
40
|
+
it('writes file with 0o600 permissions', () => {
|
|
41
|
+
const fp = path_1.default.join(tmpDir, 'test.txt');
|
|
42
|
+
(0, secure_io_js_1.safeWriteFile)(fp, 'hello');
|
|
43
|
+
expect(fs_1.default.readFileSync(fp, 'utf8')).toBe('hello');
|
|
44
|
+
if (process.platform !== 'win32') {
|
|
45
|
+
const mode = fs_1.default.statSync(fp).mode & 0o777;
|
|
46
|
+
expect(mode).toBe(0o600);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
it('overwrites existing file', () => {
|
|
50
|
+
const fp = path_1.default.join(tmpDir, 'test.txt');
|
|
51
|
+
(0, secure_io_js_1.safeWriteFile)(fp, 'first');
|
|
52
|
+
(0, secure_io_js_1.safeWriteFile)(fp, 'second');
|
|
53
|
+
expect(fs_1.default.readFileSync(fp, 'utf8')).toBe('second');
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('safeWriteJson', () => {
|
|
57
|
+
it('writes JSON with trailing newline', () => {
|
|
58
|
+
const fp = path_1.default.join(tmpDir, 'data.json');
|
|
59
|
+
(0, secure_io_js_1.safeWriteJson)(fp, { key: 'value' });
|
|
60
|
+
const content = fs_1.default.readFileSync(fp, 'utf8');
|
|
61
|
+
expect(content).toBe('{\n "key": "value"\n}\n');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=secure-io.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-io.test.js","sourceRoot":"","sources":["../../tests/secure-io.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ let baseDir;
|
|
|
16
16
|
const PROJECT = 'test-project';
|
|
17
17
|
function insertEpisode(kind, summary, opts = {}) {
|
|
18
18
|
const id = `ep-${Math.random().toString(36).slice(2, 10)}`;
|
|
19
|
-
db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, created_at)
|
|
19
|
+
db.prepare(`INSERT INTO episodes (id, kind, scope, project, summary, status, created_at)
|
|
20
20
|
VALUES (?, ?, 'project', ?, ?, ?, ?)`).run(id, kind, opts.project ?? PROJECT, summary, opts.status ?? 'active', opts.created_at ?? new Date().toISOString());
|
|
21
21
|
}
|
|
22
22
|
function writeDelta(filename, content) {
|
|
@@ -116,7 +116,7 @@ describe('session summary → DB → payload integration', () => {
|
|
|
116
116
|
afterEach(() => (0, db_js_1.destroyEpisodesTestEnv)(env));
|
|
117
117
|
it('session-summary episode is readable by buildSessionPayload', () => {
|
|
118
118
|
const summary = 'Intent: v0.6.3 search engine | Son: commit atıldı';
|
|
119
|
-
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, session_summary, status, created_at)
|
|
119
|
+
env.db.prepare(`INSERT INTO episodes (kind, scope, project, summary, session_summary, status, created_at)
|
|
120
120
|
VALUES ('session-summary', 'project', 'test-proj', ?, ?, 'active', datetime('now'))`).run(summary, summary);
|
|
121
121
|
const payload = (0, session_payload_js_1.buildSessionPayload)({ db: env.db, baseDir: env.tmpDir, project: 'test-proj', tokenBudget: 5000 });
|
|
122
122
|
const pastSessions = payload.sections.find(s => s.label === 'Past Sessions');
|
|
@@ -10,7 +10,7 @@ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-similarity');
|
|
|
10
10
|
const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
|
|
11
11
|
beforeEach(() => {
|
|
12
12
|
(0, db_js_1.setupTestDir)(TEST_DIR, ['sources']);
|
|
13
|
-
const db = (0, db_js_1.
|
|
13
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(DB_PATH);
|
|
14
14
|
(0, db_js_1.insertFts)(db, {
|
|
15
15
|
path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'),
|
|
16
16
|
slug: 'react-hooks',
|
|
@@ -9,13 +9,32 @@ const os_1 = __importDefault(require("os"));
|
|
|
9
9
|
const child_process_1 = require("child_process");
|
|
10
10
|
describe('Skill script path resolution', () => {
|
|
11
11
|
const mindlorePkg = path_1.default.resolve(__dirname, '..');
|
|
12
|
-
const tmpDir = path_1.default.join(os_1.default.tmpdir(),
|
|
13
|
-
beforeEach(() => fs_1.default.mkdirSync(tmpDir, { recursive: true }));
|
|
12
|
+
const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-path-res-'));
|
|
14
13
|
afterEach(() => fs_1.default.rmSync(tmpDir, { recursive: true, force: true }));
|
|
15
14
|
test('scripts are reachable from a different CWD via MINDLORE_PKG', () => {
|
|
16
15
|
const healthScript = path_1.default.join(mindlorePkg, 'dist', 'scripts', 'mindlore-health-check.js');
|
|
17
16
|
expect(fs_1.default.existsSync(healthScript)).toBe(true);
|
|
18
|
-
|
|
17
|
+
let result;
|
|
18
|
+
try {
|
|
19
|
+
result = (0, child_process_1.execSync)(`node "${healthScript}" "${path_1.default.join(os_1.default.homedir(), '.mindlore')}"`, { cwd: tmpDir, encoding: 'utf8', timeout: 15000 });
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err && typeof err === 'object') {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
24
|
+
const obj = err;
|
|
25
|
+
const stdout = obj.stdout;
|
|
26
|
+
const stderr = obj.stderr;
|
|
27
|
+
if (typeof stdout === 'string')
|
|
28
|
+
result = stdout;
|
|
29
|
+
else if (typeof stderr === 'string')
|
|
30
|
+
result = stderr;
|
|
31
|
+
else
|
|
32
|
+
result = '';
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
result = '';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
19
38
|
expect(result).not.toContain('Cannot find module');
|
|
20
39
|
});
|
|
21
40
|
test('skill preamble pattern resolves correctly', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-path-resolution.test.js","sourceRoot":"","sources":["../../tests/skill-path-resolution.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,iDAAyC;AAEzC,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"skill-path-resolution.test.js","sourceRoot":"","sources":["../../tests/skill-path-resolution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-snippet.test.d.ts","sourceRoot":"","sources":["../../tests/smart-snippet.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 smart_snippet_1 = require("../scripts/lib/smart-snippet");
|
|
8
|
+
function createTestDb() {
|
|
9
|
+
const db = new better_sqlite3_1.default(':memory:');
|
|
10
|
+
db.exec(`
|
|
11
|
+
CREATE TABLE chunks (
|
|
12
|
+
source_path TEXT NOT NULL,
|
|
13
|
+
chunk_index INTEGER NOT NULL,
|
|
14
|
+
heading TEXT,
|
|
15
|
+
breadcrumb TEXT DEFAULT '',
|
|
16
|
+
char_count INTEGER DEFAULT 0
|
|
17
|
+
)
|
|
18
|
+
`);
|
|
19
|
+
return db;
|
|
20
|
+
}
|
|
21
|
+
describe('extractSmartSnippet', () => {
|
|
22
|
+
it('returns chunk-based snippet when chunk matches', () => {
|
|
23
|
+
const db = createTestDb();
|
|
24
|
+
db.prepare('INSERT INTO chunks VALUES (?, ?, ?, ?, ?)').run('/test/source.md', 0, 'Introduction', 'Introduction', 50);
|
|
25
|
+
db.prepare('INSERT INTO chunks VALUES (?, ?, ?, ?, ?)').run('/test/source.md', 1, 'Architecture', 'Architecture', 200);
|
|
26
|
+
const fullContent = [
|
|
27
|
+
'# Introduction',
|
|
28
|
+
'This is the intro section with some basic text that provides context about the project.',
|
|
29
|
+
'It explains what the project does and why it matters to the users and developers.',
|
|
30
|
+
'',
|
|
31
|
+
'# Architecture',
|
|
32
|
+
'The architecture uses MCP protocol for cross-host communication between different nodes.',
|
|
33
|
+
'Stdio transport handles all message passing between host and server in a secure manner.',
|
|
34
|
+
'Each tool maps to an existing script via thin adapter pattern for maximum flexibility.',
|
|
35
|
+
'This design ensures that the system can scale horizontally across multiple machines.',
|
|
36
|
+
'Developers can add new tools without modifying the core server implementation at all.',
|
|
37
|
+
].join('\n');
|
|
38
|
+
const result = (0, smart_snippet_1.extractSmartSnippet)(db, '/test/source.md', fullContent, ['MCP', 'protocol'], 500);
|
|
39
|
+
expect(result.snippet).toContain('MCP protocol');
|
|
40
|
+
expect(result.heading).toBe('Architecture');
|
|
41
|
+
db.close();
|
|
42
|
+
});
|
|
43
|
+
it('falls back to term-based snippet when no chunks table', () => {
|
|
44
|
+
const db = new better_sqlite3_1.default(':memory:');
|
|
45
|
+
const content = 'The MCP protocol enables cross-host memory access.';
|
|
46
|
+
const result = (0, smart_snippet_1.extractSmartSnippet)(db, '/missing.md', content, ['MCP'], 500);
|
|
47
|
+
expect(result.snippet).toContain('MCP');
|
|
48
|
+
expect(result.heading).toBeNull();
|
|
49
|
+
db.close();
|
|
50
|
+
});
|
|
51
|
+
it('falls back to term-based snippet when no chunks for path', () => {
|
|
52
|
+
const db = createTestDb();
|
|
53
|
+
const content = 'Some content about MCP servers and tools.';
|
|
54
|
+
const result = (0, smart_snippet_1.extractSmartSnippet)(db, '/no-chunks.md', content, ['MCP'], 500);
|
|
55
|
+
expect(result.snippet).toContain('MCP');
|
|
56
|
+
expect(result.heading).toBeNull();
|
|
57
|
+
db.close();
|
|
58
|
+
});
|
|
59
|
+
it('respects maxLen parameter', () => {
|
|
60
|
+
const db = createTestDb();
|
|
61
|
+
const longContent = 'word '.repeat(200);
|
|
62
|
+
const result = (0, smart_snippet_1.extractSmartSnippet)(db, '/test.md', longContent, ['word'], 100);
|
|
63
|
+
expect(result.snippet.length).toBeLessThanOrEqual(106); // 100 + "..." prefix/suffix
|
|
64
|
+
db.close();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=smart-snippet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-snippet.test.js","sourceRoot":"","sources":["../../tests/smart-snippet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ describe('raw inbox triage', () => {
|
|
|
57
57
|
it('caches metadata in raw_metadata table', () => {
|
|
58
58
|
fs_1.default.writeFileSync(path_1.default.join(tmpDir, 'raw', 'cached.md'), '# Cached\nContent');
|
|
59
59
|
const dbPath = path_1.default.join(tmpDir, 'mindlore.db');
|
|
60
|
-
const db = (0, db_js_1.
|
|
60
|
+
const db = (0, db_js_1.createTestDbWithFullSchema)(dbPath);
|
|
61
61
|
(0, triage_js_1.cacheRawMetadata)(db, path_1.default.join(tmpDir, 'raw', 'cached.md'), tmpDir);
|
|
62
62
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
63
63
|
const row = db.prepare("SELECT * FROM raw_metadata WHERE path = ?").get('raw/cached.md');
|
package/hooks/lib/constants.cjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const EPISODE_KINDS = [
|
|
4
|
-
'session', 'decision', 'event', 'preference',
|
|
5
|
-
'learning', 'friction', 'discovery', 'nomination',
|
|
6
|
-
'session-summary'
|
|
7
|
-
];
|
|
8
|
-
|
|
9
|
-
function isValidKind(kind) {
|
|
10
|
-
return typeof kind === 'string' && EPISODE_KINDS.includes(kind);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const DB_BUSY_TIMEOUT_MS = 2000;
|
|
14
|
-
|
|
15
|
-
module.exports = { EPISODE_KINDS, isValidKind, DB_BUSY_TIMEOUT_MS };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const EPISODE_KINDS = [
|
|
4
|
+
'session', 'decision', 'event', 'preference',
|
|
5
|
+
'learning', 'friction', 'discovery', 'nomination',
|
|
6
|
+
'session-summary'
|
|
7
|
+
];
|
|
8
|
+
|
|
9
|
+
function isValidKind(kind) {
|
|
10
|
+
return typeof kind === 'string' && EPISODE_KINDS.includes(kind);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const DB_BUSY_TIMEOUT_MS = 2000;
|
|
14
|
+
|
|
15
|
+
module.exports = { EPISODE_KINDS, isValidKind, DB_BUSY_TIMEOUT_MS };
|