mindlore 0.3.1 → 0.3.3

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 (62) hide show
  1. package/README.md +47 -23
  2. package/SCHEMA.md +6 -10
  3. package/dist/scripts/init.d.ts +4 -2
  4. package/dist/scripts/init.d.ts.map +1 -1
  5. package/dist/scripts/init.js +109 -64
  6. package/dist/scripts/init.js.map +1 -1
  7. package/dist/scripts/lib/constants.d.ts +10 -5
  8. package/dist/scripts/lib/constants.d.ts.map +1 -1
  9. package/dist/scripts/lib/constants.js +18 -20
  10. package/dist/scripts/lib/constants.js.map +1 -1
  11. package/dist/scripts/mindlore-fts5-index.js +3 -2
  12. package/dist/scripts/mindlore-fts5-index.js.map +1 -1
  13. package/dist/scripts/mindlore-fts5-search.d.ts +3 -2
  14. package/dist/scripts/mindlore-fts5-search.d.ts.map +1 -1
  15. package/dist/scripts/mindlore-fts5-search.js +38 -50
  16. package/dist/scripts/mindlore-fts5-search.js.map +1 -1
  17. package/dist/scripts/mindlore-health-check.d.ts +1 -1
  18. package/dist/scripts/mindlore-health-check.js +7 -19
  19. package/dist/scripts/mindlore-health-check.js.map +1 -1
  20. package/dist/scripts/quality-populate.js +1 -3
  21. package/dist/scripts/quality-populate.js.map +1 -1
  22. package/dist/scripts/uninstall.d.ts +4 -3
  23. package/dist/scripts/uninstall.d.ts.map +1 -1
  24. package/dist/scripts/uninstall.js +26 -35
  25. package/dist/scripts/uninstall.js.map +1 -1
  26. package/dist/tests/cwd-changed.test.js +6 -5
  27. package/dist/tests/cwd-changed.test.js.map +1 -1
  28. package/dist/tests/decision.test.js +1 -1
  29. package/dist/tests/decision.test.js.map +1 -1
  30. package/dist/tests/fts5-sync.test.d.ts +2 -0
  31. package/dist/tests/fts5-sync.test.d.ts.map +1 -0
  32. package/dist/tests/fts5-sync.test.js +120 -0
  33. package/dist/tests/fts5-sync.test.js.map +1 -0
  34. package/dist/tests/fts5.test.js +21 -7
  35. package/dist/tests/fts5.test.js.map +1 -1
  36. package/dist/tests/global-layer.test.js +22 -39
  37. package/dist/tests/global-layer.test.js.map +1 -1
  38. package/dist/tests/helpers/db.d.ts +1 -0
  39. package/dist/tests/helpers/db.d.ts.map +1 -1
  40. package/dist/tests/helpers/db.js.map +1 -1
  41. package/dist/tests/init.test.js +22 -0
  42. package/dist/tests/init.test.js.map +1 -1
  43. package/dist/tests/model-router.test.js +2 -1
  44. package/dist/tests/model-router.test.js.map +1 -1
  45. package/dist/tests/project-namespace.test.d.ts +2 -0
  46. package/dist/tests/project-namespace.test.d.ts.map +1 -0
  47. package/dist/tests/project-namespace.test.js +151 -0
  48. package/dist/tests/project-namespace.test.js.map +1 -0
  49. package/dist/tests/read-guard.test.js +1 -1
  50. package/dist/tests/read-guard.test.js.map +1 -1
  51. package/dist/tests/session-focus.test.js +5 -0
  52. package/dist/tests/session-focus.test.js.map +1 -1
  53. package/hooks/lib/mindlore-common.cjs +54 -19
  54. package/hooks/lib/types.d.ts +2 -0
  55. package/hooks/mindlore-cwd-changed.cjs +1 -1
  56. package/hooks/mindlore-fts5-sync.cjs +4 -3
  57. package/hooks/mindlore-index.cjs +2 -2
  58. package/hooks/mindlore-search.cjs +0 -2
  59. package/hooks/mindlore-session-end.cjs +4 -0
  60. package/package.json +1 -1
  61. package/plugin.json +1 -1
  62. package/templates/SCHEMA.md +9 -11
