我是如何使用 Claude Code 每一项功能的
我使用 Claude Code 的所有方法大盘点。
1. 我是 Claude Code 的狂热爱好者(我和作者一样)
作为一名爱好者,我每周都会在虚拟机里运行几次,处理个人项目。
常常配合 --dangerously-skip-permissions 来随心所欲地写代码。
在工作中,我所在团队的一部分负责为工程团队构建 AI IDE 规则和工具,仅仅是代码生成就会消耗每月数十亿个 token。
基于 CLI 的 Agent 赛道愈发拥挤:Claude Code、Gemini CLI、Codex CLI、Cursor CLI、Copilot CLI…
感觉真正的竞争在于 Anthropic 与 OpenAI 之间。
但坦白说,当我与其他开发者交流时,他们的选择往往取决于一些表面的因素——用这个工具幸运地实现了某个功能,或者他们喜欢的系统提示词的“调性”。
此时这些工具都已经相当不错了。
我也觉得大家经常过度关注输出风格或界面。
“你说得对!” 式的阿谀奉承其实并不是什么严重的缺陷,反而说明你已经深度参与其中,完全掌握了全局。
对我来说,把任务交出去,设定上下文,然后让它自己工作,只根据最后的 PR 成品来评估,而不是纠结过程。
在连续几个月坚持使用 Claude Code 之后,这篇文章总结了我对其整个生态系统的思考。
我们会覆盖我使用的几乎所有功能(包括重要的但我不常使用的那些功能),从基础的 CLAUDE.md 文件和自定义斜杠命令,到 Subagents、Hooks、GitHub Actions 等强大能力。
这篇文章篇幅较长,我更建议把它当作参考手册,而不是一次性读完。
2. CLAUDE.md
在代码库里,要想高效使用 Claude Code,最重要的文件就是根目录下的 CLAUDE.md。
它是 Agent 的行为准则,是了解你这仓库运作方式的首要依据。
如何对待这个文件,要看具体场景。
对于我的兴趣项目,我让 Claude 想写什么就写什么。
在我的工作上,公司仓库 Monorepo 中的 CLAUDE.md 维护得非常严格,目前大小约为 13KB(完全有可能增长到 25KB)。
- 它只记录大约 30%(这个阈值比较随意)的工程师会用到的工具和 API(其他工具会在产品或库专属的 Markdown 文件里记录)。
- 我们甚至开始给每个内部工具的文档分配最大 token 数。如果你不能简明扼要地解释你的工具,那它就还没准备好被放进
CLAUDE.md。
3. 技巧与常见反模式
随着时间推移,我们形成了一套鲜明且有主见的写作哲学,来打造高效的 CLAUDE.md。
- 先设限制,而不是写指南。你的
CLAUDE.md应从小处着手,根据 Claude 常犯的错误来逐步记录相关内容。 - 别在
CLAUDE.md里到处 @ 引用文档。如果你在别处已有大量文档,很容易想在CLAUDE.md里 @ 这些文件。这会在每次运行时把整份文件塞进上下文窗口,导致臃肿。但如果你只是在文中提到路径,Claude 通常会忽略它。相反的,你必须向 Agent 推销 “为什么” 以及 “什么时候” 需要读这份文件:“遇到复杂用法或碰到 FooBarError 时,请参见 path/to/docs.md 获取最佳问题排查步骤。” - 不要只说“禁止”。避免纯粹的负面约束,例如 “绝对不要使用 --foo-bar 标志”。当 Agent 认为它必须使用该标志时,就会左右脑互博,导致卡住。所以永远要提供可行的替代方案。
- 把 CLAUDE.md 当成强制性手段。如果你的 CLI 命令复杂又冗长,与其写长篇大论解释它们,不如写一个简单的 bash 包装器,提供清晰直观的 API,然后记录这个包装器。保持
CLAUDE.md尽可能短,是迫使你精简代码库和内部工具的绝佳手段。
这是一个简化的示例
# Monorepo
## Python
- 总是...
- 使用 <command> 进行测试
... 还有10条 ...
## <内部 CLI 工具>
... 10个要点,聚焦于80%的使用场景 ...
- <使用示例>
- 总是...
- 禁止 <x>,优先使用 <Y>
对于 <复杂用法> 或 <错误>,请参阅 path/to/<tool>_docs.md
...
最后,我们会将这个文件与一个 AGENTS.md 文件保持同步,以确保与其他我们工程师可能在使用的 AI IDE 兼容。
核心要点:
把
CLAUDE.md当作一套高层次、精心策划的护栏和指引。用它来指导你在哪里需要投入更多精力来打造对 AI(和人类)更友好的工具,而不是试图把它变成一本无所不包的百科全书。
如果您正在寻找更多关于为编码助手编写 Markdown 的技巧,请参阅 “AI 无法读懂你的文档”、“AI 驱动的软件工程”,以及 “Cursor(AI IDE)的工作原理”。
4. 上下文管理之压缩和清理
我建议在编码会话中至少运行一次 /context,来了解你那 200k token 的上下文窗口是如何被使用的(即使是 Sonnet-1M,我也不相信完整的上下文窗口能被有效利用)。
对我们来说,在我们的 monorepo 中,一个全新的会话基线成本大约是 20k token(10%),剩下的 180k 用于你的实际修改——而这很快就会被填满。

