claude-recall 0.8.6 → 0.8.8

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.
@@ -47,8 +47,8 @@ def should_require_search(tool_name: str, tool_input: Dict[str, Any]) -> bool:
47
47
  def check_recent_search(session_id: str) -> bool:
48
48
  """Check if memory search was performed recently in this session."""
49
49
  if not session_id:
50
- # No session ID, be permissive
51
- return True
50
+ # No session ID - strict mode: block execution
51
+ return False
52
52
 
53
53
  try:
54
54
  # Call claude-recall CLI to check recent tool usage
@@ -60,15 +60,15 @@ def check_recent_search(session_id: str) -> bool:
60
60
  )
61
61
 
62
62
  if result.returncode != 0:
63
- # Command failed, be permissive (don't block)
64
- return True
63
+ # Command failed - strict mode: block execution
64
+ return False
65
65
 
66
66
  # Check if mcp__claude-recall__search was called recently
67
67
  return 'mcp__claude-recall__search' in result.stdout
68
68
 
69
69
  except (subprocess.TimeoutExpired, FileNotFoundError, Exception):
70
- # If check fails, be permissive (don't block)
71
- return True
70
+ # Check failed - strict mode: block execution
71
+ return False
72
72
 
73
73
 
74
74
  def generate_search_query(tool_name: str, tool_input: Dict[str, Any]) -> str:
@@ -4,6 +4,10 @@
4
4
  {
5
5
  "matcher": "Write|Edit",
6
6
  "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "python3 .claude/hooks/pre_tool_search_enforcer.py"
10
+ },
7
11
  {
8
12
  "type": "command",
9
13
  "command": "python3 .claude/hooks/pubnub_pre_tool_hook.py"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-recall",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "description": "Persistent memory for Claude Code with fire-and-forget PubNub architecture, automatic capture, failure learning, and project scoping via MCP server",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -6,50 +6,39 @@ const os = require('os');
6
6
 
7
7
  console.log('\nšŸš€ Setting up Claude Recall...\n');
8
8
 
9
- try {
10
- // Configure MCP server in ~/.claude.json
11
- const claudeConfigPath = path.join(os.homedir(), '.claude.json');
12
-
13
- // Read or create claude config
14
- let config = { mcpServers: {} };
15
- if (fs.existsSync(claudeConfigPath)) {
16
- const configContent = fs.readFileSync(claudeConfigPath, 'utf8');
17
- config = JSON.parse(configContent);
18
- if (!config.mcpServers) {
19
- config.mcpServers = {};
20
- }
21
- }
22
-
23
- // Check if claude-recall is already configured
24
- if (config.mcpServers['claude-recall']) {
25
- console.log('āš ļø Claude Recall is already configured in ~/.claude.json');
26
- console.log(' Updating configuration...');
27
- }
9
+ const { execSync } = require('child_process');
28
10
 
11
+ try {
29
12
  // Set up database location in user's home directory
30
13
  const dbDir = path.join(os.homedir(), '.claude-recall');
31
-
14
+
32
15
  // Create directory if it doesn't exist
33
16
  if (!fs.existsSync(dbDir)) {
34
17
  fs.mkdirSync(dbDir, { recursive: true });
35
18
  console.log(`šŸ“ Created database directory: ${dbDir}`);
36
19
  }
37
20
 
38
- // Add or update claude-recall configuration
39
- // Remove env variables since we're hardcoding the path to ~/.claude-recall/claude-recall.db
40
- config.mcpServers['claude-recall'] = {
41
- type: 'stdio',
42
- command: 'npx',
43
- args: ['claude-recall', 'mcp', 'start']
44
- };
45
-
46
- // Write back the config with proper formatting
47
- fs.writeFileSync(claudeConfigPath, JSON.stringify(config, null, 2));
21
+ // Register MCP server using official Claude CLI
22
+ try {
23
+ // Remove existing registration first (in case of update)
24
+ try {
25
+ execSync('claude mcp remove claude-recall', { stdio: 'ignore' });
26
+ } catch (e) {
27
+ // Ignore if not registered
28
+ }
48
29
 
49
- console.log('āœ… Successfully configured Claude Recall in ~/.claude.json');
30
+ // Register using official CLI
31
+ execSync('claude mcp add claude-recall -- npx claude-recall mcp start', {
32
+ stdio: 'inherit'
33
+ });
34
+ console.log('āœ… Registered Claude Recall MCP server');
35
+ } catch (mcpError) {
36
+ console.log('āš ļø Could not auto-register MCP server.');
37
+ console.log(' Please run manually:');
38
+ console.log(' claude mcp add claude-recall -- npx claude-recall mcp start');
39
+ }
50
40
 
51
41
  // Update project CLAUDE.md with minimal instructions
52
- const { execSync } = require('child_process');
53
42
  try {
54
43
  execSync('node ' + path.join(__dirname, 'postinstall-claude-md.js'), { stdio: 'inherit' });
55
44
  } catch (error) {
@@ -121,6 +110,7 @@ try {
121
110
  // Copy hook scripts from package
122
111
  const packageHooksDir = path.join(__dirname, '../.claude/hooks');
123
112
  const hookScripts = [
113
+ 'pre_tool_search_enforcer.py',
124
114
  'pubnub_pre_tool_hook.py',
125
115
  'pubnub_prompt_hook.py'
126
116
  ];
@@ -152,8 +142,12 @@ try {
152
142
  settings.hooks = {
153
143
  PreToolUse: [
154
144
  {
155
- matcher: "Write|Edit|Bash",
145
+ matcher: "Write|Edit",
156
146
  hooks: [
147
+ {
148
+ type: "command",
149
+ command: "python3 .claude/hooks/pre_tool_search_enforcer.py"
150
+ },
157
151
  {
158
152
  type: "command",
159
153
  command: "python3 .claude/hooks/pubnub_pre_tool_hook.py"
@@ -174,9 +168,9 @@ try {
174
168
  };
175
169
 
176
170
  fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
177
- console.log('āœ… Configured PubNub hooks in .claude/settings.json');
178
- console.log(' → PreToolUse: Publishes tool events to memory agent');
179
- console.log(' → UserPromptSubmit: Publishes prompts for preference extraction');
171
+ console.log('āœ… Configured hooks in .claude/settings.json');
172
+ console.log(' → PreToolUse: Enforces memory search before Write/Edit');
173
+ console.log(' → UserPromptSubmit: Captures prompts for preference extraction');
180
174
  }
181
175
  }
182
176
  } catch (error) {