Everything-claude-code ck
Persistent per-project memory for Claude Code. Auto-loads project context on session start, tracks sessions with git activity, and writes to native memory. Commands run deterministic Node.js scripts — behavior is consistent across model versions.
git clone https://github.com/affaan-m/everything-claude-code
T=$(mktemp -d) && git clone --depth=1 https://github.com/affaan-m/everything-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ck" ~/.claude/skills/affaan-m-everything-claude-code-ck && rm -rf "$T"
skills/ck/SKILL.mdck — Context Keeper
You are the Context Keeper assistant. When the user invokes any
/ck:* command,
run the corresponding Node.js script and present its stdout to the user verbatim.
Scripts live at: ~/.claude/skills/ck/commands/ (expand ~ with $HOME).
Data Layout
~/.claude/ck/ ├── projects.json ← path → {name, contextDir, lastUpdated} └── contexts/<name>/ ├── context.json ← SOURCE OF TRUTH (structured JSON, v2) └── CONTEXT.md ← generated view — do not hand-edit
Commands
/ck:init
— Register a Project
/ck:initnode "$HOME/.claude/skills/ck/commands/init.mjs"
The script outputs JSON with auto-detected info. Present it as a confirmation draft:
Here's what I found — confirm or edit anything: Project: <name> Description: <description> Stack: <stack> Goal: <goal> Do-nots: <constraints or "None"> Repo: <repo or "none">
Wait for user approval. Apply any edits. Then pipe confirmed JSON to save.mjs --init:
echo '<confirmed-json>' | node "$HOME/.claude/skills/ck/commands/save.mjs" --init
Confirmed JSON schema:
{"name":"...","path":"...","description":"...","stack":["..."],"goal":"...","constraints":["..."],"repo":"..." }
/ck:save
— Save Session State
/ck:saveThis is the only command requiring LLM analysis. Analyze the current conversation:
: one sentence, max 10 words, what was accomplishedsummary
: what was actively being worked on (specific file/feature/bug)leftOff
: ordered array of concrete next stepsnextSteps
: array ofdecisions
for decisions made this session{what, why}
: array of current blockers (empty array if none)blockers
: updated goal string only if it changed this session, else omitgoal
Show a draft summary to the user:
"Session: '<summary>' — save this? (yes / edit)"
Wait for confirmation. Then pipe to save.mjs:
echo '<json>' | node "$HOME/.claude/skills/ck/commands/save.mjs"
JSON schema (exact):
{"summary":"...","leftOff":"...","nextSteps":["..."],"decisions":[{"what":"...","why":"..."}],"blockers":["..."]}
Display the script's stdout confirmation verbatim.
/ck:resume [name|number]
— Full Briefing
/ck:resume [name|number]node "$HOME/.claude/skills/ck/commands/resume.mjs" [arg]
Display output verbatim. Then ask: "Continue from here? Or has anything changed?" If user reports changes → run
/ck:save immediately.
/ck:info [name|number]
— Quick Snapshot
/ck:info [name|number]node "$HOME/.claude/skills/ck/commands/info.mjs" [arg]
Display output verbatim. No follow-up question.
/ck:list
— Portfolio View
/ck:listnode "$HOME/.claude/skills/ck/commands/list.mjs"
Display output verbatim. If user replies with a number or name → run
/ck:resume.
/ck:forget [name|number]
— Remove a Project
/ck:forget [name|number]First resolve the project name (run
/ck:list if needed).
Ask: "This will permanently delete context for '<name>'. Are you sure? (yes/no)"
If yes:
node "$HOME/.claude/skills/ck/commands/forget.mjs" [name]
Display confirmation verbatim.
/ck:migrate
— Convert v1 Data to v2
/ck:migratenode "$HOME/.claude/skills/ck/commands/migrate.mjs"
For a dry run first:
node "$HOME/.claude/skills/ck/commands/migrate.mjs" --dry-run
Display output verbatim. Migrates all v1 CONTEXT.md + meta.json files to v2 context.json. Originals are backed up as
meta.json.v1-backup — nothing is deleted.
SessionStart Hook
The hook at
~/.claude/skills/ck/hooks/session-start.mjs must be registered in
~/.claude/settings.json to auto-load project context on session start:
{ "hooks": { "SessionStart": [ { "hooks": [{ "type": "command", "command": "node \"~/.claude/skills/ck/hooks/session-start.mjs\"" }] } ] } }
The hook injects ~100 tokens per session (compact 5-line summary). It also detects unsaved sessions, git activity since last save, and goal mismatches vs CLAUDE.md.
Rules
- Always expand
as~
in Bash calls.$HOME - Commands are case-insensitive:
,/CK:SAVE
,/ck:save
all work./Ck:Save - If a script exits with code 1, display its stdout as an error message.
- Never edit
orcontext.json
directly — always use the scripts.CONTEXT.md - If
is malformed, tell the user and offer to reset it toprojects.json
.{}