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.