This gives Claude persistent memory for each of your projects by running deterministic Node.js scripts instead of relying on the LLM to remember context. You init a project once, then /ck:save after each session to log what you did, what's next, and any decisions made. When you return, /ck:resume loads everything back in. The session start hook auto-injects context (about 100 tokens) and warns you if there's been git activity since your last save. It's overkill if you're just tinkering, but if you're juggling multiple codebases or returning to projects after weeks away, having a structured state log beats trying to reconstruct what you were doing from commit messages. The v2 format stores everything in JSON instead of markdown, so it's machine-readable if you want to build on it.
$ npx -y skills add affaan-m/everything-claude-code --skill ck --agent claude-codeInstalls into .claude/skills of the current project.
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 in the commands/ directory next to this SKILL.md (for example
~/.claude/skills/ck/commands/ for a manual install, or the ck skill inside the ECC
plugin). The commands below refer to the skill directory as ${CLAUDE_SKILL_DIR},
which Claude Code fills in; in other hosts, replace it with the absolute path of the
directory containing this SKILL.md. Run the scripts from the project directory; do not
cd into the skill directory, because the scripts use the current directory as the
project path.
~/.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
/ck:init — Register a Projectnode "${CLAUDE_SKILL_DIR}/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 pass the confirmed JSON to save.mjs --init
through a quoted heredoc (never echo '...': an apostrophe in any field would end the
quoted string and hand the rest to the shell):
node "${CLAUDE_SKILL_DIR}/commands/save.mjs" --init <<'CK_JSON'
<confirmed-json>
CK_JSON
Confirmed JSON schema: {"name":"...","path":"...","description":"...","stack":["..."],"goal":"...","constraints":["..."],"repo":"..." }
/ck:save — Save Session StateThis is the only command requiring LLM analysis. Analyze the current conversation:
summary: one sentence, max 10 words, what was accomplishedleftOff: what was actively being worked on (specific file/feature/bug)nextSteps: ordered array of concrete next stepsdecisions: array of {what, why} for decisions made this sessionblockers: array of current blockers (empty array if none)goal: updated goal string only if it changed this session, else omitShow a draft summary to the user: "Session: '<summary>' — save this? (yes / edit)"
Wait for confirmation. Then pass the JSON to save.mjs through a quoted heredoc:
node "${CLAUDE_SKILL_DIR}/commands/save.mjs" <<'CK_JSON'
<json>
CK_JSON
JSON schema (exact): {"summary":"...","leftOff":"...","nextSteps":["..."],"decisions":[{"what":"...","why":"..."}],"blockers":["..."]}
Display the script's stdout confirmation verbatim.
/ck:resume [name|number] — Full Briefingnode "${CLAUDE_SKILL_DIR}/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 Snapshotnode "${CLAUDE_SKILL_DIR}/commands/info.mjs" [arg]
Display output verbatim. No follow-up question.
/ck:list — Portfolio Viewnode "${CLAUDE_SKILL_DIR}/commands/list.mjs"
Display output verbatim. If user replies with a number or name → run /ck:resume.
/ck:forget [name|number] — Remove a ProjectFirst 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 "${CLAUDE_SKILL_DIR}/commands/forget.mjs" [name]
Display confirmation verbatim.
/ck:migrate — Convert v1 Data to v2node "${CLAUDE_SKILL_DIR}/commands/migrate.mjs"
For a dry run first:
node "${CLAUDE_SKILL_DIR}/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.
The hook at hooks/session-start.mjs in this skill's directory must be registered in
~/.claude/settings.json to auto-load project context on session start. For a manual
install in ~/.claude/skills/ck:
{
"hooks": {
"SessionStart": [
{ "hooks": [{ "type": "command", "command": "node \"$HOME/.claude/skills/ck/hooks/session-start.mjs\"" }] }
]
}
}
Use $HOME, not ~: the shell does not expand ~ inside double quotes. If ck lives
elsewhere (for example inside the ECC plugin), use the absolute path of its
hooks/session-start.mjs instead.
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.
~ as $HOME in Bash calls./CK:SAVE, /ck:save, /Ck:Save all work.context.json or CONTEXT.md directly — always use the scripts.projects.json is malformed, tell the user and offer to reset it to {}.Sponsors