8cb4f09ded
Six independent fixes that make hook behaviour deterministic, debuggable, and free of silent footguns. Persist session_id in stored memories on_pre_compact.py now extracts session_id from the hook input and writes it under metadata.session_id, enabling search-by-session. Skip SessionStart bootstrap when MEM0_API_KEY is missing on_session_start.sh exits 0 early instead of emitting bootstrap text that instructs the agent to call mem0 MCP tools that would all fail without a key. Tighten block_memory_write.sh regex The old `*/memory/*.md` pattern blocked legitimate paths like docs/memory/architecture.md. New pattern blocks `*/MEMORY.md` and `*/.claude/memory/*` only -- the actual surfaces we want to protect. Opt-in debug logging via MEM0_DEBUG=1 Each hook (bash + python) redirects stderr / adds a FileHandler to ~/.mem0/hooks.log when MEM0_DEBUG is set. No helper module, no rotation -- KISS. Default behaviour is unchanged. Drop the duplicate PreCompact registration hooks.json and cursor-hooks.json had on_pre_compact.sh AND on_pre_compact.py registered on PreCompact, producing duplicate session-state writes. Drop the python entry. The python script stays alive -- on_stop.sh still spawns it as a session-end safety net. CI nudge Adds a single comment line to pyproject.toml because the repo's ci.yml path filters exclude mem0-plugin/-only PRs but the build_mem0/build_embedchain status checks are required by branch protection. Track the proper fix (path-conditional CI) as a follow-up.
65 lines
2.1 KiB
Bash
Executable File
65 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Hook: SessionStart (matcher: startup|resume|compact)
|
|
#
|
|
# Bootstraps mem0 context at the start of every session.
|
|
# Output becomes part of Claude's context so it calls mem0 MCP tools.
|
|
#
|
|
# Input: JSON on stdin with session_id, source, transcript_path, model, cwd
|
|
# Output: Text injected into Claude's context (exit 0)
|
|
|
|
# Intentionally omit -e so the script always outputs a bootstrap prompt
|
|
# even if jq is missing or stdin is malformed.
|
|
set -uo pipefail
|
|
|
|
if [ -n "${MEM0_DEBUG:-}" ]; then
|
|
mkdir -p "$HOME/.mem0" && exec 2>>"$HOME/.mem0/hooks.log"
|
|
fi
|
|
|
|
# Skip the bootstrap entirely if no API key is configured -- the agent
|
|
# would otherwise be told to call mem0 MCP tools that will all fail.
|
|
if [ -z "${MEM0_API_KEY:-}" ]; then
|
|
exit 0
|
|
fi
|
|
|
|
INPUT=$(cat)
|
|
SOURCE=$(echo "$INPUT" | jq -r '.source // "startup"' 2>/dev/null || echo "startup")
|
|
|
|
if [ "$SOURCE" = "startup" ]; then
|
|
cat <<'EOF'
|
|
## Mem0 Session Bootstrap
|
|
|
|
You have access to persistent memory via the mem0 MCP tools. Before doing anything else:
|
|
|
|
1. Call `search_memories` with a query related to the current project or user request to load relevant context.
|
|
2. Review the returned memories to understand what has been learned in prior sessions.
|
|
3. If appropriate, call `get_memories` to browse all stored memories for this user.
|
|
|
|
IMPORTANT: Do NOT skip this step. Always bootstrap context first.
|
|
EOF
|
|
|
|
elif [ "$SOURCE" = "resume" ]; then
|
|
cat <<'EOF'
|
|
## Mem0 Session Resumed
|
|
|
|
This is a resumed session. Your prior context is already loaded. Before continuing:
|
|
|
|
1. Call `search_memories` with a query related to the current task to refresh relevant memories.
|
|
2. If significant time has passed, search for recent project-wide updates.
|
|
|
|
Continue where you left off.
|
|
EOF
|
|
|
|
elif [ "$SOURCE" = "compact" ]; then
|
|
cat <<'EOF'
|
|
## Mem0 Post-Compaction Recovery
|
|
|
|
Context was just compacted. You may have lost important session context.
|
|
|
|
1. Call `search_memories` with queries related to what you were working on to reload relevant knowledge.
|
|
2. Check for any session state memories that were saved before compaction.
|
|
3. Continue working based on the recovered context.
|
|
EOF
|
|
fi
|
|
|
|
exit 0
|