mindlore 0.1.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 (98) hide show
  1. package/README.md +13 -5
  2. package/SCHEMA.md +60 -4
  3. package/dist/scripts/init.d.ts +10 -0
  4. package/dist/scripts/init.d.ts.map +1 -0
  5. package/dist/scripts/init.js +375 -0
  6. package/dist/scripts/init.js.map +1 -0
  7. package/dist/scripts/lib/constants.d.ts +29 -0
  8. package/dist/scripts/lib/constants.d.ts.map +1 -0
  9. package/dist/scripts/lib/constants.js +58 -0
  10. package/dist/scripts/lib/constants.js.map +1 -0
  11. package/dist/scripts/mindlore-fts5-index.d.ts +9 -0
  12. package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -0
  13. package/dist/scripts/mindlore-fts5-index.js +89 -0
  14. package/dist/scripts/mindlore-fts5-index.js.map +1 -0
  15. package/dist/scripts/mindlore-fts5-search.d.ts +10 -0
  16. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -0
  17. package/dist/scripts/mindlore-fts5-search.js +108 -0
  18. package/dist/scripts/mindlore-fts5-search.js.map +1 -0
  19. package/dist/scripts/mindlore-health-check.d.ts +10 -0
  20. package/dist/scripts/mindlore-health-check.d.ts.map +1 -0
  21. package/dist/scripts/mindlore-health-check.js +337 -0
  22. package/dist/scripts/mindlore-health-check.js.map +1 -0
  23. package/dist/scripts/uninstall.d.ts +10 -0
  24. package/dist/scripts/uninstall.d.ts.map +1 -0
  25. package/dist/scripts/uninstall.js +143 -0
  26. package/dist/scripts/uninstall.js.map +1 -0
  27. package/dist/tests/compounding.test.d.ts +8 -0
  28. package/dist/tests/compounding.test.d.ts.map +1 -0
  29. package/dist/tests/compounding.test.js +51 -0
  30. package/dist/tests/compounding.test.js.map +1 -0
  31. package/dist/tests/decision.test.d.ts +2 -0
  32. package/dist/tests/decision.test.d.ts.map +1 -0
  33. package/dist/tests/decision.test.js +61 -0
  34. package/dist/tests/decision.test.js.map +1 -0
  35. package/dist/tests/dedup.test.d.ts +2 -0
  36. package/dist/tests/dedup.test.d.ts.map +1 -0
  37. package/dist/tests/dedup.test.js +74 -0
  38. package/dist/tests/dedup.test.js.map +1 -0
  39. package/dist/tests/frontmatter.test.d.ts +2 -0
  40. package/dist/tests/frontmatter.test.d.ts.map +1 -0
  41. package/dist/tests/frontmatter.test.js +90 -0
  42. package/dist/tests/frontmatter.test.js.map +1 -0
  43. package/dist/tests/fts5.test.d.ts +2 -0
  44. package/dist/tests/fts5.test.d.ts.map +1 -0
  45. package/dist/tests/fts5.test.js +95 -0
  46. package/dist/tests/fts5.test.js.map +1 -0
  47. package/dist/tests/helpers/db.d.ts +7 -0
  48. package/dist/tests/helpers/db.d.ts.map +1 -0
  49. package/dist/tests/helpers/db.js +46 -0
  50. package/dist/tests/helpers/db.js.map +1 -0
  51. package/dist/tests/hook-smoke.test.d.ts +2 -0
  52. package/dist/tests/hook-smoke.test.d.ts.map +1 -0
  53. package/dist/tests/hook-smoke.test.js +58 -0
  54. package/dist/tests/hook-smoke.test.js.map +1 -0
  55. package/dist/tests/init.test.d.ts +2 -0
  56. package/dist/tests/init.test.d.ts.map +1 -0
  57. package/dist/tests/init.test.js +85 -0
  58. package/dist/tests/init.test.js.map +1 -0
  59. package/dist/tests/log.test.d.ts +2 -0
  60. package/dist/tests/log.test.d.ts.map +1 -0
  61. package/dist/tests/log.test.js +68 -0
  62. package/dist/tests/log.test.js.map +1 -0
  63. package/dist/tests/read-guard.test.d.ts +2 -0
  64. package/dist/tests/read-guard.test.d.ts.map +1 -0
  65. package/dist/tests/read-guard.test.js +69 -0
  66. package/dist/tests/read-guard.test.js.map +1 -0
  67. package/dist/tests/search-hook.test.d.ts +2 -0
  68. package/dist/tests/search-hook.test.d.ts.map +1 -0
  69. package/dist/tests/search-hook.test.js +108 -0
  70. package/dist/tests/search-hook.test.js.map +1 -0
  71. package/dist/tests/session-focus.test.d.ts +2 -0
  72. package/dist/tests/session-focus.test.d.ts.map +1 -0
  73. package/dist/tests/session-focus.test.js +71 -0
  74. package/dist/tests/session-focus.test.js.map +1 -0
  75. package/dist/tests/uninstall.test.d.ts +2 -0
  76. package/dist/tests/uninstall.test.d.ts.map +1 -0
  77. package/dist/tests/uninstall.test.js +98 -0
  78. package/dist/tests/uninstall.test.js.map +1 -0
  79. package/hooks/lib/mindlore-common.cjs +36 -2
  80. package/hooks/mindlore-decision-detector.cjs +51 -0
  81. package/hooks/mindlore-fts5-sync.cjs +4 -18
  82. package/hooks/mindlore-index.cjs +4 -18
  83. package/hooks/mindlore-read-guard.cjs +62 -0
  84. package/hooks/mindlore-search.cjs +5 -18
  85. package/hooks/mindlore-session-end.cjs +74 -8
  86. package/package.json +19 -7
  87. package/plugin.json +26 -2
  88. package/skills/mindlore-decide/SKILL.md +71 -0
  89. package/skills/mindlore-ingest/SKILL.md +13 -2
  90. package/skills/mindlore-log/SKILL.md +79 -0
  91. package/skills/mindlore-query/SKILL.md +125 -0
  92. package/templates/SCHEMA.md +60 -4
  93. package/scripts/init.cjs +0 -450
  94. package/scripts/lib/constants.cjs +0 -49
  95. package/scripts/mindlore-fts5-index.cjs +0 -112
  96. package/scripts/mindlore-fts5-search.cjs +0 -119
  97. package/scripts/mindlore-health-check.cjs +0 -336
  98. package/scripts/uninstall.cjs +0 -186
