mindlore 0.5.0 → 0.5.2

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 (149) hide show
  1. package/README.md +15 -2
  2. package/dist/scripts/fetch-raw.d.ts +2 -0
  3. package/dist/scripts/fetch-raw.d.ts.map +1 -0
  4. package/dist/scripts/fetch-raw.js +124 -0
  5. package/dist/scripts/fetch-raw.js.map +1 -0
  6. package/dist/scripts/init.js +45 -3
  7. package/dist/scripts/init.js.map +1 -1
  8. package/dist/scripts/lib/constants.d.ts +13 -0
  9. package/dist/scripts/lib/constants.d.ts.map +1 -1
  10. package/dist/scripts/lib/constants.js +24 -4
  11. package/dist/scripts/lib/constants.js.map +1 -1
  12. package/dist/scripts/lib/db-helpers.d.ts +12 -2
  13. package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
  14. package/dist/scripts/lib/db-helpers.js +36 -0
  15. package/dist/scripts/lib/db-helpers.js.map +1 -1
  16. package/dist/scripts/lib/hybrid-search.d.ts +0 -2
  17. package/dist/scripts/lib/hybrid-search.d.ts.map +1 -1
  18. package/dist/scripts/lib/hybrid-search.js +7 -1
  19. package/dist/scripts/lib/hybrid-search.js.map +1 -1
  20. package/dist/scripts/lib/migrations-v051.d.ts +3 -0
  21. package/dist/scripts/lib/migrations-v051.d.ts.map +1 -0
  22. package/dist/scripts/lib/migrations-v051.js +24 -0
  23. package/dist/scripts/lib/migrations-v051.js.map +1 -0
  24. package/dist/scripts/lib/migrations-v052.d.ts +3 -0
  25. package/dist/scripts/lib/migrations-v052.d.ts.map +1 -0
  26. package/dist/scripts/lib/migrations-v052.js +23 -0
  27. package/dist/scripts/lib/migrations-v052.js.map +1 -0
  28. package/dist/scripts/lib/migrations.d.ts +1 -0
  29. package/dist/scripts/lib/migrations.d.ts.map +1 -1
  30. package/dist/scripts/lib/migrations.js +3 -1
  31. package/dist/scripts/lib/migrations.js.map +1 -1
  32. package/dist/scripts/lib/privacy-filter.d.ts +3 -0
  33. package/dist/scripts/lib/privacy-filter.d.ts.map +1 -0
  34. package/dist/scripts/lib/privacy-filter.js +28 -0
  35. package/dist/scripts/lib/privacy-filter.js.map +1 -0
  36. package/dist/scripts/lib/similarity.d.ts +12 -0
  37. package/dist/scripts/lib/similarity.d.ts.map +1 -0
  38. package/dist/scripts/lib/similarity.js +64 -0
  39. package/dist/scripts/lib/similarity.js.map +1 -0
  40. package/dist/scripts/lib/skeleton.d.ts +2 -0
  41. package/dist/scripts/lib/skeleton.d.ts.map +1 -0
  42. package/dist/scripts/lib/skeleton.js +99 -0
  43. package/dist/scripts/lib/skeleton.js.map +1 -0
  44. package/dist/scripts/lib/skill-memory.d.ts +13 -0
  45. package/dist/scripts/lib/skill-memory.d.ts.map +1 -0
  46. package/dist/scripts/lib/skill-memory.js +94 -0
  47. package/dist/scripts/lib/skill-memory.js.map +1 -0
  48. package/dist/scripts/mindlore-fts5-index.js +18 -3
  49. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  50. package/dist/scripts/mindlore-health-check.d.ts +1 -1
  51. package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
  52. package/dist/scripts/mindlore-health-check.js +117 -96
  53. package/dist/scripts/mindlore-health-check.js.map +1 -1
  54. package/dist/scripts/quality-populate.js +8 -4
  55. package/dist/scripts/quality-populate.js.map +1 -1
  56. package/dist/tests/catch-up.test.d.ts +2 -0
  57. package/dist/tests/catch-up.test.d.ts.map +1 -0
  58. package/dist/tests/catch-up.test.js +88 -0
  59. package/dist/tests/catch-up.test.js.map +1 -0
  60. package/dist/tests/cc-memory-sync.test.d.ts +2 -0
  61. package/dist/tests/cc-memory-sync.test.d.ts.map +1 -0
  62. package/dist/tests/cc-memory-sync.test.js +121 -0
  63. package/dist/tests/cc-memory-sync.test.js.map +1 -0
  64. package/dist/tests/episode-file.test.d.ts +2 -0
  65. package/dist/tests/episode-file.test.d.ts.map +1 -0
  66. package/dist/tests/episode-file.test.js +82 -0
  67. package/dist/tests/episode-file.test.js.map +1 -0
  68. package/dist/tests/fetch-raw.test.d.ts +2 -0
  69. package/dist/tests/fetch-raw.test.d.ts.map +1 -0
  70. package/dist/tests/fetch-raw.test.js +43 -0
  71. package/dist/tests/fetch-raw.test.js.map +1 -0
  72. package/dist/tests/helpers/db.d.ts +1 -0
  73. package/dist/tests/helpers/db.d.ts.map +1 -1
  74. package/dist/tests/helpers/db.js +10 -0
  75. package/dist/tests/helpers/db.js.map +1 -1
  76. package/dist/tests/hook-logging.test.d.ts +2 -0
  77. package/dist/tests/hook-logging.test.d.ts.map +1 -0
  78. package/dist/tests/hook-logging.test.js +108 -0
  79. package/dist/tests/hook-logging.test.js.map +1 -0
  80. package/dist/tests/index-cli-embed.test.d.ts +7 -0
  81. package/dist/tests/index-cli-embed.test.d.ts.map +1 -0
  82. package/dist/tests/index-cli-embed.test.js +128 -0
  83. package/dist/tests/index-cli-embed.test.js.map +1 -0
  84. package/dist/tests/privacy-filter.test.d.ts +2 -0
  85. package/dist/tests/privacy-filter.test.d.ts.map +1 -0
  86. package/dist/tests/privacy-filter.test.js +56 -0
  87. package/dist/tests/privacy-filter.test.js.map +1 -0
  88. package/dist/tests/resolve-hook-common.test.d.ts +2 -0
  89. package/dist/tests/resolve-hook-common.test.d.ts.map +1 -0
  90. package/dist/tests/resolve-hook-common.test.js +30 -0
  91. package/dist/tests/resolve-hook-common.test.js.map +1 -0
  92. package/dist/tests/schema-version.test.js +28 -0
  93. package/dist/tests/schema-version.test.js.map +1 -1
  94. package/dist/tests/search-cli-hybrid.test.d.ts +6 -0
  95. package/dist/tests/search-cli-hybrid.test.d.ts.map +1 -0
  96. package/dist/tests/search-cli-hybrid.test.js +103 -0
  97. package/dist/tests/search-cli-hybrid.test.js.map +1 -0
  98. package/dist/tests/search-hook.test.js +33 -0
  99. package/dist/tests/search-hook.test.js.map +1 -1
  100. package/dist/tests/search-offload.test.d.ts +2 -0
  101. package/dist/tests/search-offload.test.d.ts.map +1 -0
  102. package/dist/tests/search-offload.test.js +34 -0
  103. package/dist/tests/search-offload.test.js.map +1 -0
  104. package/dist/tests/similarity.test.d.ts +2 -0
  105. package/dist/tests/similarity.test.d.ts.map +1 -0
  106. package/dist/tests/similarity.test.js +61 -0
  107. package/dist/tests/similarity.test.js.map +1 -0
  108. package/dist/tests/skeleton.test.d.ts +2 -0
  109. package/dist/tests/skeleton.test.d.ts.map +1 -0
  110. package/dist/tests/skeleton.test.js +116 -0
  111. package/dist/tests/skeleton.test.js.map +1 -0
  112. package/dist/tests/skill-memory-api.test.d.ts +2 -0
  113. package/dist/tests/skill-memory-api.test.d.ts.map +1 -0
  114. package/dist/tests/skill-memory-api.test.js +62 -0
  115. package/dist/tests/skill-memory-api.test.js.map +1 -0
  116. package/dist/tests/skill-memory.test.d.ts +2 -0
  117. package/dist/tests/skill-memory.test.d.ts.map +1 -0
  118. package/dist/tests/skill-memory.test.js +67 -0
  119. package/dist/tests/skill-memory.test.js.map +1 -0
  120. package/dist/tests/token-budget.test.d.ts +2 -0
  121. package/dist/tests/token-budget.test.d.ts.map +1 -0
  122. package/dist/tests/token-budget.test.js +32 -0
  123. package/dist/tests/token-budget.test.js.map +1 -0
  124. package/dist/tests/wiki-lint.test.d.ts +2 -0
  125. package/dist/tests/wiki-lint.test.d.ts.map +1 -0
  126. package/dist/tests/wiki-lint.test.js +47 -0
  127. package/dist/tests/wiki-lint.test.js.map +1 -0
  128. package/hooks/lib/mindlore-common.cjs +109 -2
  129. package/hooks/mindlore-cwd-changed.cjs +2 -2
  130. package/hooks/mindlore-decision-detector.cjs +2 -2
  131. package/hooks/mindlore-dont-repeat.cjs +2 -2
  132. package/hooks/mindlore-fts5-sync.cjs +2 -2
  133. package/hooks/mindlore-index.cjs +141 -3
  134. package/hooks/mindlore-model-router.cjs +2 -2
  135. package/hooks/mindlore-post-compact.cjs +2 -2
  136. package/hooks/mindlore-post-read.cjs +2 -2
  137. package/hooks/mindlore-pre-compact.cjs +2 -2
  138. package/hooks/mindlore-read-guard.cjs +15 -3
  139. package/hooks/mindlore-research-guard.cjs +2 -2
  140. package/hooks/mindlore-search.cjs +69 -41
  141. package/hooks/mindlore-session-end.cjs +129 -39
  142. package/hooks/mindlore-session-focus.cjs +24 -3
  143. package/package.json +6 -5
  144. package/plugin.json +29 -2
  145. package/skills/mindlore-diary/SKILL.md +76 -0
  146. package/skills/mindlore-ingest/SKILL.md +48 -50
  147. package/skills/mindlore-log/SKILL.md +3 -143
  148. package/skills/mindlore-reflect/SKILL.md +104 -0
  149. package/templates/config.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cc-memory-sync.test.js","sourceRoot":"","sources":["../../tests/cc-memory-sync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=episode-file.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-file.test.d.ts","sourceRoot":"","sources":["../../tests/episode-file.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
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
+ let tmpDir;
11
+ beforeEach(() => {
12
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-epfile-'));
13
+ fs_1.default.mkdirSync(path_1.default.join(tmpDir, 'diary'), { recursive: true });
14
+ });
15
+ afterEach(() => {
16
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
17
+ });
18
+ /**
19
+ * Run the writeEpisodeFile function in an isolated child process.
20
+ * The function is internal to session-end hook, so we extract and call it directly.
21
+ */
22
+ function runWriteEpisodeFile(baseDir, project, commits, changedFiles, reads, episodeTs) {
23
+ // Since writeEpisodeFile is not exported, test via the hook's worker mode
24
+ // by calling the hook with a crafted payload
25
+ const payload = JSON.stringify({ baseDir, project, commits, changedFiles, reads });
26
+ const tmpFile = path_1.default.join(os_1.default.tmpdir(), `mindlore-test-epfile-${Date.now()}.json`);
27
+ fs_1.default.writeFileSync(tmpFile, payload, 'utf8');
28
+ const hookFile = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-session-end.cjs');
29
+ const env = { ...process.env, MINDLORE_HOME: tmpDir };
30
+ if (episodeTs)
31
+ env.MINDLORE_EPISODE_TS = episodeTs;
32
+ (0, child_process_1.execSync)(`node "${hookFile}" --worker "${tmpFile}"`, {
33
+ timeout: 10000,
34
+ encoding: 'utf8',
35
+ env,
36
+ cwd: process.cwd(),
37
+ });
38
+ }
39
+ describe('writeEpisodeFile', () => {
40
+ test('creates episode .md file in diary/{project}/', () => {
41
+ runWriteEpisodeFile(tmpDir, 'test-proj', ['abc1234 test commit'], ['file.ts'], { count: 3, repeats: 1 });
42
+ const projDir = path_1.default.join(tmpDir, 'diary', 'test-proj');
43
+ expect(fs_1.default.existsSync(projDir)).toBe(true);
44
+ const files = fs_1.default.readdirSync(projDir).filter(f => f.startsWith('episode-'));
45
+ expect(files.length).toBeGreaterThanOrEqual(1);
46
+ const content = fs_1.default.readFileSync(path_1.default.join(projDir, files[0]), 'utf8');
47
+ expect(content).toContain('type: episode');
48
+ expect(content).toContain('project: test-proj');
49
+ expect(content).toContain('abc1234 test commit');
50
+ expect(content).toContain('file.ts');
51
+ expect(content).toContain('3 files read, 1 repeated');
52
+ });
53
+ test('handles empty session (no commits, no files)', () => {
54
+ runWriteEpisodeFile(tmpDir, 'empty-proj', [], [], null);
55
+ const projDir = path_1.default.join(tmpDir, 'diary', 'empty-proj');
56
+ const files = fs_1.default.readdirSync(projDir).filter(f => f.startsWith('episode-'));
57
+ expect(files.length).toBeGreaterThanOrEqual(1);
58
+ const content = fs_1.default.readFileSync(path_1.default.join(projDir, files[0]), 'utf8');
59
+ expect(content).toContain('Read-only session');
60
+ expect(content).not.toContain('## Commits');
61
+ });
62
+ test('is idempotent — second call does not overwrite', () => {
63
+ const fixedTs = '2026-01-15T10:30:00.000Z';
64
+ runWriteEpisodeFile(tmpDir, 'idem-proj', ['aaa commit'], ['x.ts'], null, fixedTs);
65
+ const projDir = path_1.default.join(tmpDir, 'diary', 'idem-proj');
66
+ const files1 = fs_1.default.readdirSync(projDir).filter(f => f.startsWith('episode-'));
67
+ // Run again with same timestamp — should not create duplicate
68
+ runWriteEpisodeFile(tmpDir, 'idem-proj', ['bbb different'], ['y.ts'], null, fixedTs);
69
+ const files2 = fs_1.default.readdirSync(projDir).filter(f => f.startsWith('episode-'));
70
+ expect(files2.length).toBe(files1.length);
71
+ // Content should still be from first call
72
+ const content = fs_1.default.readFileSync(path_1.default.join(projDir, files2[0]), 'utf8');
73
+ expect(content).toContain('aaa commit');
74
+ });
75
+ test('creates project directory recursively', () => {
76
+ const deepBase = path_1.default.join(tmpDir, 'deep', 'nested');
77
+ fs_1.default.mkdirSync(path_1.default.join(deepBase, 'diary'), { recursive: true });
78
+ runWriteEpisodeFile(deepBase, 'nested-proj', ['ccc commit'], [], null);
79
+ expect(fs_1.default.existsSync(path_1.default.join(deepBase, 'diary', 'nested-proj'))).toBe(true);
80
+ });
81
+ });
82
+ //# sourceMappingURL=episode-file.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-file.test.js","sourceRoot":"","sources":["../../tests/episode-file.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fetch-raw.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-raw.test.d.ts","sourceRoot":"","sources":["../../tests/fetch-raw.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const child_process_1 = require("child_process");
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ describe('fetch-raw script', () => {
11
+ const tmpDir = path_1.default.join(os_1.default.tmpdir(), 'mindlore-fetch-test-' + Date.now());
12
+ beforeAll(() => { fs_1.default.mkdirSync(tmpDir, { recursive: true }); });
13
+ afterAll(() => { fs_1.default.rmSync(tmpDir, { recursive: true, force: true }); });
14
+ it('fetches a URL and saves to output dir', () => {
15
+ const result = (0, child_process_1.execSync)(`node dist/scripts/fetch-raw.js https://raw.githubusercontent.com/anthropics/claude-code/main/README.md --out-dir "${tmpDir}"`, { encoding: 'utf8', timeout: 30000 });
16
+ const parsed = JSON.parse(result.trim());
17
+ expect(parsed.saved).toBeTruthy();
18
+ expect(parsed.chars).toBeGreaterThan(100);
19
+ expect(fs_1.default.existsSync(parsed.saved)).toBe(true);
20
+ });
21
+ it('outputs valid JSON with saved path and char count', () => {
22
+ const result = (0, child_process_1.execSync)(`node dist/scripts/fetch-raw.js https://raw.githubusercontent.com/anthropics/claude-code/main/README.md --out-dir "${tmpDir}"`, { encoding: 'utf8', timeout: 30000 });
23
+ const parsed = JSON.parse(result.trim());
24
+ expect(parsed).toHaveProperty('saved');
25
+ expect(parsed).toHaveProperty('chars');
26
+ expect(typeof parsed.chars).toBe('number');
27
+ });
28
+ it('generates frontmatter with slug and date', () => {
29
+ const result = (0, child_process_1.execSync)(`node dist/scripts/fetch-raw.js https://raw.githubusercontent.com/anthropics/claude-code/main/README.md --out-dir "${tmpDir}"`, { encoding: 'utf8', timeout: 30000 });
30
+ const parsed = JSON.parse(result.trim());
31
+ const content = fs_1.default.readFileSync(parsed.saved, 'utf8');
32
+ expect(content).toContain('---');
33
+ expect(content).toContain('slug:');
34
+ expect(content).toContain('date_captured:');
35
+ expect(content).toContain('source_url:');
36
+ });
37
+ it('exits with error when no URL provided', () => {
38
+ expect(() => {
39
+ (0, child_process_1.execSync)(`node dist/scripts/fetch-raw.js --out-dir "${tmpDir}"`, { encoding: 'utf8', timeout: 5000 });
40
+ }).toThrow();
41
+ });
42
+ });
43
+ //# sourceMappingURL=fetch-raw.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-raw.test.js","sourceRoot":"","sources":["../../tests/fetch-raw.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import Database from 'better-sqlite3';
2
2
  export declare function sha256(content: string): string;
