ck
affaan-m/everything-claude-code
Persistent per-project memory for Claude Code with auto-loaded context and deterministic session tracking.
What is ck?
Context Keeper maintains structured project memory across 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-load project context on session start via SessionStart hook
- Save session summaries, decisions, blockers, and next steps to persistent JSON
- Resume full briefings or quick snapshots of any tracked project
- Track git activity and detect unsaved sessions since last save
- Run deterministic Node.js scripts for consistent behavior across model versions
- Migrate legacy v1 context data to v2 structured format
How to install ck
npx skills add https://github.com/affaan-m/everything-claude-code --skill ck- Node.js installed
- SessionStart hook registered in ~/.claude/settings.json (optional but recommended for auto-load)
How to use ck
- 1.Run `/ck:init` to register a new project and confirm auto-detected metadata
- 2.Work on your project normally
- 3.Run `/ck:save` at the end of a session to capture summary, decisions, blockers, and next steps
- 4.Run `/ck:resume [name]` at the start of a new session to load full context
- 5.Use `/ck:list` to view all tracked projects and `/ck:info [name]` for quick snapshots
- 6.Run `/ck:forget [name]` to remove a project from tracking
Use cases
- Resume a multi-session project without re-explaining the entire codebase
- Track architectural decisions and constraints across team members or time
- Detect when you've made progress but haven't saved context, prompting a save
- Maintain a portfolio of active projects and switch between them quickly
- Preserve blockers and next steps so context isn't lost between sessions
- Claude Code users managing multiple projects
- Teams needing persistent project memory across sessions
- Developers working on long-running features or refactors
- Anyone wanting deterministic, model-agnostic session state
ck FAQ
No. Never edit them directly — always use the `/ck:*` commands. The scripts handle all updates.
Context won't auto-load on session start, but you can still manually run `/ck:resume` to load it. The hook is optional but recommended.
Yes. Run `/ck:migrate --dry-run` first to preview changes, then `/ck:migrate` to convert. Original v1 files are backed up.
Approximately 100 tokens per session — a compact 5-line summary designed to be lightweight while preserving essential state.
The skill will alert you and offer to reset it to an empty object `{}`. You can then re-register projects with `/ck:init`.
Full instructions (SKILL.md)
Source of truth, from affaan-m/everything-claude-code.
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/everything-claude-code and the wider catalog.

security-review
Security checklist and patterns for authentication, input validation, secrets, and sensitive features.

golang-patterns
Idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable applications.

coding-standards
Baseline coding conventions for naming, readability, immutability, and quality across projects.

frontend-patterns
React and Next.js patterns for components, state management, performance, and modern frontend practices.

backend-patterns
REST/GraphQL API design, database optimization, and server-side patterns for Node.js, Express, and Next.js.

golang-testing
Go testing patterns: table-driven tests, subtests, benchmarks, fuzzing, and TDD methodology.