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.
- package/README.md +14 -11
- package/SCHEMA.md +15 -2
- package/dist/scripts/init.d.ts +1 -1
- package/dist/scripts/init.js +133 -68
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +34 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +95 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/schemas.d.ts +93 -0
- package/dist/scripts/lib/schemas.d.ts.map +1 -0
- package/dist/scripts/lib/schemas.js +108 -0
- package/dist/scripts/lib/schemas.js.map +1 -0
- package/dist/scripts/mindlore-fts5-index.js +3 -4
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-fts5-search.d.ts +1 -1
- package/dist/scripts/mindlore-fts5-search.js +87 -74
- package/dist/scripts/mindlore-fts5-search.js.map +1 -1
- package/dist/scripts/quality-populate.d.ts +11 -0
- package/dist/scripts/quality-populate.d.ts.map +1 -0
- package/dist/scripts/quality-populate.js +86 -0
- package/dist/scripts/quality-populate.js.map +1 -0
- package/dist/scripts/uninstall.d.ts +1 -1
- package/dist/scripts/uninstall.js +27 -17
- package/dist/scripts/uninstall.js.map +1 -1
- package/dist/tests/compounding.test.js +2 -2
- package/dist/tests/compounding.test.js.map +1 -1
- package/dist/tests/cwd-changed.test.d.ts +2 -0
- package/dist/tests/cwd-changed.test.d.ts.map +1 -0
- package/dist/tests/cwd-changed.test.js +62 -0
- package/dist/tests/cwd-changed.test.js.map +1 -0
- package/dist/tests/dedup.test.js +4 -4
- package/dist/tests/dedup.test.js.map +1 -1
- package/dist/tests/dont-repeat.test.d.ts +2 -0
- package/dist/tests/dont-repeat.test.d.ts.map +1 -0
- package/dist/tests/dont-repeat.test.js +100 -0
- package/dist/tests/dont-repeat.test.js.map +1 -0
- package/dist/tests/e2e-pipeline.test.d.ts +2 -0
- package/dist/tests/e2e-pipeline.test.d.ts.map +1 -0
- package/dist/tests/e2e-pipeline.test.js +220 -0
- package/dist/tests/e2e-pipeline.test.js.map +1 -0
- package/dist/tests/evolve.test.d.ts +2 -0
- package/dist/tests/evolve.test.d.ts.map +1 -0
- package/dist/tests/evolve.test.js +105 -0
- package/dist/tests/evolve.test.js.map +1 -0
- package/dist/tests/explore.test.d.ts +2 -0
- package/dist/tests/explore.test.d.ts.map +1 -0
- package/dist/tests/explore.test.js +146 -0
- package/dist/tests/explore.test.js.map +1 -0
- package/dist/tests/fts5.test.js +7 -7
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/global-layer.test.d.ts +2 -0
- package/dist/tests/global-layer.test.d.ts.map +1 -0
- package/dist/tests/global-layer.test.js +152 -0
- package/dist/tests/global-layer.test.js.map +1 -0
- package/dist/tests/helpers/db.d.ts +14 -1
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +3 -3
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/hook-smoke.test.js +2 -2
- package/dist/tests/hook-smoke.test.js.map +1 -1
- package/dist/tests/init.test.js +83 -0
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/model-router.test.d.ts +2 -0
- package/dist/tests/model-router.test.d.ts.map +1 -0
- package/dist/tests/model-router.test.js +146 -0
- package/dist/tests/model-router.test.js.map +1 -0
- package/dist/tests/post-read.test.d.ts +2 -0
- package/dist/tests/post-read.test.d.ts.map +1 -0
- package/dist/tests/post-read.test.js +69 -0
- package/dist/tests/post-read.test.js.map +1 -0
- package/dist/tests/quality-populate.test.d.ts +2 -0
- package/dist/tests/quality-populate.test.d.ts.map +1 -0
- package/dist/tests/quality-populate.test.js +158 -0
- package/dist/tests/quality-populate.test.js.map +1 -0
- package/dist/tests/reflect.test.d.ts +2 -0
- package/dist/tests/reflect.test.d.ts.map +1 -0
- package/dist/tests/reflect.test.js +122 -0
- package/dist/tests/reflect.test.js.map +1 -0
- package/dist/tests/schemas.test.d.ts +2 -0
- package/dist/tests/schemas.test.d.ts.map +1 -0
- package/dist/tests/schemas.test.js +87 -0
- package/dist/tests/schemas.test.js.map +1 -0
- package/dist/tests/search-hook.test.js +3 -3
- package/dist/tests/search-hook.test.js.map +1 -1
- package/dist/tests/upgrade.test.d.ts +2 -0
- package/dist/tests/upgrade.test.d.ts.map +1 -0
- package/dist/tests/upgrade.test.js +91 -0
- package/dist/tests/upgrade.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +89 -5
- package/hooks/lib/types.d.ts +56 -0
- package/hooks/mindlore-cwd-changed.cjs +57 -0
- package/hooks/mindlore-dont-repeat.cjs +222 -0
- package/hooks/mindlore-fts5-sync.cjs +6 -9
- package/hooks/mindlore-index.cjs +3 -3
- package/hooks/mindlore-model-router.cjs +54 -0
- package/hooks/mindlore-post-read.cjs +97 -0
- package/hooks/mindlore-read-guard.cjs +27 -4
- package/hooks/mindlore-search.cjs +73 -52
- package/hooks/mindlore-session-end.cjs +43 -1
- package/hooks/mindlore-session-focus.cjs +14 -0
- package/package.json +5 -3
- package/plugin.json +29 -1
- package/skills/mindlore-decide/SKILL.md +8 -0
- package/skills/mindlore-evolve/SKILL.md +99 -0
- package/skills/mindlore-explore/SKILL.md +104 -0
- package/skills/mindlore-health/SKILL.md +8 -0
- package/skills/mindlore-ingest/SKILL.md +65 -32
- package/skills/mindlore-log/SKILL.md +30 -13
- package/skills/mindlore-query/SKILL.md +8 -0
- package/templates/SCHEMA.md +15 -2
- package/templates/config.json +9 -0
|
@@ -0,0 +1,158 @@
|
|
|
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-quality-populate');
|
|
11
|
+
const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
|
|
12
|
+
let db;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
(0, db_1.setupTestDir)(TEST_DIR, ['sources', 'raw']);
|
|
15
|
+
db = (0, db_1.createTestDb)(DB_PATH);
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
db.close();
|
|
19
|
+
(0, db_1.teardownTestDir)(TEST_DIR);
|
|
20
|
+
});
|
|
21
|
+
describe('Quality populate — storage and retrieval', () => {
|
|
22
|
+
test('high quality stored and retrieved correctly', () => {
|
|
23
|
+
(0, db_1.insertFts)(db, {
|
|
24
|
+
path: path_1.default.join(TEST_DIR, 'sources', 'anthropic-docs.md'),
|
|
25
|
+
slug: 'anthropic-docs',
|
|
26
|
+
type: 'source',
|
|
27
|
+
title: 'Anthropic Claude API Docs',
|
|
28
|
+
content: '# Claude API\n\nOfficial documentation from docs.anthropic.com',
|
|
29
|
+
quality: 'high',
|
|
30
|
+
});
|
|
31
|
+
const row = db.prepare('SELECT quality FROM mindlore_fts WHERE slug = ?').get('anthropic-docs');
|
|
32
|
+
expect(row.quality).toBe('high');
|
|
33
|
+
});
|
|
34
|
+
test('medium quality stored and retrieved correctly', () => {
|
|
35
|
+
(0, db_1.insertFts)(db, {
|
|
36
|
+
path: path_1.default.join(TEST_DIR, 'sources', 'blog-post.md'),
|
|
37
|
+
slug: 'blog-post',
|
|
38
|
+
type: 'source',
|
|
39
|
+
content: '# React Patterns\n\nSome thoughts on React patterns.',
|
|
40
|
+
quality: 'medium',
|
|
41
|
+
});
|
|
42
|
+
const row = db.prepare('SELECT quality FROM mindlore_fts WHERE slug = ?').get('blog-post');
|
|
43
|
+
expect(row.quality).toBe('medium');
|
|
44
|
+
});
|
|
45
|
+
test('low quality stored and retrieved correctly', () => {
|
|
46
|
+
(0, db_1.insertFts)(db, {
|
|
47
|
+
path: path_1.default.join(TEST_DIR, 'raw', 'quick-paste.md'),
|
|
48
|
+
slug: 'quick-paste',
|
|
49
|
+
type: 'raw',
|
|
50
|
+
content: 'some random text pasted quickly',
|
|
51
|
+
quality: 'low',
|
|
52
|
+
});
|
|
53
|
+
const row = db.prepare('SELECT quality FROM mindlore_fts WHERE slug = ?').get('quick-paste');
|
|
54
|
+
expect(row.quality).toBe('low');
|
|
55
|
+
});
|
|
56
|
+
test('NULL quality records are queryable via FTS5', () => {
|
|
57
|
+
(0, db_1.insertFts)(db, {
|
|
58
|
+
path: path_1.default.join(TEST_DIR, 'sources', 'no-quality.md'),
|
|
59
|
+
slug: 'no-quality',
|
|
60
|
+
type: 'source',
|
|
61
|
+
content: '# Test\n\nContent without quality assignment.',
|
|
62
|
+
});
|
|
63
|
+
const row = db.prepare('SELECT quality FROM mindlore_fts WHERE slug = ?').get('no-quality');
|
|
64
|
+
expect(row.quality).toBeNull();
|
|
65
|
+
const results = db.prepare("SELECT slug FROM mindlore_fts WHERE mindlore_fts MATCH 'quality'").all();
|
|
66
|
+
expect(results.length).toBeGreaterThan(0);
|
|
67
|
+
});
|
|
68
|
+
test('all three quality values coexist in same DB', () => {
|
|
69
|
+
for (const q of ['high', 'medium', 'low', null]) {
|
|
70
|
+
(0, db_1.insertFts)(db, {
|
|
71
|
+
path: path_1.default.join(TEST_DIR, 'sources', `quality-${q}.md`),
|
|
72
|
+
slug: `quality-${q}`,
|
|
73
|
+
type: 'source',
|
|
74
|
+
content: `Test content for ${q}`,
|
|
75
|
+
quality: q,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const rows = db.prepare('SELECT slug, quality FROM mindlore_fts WHERE slug LIKE ?').all('quality-%');
|
|
79
|
+
expect(rows).toHaveLength(4);
|
|
80
|
+
const qualities = rows.map(r => r.quality);
|
|
81
|
+
expect(qualities).toContain('high');
|
|
82
|
+
expect(qualities).toContain('medium');
|
|
83
|
+
expect(qualities).toContain('low');
|
|
84
|
+
expect(qualities).toContain(null);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ── Bulk populate script integration tests ──────────────────────────────
|
|
88
|
+
const INIT_SCRIPT = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'init.js');
|
|
89
|
+
const POPULATE_SCRIPT = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'quality-populate.js');
|
|
90
|
+
const BULK_DIR = path_1.default.join(__dirname, '..', '.test-quality-bulk');
|
|
91
|
+
function initMindlore() {
|
|
92
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
93
|
+
cwd: BULK_DIR,
|
|
94
|
+
stdio: 'pipe',
|
|
95
|
+
env: { ...process.env, HOME: BULK_DIR, USERPROFILE: BULK_DIR },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function writeSource(filename, frontmatter, body) {
|
|
99
|
+
const sourcesDir = path_1.default.join(BULK_DIR, '.mindlore', 'sources');
|
|
100
|
+
fs_1.default.mkdirSync(sourcesDir, { recursive: true });
|
|
101
|
+
fs_1.default.writeFileSync(path_1.default.join(sourcesDir, filename), `---\n${frontmatter}\n---\n\n${body}\n`, 'utf8');
|
|
102
|
+
}
|
|
103
|
+
function readSourceQuality(filename) {
|
|
104
|
+
const content = fs_1.default.readFileSync(path_1.default.join(BULK_DIR, '.mindlore', 'sources', filename), 'utf8');
|
|
105
|
+
const match = content.match(/^quality:\s*(.+)$/m);
|
|
106
|
+
return match?.[1]?.trim() ?? null;
|
|
107
|
+
}
|
|
108
|
+
function runPopulate() {
|
|
109
|
+
return (0, child_process_1.execSync)(`node "${POPULATE_SCRIPT}"`, {
|
|
110
|
+
cwd: BULK_DIR,
|
|
111
|
+
encoding: 'utf8',
|
|
112
|
+
env: { ...process.env, HOME: BULK_DIR, USERPROFILE: BULK_DIR },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
describe('Quality populate — bulk script', () => {
|
|
116
|
+
beforeEach(() => {
|
|
117
|
+
fs_1.default.mkdirSync(BULK_DIR, { recursive: true });
|
|
118
|
+
initMindlore();
|
|
119
|
+
});
|
|
120
|
+
afterEach(() => {
|
|
121
|
+
fs_1.default.rmSync(BULK_DIR, { recursive: true, force: true });
|
|
122
|
+
});
|
|
123
|
+
test('should assign quality based on source_type heuristic', () => {
|
|
124
|
+
writeSource('github-test.md', 'slug: github-test\ntype: source\nsource_type: github-repo', '# GitHub Test');
|
|
125
|
+
writeSource('blog-test.md', 'slug: blog-test\ntype: source\nsource_type: blog', '# Blog Test');
|
|
126
|
+
writeSource('snippet-test.md', 'slug: snippet-test\ntype: source\nsource_type: snippet', '# Snippet Test');
|
|
127
|
+
runPopulate();
|
|
128
|
+
expect(readSourceQuality('github-test.md')).toBe('high');
|
|
129
|
+
expect(readSourceQuality('blog-test.md')).toBe('medium');
|
|
130
|
+
expect(readSourceQuality('snippet-test.md')).toBe('low');
|
|
131
|
+
});
|
|
132
|
+
test('should preserve existing quality values', () => {
|
|
133
|
+
writeSource('already-set.md', 'slug: already-set\ntype: source\nsource_type: blog\nquality: high', '# Already High');
|
|
134
|
+
runPopulate();
|
|
135
|
+
expect(readSourceQuality('already-set.md')).toBe('high');
|
|
136
|
+
});
|
|
137
|
+
test('should handle missing source_type with URL fallback', () => {
|
|
138
|
+
writeSource('github-url.md', 'slug: github-url\ntype: source\nsource_url: https://github.com/user/repo', '# GitHub URL');
|
|
139
|
+
writeSource('docs-url.md', 'slug: docs-url\ntype: source\nsource_url: https://docs.anthropic.com/api', '# Docs URL');
|
|
140
|
+
runPopulate();
|
|
141
|
+
expect(readSourceQuality('github-url.md')).toBe('high');
|
|
142
|
+
expect(readSourceQuality('docs-url.md')).toBe('high');
|
|
143
|
+
});
|
|
144
|
+
test('should default to medium when no heuristic matches', () => {
|
|
145
|
+
writeSource('unknown.md', 'slug: unknown\ntype: source', '# Unknown Source');
|
|
146
|
+
runPopulate();
|
|
147
|
+
expect(readSourceQuality('unknown.md')).toBe('medium');
|
|
148
|
+
});
|
|
149
|
+
test('should report correct counts', () => {
|
|
150
|
+
writeSource('needs-quality.md', 'slug: needs-quality\ntype: source\nsource_type: blog', '# Needs Quality');
|
|
151
|
+
writeSource('has-quality.md', 'slug: has-quality\ntype: source\nquality: low', '# Has Quality');
|
|
152
|
+
const output = runPopulate();
|
|
153
|
+
expect(output).toContain('1 updated');
|
|
154
|
+
expect(output).toContain('1 already set');
|
|
155
|
+
expect(output).toContain('2 total');
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=quality-populate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-populate.test.js","sourceRoot":"","sources":["../../tests/quality-populate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.test.d.ts","sourceRoot":"","sources":["../../tests/reflect.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
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-reflect');
|
|
10
|
+
const DIARY_DIR = path_1.default.join(TEST_DIR, 'diary');
|
|
11
|
+
const LEARNINGS_DIR = path_1.default.join(TEST_DIR, 'learnings');
|
|
12
|
+
function writeDelta(slug, date, files, opts) {
|
|
13
|
+
const frontmatter = [
|
|
14
|
+
'---',
|
|
15
|
+
`slug: ${slug}`,
|
|
16
|
+
'type: diary',
|
|
17
|
+
`date: ${date}`,
|
|
18
|
+
...(opts?.archived ? ['archived: true'] : []),
|
|
19
|
+
'---',
|
|
20
|
+
];
|
|
21
|
+
const content = [
|
|
22
|
+
...frontmatter,
|
|
23
|
+
'',
|
|
24
|
+
`# Session Delta — ${slug}`,
|
|
25
|
+
'',
|
|
26
|
+
'## Changed Files',
|
|
27
|
+
...files.map(f => `- ${f}`),
|
|
28
|
+
].join('\n');
|
|
29
|
+
fs_1.default.writeFileSync(path_1.default.join(DIARY_DIR, `${slug}.md`), content);
|
|
30
|
+
}
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
(0, db_1.setupTestDir)(TEST_DIR, ['diary', 'learnings']);
|
|
33
|
+
});
|
|
34
|
+
afterEach(() => {
|
|
35
|
+
(0, db_1.teardownTestDir)(TEST_DIR);
|
|
36
|
+
});
|
|
37
|
+
describe('Reflect — diary scanning and pattern extraction', () => {
|
|
38
|
+
test('diary deltas are readable and parseable', () => {
|
|
39
|
+
writeDelta('delta-2026-04-10-1400', '2026-04-10', ['tests/fts5.test.ts', 'scripts/lib/constants.ts']);
|
|
40
|
+
writeDelta('delta-2026-04-11-0900', '2026-04-11', ['tests/dedup.test.ts', 'scripts/lib/constants.ts']);
|
|
41
|
+
const deltas = fs_1.default.readdirSync(DIARY_DIR)
|
|
42
|
+
.filter(f => f.startsWith('delta-') && f.endsWith('.md'))
|
|
43
|
+
.sort();
|
|
44
|
+
expect(deltas).toHaveLength(2);
|
|
45
|
+
for (const d of deltas) {
|
|
46
|
+
const content = fs_1.default.readFileSync(path_1.default.join(DIARY_DIR, d), 'utf8');
|
|
47
|
+
expect(content).toContain('type: diary');
|
|
48
|
+
expect(content).toContain('## Changed Files');
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
test('recurring patterns are detectable across deltas', () => {
|
|
52
|
+
writeDelta('delta-2026-04-10-1000', '2026-04-10', ['scripts/lib/constants.ts', 'tests/fts5.test.ts']);
|
|
53
|
+
writeDelta('delta-2026-04-11-1000', '2026-04-11', ['scripts/lib/constants.ts', 'hooks/mindlore-search.cjs']);
|
|
54
|
+
writeDelta('delta-2026-04-12-1000', '2026-04-12', ['scripts/lib/constants.ts', 'tests/dedup.test.ts']);
|
|
55
|
+
const fileCounts = {};
|
|
56
|
+
const deltaFiles = fs_1.default.readdirSync(DIARY_DIR).filter(f => f.startsWith('delta-'));
|
|
57
|
+
for (const d of deltaFiles) {
|
|
58
|
+
const content = fs_1.default.readFileSync(path_1.default.join(DIARY_DIR, d), 'utf8');
|
|
59
|
+
const changedSection = content.split('## Changed Files')[1] || '';
|
|
60
|
+
for (const line of changedSection.split('\n').filter(l => l.startsWith('- '))) {
|
|
61
|
+
const file = line.replace('- ', '').trim();
|
|
62
|
+
fileCounts[file] = (fileCounts[file] || 0) + 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
expect(fileCounts['scripts/lib/constants.ts']).toBe(3);
|
|
66
|
+
});
|
|
67
|
+
test('learnings are written with correct frontmatter format', () => {
|
|
68
|
+
const learning = [
|
|
69
|
+
'---',
|
|
70
|
+
'type: learning',
|
|
71
|
+
'slug: testing-patterns',
|
|
72
|
+
'title: Testing Patterns',
|
|
73
|
+
'tags: testing, jest',
|
|
74
|
+
'---',
|
|
75
|
+
'',
|
|
76
|
+
'# Testing Patterns',
|
|
77
|
+
'',
|
|
78
|
+
'- YAPMA: Test icinde sleep kullanma — deterministic timer mock kullan',
|
|
79
|
+
'- BEST PRACTICE: Her test kendi temp dizinini olusturup temizlesin',
|
|
80
|
+
].join('\n');
|
|
81
|
+
fs_1.default.writeFileSync(path_1.default.join(LEARNINGS_DIR, 'testing-patterns.md'), learning);
|
|
82
|
+
const content = fs_1.default.readFileSync(path_1.default.join(LEARNINGS_DIR, 'testing-patterns.md'), 'utf8');
|
|
83
|
+
expect(content).toContain('type: learning');
|
|
84
|
+
expect(content).toContain('YAPMA:');
|
|
85
|
+
expect(content).toContain('BEST PRACTICE:');
|
|
86
|
+
});
|
|
87
|
+
test('archived deltas are excluded from reflect scan', () => {
|
|
88
|
+
writeDelta('delta-2026-04-08-1000', '2026-04-08', ['old-file.ts'], { archived: true });
|
|
89
|
+
writeDelta('delta-2026-04-09-1000', '2026-04-09', ['active-file.ts']);
|
|
90
|
+
const deltas = fs_1.default.readdirSync(DIARY_DIR)
|
|
91
|
+
.filter(f => f.startsWith('delta-') && f.endsWith('.md'))
|
|
92
|
+
.filter(f => !fs_1.default.readFileSync(path_1.default.join(DIARY_DIR, f), 'utf8').includes('archived: true'));
|
|
93
|
+
expect(deltas).toHaveLength(1);
|
|
94
|
+
expect(deltas[0]).toContain('04-09');
|
|
95
|
+
});
|
|
96
|
+
test('learnings append to existing topic file without overwriting', () => {
|
|
97
|
+
const initial = [
|
|
98
|
+
'---',
|
|
99
|
+
'type: learning',
|
|
100
|
+
'slug: git-workflow',
|
|
101
|
+
'title: Git Workflow',
|
|
102
|
+
'---',
|
|
103
|
+
'',
|
|
104
|
+
'# Git Workflow',
|
|
105
|
+
'',
|
|
106
|
+
'- BEST PRACTICE: Atomic commits — bir degisiklik, bir commit',
|
|
107
|
+
].join('\n');
|
|
108
|
+
fs_1.default.writeFileSync(path_1.default.join(LEARNINGS_DIR, 'git-workflow.md'), initial);
|
|
109
|
+
fs_1.default.appendFileSync(path_1.default.join(LEARNINGS_DIR, 'git-workflow.md'), '\n- YAPMA: Force push to main — her zaman feature branch kullan\n');
|
|
110
|
+
const content = fs_1.default.readFileSync(path_1.default.join(LEARNINGS_DIR, 'git-workflow.md'), 'utf8');
|
|
111
|
+
expect(content).toContain('Atomic commits');
|
|
112
|
+
expect(content).toContain('Force push');
|
|
113
|
+
const ruleCount = (content.match(/^- (YAPMA|BEST PRACTICE|KRITIK):/gm) || []).length;
|
|
114
|
+
expect(ruleCount).toBe(2);
|
|
115
|
+
});
|
|
116
|
+
test('empty diary directory returns no deltas', () => {
|
|
117
|
+
const deltas = fs_1.default.readdirSync(DIARY_DIR)
|
|
118
|
+
.filter(f => f.startsWith('delta-') && f.endsWith('.md'));
|
|
119
|
+
expect(deltas).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=reflect.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.test.js","sourceRoot":"","sources":["../../tests/reflect.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../../tests/schemas.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const schemas_1 = require("../scripts/lib/schemas");
|
|
4
|
+
describe('Zod frontmatter schemas', () => {
|
|
5
|
+
test('all 9 types have schemas defined', () => {
|
|
6
|
+
const types = ['raw', 'source', 'domain', 'analysis', 'diary', 'decision', 'insight', 'connection', 'learning'];
|
|
7
|
+
for (const t of types) {
|
|
8
|
+
expect(schemas_1.FRONTMATTER_SCHEMAS[t]).toBeDefined();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
test('valid source frontmatter passes', () => {
|
|
12
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
13
|
+
type: 'source',
|
|
14
|
+
slug: 'react-hooks',
|
|
15
|
+
title: 'React Hooks Guide',
|
|
16
|
+
quality: 'high',
|
|
17
|
+
tags: 'react, hooks',
|
|
18
|
+
});
|
|
19
|
+
expect(result.valid).toBe(true);
|
|
20
|
+
expect(result.errors).toHaveLength(0);
|
|
21
|
+
});
|
|
22
|
+
test('missing type field fails', () => {
|
|
23
|
+
const result = (0, schemas_1.validateFrontmatter)({ slug: 'test' });
|
|
24
|
+
expect(result.valid).toBe(false);
|
|
25
|
+
expect(result.errors[0]).toContain('type');
|
|
26
|
+
});
|
|
27
|
+
test('unknown type fails', () => {
|
|
28
|
+
const result = (0, schemas_1.validateFrontmatter)({ type: 'unknown', slug: 'test' });
|
|
29
|
+
expect(result.valid).toBe(false);
|
|
30
|
+
expect(result.errors[0]).toContain('unknown');
|
|
31
|
+
});
|
|
32
|
+
test('source missing slug fails', () => {
|
|
33
|
+
const result = (0, schemas_1.validateFrontmatter)({ type: 'source' });
|
|
34
|
+
expect(result.valid).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
test('invalid quality enum fails', () => {
|
|
37
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
38
|
+
type: 'source',
|
|
39
|
+
slug: 'test',
|
|
40
|
+
quality: 'excellent',
|
|
41
|
+
});
|
|
42
|
+
expect(result.valid).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
test('valid diary frontmatter passes', () => {
|
|
45
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
46
|
+
type: 'diary',
|
|
47
|
+
slug: 'delta-2026-04-12',
|
|
48
|
+
date: '2026-04-12',
|
|
49
|
+
});
|
|
50
|
+
expect(result.valid).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
test('valid connection frontmatter passes', () => {
|
|
53
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
54
|
+
type: 'connection',
|
|
55
|
+
slug: 'conn-a-b',
|
|
56
|
+
strength: 'medium',
|
|
57
|
+
sources: ['source-a.md', 'source-b.md'],
|
|
58
|
+
});
|
|
59
|
+
expect(result.valid).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
test('valid decision with supersedes passes', () => {
|
|
62
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
63
|
+
type: 'decision',
|
|
64
|
+
slug: 'dec-002',
|
|
65
|
+
status: 'active',
|
|
66
|
+
supersedes: 'dec-001',
|
|
67
|
+
});
|
|
68
|
+
expect(result.valid).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
test('tags as array passes', () => {
|
|
71
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
72
|
+
type: 'raw',
|
|
73
|
+
slug: 'test-raw',
|
|
74
|
+
tags: ['tag1', 'tag2'],
|
|
75
|
+
});
|
|
76
|
+
expect(result.valid).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
test('tags as string passes', () => {
|
|
79
|
+
const result = (0, schemas_1.validateFrontmatter)({
|
|
80
|
+
type: 'raw',
|
|
81
|
+
slug: 'test-raw',
|
|
82
|
+
tags: 'tag1, tag2',
|
|
83
|
+
});
|
|
84
|
+
expect(result.valid).toBe(true);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=schemas.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../../tests/schemas.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,9 @@ const DB_PATH = path_1.default.join(TEST_DIR, 'mindlore.db');
|
|
|
11
11
|
beforeEach(() => {
|
|
12
12
|
(0, db_js_1.setupTestDir)(TEST_DIR, ['sources', 'domains']);
|
|
13
13
|
const db = (0, db_js_1.createTestDb)(DB_PATH);
|
|
14
|
-
(0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'), 'react-hooks', 'useEffect cleanup patterns for memory leak prevention', 'source', 'sources', 'React Hooks Guide', '---\nslug: react-hooks\ntype: source\n---\n# React Hooks Guide\n\nuseEffect cleanup patterns for memory leak prevention.', '', null);
|
|
15
|
-
(0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'sources', 'typescript-generics.md'), 'typescript-generics', 'Advanced generic patterns for type-safe APIs', 'source', 'sources', 'TypeScript Generics', '---\nslug: typescript-generics\ntype: source\n---\n# TypeScript Generics\n\nAdvanced generic patterns for type-safe APIs.', '', null);
|
|
16
|
-
(0, db_js_1.insertFts)(db, path_1.default.join(TEST_DIR, 'domains', 'security.md'), 'security', 'SSH hardening firewall rules audit checks', 'domain', 'domains', 'Security', '---\nslug: security\ntype: domain\n---\n# Security\n\nSSH hardening, firewall rules, audit checks.', '', null);
|
|
14
|
+
(0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'react-hooks.md'), slug: 'react-hooks', description: 'useEffect cleanup patterns for memory leak prevention', type: 'source', category: 'sources', title: 'React Hooks Guide', content: '---\nslug: react-hooks\ntype: source\n---\n# React Hooks Guide\n\nuseEffect cleanup patterns for memory leak prevention.', tags: '', quality: null });
|
|
15
|
+
(0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'sources', 'typescript-generics.md'), slug: 'typescript-generics', description: 'Advanced generic patterns for type-safe APIs', type: 'source', category: 'sources', title: 'TypeScript Generics', content: '---\nslug: typescript-generics\ntype: source\n---\n# TypeScript Generics\n\nAdvanced generic patterns for type-safe APIs.', tags: '', quality: null });
|
|
16
|
+
(0, db_js_1.insertFts)(db, { path: path_1.default.join(TEST_DIR, 'domains', 'security.md'), slug: 'security', description: 'SSH hardening firewall rules audit checks', type: 'domain', category: 'domains', title: 'Security', content: '---\nslug: security\ntype: domain\n---\n# Security\n\nSSH hardening, firewall rules, audit checks.', tags: '', quality: null });
|
|
17
17
|
db.close();
|
|
18
18
|
});
|
|
19
19
|
afterEach(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-hook.test.js","sourceRoot":"","sources":["../../tests/search-hook.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,oEAAsC;AACtC,2CAAyF;AAEzF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;AACrE,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAEnD,UAAU,CAAC,GAAG,EAAE;IACd,IAAA,oBAAY,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE/C,MAAM,EAAE,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;IAEjC,IAAA,iBAAS,EAAC,EAAE,EAAE,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,aAAa,EAAE,uDAAuD,EAAE,QAAQ,EAAE,SAAS,EAAE,mBAAmB,EAAE,0HAA0H,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-hook.test.js","sourceRoot":"","sources":["../../tests/search-hook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.test.d.ts","sourceRoot":"","sources":["../../tests/upgrade.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const TEST_PROJECT = path_1.default.join(__dirname, '..', '.test-upgrade');
|
|
10
|
+
const INIT_SCRIPT = path_1.default.join(__dirname, '..', 'dist', 'scripts', 'init.js');
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
fs_1.default.mkdirSync(TEST_PROJECT, { recursive: true });
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
fs_1.default.rmSync(TEST_PROJECT, { recursive: true, force: true });
|
|
16
|
+
});
|
|
17
|
+
describe('version-aware upgrade', () => {
|
|
18
|
+
test('init writes .version file', () => {
|
|
19
|
+
const env = { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT };
|
|
20
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
21
|
+
cwd: TEST_PROJECT,
|
|
22
|
+
stdio: 'pipe',
|
|
23
|
+
env,
|
|
24
|
+
});
|
|
25
|
+
const versionPath = path_1.default.join(TEST_PROJECT, '.mindlore', '.version');
|
|
26
|
+
expect(fs_1.default.existsSync(versionPath)).toBe(true);
|
|
27
|
+
const version = fs_1.default.readFileSync(versionPath, 'utf8').trim();
|
|
28
|
+
expect(version).toMatch(/^\d+\.\d+\.\d+/);
|
|
29
|
+
});
|
|
30
|
+
test('re-running init updates .version file', () => {
|
|
31
|
+
const env = { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT };
|
|
32
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
33
|
+
cwd: TEST_PROJECT,
|
|
34
|
+
stdio: 'pipe',
|
|
35
|
+
env,
|
|
36
|
+
});
|
|
37
|
+
// Write old version
|
|
38
|
+
const versionPath = path_1.default.join(TEST_PROJECT, '.mindlore', '.version');
|
|
39
|
+
fs_1.default.writeFileSync(versionPath, '0.1.0', 'utf8');
|
|
40
|
+
// Re-run init
|
|
41
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
42
|
+
cwd: TEST_PROJECT,
|
|
43
|
+
stdio: 'pipe',
|
|
44
|
+
env,
|
|
45
|
+
});
|
|
46
|
+
const version = fs_1.default.readFileSync(versionPath, 'utf8').trim();
|
|
47
|
+
expect(version).not.toBe('0.1.0');
|
|
48
|
+
});
|
|
49
|
+
test('init preserves existing data during upgrade', () => {
|
|
50
|
+
const env = { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT };
|
|
51
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
52
|
+
cwd: TEST_PROJECT,
|
|
53
|
+
stdio: 'pipe',
|
|
54
|
+
env,
|
|
55
|
+
});
|
|
56
|
+
// Add custom data
|
|
57
|
+
const testFile = path_1.default.join(TEST_PROJECT, '.mindlore', 'sources', 'test.md');
|
|
58
|
+
fs_1.default.writeFileSync(testFile, '---\nslug: test\ntype: source\n---\n# Test Source\n');
|
|
59
|
+
// Re-run init (upgrade)
|
|
60
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
61
|
+
cwd: TEST_PROJECT,
|
|
62
|
+
stdio: 'pipe',
|
|
63
|
+
env,
|
|
64
|
+
});
|
|
65
|
+
// Custom data preserved
|
|
66
|
+
expect(fs_1.default.existsSync(testFile)).toBe(true);
|
|
67
|
+
expect(fs_1.default.readFileSync(testFile, 'utf8')).toContain('# Test Source');
|
|
68
|
+
});
|
|
69
|
+
test('session-focus injects version warning when mismatch', () => {
|
|
70
|
+
const env = { ...process.env, HOME: TEST_PROJECT, USERPROFILE: TEST_PROJECT };
|
|
71
|
+
// Init first
|
|
72
|
+
(0, child_process_1.execSync)(`node "${INIT_SCRIPT}" init`, {
|
|
73
|
+
cwd: TEST_PROJECT,
|
|
74
|
+
stdio: 'pipe',
|
|
75
|
+
env,
|
|
76
|
+
});
|
|
77
|
+
// Set old version to trigger warning
|
|
78
|
+
const versionPath = path_1.default.join(TEST_PROJECT, '.mindlore', '.version');
|
|
79
|
+
fs_1.default.writeFileSync(versionPath, '0.0.1', 'utf8');
|
|
80
|
+
// Run session-focus hook
|
|
81
|
+
const focusScript = path_1.default.resolve(__dirname, '..', 'hooks', 'mindlore-session-focus.cjs');
|
|
82
|
+
const output = (0, child_process_1.execSync)(`node "${focusScript}"`, {
|
|
83
|
+
cwd: TEST_PROJECT,
|
|
84
|
+
encoding: 'utf8',
|
|
85
|
+
env,
|
|
86
|
+
});
|
|
87
|
+
expect(output).toContain('Guncelleme mevcut');
|
|
88
|
+
expect(output).toContain('0.0.1');
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=upgrade.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade.test.js","sourceRoot":"","sources":["../../tests/upgrade.test.ts"],"names":[],"mappings":"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"}
|