mindlore 0.2.1 → 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 (102) hide show
  1. package/README.md +8 -8
  2. package/SCHEMA.md +15 -2
  3. package/dist/scripts/init.d.ts +1 -1
  4. package/dist/scripts/init.js +98 -67
  5. package/dist/scripts/init.js.map +1 -1
  6. package/dist/scripts/lib/constants.d.ts +27 -0
  7. package/dist/scripts/lib/constants.d.ts.map +1 -1
  8. package/dist/scripts/lib/constants.js +74 -1
  9. package/dist/scripts/lib/constants.js.map +1 -1
  10. package/dist/scripts/lib/schemas.d.ts +93 -0
  11. package/dist/scripts/lib/schemas.d.ts.map +1 -0
  12. package/dist/scripts/lib/schemas.js +108 -0
  13. package/dist/scripts/lib/schemas.js.map +1 -0
  14. package/dist/scripts/mindlore-fts5-index.js +3 -4
  15. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  16. package/dist/scripts/mindlore-fts5-search.d.ts +1 -1
  17. package/dist/scripts/mindlore-fts5-search.js +87 -74
  18. package/dist/scripts/mindlore-fts5-search.js.map +1 -1
  19. package/dist/scripts/uninstall.d.ts +1 -1
  20. package/dist/scripts/uninstall.js +27 -17
  21. package/dist/scripts/uninstall.js.map +1 -1
  22. package/dist/tests/compounding.test.js +2 -2
  23. package/dist/tests/compounding.test.js.map +1 -1
  24. package/dist/tests/cwd-changed.test.d.ts +2 -0
  25. package/dist/tests/cwd-changed.test.d.ts.map +1 -0
  26. package/dist/tests/cwd-changed.test.js +62 -0
  27. package/dist/tests/cwd-changed.test.js.map +1 -0
  28. package/dist/tests/dedup.test.js +4 -4
  29. package/dist/tests/dedup.test.js.map +1 -1
  30. package/dist/tests/dont-repeat.test.d.ts +2 -0
  31. package/dist/tests/dont-repeat.test.d.ts.map +1 -0
  32. package/dist/tests/dont-repeat.test.js +100 -0
  33. package/dist/tests/dont-repeat.test.js.map +1 -0
  34. package/dist/tests/e2e-pipeline.test.d.ts +2 -0
  35. package/dist/tests/e2e-pipeline.test.d.ts.map +1 -0
  36. package/dist/tests/e2e-pipeline.test.js +220 -0
  37. package/dist/tests/e2e-pipeline.test.js.map +1 -0
  38. package/dist/tests/evolve.test.d.ts +2 -0
  39. package/dist/tests/evolve.test.d.ts.map +1 -0
  40. package/dist/tests/evolve.test.js +105 -0
  41. package/dist/tests/evolve.test.js.map +1 -0
  42. package/dist/tests/explore.test.d.ts +2 -0
  43. package/dist/tests/explore.test.d.ts.map +1 -0
  44. package/dist/tests/explore.test.js +146 -0
  45. package/dist/tests/explore.test.js.map +1 -0
  46. package/dist/tests/fts5.test.js +7 -7
  47. package/dist/tests/fts5.test.js.map +1 -1
  48. package/dist/tests/global-layer.test.d.ts +2 -0
  49. package/dist/tests/global-layer.test.d.ts.map +1 -0
  50. package/dist/tests/global-layer.test.js +152 -0
  51. package/dist/tests/global-layer.test.js.map +1 -0
  52. package/dist/tests/helpers/db.d.ts +14 -1
  53. package/dist/tests/helpers/db.d.ts.map +1 -1
  54. package/dist/tests/helpers/db.js +3 -3
  55. package/dist/tests/helpers/db.js.map +1 -1
  56. package/dist/tests/hook-smoke.test.js +2 -2
  57. package/dist/tests/hook-smoke.test.js.map +1 -1
  58. package/dist/tests/init.test.js +24 -0
  59. package/dist/tests/init.test.js.map +1 -1
  60. package/dist/tests/post-read.test.d.ts +2 -0
  61. package/dist/tests/post-read.test.d.ts.map +1 -0
  62. package/dist/tests/post-read.test.js +69 -0
  63. package/dist/tests/post-read.test.js.map +1 -0
  64. package/dist/tests/quality-populate.test.d.ts +2 -0
  65. package/dist/tests/quality-populate.test.d.ts.map +1 -0
  66. package/dist/tests/quality-populate.test.js +85 -0
  67. package/dist/tests/quality-populate.test.js.map +1 -0
  68. package/dist/tests/reflect.test.d.ts +2 -0
  69. package/dist/tests/reflect.test.d.ts.map +1 -0
  70. package/dist/tests/reflect.test.js +122 -0
  71. package/dist/tests/reflect.test.js.map +1 -0
  72. package/dist/tests/schemas.test.d.ts +2 -0
  73. package/dist/tests/schemas.test.d.ts.map +1 -0
  74. package/dist/tests/schemas.test.js +87 -0
  75. package/dist/tests/schemas.test.js.map +1 -0
  76. package/dist/tests/search-hook.test.js +3 -3
  77. package/dist/tests/search-hook.test.js.map +1 -1
  78. package/dist/tests/upgrade.test.d.ts +2 -0
  79. package/dist/tests/upgrade.test.d.ts.map +1 -0
  80. package/dist/tests/upgrade.test.js +91 -0
  81. package/dist/tests/upgrade.test.js.map +1 -0
  82. package/hooks/lib/mindlore-common.cjs +66 -5
  83. package/hooks/lib/types.d.ts +56 -0
  84. package/hooks/mindlore-cwd-changed.cjs +57 -0
  85. package/hooks/mindlore-dont-repeat.cjs +222 -0
  86. package/hooks/mindlore-fts5-sync.cjs +6 -9
  87. package/hooks/mindlore-index.cjs +3 -3
  88. package/hooks/mindlore-post-read.cjs +97 -0
  89. package/hooks/mindlore-read-guard.cjs +27 -4
  90. package/hooks/mindlore-search.cjs +73 -52
  91. package/hooks/mindlore-session-end.cjs +43 -1
  92. package/hooks/mindlore-session-focus.cjs +14 -0
  93. package/package.json +3 -2
  94. package/plugin.json +24 -1
  95. package/skills/mindlore-decide/SKILL.md +8 -0
  96. package/skills/mindlore-evolve/SKILL.md +81 -0
  97. package/skills/mindlore-explore/SKILL.md +84 -0
  98. package/skills/mindlore-health/SKILL.md +8 -0
  99. package/skills/mindlore-ingest/SKILL.md +19 -4
  100. package/skills/mindlore-log/SKILL.md +30 -13
  101. package/skills/mindlore-query/SKILL.md +8 -0
  102. package/templates/SCHEMA.md +15 -2
