CLAUDE.md
CLAUDE.md 是代码库的根目录中最重要的文件,它是代理理解你项目运作方式的核心规则。如何维护它,取决于使用场景。
- 个人项目: 随性发挥,让 Claude 自由记录。
 - 专业项目: 严格维护。例如,在一个大型单体仓库中,
CLAUDE.md文件可能达到 13KB,并且只包含超过 30% 工程师会使用到的工具和 API 文档。我们甚至为内部工具的文档分配了“最大令牌数”,如同广告位,以此敦促团队保持文档的简洁性。 
CLAUDE.md 的配置
- 不要直接 
@文件
直接在CLAUDE.md中@引用其他文档文件,会在每次运行时将整个文件内容注入上下文,造成严重浪费。正确做法是“引导”代理去阅读它。正确示例:
“对于复杂的…用法,或当您遇到FooBarError错误时,请参阅path/to/docs.md以获取高级故障排除步骤。”你需要向代理建议阅读这份文档的理由和时机。
 - 提供替代方案
避免仅使用“永远不要--foo-bar”这样的纯否定约束。当代理认为必须使用该标志时,它会陷入困境。正确示例:
“不要使用--foo-bar,请优先选择--new-baz。” - 定义自己的工具
如果你的命令行工具复杂难用,不要试图用长篇大论的文档去解释它。这只是在用文档掩盖工具设计上的缺陷。正确的做法是:编写一个简单的 Bash 包装脚本,提供清晰直观的 API,然后只文档化这个脚本。 保持CLAUDE.md的简短,是简化代码库和内部工具的绝佳驱动力。 
CLAUDE.md 结构示例
# Monorepo
## Python
- 总是 ...
- 使用 <command> 进行测试
... 另外 10 条规则 ...
## <内部 CLI 工具>
... 10 个要点,聚焦于 80% 的使用场景 ...
- <用法示例>
- 总是 ...
- 绝不 <X>,优先 <Y>
若需了解 <复杂用法> 或处理 <错误>,请参阅 path/to/<tool>_docs.md
...
上下文窗口
建议在编码会话中至少运行一次 /context,以了解你的 200k 令牌上下文窗口是如何被消耗的。
在一个大型单体仓库中,一次新的会话基本消耗可能就高达约 20k 令牌(10%),剩下的 180k 会很快被填满。

你可以将上下文窗口想象成磁盘空间,它会随着你的工作而填满。几分钟或几小时后,你需要清理(紫色部分)来腾出空间。
会话管理
| 方法 | 命令 | 使用和场景 | 
|---|---|---|
| 自动压缩 (不推荐) | /compact | 
尽量不用。它的压缩过程不透明,容易出错,效果也不好。 | 
| 简单任务 (常用) | /clear + /catchup | 
我的默认操作。先清空状态,再用一个自定义的 /catchup 命令让它读取当前 Git 分支的所有改动。 | 
| 复杂任务 | 存储并新开会话 | 先让 Claude 把计划和进度存储到 .md 文件,然后 /clear,再让新会话读取这个 .md 文件继续工作。 | 
小提醒:
不要信任自动压缩。
使用 /clear 进行简单任务,并利用存储方法为复杂任务创建持久的外部记录。
斜杠命令 (/)
我将斜杠命令视为常用提示词的快捷方式,仅此而已。我的设置非常精简:
/catchup:让 Claude 读取当前 Git 分支中所有已更改的文件。/pr:一个简单的助手,用于清理代码、暂存更改并准备一个拉取请求。
小提醒:
如果你发现自己有一长串复杂的自定义斜杠命令,那你可能过度思考了。
AI 代理的魅力在于自然语言交互,一旦你开始强迫自己和团队去记一堆指令,就违背了初衷。
将斜杠命令用作简单的个人快捷方式,而不是用来替代构建更直观的 CLAUDE.md 和更完善的工具。
子代理
子代理听起来很美:把特定任务(比如跑测试)外包给专门的代理,只返回最终结果,从而保持主上下文的清洁。
然而,在实践中,自定义子代理会带来两个问题:
- 上下文隔离: 创建一个 
PythonTests子代理,会将所有测试相关的上下文从主代理中剥离。主代理无法再对变更进行整体性推理,甚至无法验证自己的代码,除非调用子代理。 - 强制固定工作流: 这迫使 Claude 遵循一个由我们定义的固定工作模式。这限制它必须如何完成任务,而这可能是希望代理帮助我们解决的问题。
 
Task 方案
我更喜欢使用 Claude 内置的 Task(...) 功能来生成通用代理的副本。
- 将所有关键上下文放入 
CLAUDE.md。 - 让主代理自行决定何时以及如何将工作委派给它自己的副本。
 
