mindlore 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -9
- package/SCHEMA.md +15 -2
- package/dist/scripts/init.d.ts +10 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +406 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/lib/constants.d.ts +56 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -0
- package/dist/scripts/lib/constants.js +131 -0
- package/dist/scripts/lib/constants.js.map +1 -0
- 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.d.ts +9 -0
- package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -0
- package/dist/scripts/mindlore-fts5-index.js +88 -0
- package/dist/scripts/mindlore-fts5-index.js.map +1 -0
- package/dist/scripts/mindlore-fts5-search.d.ts +10 -0
- package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -0
- package/dist/scripts/mindlore-fts5-search.js +121 -0
- package/dist/scripts/mindlore-fts5-search.js.map +1 -0
- package/dist/scripts/mindlore-health-check.d.ts +10 -0
- package/dist/scripts/mindlore-health-check.d.ts.map +1 -0
- package/dist/scripts/mindlore-health-check.js +337 -0
- package/dist/scripts/mindlore-health-check.js.map +1 -0
- package/dist/scripts/uninstall.d.ts +10 -0
- package/dist/scripts/uninstall.d.ts.map +1 -0
- package/dist/scripts/uninstall.js +153 -0
- package/dist/scripts/uninstall.js.map +1 -0
- package/dist/tests/compounding.test.d.ts +8 -0
- package/dist/tests/compounding.test.d.ts.map +1 -0
- package/dist/tests/compounding.test.js +51 -0
- package/dist/tests/compounding.test.js.map +1 -0
- 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/decision.test.d.ts +2 -0
- package/dist/tests/decision.test.d.ts.map +1 -0
- package/dist/tests/decision.test.js +61 -0
- package/dist/tests/decision.test.js.map +1 -0
- package/dist/tests/dedup.test.d.ts +2 -0
- package/dist/tests/dedup.test.d.ts.map +1 -0
- package/dist/tests/dedup.test.js +74 -0
- package/dist/tests/dedup.test.js.map +1 -0
- 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/frontmatter.test.d.ts +2 -0
- package/dist/tests/frontmatter.test.d.ts.map +1 -0
- package/dist/tests/frontmatter.test.js +90 -0
- package/dist/tests/frontmatter.test.js.map +1 -0
- package/dist/tests/fts5.test.d.ts +2 -0
- package/dist/tests/fts5.test.d.ts.map +1 -0
- package/dist/tests/fts5.test.js +95 -0
- package/dist/tests/fts5.test.js.map +1 -0
- 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 +20 -0
- package/dist/tests/helpers/db.d.ts.map +1 -0
- package/dist/tests/helpers/db.js +46 -0
- package/dist/tests/helpers/db.js.map +1 -0
- package/dist/tests/hook-smoke.test.d.ts +2 -0
- package/dist/tests/hook-smoke.test.d.ts.map +1 -0
- package/dist/tests/hook-smoke.test.js +58 -0
- package/dist/tests/hook-smoke.test.js.map +1 -0
- package/dist/tests/init.test.d.ts +2 -0
- package/dist/tests/init.test.d.ts.map +1 -0
- package/dist/tests/init.test.js +109 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/log.test.d.ts +2 -0
- package/dist/tests/log.test.d.ts.map +1 -0
- package/dist/tests/log.test.js +68 -0
- package/dist/tests/log.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 +85 -0
- package/dist/tests/quality-populate.test.js.map +1 -0
- package/dist/tests/read-guard.test.d.ts +2 -0
- package/dist/tests/read-guard.test.d.ts.map +1 -0
- package/dist/tests/read-guard.test.js +69 -0
- package/dist/tests/read-guard.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.d.ts +2 -0
- package/dist/tests/search-hook.test.d.ts.map +1 -0
- package/dist/tests/search-hook.test.js +108 -0
- package/dist/tests/search-hook.test.js.map +1 -0
- package/dist/tests/session-focus.test.d.ts +2 -0
- package/dist/tests/session-focus.test.d.ts.map +1 -0
- package/dist/tests/session-focus.test.js +71 -0
- package/dist/tests/session-focus.test.js.map +1 -0
- package/dist/tests/uninstall.test.d.ts +2 -0
- package/dist/tests/uninstall.test.d.ts.map +1 -0
- package/dist/tests/uninstall.test.js +98 -0
- package/dist/tests/uninstall.test.js.map +1 -0
- 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 +66 -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-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 +21 -8
- package/plugin.json +24 -1
- package/skills/mindlore-decide/SKILL.md +8 -0
- package/skills/mindlore-evolve/SKILL.md +81 -0
- package/skills/mindlore-explore/SKILL.md +84 -0
- package/skills/mindlore-health/SKILL.md +8 -0
- package/skills/mindlore-ingest/SKILL.md +19 -4
- package/skills/mindlore-log/SKILL.md +30 -13
- package/skills/mindlore-query/SKILL.md +8 -0
- package/templates/SCHEMA.md +15 -2
- package/scripts/init.cjs +0 -448
- package/scripts/lib/constants.cjs +0 -49
- package/scripts/mindlore-fts5-index.cjs +0 -112
- package/scripts/mindlore-fts5-search.cjs +0 -119
- package/scripts/mindlore-health-check.cjs +0 -389
- package/scripts/uninstall.cjs +0 -186
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.test.d.ts","sourceRoot":"","sources":["../../tests/uninstall.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,98 @@
|
|
|
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 TEST_DIR = path_1.default.join(__dirname, '..', '.test-mindlore-uninstall');
|
|
9
|
+
const MOCK_HOME = path_1.default.join(TEST_DIR, 'home');
|
|
10
|
+
const MOCK_PROJECT = path_1.default.join(TEST_DIR, 'project');
|
|
11
|
+
function setupMockEnvironment() {
|
|
12
|
+
const claudeDir = path_1.default.join(MOCK_HOME, '.claude');
|
|
13
|
+
const skillsDir = path_1.default.join(claudeDir, 'skills');
|
|
14
|
+
fs_1.default.mkdirSync(path_1.default.join(skillsDir, 'mindlore-ingest'), { recursive: true });
|
|
15
|
+
fs_1.default.mkdirSync(path_1.default.join(skillsDir, 'mindlore-health'), { recursive: true });
|
|
16
|
+
fs_1.default.mkdirSync(path_1.default.join(skillsDir, 'other-skill'), { recursive: true });
|
|
17
|
+
fs_1.default.writeFileSync(path_1.default.join(skillsDir, 'mindlore-ingest', 'SKILL.md'), '# Ingest');
|
|
18
|
+
fs_1.default.writeFileSync(path_1.default.join(skillsDir, 'mindlore-health', 'SKILL.md'), '# Health');
|
|
19
|
+
fs_1.default.writeFileSync(path_1.default.join(skillsDir, 'other-skill', 'SKILL.md'), '# Other');
|
|
20
|
+
const settings = {
|
|
21
|
+
hooks: {
|
|
22
|
+
SessionStart: [
|
|
23
|
+
{ hooks: [{ type: 'command', command: 'node some-other-hook.cjs' }] },
|
|
24
|
+
{ hooks: [{ type: 'command', command: 'node mindlore-session-focus.cjs' }] },
|
|
25
|
+
],
|
|
26
|
+
UserPromptSubmit: [
|
|
27
|
+
{ hooks: [{ type: 'command', command: 'node mindlore-search.cjs' }] },
|
|
28
|
+
],
|
|
29
|
+
SessionEnd: [
|
|
30
|
+
{ hooks: [{ type: 'command', command: 'node mindlore-session-end.cjs' }] },
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
fs_1.default.writeFileSync(path_1.default.join(claudeDir, 'settings.json'), JSON.stringify(settings, null, 2));
|
|
35
|
+
const projectClaude = path_1.default.join(MOCK_PROJECT, '.claude');
|
|
36
|
+
const projectMindlore = path_1.default.join(MOCK_PROJECT, '.mindlore');
|
|
37
|
+
fs_1.default.mkdirSync(path_1.default.join(projectMindlore, 'sources'), { recursive: true });
|
|
38
|
+
fs_1.default.mkdirSync(projectClaude, { recursive: true });
|
|
39
|
+
fs_1.default.writeFileSync(path_1.default.join(projectMindlore, 'INDEX.md'), '# Mindlore Index');
|
|
40
|
+
fs_1.default.writeFileSync(path_1.default.join(projectClaude, 'settings.json'), JSON.stringify({ projectDocFiles: ['.mindlore/SCHEMA.md', 'other.md'] }));
|
|
41
|
+
}
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
fs_1.default.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
44
|
+
setupMockEnvironment();
|
|
45
|
+
});
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
fs_1.default.rmSync(TEST_DIR, { recursive: true, force: true });
|
|
48
|
+
});
|
|
49
|
+
describe('Uninstall Logic', () => {
|
|
50
|
+
test('should remove mindlore hooks but keep other hooks', () => {
|
|
51
|
+
const settingsPath = path_1.default.join(MOCK_HOME, '.claude', 'settings.json');
|
|
52
|
+
const settings = JSON.parse(fs_1.default.readFileSync(settingsPath, 'utf8'));
|
|
53
|
+
for (const event of Object.keys(settings.hooks)) {
|
|
54
|
+
settings.hooks[event] = (settings.hooks[event] ?? []).filter((entry) => {
|
|
55
|
+
const hooks = entry.hooks ?? [];
|
|
56
|
+
return !hooks.some((h) => (h.command ?? '').includes('mindlore-'));
|
|
57
|
+
});
|
|
58
|
+
if (settings.hooks[event].length === 0) {
|
|
59
|
+
delete settings.hooks[event];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
expect(settings.hooks['SessionStart']).toHaveLength(1);
|
|
63
|
+
expect(settings.hooks['SessionStart'][0].hooks[0].command).toContain('some-other-hook');
|
|
64
|
+
expect(settings.hooks['UserPromptSubmit']).toBeUndefined();
|
|
65
|
+
expect(settings.hooks['SessionEnd']).toBeUndefined();
|
|
66
|
+
});
|
|
67
|
+
test('should remove mindlore skills but keep other skills', () => {
|
|
68
|
+
const skillsDir = path_1.default.join(MOCK_HOME, '.claude', 'skills');
|
|
69
|
+
const before = fs_1.default.readdirSync(skillsDir);
|
|
70
|
+
expect(before).toContain('mindlore-ingest');
|
|
71
|
+
expect(before).toContain('mindlore-health');
|
|
72
|
+
expect(before).toContain('other-skill');
|
|
73
|
+
const mindloreSkills = before.filter((d) => d.startsWith('mindlore-'));
|
|
74
|
+
for (const skill of mindloreSkills) {
|
|
75
|
+
fs_1.default.rmSync(path_1.default.join(skillsDir, skill), { recursive: true });
|
|
76
|
+
}
|
|
77
|
+
const after = fs_1.default.readdirSync(skillsDir);
|
|
78
|
+
expect(after).not.toContain('mindlore-ingest');
|
|
79
|
+
expect(after).not.toContain('mindlore-health');
|
|
80
|
+
expect(after).toContain('other-skill');
|
|
81
|
+
});
|
|
82
|
+
test('should remove SCHEMA.md from projectDocFiles but keep others', () => {
|
|
83
|
+
const settingsPath = path_1.default.join(MOCK_PROJECT, '.claude', 'settings.json');
|
|
84
|
+
const settings = JSON.parse(fs_1.default.readFileSync(settingsPath, 'utf8'));
|
|
85
|
+
expect(settings.projectDocFiles).toContain('.mindlore/SCHEMA.md');
|
|
86
|
+
expect(settings.projectDocFiles).toContain('other.md');
|
|
87
|
+
settings.projectDocFiles = settings.projectDocFiles.filter((p) => !p.includes('mindlore'));
|
|
88
|
+
expect(settings.projectDocFiles).not.toContain('.mindlore/SCHEMA.md');
|
|
89
|
+
expect(settings.projectDocFiles).toContain('other.md');
|
|
90
|
+
});
|
|
91
|
+
test('should remove .mindlore/ with --all flag', () => {
|
|
92
|
+
const mindloreDir = path_1.default.join(MOCK_PROJECT, '.mindlore');
|
|
93
|
+
expect(fs_1.default.existsSync(mindloreDir)).toBe(true);
|
|
94
|
+
fs_1.default.rmSync(mindloreDir, { recursive: true, force: true });
|
|
95
|
+
expect(fs_1.default.existsSync(mindloreDir)).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=uninstall.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.test.js","sourceRoot":"","sources":["../../tests/uninstall.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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"}
|
|
@@ -14,16 +14,52 @@ const MINDLORE_DIR = '.mindlore';
|
|
|
14
14
|
const DB_NAME = 'mindlore.db';
|
|
15
15
|
const SKIP_FILES = new Set(['INDEX.md', 'SCHEMA.md', 'log.md']);
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Compute global .mindlore/ path at call time.
|
|
19
|
+
* Separate function so os.homedir() is evaluated lazily (testable).
|
|
20
|
+
*/
|
|
21
|
+
function globalDir() {
|
|
22
|
+
return path.join(os.homedir(), MINDLORE_DIR);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Convenience export — snapshot at load time for simple references.
|
|
26
|
+
const GLOBAL_MINDLORE_DIR = globalDir();
|
|
27
|
+
|
|
17
28
|
function findMindloreDir() {
|
|
18
29
|
const projectDir = path.join(process.cwd(), MINDLORE_DIR);
|
|
19
30
|
if (fs.existsSync(projectDir)) return projectDir;
|
|
20
31
|
|
|
21
|
-
const
|
|
22
|
-
if (fs.existsSync(
|
|
32
|
+
const gDir = globalDir();
|
|
33
|
+
if (fs.existsSync(gDir)) return gDir;
|
|
23
34
|
|
|
24
35
|
return null;
|
|
25
36
|
}
|
|
26
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Always returns a .mindlore/ path — project if exists, otherwise global.
|
|
40
|
+
* Unlike findMindloreDir, never returns null.
|
|
41
|
+
*/
|
|
42
|
+
function getActiveMindloreDir() {
|
|
43
|
+
const projectDir = path.join(process.cwd(), MINDLORE_DIR);
|
|
44
|
+
if (fs.existsSync(projectDir)) return projectDir;
|
|
45
|
+
return globalDir();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Return all existing mindlore DB paths (project first, global second).
|
|
50
|
+
* Used for layered search: project results ranked higher.
|
|
51
|
+
*/
|
|
52
|
+
function getAllDbs() {
|
|
53
|
+
const dbs = [];
|
|
54
|
+
const projectDb = path.join(process.cwd(), MINDLORE_DIR, DB_NAME);
|
|
55
|
+
const gDb = path.join(globalDir(), DB_NAME);
|
|
56
|
+
|
|
57
|
+
if (fs.existsSync(projectDb)) dbs.push(projectDb);
|
|
58
|
+
if (fs.existsSync(gDb) && gDb !== projectDb) dbs.push(gDb);
|
|
59
|
+
|
|
60
|
+
return dbs;
|
|
61
|
+
}
|
|
62
|
+
|
|
27
63
|
function getLatestDelta(diaryDir) {
|
|
28
64
|
if (!fs.existsSync(diaryDir)) return null;
|
|
29
65
|
|
|
@@ -91,17 +127,37 @@ function extractFtsMetadata(meta, body, filePath, baseDir) {
|
|
|
91
127
|
tags = Array.isArray(meta.tags) ? meta.tags.join(', ') : String(meta.tags);
|
|
92
128
|
}
|
|
93
129
|
const quality = meta.quality !== undefined && meta.quality !== null ? meta.quality : null;
|
|
94
|
-
|
|
130
|
+
const dateCaptured = meta.date_captured || meta.date || null;
|
|
131
|
+
return { slug, description, type, category, title, tags, quality, dateCaptured };
|
|
95
132
|
}
|
|
96
133
|
|
|
97
134
|
/**
|
|
98
135
|
* Shared SQL constants to prevent drift across indexing paths.
|
|
99
136
|
*/
|
|
100
137
|
const SQL_FTS_CREATE =
|
|
101
|
-
"CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts USING fts5(path UNINDEXED, slug, description, type UNINDEXED, category, title, content, tags, quality UNINDEXED, tokenize='porter unicode61')";
|
|
138
|
+
"CREATE VIRTUAL TABLE IF NOT EXISTS mindlore_fts USING fts5(path UNINDEXED, slug, description, type UNINDEXED, category, title, content, tags, quality UNINDEXED, date_captured UNINDEXED, tokenize='porter unicode61')";
|
|
102
139
|
|
|
103
140
|
const SQL_FTS_INSERT =
|
|
104
|
-
'INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
141
|
+
'INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Insert a row into FTS5 using an object parameter (replaces positional args).
|
|
145
|
+
*/
|
|
146
|
+
function insertFtsRow(db, entry) {
|
|
147
|
+
const stmt = db.prepare(SQL_FTS_INSERT);
|
|
148
|
+
stmt.run(
|
|
149
|
+
entry.path || '',
|
|
150
|
+
entry.slug || '',
|
|
151
|
+
entry.description || '',
|
|
152
|
+
entry.type || '',
|
|
153
|
+
entry.category || '',
|
|
154
|
+
entry.title || '',
|
|
155
|
+
entry.content || '',
|
|
156
|
+
entry.tags || '',
|
|
157
|
+
entry.quality || null,
|
|
158
|
+
entry.dateCaptured || null,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
105
161
|
|
|
106
162
|
/**
|
|
107
163
|
* Extract headings (h1-h3) from markdown content.
|
|
@@ -179,9 +235,13 @@ function readHookStdin(fields) {
|
|
|
179
235
|
|
|
180
236
|
module.exports = {
|
|
181
237
|
MINDLORE_DIR,
|
|
238
|
+
GLOBAL_MINDLORE_DIR,
|
|
239
|
+
globalDir,
|
|
182
240
|
DB_NAME,
|
|
183
241
|
SKIP_FILES,
|
|
184
242
|
findMindloreDir,
|
|
243
|
+
getActiveMindloreDir,
|
|
244
|
+
getAllDbs,
|
|
185
245
|
getLatestDelta,
|
|
186
246
|
sha256,
|
|
187
247
|
parseFrontmatter,
|
|
@@ -189,6 +249,7 @@ module.exports = {
|
|
|
189
249
|
readHookStdin,
|
|
190
250
|
SQL_FTS_CREATE,
|
|
191
251
|
SQL_FTS_INSERT,
|
|
252
|
+
insertFtsRow,
|
|
192
253
|
extractHeadings,
|
|
193
254
|
requireDatabase,
|
|
194
255
|
openDatabase,
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type declarations for mindlore-common.cjs hook functions.
|
|
3
|
+
* Use with JSDoc @type imports in .cjs hook files.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface FtsMetadata {
|
|
7
|
+
slug: string;
|
|
8
|
+
description: string;
|
|
9
|
+
type: string;
|
|
10
|
+
category: string;
|
|
11
|
+
title: string;
|
|
12
|
+
tags: string;
|
|
13
|
+
quality: string | null;
|
|
14
|
+
dateCaptured: string | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface FtsEntry {
|
|
18
|
+
path: string;
|
|
19
|
+
slug?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
type?: string;
|
|
22
|
+
category?: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
content?: string;
|
|
25
|
+
tags?: string;
|
|
26
|
+
quality?: string | null;
|
|
27
|
+
dateCaptured?: string | null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ParsedFrontmatter {
|
|
31
|
+
meta: Record<string, string | string[]>;
|
|
32
|
+
body: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface MindloreCommon {
|
|
36
|
+
MINDLORE_DIR: string;
|
|
37
|
+
GLOBAL_MINDLORE_DIR: string;
|
|
38
|
+
DB_NAME: string;
|
|
39
|
+
SKIP_FILES: Set<string>;
|
|
40
|
+
globalDir(): string;
|
|
41
|
+
findMindloreDir(): string | null;
|
|
42
|
+
getActiveMindloreDir(): string;
|
|
43
|
+
getAllDbs(): string[];
|
|
44
|
+
getLatestDelta(diaryDir: string): string | null;
|
|
45
|
+
sha256(content: string): string;
|
|
46
|
+
parseFrontmatter(content: string): ParsedFrontmatter;
|
|
47
|
+
extractFtsMetadata(meta: Record<string, string>, body: string, filePath: string, baseDir: string): FtsMetadata;
|
|
48
|
+
insertFtsRow(db: import('better-sqlite3').Database, entry: FtsEntry): void;
|
|
49
|
+
readHookStdin(fields: string[]): string;
|
|
50
|
+
extractHeadings(content: string, max: number): string[];
|
|
51
|
+
requireDatabase(): typeof import('better-sqlite3') | null;
|
|
52
|
+
openDatabase(dbPath: string, opts?: { readonly?: boolean }): import('better-sqlite3').Database | null;
|
|
53
|
+
getAllMdFiles(dir: string, skip?: Set<string>): string[];
|
|
54
|
+
SQL_FTS_CREATE: string;
|
|
55
|
+
SQL_FTS_INSERT: string;
|
|
56
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* mindlore-cwd-changed — CwdChanged hook
|
|
6
|
+
*
|
|
7
|
+
* Fires when user changes working directory.
|
|
8
|
+
* CwdChanged has NO inject to Claude — stdout is swallowed, stderr shown to user.
|
|
9
|
+
*
|
|
10
|
+
* Side effects:
|
|
11
|
+
* 1. Detect scope (project .mindlore/ vs global ~/.mindlore/)
|
|
12
|
+
* 2. Write scope state to .mindlore/diary/_scope.json for session-focus to read
|
|
13
|
+
* 3. Show user-facing message via stderr
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const { findMindloreDir, globalDir } = require('./lib/mindlore-common.cjs');
|
|
19
|
+
|
|
20
|
+
function main() {
|
|
21
|
+
const cwd = process.cwd();
|
|
22
|
+
const activeDir = findMindloreDir();
|
|
23
|
+
const scope = !activeDir ? 'none' : activeDir.startsWith(globalDir()) ? 'global' : 'project';
|
|
24
|
+
|
|
25
|
+
if (activeDir) {
|
|
26
|
+
const diaryDir = path.join(activeDir, 'diary');
|
|
27
|
+
if (!fs.existsSync(diaryDir)) {
|
|
28
|
+
fs.mkdirSync(diaryDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Dirty-check: skip write if scope hasn't changed
|
|
32
|
+
const scopePath = path.join(diaryDir, '_scope.json');
|
|
33
|
+
if (fs.existsSync(scopePath)) {
|
|
34
|
+
try {
|
|
35
|
+
const existing = JSON.parse(fs.readFileSync(scopePath, 'utf8'));
|
|
36
|
+
if (existing.cwd === cwd && existing.scope === scope) return;
|
|
37
|
+
} catch (_err) {
|
|
38
|
+
// corrupt file — overwrite
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fs.writeFileSync(scopePath, JSON.stringify({
|
|
43
|
+
scope,
|
|
44
|
+
dir: activeDir,
|
|
45
|
+
cwd,
|
|
46
|
+
timestamp: new Date().toISOString(),
|
|
47
|
+
}, null, 2), 'utf8');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (scope === 'none') {
|
|
51
|
+
process.stderr.write(`[Mindlore] Bu projede mindlore kurulu degil. npx mindlore init calistirin.\n`);
|
|
52
|
+
} else {
|
|
53
|
+
process.stderr.write(`[Mindlore scope: ${scope}] ${activeDir}\n`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
main();
|