@@ -0,0 +1,151 @@
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 better_sqlite3_1 = __importDefault(require("better-sqlite3"));
9
+ const db_1 = require("./helpers/db");
10
+ const TEST_DIR = path_1.default.join(__dirname, '..', '.test-project-namespace');
11
+ const commonPath = path_1.default.resolve(__dirname, '..', 'hooks', 'lib', 'mindlore-common.cjs');
12
+ beforeEach(() => {
13
+ (0, db_1.setupTestDir)(TEST_DIR);
14
+ delete require.cache[require.resolve(commonPath)];
15
+ });
16
+ afterEach(() => {
17
+ delete require.cache[require.resolve(commonPath)];
18
+ (0, db_1.teardownTestDir)(TEST_DIR);
19
+ });
20
+ // ── getProjectName ────────────────────────────────────────────────────
21
+ describe('getProjectName', () => {
22
+ test('returns basename of current working directory', () => {
23
+ const fakeProject = path_1.default.join(TEST_DIR, 'my-cool-project');
24
+ fs_1.default.mkdirSync(fakeProject, { recursive: true });
25
+ const originalCwd = process.cwd();
26
+ process.chdir(fakeProject);
27
+ try {
28
+ const { getProjectName } = require(commonPath);
29
+ expect(getProjectName()).toBe('my-cool-project');
30
+ }
31
+ finally {
32
+ process.chdir(originalCwd);
33
+ }
34
+ });
35
+ test('reflects cwd change between calls', () => {
36
+ const projectA = path_1.default.join(TEST_DIR, 'project-alpha');
37
+ const projectB = path_1.default.join(TEST_DIR, 'project-beta');
38
+ fs_1.default.mkdirSync(projectA, { recursive: true });
39
+ fs_1.default.mkdirSync(projectB, { recursive: true });
40
+ const originalCwd = process.cwd();
41
+ try {
42
+ process.chdir(projectA);
43
+ delete require.cache[require.resolve(commonPath)];
44
+ expect(require(commonPath).getProjectName()).toBe('project-alpha');
45
+ process.chdir(projectB);
46
+ delete require.cache[require.resolve(commonPath)];
47
+ expect(require(commonPath).getProjectName()).toBe('project-beta');
48
+ }
49
+ finally {
50
+ process.chdir(originalCwd);
51
+ }
52
+ });
53
+ });
54
+ // ── project column in FTS5 ────────────────────────────────────────────
55
+ describe('project column — insertFtsRow', () => {
56
+ test('stores project value in FTS5 row', () => {
57
+ const dbPath = path_1.default.join(TEST_DIR, 'store.db');
58
+ const db = (0, db_1.createTestDb)(dbPath);
59
+ (0, db_1.insertFts)(db, {
60
+ path: '/fake/sources/entry.md',
61
+ slug: 'entry',
62
+ title: 'Entry Doc',
63
+ content: 'some content here',
64
+ project: 'my-project',
65
+ });
66
+ const row = db
67
+ .prepare('SELECT project FROM mindlore_fts WHERE path = ?')
68
+ .get('/fake/sources/entry.md');
69
+ db.close();
70
+ expect(row?.project).toBe('my-project');
71
+ });
72
+ test('stores null project when not provided', () => {
73
+ const dbPath = path_1.default.join(TEST_DIR, 'null-project.db');
74
+ const db = (0, db_1.createTestDb)(dbPath);
75
+ (0, db_1.insertFts)(db, {
76
+ path: '/fake/sources/legacy.md',
77
+ slug: 'legacy',
78
+ content: 'legacy data',
79
+ });
80
+ const row = db
81
+ .prepare('SELECT project FROM mindlore_fts WHERE path = ?')
82
+ .get('/fake/sources/legacy.md');
83
+ db.close();
84
+ expect(row?.project).toBeNull();
85
+ });
86
+ });
87
+ // ── project filter in FTS5 queries ───────────────────────────────────
88
+ describe('project column — FTS5 filtering', () => {
89
+ test('project filter returns only matching project rows', () => {
90
+ const dbPath = path_1.default.join(TEST_DIR, 'filter.db');
91
+ const db = (0, db_1.createTestDb)(dbPath);
92
+ (0, db_1.insertFts)(db, { path: '/alpha/doc.md', slug: 'alpha-doc', title: 'Alpha Doc', content: 'shared keyword findme', project: 'project-alpha' });
93
+ (0, db_1.insertFts)(db, { path: '/beta/doc.md', slug: 'beta-doc', title: 'Beta Doc', content: 'shared keyword findme', project: 'project-beta' });
94
+ const alphaRows = db
95
+ .prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ? AND project = ?')
96
+ .all('shared keyword findme', 'project-alpha');
97
+ const betaRows = db
98
+ .prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ? AND project = ?')
99
+ .all('shared keyword findme', 'project-beta');
100
+ db.close();
101
+ expect(alphaRows).toHaveLength(1);
102
+ expect(alphaRows[0]?.path).toBe('/alpha/doc.md');
103
+ expect(betaRows).toHaveLength(1);
104
+ expect(betaRows[0]?.path).toBe('/beta/doc.md');
105
+ });
106
+ test('unfiltered query returns rows from all projects', () => {
107
+ const dbPath = path_1.default.join(TEST_DIR, 'unfiltered.db');
108
+ const db = (0, db_1.createTestDb)(dbPath);
109
+ (0, db_1.insertFts)(db, { path: '/p1/doc.md', slug: 'p1', content: 'unique term omnisearch', project: 'project-one' });
110
+ (0, db_1.insertFts)(db, { path: '/p2/doc.md', slug: 'p2', content: 'unique term omnisearch', project: 'project-two' });
111
+ (0, db_1.insertFts)(db, { path: '/p3/doc.md', slug: 'p3', content: 'unique term omnisearch', project: null });
112
+ const rows = db
113
+ .prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ?')
114
+ .all('unique term omnisearch');
115
+ db.close();
116
+ expect(rows).toHaveLength(3);
117
+ });
118
+ test('project filter returns empty when no rows match project', () => {
119
+ const dbPath = path_1.default.join(TEST_DIR, 'nomatch.db');
120
+ const db = (0, db_1.createTestDb)(dbPath);
121
+ (0, db_1.insertFts)(db, { path: '/alpha/doc.md', slug: 'alpha', content: 'some content findme', project: 'project-alpha' });
122
+ const rows = db
123
+ .prepare('SELECT path FROM mindlore_fts WHERE mindlore_fts MATCH ? AND project = ?')
124
+ .all('some content findme', 'project-other');
125
+ db.close();
126
+ expect(rows).toHaveLength(0);
127
+ });
128
+ });
129
+ // ── detectSchemaVersion ───────────────────────────────────────────────
130
+ describe('detectSchemaVersion', () => {
131
+ test('returns 11 for 11-column FTS5 DB (SQL_FTS_CREATE)', () => {
132
+ const dbPath = path_1.default.join(TEST_DIR, 'v11.db');
133
+ const db = (0, db_1.createTestDb)(dbPath);
134
+ db.close();
135
+ const { detectSchemaVersion, openDatabase } = require(commonPath);
136
+ const openDb = openDatabase(dbPath);
137
+ const version = detectSchemaVersion(openDb);
138
+ openDb.close();
139
+ expect(version).toBe(11);
140
+ });
141
+ test('returns 2 (legacy fallback) for DB without mindlore_fts table', () => {
142
+ const dbPath = path_1.default.join(TEST_DIR, 'empty.db');
143
+ new better_sqlite3_1.default(dbPath).close();
144
+ const { detectSchemaVersion, openDatabase } = require(commonPath);
145
+ const openDb = openDatabase(dbPath);
146
+ const version = detectSchemaVersion(openDb);
147
+ openDb.close();
148
+ expect(version).toBe(2);
149
+ });
150
+ });
151
+ //# sourceMappingURL=project-namespace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-namespace.test.js","sourceRoot":"","sources":["../../tests/project-namespace.test.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ function runGuard(input) {
25
25
  encoding: 'utf8',