package/README.md CHANGED
@@ -1,6 +1,12 @@
1
1
  # Mindlore
2
2
 
3
- AI-native knowledge system for [Claude Code](https://claude.ai/claude-code).
3
+ ![CI](https://github.com/mindlore/mindlore/actions/workflows/ci.yml/badge.svg)
4
+ [![npm](https://img.shields.io/npm/v/mindlore)](https://www.npmjs.com/package/mindlore)
5
+ ![Node](https://img.shields.io/node/v/mindlore)
6
+ ![License](https://img.shields.io/badge/license-MIT-blue)
7
+ ![Zero Telemetry](https://img.shields.io/badge/telemetry-zero-brightgreen)
8
+
9
+ > AI-native knowledge system for [Claude Code](https://claude.ai/claude-code)
4
10
 
5
11
  Persistent, searchable, evolving knowledge base that compounds across sessions.
6
12
 
@@ -44,7 +50,7 @@ To add your first source:
44
50
  | Skill | Version | Description |
45
51
  |-------|---------|-------------|
46
52
  | `/mindlore-ingest` | v0.1 | Add knowledge sources (URL, text, file, PDF) |
47
- | `/mindlore-health` | v0.1 | 16-point structural health check |
53
+ | `/mindlore-health` | v0.1 | 18-point structural health check |
48
54
  | `/mindlore-query` | v0.2 | Search and retrieve knowledge (4 modes) |
49
55
  | `/mindlore-log` | v0.2 | Session logging with reflect and status |
50
56
  | `/mindlore-decide` | v0.2 | Decision records with supersedes chain |
@@ -147,17 +153,19 @@ SESSION START DURING SESSION SESSIO
147
153
 
148
154
  ## Hooks
149
155
 
150
- 7 Claude Code lifecycle hooks (v0.1):
156
+ 9 Claude Code lifecycle hooks (v0.2):
151
157
 
152
158
  | Event | Hook | What it does |
153
159
  |-------|------|-------------|
154
160
  | SessionStart | session-focus | Injects last delta + INDEX |
155
- | UserPromptSubmit | search | FTS5 search, top 3 results |
161
+ | UserPromptSubmit | search | FTS5 search, top 3 results + tags |
162
+ | UserPromptSubmit | decision-detector | TR+EN decision signal detection |
156
163
  | FileChanged | index | Sync changed files to FTS5 |
157
164
  | FileChanged | fts5-sync | Incremental batch re-index |
158
- | SessionEnd | session-end | Write delta to diary/ |
165
+ | SessionEnd | session-end | Structured delta (commits, files, reads) |
159
166
  | PreCompact | pre-compact | FTS5 flush before compaction |
160
167
  | PostCompact | post-compact | Re-inject context |
168
+ | PreToolUse (Read) | read-guard | Repeated-read warning |
161
169
 
162
170
  ## Uninstall
163
171
 
package/SCHEMA.md CHANGED
@@ -143,14 +143,70 @@ Discover unexpected connections between sources. Cross-reference analysis.
143
143
  - Max results: 3 per query (BM25 ranking)
144
144
  - Hook injects: file path + first 2 headings
145
145
 
146
+ ### FTS5 Columns (9-col schema, v0.2)
147
+
148
+ | Column | Indexed | Source |
149
+ |--------|---------|--------|
150
+ | `path` | UNINDEXED | File system path |
151
+ | `slug` | Yes | Frontmatter slug |
152
+ | `description` | Yes | Frontmatter description |
153
+ | `type` | UNINDEXED | Frontmatter type |
154
+ | `category` | Yes | Parent directory name |
155
+ | `title` | Yes | Frontmatter title or first heading |
156
+ | `content` | Yes | Markdown body (sans frontmatter) |
157
+ | `tags` | Yes | Frontmatter tags (comma-separated) |
158
+ | `quality` | UNINDEXED | Frontmatter quality (NULL until 50+ sources) |
159
+
146
160
  ### Search Flow (UserPromptSubmit hook)
147
161
 
148
162
  1. Extract keywords from user prompt
149
163
  2. Query FTS5 with BM25 ranking
150
- 3. Return max 3 results as stderr additionalContext
164
+ 3. Return max 3 results as stdout additionalContext
151
165
  4. Agent reads full file only if needed (progressive disclosure)
152
166
 
153
- ## 6. Compounding
167
+ ## 6. Wiki vs Diary (Writeback Target Rules)
168
+
169
+ Knowledge goes to one of two layers. The agent MUST pick the correct one.
170
+
171
+ ### Wiki Layer (permanent knowledge)
172
+
173
+ Directories: `sources/`, `domains/`, `analyses/`, `insights/`, `connections/`, `learnings/`
174
+
175
+ - Persists across sessions — reference value
176
+ - Indexed by FTS5, discoverable via search hook
177
+ - Updated by ingest, query writeback, reflect, evolve
178
+ - Content should be factual, sourced, and reusable
179
+
180
+ ### Diary Layer (session-scoped logs)
181
+
182
+ Directories: `diary/`, `decisions/`
183
+
184
+ - Session-specific: deltas, logs, decision snapshots
185
+ - diary/ entries get `archived: true` after reflect processes them
186
+ - decisions/ are permanent but session-originated (context + rationale)
187
+ - Patterns extracted from diary → moved to `learnings/` (wiki layer)
188
+
189
+ ### Selection Rule
190
+
191
+ | Content Type | Target | Example |
192
+ |-------------|--------|---------|
193
+ | Ingested source summary | `sources/` | URL or text summary |
194
+ | Topic wiki page | `domains/` | Consolidated knowledge on a subject |
195
+ | Multi-source synthesis | `analyses/` | Comparison table, architecture decision |
196
+ | Short Q&A answer | `insights/` | Query writeback (<200 lines) |
197
+ | Cross-reference finding | `connections/` | Link between 2+ unrelated sources |
198
+ | Persistent rule/lesson | `learnings/` | YAPMA/BEST PRACTICE from reflect |
199
+ | Session log/delta | `diary/` | What happened this session |
200
+ | Decision record | `decisions/` | Why X was chosen over Y |
201
+ | Raw capture | `raw/` | Immutable original (URL dump, paste) |
202
+
203
+ ### Anti-patterns
204
+
205
+ - Do NOT write session-specific notes to `insights/` — use `diary/`
206
+ - Do NOT write permanent rules to `diary/` — use `learnings/`
207
+ - Do NOT write decision rationale to `analyses/` — use `decisions/`
208
+
209
+ ## 7. Compounding
154
210
 
155
211
  Knowledge compounds when outputs become inputs:
156
212
 
@@ -173,7 +229,7 @@ Offer to save when:
173
229
  - Large synthesis (200+ lines, 3+ sources) → analyses/
174
230
  - Cross-cutting link → connections/
175
231
 
176
- ## 7. Learnings
232
+ ## 8. Learnings
177
233
 
178
234
  Persistent rules extracted from reflect operations.
179
235
  Organized by topic: `git.md`, `testing.md`, `security.md`, etc.
@@ -201,7 +257,7 @@ tags: [testing, jest, mock]
201
257
  - Use `YAPMA:` / `BEST PRACTICE:` / `KRITIK:` prefixes
202
258
  - Reflect skill proposes, user approves before writing
203
259
 
204
- ## 8. Naming Conventions
260
+ ## 9. Naming Conventions
205
261
 
206
262
  ### Files
207
263
 
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mindlore init — Initialize .mindlore/ knowledge base in current project.
4
+ *
5
+ * Usage: npx mindlore init [--recommended]
6
+ *
7
+ * Idempotent: running again does not destroy existing data.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../scripts/init.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * mindlore init — Initialize .mindlore/ knowledge base in current project.
5
+ *
6
+ * Usage: npx mindlore init [--recommended]
7
+ *
8
+ * Idempotent: running again does not destroy existing data.
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 { SQL_FTS_CREATE } = require((0, constants_js_1.resolveHookCommon)(__dirname));
18
+ const TEMPLATE_FILES = ['INDEX.md', 'log.md'];
19
+ // ── Helpers ────────────────────────────────────────────────────────────
20
+ function log(msg) {
21
+ console.log(` ${msg}`);
22
+ }
23
+ function resolvePackageRoot() {
24
+ // When compiled to dist/scripts/, go up two levels to reach package root
25
+ // When running as .ts (ts-jest), go up one level
26
+ const candidate = path_1.default.resolve(__dirname, '..');
27
+ if (fs_1.default.existsSync(path_1.default.join(candidate, 'package.json'))) {
28
+ return candidate;
29
+ }
30
+ return path_1.default.resolve(__dirname, '..', '..');
31
+ }
32
+ function ensureDir(dirPath) {
33
+ if (!fs_1.default.existsSync(dirPath)) {
34
+ fs_1.default.mkdirSync(dirPath, { recursive: true });
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ // ── Step 1: Create .mindlore/ directories ──────────────────────────────
40
+ function createDirectories(baseDir) {
41
+ let created = 0;
42
+ for (const dir of constants_js_1.DIRECTORIES) {
43
+ if (ensureDir(path_1.default.join(baseDir, dir))) {
44
+ created++;
45
+ }
46
+ }
47
+ return created;
48
+ }
49
+ // ── Step 2: Copy template files ────────────────────────────────────────
50
+ function copyTemplates(baseDir, packageRoot) {
51
+ const templatesDir = path_1.default.join(packageRoot, 'templates');
52
+ let copied = 0;
53
+ for (const file of TEMPLATE_FILES) {
54
+ const dest = path_1.default.join(baseDir, file);
55
+ if (!fs_1.default.existsSync(dest)) {
56
+ const src = path_1.default.join(templatesDir, file);
57
+ if (fs_1.default.existsSync(src)) {
58
+ fs_1.default.copyFileSync(src, dest);
59
+ copied++;
60
+ }
61
+ else {
62
+ log(`WARNING: template not found: ${src}`);
63
+ }
64
+ }
65
+ }
66
+ // Copy SCHEMA.md
67
+ const schemaSrc = path_1.default.join(packageRoot, 'SCHEMA.md');
68
+ const schemaDest = path_1.default.join(baseDir, 'SCHEMA.md');
69
+ if (!fs_1.default.existsSync(schemaDest)) {
70
+ if (fs_1.default.existsSync(schemaSrc)) {
71
+ fs_1.default.copyFileSync(schemaSrc, schemaDest);
72
+ copied++;
73
+ }
74
+ }
75
+ return copied;
76
+ }
77
+ function migrateDatabase(dbPath, DatabaseCtor) {
78
+ const db = new DatabaseCtor(dbPath);
79
+ try {
80
+ const info = db.pragma('table_info(mindlore_fts)');
81
+ const columns = info.map((r) => r.name);
82
+ if (!columns.includes('slug') || !columns.includes('description')) {
83
+ log('Upgrading FTS5 schema (2 → 9 columns, porter stemmer)...');
84
+ db.exec('DROP TABLE IF EXISTS mindlore_fts');
85
+ db.exec(SQL_FTS_CREATE);
86
+ db.exec('DELETE FROM file_hashes');
87
+ db.close();
88
+ return true;
89
+ }
90
+ else if (!columns.includes('tags')) {
91
+ log('Upgrading FTS5 schema (7 → 9 columns, +tags +quality)...');
92
+ db.exec('DROP TABLE IF EXISTS mindlore_fts');
93
+ db.exec(SQL_FTS_CREATE);
94
+ db.exec('DELETE FROM file_hashes');
95
+ db.close();
96
+ return true;
97
+ }
98
+ }
99
+ catch (_err) {
100
+ db.exec('DROP TABLE IF EXISTS mindlore_fts');
101
+ db.exec(SQL_FTS_CREATE);
102
+ db.exec('DELETE FROM file_hashes');
103
+ db.close();
104
+ return true;
105
+ }
106
+ db.close();
107
+ return false;
108
+ }
109
+ function createDatabase(baseDir) {
110
+ const dbPath = path_1.default.join(baseDir, constants_js_1.DB_NAME);
111
+ if (fs_1.default.existsSync(dbPath)) {
112
+ let DatabaseCtor;
113
+ try {
114
+ DatabaseCtor = require('better-sqlite3');
115
+ }
116
+ catch (_err) {
117
+ return false;
118
+ }
119
+ const migrated = migrateDatabase(dbPath, DatabaseCtor);
120
+ if (migrated) {
121
+ log('FTS5 schema upgraded — run index to rebuild');
122
+ }
123
+ else {
124
+ log('Database already exists, schema OK');
125
+ }
126
+ return migrated;
127
+ }
128
+ let DatabaseCtor;
129
+ try {
130
+ DatabaseCtor = require('better-sqlite3');
131
+ }
132
+ catch (_err) {
133
+ log('WARNING: better-sqlite3 not installed. Run: npm install better-sqlite3');
134
+ log('Database creation skipped — run mindlore init again after installing.');
135
+ return false;
136
+ }
137
+ const db = new DatabaseCtor(dbPath);
138
+ db.pragma('journal_mode = WAL');
139
+ db.exec(SQL_FTS_CREATE);
140
+ db.exec(`
141
+ CREATE TABLE IF NOT EXISTS file_hashes (
142
+ path TEXT PRIMARY KEY,
143
+ content_hash TEXT NOT NULL,
144
+ last_indexed TEXT NOT NULL
145
+ );
146
+ `);
147
+ db.close();
148
+ return true;
149
+ }
150
+ // ── Step 4: Merge hooks into settings.json ─────────────────────────────
151
+ function mergeHooks(packageRoot) {
152
+ const settingsPath = path_1.default.join((0, constants_js_1.homedir)(), '.claude', 'settings.json');
153
+ if (!fs_1.default.existsSync(settingsPath)) {
154
+ log('WARNING: ~/.claude/settings.json not found. Hooks not registered.');
155
+ log('Create it manually or install Claude Code first.');
156
+ return false;
157
+ }
158
+ let settings;
159
+ try {
160
+ const raw = fs_1.default.readFileSync(settingsPath, 'utf8');
161
+ settings = JSON.parse(raw);
162
+ }
163
+ catch (_err) {
164
+ log('WARNING: Could not parse settings.json. Hooks not registered.');
165
+ return false;
166
+ }
167
+ const pluginPath = path_1.default.join(packageRoot, 'plugin.json');
168
+ if (!fs_1.default.existsSync(pluginPath)) {
169
+ log('WARNING: plugin.json not found. Hooks not registered.');
170
+ return false;
171
+ }
172
+ const plugin = JSON.parse(fs_1.default.readFileSync(pluginPath, 'utf8'));
173
+ if (!plugin.hooks || plugin.hooks.length === 0) {
174
+ return false;
175
+ }
176
+ if (!settings.hooks) {
177
+ settings.hooks = {};
178
+ }
179
+ let added = 0;
180
+ for (const hook of plugin.hooks) {
181
+ const event = hook.event;
182
+ if (!settings.hooks[event]) {
183
+ settings.hooks[event] = [];
184
+ }
185
+ const hookScript = path_1.default.join(packageRoot, hook.script);
186
+ const hookName = path_1.default.basename(hook.script, '.cjs');
187
+ const exists = settings.hooks[event].some((entry) => {
188
+ if (entry.hooks && Array.isArray(entry.hooks)) {
189
+ return entry.hooks.some((h) => (h.command ?? '').includes(hookName));
190
+ }
191
+ return (entry.command ?? '').includes(hookName);
192
+ });
193
+ if (!exists) {
194
+ settings.hooks[event].push({
195
+ hooks: [
196
+ {
197
+ type: 'command',
198
+ command: `node "${hookScript}"`,
199
+ },
200
+ ],
201
+ });
202
+ added++;
203
+ }
204
+ }
205
+ if (added > 0) {
206
+ const backupPath = settingsPath + '.mindlore-backup';
207
+ if (!fs_1.default.existsSync(backupPath)) {
208
+ fs_1.default.copyFileSync(settingsPath, backupPath);
209
+ }
210
+ fs_1.default.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
211
+ }
212
+ return added;
213
+ }
214
+ // ── Step 5: Add SCHEMA.md to projectDocFiles ───────────────────────────
215
+ function addSchemaToProjectDocs() {
216
+ const projectSettingsDir = path_1.default.join(process.cwd(), '.claude');
217
+ const projectSettingsPath = path_1.default.join(projectSettingsDir, 'settings.json');
218
+ let settings = {};
219
+ if (fs_1.default.existsSync(projectSettingsPath)) {
220
+ try {
221
+ settings = JSON.parse(fs_1.default.readFileSync(projectSettingsPath, 'utf8'));
222
+ }
223
+ catch (_err) {
224
+ settings = {};
225
+ }
226
+ }
227
+ else {
228
+ ensureDir(projectSettingsDir);
229
+ }
230
+ if (!settings.projectDocFiles) {
231
+ settings.projectDocFiles = [];
232
+ }
233
+ const schemaPath = path_1.default.join(constants_js_1.MINDLORE_DIR, 'SCHEMA.md');
234
+ if (!settings.projectDocFiles.includes(schemaPath)) {
235
+ settings.projectDocFiles.push(schemaPath);
236
+ fs_1.default.writeFileSync(projectSettingsPath, JSON.stringify(settings, null, 2), 'utf8');
237
+ return true;
238
+ }
239
+ return false;
240
+ }
241
+ // ── Step 6: Register skills ────────────────────────────────────────────
242
+ function registerSkills(packageRoot, plugin) {
243
+ const skillsDir = path_1.default.join((0, constants_js_1.homedir)(), '.claude', 'skills');
244
+ ensureDir(skillsDir);
245
+ if (!plugin.skills || plugin.skills.length === 0)
246
+ return 0;
247
+ let added = 0;
248
+ for (const skill of plugin.skills) {
249
+ const skillSrcDir = path_1.default.join(packageRoot, path_1.default.dirname(skill.path));
250
+ const skillDestDir = path_1.default.join(skillsDir, skill.name);
251
+ ensureDir(skillDestDir);
252
+ const entries = fs_1.default.readdirSync(skillSrcDir, { withFileTypes: true });
253
+ for (const entry of entries) {
254
+ if (!entry.isFile())
255
+ continue;
256
+ fs_1.default.copyFileSync(path_1.default.join(skillSrcDir, entry.name), path_1.default.join(skillDestDir, entry.name));
257
+ }
258
+ added++;
259
+ }
260
+ return added;
261
+ }
262
+ // ── Step 7: Install better-sqlite3 if needed ──────────────────────────
263
+ function ensureBetterSqlite3() {
264
+ try {
265
+ require('better-sqlite3');
266
+ return true;
267
+ }
268
+ catch (_err) {
269
+ try {
270
+ const { execSync } = require('child_process');
271
+ log('Installing better-sqlite3 (native dependency)...');
272
+ execSync('npm install better-sqlite3 --no-save', {
273
+ cwd: process.cwd(),
274
+ stdio: 'pipe',
275
+ timeout: 120000,
276
+ });
277
+ return true;
278
+ }
279
+ catch (_installErr) {
280
+ log('WARNING: Could not install better-sqlite3. FTS5 search disabled.');
281
+ log(' Run manually: npm install better-sqlite3');
282
+ return false;
283
+ }
284
+ }
285
+ }
286
+ // ── Step 8: Add .mindlore/ to .gitignore ───────────────────────────────
287
+ function addToGitignore() {
288
+ const gitignorePath = path_1.default.join(process.cwd(), '.gitignore');
289
+ const entry = '.mindlore/';
290
+ if (fs_1.default.existsSync(gitignorePath)) {
291
+ const content = fs_1.default.readFileSync(gitignorePath, 'utf8');
292
+ if (content.includes(entry)) {
293
+ return false;
294
+ }
295
+ fs_1.default.appendFileSync(gitignorePath, `\n${entry}\n`, 'utf8');
296
+ }
297
+ else {
298
+ fs_1.default.writeFileSync(gitignorePath, `${entry}\n`, 'utf8');
299
+ }
300
+ return true;
301
+ }
302
+ // ── Main ───────────────────────────────────────────────────────────────
303
+ function main() {
304
+ const args = process.argv.slice(2);
305
+ const command = args[0];
306
+ if (command === 'uninstall') {
307
+ require('./uninstall.js');
308
+ return;
309
+ }
310
+ if (command && command !== 'init') {
311
+ console.log(`Unknown command: ${command}`);
312
+ console.log('Usage: npx mindlore init [--recommended]');
313
+ console.log(' npx mindlore uninstall [--all]');
314
+ process.exit(1);
315
+ }
316
+ const isRecommended = args.includes('--recommended');
317
+ const packageRoot = resolvePackageRoot();
318
+ const baseDir = path_1.default.join(process.cwd(), constants_js_1.MINDLORE_DIR);
319
+ console.log('\n Mindlore — AI-native knowledge system\n');
320
+ // Step 1: Directories
321
+ const dirsCreated = createDirectories(baseDir);
322
+ log(dirsCreated > 0
323
+ ? `Created ${dirsCreated} directories in ${constants_js_1.MINDLORE_DIR}/`
324
+ : 'All directories already exist');
325
+ // Step 2: Templates
326
+ const filesCopied = copyTemplates(baseDir, packageRoot);
327
+ log(filesCopied > 0
328
+ ? `Copied ${filesCopied} template files`
329
+ : 'All templates already in place');
330
+ // Step 3: better-sqlite3 (before DB creation so it's available)
331
+ ensureBetterSqlite3();
332
+ // Step 4: Database
333
+ const dbCreated = createDatabase(baseDir);
334
+ log(dbCreated ? 'Created FTS5 database' : 'Database already exists');
335
+ // Read plugin.json once for hooks + skills
336
+ const pluginPath = path_1.default.join(packageRoot, 'plugin.json');
337
+ const plugin = fs_1.default.existsSync(pluginPath)
338
+ ? JSON.parse(fs_1.default.readFileSync(pluginPath, 'utf8'))
339
+ : {};
340
+ // Step 5: Hooks
341
+ const hooksAdded = mergeHooks(packageRoot);
342
+ if (typeof hooksAdded === 'number' && hooksAdded > 0) {
343
+ log(`Registered ${hooksAdded} hooks in ~/.claude/settings.json`);
344
+ }
345
+ else {
346
+ log('Hooks already registered (or settings.json not found)');
347
+ }
348
+ // Step 6: SCHEMA.md in projectDocFiles
349
+ const schemaAdded = addSchemaToProjectDocs();
350
+ log(schemaAdded
351
+ ? 'Added SCHEMA.md to project settings'
352
+ : 'SCHEMA.md already in project settings');
353
+ // Step 7: Skills
354
+ const skillsAdded = registerSkills(packageRoot, plugin);
355
+ log(skillsAdded > 0
356
+ ? `Registered ${skillsAdded} skills in ~/.claude/skills/`
357
+ : 'Skills already registered');
358
+ // Step 8: .gitignore
359
+ const gitignoreAdded = addToGitignore();
360
+ log(gitignoreAdded
361
+ ? 'Added .mindlore/ to .gitignore'
362
+ : '.mindlore/ already in .gitignore');
363
+ // Recommended profile tips
364
+ if (isRecommended) {
365
+ console.log('\n Recommended setup:');
366
+ log('Install markitdown for better web/doc extraction:');
367
+ log(' pip install markitdown');
368
+ log('');
369
+ log('Install context-mode for token savings:');
370
+ log(' See: https://github.com/context-mode/context-mode');
371
+ }
372
+ console.log('\n Done! Start with: /mindlore-ingest\n');
373
+ }
374
+ main();
375
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../scripts/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare const MINDLORE_DIR = ".mindlore";
2
+ export declare const DB_NAME = "mindlore.db";
3
+ export declare const DIRECTORIES: readonly ["raw", "sources", "domains", "analyses", "insights", "connections", "learnings", "diary", "decisions"];
4
+ export declare const SKIP_FILES: Set<string>;
5
+ export declare const TYPE_TO_DIR: Record<string, string>;
6
+ export declare function homedir(): string;
7
+ export interface HookEntry {
8
+ hooks?: Array<{
9
+ type?: string;
10
+ command?: string;
11
+ }>;
12
+ command?: string;
13
+ }
14
+ export interface Settings {
15
+ hooks?: Record<string, HookEntry[]>;
16
+ projectDocFiles?: string[];
17
+ [key: string]: unknown;
18
+ }
19
+ /**
20
+ * Filter predicate: true if file is NOT a skip file (INDEX.md, SCHEMA.md, log.md).
21
+ */
22
+ export declare function isContentFile(filePath: string): boolean;
23
+ /**
24
+ * Resolve hook common module path — works from both src/ and dist/.
25
+ * From scripts/: ../hooks/lib/mindlore-common.cjs
26
+ * From dist/scripts/: ../../hooks/lib/mindlore-common.cjs
27
+ */
28
+ export declare function resolveHookCommon(callerDir: string): string;
29
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../scripts/lib/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,cAAc,CAAC;AACxC,eAAO,MAAM,OAAO,gBAAgB,CAAC;AAErC,eAAO,MAAM,WAAW,kHAUd,CAAC;AAEX,eAAO,MAAM,UAAU,aAA+C,CAAC;AAEvE,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU9C,CAAC;AAEF,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAID,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3D"}
@@ -0,0 +1,58 @@
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
+ exports.TYPE_TO_DIR = exports.SKIP_FILES = exports.DIRECTORIES = exports.DB_NAME = exports.MINDLORE_DIR = void 0;
7
+ exports.homedir = homedir;
8
+ exports.isContentFile = isContentFile;
9
+ exports.resolveHookCommon = resolveHookCommon;
10
+ const os_1 = __importDefault(require("os"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ exports.MINDLORE_DIR = '.mindlore';
14
+ exports.DB_NAME = 'mindlore.db';
15
+ exports.DIRECTORIES = [
16
+ 'raw',
17
+ 'sources',
18
+ 'domains',
19
+ 'analyses',
20
+ 'insights',
21
+ 'connections',
22
+ 'learnings',
23
+ 'diary',
24
+ 'decisions',
25
+ ];
26
+ exports.SKIP_FILES = new Set(['INDEX.md', 'SCHEMA.md', 'log.md']);
27
+ exports.TYPE_TO_DIR = {
28
+ raw: 'raw',
29
+ source: 'sources',
30
+ domain: 'domains',
31
+ analysis: 'analyses',
32
+ insight: 'insights',
33
+ connection: 'connections',
34
+ learning: 'learnings',
35
+ decision: 'decisions',
36
+ diary: 'diary',
37
+ };
38
+ function homedir() {
39
+ return os_1.default.homedir();
40
+ }
41
+ /**
42
+ * Filter predicate: true if file is NOT a skip file (INDEX.md, SCHEMA.md, log.md).
43
+ */
44
+ function isContentFile(filePath) {
45
+ return !exports.SKIP_FILES.has(path_1.default.basename(filePath));
46
+ }
47
+ /**
48
+ * Resolve hook common module path — works from both src/ and dist/.
49
+ * From scripts/: ../hooks/lib/mindlore-common.cjs
50
+ * From dist/scripts/: ../../hooks/lib/mindlore-common.cjs
51
+ */
52
+ function resolveHookCommon(callerDir) {
53
+ const candidate = path_1.default.resolve(callerDir, '..', 'hooks', 'lib', 'mindlore-common.cjs');
54
+ if (fs_1.default.existsSync(candidate))
55
+ return candidate;
56
+ return path_1.default.resolve(callerDir, '..', '..', 'hooks', 'lib', 'mindlore-common.cjs');
57
+ }
58
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../scripts/lib/constants.ts"],"names":[],"mappings":";;;;;;AAiCA,0BAEC;AAkBD,sCAEC;AAOD,8CAIC;AAlED,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AAEX,QAAA,YAAY,GAAG,WAAW,CAAC;AAC3B,QAAA,OAAO,GAAG,aAAa,CAAC;AAExB,QAAA,WAAW,GAAG;IACzB,KAAK;IACL,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,WAAW;IACX,OAAO;IACP,WAAW;CACH,CAAC;AAEE,QAAA,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE1D,QAAA,WAAW,GAA2B;IACjD,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,UAAU,EAAE,aAAa;IACzB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,SAAgB,OAAO;IACrB,OAAO,YAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAeD;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,CAAC,kBAAU,CAAC,GAAG,CAAC,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,SAAiB;IACjD,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACvF,IAAI,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * mindlore-fts5-index — Full re-index of .mindlore/ into FTS5 database.
4
+ *
5
+ * Scans all .md files, computes SHA256 content-hash, skips unchanged files.
6
+ * Usage: node dist/scripts/mindlore-fts5-index.js [path-to-mindlore-dir]
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=mindlore-fts5-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mindlore-fts5-index.d.ts","sourceRoot":"","sources":["../../scripts/mindlore-fts5-index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}