mindlore 0.2.0 → 0.2.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 (85) hide show
  1. package/README.md +7 -1
  2. package/dist/scripts/init.d.ts +10 -0
  3. package/dist/scripts/init.d.ts.map +1 -0
  4. package/dist/scripts/init.js +375 -0
  5. package/dist/scripts/init.js.map +1 -0
  6. package/dist/scripts/lib/constants.d.ts +29 -0
  7. package/dist/scripts/lib/constants.d.ts.map +1 -0
  8. package/dist/scripts/lib/constants.js +58 -0
  9. package/dist/scripts/lib/constants.js.map +1 -0
  10. package/dist/scripts/mindlore-fts5-index.d.ts +9 -0
  11. package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -0
  12. package/dist/scripts/mindlore-fts5-index.js +89 -0
  13. package/dist/scripts/mindlore-fts5-index.js.map +1 -0
  14. package/dist/scripts/mindlore-fts5-search.d.ts +10 -0
  15. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -0
  16. package/dist/scripts/mindlore-fts5-search.js +108 -0
  17. package/dist/scripts/mindlore-fts5-search.js.map +1 -0
  18. package/dist/scripts/mindlore-health-check.d.ts +10 -0
  19. package/dist/scripts/mindlore-health-check.d.ts.map +1 -0
  20. package/dist/scripts/mindlore-health-check.js +337 -0
  21. package/dist/scripts/mindlore-health-check.js.map +1 -0
  22. package/dist/scripts/uninstall.d.ts +10 -0
  23. package/dist/scripts/uninstall.d.ts.map +1 -0
  24. package/dist/scripts/uninstall.js +143 -0
  25. package/dist/scripts/uninstall.js.map +1 -0
  26. package/dist/tests/compounding.test.d.ts +8 -0
  27. package/dist/tests/compounding.test.d.ts.map +1 -0
  28. package/dist/tests/compounding.test.js +51 -0
  29. package/dist/tests/compounding.test.js.map +1 -0
  30. package/dist/tests/decision.test.d.ts +2 -0
  31. package/dist/tests/decision.test.d.ts.map +1 -0
  32. package/dist/tests/decision.test.js +61 -0
  33. package/dist/tests/decision.test.js.map +1 -0
  34. package/dist/tests/dedup.test.d.ts +2 -0
  35. package/dist/tests/dedup.test.d.ts.map +1 -0
  36. package/dist/tests/dedup.test.js +74 -0
  37. package/dist/tests/dedup.test.js.map +1 -0
  38. package/dist/tests/frontmatter.test.d.ts +2 -0
  39. package/dist/tests/frontmatter.test.d.ts.map +1 -0
  40. package/dist/tests/frontmatter.test.js +90 -0
  41. package/dist/tests/frontmatter.test.js.map +1 -0
  42. package/dist/tests/fts5.test.d.ts +2 -0
  43. package/dist/tests/fts5.test.d.ts.map +1 -0
  44. package/dist/tests/fts5.test.js +95 -0
  45. package/dist/tests/fts5.test.js.map +1 -0
  46. package/dist/tests/helpers/db.d.ts +7 -0
  47. package/dist/tests/helpers/db.d.ts.map +1 -0
  48. package/dist/tests/helpers/db.js +46 -0
  49. package/dist/tests/helpers/db.js.map +1 -0
  50. package/dist/tests/hook-smoke.test.d.ts +2 -0
  51. package/dist/tests/hook-smoke.test.d.ts.map +1 -0
  52. package/dist/tests/hook-smoke.test.js +58 -0
  53. package/dist/tests/hook-smoke.test.js.map +1 -0
  54. package/dist/tests/init.test.d.ts +2 -0
  55. package/dist/tests/init.test.d.ts.map +1 -0
  56. package/dist/tests/init.test.js +85 -0
  57. package/dist/tests/init.test.js.map +1 -0
  58. package/dist/tests/log.test.d.ts +2 -0
  59. package/dist/tests/log.test.d.ts.map +1 -0
  60. package/dist/tests/log.test.js +68 -0
  61. package/dist/tests/log.test.js.map +1 -0
  62. package/dist/tests/read-guard.test.d.ts +2 -0
  63. package/dist/tests/read-guard.test.d.ts.map +1 -0
  64. package/dist/tests/read-guard.test.js +69 -0
  65. package/dist/tests/read-guard.test.js.map +1 -0
  66. package/dist/tests/search-hook.test.d.ts +2 -0
  67. package/dist/tests/search-hook.test.d.ts.map +1 -0
  68. package/dist/tests/search-hook.test.js +108 -0
  69. package/dist/tests/search-hook.test.js.map +1 -0
  70. package/dist/tests/session-focus.test.d.ts +2 -0
  71. package/dist/tests/session-focus.test.d.ts.map +1 -0
  72. package/dist/tests/session-focus.test.js +71 -0
  73. package/dist/tests/session-focus.test.js.map +1 -0
  74. package/dist/tests/uninstall.test.d.ts +2 -0
  75. package/dist/tests/uninstall.test.d.ts.map +1 -0
  76. package/dist/tests/uninstall.test.js +98 -0
  77. package/dist/tests/uninstall.test.js.map +1 -0
  78. package/hooks/mindlore-read-guard.cjs +1 -1
  79. package/package.json +19 -7
  80. package/scripts/init.cjs +0 -448
  81. package/scripts/lib/constants.cjs +0 -49
  82. package/scripts/mindlore-fts5-index.cjs +0 -112
  83. package/scripts/mindlore-fts5-search.cjs +0 -119
  84. package/scripts/mindlore-health-check.cjs +0 -389
  85. package/scripts/uninstall.cjs +0 -186
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * mindlore-fts5-search — Search .mindlore/ knowledge base via FTS5.
5
+ *
6
+ * Usage: node dist/scripts/mindlore-fts5-search.js "query" [path-to-mindlore-dir]
7
+ *
8
+ * Returns top 3 results ranked by BM25 with file path and snippet.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const constants_js_1 = require("./lib/constants.js");
17
+ const { openDatabase } = require((0, constants_js_1.resolveHookCommon)(__dirname));
18
+ const MAX_RESULTS = 3;
19
+ // ── Helpers ────────────────────────────────────────────────────────────
20
+ function extractHeadings(content, maxHeadings) {
21
+ const lines = content.split('\n');
22
+ const headings = [];
23
+ for (const line of lines) {
24
+ if (line.startsWith('#')) {
25
+ headings.push(line.replace(/^#+\s*/, '').trim());
26
+ if (headings.length >= maxHeadings)
27
+ break;
28
+ }
29
+ }
30
+ return headings;
31
+ }
32
+ function main() {
33
+ const query = process.argv[2];
34
+ if (!query) {
35
+ console.error('Usage: node mindlore-fts5-search.js "query" [mindlore-dir]');
36
+ process.exit(1);
37
+ }
38
+ const baseDir = process.argv[3] ?? path_1.default.join(process.cwd(), '.mindlore');
39
+ const dbPath = path_1.default.join(baseDir, constants_js_1.DB_NAME);
40
+ if (!fs_1.default.existsSync(dbPath)) {
41
+ console.error(' Database not found. Run: npx mindlore init && npm run index');
42
+ process.exit(1);
43
+ }
44
+ const db = openDatabase(dbPath, { readonly: true });
45
+ if (!db) {
46
+ console.error(' better-sqlite3 not installed.');
47
+ process.exit(1);
48
+ }
49
+ try {
50
+ const sanitized = query.replace(/['"(){}[\]*:^~!]/g, ' ').trim();
51
+ if (!sanitized) {
52
+ console.log(' No valid search terms.');
53
+ process.exit(0);
54
+ }
55
+ const results = db
56
+ .prepare(`SELECT path, snippet(mindlore_fts, 1, '>>>', '<<<', '...', 40) as snippet,
57
+ rank
58
+ FROM mindlore_fts
59
+ WHERE mindlore_fts MATCH ?
60
+ ORDER BY rank
61
+ LIMIT ?`)
62
+ .all(sanitized, MAX_RESULTS);
63
+ if (results.length === 0) {
64
+ console.log(` No results for: "${query}"`);
65
+ process.exit(0);
66
+ }
67
+ console.log(`\n Mindlore Search: "${query}" (${results.length} results)\n`);
68
+ for (let i = 0; i < results.length; i++) {
69
+ const r = results[i];
70
+ if (!r)
71
+ continue;
72
+ const relativePath = path_1.default.relative(baseDir, r.path);
73
+ const fileName = path_1.default.basename(r.path, '.md');
74
+ let headings = [];
75
+ if (fs_1.default.existsSync(r.path)) {
76
+ const content = fs_1.default.readFileSync(r.path, 'utf8');
77
+ headings = extractHeadings(content, 2);
78
+ }
79
+ console.log(` ${i + 1}. ${relativePath}`);
80
+ if (headings.length > 0) {
81
+ console.log(` ${headings.join(' > ')}`);
82
+ }
83
+ console.log(` ${r.snippet || fileName}`);
84
+ console.log('');
85
+ }
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ if (message.includes('fts5')) {
90
+ const words = query.split(/\s+/).filter((w) => w.length >= 2);
91
+ if (words.length > 0) {
92
+ console.error(` Search syntax error. Try simpler terms: ${words.join(' ')}`);
93
+ }
94
+ else {
95
+ console.error(` Search error: ${message}`);
96
+ }
97
+ }
98
+ else {
99
+ console.error(` Error: ${message}`);
100
+ }
101
+ process.exit(1);
102
+ }
103
+ finally {
104
+ db.close();
105
+ }
106
+ }
107
+ main();
108
+ //# sourceMappingURL=mindlore-fts5-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-fts5-search.js","sourceRoot":"","sources":["../../scripts/mindlore-fts5-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mindlore-health-check — 18-point structural health check for .mindlore/
4
+ *
5
+ * Usage: node dist/scripts/mindlore-health-check.js [path-to-mindlore-dir]
6
+ *
7
+ * Exit codes: 0 = healthy, 1 = issues found
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=mindlore-health-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-health-check.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-health-check.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
@@ -0,0 +1,337 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * mindlore-health-check — 18-point structural health check for .mindlore/
5
+ *
6
+ * Usage: node dist/scripts/mindlore-health-check.js [path-to-mindlore-dir]
7
+ *
8
+ * Exit codes: 0 = healthy, 1 = issues found
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const constants_js_1 = require("./lib/constants.js");
17
+ const { parseFrontmatter: _parseFm, getAllMdFiles: _getAllMd, } = require((0, constants_js_1.resolveHookCommon)(__dirname));
18
+ function parseFrontmatter(content) {
19
+ const { meta } = _parseFm(content);
20
+ return Object.keys(meta).length > 0 ? meta : null;
21
+ }
22
+ function getAllMdFiles(dir) {
23
+ return _getAllMd(dir, new Set());
24
+ }
25
+ class HealthChecker {
26
+ baseDir;
27
+ results = [];
28
+ passed = 0;
29
+ failed = 0;
30
+ warnings = 0;
31
+ constructor(baseDir) {
32
+ this.baseDir = baseDir;
33
+ }
34
+ check(name, fn) {
35
+ try {
36
+ const result = fn();
37
+ if (result.ok) {
38
+ this.passed++;
39
+ this.results.push({ name, status: 'PASS', detail: result.detail });
40
+ }
41
+ else if (result.warn) {
42
+ this.warnings++;
43
+ this.results.push({ name, status: 'WARN', detail: result.detail });
44
+ }
45
+ else {
46
+ this.failed++;
47
+ this.results.push({ name, status: 'FAIL', detail: result.detail });
48
+ }
49
+ }
50
+ catch (err) {
51
+ this.failed++;
52
+ const message = err instanceof Error ? err.message : String(err);
53
+ this.results.push({ name, status: 'FAIL', detail: message });
54
+ }
55
+ }
56
+ checkDirectories() {
57
+ for (const dir of constants_js_1.DIRECTORIES) {
58
+ this.check(`Directory: ${dir}/`, () => {
59
+ const dirPath = path_1.default.join(this.baseDir, dir);
60
+ if (fs_1.default.existsSync(dirPath)) {
61
+ return { ok: true, detail: 'exists' };
62
+ }
63
+ return { ok: false, detail: 'missing' };
64
+ });
65
+ }
66
+ }
67
+ checkSchema() {
68
+ this.check('SCHEMA.md', () => {
69
+ const schemaPath = path_1.default.join(this.baseDir, 'SCHEMA.md');
70
+ if (!fs_1.default.existsSync(schemaPath)) {
71
+ return { ok: false, detail: 'missing' };
72
+ }
73
+ const content = fs_1.default.readFileSync(schemaPath, 'utf8');
74
+ if (content.length < 100) {
75
+ return { ok: false, detail: 'too short (corrupted?)' };
76
+ }
77
+ if (!content.includes('## 1. Identity')) {
78
+ return { warn: true, detail: 'may be outdated (missing Identity section)' };
79
+ }
80
+ return { ok: true, detail: `${content.split('\n').length} lines` };
81
+ });
82
+ }
83
+ checkIndex() {
84
+ this.check('INDEX.md format', () => {
85
+ const indexPath = path_1.default.join(this.baseDir, 'INDEX.md');
86
+ if (!fs_1.default.existsSync(indexPath)) {
87
+ return { ok: false, detail: 'missing' };
88
+ }
89
+ const content = fs_1.default.readFileSync(indexPath, 'utf8');
90
+ const lines = content.trim().split('\n');
91
+ if (lines.length > 60) {
92
+ return {
93
+ warn: true,
94
+ detail: `${lines.length} lines (should be ~15-60, consider trimming)`,
95
+ };
96
+ }
97
+ return { ok: true, detail: `${lines.length} lines` };
98
+ });
99
+ }
100
+ checkDatabase() {
101
+ this.check('mindlore.db FTS5', () => {
102
+ const dbPath = path_1.default.join(this.baseDir, constants_js_1.DB_NAME);
103
+ if (!fs_1.default.existsSync(dbPath)) {
104
+ return { ok: false, detail: 'database missing' };
105
+ }
106
+ let Database;
107
+ try {
108
+ Database = require('better-sqlite3');
109
+ }
110
+ catch (_err) {
111
+ return { warn: true, detail: 'better-sqlite3 not available, cannot verify' };
112
+ }
113
+ const db = new Database(dbPath, { readonly: true });
114
+ try {
115
+ const result = db.prepare('SELECT count(*) as cnt FROM mindlore_fts').get();
116
+ const hashResult = db
117
+ .prepare('SELECT count(*) as cnt FROM file_hashes')
118
+ .get();
119
+ let schemaVersion = 0;
120
+ try {
121
+ db.prepare('SELECT tags, quality FROM mindlore_fts LIMIT 0').run();
122
+ schemaVersion = 9;
123
+ }
124
+ catch (_err) {
125
+ try {
126
+ db.prepare('SELECT slug, description, category, title FROM mindlore_fts LIMIT 0').run();
127
+ schemaVersion = 7;
128
+ }
129
+ catch (_err2) {
130
+ schemaVersion = 2;
131
+ }
132
+ }
133
+ if (schemaVersion < 9) {
134
+ return {
135
+ warn: true,
136
+ detail: `${result.cnt} indexed, ${hashResult.cnt} hashes — ${schemaVersion}-col schema (run: npx mindlore init to upgrade to 9-col)`,
137
+ };
138
+ }
139
+ return {
140
+ ok: true,
141
+ detail: `${result.cnt} indexed, ${hashResult.cnt} hashes, 9-col schema`,
142
+ };
143
+ }
144
+ catch (err) {
145
+ const message = err instanceof Error ? err.message : String(err);
146
+ return { ok: false, detail: `FTS5 error: ${message}` };
147
+ }
148
+ finally {
149
+ db.close();
150
+ }
151
+ });
152
+ }
153
+ checkOrphans() {
154
+ this.check('Orphan files', () => {
155
+ const dbPath = path_1.default.join(this.baseDir, constants_js_1.DB_NAME);
156
+ if (!fs_1.default.existsSync(dbPath)) {
157
+ return { warn: true, detail: 'no database, cannot check' };
158
+ }
159
+ let Database;
160
+ try {
161
+ Database = require('better-sqlite3');
162
+ }
163
+ catch (_err) {
164
+ return { warn: true, detail: 'better-sqlite3 not available' };
165
+ }
166
+ const mdFiles = getAllMdFiles(this.baseDir).filter(constants_js_1.isContentFile);
167
+ const db = new Database(dbPath, { readonly: true });
168
+ try {
169
+ const indexed = new Set();
170
+ const rows = db.prepare('SELECT path FROM file_hashes').all();
171
+ for (const row of rows) {
172
+ indexed.add(path_1.default.resolve(row.path));
173
+ }
174
+ const orphans = mdFiles.filter((f) => !indexed.has(path_1.default.resolve(f)));
175
+ if (orphans.length === 0) {
176
+ return { ok: true, detail: 'no orphans' };
177
+ }
178
+ if (orphans.length <= 3) {
179
+ return {
180
+ warn: true,
181
+ detail: `${orphans.length} unindexed: ${orphans.map((f) => path_1.default.basename(f)).join(', ')}`,
182
+ };
183
+ }
184
+ return {
185
+ ok: false,
186
+ detail: `${orphans.length} unindexed files — run: npm run index`,
187
+ };
188
+ }
189
+ finally {
190
+ db.close();
191
+ }
192
+ });
193
+ }
194
+ checkFrontmatter() {
195
+ this.check('Frontmatter: slug + type', () => {
196
+ const mdFiles = getAllMdFiles(this.baseDir).filter(constants_js_1.isContentFile);
197
+ let missingSlug = 0;
198
+ let missingType = 0;
199
+ let wrongDir = 0;
200
+ for (const file of mdFiles) {
201
+ const content = fs_1.default.readFileSync(file, 'utf8').replace(/\r\n/g, '\n');
202
+ const fm = parseFrontmatter(content);
203
+ if (!fm) {
204
+ missingSlug++;
205
+ missingType++;
206
+ continue;
207
+ }
208
+ if (!fm.slug)
209
+ missingSlug++;
210
+ if (!fm.type) {
211
+ missingType++;
212
+ continue;
213
+ }
214
+ const expectedDir = constants_js_1.TYPE_TO_DIR[fm.type];
215
+ if (expectedDir) {
216
+ const parentDir = path_1.default.basename(path_1.default.dirname(file));
217
+ if (parentDir !== expectedDir) {
218
+ wrongDir++;
219
+ }
220
+ }
221
+ }
222
+ const issues = [];
223
+ if (missingSlug > 0)
224
+ issues.push(`${missingSlug} missing slug`);
225
+ if (missingType > 0)
226
+ issues.push(`${missingType} missing type`);
227
+ if (wrongDir > 0)
228
+ issues.push(`${wrongDir} type-dir mismatch`);
229
+ if (issues.length === 0) {
230
+ return {
231
+ ok: true,
232
+ detail: `${mdFiles.length} files validated`,
233
+ };
234
+ }
235
+ if (wrongDir > 0) {
236
+ return { ok: false, detail: issues.join(', ') };
237
+ }
238
+ return { warn: true, detail: issues.join(', ') };
239
+ });
240
+ }
241
+ checkStaleDeltas() {
242
+ this.check('Stale deltas', () => {
243
+ const diaryDir = path_1.default.join(this.baseDir, 'diary');
244
+ if (!fs_1.default.existsSync(diaryDir))
245
+ return { ok: true, detail: 'no diary dir' };
246
+ const now = Date.now();
247
+ const thirtyDays = 30 * 24 * 60 * 60 * 1000;
248
+ let stale = 0;
249
+ const files = fs_1.default.readdirSync(diaryDir).filter((f) => f.startsWith('delta-') && f.endsWith('.md'));
250
+ for (const file of files) {
251
+ const fullPath = path_1.default.join(diaryDir, file);
252
+ const content = fs_1.default.readFileSync(fullPath, 'utf8').replace(/\r\n/g, '\n');
253
+ const fm = parseFrontmatter(content);
254
+ if (fm && fm.archived === 'true')
255
+ continue;
256
+ const stat = fs_1.default.statSync(fullPath);
257
+ if (now - stat.mtimeMs > thirtyDays)
258
+ stale++;
259
+ }
260
+ if (stale === 0)
261
+ return { ok: true, detail: `${files.length} deltas, none stale` };
262
+ return { warn: true, detail: `${stale} deltas older than 30 days without archived flag — run /mindlore-log reflect` };
263
+ });
264
+ }
265
+ checkConflictingAnalyses() {
266
+ this.check('Conflicting analyses', () => {
267
+ const analysesDir = path_1.default.join(this.baseDir, 'analyses');
268
+ if (!fs_1.default.existsSync(analysesDir))
269
+ return { ok: true, detail: 'no analyses dir' };
270
+ const files = fs_1.default.readdirSync(analysesDir).filter((f) => f.endsWith('.md'));
271
+ if (files.length < 2)
272
+ return { ok: true, detail: `${files.length} analyses, no conflict possible` };
273
+ const tagMap = {};
274
+ for (const file of files) {
275
+ const content = fs_1.default.readFileSync(path_1.default.join(analysesDir, file), 'utf8').replace(/\r\n/g, '\n');
276
+ const fm = parseFrontmatter(content);
277
+ if (!fm?.tags || !fm.confidence)
278
+ continue;
279
+ const tags = Array.isArray(fm.tags) ? fm.tags : String(fm.tags).split(',').map((t) => t.trim());
280
+ for (const tag of tags) {
281
+ if (!tagMap[tag])
282
+ tagMap[tag] = [];
283
+ const entries = tagMap[tag];
284
+ if (entries)
285
+ entries.push({ file, confidence: String(fm.confidence) });
286
+ }
287
+ }
288
+ const conflicts = [];
289
+ for (const [tag, entries] of Object.entries(tagMap)) {
290
+ if (!entries || entries.length < 2)
291
+ continue;
292
+ const confidences = new Set(entries.map((e) => e.confidence));
293
+ if (confidences.size > 1) {
294
+ conflicts.push(`${tag}: ${entries.map((e) => `${e.file}(${e.confidence})`).join(' vs ')}`);
295
+ }
296
+ }
297
+ if (conflicts.length === 0)
298
+ return { ok: true, detail: `${files.length} analyses, no conflicts` };
299
+ return { warn: true, detail: `${conflicts.length} tag conflicts: ${conflicts.slice(0, 2).join('; ')}` };
300
+ });
301
+ }
302
+ run() {
303
+ this.checkDirectories();
304
+ this.checkSchema();
305
+ this.checkIndex();
306
+ this.checkDatabase();
307
+ this.checkOrphans();
308
+ this.checkFrontmatter();
309
+ this.checkStaleDeltas();
310
+ this.checkConflictingAnalyses();
311
+ return this;
312
+ }
313
+ report() {
314
+ console.log('\n Mindlore Health Check\n');
315
+ for (const r of this.results) {
316
+ const icon = r.status === 'PASS' ? '+' : r.status === 'WARN' ? '~' : '-';
317
+ console.log(` [${icon}] ${r.name}: ${r.detail}`);
318
+ }
319
+ const total = this.passed + this.failed + this.warnings;
320
+ console.log(`\n Score: ${this.passed}/${total} passed, ${this.warnings} warnings, ${this.failed} failed\n`);
321
+ return this.failed === 0;
322
+ }
323
+ }
324
+ // ── Main ───────────────────────────────────────────────────────────────
325
+ function main() {
326
+ const baseDir = process.argv[2] ?? path_1.default.join(process.cwd(), '.mindlore');
327
+ if (!fs_1.default.existsSync(baseDir)) {
328
+ console.error(` .mindlore/ not found at: ${baseDir}`);
329
+ console.error(' Run: npx mindlore init');
330
+ process.exit(1);
331
+ }
332
+ const checker = new HealthChecker(baseDir);
333
+ const healthy = checker.run().report();
334
+ process.exit(healthy ? 0 : 1);
335
+ }
336
+ main();
337
+ //# sourceMappingURL=mindlore-health-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-health-check.js","sourceRoot":"","sources":["../../scripts/mindlore-health-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mindlore uninstall — Remove Mindlore hooks, skills, and optionally project data.
4
+ *
5
+ * Usage: npx mindlore uninstall [--all]
6
+ *
7
+ * --all: also remove .mindlore/ project data (without flag, only hooks + skills)
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../scripts/uninstall.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * mindlore uninstall — Remove Mindlore hooks, skills, and optionally project data.
5
+ *
6
+ * Usage: npx mindlore uninstall [--all]
7
+ *
8
+ * --all: also remove .mindlore/ project data (without flag, only hooks + skills)
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const constants_js_1 = require("./lib/constants.js");
17
+ function log(msg) {
18
+ console.log(` ${msg}`);
19
+ }
20
+ // ── Remove hooks from settings.json ────────────────────────────────────
21
+ function removeHooks() {
22
+ const settingsPath = path_1.default.join((0, constants_js_1.homedir)(), '.claude', 'settings.json');
23
+ if (!fs_1.default.existsSync(settingsPath)) {
24
+ log('No settings.json found, skipping hooks');
25
+ return 0;
26
+ }
27
+ let settings;
28
+ try {
29
+ settings = JSON.parse(fs_1.default.readFileSync(settingsPath, 'utf8'));
30
+ }
31
+ catch (_err) {
32
+ log('Could not parse settings.json, skipping hooks');
33
+ return 0;
34
+ }
35
+ if (!settings.hooks)
36
+ return 0;
37
+ let removed = 0;
38
+ for (const event of Object.keys(settings.hooks)) {
39
+ const entries = settings.hooks[event];
40
+ if (!Array.isArray(entries))
41
+ continue;
42
+ const filtered = entries.filter((entry) => {
43
+ const hooks = entry.hooks ?? [];
44
+ const hasMindlore = hooks.some((h) => (h.command ?? '').includes('mindlore-'));
45
+ const flatMindlore = (entry.command ?? '').includes('mindlore-');
46
+ if (hasMindlore || flatMindlore) {
47
+ removed++;
48
+ return false;
49
+ }
50
+ return true;
51
+ });
52
+ settings.hooks[event] = filtered;
53
+ if (settings.hooks[event].length === 0) {
54
+ delete settings.hooks[event];
55
+ }
56
+ }
57
+ if (removed > 0) {
58
+ fs_1.default.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
59
+ }
60
+ return removed;
61
+ }
62
+ // ── Remove skills from ~/.claude/skills/ ───────────────────────────────
63
+ function removeSkills() {
64
+ const skillsDir = path_1.default.join((0, constants_js_1.homedir)(), '.claude', 'skills');
65
+ if (!fs_1.default.existsSync(skillsDir))
66
+ return 0;
67
+ const mindloreSkills = fs_1.default
68
+ .readdirSync(skillsDir)
69
+ .filter((d) => d.startsWith('mindlore-'));
70
+ let removed = 0;
71
+ for (const skill of mindloreSkills) {
72
+ const skillPath = path_1.default.join(skillsDir, skill);
73
+ fs_1.default.rmSync(skillPath, { recursive: true, force: true });
74
+ removed++;
75
+ }
76
+ return removed;
77
+ }
78
+ // ── Remove SCHEMA.md from projectDocFiles ──────────────────────────────
79
+ function removeFromProjectDocs() {
80
+ const projectSettingsPath = path_1.default.join(process.cwd(), '.claude', 'settings.json');
81
+ if (!fs_1.default.existsSync(projectSettingsPath))
82
+ return false;
83
+ let settings;
84
+ try {
85
+ settings = JSON.parse(fs_1.default.readFileSync(projectSettingsPath, 'utf8'));
86
+ }
87
+ catch (_err) {
88
+ return false;
89
+ }
90
+ if (!settings.projectDocFiles)
91
+ return false;
92
+ const before = settings.projectDocFiles.length;
93
+ settings.projectDocFiles = settings.projectDocFiles.filter((p) => !p.includes('mindlore'));
94
+ if (settings.projectDocFiles.length < before) {
95
+ fs_1.default.writeFileSync(projectSettingsPath, JSON.stringify(settings, null, 2), 'utf8');
96
+ return true;
97
+ }
98
+ return false;
99
+ }
100
+ // ── Remove .mindlore/ project data ─────────────────────────────────────
101
+ function removeProjectData() {
102
+ const mindloreDir = path_1.default.join(process.cwd(), '.mindlore');
103
+ if (!fs_1.default.existsSync(mindloreDir)) {
104
+ log('No .mindlore/ directory in current project');
105
+ return false;
106
+ }
107
+ fs_1.default.rmSync(mindloreDir, { recursive: true, force: true });
108
+ return true;
109
+ }
110
+ // ── Main ───────────────────────────────────────────────────────────────
111
+ function main() {
112
+ const args = process.argv.slice(2);
113
+ const removeAll = args.includes('--all');
114
+ console.log('\n Mindlore — Uninstall\n');
115
+ // Hooks
116
+ const hooksRemoved = removeHooks();
117
+ log(hooksRemoved > 0
118
+ ? `Removed ${hooksRemoved} hooks from ~/.claude/settings.json`
119
+ : 'No hooks found');
120
+ // Skills
121
+ const skillsRemoved = removeSkills();
122
+ log(skillsRemoved > 0
123
+ ? `Removed ${skillsRemoved} skills from ~/.claude/skills/`
124
+ : 'No skills found');
125
+ // Project doc files
126
+ const docsRemoved = removeFromProjectDocs();
127
+ log(docsRemoved
128
+ ? 'Removed SCHEMA.md from project settings'
129
+ : 'No project doc references found');
130
+ // Project data (only with --all)
131
+ if (removeAll) {
132
+ const dataRemoved = removeProjectData();
133
+ log(dataRemoved
134
+ ? 'Removed .mindlore/ project data'
135
+ : 'No .mindlore/ directory found');
136
+ }
137
+ else {
138
+ log('.mindlore/ project data kept (use --all to remove)');
139
+ }
140
+ console.log('\n Done! Mindlore has been uninstalled.\n');
141
+ }
142
+ main();
143
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../scripts/uninstall.ts"],"names":[],"mappings":"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"}