# MemPalace Hooks — Auto-Save for Terminal AI Tools These hook scripts make MemPalace save automatically. No manual "save" commands needed. This file covers the **Claude Code** and **Codex CLI** hooks that live flat under `hooks/`. For the **Cursor IDE** hooks, see [`hooks/cursor/README.md`](cursor/README.md) or the rendered docs at [`website/guide/cursor-hooks.md`](../website/guide/cursor-hooks.md). The two are additive and share the same `~/.mempalace/hook_state/` directory. If you are trying to protect existing Claude Code transcripts immediately, use the short checklist first: [`website/guide/claude-code-retention.md`](../website/guide/claude-code-retention.md). It covers hook wiring, JSONL backup, and one-time backfill. ## What They Do | Hook | When It Fires | What Happens | |------|--------------|-------------| | **Save Hook** | Every 15 human messages | Auto-mines transcript (tool output included), then blocks the AI to save topics/decisions/quotes | | **SessionEnd Hook** | Clean session exit | Backgrounds a final transcript mine (when a transcript exists) so short sessions aren't lost; returns immediately so teardown is never delayed. A lightweight diary checkpoint is written in the detached child. | | **PreCompact Hook** | Right before context compaction | Auto-mines transcript, then emergency save — forces the AI to save EVERYTHING before losing context | **Two-layer capture:** Hooks auto-mine the JSONL transcript directly into the palace (capturing raw tool output — Bash results, search findings, build errors). They also block the AI with a reason message telling it to save verbatim tool output and key context. Belt and suspenders — tool output gets stored even if the AI summarizes instead of quoting. ## Install — Claude Code Add to `.claude/settings.local.json`: ```json { "hooks": { "Stop": [{ "matcher": "*", "hooks": [{ "type": "command", "command": "/absolute/path/to/hooks/mempal_save_hook.sh", "timeout": 30 }] }], "SessionEnd": [{ "hooks": [{ "type": "command", "command": "/absolute/path/to/hooks/mempal_session_end_hook.sh", "timeout": 10 }] }], "PreCompact": [{ "hooks": [{ "type": "command", "command": "/absolute/path/to/hooks/mempal_precompact_hook.sh", "timeout": 30 }] }] } } ``` `SessionEnd` runs once on a clean exit and backgrounds its work, so it returns instantly and stays within Claude Code's SessionEnd budget. Wired through `settings.local.json` (above) the `timeout` can raise that budget; the bundled plugin cannot, which is why the hook backgrounds rather than mining in the foreground. Make them executable: ```bash chmod +x hooks/mempal_save_hook.sh hooks/mempal_session_end_hook.sh hooks/mempal_precompact_hook.sh ``` ## Install — Antigravity (Google) The Antigravity integration lives in its own subdirectory because the wire format (camelCase JSON, `injectSteps[]` output) and event names (`Stop`, `PreInvocation`) are Antigravity-specific. Use the dedicated installer: ```bash bash hooks/antigravity/install.sh ``` This installs to `~/.gemini/config/plugins/mempalace/`, registers the MCP server, ships the `mempalace` skill, and wires the Stop + PreInvocation hooks. See [`hooks/antigravity/README.md`](antigravity/README.md) for the full guide and [`hooks/antigravity/INVESTIGATION.md`](antigravity/INVESTIGATION.md) for the source-of-truth audit of which Antigravity surfaces the integration uses. ## Install — Codex CLI (OpenAI) Add to `.codex/hooks.json`: ```json { "Stop": [{ "type": "command", "command": "/absolute/path/to/hooks/mempal_save_hook.sh", "timeout": 30 }], "PreCompact": [{ "type": "command", "command": "/absolute/path/to/hooks/mempal_precompact_hook.sh", "timeout": 30 }] } ``` **Other harnesses:** the clean-exit save runs through the harness-agnostic `mempalace hook run --hook session-end` entry point. This release wires it for Claude Code. Antigravity exposes no dedicated session-end event (its lifecycle hooks are PreToolUse/PostToolUse/PreInvocation/PostInvocation/Stop, and MemPalace already saves there via `Stop`); Cursor and Codex can adopt the same entry point as a follow-up wherever their own session-end event is available. ## Configuration Edit `mempal_save_hook.sh` to change: - **`SAVE_INTERVAL=15`** — How many human messages between saves. Lower = more frequent saves, higher = less interruption. - **`STATE_DIR`** — Where hook state is stored (defaults to `~/.mempalace/hook_state/`) - **`MEMPAL_DIR`** — Optional **project directory** (code, notes, docs) to also mine on each save trigger, with `--mode projects`. The hook ALWAYS mines the active conversation transcript automatically with `--mode convos` — `MEMPAL_DIR` is purely additive, never an override. Leave blank if you don't want to ingest project files. - **`MEMPALACE_PYTHON`** — Optional env var. Python interpreter with mempalace + chromadb installed. Auto-detects: `MEMPALACE_PYTHON` env var → repo `venv/bin/python3` → system `python3`. Set this if your venv is in a non-standard location. ### Disabling Auto-Save (Silent Mode) To keep hooks installed but disable auto-save blocking entirely, set `hooks.auto_save` to `false` in your config: **Option 1 — config file** (`~/.mempalace/config.json`): ```json { "hooks": { "auto_save": false } } ``` **Option 2 — environment variable:** ```bash export MEMPALACE_HOOKS_AUTO_SAVE=false ``` When disabled, both the stop hook and precompact hook pass through without blocking. You can still save manually with `mempalace mine