cursor-hooks/README.md
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.
# 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
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.
The hooks bridge Cursor's hook system to claude-mem's worker API, allowing:
Context is automatically injected via Cursor's Rules system:
claude-mem cursor install generates initial context.cursor/rules/claude-mem-context.mdc after each sessionThe context updates after each session ends, so the next session sees fresh context.
search, timeline, get_observations toolshttp://localhost:37777See CONTEXT-INJECTION.md for details.
# Install globally for all projects (recommended)
claude-mem cursor install user
# Or install for current project only
claude-mem cursor install
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
Start the worker:
claude-mem start
Restart Cursor to load the hooks
Verify installation:
claude-mem cursor status
| 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 |
session-init.sh)conversation_id as the session ID{"continue": true} to allow prompt submissioncontext-inject.sh){"continue": true} to allow prompt submissionsession-summary.sh (stop hook), not heresave-observation.sh)/api/sessions/observations endpoint (fire-and-forget)save-file-edit.sh)session-summary.sh).cursor/rules/claude-mem-context.mdc for next sessionThe 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)The hook scripts require:
jq - JSON processingcurl - HTTP requestsbash - Shell interpreterInstall on macOS: brew install jq curl
Install on Ubuntu: apt-get install jq curl
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
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
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"}'
| 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) |
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 .cursorrules file