@@ -0,0 +1,105 @@
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-evolve');
10
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
11
+ let db;
12
+ beforeEach(() => {
13
+ (0, db_1.setupTestDir)(TEST_DIR, [
14
+ 'raw', 'sources', 'domains', 'analyses', 'insights',
15
+ 'connections', 'learnings', 'diary', 'decisions',
16
+ ]);
17
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'INDEX.md'), [
18
+ '# Knowledge Index',
19
+ '',
20
+ '## Sources',
21
+ '- [react-hooks](sources/react-hooks.md)',
22
+ '- [cc-internals](sources/cc-internals.md)',
23
+ '',
24
+ '## Domains',
25
+ '- [frontend](domains/frontend.md)',
26
+ ].join('\n'));
27
+ db = (0, db_1.createTestDb)(DB_PATH);
28
+ });
29
+ afterEach(() => {
30
+ db.close();
31
+ (0, db_1.teardownTestDir)(TEST_DIR);
32
+ });
33
+ describe('Evolve — orphan detection and cross-reference analysis', () => {
34
+ test('detects orphan files not listed in INDEX.md', () => {
35
+ // Create a source file that IS in INDEX
36
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'), '---\nslug: react-hooks\ntype: source\n---\n# React Hooks\n');
37
+ // Create a source file NOT in INDEX (orphan)
38
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'sources', 'orphan-doc.md'), '---\nslug: orphan-doc\ntype: source\n---\n# Orphan\n');
39
+ const indexContent = fs_1.default.readFileSync(path_1.default.join(TEST_DIR, 'INDEX.md'), 'utf8');
40
+ const sourceFiles = fs_1.default.readdirSync(path_1.default.join(TEST_DIR, 'sources'))
41
+ .filter(f => f.endsWith('.md'));
42
+ const orphans = sourceFiles.filter(f => !indexContent.includes(f.replace('.md', '')));
43
+ expect(orphans).toContain('orphan-doc.md');
44
+ expect(orphans).not.toContain('react-hooks.md');
45
+ });
46
+ test('detects source without domain reference', () => {
47
+ // Source exists
48
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'sources', 'cc-internals.md'), '---\nslug: cc-internals\ntype: source\n---\n# CC Internals\nHooks and memory.\n');
49
+ // Domain exists but doesn't reference cc-internals
50
+ fs_1.default.writeFileSync(path_1.default.join(TEST_DIR, 'domains', 'frontend.md'), '---\nslug: frontend\ntype: domain\n---\n# Frontend\nReact and Vue patterns.\n');
51
+ const domainContent = fs_1.default.readFileSync(path_1.default.join(TEST_DIR, 'domains', 'frontend.md'), 'utf8');
52
+ const sourceFiles = fs_1.default.readdirSync(path_1.default.join(TEST_DIR, 'sources'))
53
+ .filter(f => f.endsWith('.md'));
54
+ const unreferenced = sourceFiles.filter(f => {
55
+ const slug = f.replace('.md', '');
56
+ return !domainContent.includes(slug);
57
+ });
58
+ expect(unreferenced).toContain('cc-internals.md');
59
+ });
60
+ test('INDEX.md can be updated with new entries', () => {
61
+ const indexPath = path_1.default.join(TEST_DIR, 'INDEX.md');
62
+ const original = fs_1.default.readFileSync(indexPath, 'utf8');
63
+ // Add new source reference
64
+ const updated = original.replace('## Domains', '- [new-source](sources/new-source.md)\n\n## Domains');
65
+ fs_1.default.writeFileSync(indexPath, updated);
66
+ const content = fs_1.default.readFileSync(indexPath, 'utf8');
67
+ expect(content).toContain('new-source');
68
+ expect(content).toContain('react-hooks');
69
+ });
70
+ test('log.md receives EVOLVE entries', () => {
71
+ const logPath = path_1.default.join(TEST_DIR, 'log.md');
72
+ fs_1.default.writeFileSync(logPath, '| Date | Op | File |\n|------|-----|------|\n');
73
+ const entry = `| 2026-04-12 | evolve | 2 orphans fixed, 1 ref added |\n`;
74
+ fs_1.default.appendFileSync(logPath, entry);
75
+ const content = fs_1.default.readFileSync(logPath, 'utf8');
76
+ expect(content).toContain('evolve');
77
+ expect(content).toContain('orphans fixed');
78
+ });
79
+ test('FTS5 indexed sources can be queried for staleness check', () => {
80
+ (0, db_1.insertFts)(db, {
81
+ path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'),
82
+ slug: 'react-hooks',
83
+ type: 'source',
84
+ title: 'React Hooks',
85
+ content: 'React hooks patterns',
86
+ dateCaptured: '2026-03-01',
87
+ });
88
+ (0, db_1.insertFts)(db, {
89
+ path: path_1.default.join(TEST_DIR, 'domains', 'frontend.md'),
90
+ slug: 'frontend',
91
+ type: 'domain',
92
+ title: 'Frontend',
93
+ content: 'Frontend development patterns',
94
+ dateCaptured: '2026-01-15',
95
+ });
96
+ // Domain is older than source — potentially stale
97
+ const sources = db.prepare("SELECT slug, date_captured FROM mindlore_fts WHERE type = 'source'").all();
98
+ const domains = db.prepare("SELECT slug, date_captured FROM mindlore_fts WHERE type = 'domain'").all();
99
+ expect(sources[0].date_captured).toBe('2026-03-01');
100
+ expect(domains[0].date_captured).toBe('2026-01-15');
101
+ // Domain is older → candidate for evolve update
102
+ expect(domains[0].date_captured < sources[0].date_captured).toBe(true);
103
+ });
104
+ });
105
+ //# sourceMappingURL=evolve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolve.test.js","sourceRoot":"","sources":["../../tests/evolve.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=explore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore.test.d.ts","sourceRoot":"","sources":["../../tests/explore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,146 @@
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-explore');
10
+ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
11
+ let db;
12
+ beforeEach(() => {
13
+ (0, db_1.setupTestDir)(TEST_DIR, ['sources', 'domains', 'connections']);
14
+ db = (0, db_1.createTestDb)(DB_PATH);
15
+ });
16
+ afterEach(() => {
17
+ db.close();
18
+ (0, db_1.teardownTestDir)(TEST_DIR);
19
+ });
20
+ describe('Explore — cross-reference detection and connections', () => {
21
+ test('detects shared tags between sources', () => {
22
+ (0, db_1.insertFts)(db, {
23
+ path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'),
24
+ slug: 'react-hooks',
25
+ type: 'source',
26
+ content: 'React hooks for state management',
27
+ tags: 'hooks, react, state',
28
+ });
29
+ (0, db_1.insertFts)(db, {
30
+ path: path_1.default.join(TEST_DIR, 'sources', 'vue-composables.md'),
31
+ slug: 'vue-composables',
32
+ type: 'source',
33
+ content: 'Vue composables for state management',
34
+ tags: 'hooks, vue, state',
35
+ });
36
+ (0, db_1.insertFts)(db, {
37
+ path: path_1.default.join(TEST_DIR, 'sources', 'python-ml.md'),
38
+ slug: 'python-ml',
39
+ type: 'source',
40
+ content: 'Machine learning with Python',
41
+ tags: 'python, ml',
42
+ });
43
+ // Find tag overlaps
44
+ const allSources = db.prepare("SELECT slug, tags FROM mindlore_fts WHERE type = 'source'").all();
45
+ const tagMap = {};
46
+ for (const src of allSources) {
47
+ if (!src.tags)
48
+ continue;
49
+ for (const tag of src.tags.split(',').map(t => t.trim())) {
50
+ if (!tagMap[tag])
51
+ tagMap[tag] = [];
52
+ tagMap[tag].push(src.slug);
53
+ }
54
+ }
55
+ // "hooks" and "state" shared by react-hooks + vue-composables
56
+ expect(tagMap['hooks']).toHaveLength(2);
57
+ expect(tagMap['state']).toHaveLength(2);
58
+ // "python" only in python-ml
59
+ expect(tagMap['python']).toHaveLength(1);
60
+ });
61
+ test('connections file has correct frontmatter format', () => {
62
+ const connectionContent = [
63
+ '---',
64
+ 'type: connection',
65
+ 'slug: conn-react-vue-state',
66
+ 'date_created: 2026-04-12',
67
+ 'sources: [react-hooks.md, vue-composables.md]',
68
+ 'strength: high',
69
+ 'tags: hooks, state',
70
+ '---',
71
+ '',
72
+ '## Connection',
73
+ 'Both sources discuss hooks-based state management in different frameworks.',
74
+ '',
75
+ '## Action Suggestion',
76
+ 'Create a cross-framework state management domain page.',
77
+ ].join('\n');
78
+ const connPath = path_1.default.join(TEST_DIR, 'connections', 'conn-react-vue-state.md');
79
+ fs_1.default.writeFileSync(connPath, connectionContent);
80
+ const content = fs_1.default.readFileSync(connPath, 'utf8');
81
+ expect(content).toContain('type: connection');
82
+ expect(content).toContain('strength: high');
83
+ expect(content).toContain('sources: [react-hooks.md, vue-composables.md]');
84
+ expect(content).toContain('## Connection');
85
+ expect(content).toContain('## Action Suggestion');
86
+ });
87
+ test('duplicate connections are not created for same source pair', () => {
88
+ const connectionsDir = path_1.default.join(TEST_DIR, 'connections');
89
+ // Existing connection for source-a + source-b
90
+ fs_1.default.writeFileSync(path_1.default.join(connectionsDir, 'conn-a-b.md'), '---\ntype: connection\nslug: conn-a-b\nsources: [source-a.md, source-b.md]\n---\n');
91
+ expect(fs_1.default.readdirSync(connectionsDir).filter(f => f.endsWith('.md'))).toHaveLength(1);
92
+ // Simulate duplicate check before writing
93
+ const newPair = ['source-a.md', 'source-b.md'];
94
+ const newPairKey = newPair.sort().join('+');
95
+ const existingFiles = fs_1.default.readdirSync(connectionsDir).filter(f => f.endsWith('.md'));
96
+ const alreadyExists = existingFiles.some(f => {
97
+ const content = fs_1.default.readFileSync(path_1.default.join(connectionsDir, f), 'utf8');
98
+ const match = content.match(/sources:\s*\[([^\]]+)\]/);
99
+ if (!match)
100
+ return false;
101
+ return match[1].split(',').map(s => s.trim()).sort().join('+') === newPairKey;
102
+ });
103
+ // Should detect existing pair
104
+ expect(alreadyExists).toBe(true);
105
+ // Only write if NOT already exists
106
+ if (!alreadyExists) {
107
+ fs_1.default.writeFileSync(path_1.default.join(connectionsDir, 'conn-a-b-2.md'), 'duplicate');
108
+ }
109
+ // File count should still be 1 — no duplicate written
110
+ expect(fs_1.default.readdirSync(connectionsDir).filter(f => f.endsWith('.md'))).toHaveLength(1);
111
+ });
112
+ test('connections are indexable in FTS5', () => {
113
+ (0, db_1.insertFts)(db, {
114
+ path: path_1.default.join(TEST_DIR, 'connections', 'conn-test.md'),
115
+ slug: 'conn-test',
116
+ type: 'connection',
117
+ title: 'Test Connection',
118
+ content: 'Two sources share hooks patterns',
119
+ tags: 'hooks',
120
+ });
121
+ const results = db.prepare("SELECT slug FROM mindlore_fts WHERE type = 'connection'").all();
122
+ expect(results).toHaveLength(1);
123
+ expect(results[0].slug).toBe('conn-test');
124
+ // Searchable by content
125
+ const searchResults = db.prepare("SELECT slug FROM mindlore_fts WHERE mindlore_fts MATCH 'hooks' AND type = 'connection'").all();
126
+ expect(searchResults).toHaveLength(1);
127
+ });
128
+ test('strength ranking: high requires 3+ shared tags', () => {
129
+ // Simulate strength calculation
130
+ const tagsA = ['hooks', 'state', 'reactivity', 'frontend'].map(t => t.trim());
131
+ const tagsB = ['hooks', 'state', 'reactivity', 'vue'].map(t => t.trim());
132
+ const shared = tagsA.filter(t => tagsB.includes(t));
133
+ const strength = shared.length >= 3 ? 'high' : shared.length >= 2 ? 'medium' : 'low';
134
+ expect(shared).toHaveLength(3);
135
+ expect(strength).toBe('high');
136
+ });
137
+ test('log.md receives EXPLORE entries', () => {
138
+ const logPath = path_1.default.join(TEST_DIR, 'log.md');
139
+ fs_1.default.writeFileSync(logPath, '| Date | Op | File |\n|------|-----|------|\n');
140
+ fs_1.default.appendFileSync(logPath, '| 2026-04-12 | explore | 2 connections found |\n');
141
+ const content = fs_1.default.readFileSync(logPath, 'utf8');
142
+ expect(content).toContain('explore');
143
+ expect(content).toContain('connections found');
144
+ });
145
+ });
146
+ //# sourceMappingURL=explore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore.test.js","sourceRoot":"","sources":["../../tests/explore.test.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ describe('FTS5 Database', () => {
21
21
  const db = new better_sqlite3_1.default(DB_PATH);