3
3
  export declare function createTestDb(dbPath: string): Database.Database;
4
+ export declare function createTestDbWithMigrations(dbPath: string): Database.Database;
4
5
  export interface FtsEntry {
5
6
  [key: string]: string | null | undefined;
6
7
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAY9D;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEtE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAI1E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAMtE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAKrE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAGjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAcjG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,GAAE,MAAqB,GAAG,IAAI,CAO1H"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAYtC,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAY9D;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAK5E;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEtE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAI1E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAMtE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAKrE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAGjE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAcjG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,GAAE,MAAqB,GAAG,IAAI,CAO1H"}
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.sha256 = sha256;
7
7
  exports.createTestDb = createTestDb;
8
+ exports.createTestDbWithMigrations = createTestDbWithMigrations;
8
9
  exports.insertFts = insertFts;
9
10
  exports.createTestDbWithEpisodes = createTestDbWithEpisodes;
10
11
  exports.setupTestDir = setupTestDir;
@@ -18,6 +19,9 @@ const path_1 = __importDefault(require("path"));
18
19
  const os_1 = __importDefault(require("os"));
19
20
  const crypto_1 = __importDefault(require("crypto"));
20
21
  const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
22
+ const schema_version_js_1 = require("../../scripts/lib/schema-version.js");
23
+ const migrations_js_1 = require("../../scripts/lib/migrations.js");
24
+ const migrations_v051_js_1 = require("../../scripts/lib/migrations-v051.js");
21
25
  // Hook'lar .cjs kalıyor — SQL constants'ları oradan import ediyoruz
