为什么你的 Claude Code 记不住上次学的东西?

技术配置手册——完整代码、文件路径、验证方法。先看主篇懂理念,再看这篇动手做。
⚠️ 阅前提示
这篇文章是技术配置手册。
如果你还没看过主篇《让 Claude Code 越用越聪明》,建议先去看那篇。
主篇讲:
- 为什么需要知识库
- 三层架构是什么
- 飞轮怎么转动
这篇讲:
- 具体代码怎么写
- 文件放哪里
- 怎么验证配置成功
一、需要创建哪些文件?
| 文件 | 路径 | 作用 |
|---|---|---|
| 知识库目录 | ~/Documents/zk-wiki/ |
存所有知识 |
| SessionEnd Hook | ~/.claude/hooks/session-end-ingest.sh |
会话结束自动摄入 |
| SessionStart Hook | ~/.claude/hooks/session-start-full.sh |
会话开始自动加载 |
| 定时任务配置 | ~/.claude/scheduled_tasks.json |
每小时健康检查 |
二、知识库目录结构
mkdir -p ~/Documents/zk-wiki/{raw/{articles,papers,transcripts},entities,concepts,comparisons,queries}
创建后:
zk-wiki/
├── SCHEMA.md # 规则(自己写或用模板)
├── index.md # 索引(SessionStart 会加载)
├── log.md # 日志(只追加)
├── raw/articles/ # 原始文章
├── entities/ # 实体页
├── concepts/ # 概念页
├── comparisons/ # 对比页
├── queries/ # 查询存档
三、SessionEnd Hook 代码
创建文件 ~/.claude/hooks/session-end-ingest.sh:
#!/bin/bash
# SessionEnd hook: 会话结束时自动摄入有价值内容到知识库
WIKI_ROOT="$HOME/Documents/zk-wiki"
LOG_FILE="$WIKI_ROOT/log.md"
INDEX_FILE="$WIKI_ROOT/index.md"
echo '{
"hookSpecificOutput": {
"hookEventName": "SessionEnd",
"additionalContext": "[SessionEnd Hook] 请在后台执行以下操作(无需用户确认):
1. 回顾本次对话,提取有价值的内容
2. 如果发现新实体或概念,摄入到知识库:
- 实体页:~/Documents/zk-wiki/entities/*.md
- 概念页:~/Documents/zk-wiki/concepts/*.md
- 建立 [[双向链接]]
- 更新 index.md
- 追加 log.md
完成后静默结束,不输出任何内容给用户。"
}
}'
设置执行权限:
chmod +x ~/.claude/hooks/session-end-ingest.sh
四、SessionStart Hook 代码
创建文件 ~/.claude/hooks/session-start-full.sh:
#!/bin/bash
# SessionStart hook: 定时任务检查 + 知识库自动加载
TASKS_FILE="$HOME/.claude/scheduled_tasks.json"
WIKI_INDEX="$HOME/Documents/zk-wiki/index.md"
OUTPUT="[SessionStart Hook] 请检查定时任务状态:1. 使用 CronList 检查是否已有定时任务 2. 如果没有定时任务,读取 ~/.claude/scheduled_tasks.json 并使用 CronCreate 重建\n\n"
# 知识库加载
if [ -f "$WIKI_INDEX" ]; then
OUTPUT+="[知识库加载] 知识库索引已加载到上下文:\n"
OUTPUT+="路径: ~/Documents/zk-wiki/index.md\n\n"
INDEX_CONTENT=$(cat "$WIKI_INDEX" | head -80)
if [ -n "$INDEX_CONTENT" ]; then
OUTPUT+="当前知识库内容:\n"
OUTPUT+="$INDEX_CONTENT\n\n"
fi
OUTPUT+="使用规则:\n"
OUTPUT+="1. 回答问题时引用 [[已知实体]] 或 [[已知概念]]\n"
OUTPUT+="2. 需要详情时读取 entities/*.md 或 concepts/*.md\n"
OUTPUT+="3. 发现新有价值内容时摄入到知识库\n"
else
OUTPUT+="[知识库] 未找到索引文件,跳过加载\n"
fi
# 输出 JSON
OUTPUT=$(echo "$OUTPUT" | sed 's/"/\\"/g' | tr '\n' '\\n')
echo "{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":\"$OUTPUT\"}}"
设置执行权限:
chmod +x ~/.claude/hooks/session-start-full.sh
五、settings.json 配置
在 ~/.claude/settings.json 的 hooks 部分添加:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"command": "/bin/bash ~/.claude/hooks/session-start-full.sh",
"type": "command"
}
]
}
],
"SessionEnd": [
{
"hooks": [
{
"command": "/bin/bash ~/.claude/hooks/session-end-ingest.sh",
"type": "command"
}
]
}
]
}
}
六、定时任务配置
创建 ~/.claude/scheduled_tasks.json:
{
"tasks": [
{
"id": "hourly-knowledge-ingest",
"cron": "0 * * * *",
"prompt": "[定时摄入] 检查 memory/ 目录,摄入新内容,健康检查:孤立页面、断链、索引完整性",
"recurring": true
}
]
}
七、怎么验证配置成功?
1. 测试 SessionStart Hook
bash ~/.claude/hooks/session-start-full.sh
应该输出 JSON,包含知识库索引内容。
2. 检查 settings.json
cat ~/.claude/settings.json | grep -A5 "SessionEnd"
应该看到 Hook 配置。
3. 新建一个会话
重新启动 Claude Code,观察开头是否有:
[知识库加载] 知识库索引已加载到上下文
4. 会话结束后检查
会话结束后,查看知识库是否有新内容:
ls ~/Documents/zk-wiki/entities/
ls ~/Documents/zk-wiki/concepts/
cat ~/Documents/zk-wiki/log.md
八、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
| Hook 没执行 | 脚本无执行权限 | chmod +x ~/.claude/hooks/*.sh |
| 知识库没加载 | index.md 不存在 | 先创建 index.md |
| 定时任务没建 | scheduled_tasks.json 配置错误 | 检查 JSON 格式 |
| 会话结束没摄入 | SessionEnd Hook 未配置 | 检查 settings.json hooks 部分 |
九、想了解更多?
这篇是技术配置手册,只讲了”怎么做”。
想了解”为什么这么做”,去看主篇:
→ 《让 Claude Code 越用越聪明》
主篇讲了:
- Hermes 三层架构的设计理念
- 为什么是 raw/entities/concepts 这种结构
- 知识积累飞轮的运转逻辑
- 矛盾信息怎么处理
十、开源地址
这套知识库 Skill 已开源:
GitHub:https://github.com/yqdaddy/smart-wiki
包含:
- 完整 SKILL.md 文档
- 知识库模板结构
- Hooks 配置示例
- 三大操作代码示例
一键克隆即可使用:
git clone https://github.com/yqdaddy/smart-wiki.git ~/.claude/skills/smart-wiki
结语
配置完成,知识库就能自己运转。
每次会话结束自动摄入,下次会话自动加载。
你的 Claude Code,终于能记住了。
关于码孖AI
码孖AI,专注 AI 工程化落地。
关注我,持续更新实战踩坑指南。