22
22
  const testContent = '# Test Source\n\nThis is about TypeScript and Node.js performance.';
23
23
  const testPath = path_1.default.join(TEST_DIR, 'sources', 'test-source.md');
24
- (0, db_js_1.insertFts)(db, testPath, 'test-source', 'TypeScript and Node.js performance', 'source', 'sources', 'Test Source', testContent, '', null);
24
+ (0, db_js_1.insertFts)(db, { path: testPath, slug: 'test-source', description: 'TypeScript and Node.js performance', type: 'source', category: 'sources', title: 'Test Source', content: testContent, tags: '', quality: null });
25
25
  const result = db.prepare('SELECT count(*) as cnt FROM mindlore_fts').get();
26
26
  expect(result.cnt).toBe(1);
27
27
  db.close();
@@ -30,7 +30,7 @@ describe('FTS5 Database', () => {
30
30
  const db = new better_sqlite3_1.default(DB_PATH);
31
31
  const testPath = path_1.default.join(TEST_DIR, 'sources', 'typescript-guide.md');
32
32
  const content = '# TypeScript Guide\n\nTypeScript provides static typing for JavaScript applications.';
33
- (0, db_js_1.insertFts)(db, testPath, 'typescript-guide', 'TypeScript static typing for JavaScript', 'source', 'sources', 'TypeScript Guide', content, '', null);
33
+ (0, db_js_1.insertFts)(db, { path: testPath, slug: 'typescript-guide', description: 'TypeScript static typing for JavaScript', type: 'source', category: 'sources', title: 'TypeScript Guide', content, tags: '', quality: null });
34
34
  const results = db
35
35
  .prepare(`SELECT path, rank FROM mindlore_fts
36
36
  WHERE mindlore_fts MATCH ?
@@ -44,7 +44,7 @@ describe('FTS5 Database', () => {
44
44
  test('should return empty results for non-matching query', () => {
45
45
  const db = new better_sqlite3_1.default(DB_PATH);
46
46
  const testPath = path_1.default.join(TEST_DIR, 'sources', 'python-guide.md');
47
- (0, db_js_1.insertFts)(db, testPath, 'python-guide', 'Python for data science', 'source', 'sources', 'Python Guide', '# Python Guide\n\nPython is great for data science.', '', null);
47
+ (0, db_js_1.insertFts)(db, { path: testPath, slug: 'python-guide', description: 'Python for data science', type: 'source', category: 'sources', title: 'Python Guide', content: '# Python Guide\n\nPython is great for data science.', tags: '', quality: null });
48
48
  const results = db
49
49
  .prepare(`SELECT path FROM mindlore_fts
50
50
  WHERE mindlore_fts MATCH ?
@@ -56,8 +56,8 @@ describe('FTS5 Database', () => {
56
56
  });
57
57
  test('should rank results by BM25 relevance', () => {
58
58
  const db = new better_sqlite3_1.default(DB_PATH);
59
- (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'hooks-overview.md'), 'hooks-overview', 'Hooks lifecycle callbacks overview', 'source', 'sources', 'Hooks Overview', '# Hooks Overview\n\nHooks are lifecycle callbacks.', '', null);
60
- (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'hooks-deep-dive.md'), 'hooks-deep-dive', 'Deep dive into hooks patterns', 'source', 'sources', 'Hooks Deep Dive', '# Hooks Deep Dive\n\nHooks hooks hooks. PreToolUse hooks, PostToolUse hooks, SessionStart hooks.', '', null);
59
+ (0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'hooks-overview.md'), slug: 'hooks-overview', description: 'Hooks lifecycle callbacks overview', type: 'source', category: 'sources', title: 'Hooks Overview', content: '# Hooks Overview\n\nHooks are lifecycle callbacks.', tags: '', quality: null });
60
+ (0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'hooks-deep-dive.md'), slug: 'hooks-deep-dive', description: 'Deep dive into hooks patterns', type: 'source', category: 'sources', title: 'Hooks Deep Dive', content: '# Hooks Deep Dive\n\nHooks hooks hooks. PreToolUse hooks, PostToolUse hooks, SessionStart hooks.', tags: '', quality: null });
61
61
  const results = db