26
26
  timeout: 5000,
27
27
  cwd: PROJECT_DIR,
28
- env: { ...process.env },
28
+ env: { ...process.env, MINDLORE_HOME: TEST_DIR },
29
29
  });
30
30
  return { stdout: result.trim(), exitCode: 0 };
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"read-guard.test.js","sourceRoot":"","sources":["../../tests/read-guard.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-guard.test.js","sourceRoot":"","sources":["../../tests/read-guard.test.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ describe('Session Focus Hook', () => {
30
30
  cwd: TEST_DIR,
31
31
  encoding: 'utf8',
32
32
  timeout: 5000,
33
+ env: { ...process.env, MINDLORE_HOME: path_1.default.join(TEST_DIR, '.mindlore') },
33
34
  });
34
35
  expect(output).toContain('[Mindlore INDEX]');
35
36
  expect(output).toContain('2 source, 1 analysis, 3 total');
@@ -42,16 +43,19 @@ describe('Session Focus Hook', () => {
42
43
  cwd: TEST_DIR,
43
44
  encoding: 'utf8',
44
45
  timeout: 5000,
46
+ env: { ...process.env, MINDLORE_HOME: path_1.default.join(TEST_DIR, '.mindlore') },
45
47
  });
46
48
  expect(output).toContain('[Mindlore Delta: delta-2026-04-10-0900.md]');
