Catalog
affaan-m/ck

Persistent per-project memory for Claude Code (Context Keeper) driven by deterministic Node.js /ck commands: init, save, resume, info, list, forget, and v1-to-v2 migrate, plus a SessionStart hook that injects a compact project brief. Use when context must survive across sessions, saving session state with next steps and decisions, resuming where a previous session left off, or picking up a project without re-explaining it.

NewUpdated Sep 27, 2026

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 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 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 $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 {}.
Files10
10 files · 49.1 KB

Select a file to preview

Overall Score

82/100

Grade

B

Good

Grades are signals, not a certification. Always review a skill yourself before use.

Safety

80

Quality

85

Clarity

88

Completeness

76

Summary

Context Keeper (ck) is a persistent per-project memory system for Claude Code that stores session state, decisions, and project context across sessions. It provides seven Node.js-driven commands (/ck:init, /ck:save, /ck:resume, /ck:info, /ck:list, /ck:forget, /ck:migrate) and a SessionStart hook to auto-inject compact project briefs, enabling users to resume work without re-explaining project context.

Detected Capabilities

file read (context.json, projects.json, CONTEXT.md)file write (context.json, CONTEXT.md, projects.json, backup files)node.js script execution (deterministic commands in ~/.claude/skills/ck/commands/)json parsing and generationfilesystem operations (directory creation, file deletion, backups)git activity detection (mentioned in hook description)shell execution via node child_process

Trigger Keywords

Phrases that agents use to match this skill to user intent.

resume interrupted sessionsave session contextpersistent project memorycontext between sessionsproject checkpointsession resumptionmultiday project memory

Risk Signals

INFO

Writes to user home directory (~/.claude/ck/) for persistent storage

Data Layout section, all command descriptions
WARNING

Deletes project contexts without undo (forget.mjs command)

forget.mjs invocation, /ck:forget section
INFO

Backups created during migration (v1-backup) but user instructed originals are not deleted

/ck:migrate section
INFO

SessionStart hook auto-loads on every session without explicit user invocation

SessionStart Hook section
WARNING

Script execution from user-writable ~/.claude/ directory — potential supply chain risk if directory is compromised

All command invocations expand $HOME/.claude/skills/ck/commands/

Referenced Domains

External domains referenced in skill content, detected by static analysis.

github.com

Use Cases

  • /ck:init — Register a new project to track, auto-detecting stack and goals
  • /ck:save — Checkpoint session state with summary, next steps, and decisions made
  • /ck:resume — Load full project briefing from a previous session to continue work
  • /ck:info — Quick snapshot of a project's current state without full briefing
  • /ck:list — View all tracked projects and pick one to resume
  • /ck:forget — Permanently remove project context when no longer needed
  • /ck:migrate — Convert legacy v1 context files (CONTEXT.md + meta.json) to v2 format
  • SessionStart hook — Auto-load project context on session start with compact 5-line summary

Quality Notes

  • Excellent structure: clear command reference with exact JSON schemas and example invocations
  • Data model is well-documented with source-of-truth clarity (context.json is authoritative, CONTEXT.md is generated view)
  • Comprehensive rules section covers edge cases (malformed projects.json, case-insensitivity, error handling via exit codes)
  • SessionStart hook is intelligently designed: detects unsaved sessions, git activity, goal mismatches, and injects only ~100 tokens per session for efficiency
  • Migration strategy is safe: v1 backups are created before conversion, originals preserved
  • Minor: File manifest lists .mjs files but does not include their content — script implementations cannot be reviewed for security or logic errors
  • Minor: No example of what a saved context.json actually looks like (schema provided but not instantiated example)
  • Good: SessionStart hook registration documented with exact JSON structure for settings.json
Model: claude-haiku-4-5-20251001Analyzed: Sep 27, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

  1. v3.0

    Contract changed: description

    ✦ AIReframes skill purpose to emphasize deterministic Node.js /ck commands (init, save, resume, info, list, forget, migrate) and SessionStart hook; clarifies contract for context persistence.

    triggering2026-09-27

    LATEST
  2. v2.0

    Contract changed: description

    ✦ AIClarifies skill activation trigger: added guidance that skill should be used when project context must persist across Claude Code sessions.

    triggering2026-09-09

    View This Version
  3. v1.2

    Content updated

    ✦ AINo material changes detected.

    2026-07-14

    View This Version
  4. v1.1

    Content updated

    ✦ AIAdds 8 command modules and session-start hook for state management and persistence workflows.

    2026-04-20

    View This Version
  5. v1.0

    2026-04-12

    View This VersionInitial version

Use affaan-m/ck in your dev environment

Command Palette

Search for a command to run...