mindlore 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +13 -5
  2. package/SCHEMA.md +60 -4
  3. package/dist/scripts/init.d.ts +10 -0
  4. package/dist/scripts/init.d.ts.map +1 -0
  5. package/dist/scripts/init.js +375 -0
  6. package/dist/scripts/init.js.map +1 -0
  7. package/dist/scripts/lib/constants.d.ts +29 -0
  8. package/dist/scripts/lib/constants.d.ts.map +1 -0
  9. package/dist/scripts/lib/constants.js +58 -0
  10. package/dist/scripts/lib/constants.js.map +1 -0
  11. package/dist/scripts/mindlore-fts5-index.d.ts +9 -0
  12. package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -0
  13. package/dist/scripts/mindlore-fts5-index.js +89 -0
  14. package/dist/scripts/mindlore-fts5-index.js.map +1 -0
  15. package/dist/scripts/mindlore-fts5-search.d.ts +10 -0
  16. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -0
  17. package/dist/scripts/mindlore-fts5-search.js +108 -0
  18. package/dist/scripts/mindlore-fts5-search.js.map +1 -0
  19. package/dist/scripts/mindlore-health-check.d.ts +10 -0
  20. package/dist/scripts/mindlore-health-check.d.ts.map +1 -0
  21. package/dist/scripts/mindlore-health-check.js +337 -0
  22. package/dist/scripts/mindlore-health-check.js.map +1 -0
  23. package/dist/scripts/uninstall.d.ts +10 -0
  24. package/dist/scripts/uninstall.d.ts.map +1 -0
  25. package/dist/scripts/uninstall.js +143 -0
  26. package/dist/scripts/uninstall.js.map +1 -0
  27. package/dist/tests/compounding.test.d.ts +8 -0
  28. package/dist/tests/compounding.test.d.ts.map +1 -0
  29. package/dist/tests/compounding.test.js +51 -0
  30. package/dist/tests/compounding.test.js.map +1 -0
  31. package/dist/tests/decision.test.d.ts +2 -0
  32. package/dist/tests/decision.test.d.ts.map +1 -0
  33. package/dist/tests/decision.test.js +61 -0
  34. package/dist/tests/decision.test.js.map +1 -0
  35. package/dist/tests/dedup.test.d.ts +2 -0
  36. package/dist/tests/dedup.test.d.ts.map +1 -0
  37. package/dist/tests/dedup.test.js +74 -0
  38. package/dist/tests/dedup.test.js.map +1 -0
  39. package/dist/tests/frontmatter.test.d.ts +2 -0
  40. package/dist/tests/frontmatter.test.d.ts.map +1 -0
  41. package/dist/tests/frontmatter.test.js +90 -0
  42. package/dist/tests/frontmatter.test.js.map +1 -0
  43. package/dist/tests/fts5.test.d.ts +2 -0
  44. package/dist/tests/fts5.test.d.ts.map +1 -0
  45. package/dist/tests/fts5.test.js +95 -0
  46. package/dist/tests/fts5.test.js.map +1 -0
  47. package/dist/tests/helpers/db.d.ts +7 -0
  48. package/dist/tests/helpers/db.d.ts.map +1 -0
  49. package/dist/tests/helpers/db.js +46 -0
  50. package/dist/tests/helpers/db.js.map +1 -0
  51. package/dist/tests/hook-smoke.test.d.ts +2 -0
  52. package/dist/tests/hook-smoke.test.d.ts.map +1 -0
  53. package/dist/tests/hook-smoke.test.js +58 -0
  54. package/dist/tests/hook-smoke.test.js.map +1 -0
  55. package/dist/tests/init.test.d.ts +2 -0
  56. package/dist/tests/init.test.d.ts.map +1 -0
  57. package/dist/tests/init.test.js +85 -0
  58. package/dist/tests/init.test.js.map +1 -0
  59. package/dist/tests/log.test.d.ts +2 -0
  60. package/dist/tests/log.test.d.ts.map +1 -0
  61. package/dist/tests/log.test.js +68 -0
  62. package/dist/tests/log.test.js.map +1 -0
  63. package/dist/tests/read-guard.test.d.ts +2 -0
  64. package/dist/tests/read-guard.test.d.ts.map +1 -0
  65. package/dist/tests/read-guard.test.js +69 -0
  66. package/dist/tests/read-guard.test.js.map +1 -0
  67. package/dist/tests/search-hook.test.d.ts +2 -0
  68. package/dist/tests/search-hook.test.d.ts.map +1 -0
  69. package/dist/tests/search-hook.test.js +108 -0
  70. package/dist/tests/search-hook.test.js.map +1 -0
  71. package/dist/tests/session-focus.test.d.ts +2 -0
  72. package/dist/tests/session-focus.test.d.ts.map +1 -0
  73. package/dist/tests/session-focus.test.js +71 -0
  74. package/dist/tests/session-focus.test.js.map +1 -0
  75. package/dist/tests/uninstall.test.d.ts +2 -0
  76. package/dist/tests/uninstall.test.d.ts.map +1 -0
  77. package/dist/tests/uninstall.test.js +98 -0
  78. package/dist/tests/uninstall.test.js.map +1 -0
  79. package/hooks/lib/mindlore-common.cjs +36 -2
  80. package/hooks/mindlore-decision-detector.cjs +51 -0
  81. package/hooks/mindlore-fts5-sync.cjs +4 -18
  82. package/hooks/mindlore-index.cjs +4 -18
  83. package/hooks/mindlore-read-guard.cjs +62 -0
  84. package/hooks/mindlore-search.cjs +5 -18
  85. package/hooks/mindlore-session-end.cjs +74 -8
  86. package/package.json +19 -7
  87. package/plugin.json +26 -2
  88. package/skills/mindlore-decide/SKILL.md +71 -0
  89. package/skills/mindlore-ingest/SKILL.md +13 -2
  90. package/skills/mindlore-log/SKILL.md +79 -0
  91. package/skills/mindlore-query/SKILL.md +125 -0
  92. package/templates/SCHEMA.md +60 -4
  93. package/scripts/init.cjs +0 -450
  94. package/scripts/lib/constants.cjs +0 -49
  95. package/scripts/mindlore-fts5-index.cjs +0 -112
  96. package/scripts/mindlore-fts5-search.cjs +0 -119
  97. package/scripts/mindlore-health-check.cjs +0 -336
  98. package/scripts/uninstall.cjs +0 -186
