From d3ae18434f9ba0d835a80c7ebd12a02d039b2835 Mon Sep 17 00:00:00 2001 From: Alex Newman Date: Sun, 30 Nov 2025 23:09:51 -0500 Subject: [PATCH] Release v6.4.0: Dual-tag system, search API improvements, and privacy features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This release introduces powerful new privacy controls and search improvements: **New Features:** - Dual-tag system for meta-observation control - tags for user-level privacy control - tags for system-level auto-injected observations - Privacy tag documentation and inline help in context hook **Improvements:** - Simplified search API parameters to eliminate bracket encoding issues - Improved user messaging for new privacy features **Technical:** - Tag stripping happens at hook layer (edge processing) - Shared utilities in src/utils/tag-stripping.ts - Database index optimization for user prompts lookup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .claude-plugin/marketplace.json | 2 +- CLAUDE.md | 2 +- package.json | 2 +- plugin/.claude-plugin/plugin.json | 2 +- plugin/scripts/user-message-hook.js | 9 +++++---- src/hooks/user-message-hook.ts | 3 ++- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 7ee38f2a..1f0daced 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -10,7 +10,7 @@ "plugins": [ { "name": "claude-mem", - "version": "6.3.7", + "version": "6.4.0", "source": "./plugin", "description": "Persistent memory system for Claude Code - context compression across sessions" } diff --git a/CLAUDE.md b/CLAUDE.md index b8668100..c91cfbf6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,7 +6,7 @@ Claude-mem is a Claude Code plugin providing persistent memory across sessions. It captures tool usage, compresses observations using the Claude Agent SDK, and injects relevant context into future sessions. -**Current Version**: 6.3.7 +**Current Version**: 6.4.0 ## Architecture diff --git a/package.json b/package.json index 482adf3f..47ed6832 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "6.3.7", + "version": "6.4.0", "description": "Memory compression system for Claude Code - persist context across sessions", "keywords": [ "claude", diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 76d0fb92..b472d757 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "claude-mem", - "version": "6.3.7", + "version": "6.4.0", "description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions", "author": { "name": "Alex Newman" diff --git a/plugin/scripts/user-message-hook.js b/plugin/scripts/user-message-hook.js index a49daf5b..33716741 100755 --- a/plugin/scripts/user-message-hook.js +++ b/plugin/scripts/user-message-hook.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -import{execSync as _}from"child_process";import{join as i}from"path";import{homedir as m}from"os";import{existsSync as x}from"fs";import l from"path";import{homedir as f}from"os";import{existsSync as g,readFileSync as h}from"fs";import{join as t,dirname as p,basename as T}from"path";import{homedir as c}from"os";import{fileURLToPath as u}from"url";function d(){return typeof __dirname<"u"?__dirname:p(u(import.meta.url))}var P=d(),e=process.env.CLAUDE_MEM_DATA_DIR||t(c(),".claude-mem"),s=process.env.CLAUDE_CONFIG_DIR||t(c(),".claude"),A=t(e,"archives"),C=t(e,"logs"),S=t(e,"trash"),I=t(e,"backups"),v=t(e,"settings.json"),b=t(e,"claude-mem.db"),M=t(e,"vector-db"),U=t(s,"settings.json"),j=t(s,"commands"),L=t(s,"CLAUDE.md");function a(){try{let o=l.join(f(),".claude-mem","settings.json");if(g(o)){let n=JSON.parse(h(o,"utf-8")),r=parseInt(n.env?.CLAUDE_MEM_WORKER_PORT,10);if(!isNaN(r))return r}}catch{}return parseInt(process.env.CLAUDE_MEM_WORKER_PORT||"37777",10)}var D=i(m(),".claude","plugins","marketplaces","thedotmack"),y=i(D,"node_modules");x(y)||(console.error(` +import{execSync as _}from"child_process";import{join as i}from"path";import{homedir as p}from"os";import{existsSync as y}from"fs";import l from"path";import{homedir as f}from"os";import{existsSync as g,readFileSync as h}from"fs";import{join as t,dirname as m,basename as T}from"path";import{homedir as a}from"os";import{fileURLToPath as u}from"url";function d(){return typeof __dirname<"u"?__dirname:m(u(import.meta.url))}var P=d(),e=process.env.CLAUDE_MEM_DATA_DIR||t(a(),".claude-mem"),s=process.env.CLAUDE_CONFIG_DIR||t(a(),".claude"),A=t(e,"archives"),C=t(e,"logs"),S=t(e,"trash"),v=t(e,"backups"),I=t(e,"settings.json"),b=t(e,"claude-mem.db"),M=t(e,"vector-db"),U=t(s,"settings.json"),j=t(s,"commands"),L=t(s,"CLAUDE.md");function c(){try{let o=l.join(f(),".claude-mem","settings.json");if(g(o)){let n=JSON.parse(h(o,"utf-8")),r=parseInt(n.env?.CLAUDE_MEM_WORKER_PORT,10);if(!isNaN(r))return r}}catch{}return parseInt(process.env.CLAUDE_MEM_WORKER_PORT||"37777",10)}var x=i(p(),".claude","plugins","marketplaces","thedotmack"),D=i(x,"node_modules");y(D)||(console.error(` --- \u{1F389} Note: This appears under Plugin Hook Error, but it's not an error. That's the only option for user messages in Claude Code UI until a better method is provided. @@ -17,15 +17,16 @@ Dependencies have been installed in the background. This only happens once. Thank you for installing Claude-Mem! This message was not added to your startup context, so you can continue working as normal. -`),process.exit(3));try{let o=i(m(),".claude","plugins","marketplaces","thedotmack","plugin","scripts","context-hook.js"),n=_(`node "${o}" --colors`,{encoding:"utf8"}),r=a();console.error(` +`),process.exit(3));try{let o=i(p(),".claude","plugins","marketplaces","thedotmack","plugin","scripts","context-hook.js"),n=_(`node "${o}" --colors`,{encoding:"utf8"}),r=c();console.error(` \u{1F4DD} Claude-Mem Context Loaded \u2139\uFE0F Note: This appears as stderr but is informational only `+n+` -\u{1F4AC} Community -https://discord.gg/J4wttp9vDu +\u{1F4A1} New! Wrap all or part of any message with ... to prevent storing sensitive information in your observation history. + +\u{1F4AC} Community https://discord.gg/J4wttp9vDu \u{1F4FA} Watch live in browser http://localhost:${r}/ `)}catch(o){console.error(`\u274C Failed to load context display: ${o}`)}process.exit(3); diff --git a/src/hooks/user-message-hook.ts b/src/hooks/user-message-hook.ts index 1fb11552..94016382 100644 --- a/src/hooks/user-message-hook.ts +++ b/src/hooks/user-message-hook.ts @@ -52,7 +52,8 @@ try { "\n\n📝 Claude-Mem Context Loaded\n" + " ℹ️ Note: This appears as stderr but is informational only\n\n" + output + - "\n\n💬 Community\nhttps://discord.gg/J4wttp9vDu\n" + + "\n\n💡 New! Wrap all or part of any message with ... to prevent storing sensitive information in your observation history.\n" + + "\n💬 Community https://discord.gg/J4wttp9vDu\n" + `\n📺 Watch live in browser http://localhost:${port}/\n` );