mindlore 0.3.2 → 0.3.4
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 +50 -24
- package/SCHEMA.md +9 -11
- package/dist/scripts/init.d.ts +4 -2
- package/dist/scripts/init.d.ts.map +1 -1
- package/dist/scripts/init.js +67 -59
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +10 -5
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +18 -20
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/obsidian-helpers.d.ts +25 -0
- package/dist/scripts/lib/obsidian-helpers.d.ts.map +1 -0
- package/dist/scripts/lib/obsidian-helpers.js +88 -0
- package/dist/scripts/lib/obsidian-helpers.js.map +1 -0
- package/dist/scripts/mindlore-backup.d.ts +12 -0
- package/dist/scripts/mindlore-backup.d.ts.map +1 -0
- package/dist/scripts/mindlore-backup.js +218 -0
- package/dist/scripts/mindlore-backup.js.map +1 -0
- package/dist/scripts/mindlore-fts5-index.js +3 -2
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-fts5-search.d.ts +3 -2
- package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
- package/dist/scripts/mindlore-fts5-search.js +38 -50
- package/dist/scripts/mindlore-fts5-search.js.map +1 -1
- package/dist/scripts/mindlore-health-check.js +4 -4
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/scripts/mindlore-obsidian.d.ts +11 -0
- package/dist/scripts/mindlore-obsidian.d.ts.map +1 -0
- package/dist/scripts/mindlore-obsidian.js +182 -0
- package/dist/scripts/mindlore-obsidian.js.map +1 -0
- package/dist/scripts/quality-populate.js +1 -3
- package/dist/scripts/quality-populate.js.map +1 -1
- package/dist/scripts/uninstall.d.ts +4 -3
- package/dist/scripts/uninstall.d.ts.map +1 -1
- package/dist/scripts/uninstall.js +10 -29
- package/dist/scripts/uninstall.js.map +1 -1
- package/dist/tests/backup.test.d.ts +2 -0
- package/dist/tests/backup.test.d.ts.map +1 -0
- package/dist/tests/backup.test.js +105 -0
- package/dist/tests/backup.test.js.map +1 -0
- package/dist/tests/cwd-changed.test.js +6 -5
- package/dist/tests/cwd-changed.test.js.map +1 -1
- package/dist/tests/decision.test.js +1 -1
- package/dist/tests/decision.test.js.map +1 -1
- package/dist/tests/global-layer.test.js +22 -39
- package/dist/tests/global-layer.test.js.map +1 -1
- package/dist/tests/helpers/db.d.ts +1 -0
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/init.test.js +22 -0
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/model-router.test.js +2 -1
- package/dist/tests/model-router.test.js.map +1 -1
- package/dist/tests/obsidian.test.d.ts +2 -0
- package/dist/tests/obsidian.test.d.ts.map +1 -0
- package/dist/tests/obsidian.test.js +138 -0
- package/dist/tests/obsidian.test.js.map +1 -0
- package/dist/tests/post-read.test.js +2 -1
- package/dist/tests/post-read.test.js.map +1 -1
- package/dist/tests/project-namespace.test.d.ts +2 -0
- package/dist/tests/project-namespace.test.d.ts.map +1 -0
- package/dist/tests/project-namespace.test.js +151 -0
- package/dist/tests/project-namespace.test.js.map +1 -0
- package/dist/tests/read-guard.test.js +5 -4
- package/dist/tests/read-guard.test.js.map +1 -1
- package/dist/tests/session-focus.test.js +50 -0
- package/dist/tests/session-focus.test.js.map +1 -1
- package/hooks/lib/mindlore-common.cjs +38 -29
- package/hooks/lib/types.d.ts +2 -0
- package/hooks/mindlore-cwd-changed.cjs +1 -1
- package/hooks/mindlore-dont-repeat.cjs +2 -2
- package/hooks/mindlore-fts5-sync.cjs +4 -3
- package/hooks/mindlore-index.cjs +2 -2
- package/hooks/mindlore-post-read.cjs +2 -2
- package/hooks/mindlore-read-guard.cjs +2 -2
- package/hooks/mindlore-search.cjs +0 -2
- package/hooks/mindlore-session-end.cjs +5 -2
- package/hooks/mindlore-session-focus.cjs +22 -7
- package/package.json +1 -1
- package/templates/SCHEMA.md +9 -11
- package/templates/config.json +4 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* obsidian-helpers — Shared utilities for Obsidian integration.
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.convertToWikilinks = convertToWikilinks;
|
|
10
|
+
exports.shouldExport = shouldExport;
|
|
11
|
+
exports.isObsidianVault = isObsidianVault;
|
|
12
|
+
exports.collectMdFiles = collectMdFiles;
|
|
13
|
+
const fs_1 = __importDefault(require("fs"));
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
/** Files/dirs to skip during export */
|
|
16
|
+
const SKIP_FILES = new Set([
|
|
17
|
+
'config.json',
|
|
18
|
+
'log.md',
|
|
19
|
+
'INDEX.md',
|
|
20
|
+
'SCHEMA.md',
|
|
21
|
+
'.gitignore',
|
|
22
|
+
'.version',
|
|
23
|
+
'.pkg-version',
|
|
24
|
+
]);
|
|
25
|
+
const SKIP_DIRS = new Set(['.git']);
|
|
26
|
+
/**
|
|
27
|
+
* Convert relative markdown links to Obsidian wikilinks.
|
|
28
|
+
* `[text](../domains/x.md)` → `[[x]]`
|
|
29
|
+
* `[text](./sources/y.md)` → `[[y]]`
|
|
30
|
+
*/
|
|
31
|
+
function convertToWikilinks(content) {
|
|
32
|
+
return content.replace(/\[([^\]]+)\]\((?:\.\.?\/)?(?:[\w-]+\/)*([^/)]+)\.md\)/g, (_match, _text, filename) => `[[${filename}]]`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a file should be exported (newer than vault copy or no vault copy).
|
|
36
|
+
*/
|
|
37
|
+
function shouldExport(srcPath, destPath, force) {
|
|
38
|
+
if (force)
|
|
39
|
+
return true;
|
|
40
|
+
try {
|
|
41
|
+
const srcStat = fs_1.default.statSync(srcPath);
|
|
42
|
+
const destStat = fs_1.default.statSync(destPath);
|
|
43
|
+
return srcStat.mtimeMs > destStat.mtimeMs;
|
|
44
|
+
}
|
|
45
|
+
catch (_err) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a directory is an Obsidian vault (has .obsidian/ folder).
|
|
51
|
+
*/
|
|
52
|
+
function isObsidianVault(dirPath) {
|
|
53
|
+
return fs_1.default.existsSync(path_1.default.join(dirPath, '.obsidian'));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Recursively collect all .md files from a directory, excluding SKIP_FILES and SKIP_DIRS.
|
|
57
|
+
*/
|
|
58
|
+
function collectMdFiles(baseDir, relativeTo) {
|
|
59
|
+
const root = relativeTo ?? baseDir;
|
|
60
|
+
const results = [];
|
|
61
|
+
let entries;
|
|
62
|
+
try {
|
|
63
|
+
entries = fs_1.default.readdirSync(baseDir, { withFileTypes: true });
|
|
64
|
+
}
|
|
65
|
+
catch (_err) {
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (SKIP_DIRS.has(entry.name))
|
|
70
|
+
continue;
|
|
71
|
+
if (entry.name.startsWith('_'))
|
|
72
|
+
continue;
|
|
73
|
+
const fullPath = path_1.default.join(baseDir, entry.name);
|
|
74
|
+
if (entry.isDirectory()) {
|
|
75
|
+
results.push(...collectMdFiles(fullPath, root));
|
|
76
|
+
}
|
|
77
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
78
|
+
if (SKIP_FILES.has(entry.name))
|
|
79
|
+
continue;
|
|
80
|
+
results.push({
|
|
81
|
+
absolute: fullPath,
|
|
82
|
+
relative: path_1.default.relative(root, fullPath),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=obsidian-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obsidian-helpers.js","sourceRoot":"","sources":["../../../scripts/lib/obsidian-helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAuBH,gDAKC;AAKD,oCAaC;AAKD,0CAEC;AAKD,wCAiCC;AAzFD,4CAAoB;AACpB,gDAAwB;AAExB,uCAAuC;AACvC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,aAAa;IACb,QAAQ;IACR,UAAU;IACV,WAAW;IACX,YAAY;IACZ,UAAU;IACV,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpC;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,OAAe;IAChD,OAAO,OAAO,CAAC,OAAO,CACpB,wDAAwD,EACxD,CAAC,MAAM,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE,CAAC,KAAK,QAAQ,IAAI,CAC/D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,QAAgB,EAChB,KAAc;IAEd,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC5C,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,OAAe;IAC7C,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAC5B,OAAe,EACf,UAAmB;IAEnB,MAAM,IAAI,GAAG,UAAU,IAAI,OAAO,CAAC;IACnC,MAAM,OAAO,GAAkD,EAAE,CAAC;IAElE,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACd,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QACxC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAEzC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEzC,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mindlore backup — Git-based backup for ~/.mindlore/
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* mindlore backup init — Create .gitignore, initial commit
|
|
7
|
+
* mindlore backup status — Show git status + last commit
|
|
8
|
+
* mindlore backup remote <url> — Set remote origin
|
|
9
|
+
* mindlore backup now — Manual commit + push
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=mindlore-backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mindlore-backup.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-backup.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* mindlore backup — Git-based backup for ~/.mindlore/
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* mindlore backup init — Create .gitignore, initial commit
|
|
8
|
+
* mindlore backup status — Show git status + last commit
|
|
9
|
+
* mindlore backup remote <url> — Set remote origin
|
|
10
|
+
* mindlore backup now — Manual commit + push
|
|
11
|
+
*/
|
|
12
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const child_process_1 = require("child_process");
|
|
19
|
+
const constants_js_1 = require("./lib/constants.js");
|
|
20
|
+
const BASE_DIR = constants_js_1.GLOBAL_MINDLORE_DIR;
|
|
21
|
+
const GIT_DIR = path_1.default.join(BASE_DIR, '.git');
|
|
22
|
+
const GITIGNORE_CONTENT = `*.db
|
|
23
|
+
*.db-wal
|
|
24
|
+
*.db-shm
|
|
25
|
+
_session-reads-*.json
|
|
26
|
+
_pattern-cache-*.json
|
|
27
|
+
`;
|
|
28
|
+
function backupInit() {
|
|
29
|
+
if (!fs_1.default.existsSync(BASE_DIR)) {
|
|
30
|
+
console.error(' ~/.mindlore/ not found. Run: npx mindlore init');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Create .gitignore
|
|
34
|
+
const gitignorePath = path_1.default.join(BASE_DIR, '.gitignore');
|
|
35
|
+
fs_1.default.writeFileSync(gitignorePath, GITIGNORE_CONTENT, 'utf8');
|
|
36
|
+
(0, constants_js_1.log)('Created .gitignore');
|
|
37
|
+
// Init git if needed
|
|
38
|
+
if (!fs_1.default.existsSync(GIT_DIR)) {
|
|
39
|
+
(0, child_process_1.execSync)('git init', { cwd: BASE_DIR, stdio: 'pipe', timeout: 10000 });
|
|
40
|
+
(0, constants_js_1.log)('Initialized git repo');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
(0, constants_js_1.log)('Git repo already initialized');
|
|
44
|
+
}
|
|
45
|
+
// Initial commit
|
|
46
|
+
try {
|
|
47
|
+
(0, child_process_1.execSync)('git add -A', { cwd: BASE_DIR, stdio: 'pipe', timeout: 10000 });
|
|
48
|
+
const status = (0, child_process_1.execSync)('git status --porcelain', {
|
|
49
|
+
cwd: BASE_DIR,
|
|
50
|
+
encoding: 'utf8',
|
|
51
|
+
timeout: 5000,
|
|
52
|
+
}).trim();
|
|
53
|
+
if (status) {
|
|
54
|
+
(0, child_process_1.execSync)('git commit -m "mindlore backup init"', {
|
|
55
|
+
cwd: BASE_DIR,
|
|
56
|
+
stdio: 'pipe',
|
|
57
|
+
timeout: 10000,
|
|
58
|
+
});
|
|
59
|
+
(0, constants_js_1.log)('Initial commit created');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
(0, constants_js_1.log)('Nothing to commit');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (_err) {
|
|
66
|
+
(0, constants_js_1.log)('WARNING: Could not create initial commit');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function backupStatus() {
|
|
70
|
+
if (!fs_1.default.existsSync(GIT_DIR)) {
|
|
71
|
+
console.log(' Backup not initialized. Run: mindlore backup init');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const lastCommit = (0, child_process_1.execSync)('git log --oneline -1', {
|
|
76
|
+
cwd: BASE_DIR,
|
|
77
|
+
encoding: 'utf8',
|
|
78
|
+
timeout: 5000,
|
|
79
|
+
}).trim();
|
|
80
|
+
(0, constants_js_1.log)(`Last commit: ${lastCommit}`);
|
|
81
|
+
}
|
|
82
|
+
catch (_err) {
|
|
83
|
+
(0, constants_js_1.log)('No commits yet');
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const remote = (0, child_process_1.execSync)('git remote get-url origin', {
|
|
87
|
+
cwd: BASE_DIR,
|
|
88
|
+
encoding: 'utf8',
|
|
89
|
+
timeout: 5000,
|
|
90
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
91
|
+
}).trim();
|
|
92
|
+
(0, constants_js_1.log)(`Remote: ${remote}`);
|
|
93
|
+
}
|
|
94
|
+
catch (_err) {
|
|
95
|
+
(0, constants_js_1.log)('Remote: not configured');
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
const status = (0, child_process_1.execSync)('git status --short', {
|
|
99
|
+
cwd: BASE_DIR,
|
|
100
|
+
encoding: 'utf8',
|
|
101
|
+
timeout: 5000,
|
|
102
|
+
}).trim();
|
|
103
|
+
if (status) {
|
|
104
|
+
const lines = status.split('\n');
|
|
105
|
+
(0, constants_js_1.log)(`Uncommitted: ${lines.length} file(s)`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
(0, constants_js_1.log)('Working tree clean');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (_err) {
|
|
112
|
+
(0, constants_js_1.log)('Could not get status');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function backupRemote(url) {
|
|
116
|
+
if (!fs_1.default.existsSync(GIT_DIR)) {
|
|
117
|
+
console.error(' Backup not initialized. Run: mindlore backup init');
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
try {
|
|
122
|
+
(0, child_process_1.execSync)('git remote get-url origin', {
|
|
123
|
+
cwd: BASE_DIR,
|
|
124
|
+
stdio: 'pipe',
|
|
125
|
+
timeout: 5000,
|
|
126
|
+
});
|
|
127
|
+
(0, child_process_1.execFileSync)('git', ['remote', 'set-url', 'origin', url], {
|
|
128
|
+
cwd: BASE_DIR,
|
|
129
|
+
stdio: 'pipe',
|
|
130
|
+
timeout: 5000,
|
|
131
|
+
});
|
|
132
|
+
(0, constants_js_1.log)(`Remote updated: ${url}`);
|
|
133
|
+
}
|
|
134
|
+
catch (_err) {
|
|
135
|
+
(0, child_process_1.execFileSync)('git', ['remote', 'add', 'origin', url], {
|
|
136
|
+
cwd: BASE_DIR,
|
|
137
|
+
stdio: 'pipe',
|
|
138
|
+
timeout: 5000,
|
|
139
|
+
});
|
|
140
|
+
(0, constants_js_1.log)(`Remote added: ${url}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (_err) {
|
|
144
|
+
(0, constants_js_1.log)('WARNING: Could not set remote');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function backupNow() {
|
|
148
|
+
if (!fs_1.default.existsSync(GIT_DIR)) {
|
|
149
|
+
console.error(' Backup not initialized. Run: mindlore backup init');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
(0, child_process_1.execSync)('git add -A', { cwd: BASE_DIR, stdio: 'pipe', timeout: 10000 });
|
|
154
|
+
const status = (0, child_process_1.execSync)('git status --porcelain', {
|
|
155
|
+
cwd: BASE_DIR,
|
|
156
|
+
encoding: 'utf8',
|
|
157
|
+
timeout: 5000,
|
|
158
|
+
}).trim();
|
|
159
|
+
if (!status) {
|
|
160
|
+
(0, constants_js_1.log)('Nothing to commit — working tree clean');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const now = new Date().toISOString().slice(0, 19);
|
|
164
|
+
(0, child_process_1.execSync)(`git commit -m "mindlore backup ${now}"`, {
|
|
165
|
+
cwd: BASE_DIR,
|
|
166
|
+
stdio: 'pipe',
|
|
167
|
+
timeout: 10000,
|
|
168
|
+
});
|
|
169
|
+
(0, constants_js_1.log)('Committed');
|
|
170
|
+
try {
|
|
171
|
+
(0, child_process_1.execSync)('git remote get-url origin', {
|
|
172
|
+
cwd: BASE_DIR,
|
|
173
|
+
stdio: 'pipe',
|
|
174
|
+
timeout: 5000,
|
|
175
|
+
});
|
|
176
|
+
(0, child_process_1.execSync)('git push', { cwd: BASE_DIR, stdio: 'pipe', timeout: 15000 });
|
|
177
|
+
(0, constants_js_1.log)('Pushed to remote');
|
|
178
|
+
}
|
|
179
|
+
catch (_err) {
|
|
180
|
+
(0, constants_js_1.log)('No remote configured — local commit only');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (_err) {
|
|
184
|
+
(0, constants_js_1.log)('WARNING: Backup failed');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function main() {
|
|
188
|
+
const args = process.argv.slice(2);
|
|
189
|
+
const subcommand = args[0];
|
|
190
|
+
console.log('\n Mindlore Backup\n');
|
|
191
|
+
switch (subcommand) {
|
|
192
|
+
case 'init':
|
|
193
|
+
backupInit();
|
|
194
|
+
break;
|
|
195
|
+
case 'status':
|
|
196
|
+
backupStatus();
|
|
197
|
+
break;
|
|
198
|
+
case 'remote':
|
|
199
|
+
if (!args[1]) {
|
|
200
|
+
console.error(' Usage: mindlore backup remote <url>');
|
|
201
|
+
process.exit(1);
|
|
202
|
+
}
|
|
203
|
+
backupRemote(args[1]);
|
|
204
|
+
break;
|
|
205
|
+
case 'now':
|
|
206
|
+
backupNow();
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
console.log(' Usage:');
|
|
210
|
+
(0, constants_js_1.log)('mindlore backup init — Initialize backup');
|
|
211
|
+
(0, constants_js_1.log)('mindlore backup status — Show backup status');
|
|
212
|
+
(0, constants_js_1.log)('mindlore backup remote <url> — Set remote repository');
|
|
213
|
+
(0, constants_js_1.log)('mindlore backup now — Commit + push now');
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
main();
|
|
218
|
+
//# sourceMappingURL=mindlore-backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mindlore-backup.js","sourceRoot":"","sources":["../../scripts/mindlore-backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ const constants_js_1 = require("./lib/constants.js");
|
|
|
16
16
|
const { sha256, getAllMdFiles, openDatabase, parseFrontmatter, extractFtsMetadata, insertFtsRow, } = require((0, constants_js_1.resolveHookCommon)(__dirname));
|
|
17
17
|
// ── Main ───────────────────────────────────────────────────────────────
|
|
18
18
|
function main() {
|
|
19
|
-
const baseDir = process.argv[2] ??
|
|
19
|
+
const baseDir = process.argv[2] ?? constants_js_1.GLOBAL_MINDLORE_DIR;
|
|
20
20
|
const dbPath = path_1.default.join(baseDir, constants_js_1.DB_NAME);
|
|
21
21
|
if (!fs_1.default.existsSync(dbPath)) {
|
|
22
22
|
console.error(' Database not found. Run: npx mindlore init');
|
|
@@ -41,6 +41,7 @@ function main() {
|
|
|
41
41
|
let skipped = 0;
|
|
42
42
|
let errors = 0;
|
|
43
43
|
const now = new Date().toISOString();
|
|
44
|
+
const project = path_1.default.basename(process.cwd());
|
|
44
45
|
const transaction = db.transaction(() => {
|
|
45
46
|
for (const filePath of mdFiles) {
|
|
46
47
|
try {
|
|
@@ -54,7 +55,7 @@ function main() {
|
|
|
54
55
|
const { meta, body } = parseFrontmatter(content);
|
|
55
56
|
const { slug, description, type, category, title, tags, quality, dateCaptured } = extractFtsMetadata(meta, body, filePath, baseDir);
|
|
56
57
|
deleteFts.run(filePath);
|
|
57
|
-
insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured });
|
|
58
|
+
insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured, project });
|
|
58
59
|
upsertHash.run(filePath, hash, now);
|
|
59
60
|
indexed++;
|
|
60
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindlore-fts5-index.js","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"mindlore-fts5-index.js","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* mindlore-fts5-search — Search
|
|
3
|
+
* mindlore-fts5-search — Search ~/.mindlore/ knowledge base via FTS5.
|
|
4
4
|
*
|
|
5
|
-
* Usage: node dist/scripts/mindlore-fts5-search.js "query" [--
|
|
5
|
+
* Usage: node dist/scripts/mindlore-fts5-search.js "query" [--all] [--project <name>]
|
|
6
6
|
*
|
|
7
|
+
* v0.3.3: Single global DB. Default: filter by current project. --all: no filter.
|
|
7
8
|
* Returns top 3 results ranked by BM25 with file path and snippet.
|
|
8
9
|
*/
|
|
9
10
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindlore-fts5-search.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-search.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"mindlore-fts5-search.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-search.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
3
|
/**
|
|
4
|
-
* mindlore-fts5-search — Search
|
|
4
|
+
* mindlore-fts5-search — Search ~/.mindlore/ knowledge base via FTS5.
|
|
5
5
|
*
|
|
6
|
-
* Usage: node dist/scripts/mindlore-fts5-search.js "query" [--
|
|
6
|
+
* Usage: node dist/scripts/mindlore-fts5-search.js "query" [--all] [--project <name>]
|
|
7
7
|
*
|
|
8
|
+
* v0.3.3: Single global DB. Default: filter by current project. --all: no filter.
|
|
8
9
|
* Returns top 3 results ranked by BM25 with file path and snippet.
|
|
9
10
|
*/
|
|
10
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
@@ -16,11 +17,18 @@ const path_1 = __importDefault(require("path"));
|
|
|
16
17
|
const constants_js_1 = require("./lib/constants.js");
|
|
17
18
|
const { openDatabase, extractHeadings } = require((0, constants_js_1.resolveHookCommon)(__dirname));
|
|
18
19
|
const MAX_RESULTS = 3;
|
|
19
|
-
function
|
|
20
|
-
const db = openDatabase(dbPath, { readonly: true });
|
|
21
|
-
if (!db)
|
|
22
|
-
return [];
|
|
20
|
+
function queryDb(db, sanitized, projectFilter) {
|
|
23
21
|
try {
|
|
22
|
+
if (projectFilter) {
|
|
23
|
+
return db
|
|
24
|
+
.prepare(`SELECT path, snippet(mindlore_fts, 1, '>>>', '<<<', '...', 40) as snippet,
|
|
25
|
+
rank
|
|
26
|
+
FROM mindlore_fts
|
|
27
|
+
WHERE mindlore_fts MATCH ? AND project = ?
|
|
28
|
+
ORDER BY rank
|
|
29
|
+
LIMIT ?`)
|
|
30
|
+
.all(sanitized, projectFilter, MAX_RESULTS);
|
|
31
|
+
}
|
|
24
32
|
return db
|
|
25
33
|
.prepare(`SELECT path, snippet(mindlore_fts, 1, '>>>', '<<<', '...', 40) as snippet,
|
|
26
34
|
rank
|
|
@@ -33,37 +41,20 @@ function searchSingleDb(dbPath, sanitized) {
|
|
|
33
41
|
catch (_err) {
|
|
34
42
|
return [];
|
|
35
43
|
}
|
|
36
|
-
finally {
|
|
37
|
-
db.close();
|
|
38
|
-
}
|
|
39
44
|
}
|
|
40
45
|
function main() {
|
|
41
46
|
const args = process.argv.slice(2);
|
|
42
|
-
const isGlobal = args.includes('--global');
|
|
43
47
|
const isAll = args.includes('--all');
|
|
44
|
-
const
|
|
48
|
+
const projectIdx = args.indexOf('--project');
|
|
49
|
+
const explicitProject = projectIdx !== -1 ? args[projectIdx + 1] : undefined;
|
|
50
|
+
const query = args.find((a) => !a.startsWith('--') && a !== explicitProject);
|
|
45
51
|
if (!query) {
|
|
46
|
-
console.error('Usage: node mindlore-fts5-search.js "query" [--
|
|
52
|
+
console.error('Usage: node mindlore-fts5-search.js "query" [--all] [--project <name>]');
|
|
47
53
|
process.exit(1);
|
|
48
54
|
}
|
|
49
|
-
//
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
if (isAll) {
|
|
53
|
-
if (fs_1.default.existsSync(projectDir))
|
|
54
|
-
searchDirs.push(projectDir);
|
|
55
|
-
if (fs_1.default.existsSync(constants_js_1.GLOBAL_MINDLORE_DIR) && constants_js_1.GLOBAL_MINDLORE_DIR !== projectDir) {
|
|
56
|
-
searchDirs.push(constants_js_1.GLOBAL_MINDLORE_DIR);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
else if (isGlobal) {
|
|
60
|
-
searchDirs.push(constants_js_1.GLOBAL_MINDLORE_DIR);
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
searchDirs.push(fs_1.default.existsSync(projectDir) ? projectDir : constants_js_1.GLOBAL_MINDLORE_DIR);
|
|
64
|
-
}
|
|
65
|
-
const validDirs = searchDirs.filter((d) => fs_1.default.existsSync(path_1.default.join(d, constants_js_1.DB_NAME)));
|
|
66
|
-
if (validDirs.length === 0) {
|
|
55
|
+
// v0.3.3: Single global DB
|
|
56
|
+
const dbPath = path_1.default.join(constants_js_1.GLOBAL_MINDLORE_DIR, constants_js_1.DB_NAME);
|
|
57
|
+
if (!fs_1.default.existsSync(dbPath)) {
|
|
67
58
|
console.error(' Database not found. Run: npx mindlore init && npm run index');
|
|
68
59
|
process.exit(1);
|
|
69
60
|
}
|
|
@@ -72,37 +63,34 @@ function main() {
|
|
|
72
63
|
console.log(' No valid search terms.');
|
|
73
64
|
process.exit(0);
|
|
74
65
|
}
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
66
|
+
const projectFilter = isAll ? undefined : (explicitProject ?? (0, constants_js_1.getProjectName)());
|
|
67
|
+
const db = openDatabase(dbPath, { readonly: true });
|
|
68
|
+
if (!db) {
|
|
69
|
+
console.error(' Could not open database.');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
let relevant;
|
|
73
|
+
try {
|
|
74
|
+
relevant = queryDb(db, sanitized, projectFilter);
|
|
75
|
+
// If project-scoped search returns nothing, fallback to all projects
|
|
76
|
+
if (relevant.length === 0 && projectFilter) {
|
|
77
|
+
relevant = queryDb(db, sanitized);
|
|
82
78
|
}
|
|
83
79
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const unique = allResults.filter((r) => {
|
|
88
|
-
const normalized = path_1.default.resolve(r.path);
|
|
89
|
-
if (seen.has(normalized))
|
|
90
|
-
return false;
|
|
91
|
-
seen.add(normalized);
|
|
92
|
-
return true;
|
|
93
|
-
});
|
|
94
|
-
const relevant = unique.slice(0, MAX_RESULTS);
|
|
80
|
+
finally {
|
|
81
|
+
db.close();
|
|
82
|
+
}
|
|
95
83
|
if (relevant.length === 0) {
|
|
96
84
|
console.log(` No results for: "${query}"`);
|
|
97
85
|
process.exit(0);
|
|
98
86
|
}
|
|
99
|
-
const scopeLabel = isAll ? 'all' :
|
|
87
|
+
const scopeLabel = isAll ? 'all' : `project:${projectFilter}`;
|
|
100
88
|
console.log(`\n Mindlore Search [${scopeLabel}]: "${query}" (${relevant.length} results)\n`);
|
|
101
89
|
for (let i = 0; i < relevant.length; i++) {
|
|
102
90
|
const r = relevant[i];
|
|
103
91
|
if (!r)
|
|
104
92
|
continue;
|
|
105
|
-
const relativePath = path_1.default.relative(
|
|
93
|
+
const relativePath = path_1.default.relative(constants_js_1.GLOBAL_MINDLORE_DIR, r.path);
|
|
106
94
|
const fileName = path_1.default.basename(r.path, '.md');
|
|
107
95
|
let headings = [];
|
|
108
96
|
if (fs_1.default.existsSync(r.path)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mindlore-fts5-search.js","sourceRoot":"","sources":["../../scripts/mindlore-fts5-search.ts"],"names":[],"mappings":";;AAEA
|
|
1
|
+
{"version":3,"file":"mindlore-fts5-search.js","sourceRoot":"","sources":["../../scripts/mindlore-fts5-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,15 +118,15 @@ class HealthChecker {
|
|
|
118
118
|
.prepare('SELECT count(*) as cnt FROM file_hashes')
|
|
119
119
|
.get();
|
|
120
120
|
const schemaVersion = detectSchemaVersion(db);
|
|
121
|
-
if (schemaVersion <
|
|
121
|
+
if (schemaVersion < 11) {
|
|
122
122
|
return {
|
|
123
123
|
warn: true,
|
|
124
|
-
detail: `${result.cnt} indexed, ${hashResult.cnt} hashes — ${schemaVersion}-col schema (run: npx mindlore init to upgrade to
|
|
124
|
+
detail: `${result.cnt} indexed, ${hashResult.cnt} hashes — ${schemaVersion}-col schema (run: npx mindlore init to upgrade to 11-col)`,
|
|
125
125
|
};
|
|
126
126
|
}
|
|
127
127
|
return {
|
|
128
128
|
ok: true,
|
|
129
|
-
detail: `${result.cnt} indexed, ${hashResult.cnt} hashes,
|
|
129
|
+
detail: `${result.cnt} indexed, ${hashResult.cnt} hashes, 11-col schema`,
|
|
130
130
|
};
|
|
131
131
|
}
|
|
132
132
|
catch (err) {
|
|
@@ -311,7 +311,7 @@ class HealthChecker {
|
|
|
311
311
|
}
|
|
312
312
|
// ── Main ───────────────────────────────────────────────────────────────
|
|
313
313
|
function main() {
|
|
314
|
-
const baseDir = process.argv[2] ??
|
|
314
|
+
const baseDir = process.argv[2] ?? constants_js_1.GLOBAL_MINDLORE_DIR;
|
|
315
315
|
if (!fs_1.default.existsSync(baseDir)) {
|
|
316
316
|
console.error(` .mindlore/ not found at: ${baseDir}`);
|
|
317
317
|
console.error(' Run: npx mindlore init');
|