62
62
  .prepare(`SELECT path, rank FROM mindlore_fts
63
63
  WHERE mindlore_fts MATCH ?
@@ -73,7 +73,7 @@ describe('FTS5 Database', () => {
73
73
  });
74
74
  test('should index and search by tags column', () => {
75
75
  const db = new better_sqlite3_1.default(DB_PATH);
76
- (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'tagged-doc.md'), 'tagged-doc', 'A doc with tags', 'source', 'sources', 'Tagged Doc', '# Tagged\n\nContent here.', 'security, hooks, fts5', null);
76
+ (0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'tagged-doc.md'), slug: 'tagged-doc', description: 'A doc with tags', type: 'source', category: 'sources', title: 'Tagged Doc', content: '# Tagged\n\nContent here.', tags: 'security, hooks, fts5', quality: null });
77
77
  const results = db
78
78
  .prepare(`SELECT path, tags FROM mindlore_fts
79
79
  WHERE tags MATCH ?
@@ -86,7 +86,7 @@ describe('FTS5 Database', () => {
86
86
  });
87
87
  test('should accept null quality column', () => {
88
88
  const db = new better_sqlite3_1.default(DB_PATH);
89
- (0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'no-quality.md'), 'no-quality', 'No quality set', 'source', 'sources', 'No Quality', '# Test\n\nContent.', '', null);
89
+ (0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'no-quality.md'), slug: 'no-quality', description: 'No quality set', type: 'source', category: 'sources', title: 'No Quality', content: '# Test\n\nContent.', tags: '', quality: null });
90
90
  const result = db.prepare('SELECT quality FROM mindlore_fts WHERE path = ?').get(path_1.default.join(TEST_DIR, 'sources', 'no-quality.md'));
