| name | memory-keeper |
| description | Use to store durable context (decisions, facts, preferences, todos, summaries) and to recall or reply from it across sessions. Load when something worth remembering appears, or when the user asks what you were doing, what was decided, or to continue prior work. |
| model | inherit |
| effort | low |
| allowed-tools | ["Bash","Read"] |
| triggers | ["remember","what were we doing","what did we decide","continue where we left off","as I mentioned","keep this in mind"] |
| tags | ["memory","persistence","context"] |
Memory Keeper
A persistent, per-project memory store so context survives across sessions. It
stores structured JSONL plus a human-readable memory.md mirror, scoped by git
remote (or repo path) so one project's memory never leaks into another.
The store CLI lives at ${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs (in Cursor:
plugins/happy/hooks/memory.mjs). All commands are run with Bash.
Reply from memory FIRST
At session start the store's contents are injected into your context. When the
user asks "what were we doing", "what did we decide", "continue", or references
something from before:
- Answer from the injected Project memory if it's there.
- If you need more, pull it explicitly:
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" reply "auth flow"
Never ask the user to repeat something the store already knows.
Keep what matters — as it happens
When a durable item appears, store it immediately. Pick the right kind:
| kind | For |
|---|
decision | A choice made and why ("Chose JSONL over SQLite — zero deps"). |
fact | A stable truth about the project ("API base is /api/v2"). |
preference | How the user likes things ("Functional style, no classes"). |
todo | An open follow-up ("Add rate-limit to /login"). |
summary | A short state-of-play at the end of a work chunk. |
note | Anything else worth recalling. |
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" keep \
"Chose JSONL over SQLite for the store — zero deps, easy to diff" \
--kind decision --tags memory,arch
Guidelines:
- One idea per entry. Atomic entries recall better than paragraphs.
- Write it so future-you understands with no other context. Include the
"why", not just the "what".
- Don't store secrets, tokens, or raw credentials. Store the shape, not the value.
- Re-keeping identical text just refreshes its timestamp — safe to repeat.
Recall on demand
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" recall "database schema" --limit 8
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" recall "" --kind todo
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" recall "auth" --json
End-of-session summary
Before a session ends or context compacts, store a one-line summary and any new
todos so the next session resumes cleanly:
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" keep \
"Built memory store + hooks; skills next" --kind summary
Managing entries
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" list
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" forget <id>
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" forget --all
node "${CLAUDE_PLUGIN_ROOT}/hooks/memory.mjs" path
Storage
- Location:
$HAPPY_MEMORY_DIR, else $XDG_DATA_HOME/happy-memory, else
~/.local/share/happy-memory, under projects/<project-hash>/.
- Files:
memory.jsonl (source of truth), memory.md (readable mirror),
project.json (id/name/root).
- Stays local. Only you export it.
keep/forget are the only writers.