47
49
  expect(output).toContain('Latest session');
48
50
  expect(output).not.toContain('Old session');
49
51
  });
50
52
  test('should produce no output when .mindlore/ does not exist', () => {
53
+ const nonExistent = path_1.default.join(TEST_DIR, 'no-mindlore');
51
54
  const output = (0, child_process_1.execSync)(`node "${HOOK_PATH}"`, {
52
55
  cwd: TEST_DIR,
53
56
  encoding: 'utf8',
54
57
  timeout: 5000,
58
+ env: { ...process.env, MINDLORE_HOME: nonExistent },
55
59
  });
56
60
  expect(output).toBe('');
57
61
  });
@@ -63,6 +67,7 @@ describe('Session Focus Hook', () => {
63
67
  cwd: TEST_DIR,
64
68
  encoding: 'utf8',
65
69
  timeout: 5000,
70
+ env: { ...process.env, MINDLORE_HOME: mindloreDir },
66
71
  });
67
72
  expect(output).toContain('[Mindlore INDEX]');
68
73
  expect(output).not.toContain('[Mindlore Delta');
@@ -1 +1 @@
1
- {"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-focus.test.js","sourceRoot":"","sources":["../../tests/session-focus.test.ts"],"names":[],"mappings":"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"}
@@ -17,47 +17,49 @@ const SKIP_FILES = new Set(['INDEX.md', 'SCHEMA.md', 'log.md']);
17
17
  /**
18
18
  * Compute global .mindlore/ path at call time.
19
19
  * Separate function so os.homedir() is evaluated lazily (testable).
20
+ * MINDLORE_HOME env var overrides for testing and custom installs.
20
21
  */
21
22
  function globalDir() {
23
+ if (process.env.MINDLORE_HOME) return process.env.MINDLORE_HOME;
22
24
  return path.join(os.homedir(), MINDLORE_DIR);
23
25
  }
24
26
 
25
27
  // Convenience export — snapshot at load time for simple references.
26
28
  const GLOBAL_MINDLORE_DIR = globalDir();
27
29
 
30
+ /**
31
+ * v0.3.3 Global-First: always returns global ~/.mindlore/ if it exists.
32
+ */
28
33
  function findMindloreDir() {
29
- const projectDir = path.join(process.cwd(), MINDLORE_DIR);
30
- if (fs.existsSync(projectDir)) return projectDir;
31
-
32
34
  const gDir = globalDir();
33
35
  if (fs.existsSync(gDir)) return gDir;
34
-
35
36
  return null;
36
37
  }
37
38
 