这是我最近一个个人项目中 /context 的截图。你可以把它想象成磁盘空间,随着你开发一个功能,它会逐渐被填满。几分钟或几小时后,你就需要清除消息(紫色部分)来腾出空间继续工作。

「Ads」CCometixLine 超绝观测 Context Window
三个主要的工作流程:
- /compact(避免使用) 我尽可能避免使用这个命令。它的自动压缩过程不透明、容易出错,而且优化得不好。
- /clear + /catchup(简单重启) 这是我的默认重启方式。我用
/clear清除状态,然后运行一个自定义的/catchup命令,让 Claude 读取我当前 git 分支中所有已更改的文件。 - “记录并清除”(复杂重启) 用于大型任务。我让 Claude 把它的计划和进展输出到一个
.md文件中,然后用/clear清除上下文,接着通过让它读取那个.md文件来开始一个新的会话并继续工作。
核心要点:
不要相信自动压缩。对简单的重启使用
/clear,对复杂任务使用“记录并清除”的方法来创建持久的外部“记忆”。
5. 自定义斜杠命令
我把斜杠命令看作是常用提示的简单快捷方式,仅此而已。我的配置非常精简:
- /catchup : 就是我前面提到的命令。它只是提示 Claude 读取我当前 git 分支中所有已更改的文件。
- /pr : 一个简单的辅助工具,用来清理我的代码、暂存更改,并准备一个 Pull Request。
恕我直言,如果你有一长串复杂的自定义斜杠命令,你就制造了一个反模式。
对我来说,像 Claude 这样的 Agent 的全部意义就在于,你可以输入几乎任何你想要的东西,并得到一个有用的、可合并的结果。
一旦你强迫一个工程师(或非工程师)为了完成工作而去学习一个需要查文档的、新的魔法命令列表,你就失败了。
核心要点:
把斜杠命令当作简单、个人化的快捷方式,而不是用它来替代构建更直观的
CLAUDE.md和更好的工具化 Agent。
6. 自定义 SubAgent
理论上,SubAgent 是 Claude Code 在上下文管理方面最强大的功能。
它的理念很简单:一个复杂任务需要 X token 的输入上下文(例如,如何运行测试),在工作过程中累积了 Y token 的上下文,并产出一个 Z token 的答案。
运行 N 个这样的任务意味着你的主窗口中会有 (X + Y + Z) * N 个 token。
SubAgent 的解决方案是,将 (X + Y) * N 的工作外包给专门的 Agent,这些 Agent 只返回最终的 Z token 答案,从而保持你的主上下文清爽。
但我发现,这个强大的想法在实践中,SubAgent 会带来两个新问题:
- 它们把上下文“关起来”了 如果我创建了一个
PythonTestsSubAgent,我现在就把所有关于测试的上下文从我的主 Agent 那里隐藏了。主 Agent 再也无法对一个变更进行整体性的思考。它现在被迫调用 SubAgent 才能知道如何验证自己的代码。 - 它们强迫 Agent 遵循人类的工作流 更糟糕的是,它们强迫 Claude 进入一个僵硬的、由人类定义的工作流。我现在是在指令它必须如何委派任务,而这正是我希望 Agent 帮我解决的问题。
我更喜欢的替代方案是使用 Claude 内置的 Task(...) 功能来生成通用代理的克隆体。
我把所有关键上下文都放在 CLAUDE.md 里。
然后,我让主 Agent 自己决定何时以及如何将工作委派给它自己的副本。
这让我既享受了 SubAgent 节省上下文的好处,又避免了其缺点。
Agent 可以动态地管理自己的协作流程。
在我的 《构建 Multi Agent System(第二部分)》 一文中,我将这种架构称为“主-克隆”模式,并且强烈推荐它,而非定制 SubAgent 所倡导的“主导-专家”模型。
核心要点:
自定义 SubAgent 是一个脆弱的解决方案。把上下文给你的主 Agent(放在
CLAUDE.md里),让它使用自己的Task/Explore(...)功能来管理任务委派。
7. 恢复、继续与历史记录
在简单的层面上,我经常使用 claude --resume 和 claude --continue。
它们对于重启一个出问题的终端或快速恢复一个旧的会话非常好用。
我常常会 claude --resume 一个几天前的会话,只为了问 Agent 它是如何克服某个特定错误的,然后我用这些信息来改进我们的 CLAUDE.md 和内部工具。
更深入一点,Claude Code 将所有会话历史存储在 ~/.claude/projects/ 中,以便利用原始的历史会话数据。
我有一些脚本会对这些日志进行元分析,寻找常见的异常、权限请求和错误模式,以帮助改进面向 Agent 的上下文。
核心要点:
使用
claude --resume和claude --continue来重启会话和挖掘埋藏的历史上下文。
8. 钩子
钩子非常重要。
我个人项目不用它,但它们对于在一个复杂的企业级代码库中引导 Claude 至关重要。
它们是确定性的“必须做”的规则,与 CLAUDE.md 中的“应该做”的建议互为补充。
我们使用两种类型的钩子:
- 提交时阻断钩子(Block-at-Submit Hooks) 这是我们的主要策略。我们有一个
PreToolUse钩子,它会包裹任何Bash(git commit)命令。它会检查一个/tmp/agent-pre-commit-pass文件,这个文件 只有 在所有测试都通过时,我们的测试脚本才会创建。如果文件不存在,钩子就会阻止提交,迫使 Claude 进入一个“测试并修复”的循环,直到构建通过。 - 提示钩子(Hint Hooks) 这些是简单的、非阻塞的钩子,如果 Agent 正在做一些次优的操作,它们会提供“即发即忘”式的反馈。
我们 刻意不使用“写入时阻断”的钩子(例如,在 Edit 或 Write 操作上)。
在 Agent 执行计划中途阻断它,会使它困惑甚至“沮丧”。
更有效的方法是让它完成它的工作,然后在提交阶段检查最终的、完整的结果。
核心要点:
使用钩子在提交时强制执行状态验证(提交时阻断)。避免在写入时阻断——让 Agent 完成它的计划,然后再检查最终结果。
9. Plan 模式
对于任何使用 AI IDE 进行的“大型”功能变更,规划都是必不可少的。
对于我的个人项目,我只使用内置的 Plan 模式。
这是一种在 Claude 开始工作前与它对齐的方式,既定义了 如何 构建某样东西,也定义了它需要停下来向我展示工作的“检查点”。
经常使用这个功能可以培养一种强大的直觉,即需要提供多少最少的上下文才能得到一个好的计划,而不会让 Claude 在实现阶段搞砸。
在我们的工作代码库中,我们已经开始推广一个基于 Claude Agent SDK 构建的自定义规划工具。
它与原生规划模式类似,但经过了大量提示工程,使其输出与我们现有的技术设计格式保持一致。
它还能开箱即用地强制执行我们的内部最佳实践——从代码结构到数据隐私和安全。
这让我们的工程师可以像一位资深架构师一样,“凭感觉规划”一个新功能(至少我们的宣传是这么说的)。
核心要点:
对于复杂的变更,总是使用内置的 Plan 模式,在 Agent 开始工作前先就计划达成一致。
10. 技能
我同意 Simon Willison 的观点:Skills(也许)比 MCP 更重要。
如果你一直关注我的文章,你会知道我已经逐渐放弃在大多数开发工作流中使用 MCP,而是倾向于构建简单的 CLI(正如我在《AI 读不懂你的文档》中论述的那样)。
我对 Agent 自主性的心智模型已经演变为三个阶段:
- 单次提示:在一个巨大的提示中给 Agent 所有上下文。(脆弱,无法扩展)。
- 工具调用: “经典”的 Agent 模型。我们手动制作工具,为 Agent 抽象出现实世界。(更好,但创造了新的抽象和上下文瓶颈)。
- 脚本化:我们给 Agent 访问原始环境的权限——二进制文件、脚本和文档——然后它 动态地 编写代码来与它们交互。
基于这个模型,Agent Skills 显然是下一个重要功能。
它们是“脚本化”这一层的正式产品化。
如果你像我一样,已经倾向于使用 CLI 而非 MCP,那么你其实一直在不自觉地享受着 Skills 带来的好处。
SKILL.md 文件只是一个更有组织、可共享、可发现的方式来记录这些 CLI 和脚本,并将它们暴露给智能体。
核心要点:
Skills 是正确的抽象。它们将基于“脚本化”的智能体模型正式化,这种模型比 MCP 所代表的僵硬的、类似 API 的模型更健壮、更灵活。
11. 模型上下文协议
Skills 并不意味着 MCP 已死。
以前,许多人构建了糟糕的、上下文沉重的 MCP,包含几十个只是简单镜像 REST API 的工具(read_thing_a()、read_thing_b()、update_thing_c())。
“脚本化”模型(现在由 Skills 正式化)更好,但它需要一个安全的方式来访问环境。
对我来说,这正是 MCP 新的、更专注的角色。
一个 MCP 不应该是一个臃肿的 API,而应该是一个简单、安全的网关,提供几个强大的、高层次的工具:
download_raw_data(filters…)take_sensitive_gated_action(args…)execute_code_in_environment_with_state(code…)
在这个模型中,MCP 的工作不是为智能体抽象现实;它的工作是管理认证、网络和安全边界,然后让开。
它为智能体提供了入口点,然后智能体利用它的脚本能力和 markdown 上下文来完成实际工作。
我唯一还在使用的 MCP 是用于 Playwright 的,这很合理——它是一个复杂的、有状态的环境。
我所有无状态的工具(如 Jira、AWS、GitHub)都已迁移到简单的 CLI。
核心要点:
使用扮演数据网关角色的 MCP。给智能体一两个高层次的工具(比如一个原始数据转储 API),然后让它基于这些工具编写脚本。
12. Claude Code(Agent)SDK
Claude Code 不仅仅是一个交互式的 CLI;它也是一个强大的 SDK——现为 Claude Agent SDK,可以用来构建全新的 Agent——无论用于编码还是非编码任务。
对于大多数新的个人项目,我已经开始用它作为我的默认 Agent 框架,而不是像 LangChain/CrewAI 这样的工具。
我主要在三个方面使用它:
- 大规模并行脚本 对于大规模重构、bug 修复或迁移,我不使用交互式聊天。我编写简单的 bash 脚本,并行调用
claude -p "in /pathA change all refs from foo to bar"。这比试图让主 Agent 管理几十个子 Agent 任务更具扩展性和可控性。 - 构建内部聊天工具 这个 SDK 非常适合将复杂的流程包装成一个简单的聊天界面,供非技术用户使用。比如一个安装程序,在出错时可以回退到 Claude Agent SDK 来为用户修复问题。或者一个内部的“家庭版 v0”工具,让我们的设计团队可以在我们自家的 UI 框架中“凭感觉”编写前端模型,确保他们的想法是高保真的,并且代码能更直接地用于前端生产。
- 快速 Agent 原型设计 这是我最常见的用法,并且不限于编码。如果我对任何 Agent 任务有想法(例如,一个使用自定义 CLI 或 MCP 的“威胁调查 Agent”),我会使用 Claude Code SDK 快速构建和测试原型,然后再投入到一个完整的、已部署的框架中。
核心要点:
Claude Agent SDK 是一个强大的、通用的 Agent 框架。用它来批量处理代码、构建内部工具,以及在选择更复杂的框架之前快速原型化新的 Agent。
13. Claude Code GHA(GitHub Action)
Claude Code GitHub Action(GHA)可能是我最喜欢也是最被低估的功能之一。
它的概念很简单:就是在 GHA 中运行 Claude Code。
但正是这种简单性使其如此强大。
它与 Cursor 的 Background Agent 或 Codex 的托管 Web UI 类似,但可定制性要强得多。
你控制整个容器和环境,这让你能接触到更多数据,并且至关重要的是,比任何其他产品提供更强的沙盒和审计控制。
此外,它支持所有高级功能,如 Hooks 和 MCP。
我们用它来构建自定义的“随处可发 PR”的工具。
用户可以从 Slack、Jira、甚至 CloudWatch 告警触发一个 PR,然后 GHA 会修复 bug 或添加功能,并返回一个经过完整测试的 PR。
由于 GHA 的日志就是完整的 Agent 日志,我们有一个运营流程,在公司层面定期审查这些日志,寻找常见的错误、bash 错误或不一致的工程实践。
这创建了一个数据驱动的飞轮:Bugs → 改进的 CLAUDE.md / CLIs → 更好的 Agent。
$ query-claude-gha-logs --since 5d | claude -p "看看其他 Claude 卡在了哪里,修复它,然后提交一个PR"
核心要点:
GHA 是将 Claude Code 投入生产运营的终极方式。它将其从个人工具转变为你工程系统中一个核心的、可审计的、自我改进的部分。拥有无限自由的可能性!
14. settings.json
最后,我有一些特定的 settings.json 配置,我发现在个人和专业工作中都至关重要。
- HTTPS_PROXY/HTTP_PROXY:这对调试非常有用。我会用它来检查原始流量,看看 Claude 究竟发送了什么 Prompt。对于 Background Agent,它也是一个强大的细粒度网络沙盒工具。
- MCP_TOOL_TIMEOUT/BASH_MAX_TIMEOUT_MS:我调高了这些值。我喜欢运行长而复杂的命令,而默认的超时时间通常过于保守。
- ANTHROPIC_API_KEY:在工作中,我们使用企业 API 密钥。这将我们从“按席位付费”的许可证模式转变为“按使用量付费”的模式,这更适合我们的工作方式。
- “permissions”:我会偶尔自我审计一下我允许 Claude 自动运行的命令列表。
- (实际上
env还有许多非常有用的环境变量属性)
核心要点:
你的
settings.json是进行高级定制的强大工具。
15. 结语
内容很多,但希望对你有用。
如果你还没有开始使用像 Claude Code 或 Codex CLI 这样的基于命令行的 Code Agent,你或许应该开始了。
这些高级功能很少有好的指南,所以学习的唯一方法就是亲身投入进去。
比如 阅读哈雷酱的一堆历史 Anthropic 帖子。