mindlore 0.7.2 → 0.7.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.
Files changed (101) hide show
  1. package/.claude-plugin/marketplace.json +33 -0
  2. package/.claude-plugin/plugin.json +30 -0
  3. package/dist/scripts/init.js +152 -151
  4. package/dist/scripts/init.js.map +1 -1
  5. package/dist/scripts/lib/constants.d.ts +1 -1
  6. package/dist/scripts/lib/constants.d.ts.map +1 -1
  7. package/dist/scripts/lib/constants.js +2 -7
  8. package/dist/scripts/lib/constants.js.map +1 -1
  9. package/dist/scripts/lib/detect-plugin.d.ts +2 -0
  10. package/dist/scripts/lib/detect-plugin.d.ts.map +1 -0
  11. package/dist/scripts/lib/detect-plugin.js +14 -0
  12. package/dist/scripts/lib/detect-plugin.js.map +1 -0
  13. package/dist/scripts/lib/hook-helpers.d.ts +8 -0
  14. package/dist/scripts/lib/hook-helpers.d.ts.map +1 -0
  15. package/dist/scripts/lib/hook-helpers.js +27 -0
  16. package/dist/scripts/lib/hook-helpers.js.map +1 -0
  17. package/dist/scripts/lib/mcp-namespace.d.ts.map +1 -1
  18. package/dist/scripts/lib/mcp-namespace.js +0 -5
  19. package/dist/scripts/lib/mcp-namespace.js.map +1 -1
  20. package/dist/scripts/lib/mcp-tools.d.ts.map +1 -1
  21. package/dist/scripts/lib/mcp-tools.js +3 -19
  22. package/dist/scripts/lib/mcp-tools.js.map +1 -1
  23. package/dist/scripts/lib/relation-helpers.js +1 -1
  24. package/dist/scripts/lib/relation-helpers.js.map +1 -1
  25. package/dist/scripts/lib/session-payload.d.ts.map +1 -1
  26. package/dist/scripts/lib/session-payload.js +4 -16
  27. package/dist/scripts/lib/session-payload.js.map +1 -1
  28. package/dist/scripts/lib/settings-cleanup.d.ts +6 -0
  29. package/dist/scripts/lib/settings-cleanup.d.ts.map +1 -0
  30. package/dist/scripts/lib/settings-cleanup.js +61 -0
  31. package/dist/scripts/lib/settings-cleanup.js.map +1 -0
  32. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts +1 -1
  33. package/dist/scripts/lib/tool-adapters/decide-adapter.d.ts.map +1 -1
  34. package/dist/scripts/lib/tool-adapters/decide-adapter.js +5 -0
  35. package/dist/scripts/lib/tool-adapters/decide-adapter.js.map +1 -1
  36. package/dist/scripts/mcp-server.js +40 -3
  37. package/dist/scripts/mcp-server.js.map +1 -1
  38. package/dist/scripts/mindlore-doctor.d.ts +4 -1
  39. package/dist/scripts/mindlore-doctor.d.ts.map +1 -1
  40. package/dist/scripts/mindlore-doctor.js +86 -40
  41. package/dist/scripts/mindlore-doctor.js.map +1 -1
  42. package/dist/scripts/mindlore-health-check.js +2 -2
  43. package/dist/scripts/mindlore-health-check.js.map +1 -1
  44. package/dist/scripts/mindlore-perf.d.ts +3 -1
  45. package/dist/scripts/mindlore-perf.d.ts.map +1 -1
  46. package/dist/scripts/mindlore-perf.js +13 -6
  47. package/dist/scripts/mindlore-perf.js.map +1 -1
  48. package/dist/scripts/uninstall.js +14 -38
  49. package/dist/scripts/uninstall.js.map +1 -1
  50. package/dist/tests/db-singleton.test.d.ts +2 -0
  51. package/dist/tests/db-singleton.test.d.ts.map +1 -0
  52. package/dist/tests/db-singleton.test.js +22 -0
  53. package/dist/tests/db-singleton.test.js.map +1 -0
  54. package/dist/tests/doctor.test.js +45 -15
  55. package/dist/tests/doctor.test.js.map +1 -1
  56. package/dist/tests/dont-repeat-dedup.test.js +13 -1
  57. package/dist/tests/dont-repeat-dedup.test.js.map +1 -1
  58. package/dist/tests/fts5-sync.test.js +11 -117
  59. package/dist/tests/fts5-sync.test.js.map +1 -1
  60. package/dist/tests/hook-helpers.test.d.ts +2 -0
  61. package/dist/tests/hook-helpers.test.d.ts.map +1 -0
  62. package/dist/tests/hook-helpers.test.js +44 -0
  63. package/dist/tests/hook-helpers.test.js.map +1 -0
  64. package/dist/tests/install-matrix.test.d.ts +2 -0
  65. package/dist/tests/install-matrix.test.d.ts.map +1 -0
  66. package/dist/tests/install-matrix.test.js +110 -0
  67. package/dist/tests/install-matrix.test.js.map +1 -0
  68. package/dist/tests/latency-budget.test.d.ts +2 -0
  69. package/dist/tests/latency-budget.test.d.ts.map +1 -0
  70. package/dist/tests/latency-budget.test.js +37 -0
  71. package/dist/tests/latency-budget.test.js.map +1 -0
  72. package/dist/tests/mcp-namespace.test.d.ts +2 -0
  73. package/dist/tests/mcp-namespace.test.d.ts.map +1 -0
  74. package/dist/tests/mcp-namespace.test.js +41 -0
  75. package/dist/tests/mcp-namespace.test.js.map +1 -0
  76. package/dist/tests/session-payload.test.js +13 -5
  77. package/dist/tests/session-payload.test.js.map +1 -1
  78. package/dist/tests/settings-cleanup.test.d.ts +2 -0
  79. package/dist/tests/settings-cleanup.test.d.ts.map +1 -0
  80. package/dist/tests/settings-cleanup.test.js +126 -0
  81. package/dist/tests/settings-cleanup.test.js.map +1 -0
  82. package/dist/tests/telemetry-perf.test.js +9 -8
  83. package/dist/tests/telemetry-perf.test.js.map +1 -1
  84. package/dist/tests/version-sync.test.d.ts +2 -0
  85. package/dist/tests/version-sync.test.d.ts.map +1 -0
  86. package/dist/tests/version-sync.test.js +41 -0
  87. package/dist/tests/version-sync.test.js.map +1 -0
  88. package/hooks/cc-memory-bulk-sync.cjs +2 -5
  89. package/hooks/cc-session-sync.cjs +2 -5
  90. package/hooks/lib/mindlore-common.cjs +41 -8
  91. package/hooks/mindlore-fts5-sync.cjs +5 -1
  92. package/hooks/mindlore-search.cjs +20 -14
  93. package/hooks/mindlore-session-focus.cjs +5 -17
  94. package/hooks/src/mindlore-fts5-sync.cjs +7 -4
  95. package/hooks/src/mindlore-search.cjs +19 -11
  96. package/hooks/src/mindlore-session-focus.cjs +1 -1
  97. package/package.json +3 -2
  98. package/plugin.json +5 -2
  99. package/skills/mindlore-decide/SKILL.md +7 -0
  100. package/skills/mindlore-log/SKILL.md +7 -0
  101. package/templates/config.json +1 -1
