- SKILL.md invoked every script through ~/.claude/skills/ck, which does
not exist when ck is installed as part of the ECC plugin, so every
/ck:* command failed with MODULE_NOT_FOUND. Use ${CLAUDE_SKILL_DIR}
and tell non-Claude hosts to substitute the skill directory. Scripts
still run from the project directory, since they use it as the
project path.
- The documented SessionStart command quoted "~/...", which the shell
never expands. Use $HOME and explain the plugin-install case.
- /ck:init and /ck:save piped JSON through echo '<json>'. Any apostrophe
ends the quoted string, and init JSON carries README/package.json
text. Pass it through a quoted heredoc instead.
- session-start.mjs and shared.mjs resolve SKILL.md next to the code
(import.meta.url), and the hook expands ${CLAUDE_SKILL_DIR} in the
text it injects.
- encodeProjectPath only replaced '/', while Claude Code maps every
non-alphanumeric character to '-'. Memory entries for projects whose
path has a space or dot went to a directory Claude Code never reads.
Signed-off-by: Wen <jwcastillo@gmail.com>
(cherry picked from commit c920005c2b)
5.7 KiB
name, description, metadata, author, repo
| name | description | metadata | author | repo | ||||
|---|---|---|---|---|---|---|---|---|
| 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. |
|
sreedhargs89 | 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 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
~/.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 "${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 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 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 Briefing
node "${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 Snapshot
node "${CLAUDE_SKILL_DIR}/commands/info.mjs" [arg]
Display output verbatim. No follow-up question.
/ck:list — Portfolio View
node "${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 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 "${CLAUDE_SKILL_DIR}/commands/forget.mjs" [name]
Display confirmation verbatim.
/ck:migrate — Convert v1 Data to v2
node "${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.
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:
{
"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.
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{}.