mindlore 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +14 -11
  2. package/SCHEMA.md +15 -2
  3. package/dist/scripts/init.d.ts +1 -1
  4. package/dist/scripts/init.js +133 -68
  5. package/dist/scripts/init.js.map +1 -1
  6. package/dist/scripts/lib/constants.d.ts +34 -0
  7. package/dist/scripts/lib/constants.d.ts.map +1 -1
  8. package/dist/scripts/lib/constants.js +95 -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/quality-populate.d.ts +11 -0
  20. package/dist/scripts/quality-populate.d.ts.map +1 -0
  21. package/dist/scripts/quality-populate.js +86 -0
  22. package/dist/scripts/quality-populate.js.map +1 -0
  23. package/dist/scripts/uninstall.d.ts +1 -1
  24. package/dist/scripts/uninstall.js +27 -17
  25. package/dist/scripts/uninstall.js.map +1 -1
  26. package/dist/tests/compounding.test.js +2 -2
  27. package/dist/tests/compounding.test.js.map +1 -1
  28. package/dist/tests/cwd-changed.test.d.ts +2 -0
  29. package/dist/tests/cwd-changed.test.d.ts.map +1 -0
  30. package/dist/tests/cwd-changed.test.js +62 -0
  31. package/dist/tests/cwd-changed.test.js.map +1 -0
  32. package/dist/tests/dedup.test.js +4 -4
  33. package/dist/tests/dedup.test.js.map +1 -1
  34. package/dist/tests/dont-repeat.test.d.ts +2 -0
  35. package/dist/tests/dont-repeat.test.d.ts.map +1 -0
  36. package/dist/tests/dont-repeat.test.js +100 -0
  37. package/dist/tests/dont-repeat.test.js.map +1 -0
  38. package/dist/tests/e2e-pipeline.test.d.ts +2 -0
  39. package/dist/tests/e2e-pipeline.test.d.ts.map +1 -0
  40. package/dist/tests/e2e-pipeline.test.js +220 -0
  41. package/dist/tests/e2e-pipeline.test.js.map +1 -0
  42. package/dist/tests/evolve.test.d.ts +2 -0
  43. package/dist/tests/evolve.test.d.ts.map +1 -0
  44. package/dist/tests/evolve.test.js +105 -0
  45. package/dist/tests/evolve.test.js.map +1 -0
  46. package/dist/tests/explore.test.d.ts +2 -0
  47. package/dist/tests/explore.test.d.ts.map +1 -0
  48. package/dist/tests/explore.test.js +146 -0
  49. package/dist/tests/explore.test.js.map +1 -0
  50. package/dist/tests/fts5.test.js +7 -7
  51. package/dist/tests/fts5.test.js.map +1 -1
  52. package/dist/tests/global-layer.test.d.ts +2 -0
  53. package/dist/tests/global-layer.test.d.ts.map +1 -0
  54. package/dist/tests/global-layer.test.js +152 -0
  55. package/dist/tests/global-layer.test.js.map +1 -0
  56. package/dist/tests/helpers/db.d.ts +14 -1
  57. package/dist/tests/helpers/db.d.ts.map +1 -1
  58. package/dist/tests/helpers/db.js +3 -3
  59. package/dist/tests/helpers/db.js.map +1 -1
  60. package/dist/tests/hook-smoke.test.js +2 -2
  61. package/dist/tests/hook-smoke.test.js.map +1 -1
  62. package/dist/tests/init.test.js +83 -0
  63. package/dist/tests/init.test.js.map +1 -1
  64. package/dist/tests/model-router.test.d.ts +2 -0
  65. package/dist/tests/model-router.test.d.ts.map +1 -0
  66. package/dist/tests/model-router.test.js +146 -0
  67. package/dist/tests/model-router.test.js.map +1 -0
  68. package/dist/tests/post-read.test.d.ts +2 -0
  69. package/dist/tests/post-read.test.d.ts.map +1 -0
  70. package/dist/tests/post-read.test.js +69 -0
  71. package/dist/tests/post-read.test.js.map +1 -0
  72. package/dist/tests/quality-populate.test.d.ts +2 -0
  73. package/dist/tests/quality-populate.test.d.ts.map +1 -0
  74. package/dist/tests/quality-populate.test.js +158 -0
  75. package/dist/tests/quality-populate.test.js.map +1 -0
  76. package/dist/tests/reflect.test.d.ts +2 -0
  77. package/dist/tests/reflect.test.d.ts.map +1 -0
  78. package/dist/tests/reflect.test.js +122 -0
  79. package/dist/tests/reflect.test.js.map +1 -0
  80. package/dist/tests/schemas.test.d.ts +2 -0
  81. package/dist/tests/schemas.test.d.ts.map +1 -0
  82. package/dist/tests/schemas.test.js +87 -0
  83. package/dist/tests/schemas.test.js.map +1 -0
  84. package/dist/tests/search-hook.test.js +3 -3
  85. package/dist/tests/search-hook.test.js.map +1 -1
  86. package/dist/tests/upgrade.test.d.ts +2 -0
  87. package/dist/tests/upgrade.test.d.ts.map +1 -0
  88. package/dist/tests/upgrade.test.js +91 -0
  89. package/dist/tests/upgrade.test.js.map +1 -0
  90. package/hooks/lib/mindlore-common.cjs +89 -5
  91. package/hooks/lib/types.d.ts +56 -0
  92. package/hooks/mindlore-cwd-changed.cjs +57 -0
  93. package/hooks/mindlore-dont-repeat.cjs +222 -0
  94. package/hooks/mindlore-fts5-sync.cjs +6 -9
  95. package/hooks/mindlore-index.cjs +3 -3
  96. package/hooks/mindlore-model-router.cjs +54 -0
  97. package/hooks/mindlore-post-read.cjs +97 -0
  98. package/hooks/mindlore-read-guard.cjs +27 -4
  99. package/hooks/mindlore-search.cjs +73 -52
  100. package/hooks/mindlore-session-end.cjs +43 -1
  101. package/hooks/mindlore-session-focus.cjs +14 -0
  102. package/package.json +5 -3
  103. package/plugin.json +29 -1
  104. package/skills/mindlore-decide/SKILL.md +8 -0
  105. package/skills/mindlore-evolve/SKILL.md +99 -0
  106. package/skills/mindlore-explore/SKILL.md +104 -0
  107. package/skills/mindlore-health/SKILL.md +8 -0
  108. package/skills/mindlore-ingest/SKILL.md +65 -32
  109. package/skills/mindlore-log/SKILL.md +30 -13
  110. package/skills/mindlore-query/SKILL.md +8 -0
  111. package/templates/SCHEMA.md +15 -2
  112. package/templates/config.json +9 -0
@@ -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":""}
@@ -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":";;;;;AAAA,gDAAwB;AACxB,oEAAsC;AACtC,2CAAyF;AAEzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;AACnE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,WAAW,GAAG,oEAAoE,CAAC;QACzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAElE,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,oCAAoC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpN,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAqB,CAAC;QAC/F,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE3B,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,qBAAqB,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,sFAAsF,CAAC;QAEvG,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,yCAAyC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtN,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,YAAY,CAA0C,CAAC;QAE9D,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACnE,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,yBAAyB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,qDAAqD,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAErP,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,YAAY,CAA4B,CAAC;QAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAEhC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,oCAAoC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,oDAAoD,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9S,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,+BAA+B,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,kGAAkG,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1V,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,OAAO,CAA0C,CAAC;QAEzD,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAE/B,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3Q,MAAM,OAAO,GAAG,EAAE;aACf,OAAO,CACN;;;iBAGS,CACV;aACA,GAAG,CAAC,UAAU,CAA0C,CAAC;QAE5D,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAEvD,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,OAAO,CAAC,CAAC;QAEjC,IAAA,iBAAS,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9O,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,CAAC,CAA+B,CAAC;QAChK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QAEnC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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":""}