38
39
  /**
39
- * Always returns a .mindlore/ path — project if exists, otherwise global.
40
- * Unlike findMindloreDir, never returns null.
40
+ * Always returns the global ~/.mindlore/ path.
41
+ * v0.3.3: project scope removed — single global directory.
41
42
  */
42
43
  function getActiveMindloreDir() {
43
- const projectDir = path.join(process.cwd(), MINDLORE_DIR);
44
- if (fs.existsSync(projectDir)) return projectDir;
45
44
  return globalDir();
46
45
  }
47
46
 
48
47
  /**
49
- * Return all existing mindlore DB paths (project first, global second).
50
- * Used for layered search: project results ranked higher.
48
+ * Return the single global mindlore DB path.
49
+ * v0.3.3: multi-DB layered search removed single global DB with project column.
51
50
  */
52
51
  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);
52
+ const dbPath = path.join(globalDir(), DB_NAME);
53
+ if (fs.existsSync(dbPath)) return [dbPath];
54
+ return [];
55
+ }
59
56
 
60
- return dbs;
57
+ /**
58
+ * Get current project name from CWD basename.
59
+ * Used as the `project` column value in FTS5.
60
+ */
61
+ function getProjectName() {
62
+ return path.basename(process.cwd());
61
63
  }
62
64
 
