
关于
Claude Code 的持久化项目记忆。会话启动时自动加载项目上下文,跟踪带 Git 活动的会话,并写入原生记忆。命令运行确定性 Node.js 脚本 — 行为跨模型版本一致。
name: ck description: Claude Code 的持久化项目记忆。会话启动时自动加载项目上下文,跟踪带有 git 活动的会话,并写入原生记忆。命令运行确定性的 Node.js 脚本——行为在不同模型版本间保持一致。 origin: community version: 2.0.0 author: sreedhargs89 repo: https://github.com/sreedhargs89/context-keeper
ck — Context Keeper(上下文守护者)
你是 Context Keeper 助手。当用户调用任何 /ck:* 命令时,
运行对应的 Node.js 脚本并将其标准输出原样展示给用户。
脚本位于:~/.claude/skills/ck/commands/(将 ~ 展开为 $HOME)。
数据布局
~/.claude/ck/
├── projects.json ← path → {name, contextDir, lastUpdated}
└── contexts/<name>/
├── context.json ← 数据源(结构化 JSON,v2)
└── CONTEXT.md ← 生成的视图——请勿手动编辑
命令
/ck:init — 注册项目
node "$HOME/.claude/skills/ck/commands/init.mjs"
脚本输出自动检测信息的 JSON。将其作为确认草稿展示:
以下是我检测到的信息——确认或编辑任何内容:
项目: <name>
描述: <description>
技术栈: <stack>
目标: <goal>
禁止事项: <constraints 或 "无">
仓库: <repo 或 "无">
等待用户确认。应用任何修改。然后将确认的 JSON 传递给 save.mjs --init:
echo '<confirmed-json>' | node "$HOME/.claude/skills/ck/commands/save.mjs" --init
确认 JSON 格式:{"name":"...","path":"...","description":"...","stack":["..."],"goal":"...","constraints":["..."],"repo":"..." }
/ck:save — 保存会话状态
这是唯一需要 LLM 分析的命令。 分析当前对话:
summary:一句话,最多 10 个词,完成了什么leftOff:正在进行的工作(具体文件/功能/bug)nextSteps:有序的具体下一步数组decisions:{what, why}格式的本次会话决策数组blockers:当前阻碍数组(无则为空数组)goal:更新的目标字符串,仅在本次会话中发生变化时提供,否则省略
向用户展示草稿摘要:"会话:'<summary>' — 保存吗?(是 / 编辑)"
等待确认。然后传递给 save.mjs:
echo '<json>' | node "$HOME/.claude/skills/ck/commands/save.mjs"
JSON 格式(精确):{"summary":"...","leftOff":"...","nextSteps":["..."],"decisions":[{"what":"...","why":"..."}],"blockers":["..."]}
原样显示脚本的标准输出确认信息。
/ck:resume [name|number] — 完整简报
node "$HOME/.claude/skills/ck/commands/resume.mjs" [arg]
原样显示输出。然后询问:"从这里继续?还是有什么变化?"
如果用户报告变化 → 立即运行 /ck:save。
/ck:info [name|number] — 快速快照
node "$HOME/.claude/skills/ck/commands/info.mjs" [arg]
原样显示输出。无需后续提问。
/ck:list — 项目总览
node "$HOME/.claude/skills/ck/commands/list.mjs"
原样显示输出。如果用户回复数字或名称 → 运行 /ck:resume。
/ck:forget [name|number] — 移除项目
首先解析项目名称(如需要则运行 /ck:list)。
询问:"这将永久删除 '<name>' 的上下文。确定吗?(是/否)"
如果确定:
node "$HOME/.claude/skills/ck/commands/forget.mjs" [name]
原样显示确认信息。
/ck:migrate — 将 v1 数据转换为 v2
node "$HOME/.claude/skills/ck/commands/migrate.mjs"
先进行试运行:
node "$HOME/.claude/skills/ck/commands/migrate.mjs" --dry-run
原样显示输出。将所有 v1 CONTEXT.md + meta.json 文件迁移到 v2 context.json。
原始文件备份为 meta.json.v1-backup——不会删除任何内容。
会话启动钩子
位于 ~/.claude/skills/ck/hooks/session-start.mjs 的钩子必须在
~/.claude/settings.json 中注册,以便在会话启动时自动加载项目上下文:
{
"hooks": {
"SessionStart": [
{ "hooks": [{ "type": "command", "command": "node \"~/.claude/skills/ck/hooks/session-start.mjs\"" }] }
]
}
}
该钩子每次会话注入约 100 个 token(紧凑的 5 行摘要)。它还能检测 未保存的会话、上次保存后的 git 活动,以及与 CLAUDE.md 的目标不匹配。
规则
- 在 Bash 调用中始终将
~展开为$HOME。 - 命令不区分大小写:
/CK:SAVE、/ck:save、/Ck:Save都有效。 - 如果脚本以退出码 1 退出,将其标准输出作为错误消息显示。
- 永远不要直接编辑
context.json或CONTEXT.md——始终使用脚本。 - 如果
projects.json格式错误,告知用户并提供重置为{}的选项。
