claude-mem-lite 3.54.0 → 3.56.0

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.
@@ -10,7 +10,7 @@
10
10
  "plugins": [
11
11
  {
12
12
  "name": "claude-mem-lite",
13
- "version": "3.54.0",
13
+ "version": "3.56.0",
14
14
  "source": "./",
15
15
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark)."
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem-lite",
3
- "version": "3.54.0",
3
+ "version": "3.56.0",
4
4
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark).",
5
5
  "author": {
6
6
  "name": "sdsrss"
@@ -38,13 +38,29 @@ export async function probeBetterSqlite3Binding(installDir) {
38
38
  * subprocess.
39
39
  *
40
40
  * @param {string} installDir Directory containing node_modules/better-sqlite3
41
- * @param {{probe?: () => Promise<{ok: boolean, error?: string}>, rebuild?: () => Promise<void>}} [deps]
41
+ * @param {{probe?: () => Promise<{ok: boolean, error?: string}>, rebuild?: () => Promise<void>, exec?: (cmd: string, opts: object) => void}} [deps]
42
42
  * @returns {Promise<{ok: true, action: 'verified' | 'rebuilt'} | {ok: false, error: string}>}
43
43
  */
44
44
  export async function ensureBetterSqlite3Working(installDir, deps = {}) {
45
45
  const probe = deps.probe || (() => probeBetterSqlite3Binding(installDir));
46
+ const exec = deps.exec || execSync;
46
47
  const rebuild = deps.rebuild || (async () => {
47
- execSync('npm rebuild better-sqlite3', { cwd: installDir, stdio: 'pipe' });
48
+ // npm >= 12 blocks install/lifecycle scripts by default (the `allow-scripts`
49
+ // allowlist ships empty). better-sqlite3's install step
50
+ // (`prebuild-install || node-gyp rebuild`) is what produces the native .node
51
+ // binding, so a plain `npm rebuild better-sqlite3` exits 0 ("rebuilt
52
+ // dependencies successfully") WITHOUT compiling it — the server then FATALs
53
+ // opening the DB and dies before the MCP handshake (client reports -32000),
54
+ // and THIS self-heal silently no-ops on every launch. Re-enable scripts for
55
+ // just this rebuild of our own vetted dependency: `npm rebuild <pkg>` runs
56
+ // only <pkg>'s scripts, so the blast radius is better-sqlite3 alone. Older
57
+ // npm has no such gate and treats the unknown flag as an ignored config; if
58
+ // it instead errors on the flag, fall back to the plain rebuild.
59
+ try {
60
+ exec('npm rebuild better-sqlite3 --dangerously-allow-all-scripts', { cwd: installDir, stdio: 'pipe' });
61
+ } catch {
62
+ exec('npm rebuild better-sqlite3', { cwd: installDir, stdio: 'pipe' });
63
+ }
48
64
  });
49
65
 
50
66
  const first = await probe();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-mem-lite",
3
- "version": "3.54.0",
3
+ "version": "3.56.0",
4
4
  "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. A lighter, lower-cost alternative to claude-mem (episode batching + a smaller model; cost savings are an internal estimate, not a measured benchmark).",
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.9.2",
package/synonyms.mjs CHANGED
@@ -215,6 +215,37 @@ export const SYNONYM_PAIRS = [
215
215
  ['历史', 'history'], ['描述', 'description'],
216
216
  ['推荐', 'recommend'], ['建议', 'suggestion'],
217
217
  ['智能', 'smart'], ['智能', 'intelligent'],
218
+ // ─── G15 bilingual bridge (three-face audit 2026-07-18) ───
219
+ // Real-DB gap: obs bodies are Haiku ENGLISH summaries, so Chinese queries for
220
+ // the user's WORKING vocabulary scored zero ('钳制' 0 hits vs 'clamp' 9 — the
221
+ // audit's canonical case). Pairs curated from (a) 90d prompt mining of
222
+ // frequent uncovered CJK terms (注入/发版/报告/目录/路径/覆盖/规范/默认…) and
223
+ // (b) the memory/search/release domain vocabulary this corpus actually stores.
224
+ // English→Chinese direction is near-free (CJK terms rarely match EN docs);
225
+ // the win is Chinese→English. Gated by denoise-ab A/B (g15 control snapshot).
226
+ ['钳制', 'clamp'], ['富集', 'enrich'], ['富集', 'enrichment'],
227
+ ['注入', 'inject'], ['注入', 'injection'],
228
+ ['召回', 'recall'], ['检索', 'retrieval'], ['检索', 'search'],
229
+ ['衰减', 'decay'], ['去重', 'dedup'],
230
+ ['幂等', 'idempotent'], ['幂等', 'idempotency'],
231
+ ['回填', 'backfill'], ['降级', 'degrade'],
232
+ ['兜底', 'fallback'], ['回退', 'rollback'], ['回退', 'revert'],
233
+ ['探针', 'probe'], ['遥测', 'telemetry'],
234
+ ['基线', 'baseline'], ['审计', 'audit'],
235
+ ['路线图', 'roadmap'], ['词表', 'vocabulary'],
236
+ ['命名空间', 'namespace'], ['残留', 'residue'],
237
+ ['门控', 'gate'], ['阈值', 'threshold'],
238
+ ['快照', 'snapshot'], ['签名', 'signature'], ['签名', 'signing'],
239
+ ['备份', 'backup'], ['漏斗', 'funnel'],
240
+ ['发版', 'release'], ['报告', 'report'],
241
+ ['目录', 'directory'], ['路径', 'path'],
242
+ ['覆盖', 'coverage'], ['覆盖', 'overwrite'],
243
+ ['规范', 'spec'], ['默认', 'default'],
244
+ ['场景', 'scenario'], ['质量', 'quality'],
245
+ ['逻辑', 'logic'], ['规则', 'rule'],
246
+ ['墓碑', 'tombstone'], ['噪音', 'noise'], ['噪声', 'noise'],
247
+ ['精度', 'precision'], ['精准', 'precision'], ['稀释', 'dilution'],
248
+ ['延后', 'defer'], ['挂账', 'deferred'], ['可观测', 'observability'],
218
249
  ];
219
250
 
220
251
  // ─── Bidirectional SYNONYM_MAP (case-insensitive) ──────────────────────────────
@@ -272,6 +303,15 @@ export const CJK_COMPOUNDS = new Set([
272
303
  // improves, and real compounds cannot create boundary-straddle bigrams.
273
304
  '工作', '用户', '完成', '计划', '命令', '工具', '插件', '实施', '处理',
274
305
  '清理', '显示', '本地', '改动', '确认', '直接', '开始',
306
+ // G15 bilingual-bridge terms — keep cjkBigrams (CJK_SORTED reads ONLY this
307
+ // set) segmenting the same words the synonym map expands, so index-side and
308
+ // query-side tokenization agree. Real compounds are monotonically safe (above).
309
+ '钳制', '富集', '召回', '检索', '衰减', '去重', '幂等', '回填', '降级',
310
+ '兜底', '回退', '探针', '遥测', '基线', '审计', '路线图', '词表', '命名空间',
311
+ '残留', '门控', '阈值', '快照', '签名', '备份', '漏斗', '发版', '报告',
312
+ '目录', '路径', '覆盖', '规范', '默认', '场景', '质量', '逻辑', '规则',
313
+ '墓碑', '噪音', '噪声', '精度', '精准', '稀释', '延后', '挂账', '可观测',
314
+ '注入',
275
315
  ]);
276
316
 
277
317
  // ─── Dispatch Synonyms (unidirectional, broader groupings) ──────────────────