mindlore 0.2.0 → 0.3.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.
Files changed (153) hide show
  1. package/README.md +15 -9
  2. package/SCHEMA.md +15 -2
  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 +406 -0
  6. package/dist/scripts/init.js.map +1 -0
  7. package/dist/scripts/lib/constants.d.ts +56 -0
  8. package/dist/scripts/lib/constants.d.ts.map +1 -0
  9. package/dist/scripts/lib/constants.js +131 -0
  10. package/dist/scripts/lib/constants.js.map +1 -0
  11. package/dist/scripts/lib/schemas.d.ts +93 -0
  12. package/dist/scripts/lib/schemas.d.ts.map +1 -0
  13. package/dist/scripts/lib/schemas.js +108 -0
  14. package/dist/scripts/lib/schemas.js.map +1 -0
  15. package/dist/scripts/mindlore-fts5-index.d.ts +9 -0
  16. package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -0
  17. package/dist/scripts/mindlore-fts5-index.js +88 -0
  18. package/dist/scripts/mindlore-fts5-index.js.map +1 -0
  19. package/dist/scripts/mindlore-fts5-search.d.ts +10 -0
  20. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -0
  21. package/dist/scripts/mindlore-fts5-search.js +121 -0
  22. package/dist/scripts/mindlore-fts5-search.js.map +1 -0
  23. package/dist/scripts/mindlore-health-check.d.ts +10 -0
  24. package/dist/scripts/mindlore-health-check.d.ts.map +1 -0
  25. package/dist/scripts/mindlore-health-check.js +337 -0
  26. package/dist/scripts/mindlore-health-check.js.map +1 -0
  27. package/dist/scripts/uninstall.d.ts +10 -0
  28. package/dist/scripts/uninstall.d.ts.map +1 -0
  29. package/dist/scripts/uninstall.js +153 -0
  30. package/dist/scripts/uninstall.js.map +1 -0
  31. package/dist/tests/compounding.test.d.ts +8 -0
  32. package/dist/tests/compounding.test.d.ts.map +1 -0
  33. package/dist/tests/compounding.test.js +51 -0
  34. package/dist/tests/compounding.test.js.map +1 -0
  35. package/dist/tests/cwd-changed.test.d.ts +2 -0
  36. package/dist/tests/cwd-changed.test.d.ts.map +1 -0
  37. package/dist/tests/cwd-changed.test.js +62 -0
  38. package/dist/tests/cwd-changed.test.js.map +1 -0
  39. package/dist/tests/decision.test.d.ts +2 -0
  40. package/dist/tests/decision.test.d.ts.map +1 -0
  41. package/dist/tests/decision.test.js +61 -0
  42. package/dist/tests/decision.test.js.map +1 -0
  43. package/dist/tests/dedup.test.d.ts +2 -0
  44. package/dist/tests/dedup.test.d.ts.map +1 -0
  45. package/dist/tests/dedup.test.js +74 -0
  46. package/dist/tests/dedup.test.js.map +1 -0
  47. package/dist/tests/dont-repeat.test.d.ts +2 -0
  48. package/dist/tests/dont-repeat.test.d.ts.map +1 -0
  49. package/dist/tests/dont-repeat.test.js +100 -0
  50. package/dist/tests/dont-repeat.test.js.map +1 -0
  51. package/dist/tests/e2e-pipeline.test.d.ts +2 -0
  52. package/dist/tests/e2e-pipeline.test.d.ts.map +1 -0
  53. package/dist/tests/e2e-pipeline.test.js +220 -0
  54. package/dist/tests/e2e-pipeline.test.js.map +1 -0
  55. package/dist/tests/evolve.test.d.ts +2 -0
  56. package/dist/tests/evolve.test.d.ts.map +1 -0
  57. package/dist/tests/evolve.test.js +105 -0
  58. package/dist/tests/evolve.test.js.map +1 -0
  59. package/dist/tests/explore.test.d.ts +2 -0
  60. package/dist/tests/explore.test.d.ts.map +1 -0
  61. package/dist/tests/explore.test.js +146 -0
  62. package/dist/tests/explore.test.js.map +1 -0
  63. package/dist/tests/frontmatter.test.d.ts +2 -0
  64. package/dist/tests/frontmatter.test.d.ts.map +1 -0
  65. package/dist/tests/frontmatter.test.js +90 -0
  66. package/dist/tests/frontmatter.test.js.map +1 -0
  67. package/dist/tests/fts5.test.d.ts +2 -0
  68. package/dist/tests/fts5.test.d.ts.map +1 -0
  69. package/dist/tests/fts5.test.js +95 -0
  70. package/dist/tests/fts5.test.js.map +1 -0
  71. package/dist/tests/global-layer.test.d.ts +2 -0
  72. package/dist/tests/global-layer.test.d.ts.map +1 -0
  73. package/dist/tests/global-layer.test.js +152 -0
  74. package/dist/tests/global-layer.test.js.map +1 -0
  75. package/dist/tests/helpers/db.d.ts +20 -0
  76. package/dist/tests/helpers/db.d.ts.map +1 -0
  77. package/dist/tests/helpers/db.js +46 -0
  78. package/dist/tests/helpers/db.js.map +1 -0
  79. package/dist/tests/hook-smoke.test.d.ts +2 -0
  80. package/dist/tests/hook-smoke.test.d.ts.map +1 -0
  81. package/dist/tests/hook-smoke.test.js +58 -0
  82. package/dist/tests/hook-smoke.test.js.map +1 -0
  83. package/dist/tests/init.test.d.ts +2 -0
  84. package/dist/tests/init.test.d.ts.map +1 -0
  85. package/dist/tests/init.test.js +109 -0
  86. package/dist/tests/init.test.js.map +1 -0
  87. package/dist/tests/log.test.d.ts +2 -0
  88. package/dist/tests/log.test.d.ts.map +1 -0
  89. package/dist/tests/log.test.js +68 -0
  90. package/dist/tests/log.test.js.map +1 -0
  91. package/dist/tests/post-read.test.d.ts +2 -0
  92. package/dist/tests/post-read.test.d.ts.map +1 -0
  93. package/dist/tests/post-read.test.js +69 -0
  94. package/dist/tests/post-read.test.js.map +1 -0
  95. package/dist/tests/quality-populate.test.d.ts +2 -0
  96. package/dist/tests/quality-populate.test.d.ts.map +1 -0
  97. package/dist/tests/quality-populate.test.js +85 -0
  98. package/dist/tests/quality-populate.test.js.map +1 -0
  99. package/dist/tests/read-guard.test.d.ts +2 -0
  100. package/dist/tests/read-guard.test.d.ts.map +1 -0
  101. package/dist/tests/read-guard.test.js +69 -0
  102. package/dist/tests/read-guard.test.js.map +1 -0
  103. package/dist/tests/reflect.test.d.ts +2 -0
  104. package/dist/tests/reflect.test.d.ts.map +1 -0
  105. package/dist/tests/reflect.test.js +122 -0
  106. package/dist/tests/reflect.test.js.map +1 -0
  107. package/dist/tests/schemas.test.d.ts +2 -0
  108. package/dist/tests/schemas.test.d.ts.map +1 -0
  109. package/dist/tests/schemas.test.js +87 -0
  110. package/dist/tests/schemas.test.js.map +1 -0
  111. package/dist/tests/search-hook.test.d.ts +2 -0
  112. package/dist/tests/search-hook.test.d.ts.map +1 -0
  113. package/dist/tests/search-hook.test.js +108 -0
  114. package/dist/tests/search-hook.test.js.map +1 -0
  115. package/dist/tests/session-focus.test.d.ts +2 -0
  116. package/dist/tests/session-focus.test.d.ts.map +1 -0
  117. package/dist/tests/session-focus.test.js +71 -0
  118. package/dist/tests/session-focus.test.js.map +1 -0
  119. package/dist/tests/uninstall.test.d.ts +2 -0
  120. package/dist/tests/uninstall.test.d.ts.map +1 -0
  121. package/dist/tests/uninstall.test.js +98 -0
  122. package/dist/tests/uninstall.test.js.map +1 -0
  123. package/dist/tests/upgrade.test.d.ts +2 -0
  124. package/dist/tests/upgrade.test.d.ts.map +1 -0
  125. package/dist/tests/upgrade.test.js +91 -0
  126. package/dist/tests/upgrade.test.js.map +1 -0
  127. package/hooks/lib/mindlore-common.cjs +66 -5
  128. package/hooks/lib/types.d.ts +56 -0
  129. package/hooks/mindlore-cwd-changed.cjs +57 -0
  130. package/hooks/mindlore-dont-repeat.cjs +222 -0
  131. package/hooks/mindlore-fts5-sync.cjs +6 -9
  132. package/hooks/mindlore-index.cjs +3 -3
  133. package/hooks/mindlore-post-read.cjs +97 -0
  134. package/hooks/mindlore-read-guard.cjs +27 -4
  135. package/hooks/mindlore-search.cjs +73 -52
  136. package/hooks/mindlore-session-end.cjs +43 -1
  137. package/hooks/mindlore-session-focus.cjs +14 -0
  138. package/package.json +21 -8
  139. package/plugin.json +24 -1
  140. package/skills/mindlore-decide/SKILL.md +8 -0
  141. package/skills/mindlore-evolve/SKILL.md +81 -0
  142. package/skills/mindlore-explore/SKILL.md +84 -0
  143. package/skills/mindlore-health/SKILL.md +8 -0
  144. package/skills/mindlore-ingest/SKILL.md +19 -4
  145. package/skills/mindlore-log/SKILL.md +30 -13
  146. package/skills/mindlore-query/SKILL.md +8 -0
  147. package/templates/SCHEMA.md +15 -2
  148. package/scripts/init.cjs +0 -448
  149. package/scripts/lib/constants.cjs +0 -49
  150. package/scripts/mindlore-fts5-index.cjs +0 -112
  151. package/scripts/mindlore-fts5-search.cjs +0 -119
  152. package/scripts/mindlore-health-check.cjs +0 -389
  153. package/scripts/uninstall.cjs +0 -186
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const child_process_1 = require("child_process");
9
+ const db_1 = require("./helpers/db");
10
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-cwd-changed');
11
+ const FAKE_PROJECT_A = path_1.default.join(TEST_DIR, 'project-a');
12
+ const FAKE_PROJECT_B = path_1.default.join(TEST_DIR, 'project-b');
13
+ const HOOK_SCRIPT = path_1.default.resolve(__dirname, '..', 'hooks', 'mindlore-cwd-changed.cjs');
14
+ beforeEach(() => {
15
+ (0, db_1.setupTestDir)(TEST_DIR);
16
+ fs_1.default.mkdirSync(FAKE_PROJECT_A, { recursive: true });
17
+ fs_1.default.mkdirSync(FAKE_PROJECT_B, { recursive: true });
18
+ });
19
+ afterEach(() => {
20
+ (0, db_1.teardownTestDir)(TEST_DIR);
21
+ });
22
+ describe('mindlore-cwd-changed hook', () => {
23
+ test('writes _scope.json when project .mindlore/ exists', () => {
24
+ // Create .mindlore/ in project A
25
+ const mindloreDir = path_1.default.join(FAKE_PROJECT_A, '.mindlore');
26
+ const diaryDir = path_1.default.join(mindloreDir, 'diary');
27
+ fs_1.default.mkdirSync(diaryDir, { recursive: true });
28
+ (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
29
+ cwd: FAKE_PROJECT_A,
30
+ stdio: 'pipe',
31
+ env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
32
+ });
33
+ const scopePath = path_1.default.join(diaryDir, '_scope.json');
34
+ expect(fs_1.default.existsSync(scopePath)).toBe(true);
35
+ const scope = JSON.parse(fs_1.default.readFileSync(scopePath, 'utf8'));
36
+ expect(scope.scope).toBe('project');
37
+ expect(scope.dir).toBe(mindloreDir);
38
+ });
39
+ test('outputs warning to stderr when no .mindlore/ exists', () => {
40
+ // Hook outputs to stderr — capture via 2>&1
41
+ const result = (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}" 2>&1`, {
42
+ cwd: FAKE_PROJECT_B,
43
+ encoding: 'utf8',
44
+ env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
45
+ });
46
+ expect(result).toContain('mindlore kurulu degil');
47
+ });
48
+ test('scope.json has correct timestamp format', () => {
49
+ const mindloreDir = path_1.default.join(FAKE_PROJECT_A, '.mindlore');
50
+ const diaryDir = path_1.default.join(mindloreDir, 'diary');
51
+ fs_1.default.mkdirSync(diaryDir, { recursive: true });
52
+ (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
53
+ cwd: FAKE_PROJECT_A,
54
+ stdio: 'pipe',
55
+ env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
56
+ });
57
+ const scope = JSON.parse(fs_1.default.readFileSync(path_1.default.join(diaryDir, '_scope.json'), 'utf8'));
58
+ expect(scope.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
59
+ expect(scope.cwd).toBe(FAKE_PROJECT_A);
60
+ });
61
+ });
62
+ //# sourceMappingURL=cwd-changed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwd-changed.test.js","sourceRoot":"","sources":["../../tests/cwd-changed.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=decision.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.test.d.ts","sourceRoot":"","sources":["../../tests/decision.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
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-decision');
11
+ const MINDLORE_DIR = path_1.default.join(PROJECT_DIR, '.mindlore');
12
+ const HOOK_PATH = path_1.default.join(__dirname, '..', 'hooks', 'mindlore-decision-detector.cjs');
13
+ beforeEach(() => {
14
+ (0, db_js_1.setupTestDir)(MINDLORE_DIR, ['decisions', 'diary']);
15
+ fs_1.default.writeFileSync(path_1.default.join(MINDLORE_DIR, 'INDEX.md'), '# Index\n', 'utf8');
16
+ });
17
+ afterEach(() => {
18
+ (0, db_js_1.teardownTestDir)(PROJECT_DIR);
19
+ });
20
+ function runDetector(input) {
21
+ try {
22
+ const result = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
23
+ input,
24
+ encoding: 'utf8',
25
+ timeout: 5000,
26
+ cwd: PROJECT_DIR,
27
+ env: { ...process.env },
28
+ });
29
+ return result.trim();
30
+ }
31
+ catch (err) {
32
+ const e = err;
33
+ return (e.stdout ?? '').trim();
34
+ }
35
+ }
36
+ describe('Decision Detector Hook', () => {
37
+ test('should detect Turkish decision signal', () => {
38
+ const output = runDetector('FTS5 kullanmaya karar verdik, vector search ertelenecek');
39
+ expect(output).toContain('Karar sinyali');
40
+ expect(output).toContain('karar verdik');
41
+ });
42
+ test('should detect English decision signal', () => {
43
+ const output = runDetector('We decided to use SQLite instead of PostgreSQL');
44
+ expect(output).toContain('Karar sinyali');
45
+ expect(output).toContain('decided');
46
+ });
47
+ test('should not trigger on normal text', () => {
48
+ const output = runDetector('Bu dosyayı oku ve bana özetle');
49
+ expect(output).toBe('');
50
+ });
51
+ test('should not trigger on short input', () => {
52
+ const output = runDetector('merhaba');
53
+ expect(output).toBe('');
54
+ });
55
+ test('should handle JSON input format', () => {
56
+ const input = JSON.stringify({ prompt: "Let's go with option B for the API design" });
57
+ const output = runDetector(input);
58
+ expect(output).toContain('Karar sinyali');
59
+ });
60
+ });
61
+ //# sourceMappingURL=decision.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision.test.js","sourceRoot":"","sources":["../../tests/decision.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,iDAAyC;AACzC,2CAAgE;AAEhE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;AACzE,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACzD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,gCAAgC,CAAC,CAAC;AAExF,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,WAAW,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,SAAS,SAAS,GAAG,EAAE;YAC7C,KAAK;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA0B,CAAC;QACrC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,yDAAyD,CAAC,CAAC;QACtF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,gDAAgD,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,+BAA+B,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC,CAAC;QACtF,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dedup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.test.d.ts","sourceRoot":"","sources":["../../tests/dedup.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
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-dedup');
10
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
11
+ beforeEach(() => {
12
+ (0, db_js_1.setupTestDir)(TEST_DIR);
13
+ const db = (0, db_js_1.createTestDb)(DB_PATH);
14
+ db.close();
15
+ });
16
+ afterEach(() => {
17
+ (0, db_js_1.teardownTestDir)(TEST_DIR);
18
+ });
19
+ describe('Content-Hash Dedup', () => {
20
+ test('should index file and store hash', () => {
21
+ const db = new better_sqlite3_1.default(DB_PATH);
22
+ const content = '# Test\n\nSome content here.';
23
+ const hash = (0, db_js_1.sha256)(content);
24
+ const filePath = path_1.default.join(TEST_DIR, 'test.md');
25
+ (0, db_js_1.insertFts)(db, { path: filePath, slug: 'test-doc', description: 'Some content here', type: 'source', category: 'sources', title: 'Test', content, tags: '', quality: null });
26
+ db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, hash, new Date().toISOString());
27
+ const result = db
28
+ .prepare('SELECT content_hash FROM file_hashes WHERE path = ?')
29
+ .get(filePath);
30
+ expect(result.content_hash).toBe(hash);
31
+ db.close();
32
+ });
33
+ test('should skip re-index when content unchanged', () => {
34
+ const db = new better_sqlite3_1.default(DB_PATH);
35
+ const content = '# Unchanged\n\nThis content does not change.';
36
+ const hash = (0, db_js_1.sha256)(content);
37
+ const filePath = path_1.default.join(TEST_DIR, 'unchanged.md');
38
+ (0, db_js_1.insertFts)(db, { path: filePath, slug: 'unchanged-doc', description: 'This content does not change', type: 'source', category: 'sources', title: 'Unchanged', content, tags: '', quality: null });
39
+ db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, hash, '2026-01-01T00:00:00Z');
40
+ const existing = db
41
+ .prepare('SELECT content_hash FROM file_hashes WHERE path = ?')
42
+ .get(filePath);
43
+ const newHash = (0, db_js_1.sha256)(content);
44
+ expect(existing.content_hash).toBe(newHash);
45
+ const count = db
46
+ .prepare('SELECT count(*) as cnt FROM mindlore_fts WHERE path = ?')
47
+ .get(filePath);
48
+ expect(count.cnt).toBe(1);
49
+ db.close();
50
+ });
51
+ test('should re-index when content changes', () => {
52
+ const db = new better_sqlite3_1.default(DB_PATH);
53
+ const original = '# Original\n\nFirst version.';
54
+ const modified = '# Modified\n\nSecond version with changes.';
55
+ const filePath = path_1.default.join(TEST_DIR, 'changing.md');
56
+ const originalHash = (0, db_js_1.sha256)(original);
57
+ (0, db_js_1.insertFts)(db, { path: filePath, slug: 'changing-doc', description: 'First version', type: 'source', category: 'sources', title: 'Original', content: original, tags: '', quality: null });
58
+ db.prepare('INSERT INTO file_hashes (path, content_hash, last_indexed) VALUES (?, ?, ?)').run(filePath, originalHash, '2026-01-01T00:00:00Z');
59
+ const modifiedHash = (0, db_js_1.sha256)(modified);
60
+ const existing = db
61
+ .prepare('SELECT content_hash FROM file_hashes WHERE path = ?')
62
+ .get(filePath);
63
+ expect(existing.content_hash).not.toBe(modifiedHash);
64
+ db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
65
+ (0, db_js_1.insertFts)(db, { path: filePath, slug: 'changing-doc', description: 'Second version with changes', type: 'source', category: 'sources', title: 'Modified', content: modified, tags: '', quality: null });
66
+ db.prepare('UPDATE file_hashes SET content_hash = ?, last_indexed = ? WHERE path = ?').run(modifiedHash, new Date().toISOString(), filePath);
67
+ const results = db
68
+ .prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ?')
69
+ .all('changes');
70
+ expect(results).toHaveLength(1);
71
+ db.close();
72
+ });
73
+ });
74
+ //# sourceMappingURL=dedup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup.test.js","sourceRoot":"","sources":["../../tests/dedup.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dont-repeat.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dont-repeat.test.d.ts","sourceRoot":"","sources":["../../tests/dont-repeat.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
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 db_1 = require("./helpers/db");
10
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-dont-repeat');
11
+ const HOOK_SCRIPT = path_1.default.resolve(__dirname, '..', 'hooks', 'mindlore-dont-repeat.cjs');
12
+ beforeEach(() => {
13
+ (0, db_1.setupTestDir)(TEST_DIR);
14
+ // Create a fake lessons file with negative rules
15
+ const lessonsDir = path_1.default.join(TEST_DIR, '.claude', 'lessons');
16
+ fs_1.default.mkdirSync(lessonsDir, { recursive: true });
17
+ fs_1.default.writeFileSync(path_1.default.join(lessonsDir, 'global.md'), [
18
+ '# Global Lessons',
19
+ '',
20
+ '- YAPMA: ESM projede `__dirname` kullanma. `fileURLToPath(import.meta.url)` kullan',
21
+ '- DON\'T: Use `any` type in TypeScript — use `unknown` + type guard',
22
+ '- NEVER: Use `console.log` for production logging',
23
+ ].join('\n'), 'utf8');
24
+ });
25
+ afterEach(() => {
26
+ (0, db_1.teardownTestDir)(TEST_DIR);
27
+ });
28
+ function runHook(stdinData) {
29
+ try {
30
+ return (0, child_process_1.execSync)(`node "${HOOK_SCRIPT}"`, {
31
+ input: JSON.stringify(stdinData),
32
+ encoding: 'utf8',
33
+ timeout: 5000,
34
+ env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
35
+ cwd: TEST_DIR,
36
+ });
37
+ }
38
+ catch (err) {
39
+ return err.stdout || '';
40
+ }
41
+ }
42
+ describe('mindlore-dont-repeat hook', () => {
43
+ test('detects violation when writing code with banned pattern', () => {
44
+ const result = runHook({
45
+ tool_name: 'Write',
46
+ tool_input: {
47
+ file_path: path_1.default.join(TEST_DIR, 'test.ts'),
48
+ content: 'const dir = __dirname;\nconsole.log(dir);',
49
+ },
50
+ });
51
+ // Should output JSON with additionalContext containing violation
52
+ if (result.trim()) {
53
+ const parsed = JSON.parse(result);
54
+ expect(parsed.hookSpecificOutput.additionalContext).toContain('dont-repeat');
55
+ }
56
+ // If no output, patterns may not have matched (short pattern filter)
57
+ });
58
+ test('does not trigger on non-code files', () => {
59
+ const result = runHook({
60
+ tool_name: 'Write',
61
+ tool_input: {
62
+ file_path: path_1.default.join(TEST_DIR, 'README.md'),
63
+ content: 'const dir = __dirname;',
64
+ },
65
+ });
66
+ expect(result.trim()).toBe('');
67
+ });
68
+ test('does not trigger on Edit old_string (code being removed)', () => {
69
+ const result = runHook({
70
+ tool_name: 'Edit',
71
+ tool_input: {
72
+ file_path: path_1.default.join(TEST_DIR, 'test.ts'),
73
+ old_string: 'const dir = __dirname;',
74
+ new_string: 'const dir = import.meta.url;',
75
+ },
76
+ });
77
+ // old_string contains __dirname but should NOT trigger (it's being removed)
78
+ // new_string is clean
79
+ expect(result.trim()).toBe('');
80
+ });
81
+ test('only accepts Write and Edit tool names', () => {
82
+ const result = runHook({
83
+ tool_name: 'Read',
84
+ tool_input: {
85
+ file_path: path_1.default.join(TEST_DIR, 'test.ts'),
86
+ },
87
+ });
88
+ expect(result.trim()).toBe('');
89
+ });
90
+ test('exits cleanly with empty stdin', () => {
91
+ const result = (0, child_process_1.execSync)(`echo "{}" | node "${HOOK_SCRIPT}"`, {
92
+ encoding: 'utf8',
93
+ timeout: 5000,
94
+ env: { ...process.env, HOME: TEST_DIR, USERPROFILE: TEST_DIR },
95
+ cwd: TEST_DIR,
96
+ });
97
+ expect(result.trim()).toBe('');
98
+ });
99
+ });
100
+ //# sourceMappingURL=dont-repeat.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dont-repeat.test.js","sourceRoot":"","sources":["../../tests/dont-repeat.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=e2e-pipeline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-pipeline.test.d.ts","sourceRoot":"","sources":["../../tests/e2e-pipeline.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,220 @@
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 db_1 = require("./helpers/db");
9
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-e2e-pipeline');
10
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
11
+ beforeEach(() => {
12
+ (0, db_1.setupTestDir)(TEST_DIR, [
13
+ 'raw', 'sources', 'domains', 'analyses', 'insights',
14
+ 'connections', 'learnings', 'diary', 'decisions',
15
+ ]);
16
+ });
17
+ afterEach(() => {
18
+ (0, db_1.teardownTestDir)(TEST_DIR);
19
+ });
20
+ describe('E2E Pipeline: ingest → index → search → connections', () => {
21
+ test('full pipeline: write source → index → search finds it', () => {
22
+ // Step 1: Simulate ingest — write raw + source
23
+ const rawContent = [
24
+ '---',
25
+ 'slug: react-hooks-raw',
26
+ 'type: raw',
27
+ 'source_url: https://react.dev/reference/react/useEffect',
28
+ 'date_captured: 2026-04-12',
29
+ '---',
30
+ '',
31
+ '# useEffect',
32
+ '',
33
+ 'useEffect is a React Hook that lets you synchronize a component with an external system.',
34
+ ].join('\n');
35
+ const sourceContent = [
36
+ '---',
37
+ 'slug: react-hooks',
38
+ 'type: source',
39
+ 'title: React useEffect Guide',
40
+ 'source_url: https://react.dev/reference/react/useEffect',
41
+ 'date_captured: 2026-04-12',
42
+ 'tags: react, hooks, useEffect',
43
+ 'quality: high',
44
+ '---',
45
+ '',
46
+ '# React useEffect Guide',
47
+ '',
48
+ 'useEffect lets you synchronize with external systems.',
49
+ '',
50
+ '## Key Takeaways',
51
+ '- Cleanup function prevents memory leaks',
52
+ '- Dependency array controls re-execution',
53
+ ].join('\n');
54
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'raw', 'react-hooks-raw.md'), rawContent);
55
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'), sourceContent);
56
+ // Step 2: Index into FTS5
57
+ const db = (0, db_1.createTestDb)(DB_PATH);
58
+ (0, db_1.insertFts)(db, {
59
+ path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'),
60
+ slug: 'react-hooks',
61
+ description: 'React useEffect synchronization patterns',
62
+ type: 'source',
63
+ category: 'sources',
64
+ title: 'React useEffect Guide',
65
+ content: sourceContent,
66
+ tags: 'react, hooks, useEffect',
67
+ quality: 'high',
68
+ dateCaptured: '2026-04-12',
69
+ });
70
+ // Step 3: Search — should find the indexed source
71
+ const results = db.prepare("SELECT slug, title, quality, date_captured FROM mindlore_fts WHERE mindlore_fts MATCH 'useEffect'").all();
72
+ expect(results).toHaveLength(1);
73
+ expect(results[0].slug).toBe('react-hooks');
74
+ expect(results[0].quality).toBe('high');
75
+ expect(results[0].date_captured).toBe('2026-04-12');
76
+ db.close();
77
+ });
78
+ test('multi-source search with ranking', () => {
79
+ const db = (0, db_1.createTestDb)(DB_PATH);
80
+ // Insert 3 sources with overlapping keywords
81
+ (0, db_1.insertFts)(db, {
82
+ path: path_1.default.join(TEST_DIR, 'sources', 'hooks-guide.md'),
83
+ slug: 'hooks-guide',
84
+ type: 'source',
85
+ title: 'Hooks Complete Guide',
86
+ content: 'Hooks hooks hooks. useEffect, useState, useCallback. Hooks are lifecycle callbacks in React.',
87
+ tags: 'react, hooks',
88
+ quality: 'high',
89
+ });
90
+ (0, db_1.insertFts)(db, {
91
+ path: path_1.default.join(TEST_DIR, 'sources', 'cc-hooks.md'),
92
+ slug: 'cc-hooks',
93
+ type: 'source',
94
+ title: 'Claude Code Hooks',
95
+ content: 'PreToolUse hooks, PostToolUse hooks, SessionStart hooks. CC lifecycle callbacks.',
96
+ tags: 'hooks, claude-code',
97
+ quality: 'high',
98
+ });
99
+ (0, db_1.insertFts)(db, {
100
+ path: path_1.default.join(TEST_DIR, 'sources', 'python-basics.md'),
101
+ slug: 'python-basics',
102
+ type: 'source',
103
+ title: 'Python Basics',
104
+ content: 'Python is a programming language for data science and web development.',
105
+ tags: 'python',
106
+ quality: 'medium',
107
+ });
108
+ // Search "hooks" — should return 2, not python
109
+ const results = db.prepare("SELECT slug FROM mindlore_fts WHERE mindlore_fts MATCH 'hooks' ORDER BY rank").all();
110
+ expect(results.length).toBeGreaterThanOrEqual(2);
111
+ const slugs = results.map(r => r.slug);
112
+ expect(slugs).toContain('hooks-guide');
113
+ expect(slugs).toContain('cc-hooks');
114
+ expect(slugs).not.toContain('python-basics');
115
+ db.close();
116
+ });
117
+ test('connection detection: shared tags across sources', () => {
118
+ const db = (0, db_1.createTestDb)(DB_PATH);
119
+ // Two sources with shared "hooks" tag but different domains
120
+ (0, db_1.insertFts)(db, {
121
+ path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'),
122
+ slug: 'react-hooks',
123
+ type: 'source',
124
+ title: 'React Hooks',
125
+ content: 'React hooks for state management',
126
+ tags: 'hooks, react, state-management',
127
+ });
128
+ (0, db_1.insertFts)(db, {
129
+ path: path_1.default.join(TEST_DIR, 'sources', 'cc-hooks.md'),
130
+ slug: 'cc-hooks',
131
+ type: 'source',
132
+ title: 'CC Hooks',
133
+ content: 'Claude Code hooks for lifecycle callbacks',
134
+ tags: 'hooks, claude-code, lifecycle',
135
+ });
136
+ (0, db_1.insertFts)(db, {
137
+ path: path_1.default.join(TEST_DIR, 'sources', 'unrelated.md'),
138
+ slug: 'unrelated',
139
+ type: 'source',
140
+ title: 'Python ML',
141
+ content: 'Machine learning with Python',
142
+ tags: 'python, ml',
143
+ });
144
+ // Find tag overlap (simulating explore logic)
145
+ const allSources = db.prepare("SELECT slug, tags FROM mindlore_fts WHERE type = 'source'").all();
146
+ const tagMap = {};
147
+ for (const src of allSources) {
148
+ if (!src.tags)
149
+ continue;
150
+ const tags = src.tags.split(',').map(t => t.trim());
151
+ for (const tag of tags) {
152
+ if (!tagMap[tag])
153
+ tagMap[tag] = [];
154
+ tagMap[tag].push(src.slug);
155
+ }
156
+ }
157
+ // "hooks" tag shared by react-hooks and cc-hooks
158
+ expect(tagMap['hooks']).toBeDefined();
159
+ expect(tagMap['hooks']).toContain('react-hooks');
160
+ expect(tagMap['hooks']).toContain('cc-hooks');
161
+ expect(tagMap['hooks']).not.toContain('unrelated');
162
+ // Write connection file
163
+ const connectionContent = [
164
+ '---',
165
+ 'type: connection',
166
+ 'slug: conn-react-cc-hooks',
167
+ 'sources: [react-hooks.md, cc-hooks.md]',
168
+ 'strength: medium',
169
+ 'tags: hooks',
170
+ '---',
171
+ '',
172
+ '## Connection',
173
+ 'Both sources discuss hooks patterns in different contexts.',
174
+ ].join('\n');
175
+ const connPath = path_1.default.join(TEST_DIR, 'connections', 'conn-react-cc-hooks.md');
176
+ fs_1.default.writeFileSync(connPath, connectionContent);
177
+ expect(fs_1.default.existsSync(connPath)).toBe(true);
178
+ // Connection is indexable
179
+ (0, db_1.insertFts)(db, {
180
+ path: connPath,
181
+ slug: 'conn-react-cc-hooks',
182
+ type: 'connection',
183
+ title: 'React Hooks ↔ CC Hooks',
184
+ content: connectionContent,
185
+ tags: 'hooks',
186
+ });
187
+ const connResults = db.prepare("SELECT slug FROM mindlore_fts WHERE type = 'connection'").all();
188
+ expect(connResults).toHaveLength(1);
189
+ db.close();
190
+ });
191
+ test('10-column FTS5 schema integrity', () => {
192
+ const db = (0, db_1.createTestDb)(DB_PATH);
193
+ // Insert a row with all 10 columns and read back to verify schema
194
+ (0, db_1.insertFts)(db, {
195
+ path: '/test/schema-check.md',
196
+ slug: 'schema-check',
197
+ description: 'test desc',
198
+ type: 'source',
199
+ category: 'sources',
200
+ title: 'Schema Check',
201
+ content: 'test content',
202
+ tags: 'test',
203
+ quality: 'high',
204
+ dateCaptured: '2026-04-12',
205
+ });
206
+ const row = db.prepare('SELECT path, slug, description, type, category, title, content, tags, quality, date_captured FROM mindlore_fts WHERE slug = ?').get('schema-check');
207
+ expect(row.path).toBe('/test/schema-check.md');
208
+ expect(row.slug).toBe('schema-check');
209
+ expect(row.description).toBe('test desc');
210
+ expect(row.type).toBe('source');
211
+ expect(row.category).toBe('sources');
212
+ expect(row.title).toBe('Schema Check');
213
+ expect(row.content).toBe('test content');
214
+ expect(row.tags).toBe('test');
215
+ expect(row.quality).toBe('high');
216
+ expect(row.date_captured).toBe('2026-04-12');
217
+ db.close();
218
+ });
219
+ });
220
+ //# sourceMappingURL=e2e-pipeline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2e-pipeline.test.js","sourceRoot":"","sources":["../../tests/e2e-pipeline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evolve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolve.test.d.ts","sourceRoot":"","sources":["../../tests/evolve.test.ts"],"names":[],"mappings":""}