这既能享受到子代理节省上下文的好处,又避免了其缺点。代理能够动态地管理自己的任务编排,而不是遵循固定的模式。
会话记录 (--resume)
我经常使用 claude --resume 和 claude --continue 来重启出问题的终端或快速恢复旧会话。
我甚至会恢复几天前的会话,只为让代理总结它是如何解决某个特定错误的,然后用这些信息来优化改进 CLAUDE.md 和内部工具。
更进一步,Claude Code 将所有会话记录存储在 ~/.claude/projects/ 中。可以使用脚本定期对这些原始日志进行元分析,寻找常见的异常、权限请求和错误模式,以帮助优化改进给 AI 的上下文。
钩子 (Hooks)
钩子 (Hooks) 是确定性的“必须做”规则,与 CLAUDE.md 中“应该做”的建议形成互补。在复杂的任务代码库里,这东西至关重要。
两种钩子策略
- 阻止未经确认的提交
这是我们的主要策略。我们有一个PreToolUse钩子,它会拦截任何git commit命令。该钩子会检查是否存在一个/tmp/agent-pre-commit-pass文件,这个文件只有在我们的测试脚本全部通过时才会被创建。如果文件不存在,钩子会阻止提交,迫使 Claude 进入一个“测试-修复”循环,直到构建变绿。 - 提示型钩子
这些是简单的、非阻止的钩子,当代理执行次优操作时,提供各种反馈。 
小提醒:
不要在“写入时”(比如 Edit 或 Write 操作)阻止。
打断它的思考过程会让它出现不明所以的判断。更好的方式是让它完成整个工作,然后在最后提交时检查结果。
规划模式 (Planning)
对于任何大型功能变更,使用规划模式至关重要。
- 个人项目:
使用内置的规划模式。它能让我在 Claude 开始工作前与其达成一致,定义如何构建以及在哪些“检查点”需要停下来向我展示工作。 - 专业项目:
可以做一个基于 Claude Code SDK 构建的自定义规划工具。可以通过大量提示工程,使其输出符合技术设计规范的计划,并默认强制执行内部的最佳实践(从代码结构到数据隐私和安全)。 
技能 (Skills)
技能(Skills)可能是比 MCP 更好用。
智能体模型三个阶段:
- 单一提示:
把所有东西塞进一个巨大的 prompt 里。(很脆弱) - 工具调用 (Tool Calling):
为代理制作特定工具,将不同的平台、服务接入。(更好,但同样有瓶颈)。 - 脚本化 (Scripting):
给 AI 访问真实环境的权限(二进制文件、脚本、文档),让它自己即时编写代码来和环境交互。 
Agent Skills
正是“脚本化”阶段的正式产品化。如果你像我一样,倾向于使用 CLI 而非 MCP,那么你其实一直在享受 Skills 带来的好处。SKILL.md 文件就是一个更规范、可共享的方式来告诉 AI 它能用哪些脚本和 CLI。
MCP
Skills 的出现并不意味着 MCP 已死,而是使其更加聚焦。
与其成为一个包含几十个工具、镜像 REST API 的臃肿接口,MCP 应该是一个简单、安全、提供少数强大高阶工具的网关。比如:
download_raw_data(filters…)take_sensitive_gated_action(args…)execute_code_in_environment_with_state(code…)
MCP 的工作会是管理认证、网络和安全边界,然后让开。为代理提供入口点,代理则利用其脚本化能力和上下文来完成实际工作。
SDK 构建自定义代理
Claude Code 不仅仅是一个交互式 CLI,它还是一个强大的 SDK,可用于构建全新的通用代理框架。
主要用法
- 大规模并行脚本:搞大型重构或迁移时,我会写 bash 脚本并行调用 
claude命令,比让一个代理管理一堆任务高效多了。 - 构建内部工具:比如做一个安装程序,出错时直接调用 SDK 让 AI 帮用户解决问题。或者做一个内部的“v0”工具,让设计师能用自然语言生成符合我们 UI 框架的前端代码。
 - 快速原型验证:任何代理类的想法,我都会先用 Claude Code SDK 搭个原型,跑通了再考虑上更重的框架。
 
GitHub Action (GHA)
Claude Code GitHub Action 是最被低估的功能之一。概念很简单:在 GHA 中运行 Claude Code。
它比 Cursor 的后台代理 或 Codex 的托管 Web UI 更具可定制性。你完全控制容器和环境,拥有更强的数据访问权限、沙盒能力和审计控制。
我们可以用它来打造智能 PR 的工具:从 Slack、Jira 或者监控警报触发一个 GHA,让 AI 自动修复 bug 或添加功能,然后提交一个测试通过的 PR。
GHA 的日志就是 AI 的完整工作记录。我们可以定期分析这些日志,以发现常见的错误和不一致的工程实践,然后优化我们的 CLAUDE.md 和 CLI,形成一个数据驱动的飞轮
# 一个概念性命令:查询过去 5 天的 GHA 日志,让另一个 Claude 实例来修复其他 Claude 实例遇到的问题
$ query-claude-gha-logs --since 5d | claude -p “see what the other claudes were getting stuck on and fix it, then put up a PR“
settings.json 配置
最后,分享几个常用的 settings.json 配置: