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. Use when a project needs context to survive across Cl
By affaan-m · 2,835 installs
npx skills add affaan-m/ecc --skill ck
Source repository · Upstream listing
ck — 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 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.
Data Layout
Commands
/ck:init — Register a Project
The script outputs JSON with auto detected info. Present it as a confirmation draft:
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):
Confirmed JSON schema: {"name":"...","path":"...","description":"...","stack":["..."],"goal":"...","constraints":["..."],"repo":"..." }
/ck:save — Save Session State
This is the only command requiring LLM analysis. Analyze the current conversation:
summary : one sentence, max 10 words, what was accomplished
leftOff : what was actively being worked on (specific file/feature/bug)
nextSteps : ordered array of concrete next steps
decisions : array of {what, why} for decisions made this session
blockers : array of current blockers (empty array if none)
goal : updated goal string only if it changed this session , else omit
Show 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:
JSON schema (exact): {"summary":"...","leftOff":"...","nextSteps":["..."],"decisions":[{"what":"...","why":"..."}],"blockers":["..."]}
Display the script's stdout confirmation verbatim.
/ck:resume [name number] — Full Briefing
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
Display output verbatim. No follow up question.
/ck:list — Portfolio View
Display output verbatim. If user replies with a number or name → run /ck:resume .
/ck:forget [name number] — Remove a Project
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:
Display confirmation verbatim.
/ck:migrate — Convert v1 Data to v2
For a dry run first:
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 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 :
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.
Rules
Always expand ~ as $HOME in Bash calls.
Commands are case insensitive: /CK:SAVE , /ck:save , /Ck:Save all work.
If a script exits with code 1, display its stdout as an error message.
Never edit context.json or CONTEXT.md directly — always use the scripts.
If projects.json is malformed, tell the user and offer to reset it to {} .