91
91
  expect(result.quality).toBeFalsy();
92
92
  db.close();
@@ -1 +1 @@
1
- {"version":3,"file":"fts5.test.js","sourceRoot":"","sources":["../../tests/fts5.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fts5.test.js","sourceRoot":"","sources":["../../tests/fts5.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=global-layer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-layer.test.d.ts","sourceRoot":"","sources":["../../tests/global-layer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
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 db_1 = require("./helpers/db");
10
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-global-layer');
11
+ const FAKE_HOME = path_1.default.join(TEST_DIR, 'home');
12
+ const FAKE_PROJECT = path_1.default.join(TEST_DIR, 'project');
13
+ const GLOBAL_MINDLORE = path_1.default.join(FAKE_HOME, '.mindlore');
14
+ const PROJECT_MINDLORE = path_1.default.join(FAKE_PROJECT, '.mindlore');
15
+ // We test the CJS common module directly since hooks use it
16
+ const commonPath = path_1.default.resolve(__dirname, '..', 'hooks', 'lib', 'mindlore-common.cjs');
17
+ let homedirSpy;
18
+ function mockHomedir() {
19
+ homedirSpy = jest.spyOn(os_1.default, 'homedir').mockReturnValue(FAKE_HOME);
20
+ delete require.cache[require.resolve(commonPath)];
21
+ }
22
+ beforeEach(() => {
23
+ (0, db_1.setupTestDir)(TEST_DIR);
24
+ fs_1.default.mkdirSync(FAKE_HOME, { recursive: true });
25
+ fs_1.default.mkdirSync(FAKE_PROJECT, { recursive: true });
26
+ });
27
+ afterEach(() => {
28
+ if (homedirSpy)
29
+ homedirSpy.mockRestore();
30
+ delete require.cache[require.resolve(commonPath)];
31
+ (0, db_1.teardownTestDir)(TEST_DIR);
32
+ });
33
+ describe('getActiveMindloreDir', () => {
34
+ test('returns project dir when .mindlore/ exists in CWD', () => {
35
+ fs_1.default.mkdirSync(PROJECT_MINDLORE, { recursive: true });
36
+ const originalCwd = process.cwd();
37
+ process.chdir(FAKE_PROJECT);
38
+ try {
39
+ const { getActiveMindloreDir } = require(commonPath);
40
+ const result = getActiveMindloreDir();
41
+ expect(result).toBe(PROJECT_MINDLORE);
42
+ }
43
+ finally {
44
+ process.chdir(originalCwd);
45
+ }
46
+ });
47
+ test('falls back to global when no .mindlore/ in CWD', () => {
48
+ // No .mindlore/ in FAKE_PROJECT
49
+ const originalCwd = process.cwd();
50
+ process.chdir(FAKE_PROJECT);
51
+ try {
52
+ const { getActiveMindloreDir, GLOBAL_MINDLORE_DIR } = require(commonPath);
53
+ const result = getActiveMindloreDir();
54
+ expect(result).toBe(GLOBAL_MINDLORE_DIR);
55
+ }
56
+ finally {
57
+ process.chdir(originalCwd);
58
+ }
59
+ });
60
+ });
61
+ describe('getAllDbs', () => {
62
+ test('returns project DB first, then global DB', () => {
63
+ fs_1.default.mkdirSync(PROJECT_MINDLORE, { recursive: true });
64
+ fs_1.default.mkdirSync(GLOBAL_MINDLORE, { recursive: true });
65
+ const projectDb = (0, db_1.createTestDb)(path_1.default.join(PROJECT_MINDLORE, 'mindlore.db'));
66
+ projectDb.close();
67
+ const globalDb = (0, db_1.createTestDb)(path_1.default.join(GLOBAL_MINDLORE, 'mindlore.db'));
68
+ globalDb.close();
69
+ mockHomedir();
70
+ const originalCwd = process.cwd();
71
+ process.chdir(FAKE_PROJECT);
72
+ try {
73
+ const { getAllDbs } = require(commonPath);
74
+ const dbs = getAllDbs();
75
+ expect(dbs).toHaveLength(2);
76
+ expect(dbs[0]).toContain(path_1.default.join('project', '.mindlore'));
77
+ expect(dbs[1]).toContain(path_1.default.join('home', '.mindlore'));
78
+ }
79
+ finally {
80
+ process.chdir(originalCwd);
81
+ }
82
+ });
83
+ test('returns only project DB when global does not exist', () => {
84
+ fs_1.default.mkdirSync(PROJECT_MINDLORE, { recursive: true });
85
+ const projectDb = (0, db_1.createTestDb)(path_1.default.join(PROJECT_MINDLORE, 'mindlore.db'));
86
+ projectDb.close();
87
+ mockHomedir();
88
+ const originalCwd = process.cwd();
89
+ process.chdir(FAKE_PROJECT);
90
+ try {
91
+ const { getAllDbs } = require(commonPath);
92
+ const dbs = getAllDbs();
93
+ expect(dbs).toHaveLength(1);
94
+ expect(dbs[0]).toContain('project');
95
+ }
96
+ finally {
97
+ process.chdir(originalCwd);
98
+ }
99
+ });
100
+ test('returns only global DB when project does not exist', () => {
101
+ fs_1.default.mkdirSync(GLOBAL_MINDLORE, { recursive: true });
102
+ const globalDb = (0, db_1.createTestDb)(path_1.default.join(GLOBAL_MINDLORE, 'mindlore.db'));
103
+ globalDb.close();
104
+ mockHomedir();
105
+ const originalCwd = process.cwd();
106
+ process.chdir(FAKE_PROJECT);
107
+ try {
108
+ const { getAllDbs } = require(commonPath);
109
+ const dbs = getAllDbs();
110
+ expect(dbs).toHaveLength(1);
111
+ expect(dbs[0]).toContain('home');
112
+ }
113
+ finally {
114
+ process.chdir(originalCwd);
115
+ }
116
+ });
117
+ test('returns empty array when no DBs exist', () => {
118
+ mockHomedir();
119
+ const originalCwd = process.cwd();
120
+ process.chdir(FAKE_PROJECT);
121
+ try {
122
+ const { getAllDbs } = require(commonPath);
123
+ const dbs = getAllDbs();
124
+ expect(dbs).toHaveLength(0);
125
+ }
126
+ finally {
127
+ process.chdir(originalCwd);
128
+ }
129
+ });
130
+ });
131
+ describe('globalDir', () => {
132
+ test('returns path based on os.homedir()', () => {
133
+ mockHomedir();
134
+ const { globalDir } = require(commonPath);
135
+ expect(globalDir()).toBe(path_1.default.join(FAKE_HOME, '.mindlore'));
136
+ });
137
+ });
138
+ describe('findMindloreDir backward compat', () => {
139
+ test('returns null when neither project nor global exists', () => {
140
+ mockHomedir();
141
+ const originalCwd = process.cwd();
142
+ process.chdir(FAKE_PROJECT);
143
+ try {
144
+ const { findMindloreDir } = require(commonPath);
145
+ expect(findMindloreDir()).toBeNull();
146
+ }
147
+ finally {
148
+ process.chdir(originalCwd);
149
+ }
150
+ });
151
+ });
152
+ //# sourceMappingURL=global-layer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-layer.test.js","sourceRoot":"","sources":["../../tests/global-layer.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,20 @@
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 insertFts(db: Database.Database, filePath: string, slug: string, description: string, type: string, category: string, title: string, content: string, tags: string, quality: string | null): void;
4
+ export interface FtsEntry {
5
+ [key: string]: string | null | undefined;
6
+ path: string;
7
+ slug?: string;
8
+ description?: string;
9
+ type?: string;
10
+ category?: string;
11
+ title?: string;
12
+ content?: string;
13
+ tags?: string;
14
+ quality?: string | null;
15
+ dateCaptured?: string | null;
16
+ }
17
+ export declare function insertFts(db: Database.Database, entry: FtsEntry): void;
5
18
  export declare function setupTestDir(testDir: string, subdirs?: string[]): void;
6
19
  export declare function teardownTestDir(testDir: string): void;
7
20
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"AAGA,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,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,GACrB,IAAI,CAYN;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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":"AAGA,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;CAC9B;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEtE;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"}
@@ -13,7 +13,7 @@ const path_1 = __importDefault(require("path"));
13
13
  const crypto_1 = __importDefault(require("crypto"));
14
14
  const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
15
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');
16
+ const { SQL_FTS_CREATE, insertFtsRow } = require('../../hooks/lib/mindlore-common.cjs');
17
17
  function sha256(content) {
18
18
  return crypto_1.default.createHash('sha256').update(content, 'utf8').digest('hex');
19
19
  }
@@ -30,8 +30,8 @@ function createTestDb(dbPath) {
30
30
  `);
31
31
  return db;
32
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);
33
+ function insertFts(db, entry) {
34
+ insertFtsRow(db, entry);
35
35
  }
36
36
  function setupTestDir(testDir, subdirs) {
37
37
  const dirs = subdirs ?? [];
@@ -1 +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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../tests/helpers/db.ts"],"names":[],"mappings":";;;;;AAYA,wBAEC;AAED,oCAYC;AAgBD,8BAEC;AAED,oCAMC;AAED,0CAEC;AA1DD,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAC5B,oEAAsC;AAEtC,oEAAoE;AAEpE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAGrF,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;AAgBD,SAAgB,SAAS,CAAC,EAAqB,EAAE,KAAe;IAC9D,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC1B,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"}
@@ -48,11 +48,11 @@ describe('Hook Smoke Tests', () => {
48
48
  expect(file).toMatch(/\.cjs$/);
49
49
  }
50
50
  });
51
- test('hook count should match plan (9 hooks: 7 v0.1 + 2 v0.2)', () => {
51
+ test('hook count should match plan (12 hooks: 7 v0.1 + 2 v0.2 + 3 v0.3)', () => {
52
52
  const hookFiles = fs_1.default
53
53
  .readdirSync(HOOKS_DIR)
54
54
  .filter((f) => f.startsWith('mindlore-') && f.endsWith('.cjs'));
55
- expect(hookFiles).toHaveLength(9);
55
+ expect(hookFiles).toHaveLength(12);
56
56
  });
57
57
  });
58
58
  //# sourceMappingURL=hook-smoke.test.js.map