* fix: stop generating empty CLAUDE.md files - Return empty string instead of "No recent activity" when no observations exist - Skip writing CLAUDE.md files when formatted content is empty - Remove redundant "auto-generated by claude-mem" HTML comment - Clean up 98 existing empty CLAUDE.md files across the codebase - Update tests to expect empty string for empty input Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * build assets * refactor: implement in-process worker architecture for hooks Replaces spawn-based worker startup with in-process architecture: - Hook processes now become the worker when port 37777 is free - Eliminates Windows spawn issues (NO SPAWN rule) - SessionStart chains: smart-install && stop && context Key changes: - worker-service.ts: hook case starts WorkerService in-process - hook-command.ts: skipExit option prevents process.exit() when hosting worker - hooks.json: single chained command replaces separate start/hook commands - worker-utils.ts: ensureWorkerRunning() returns boolean, doesn't block - handlers: graceful fallback when worker unavailable All 761 tests pass. Manual verification confirms hook stays alive as worker. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * context * a * MAESTRO: Mark PR #722 test verification task complete All 797 tests passed (3 skipped, 0 failed) after merge conflict resolution. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * MAESTRO: Mark PR #722 build verification task complete * MAESTRO: Mark PR #722 code review task complete Code review verified: - worker-service.ts hook case starts WorkerService in-process - hook-command.ts has skipExit option - hooks.json uses single chained command - worker-utils.ts ensureWorkerRunning() returns boolean Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * MAESTRO: Mark PR #722 conflict resolution push task complete Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Claude-Mem Cursor Hooks Integration
Persistent AI Memory for Cursor - Free Options Available
Give your Cursor AI persistent memory across sessions. Your agent remembers what it worked on, the decisions it made, and the patterns in your codebase - automatically.
Why Claude-Mem?
- Remember context across sessions: No more re-explaining your codebase every time
- Automatic capture: MCP tools, shell commands, and file edits are logged without effort
- Free tier options: Works with Gemini (1500 free req/day) or OpenRouter (free models available)
- Works with or without Claude Code: Full functionality either way
Quick Install (5 minutes)
# Clone and build
git clone https://github.com/thedotmack/claude-mem.git
cd claude-mem && bun install && bun run build
# Interactive setup (configures provider + installs hooks)
bun run cursor:setup
Quick Start for Cursor Users
Using Claude Code? Skip to Installation - everything works automatically.
Cursor-only (no Claude Code)? See STANDALONE-SETUP.md for free-tier options using Gemini or OpenRouter.
Overview
The hooks bridge Cursor's hook system to claude-mem's worker API, allowing:
- Session Management: Initialize sessions and generate summaries
- Observation Capture: Record MCP tool usage, shell commands, and file edits
- Worker Readiness: Ensure the worker is running before prompt submission
Context Injection
Context is automatically injected via Cursor's Rules system:
- Install:
claude-mem cursor installgenerates initial context - Stop hook: Updates context in
.cursor/rules/claude-mem-context.mdcafter each session - Cursor: Automatically includes this rule in ALL chat sessions
The context updates after each session ends, so the next session sees fresh context.
Additional Access Methods
- MCP Tools: Configure claude-mem's MCP server for
search,timeline,get_observationstools - Web Viewer: Access context at
http://localhost:37777 - Manual Request: Ask the agent to search memory
See CONTEXT-INJECTION.md for details.
Installation
Quick Install (Recommended)
# Install globally for all projects (recommended)
claude-mem cursor install user
# Or install for current project only
claude-mem cursor install
Manual Installation
Click to expand manual installation steps
User-level (recommended - applies to all projects):
# Copy hooks.json to your home directory
cp cursor-hooks/hooks.json ~/.cursor/hooks.json
# Copy hook scripts
mkdir -p ~/.cursor/hooks
cp cursor-hooks/*.sh ~/.cursor/hooks/
chmod +x ~/.cursor/hooks/*.sh
Project-level (for per-project hooks):
# Copy hooks.json to your project
mkdir -p .cursor
cp cursor-hooks/hooks.json .cursor/hooks.json
# Copy hook scripts to your project
mkdir -p .cursor/hooks
cp cursor-hooks/*.sh .cursor/hooks/
chmod +x .cursor/hooks/*.sh
After Installation
-
Start the worker:
claude-mem start -
Restart Cursor to load the hooks
-
Verify installation:
claude-mem cursor status
Hook Mappings
| Cursor Hook | Script | Purpose |
|---|---|---|
beforeSubmitPrompt |
session-init.sh |
Initialize claude-mem session |
beforeSubmitPrompt |
context-inject.sh |
Ensure worker is running |
afterMCPExecution |
save-observation.sh |
Capture MCP tool usage |
afterShellExecution |
save-observation.sh |
Capture shell command execution |
afterFileEdit |
save-file-edit.sh |
Capture file edits |
stop |
session-summary.sh |
Generate summary + update context file |
How It Works
Session Initialization (session-init.sh)
- Called before each prompt submission
- Initializes a new session in claude-mem using
conversation_idas the session ID - Extracts project name from workspace root
- Outputs
{"continue": true}to allow prompt submission
Context Hook (context-inject.sh)
- Ensures claude-mem worker is running before session
- Outputs
{"continue": true}to allow prompt submission - Note: Context file is updated by
session-summary.sh(stop hook), not here
Observation Capture (save-observation.sh)
- Captures MCP tool executions and shell commands
- Maps them to claude-mem's observation format
- Sends to
/api/sessions/observationsendpoint (fire-and-forget)
File Edit Capture (save-file-edit.sh)
- Captures file edits made by the agent
- Treats edits as "write_file" tool usage
- Includes edit summaries in observations
Session Summary (session-summary.sh)
- Called when agent loop ends (stop hook)
- Requests summary generation from claude-mem
- Updates context file in
.cursor/rules/claude-mem-context.mdcfor next session
Configuration
The hooks read configuration from ~/.claude-mem/settings.json:
CLAUDE_MEM_WORKER_PORT: Worker port (default: 37777)CLAUDE_MEM_WORKER_HOST: Worker host (default: 127.0.0.1)
Dependencies
The hook scripts require:
jq- JSON processingcurl- HTTP requestsbash- Shell interpreter
Install on macOS: brew install jq curl
Install on Ubuntu: apt-get install jq curl
Troubleshooting
Hooks not executing
-
Check hooks are in the correct location:
ls .cursor/hooks.json # Project-level ls ~/.cursor/hooks.json # User-level -
Verify scripts are executable:
chmod +x ~/.cursor/hooks/*.sh -
Check Cursor Settings → Hooks tab for configuration status
-
Check Hooks output channel in Cursor for error messages
Worker not responding
-
Verify worker is running:
curl http://127.0.0.1:37777/api/readiness -
Check worker logs:
tail -f ~/.claude-mem/logs/worker-$(date +%Y-%m-%d).log -
Restart worker:
claude-mem restart
Observations not being saved
-
Monitor worker logs for incoming requests
-
Verify session was initialized via web viewer at
http://localhost:37777 -
Test observation endpoint directly:
curl -X POST http://127.0.0.1:37777/api/sessions/observations \ -H "Content-Type: application/json" \ -d '{"contentSessionId":"test","tool_name":"test","tool_input":{},"tool_response":{},"cwd":"/tmp"}'
Comparison with Claude Code Integration
| Feature | Claude Code | Cursor |
|---|---|---|
| Session Initialization | ✅ SessionStart hook |
✅ beforeSubmitPrompt hook |
| Context Injection | ✅ additionalContext field |
✅ Auto-updated .cursor/rules/ file |
| Observation Capture | ✅ PostToolUse hook |
✅ afterMCPExecution, afterShellExecution, afterFileEdit |
| Session Summary | ✅ Stop hook with transcript |
⚠️ stop hook (no transcript) |
| MCP Search Tools | ✅ Full support | ✅ Full support (if MCP configured) |
Files
hooks.json- Hook configurationcommon.sh- Shared utility functionssession-init.sh- Session initializationcontext-inject.sh- Context/worker readiness hooksave-observation.sh- MCP and shell observation capturesave-file-edit.sh- File edit observation capturesession-summary.sh- Summary generationcursorrules-template.md- Template for.cursorrulesfile