@@ -14,28 +14,16 @@ var require_session_payload = __commonJS({
14
14
  };
15
15
  Object.defineProperty(exports2, "__esModule", { value: true });
16
16
  exports2.buildSessionPayload = buildSessionPayload;
17
- var fs_1 = __importDefault(require("fs"));
18
- var path_1 = __importDefault(require("path"));
19
17
  var crypto_1 = __importDefault(require("crypto"));
20
18
  var CHARS_PER_TOKEN = 4;
21
19
  function estimateTokens(text) {
22
20
  return Math.ceil(text.length / CHARS_PER_TOKEN);
23
21
  }
24
- function buildSessionSummary(baseDir, latestDeltaContent) {
25
- if (latestDeltaContent) {
26
- const lines2 = latestDeltaContent.split("\n").filter((l) => l.startsWith("- ") || l.startsWith("# "));
27
- return lines2.slice(0, 10).join("\n") || "No previous session data.";
28
- }
29
- const diaryDir = path_1.default.join(baseDir, "diary");
30
- if (!fs_1.default.existsSync(diaryDir))
31
- return "No previous session data.";
32
- const deltas = fs_1.default.readdirSync(diaryDir).filter((f) => f.startsWith("delta-")).sort();
33
- if (deltas.length === 0)
22
+ function buildSessionSummary(_baseDir, latestDeltaContent) {
23
+ if (!latestDeltaContent)
34
24
  return "No previous session data.";
35
- const latestFile = deltas[deltas.length - 1] ?? "";
36
- const latest = fs_1.default.readFileSync(path_1.default.join(diaryDir, latestFile), "utf8");
37
- const lines = latest.split("\n").filter((l) => l.startsWith("- ") || l.startsWith("# "));
38
- return lines.slice(0, 10).join("\n");
25
+ const lines = latestDeltaContent.split("\n").filter((l) => l.startsWith("- ") || l.startsWith("# "));
26
+ return lines.slice(0, 10).join("\n") || "No previous session data.";
39
27
  }
40
28
  function buildEpisodeSections(db, project, sessionId) {
41
29
  const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1e3).toISOString();
@@ -725,11 +713,11 @@ ${content}`);
725
713
  const latestPath = path.join(diaryDir, latestName);
726
714
  const deltaContent = fs.readFileSync(latestPath, "utf8").trim();
727
715
  sourceChars += deltaContent.length;
728
- latestDeltaContent = deltaContent;
729
716
  const { meta } = parseFrontmatter(deltaContent);
730
717
  const deltaProject = meta.project || null;
731
718
  const currentProject = getProjectName();
732
719
  if (!deltaProject || deltaProject.toLowerCase() === currentProject.toLowerCase()) {
720
+ latestDeltaContent = deltaContent;
733
721
  output.push(`[Mindlore Delta: ${latestName}]
734
722
  ${truncateChangedFiles(truncateCommits(deltaContent))}`);
735
723
  }
@@ -15,17 +15,18 @@ const fs = require('fs');
15
15
  const path = require('path');
16
16
  const { DB_NAME, sha256, openDatabase, getAllMdFiles, parseFrontmatter, extractFtsMetadata, insertFtsRow, readHookStdin, getActiveMindloreDir, getProjectName, resolveProject, hookLog, withTelemetry, SQL_FTS_SESSIONS_INSERT, isSessionCategory, isInsideMindloreDir } = require('./lib/mindlore-common.cjs');
17
17
 
18
+ function shouldIndexFile(filePath) {
19
+ return !!(filePath && filePath.endsWith('.md'));
20
+ }
21
+
18
22
  function main() {
19
23
  const filePath = readHookStdin(['path', 'file_path']);
20
24
 
21
25
  if (!filePath) return;
26
+ if (!shouldIndexFile(filePath)) return;
22
27
  const resolved = path.resolve(filePath);
23
28
  if (!isInsideMindloreDir(resolved)) return;
24
29
 
25
- // Skip if this is a single .md file change — mindlore-index.cjs handles those.
26
- // This hook is for bulk changes (git pull, manual batch edits).
27
- if (filePath.endsWith('.md')) return;
28
-
29
30
  const baseDir = getActiveMindloreDir();
30
31
  if (!fs.existsSync(baseDir)) return;
31
32
 
@@ -92,6 +93,8 @@ function main() {
92
93
 
93
94
  }
94
95
 
96
+ module.exports = { shouldIndexFile };
97
+
95
98
  withTelemetry('mindlore-fts5-sync', main).catch(err => {
96
99
  hookLog('mindlore-fts5-sync', 'error', err?.message ?? String(err));
97
100
  process.exit(0);
@@ -11,7 +11,7 @@
11
11
 
12
12
  const fs = require('fs');
13
13
  const path = require('path');
14
- const { getAllDbs, openDatabase, extractHeadings, readHookStdin, readConfig, hookLog, incrementRecallCount, withTelemetry } = require('./lib/mindlore-common.cjs');
14
+ const { getAllDbs, openDatabase, extractHeadings, readConfig, hookLog, incrementRecallCount, withTelemetry } = require('./lib/mindlore-common.cjs');
15
15
 
16
16
  const MAX_RESULTS = 3;
17
17
  const MIN_QUERY_WORDS = 3;
@@ -30,9 +30,23 @@ try {
30
30
  // search-cache not built yet
31
31
  }
32
32
 
33
+ function parseStdin() {
34
+ try {
35
+ const raw = fs.readFileSync(0, 'utf8').trim();
36
+ if (!raw) return { userMessage: '', sessionId: 'unknown' };
37
+ const parsed = JSON.parse(raw);
38
+ const userMessage = parsed.prompt || parsed.content || parsed.message || parsed.query || raw;
39
+ const sessionId = parsed.session_id || 'unknown';
40
+ return { userMessage, sessionId };
41
+ } catch (_err) {
42
+ return { userMessage: '', sessionId: 'unknown' };
43
+ }
44
+ }
45
+
33
46
  function main() {
34
- const userMessage = readHookStdin(['prompt', 'content', 'message', 'query']);
47
+ const { userMessage, sessionId } = parseStdin();
35
48
  if (!userMessage || userMessage.length < MIN_QUERY_WORDS) return;
49
+ let searchMs = 0;
36
50
 
37
51
  const dbPaths = getAllDbs();
38
52
  if (dbPaths.length === 0) return;
@@ -46,15 +60,6 @@ function main() {
46
60
  const config = readConfig(path.dirname(dbPaths[0]));
47
61
  const synonyms = (config && config.synonyms) ? config.synonyms : {};
48
62
 
49
- // Read session_id from stdin for throttling
50
- let sessionId;
51
- try {
52
- const stdinData = JSON.parse(process.env.CLAUDE_HOOK_STDIN || '{}');
53
- sessionId = stdinData.session_id || 'unknown';
54
- } catch (_) {
55
- sessionId = 'unknown';
56
- }
57
-
58
63
  const allResults = [];
59
64
  for (const dbPath of dbPaths) {
60
65
  const db = openDatabase(dbPath);
@@ -82,11 +87,13 @@ function main() {
82
87
  }
83
88
  }
84
89
 
90
+ const t0 = Date.now();
85
91
  const results = searchEngineMod.search(db, userMessage, {
86
92
  project,
87
93
  maxResults: effectiveMax,
88
94
  synonyms,
89
95
  });
96
+ searchMs += Date.now() - t0;
90
97
 
91
98
  if (cache) cache.set(userMessage, results);
92
99
 
@@ -192,6 +199,7 @@ function main() {
192
199
 
193
200
  process.stdout.write(outputStr);
194
201
  }
202
+ return { search_ms: searchMs, result_count: relevant.length };
195
203
  }
196
204
 
197
205
  withTelemetry('mindlore-search', main).catch(err => {
@@ -150,11 +150,11 @@ function main() {
150
150
  const latestPath = path.join(diaryDir, latestName);
151
151
  const deltaContent = fs.readFileSync(latestPath, 'utf8').trim();
152
152
  sourceChars += deltaContent.length;
153
- latestDeltaContent = deltaContent;
154
153
  const { meta } = parseFrontmatter(deltaContent);
155
154
  const deltaProject = meta.project || null;
156
155
  const currentProject = getProjectName();
157
156
  if (!deltaProject || deltaProject.toLowerCase() === currentProject.toLowerCase()) {
157
+ latestDeltaContent = deltaContent;
158
158
  output.push(`[Mindlore Delta: ${latestName}]\n${truncateChangedFiles(truncateCommits(deltaContent))}`);
159
159
  }
160
160
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mindlore",
3
- "version": "0.7.2",
3
+ "version": "0.7.4",
4
4
  "description": "AI-native knowledge system for Claude Code",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -27,7 +27,7 @@
27
27
  "bundle:hooks": "npx tsx scripts/bundle-hooks.ts",
28
28
  "bundle:mcp": "npx esbuild scripts/mcp-server.ts --bundle --platform=node --target=node20 --format=cjs --outfile=mcp-server.cjs --external:better-sqlite3",
29
29
  "bundle": "npm run bundle:hooks && npm run bundle:mcp",
30
- "postinstall": "npm rebuild better-sqlite3"
30
+ "postinstall": "npm run build && npm rebuild better-sqlite3"
31
31
  },
32
32
  "keywords": [
33
33
  "claude-code",
@@ -71,6 +71,7 @@
71
71
  "typescript": "^6.0.2"
72
72
  },
73
73
  "files": [
74
+ ".claude-plugin/",
74
75
  "agents/",
75
76
  "dist/",
76
77
  "hooks/",
package/plugin.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "manifestVersion": 2,
3
3
  "name": "mindlore",
4
4
  "description": "AI-native knowledge system for Claude Code. Persistent, searchable, evolving knowledge base with FTS5 and Knowledge Graph.",
5
- "version": "0.7.2",
5
+ "version": "0.7.4",
6
6
  "skills": [
7
7
  {
8
8
  "name": "mindlore-ingest",
@@ -80,10 +80,13 @@
80
80
  "mcpServers": {
81
81
  "mindlore": {
82
82
  "command": "node",
83
- "args": ["${CLAUDE_PLUGIN_ROOT}/mcp-server.cjs"],
83
+ "args": [
84
+ "${CLAUDE_PLUGIN_ROOT}/mcp-server.cjs"
85
+ ],
84
86
  "description": "Mindlore MCP server: FTS5 search, episodic memory, knowledge graph relations, and KB management"
85
87
  }
86
88
  },
89
+ "_hooks_note": "Hooks loaded by CC plugin auto-discovery from hooks/ directory. This array is metadata only — not read by CC or init.",
87
90
  "hooks": [
88
91
  {
89
92
  "event": "SessionStart",
@@ -1,3 +1,10 @@
1
+ ---
2
+ name: mindlore-decide
3
+ description: Record or list decisions with supersedes chain
4
+ effort: low
5
+ context: fork
6
+ ---
7
+
1
8
  # Skill: Mindlore Decide
2
9
 
3
10
  Record and list decisions in the `.mindlore/decisions/` directory.
@@ -1,3 +1,10 @@
1
+ ---
2
+ name: mindlore-log
3
+ description: Session logging, reflect, status, and wiki save
4
+ effort: low
5
+ context: fork
6
+ ---
7
+
1
8
  # Skill: Mindlore Log
2
9
 
3
10
  Session logging, pattern extraction, and wiki updates.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.7.2",
2
+ "version": "0.7.4",
3
3
  "models": {
4
4
  "ingest": "haiku",
5
5
  "evolve": "sonnet",