63
65
  function getLatestDelta(diaryDir) {
@@ -135,10 +137,10 @@ function extractFtsMetadata(meta, body, filePath, baseDir) {
135
137
  * Shared SQL constants to prevent drift across indexing paths.
136
138
  */
137
139
  const SQL_FTS_CREATE =
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')";
140
+ "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, project UNINDEXED, tokenize='porter unicode61')";
139
141
 
140
142
  const SQL_FTS_INSERT =
141
- 'INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
143
+ 'INSERT INTO mindlore_fts (path, slug, description, type, category, title, content, tags, quality, date_captured, project) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
142
144
 
143
145
  /**
144
146
  * Insert a row into FTS5 using an object parameter (replaces positional args).
@@ -156,6 +158,7 @@ function insertFtsRow(db, entry) {
156
158
  entry.tags || '',
157
159
  entry.quality || null,
158
160
  entry.dateCaptured || null,
161
+ entry.project || null,
159
162
  );
160
163
  }
161
164
 
@@ -247,6 +250,36 @@ function readConfig(mindloreDir) {
247
250
  }
248
251
  }
249
252
 
253
+ /**
254
+ * Detect FTS5 schema version by probing columns.
255
+ * FTS5 virtual tables don't support PRAGMA table_info, so try/catch is required.
256
+ * @param {import('better-sqlite3').Database} db
257
+ * @returns {number} 2 | 7 | 9 | 10
258
+ */
259
+ function detectSchemaVersion(db) {
260
+ try {
261
+ db.prepare('SELECT tags, quality, date_captured, project FROM mindlore_fts LIMIT 0').run();
262
+ return 11;
263
+ } catch (_err11) {
264
+ try {
265
+ db.prepare('SELECT tags, quality, date_captured FROM mindlore_fts LIMIT 0').run();
266
+ return 10;
267
+ } catch (_err10) {
268
+ try {
269
+ db.prepare('SELECT tags, quality FROM mindlore_fts LIMIT 0').run();
270
+ return 9;
271
+ } catch (_err9) {
272
+ try {
273
+ db.prepare('SELECT slug, description, category, title FROM mindlore_fts LIMIT 0').run();
274
+ return 7;
275
+ } catch (_err7) {
276
+ return 2;
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+
250
283
  const DEFAULT_MODELS = {
251
284
  ingest: 'haiku',
252
285
  evolve: 'sonnet',
@@ -276,5 +309,7 @@ module.exports = {
276
309
  openDatabase,
277
310
  getAllMdFiles,
278
311
  readConfig,
312
+ detectSchemaVersion,
313
+ getProjectName,
279
314
  DEFAULT_MODELS,
280
315
  };
@@ -25,6 +25,7 @@ export interface FtsEntry {
25
25
  tags?: string;
26
26
  quality?: string | null;
27
27
  dateCaptured?: string | null;
28
+ project?: string | null;
28
29
  }
29
30
 
30
31
  export interface ParsedFrontmatter {
@@ -53,4 +54,5 @@ export interface MindloreCommon {
53
54
  getAllMdFiles(dir: string, skip?: Set<string>): string[];
54
55
  SQL_FTS_CREATE: string;
55
56
  SQL_FTS_INSERT: string;
57
+ getProjectName(): string;
56
58
  }
@@ -8,7 +8,7 @@
8
8
  * CwdChanged has NO inject to Claude — stdout is swallowed, stderr shown to user.
9
9
  *
10
10
  * Side effects:
11
- * 1. Detect scope (project .mindlore/ vs global ~/.mindlore/)
11
+ * 1. Detect scope (global ~/.mindlore/ or none)
12
12
  * 2. Write scope state to .mindlore/diary/_scope.json for session-focus to read
13
13
  * 3. Show user-facing message via stderr
14
14
  */
@@ -13,7 +13,7 @@
13
13
 
14
14
  const fs = require('fs');
15
15
  const path = require('path');
16
- const { MINDLORE_DIR, DB_NAME, sha256, openDatabase, getAllMdFiles, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin } = require('./lib/mindlore-common.cjs');
16
+ const { MINDLORE_DIR, DB_NAME, sha256, openDatabase, getAllMdFiles, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin, getActiveMindloreDir, getProjectName } = require('./lib/mindlore-common.cjs');
17
17
 
18
18
  function main() {
19
19
  const filePath = readHookStdin(['path', 'file_path']);
@@ -25,7 +25,7 @@ function main() {
25
25
  // This hook is for bulk changes (git pull, manual batch edits).
26
26
  if (filePath.endsWith('.md')) return;
27
27
 
28
- const baseDir = path.join(process.cwd(), MINDLORE_DIR);
28
+ const baseDir = getActiveMindloreDir();
29
29
  if (!fs.existsSync(baseDir)) return;
30
30
 
31
31
  const dbPath = path.join(baseDir, DB_NAME);
@@ -50,6 +50,7 @@ function main() {
50
50
  const now = new Date().toISOString();
51
51
 
52
52
  try {
53
+ const project = getProjectName();
53
54
  const transaction = db.transaction(() => {
54
55
  for (const file of mdFiles) {
55
56
  const content = fs.readFileSync(file, 'utf8').replace(/\r\n/g, '\n');
@@ -61,7 +62,7 @@ function main() {
61
62
  const { meta, body } = parseFrontmatter(content);
62
63
  const { slug, description, type, category, title, tags, quality, dateCaptured } = extractFtsMetadata(meta, body, file, baseDir);
63
64
  deleteFts.run(file);
64
- insertFtsRow(db, { path: file, slug, description, type, category, title, content: body, tags, quality, dateCaptured });
65
+ insertFtsRow(db, { path: file, slug, description, type, category, title, content: body, tags, quality, dateCaptured, project });
65
66
  upsertHash.run(file, hash, now);
66
67
  }
67
68
  });
@@ -10,7 +10,7 @@
10
10
 
11
11
  const fs = require('fs');
12
12
  const path = require('path');
13
- const { MINDLORE_DIR, DB_NAME, SKIP_FILES, sha256, openDatabase, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin } = require('./lib/mindlore-common.cjs');
13
+ const { MINDLORE_DIR, DB_NAME, SKIP_FILES, sha256, openDatabase, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin, getProjectName } = require('./lib/mindlore-common.cjs');
14
14
 
15
15
  function main() {
16
16
  const filePath = readHookStdin(['path', 'file_path']);
@@ -62,7 +62,7 @@ function main() {
62
62
 
63
63
  // Update FTS5
64
64
  db.prepare('DELETE FROM mindlore_fts WHERE path = ?').run(filePath);
65
- insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured });
65
+ insertFtsRow(db, { path: filePath, slug, description, type, category, title, content: body, tags, quality, dateCaptured, project: getProjectName() });
66
66
 
67
67
  // Update hash
68
68
  db.prepare(
@@ -117,8 +117,6 @@ function main() {
117
117
  const Database = requireDatabase();
118
118
  if (!Database) return;
119
119
 
120
- // Layered search: project DB first, global DB second
121
- // Project results appear first in output (higher priority)
122
120
  const allScores = [];
123
121
  for (const dbPath of dbPaths) {
124
122
  allScores.push(...searchDb(dbPath, keywords, Database));
@@ -85,11 +85,15 @@ function main() {
85
85
  const changedFiles = getRecentGitChanges();
86
86
  const reads = getSessionReads(baseDir);
87
87
 
88
+ const { getProjectName } = require('./lib/mindlore-common.cjs');
89
+ const project = getProjectName();
90
+
88
91
  const sections = [
89
92
  '---',
90
93
  `slug: delta-${dateStr}`,
91
94
  'type: diary',
92
95
  `date: ${now.toISOString().slice(0, 10)}`,
96
+ `project: ${project}`,
93
97
  '---',
94
98
  '',
95
99
  `# Session Delta — ${dateStr}`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindlore",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "AI-native knowledge system for Claude Code",
5
5
  "type": "commonjs",
6
6
  "bin": {
package/plugin.json CHANGED
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "name": "mindlore-health",
13
13
  "path": "skills/mindlore-health/SKILL.md",
14
- "description": "Run 18-point structural health check on .mindlore/ knowledge base"
14
+ "description": "Run 16-point structural health check on .mindlore/ knowledge base"
15
15
  },
16
16
  {
17
17
  "name": "mindlore-query",
@@ -28,17 +28,14 @@ with YAML frontmatter. Search is powered by FTS5 (SQLite full-text search).
28
28
  └── mindlore.db # FTS5 search database (SQLite)
29
29
  ```
30
30
 
31
- ### Global Scope (v0.3)
31
+ ### Global Scope (v0.3.3)
32
32
 
33
- Mindlore supports two scopes:
34
- - **Project scope:** `.mindlore/` in the current working directory (project-specific knowledge)
35
- - **Global scope:** `~/.mindlore/` in the user's home directory (cross-project knowledge)
36
-
37
- Rules:
38
- - `getActiveMindloreDir()` resolves scope: project if exists, otherwise global
39
- - Search is layered: project results first, global results second
40
- - Skills accept `--global` (force global) and `--all` (both scopes) flags
41
- - `npx mindlore init --global` creates `~/.mindlore/` with git repo for auto-sync
33
+ Mindlore uses a single global directory:
34
+ - **Global:** `~/.mindlore/` (or `$MINDLORE_HOME` if set)
35
+ - All projects share one DB; project namespace is stored in the `project` FTS5 column
36
+ - `project` = `path.basename(cwd)` at index/search time
37
+ - `npx mindlore init` always initializes `~/.mindlore/` with git repo for auto-sync
38
+ - Search defaults to current project; use `--all` flag to search all projects
42
39
 
43
40
  ### Directory Rules
44
41
 
@@ -155,7 +152,7 @@ Discover unexpected connections between sources. Cross-reference analysis.
155
152
  - Max results: 3 per query (BM25 ranking)
156
153
  - Hook injects: file path + first 2 headings
157
154
 
158
- ### FTS5 Columns (10-col schema, v0.3)
155
+ ### FTS5 Columns (11-col schema, v0.3.3)
159
156
 
160
157
  | Column | Indexed | Source |
161
158
  |--------|---------|--------|
@@ -169,6 +166,7 @@ Discover unexpected connections between sources. Cross-reference analysis.
169
166
  | `tags` | Yes | Frontmatter tags (comma-separated) |
170
167
  | `quality` | UNINDEXED | Frontmatter quality (high/medium/low) |
171
168
  | `date_captured` | UNINDEXED | Frontmatter date_captured or date |
169
+ | `project` | UNINDEXED | path.basename(cwd) at index time |
172
170
 
173
171
  ### Search Flow (UserPromptSubmit hook)
174
172