@@ -0,0 +1,46 @@
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
+ exports.sha256 = sha256;
7
+ exports.createTestDb = createTestDb;
8
+ exports.insertFts = insertFts;
9
+ exports.setupTestDir = setupTestDir;
10
+ exports.teardownTestDir = teardownTestDir;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const crypto_1 = __importDefault(require("crypto"));
14
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
15
+ // Hook'lar .cjs kalıyor — SQL constants'ları oradan import ediyoruz
16
+ const { SQL_FTS_CREATE, SQL_FTS_INSERT } = require('../../hooks/lib/mindlore-common.cjs');
17
+ function sha256(content) {
18
+ return crypto_1.default.createHash('sha256').update(content, 'utf8').digest('hex');
19
+ }
20
+ function createTestDb(dbPath) {
21
+ const db = new better_sqlite3_1.default(dbPath);
22
+ db.pragma('journal_mode = WAL');
23
+ db.exec(SQL_FTS_CREATE);
24
+ db.exec(`
25
+ CREATE TABLE IF NOT EXISTS file_hashes (
26
+ path TEXT PRIMARY KEY,
27
+ content_hash TEXT NOT NULL,
28
+ last_indexed TEXT NOT NULL
29
+ );
30
+ `);
31
+ return db;
32
+ }
33
+ function insertFts(db, filePath, slug, description, type, category, title, content, tags, quality) {
34
+ db.prepare(SQL_FTS_INSERT).run(filePath, slug || '', description || '', type || '', category || '', title || '', content || '', tags || '', quality || null);
35
+ }
36
+ function setupTestDir(testDir, subdirs) {
37
+ const dirs = subdirs ?? [];
38
+ fs_1.default.mkdirSync(testDir, { recursive: true });
39
+ for (const sub of dirs) {
40
+ fs_1.default.mkdirSync(path_1.default.join(testDir, sub), { recursive: true });
41
+ }
42
+ }
43
+ function teardownTestDir(testDir) {
44
+ fs_1.default.rmSync(testDir, { recursive: true, force: true });
45
+ }
46
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":";;;;;AAYA,wBAEC;AAED,oCAYC;AAED,8BAuBC;AAED,oCAMC;AAED,0CAEC;AAjED,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,oEAAsC;AAEtC,oEAAoE;AAEpE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAGvF,CAAC;AAEF,SAAgB,MAAM,CAAC,OAAe;IACpC,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,IAAI,CAAC;;;;;;GAMP,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,SAAS,CACvB,EAAqB,EACrB,QAAgB,EAChB,IAAY,EACZ,WAAmB,EACnB,IAAY,EACZ,QAAgB,EAChB,KAAa,EACb,OAAe,EACf,IAAY,EACZ,OAAsB;IAEtB,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAC5B,QAAQ,EACR,IAAI,IAAI,EAAE,EACV,WAAW,IAAI,EAAE,EACjB,IAAI,IAAI,EAAE,EACV,QAAQ,IAAI,EAAE,EACd,KAAK,IAAI,EAAE,EACX,OAAO,IAAI,EAAE,EACb,IAAI,IAAI,EAAE,EACV,OAAO,IAAI,IAAI,CAChB,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe,EAAE,OAAkB;IAC9D,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IAC3B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,OAAe;IAC7C,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hook-smoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-smoke.test.d.ts","sourceRoot":"","sources":["../../tests/hook-smoke.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
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 vm_1 = __importDefault(require("vm"));
9
+ const HOOKS_DIR = path_1.default.join(__dirname, '..', 'hooks');
10
+ describe('Hook Smoke Tests', () => {
11
+ const expectedHooks = [
12
+ 'mindlore-session-focus.cjs',
13
+ 'mindlore-search.cjs',
14
+ 'mindlore-index.cjs',
15
+ 'mindlore-fts5-sync.cjs',
16
+ 'mindlore-session-end.cjs',
17
+ 'mindlore-pre-compact.cjs',
18
+ 'mindlore-post-compact.cjs',
19
+ ];
20
+ test('all v0.1 hook files should exist', () => {
21
+ for (const hook of expectedHooks) {
22
+ const hookPath = path_1.default.join(HOOKS_DIR, hook);
23
+ expect(fs_1.default.existsSync(hookPath)).toBe(true);
24
+ }
25
+ });
26
+ test('all hooks should have valid syntax', () => {
27
+ for (const hook of expectedHooks) {
28
+ const hookPath = path_1.default.join(HOOKS_DIR, hook);
29
+ const content = fs_1.default.readFileSync(hookPath, 'utf8');
30
+ // Compile without executing — catches syntax errors without running main()
31
+ expect(() => {
32
+ new vm_1.default.Script(content, { filename: hookPath });
33
+ }).not.toThrow();
34
+ }
35
+ });
36
+ test('all hooks should use strict mode', () => {
37
+ for (const hook of expectedHooks) {
38
+ const hookPath = path_1.default.join(HOOKS_DIR, hook);
39
+ const content = fs_1.default.readFileSync(hookPath, 'utf8');
40
+ expect(content).toContain("'use strict'");
41
+ }
42
+ });
43
+ test('all hooks should have .cjs extension', () => {
44
+ const hookFiles = fs_1.default
45
+ .readdirSync(HOOKS_DIR)
46
+ .filter((f) => f.startsWith('mindlore-'));
47
+ for (const file of hookFiles) {
48
+ expect(file).toMatch(/\.cjs$/);
49
+ }
50
+ });
51
+ test('hook count should match plan (9 hooks: 7 v0.1 + 2 v0.2)', () => {
52
+ const hookFiles = fs_1.default
53
+ .readdirSync(HOOKS_DIR)
54
+ .filter((f) => f.startsWith('mindlore-') && f.endsWith('.cjs'));
55
+ expect(hookFiles).toHaveLength(9);
56
+ });
57
+ });
58
+ //# sourceMappingURL=hook-smoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-smoke.test.js","sourceRoot":"","sources":["../../tests/hook-smoke.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAEtD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,aAAa,GAAG;QACpB,4BAA4B;QAC5B,qBAAqB;QACrB,oBAAoB;QACpB,wBAAwB;QACxB,0BAA0B;QAC1B,0BAA0B;QAC1B,2BAA2B;KAC5B,CAAC;IAEF,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAElD,2EAA2E;YAC3E,MAAM,CAAC,GAAG,EAAE;gBACV,IAAI,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,YAAE;aACjB,WAAW,CAAC,SAAS,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAE5C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,MAAM,SAAS,GAAG,YAAE;aACjB,WAAW,CAAC,SAAS,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=init.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
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 child_process_1 = require("child_process");
9
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
10
+ const TEST_PROJECT = path_1.default.join(__dirname, '..', '.test-mindlore-init');
11
+ // init.ts → compiled to dist/scripts/init.js via tsc
12
+ const INIT_SCRIPT = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'init.js');
13
+ beforeEach(() => {
14
+ fs_1.default.mkdirSync(TEST_PROJECT, { recursive: true });
15
+ });
16
+ afterEach(() => {
17
+ fs_1.default.rmSync(TEST_PROJECT, { recursive: true, force: true });
18
+ });
19
+ describe('mindlore init', () => {
20
+ test('should create 9 directories under .mindlore/', () => {
21
+ (0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
22
+ cwd: TEST_PROJECT,
23
+ stdio: 'pipe',
24
+ env: { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT },
25
+ });
26
+ const mindloreDir = path_1.default.join(TEST_PROJECT, '.mindlore');
27
+ expect(fs_1.default.existsSync(mindloreDir)).toBe(true);
28
+ const expectedDirs = [
29
+ 'raw', 'sources', 'domains', 'analyses', 'insights',
30
+ 'connections', 'learnings', 'diary', 'decisions',
31
+ ];
32
+ for (const dir of expectedDirs) {
33
+ expect(fs_1.default.existsSync(path_1.default.join(mindloreDir, dir))).toBe(true);
34
+ }
35
+ });
36
+ test('should copy template files', () => {
37
+ (0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
38
+ cwd: TEST_PROJECT,
39
+ stdio: 'pipe',
40
+ env: { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT },
41
+ });
42
+ const mindloreDir = path_1.default.join(TEST_PROJECT, '.mindlore');
43
+ expect(fs_1.default.existsSync(path_1.default.join(mindloreDir, 'INDEX.md'))).toBe(true);
44
+ expect(fs_1.default.existsSync(path_1.default.join(mindloreDir, 'log.md'))).toBe(true);
45
+ expect(fs_1.default.existsSync(path_1.default.join(mindloreDir, 'SCHEMA.md'))).toBe(true);
46
+ });
47
+ test('should create FTS5 database', () => {
48
+ (0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
49
+ cwd: TEST_PROJECT,
50
+ stdio: 'pipe',
51
+ env: { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT },
52
+ });
53
+ const dbPath = path_1.default.join(TEST_PROJECT, '.mindlore', 'mindlore.db');
54
+ expect(fs_1.default.existsSync(dbPath)).toBe(true);
55
+ const db = new better_sqlite3_1.default(dbPath, { readonly: true });
56
+ const result = db
57
+ .prepare('SELECT count(*) as cnt FROM mindlore_fts')
58
+ .get();
59
+ expect(result.cnt).toBe(0);
60
+ const hashResult = db
61
+ .prepare('SELECT count(*) as cnt FROM file_hashes')
62
+ .get();
63
+ expect(hashResult.cnt).toBe(0);
64
+ db.close();
65
+ });
66
+ test('should be idempotent — running twice preserves existing data', () => {
67
+ const env = { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT };
68
+ (0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
69
+ cwd: TEST_PROJECT,
70
+ stdio: 'pipe',
71
+ env,
72
+ });
73
+ const testFile = path_1.default.join(TEST_PROJECT, '.mindlore', 'sources', 'test.md');
74
+ fs_1.default.writeFileSync(testFile, '---\nslug: test\ntype: source\n---\n# Test\n');
75
+ (0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
76
+ cwd: TEST_PROJECT,
77
+ stdio: 'pipe',
78
+ env,
79
+ });
80
+ expect(fs_1.default.existsSync(testFile)).toBe(true);
81
+ const content = fs_1.default.readFileSync(testFile, 'utf8');
82
+ expect(content).toContain('# Test');
83
+ });
84
+ });
85
+ //# sourceMappingURL=init.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,iDAAyC;AACzC,oEAAsC;AAEtC,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;AACvE,qDAAqD;AACrD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAE7E,UAAU,CAAC,GAAG,EAAE;IACd,YAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,YAAE,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,IAAA,wBAAQ,EAAC,SAAS,WAAW,QAAQ,EAAE;YACrC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;SACvE,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,MAAM,YAAY,GAAG;YACnB,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;YACnD,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW;SACjD,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,IAAA,wBAAQ,EAAC,SAAS,WAAW,QAAQ,EAAE;YACrC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;SACvE,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,IAAA,wBAAQ,EAAC,SAAS,WAAW,QAAQ,EAAE;YACrC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;SACvE,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACnE,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,0CAA0C,CAAC;aACnD,GAAG,EAAqB,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,MAAM,UAAU,GAAG,EAAE;aAClB,OAAO,CAAC,yCAAyC,CAAC;aAClD,GAAG,EAAqB,CAAC;QAC5B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/B,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;QAE9E,IAAA,wBAAQ,EAAC,SAAS,WAAW,QAAQ,EAAE;YACrC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5E,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,8CAA8C,CAAC,CAAC;QAE3E,IAAA,wBAAQ,EAAC,SAAS,WAAW,QAAQ,EAAE;YACrC,GAAG,EAAE,YAAY;YACjB,KAAK,EAAE,MAAM;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=log.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.test.d.ts","sourceRoot":"","sources":["../../tests/log.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
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 db_js_1 = require("./helpers/db.js");
9
+ // Hook remains .cjs — import via require with type cast
10
+ const { parseFrontmatter } = require('../hooks/lib/mindlore-common.cjs');
11
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-mindlore-log');
12
+ beforeEach(() => {
13
+ (0, db_js_1.setupTestDir)(TEST_DIR, ['diary', 'learnings']);
14
+ });
15
+ afterEach(() => {
16
+ (0, db_js_1.teardownTestDir)(TEST_DIR);
17
+ });
18
+ describe('Log Skill Structures', () => {
19
+ test('learnings file should follow topic-based format', () => {
20
+ const content = [
21
+ '---',
22
+ 'slug: testing',
23
+ 'type: learning',
24
+ 'title: Testing Learnings',
25
+ 'tags: [testing, jest]',
26
+ '---',
27
+ '',
28
+ '# Testing Learnings',
29
+ '',
30
+ "- YAPMA: Error handling testinde mock'u dolayli tetikleme",
31
+ "- BEST PRACTICE: Side-effect'li moduller eklerken TUM test'lerde mock ekle",
32
+ '',
33
+ ].join('\n');
34
+ const filePath = path_1.default.join(TEST_DIR, 'learnings', 'testing.md');
35
+ fs_1.default.writeFileSync(filePath, content, 'utf8');
36
+ const raw = fs_1.default.readFileSync(filePath, 'utf8');
37
+ expect(raw).toContain('type: learning');
38
+ expect(raw).toContain('YAPMA:');
39
+ expect(raw).toContain('BEST PRACTICE:');
40
+ });
41
+ test('delta archived flag should be valid frontmatter', () => {
42
+ const content = [
43
+ '---',
44
+ 'slug: delta-2026-04-10-1200',
45
+ 'type: diary',
46
+ 'date: 2026-04-10',
47
+ 'archived: true',
48
+ '---',
49
+ '',
50
+ '# Session Delta — 2026-04-10-1200',
51
+ '',
52
+ ].join('\n');
53
+ const filePath = path_1.default.join(TEST_DIR, 'diary', 'delta-2026-04-10-1200.md');
54
+ fs_1.default.writeFileSync(filePath, content, 'utf8');
55
+ const { meta } = parseFrontmatter(fs_1.default.readFileSync(filePath, 'utf8'));
56
+ expect(meta['archived']).toBe('true');
57
+ expect(meta['type']).toBe('diary');
58
+ });
59
+ test('diary directory should accept delta and note files', () => {
60
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'diary', 'delta-2026-04-10-1200.md'), '---\nslug: delta-2026-04-10-1200\ntype: diary\ndate: 2026-04-10\n---\n# Delta\n', 'utf8');
61
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'diary', 'note-2026-04-10-1530.md'), '---\nslug: note-2026-04-10-1530\ntype: diary\ndate: 2026-04-10\n---\n# Note\n', 'utf8');
62
+ const files = fs_1.default.readdirSync(path_1.default.join(TEST_DIR, 'diary'));
63
+ expect(files).toHaveLength(2);
64
+ expect(files.some((f) => f.startsWith('delta-'))).toBe(true);
65
+ expect(files.some((f) => f.startsWith('note-'))).toBe(true);
66
+ });
67
+ });
68
+ //# sourceMappingURL=log.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.test.js","sourceRoot":"","sources":["../../tests/log.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=read-guard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-guard.test.d.ts","sourceRoot":"","sources":["../../tests/read-guard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
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 child_process_1 = require("child_process");
9
+ const db_js_1 = require("./helpers/db.js");
10
+ const PROJECT_DIR = path_1.default.join(__dirname, '..', '.test-project-readguard');
11
+ const TEST_DIR = path_1.default.join(PROJECT_DIR, '.mindlore');
12
+ const HOOK_PATH = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-read-guard.cjs');
13
+ beforeEach(() => {
14
+ (0, db_js_1.setupTestDir)(TEST_DIR, ['diary']);
15
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'INDEX.md'), '# Index\n', 'utf8');
16
+ fs_1.default.writeFileSync(path_1.default.join(PROJECT_DIR, 'README.md'), '# Test\n', 'utf8');
17
+ });
18
+ afterEach(() => {
19
+ (0, db_js_1.teardownTestDir)(PROJECT_DIR);
20
+ });
21
+ function runGuard(input) {
22
+ try {
23
+ const result = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
24
+ input,
25
+ encoding: 'utf8',
26
+ timeout: 5000,
27
+ cwd: PROJECT_DIR,
28
+ env: { ...process.env },
29
+ });
30
+ return { stdout: result.trim(), exitCode: 0 };
31
+ }
32
+ catch (err) {
33
+ const e = err;
34
+ return {
35
+ stdout: (e.stdout ?? '').trim(),
36
+ stderr: (e.stderr ?? '').trim(),
37
+ exitCode: e.status ?? 0,
38
+ };
39
+ }
40
+ }
41
+ describe('Read Guard Hook', () => {
42
+ test('should not warn on first read', () => {
43
+ const input = JSON.stringify({ file_path: path_1.default.join(PROJECT_DIR, 'README.md') });
44
+ const { stdout } = runGuard(input);
45
+ expect(stdout).toBe('');
46
+ });
47
+ test('should create _session-reads.json on first read', () => {
48
+ const input = JSON.stringify({ file_path: path_1.default.join(PROJECT_DIR, 'README.md') });
49
+ runGuard(input);
50
+ const readsPath = path_1.default.join(TEST_DIR, 'diary', '_session-reads.json');
51
+ expect(fs_1.default.existsSync(readsPath)).toBe(true);
52
+ });
53
+ test('should skip files inside .mindlore/', () => {
54
+ const input = JSON.stringify({ file_path: path_1.default.join(TEST_DIR, 'INDEX.md') });
55
+ runGuard(input);
56
+ const readsPath = path_1.default.join(TEST_DIR, 'diary', '_session-reads.json');
57
+ if (fs_1.default.existsSync(readsPath)) {
58
+ const reads = JSON.parse(fs_1.default.readFileSync(readsPath, 'utf8'));
59
+ const keys = Object.keys(reads);
60
+ const mindloreKeys = keys.filter((k) => k.includes('.mindlore'));
61
+ expect(mindloreKeys).toHaveLength(0);
62
+ }
63
+ });
64
+ test('should handle empty input gracefully', () => {
65
+ const { exitCode } = runGuard('');
66
+ expect(exitCode).toBe(0);
67
+ });
68
+ });
69
+ //# sourceMappingURL=read-guard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-guard.test.js","sourceRoot":"","sources":["../../tests/read-guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-hook.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-hook.test.d.ts","sourceRoot":"","sources":["../../tests/search-hook.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,108 @@
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 better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const db_js_1 = require("./helpers/db.js");
9
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-mindlore-search');
10
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
11
+ beforeEach(() => {
12
+ (0, db_js_1.setupTestDir)(TEST_DIR, ['sources', 'domains']);
13
+ const db = (0, db_js_1.createTestDb)(DB_PATH);
14
+ (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'), 'react-hooks', 'useEffect cleanup patterns for memory leak prevention', 'source', 'sources', 'React Hooks Guide', '---\nslug: react-hooks\ntype: source\n---\n# React Hooks Guide\n\nuseEffect cleanup patterns for memory leak prevention.', '', null);
15
+ (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'typescript-generics.md'), 'typescript-generics', 'Advanced generic patterns for type-safe APIs', 'source', 'sources', 'TypeScript Generics', '---\nslug: typescript-generics\ntype: source\n---\n# TypeScript Generics\n\nAdvanced generic patterns for type-safe APIs.', '', null);
16
+ (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'domains', 'security.md'), 'security', 'SSH hardening firewall rules audit checks', 'domain', 'domains', 'Security', '---\nslug: security\ntype: domain\n---\n# Security\n\nSSH hardening, firewall rules, audit checks.', '', null);
17
+ db.close();
18
+ });
19
+ afterEach(() => {
20
+ (0, db_js_1.teardownTestDir)(TEST_DIR);
21
+ });
22
+ describe('Search Hook — Keyword Extraction', () => {
23
+ // Inline the extractKeywords logic for testing
24
+ function extractKeywords(text) {
25
+ const stopWords = new Set([
26
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
27
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
28
+ 'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',
29
+ 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'about', 'between',
30
+ 'through', 'after', 'before', 'above', 'below', 'up', 'down', 'out',
31
+ 'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',
32
+ 'neither', 'each', 'every', 'all', 'any', 'few', 'more', 'most',
33
+ 'other', 'some', 'such', 'no', 'only', 'own', 'same', 'than', 'too',
34
+ 'very', 'just', 'also', 'now', 'then', 'here', 'there', 'when',
35
+ 'where', 'why', 'how', 'what', 'which', 'who', 'whom', 'this',
36
+ 'that', 'these', 'those', 'it', 'its', 'my', 'your', 'his', 'her',
37
+ 'our', 'their', 'me', 'him', 'us', 'them', 'i', 'you', 'he', 'she',
38
+ 'we', 'they', 'bu', 'su', 'bir', 'de', 'da', 've', 'ile', 'icin',
39
+ 'var', 'mi', 'ne', 'nasil', 'nedir', 'evet', 'hayir',
40
+ ]);
41
+ return text
42
+ .toLowerCase()
43
+ .replace(/[^a-z0-9\u00e7\u011f\u0131\u00f6\u015f\u00fc\s-]/g, ' ')
44
+ .split(/\s+/)
45
+ .filter((w) => w.length >= 3 && !stopWords.has(w))
46
+ .filter((v, i, a) => a.indexOf(v) === i)
47
+ .slice(0, 5);
48
+ }
49
+ test('should extract meaningful keywords from prompt', () => {
50
+ const keywords = extractKeywords('How do React hooks handle cleanup?');
51
+ expect(keywords).toContain('react');
52
+ expect(keywords).toContain('hooks');
53
+ expect(keywords).toContain('cleanup');
54
+ expect(keywords).not.toContain('how');
55
+ expect(keywords).not.toContain('do');
56
+ });
57
+ test('should handle Turkish stop words', () => {
58
+ const keywords = extractKeywords('bu proje nasil calisir ve ne yapar');
59
+ expect(keywords).toContain('proje');
60
+ expect(keywords).toContain('calisir');
61
+ expect(keywords).toContain('yapar');
62
+ expect(keywords).not.toContain('nasil');
63
+ expect(keywords).not.toContain('bu');
64
+ });
65
+ test('should limit to 5 keywords', () => {
66
+ const keywords = extractKeywords('react hooks typescript generics security firewall audit ssh hardening');
67
+ expect(keywords.length).toBeLessThanOrEqual(5);
68
+ });
69
+ test('should deduplicate keywords', () => {
70
+ const keywords = extractKeywords('hooks hooks hooks different word');
71
+ const hookCount = keywords.filter((k) => k === 'hooks').length;
72
+ expect(hookCount).toBe(1);
73
+ });
74
+ });
75
+ describe('Search Hook — FTS5 Query', () => {
76
+ function queryFts(query) {
77
+ const db = new better_sqlite3_1.default(DB_PATH, { readonly: true });
78
+ try {
79
+ return db
80
+ .prepare(`SELECT path, rank FROM mindlore_fts
81
+ WHERE mindlore_fts MATCH ?
82
+ ORDER BY rank LIMIT 3`)
83
+ .all(query);
84
+ }
85
+ finally {
86
+ db.close();
87
+ }
88
+ }
89
+ test('should find matching documents via FTS5', () => {
90
+ const results = queryFts('react hooks');
91
+ expect(results.length).toBeGreaterThan(0);
92
+ expect(results[0]?.path).toContain('react-hooks');
93
+ });
94
+ test('should return empty for non-matching query', () => {
95
+ const results = queryFts('kubernetes docker');
96
+ expect(results).toHaveLength(0);
97
+ });
98
+ test('should rank more relevant documents higher', () => {
99
+ const results = queryFts('security');
100
+ expect(results.length).toBeGreaterThan(0);
101
+ expect(results[0]?.path).toContain('security');
102
+ });
103
+ test('should handle OR queries across multiple keywords', () => {
104
+ const results = queryFts('react OR typescript');
105
+ expect(results.length).toBe(2);
106
+ });
107
+ });
108
+ //# sourceMappingURL=search-hook.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-hook.test.js","sourceRoot":"","sources":["../../tests/search-hook.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,oEAAsC;AACtC,2CAAyF;AAEzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;AACrE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IAEjC,IAAA,iBAAS,EAAC,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,aAAa,EAAE,uDAAuD,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,0HAA0H,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACxT,IAAA,iBAAS,EAAC,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,qBAAqB,EAAE,8CAA8C,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,2HAA2H,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAClU,IAAA,iBAAS,EAAC,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,2CAA2C,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,oGAAoG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAEvQ,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,+CAA+C;IAC/C,SAAS,eAAe,CAAC,IAAY;QACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;YACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;YACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;YACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;YACjE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;YAClE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK;YACnE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;YAC/D,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;YAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;YACnE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;YAC9D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;YAC7D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;YACjE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;YAClE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;YAChE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;SACrD,CAAC,CAAC;QAEH,OAAO,IAAI;aACR,WAAW,EAAE;aACb,OAAO,CAAC,mDAAmD,EAAE,GAAG,CAAC;aACjE,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACjD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,oCAAoC,CAAC,CAAC;QACvE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,oCAAoC,CAAC,CAAC;QACvE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,eAAe,CAC9B,uEAAuE,CACxE,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,eAAe,CAAC,kCAAkC,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAC/D,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAOH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,SAAS,QAAQ,CAAC,KAAa;QAC7B,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,EAAE;iBACN,OAAO,CACN;;iCAEuB,CACxB;iBACA,GAAG,CAAC,KAAK,CAAa,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session-focus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus.test.d.ts","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
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 child_process_1 = require("child_process");
9
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-mindlore-session-focus');
10
+ const HOOK_PATH = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-session-focus.cjs');
11
+ function createMindloreDir() {
12
+ const mindloreDir = path_1.default.join(TEST_DIR, '.mindlore');
13
+ fs_1.default.mkdirSync(path_1.default.join(mindloreDir, 'diary'), { recursive: true });
14
+ fs_1.default.writeFileSync(path_1.default.join(mindloreDir, 'INDEX.md'), '# Mindlore Index\n\n## Stats\n2 source, 1 analysis, 3 total\n');
15
+ return mindloreDir;
16
+ }
17
+ function createDelta(mindloreDir, name, content) {
18
+ fs_1.default.writeFileSync(path_1.default.join(mindloreDir, 'diary', name), content);
19
+ }
20
+ beforeEach(() => {
21
+ fs_1.default.mkdirSync(TEST_DIR, { recursive: true });
22
+ });
23
+ afterEach(() => {
24
+ fs_1.default.rmSync(TEST_DIR, { recursive: true, force: true });
25
+ });
26
+ describe('Session Focus Hook', () => {
27
+ test('should inject INDEX.md content when .mindlore/ exists', () => {
28
+ createMindloreDir();
29
+ const output = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
30
+ cwd: TEST_DIR,
31
+ encoding: 'utf8',
32
+ timeout: 5000,
33
+ });
34
+ expect(output).toContain('[Mindlore INDEX]');
35
+ expect(output).toContain('2 source, 1 analysis, 3 total');
36
+ });
37
+ test('should inject latest delta when diary has entries', () => {
38
+ const mindloreDir = createMindloreDir();
39
+ createDelta(mindloreDir, 'delta-2026-04-09-1200.md', '# Old Delta\n\nOld session.');
40
+ createDelta(mindloreDir, 'delta-2026-04-10-0900.md', '# Latest Delta\n\nLatest session.');
41
+ const output = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
42
+ cwd: TEST_DIR,
43
+ encoding: 'utf8',
44
+ timeout: 5000,
45
+ });
46
+ expect(output).toContain('[Mindlore Delta: delta-2026-04-10-0900.md]');
47
+ expect(output).toContain('Latest session');
48
+ expect(output).not.toContain('Old session');
49
+ });
50
+ test('should produce no output when .mindlore/ does not exist', () => {
51
+ const output = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
52
+ cwd: TEST_DIR,
53
+ encoding: 'utf8',
54
+ timeout: 5000,
55
+ });
56
+ expect(output).toBe('');
57
+ });
58
+ test('should handle missing diary directory gracefully', () => {
59
+ const mindloreDir = path_1.default.join(TEST_DIR, '.mindlore');
60
+ fs_1.default.mkdirSync(mindloreDir, { recursive: true });
61
+ fs_1.default.writeFileSync(path_1.default.join(mindloreDir, 'INDEX.md'), '# Empty Index\n');
62
+ const output = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
63
+ cwd: TEST_DIR,
64
+ encoding: 'utf8',
65
+ timeout: 5000,
66
+ });
67
+ expect(output).toContain('[Mindlore INDEX]');
68
+ expect(output).not.toContain('[Mindlore Delta');
69
+ });
70
+ });
71
+ //# sourceMappingURL=session-focus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=uninstall.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.test.d.ts","sourceRoot":"","sources":["../../tests/uninstall.test.ts"],"names":[],"mappings":""}