ck
affaan-m/ecc
Persistent per-project memory for Claude Code with auto-loaded context and git-aware session tracking.
What is ck?
Context Keeper maintains structured project memory across Claude Code sessions, auto-loading context on startup and tracking work via git activity. Use it to preserve project state, decisions, and next steps without manual context-switching.
- Auto-loads project context on session start via SessionStart hook
- Tracks session history with git activity detection
- Saves session summaries, decisions, blockers, and next steps
- Provides quick snapshots or full briefings of project state
- Manages multiple projects with portfolio view
- Migrates legacy v1 context data to v2 format
How to install ck
npx skills add null --skill ck- Node.js installed
- Claude Code with skill installation support
- ~/.claude/settings.json configured with SessionStart hook
How to use ck
- 1.Run `/ck:init` to register your current project and confirm auto-detected stack, goal, and constraints
- 2.Work on your project normally
- 3.Run `/ck:save` at session end to record summary, decisions, blockers, and next steps
- 4.Run `/ck:resume` or `/ck:info` at session start to load full briefing or quick snapshot
- 5.Use `/ck:list` to view all registered projects and switch between them
- 6.Run `/ck:forget [name]` to remove a project's context
Use cases
- Resume multi-day projects without re-explaining context
- Track architectural decisions and constraints across sessions
- Identify blockers and next steps from previous work
- Switch between multiple projects and recall each one's state
- Preserve work progress when Claude Code sessions restart
- Claude Code users managing long-running projects
- Teams coordinating work across multiple sessions
- Developers working on complex codebases requiring context retention
ck FAQ
The SessionStart hook will detect unsaved sessions and git activity on next startup, but you'll lose the structured summary, decisions, and blockers unless you save explicitly.
No — always use the `/ck:save` and `/ck:init` commands. Direct edits may break the data structure.
Run `/ck:migrate --dry-run` first to preview changes, then `/ck:migrate` to convert all v1 CONTEXT.md and meta.json files. Originals are backed up.
The skill will detect malformation and offer to reset it to an empty object `{}`. You can then re-register projects.
No — context is stored locally in `~/.claude/ck/`. To share context, you'd need to manually export and merge context.json files.
Full instructions (SKILL.md)
Source of truth, from affaan-m/ecc.
name: ck description: 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. metadata: origin: community version: 2.0.0 author: sreedhargs89 repo: https://github.com/sreedhargs89/context-keeper
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 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
node "$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
This 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 omit
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
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
node "$HOME/.claude/skills/ck/commands/info.mjs" [arg]
Display output verbatim. No follow-up question.
/ck:list — Portfolio View
node "$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
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
node "$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$HOMEin Bash calls. - Commands are case-insensitive:
/CK:SAVE,/ck:save,/Ck:Saveall work. - If a script exits with code 1, display its stdout as an error message.
- Never edit
context.jsonorCONTEXT.mddirectly — always use the scripts. - If
projects.jsonis malformed, tell the user and offer to reset it to{}.
Related skills
More from affaan-m/ecc and the wider catalog.
claude-api
Agent skill from affaan-m/ecc.
claude-devfleet
Orchestrate parallel Claude Code agents on coding tasks with dependency chains and isolated worktrees.
click-path-audit
Trace button handlers through state changes to find bugs where functions cancel each other out or leave UI inconsistent.
clickhouse-io
ClickHouse patterns for high-performance analytics, query optimization, and data engineering.
code-tour
Create CodeTour `.tour` files with real file anchors for guided codebase walkthroughs.
codebase-onboarding
Analyze unfamiliar codebases and generate structured onboarding guides with architecture maps and CLAUDE.md.