22
26
  const { SQL_FTS_CREATE, insertFtsRow, ensureEpisodesTable: ensureEpisodesTableCjs } = require('../../hooks/lib/mindlore-common.cjs');
23
27
  function sha256(content) {
@@ -36,6 +40,12 @@ function createTestDb(dbPath) {
36
40
  `);
37
41
  return db;
38
42
  }
43
+ function createTestDbWithMigrations(dbPath) {
44
+ const db = createTestDb(dbPath);
45
+ (0, schema_version_js_1.ensureSchemaTable)(db);
46
+ (0, schema_version_js_1.runMigrations)(db, [...migrations_js_1.V050_MIGRATIONS, ...migrations_v051_js_1.V051_MIGRATIONS]);
47
+ return db;
48
+ }
39
49
  function insertFts(db, entry) {
40
50
  insertFtsRow(db, entry);
41
51
  }
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hook-logging.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-logging.test.d.ts","sourceRoot":"","sources":["../../tests/hook-logging.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 fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const { hookLog, getRecentHookErrors } = require('../hooks/lib/mindlore-common.cjs');
10
+ let tmpDir;
11
+ let origEnv;
12
+ beforeEach(() => {
13
+ tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'mindlore-hooklog-'));
14
+ fs_1.default.mkdirSync(path_1.default.join(tmpDir, 'diary'), { recursive: true });
15
+ origEnv = process.env.MINDLORE_HOME;
16
+ process.env.MINDLORE_HOME = tmpDir;
17
+ });
18
+ afterEach(() => {
19
+ if (origEnv === undefined)
20
+ delete process.env.MINDLORE_HOME;
21
+ else
22
+ process.env.MINDLORE_HOME = origEnv;
23
+ fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
24
+ });
25
+ describe('hookLog', () => {
26
+ test('writes JSONL entry to diary/_hook-log.jsonl', () => {
27
+ hookLog('test-hook', 'info', 'hello world');
28
+ const logPath = path_1.default.join(tmpDir, 'diary', '_hook-log.jsonl');
29
+ expect(fs_1.default.existsSync(logPath)).toBe(true);
30
+ const lines = fs_1.default.readFileSync(logPath, 'utf8').trim().split('\n');
31
+ expect(lines).toHaveLength(1);
32
+ const entry = JSON.parse(lines[0]);
33
+ expect(entry.hook).toBe('test-hook');
34
+ expect(entry.level).toBe('info');
35
+ expect(entry.msg).toBe('hello world');
36
+ expect(entry.ts).toBeDefined();
37
+ expect(entry.pid).toBe(process.pid);
38
+ });
39
+ test('appends multiple entries', () => {
40
+ hookLog('h1', 'info', 'first');
41
+ hookLog('h2', 'warn', 'second');
42
+ hookLog('h3', 'error', 'third');
43
+ const logPath = path_1.default.join(tmpDir, 'diary', '_hook-log.jsonl');
44
+ const lines = fs_1.default.readFileSync(logPath, 'utf8').trim().split('\n');
45
+ expect(lines).toHaveLength(3);
46
+ expect(JSON.parse(lines[1]).level).toBe('warn');
47
+ });
48
+ test('rotates when file exceeds 500KB', () => {
49
+ const logPath = path_1.default.join(tmpDir, 'diary', '_hook-log.jsonl');
50
+ // Write >500KB of data
51
+ const bigLine = JSON.stringify({ ts: new Date().toISOString(), hook: 'filler', level: 'info', msg: 'x'.repeat(200), pid: 1 });
52
+ const lines = Array(3000).fill(bigLine);
53
+ fs_1.default.writeFileSync(logPath, lines.join('\n') + '\n');
54
+ expect(fs_1.default.statSync(logPath).size).toBeGreaterThan(512 * 1024);
55
+ // hookLog should trigger rotation
56
+ hookLog('post-rotate', 'info', 'after rotation');
57
+ const content = fs_1.default.readFileSync(logPath, 'utf8').trim().split('\n');
58
+ // Should be trimmed to ~501 lines (500 kept + 1 new)
59
+ expect(content.length).toBeLessThanOrEqual(501);
60
+ expect(JSON.parse(content[content.length - 1]).hook).toBe('post-rotate');
61
+ });
62
+ test('does not crash when diary dir missing', () => {
63
+ fs_1.default.rmSync(path_1.default.join(tmpDir, 'diary'), { recursive: true, force: true });
64
+ expect(() => hookLog('no-dir', 'error', 'should not crash')).not.toThrow();
65
+ });
66
+ });
67
+ describe('getRecentHookErrors', () => {
68
+ test('returns empty when no log file', () => {
69
+ const errors = getRecentHookErrors();
70
+ expect(errors).toEqual([]);
71
+ });
72
+ test('returns only error and warn entries', () => {
73
+ hookLog('h1', 'info', 'ignored');
74
+ hookLog('h2', 'error', 'caught');
75
+ hookLog('h3', 'warn', 'also caught');
76
+ hookLog('h4', 'info', 'also ignored');
77
+ const errors = getRecentHookErrors();
78
+ expect(errors).toHaveLength(2);
79
+ expect(errors[0].level).toBe('error');
80
+ expect(errors[1].level).toBe('warn');
81
+ });
82
+ test('respects since cutoff', () => {
83
+ const logPath = path_1.default.join(tmpDir, 'diary', '_hook-log.jsonl');
84
+ // Write an old error
85
+ const oldEntry = JSON.stringify({ ts: '2020-01-01T00:00:00.000Z', hook: 'old', level: 'error', msg: 'ancient', pid: 1 });
86
+ fs_1.default.writeFileSync(logPath, oldEntry + '\n');
87
+ // Write a recent error
88
+ hookLog('new', 'error', 'recent');
89
+ const errors = getRecentHookErrors();
90
+ expect(errors).toHaveLength(1);
91
+ expect(errors[0].hook).toBe('new');
92
+ });
93
+ test('respects limit parameter', () => {
94
+ for (let i = 0; i < 20; i++) {
95
+ hookLog(`h${i}`, 'error', `err ${i}`);
96
+ }
97
+ const errors = getRecentHookErrors(undefined, 5);
98
+ expect(errors).toHaveLength(5);
99
+ });
100
+ test('returns chronological order', () => {
101
+ hookLog('first', 'error', 'a');
102
+ hookLog('second', 'error', 'b');
103
+ const errors = getRecentHookErrors();
104
+ expect(errors[0].hook).toBe('first');
105
+ expect(errors[1].hook).toBe('second');
106
+ });
107
+ });
108
+ //# sourceMappingURL=hook-logging.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-logging.test.js","sourceRoot":"","sources":["../../tests/hook-logging.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for embedding pipeline used by --embed flag in index script.
3
+ * Tests the library functions (embedding.ts, db-helpers.ts vec functions)
4
+ * rather than the CLI subprocess.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index-cli-embed.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cli-embed.test.d.ts","sourceRoot":"","sources":["../../tests/index-cli-embed.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for embedding pipeline used by --embed flag in index script.
4
+ * Tests the library functions (embedding.ts, db-helpers.ts vec functions)
5
+ * rather than the CLI subprocess.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const path_1 = __importDefault(require("path"));
12
+ const db_js_1 = require("./helpers/db.js");
13
+ const { hasVecTable, dbAll: dbAllFn } = require('../scripts/lib/db-helpers.js');
14
+ const { searchFts5, searchVec, hybridSearch } = require('../scripts/lib/hybrid-search.js');
15
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-index-cli-embed');
16
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
17
+ beforeEach(() => {
18
+ (0, db_js_1.setupTestDir)(TEST_DIR, ['sources']);
19
+ });
20
+ afterEach(() => {
21
+ (0, db_js_1.teardownTestDir)(TEST_DIR);
22
+ });
23
+ describe('Embedding Pipeline — vec table management', () => {
24
+ test('should create vec table when sqlite-vec is available', () => {
25
+ const { db, vecLoaded } = (0, db_js_1.createTestDbWithVec)(DB_PATH);
26
+ if (vecLoaded) {
27
+ expect(hasVecTable(db)).toBe(true);
28
+ }
29
+ else {
30
+ expect(hasVecTable(db)).toBe(false);
31
+ }
32
+ db.close();
33
+ });
34
+ test('should handle missing sqlite-vec gracefully', () => {
35
+ const db = (0, db_js_1.createTestDb)(DB_PATH);
36
+ expect(hasVecTable(db)).toBe(false);
37
+ db.close();
38
+ });
39
+ test('should insert and query vec embeddings when vec is available', () => {
40
+ const { db, vecLoaded } = (0, db_js_1.createTestDbWithVec)(DB_PATH);
41
+ if (!vecLoaded) {
42
+ db.close();
43
+ return;
44
+ }
45
+ const testEmbedding = new Float32Array(384);
46
+ testEmbedding[0] = 1.0;
47
+ (0, db_js_1.insertVec)(db, 'test-doc', testEmbedding, 'test-model');
48
+ const rows = dbAllFn(db, 'SELECT slug FROM documents_vec WHERE slug = ?', 'test-doc');
49
+ expect(rows).toHaveLength(1);
50
+ expect(rows[0]?.slug).toBe('test-doc');
51
+ db.close();
52
+ });
53
+ test('should search vec table with embedding match when available', () => {
54
+ const { db, vecLoaded } = (0, db_js_1.createTestDbWithVec)(DB_PATH);
55
+ if (!vecLoaded) {
56
+ db.close();
57
+ return;
58
+ }
59
+ const embed1 = new Float32Array(384);
60
+ embed1[0] = 1.0;
61
+ (0, db_js_1.insertVec)(db, 'doc-a', embed1, 'test-model');
62
+ const embed2 = new Float32Array(384);
63
+ embed2[1] = 1.0;
64
+ (0, db_js_1.insertVec)(db, 'doc-b', embed2, 'test-model');
65
+ const queryEmbed = new Float32Array(384);
66
+ queryEmbed[0] = 0.9;
67
+ const results = searchVec(db, Array.from(queryEmbed), 5);
68
+ expect(results.length).toBe(2);
69
+ expect(results[0].slug).toBe('doc-a');
70
+ db.close();
71
+ });
72
+ });
73
+ describe('Embedding Pipeline — FTS5 + vec coexistence', () => {
74
+ test('should allow FTS5 and vec tables in same database', () => {
75
+ const { db, vecLoaded } = (0, db_js_1.createTestDbWithVec)(DB_PATH);
76
+ (0, db_js_1.insertFts)(db, {
77
+ path: path_1.default.join(TEST_DIR, 'sources', 'coexist.md'),
78
+ slug: 'coexist-doc',
79
+ description: 'Test coexistence of FTS5 and vec tables',
80
+ type: 'source',
81
+ category: 'sources',
82
+ title: 'Coexist Doc',
83
+ content: 'Testing that both FTS5 and vec work together',
84
+ tags: 'test',
85
+ });
86
+ const ftsResults = searchFts5(db, 'coexistence', 5);
87
+ expect(ftsResults.length).toBeGreaterThan(0);
88
+ if (vecLoaded) {
89
+ const testEmbed = new Float32Array(384);
90
+ testEmbed[0] = 1.0;
91
+ (0, db_js_1.insertVec)(db, 'coexist-doc', testEmbed, 'test-model');
92
+ expect(hasVecTable(db)).toBe(true);
93
+ }
94
+ db.close();
95
+ });
96
+ test('should run hybridSearch with both FTS5 data and vec embeddings', () => {
97
+ const { db, vecLoaded } = (0, db_js_1.createTestDbWithVec)(DB_PATH);
98
+ (0, db_js_1.insertFts)(db, {
99
+ path: path_1.default.join(TEST_DIR, 'sources', 'hybrid-test.md'),
100
+ slug: 'hybrid-test',
101
+ description: 'Document for hybrid search integration test',
102
+ type: 'source',
103
+ category: 'sources',
104
+ title: 'Hybrid Test',
105
+ content: 'Hybrid search combines FTS5 keyword and vector semantic results',
106
+ tags: 'hybrid,search',
107
+ });
108
+ if (vecLoaded) {
109
+ const testEmbed = new Float32Array(384);
110
+ testEmbed[0] = 1.0;
111
+ (0, db_js_1.insertVec)(db, 'hybrid-test', testEmbed, 'test-model');
112
+ }
113
+ let queryEmbed;
114
+ if (vecLoaded) {
115
+ const q = new Float32Array(384);
116
+ q[0] = 0.9;
117
+ queryEmbed = Array.from(q);
118
+ }
119
+ const results = hybridSearch(db, 'hybrid search', {
120
+ maxResults: 5,
121
+ queryEmbedding: queryEmbed,
122
+ });
123
+ expect(results.length).toBeGreaterThan(0);
124
+ expect(results[0].slug).toBe('hybrid-test');
125
+ db.close();
126
+ });
127
+ });
128
+ //# sourceMappingURL=index-cli-embed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cli-embed.test.js","sourceRoot":"","sources":["../../tests/index-cli-embed.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=privacy-filter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-filter.test.d.ts","sourceRoot":"","sources":["../../tests/privacy-filter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const privacy_filter_js_1 = require("../scripts/lib/privacy-filter.js");
4
+ describe('Privacy Filter', () => {
5
+ test('should redact OpenAI API keys', () => {
6
+ const input = 'My key is sk-proj-abc123def456ghi789';
7
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
8
+ expect(result).toBe('My key is [REDACTED]');
9
+ expect(result).not.toContain('sk-proj-');
10
+ });
11
+ test('should redact AWS access keys', () => {
12
+ const input = 'AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE';
13
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
14
+ expect(result).toContain('[REDACTED]');
15
+ expect(result).not.toContain('AKIA');
16
+ });
17
+ test('should redact GitHub tokens', () => {
18
+ const input = 'token: ghp_ABCDEFghijklmnop1234567890abcdefGHIJ';
19
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
20
+ expect(result).toContain('[REDACTED]');
21
+ expect(result).not.toContain('ghp_');
22
+ });
23
+ test('should redact npm tokens', () => {
24
+ const input = 'npm_abc123DEF456ghi789JKL012mno345PQR678stu';
25
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
26
+ expect(result).toContain('[REDACTED]');
27
+ });
28
+ test('should redact connection strings', () => {
29
+ const input = 'DB_URL=postgres://user:pass@host:5432/db';
30
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
31
+ expect(result).toContain('[REDACTED]');
32
+ expect(result).not.toContain('pass@');
33
+ });
34
+ test('should redact .env style secrets', () => {
35
+ const input = 'DATABASE_PASSWORD=supersecret123\nAPI_TOKEN=mytoken456';
36
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
37
+ expect(result).not.toContain('supersecret123');
38
+ expect(result).not.toContain('mytoken456');
39
+ });
40
+ test('should not redact normal text', () => {
41
+ const input = 'This is a normal document about authentication patterns.';
42
+ const result = (0, privacy_filter_js_1.redactSecrets)(input);
43
+ expect(result).toBe(input);
44
+ });
45
+ test('should accept custom patterns from config', () => {
46
+ const input = 'CUSTOM_KEY=abc123';
47
+ const custom = [/CUSTOM_KEY=\S+/g];
48
+ const result = (0, privacy_filter_js_1.redactSecrets)(input, custom);
49
+ expect(result).toContain('[REDACTED]');
50
+ });
51
+ test('should export DEFAULT_PATTERNS array', () => {
52
+ expect(Array.isArray(privacy_filter_js_1.DEFAULT_PATTERNS)).toBe(true);
53
+ expect(privacy_filter_js_1.DEFAULT_PATTERNS.length).toBeGreaterThan(0);
54
+ });
55
+ });
56
+ //# sourceMappingURL=privacy-filter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-filter.test.js","sourceRoot":"","sources":["../../tests/privacy-filter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolve-hook-common.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-hook-common.test.d.ts","sourceRoot":"","sources":["../../tests/resolve-hook-common.test.ts"],"names":[],"mappings":""}