本文翻译自 Shrivu Shankar 的文章 How I Use Every Claude Code Feature,发布于 2025 年 11 月 2 日。
简评:这是一篇难得的深度实践文章。作者既在个人项目中频繁使用 Claude Code,又在企业环境下为每月消耗数十亿 token 的工程团队构建 AI-IDE 工具,这种双重视角让文章兼具灵活性和严谨性。文章不是泛泛而谈,而是针对每个功能给出了明确的使用场景、实践技巧和常见陷阱。比如为什么要避免
/compact,为什么自定义子智能体反而会带来问题,Skills 和 MCP 的真正定位是什么。作为参考手册,它涵盖了从基础配置到高级特性的完整路径;作为经验分享,它提供了很多反直觉但有效的做法。如果你正在使用或考虑使用 Claude Code,这篇文章能帮你少走不少弯路。唯一的问题是内容确实比较长,很多经验适合使用一段时间后进行查阅,而不是一口气读完了事。
引言
我是 Claude Code 的重度用户。
业余时间,我每周会在虚拟机里运行它好几次,用来折腾个人项目。经常加上 --dangerously-skip-permissions 参数,想到什么就直接让它写。工作中,我所在团队为公司工程团队构建 AI-IDE 的规则和工具,光是代码生成,每月就要消耗数十亿 token。
CLI 智能体(命令行智能体)现在很热闹。Claude Code、Gemini CLI、Cursor、Codex CLI,核心竞争其实就是 Anthropic 和 OpenAI 两家。但说实话,和其他开发者聊下来,大家选工具的理由往往挺表面的,某个功能用着顺手,或者就是喜欢某种系统提示的风格。到了现在,这些工具都已经很成熟了。很多人过度关注输出风格或 UI 细节。比如智能体那些过分客气的回复,在我看来根本不是问题,反而是个信号:你管得太细了。我的理念是发射后不管,交代清楚任务,设好上下文,然后让它自己干。评价工具要看最终的 PR,而不是它是怎么写出来的。
用了几个月 Claude Code,写这篇文章记录一下对整个生态的理解。我会讲几乎每个功能的用法(以及为什么不用某些功能),从基础的 CLAUDE.md 文件、自定义斜杠命令,到子智能体(Subagents)、钩子(Hooks)和 GitHub Actions。文章比较长,建议当成参考手册来查,不必一次读完。
CLAUDE.md
要高效使用 Claude Code,代码库里最重要的文件就是根目录的 CLAUDE.md。可以把它看作智能体的宪法,它理解你的代码库如何运作,全靠这个文件。
如何维护这个文件,取决于场景。个人项目里,我让 Claude 随便往里写。
工作中,我们 monorepo(单一代码仓库)的 CLAUDE.md 严格维护,目前 13 KB(预计会涨到 25 KB):
- 只记录 30% 以上工程师会用到的工具和 API(比例是我定的)。不够通用的工具,文档放在各自的产品或库里。
- 我们甚至给每个内部工具的文档分配了 token 上限,像是在卖广告位。工具介绍写不简洁?那就不配进
CLAUDE.md。
实用技巧与常见误区
用久了,我们总结出一套编写 CLAUDE.md 的方法论:
-
从护栏开始,不是说明书
CLAUDE.md应该很短,只在 Claude 容易出错的地方加说明。别想着写完整手册。 -
别用
@引用文档
如果你有详细文档,可能想在CLAUDE.md里用@引用。但这会把整个文件塞进上下文,非常臃肿。只写路径?Claude 会忽略。正确做法是推销这个文件,告诉它为什么和何时该读。例如:遇到复杂用法或FooBarError错误时,参考path/to/docs.md的高级故障排除。 -
别只说禁止
不要写纯否定约束,比如永远不要用某个标志。智能体真需要这个标志时就傻了。永远提供替代方案。 -
把
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(和人)都更好用,而不是写成大而全的手册。
精简、上下文与清空
建议编码时至少运行一次 /context,看看 200k 个 token 的上下文窗口用了多少。即使有 Sonnet-1M,我也不信全部上下文都能被有效利用。我们 monorepo 里,新会话基础开销约 20k 个 token(10%),剩下 180k 个用来干活——但很快就会用完。(可以把上下文想象成磁盘空间,工作一段时间后,需要清理消息才能继续)

我的三种工作流:
-
/compact(避免用):尽量别用。自动压缩不透明、容易出错、优化不好。 -
/clear+/catchup(简单重启):我的默认方式。先/clear清状态,再运行自定义的/catchup命令,让 Claude 读取当前 git 分支的所有改动。 -
文档化后清空(复杂任务重启):大任务专用。让 Claude 把计划和进度写进
.md文件,/clear清状态,然后新会话读取.md继续干。
核心要点:别信自动压缩。简单重启用 /clear,复杂任务用文档化后清空给它创建外部记忆。
自定义斜杠命令
我把斜杠命令当作常用提示词的快捷方式,仅此而已。我只设了两个:
/catchup:让 Claude 读取当前 git 分支的所有改动。/pr:清理代码、暂存改动、准备 Pull Request 的小助手。
如果你有一长串复杂的自定义命令,那就是反模式了。Claude 这种智能体的意义,就是让你输入几乎任何想法,都能得到有用、可合并的结果。一旦你强迫工程师(或非工程师)为了干活必须学习一堆不知道记在哪的魔法命令,那你就失败了。
核心要点:斜杠命令只是个人快捷方式,别用它替代更直观的 CLAUDE.md 和更好的工具设计。
自定义子智能体
理论上,自定义子智能体(Subagent)是 Claude Code 最强的上下文管理功能。逻辑很简单:一个复杂任务需要 X 个 token 输入上下文(比如如何运行测试),执行中累积 Y 个 token 工作上下文,产出 Z 个 token 答案。运行 N 个任务,主窗口就占 (X + Y + Z) * N 个 token。
子智能体方案是把 (X + Y) * N 的工作外包给专门智能体,它们只返回最终的 Z 个 token 答案,主上下文保持清爽。
但实践中,自定义子智能体有两个新问题:
-
隔离上下文
创建PythonTests子智能体,就把测试相关的所有上下文从主智能体那藏起来了。主智能体无法全局推理一个改动,必须调子智能体才知道怎么验证代码。 -
强制人类工作流
更糟的是,它们把 Claude 框进僵化的、人类定义的工作流。我在命令它应该如何分配任务,但这恰恰是我希望智能体自己解决的问题。
我的替代方案:用 Claude 内置的 Task(...) 功能生成通用智能体的克隆。
把关键上下文都放 CLAUDE.md 里,让主智能体自己决定何时、如何把工作分给它的副本。既有节省上下文的好处,又避免了缺点。智能体动态管理自己的协作流程。
我在文章《构建多智能体系统(第二部分)》里把这叫主干-克隆(Master-Clone)架构,强烈推荐它,而不是自定义子智能体鼓励的领导-专家(Lead-Specialist)模型。
核心要点:自定义子智能体是脆弱方案。把上下文给主智能体(通过 CLAUDE.md),让它用 Task/Explore(...) 自己管理任务分配。
恢复、继续与历史记录
我经常用 claude --resume 和 claude --continue。重启出 bug 的终端,或恢复旧会话,都很方便。有时会 claude --resume 几天前的会话,就为了问智能体当时怎么解决某个错误的,然后用这些信息改进我们的 CLAUDE.md 和内部工具。
往深了说,Claude Code 把所有会话历史存在 ~/.claude/projects/,可以挖掘原始数据。我有脚本运行元分析(meta-analysis),找常见的异常、权限请求和错误模式,帮助改进面向智能体的上下文。
核心要点:用 claude --resume 和 claude --continue 重启会话,挖掘历史记录里埋藏的上下文。
钩子(Hooks)
钩子很重要。个人项目我不用,但企业级代码仓库里,它们对引导 Claude 行为至关重要。钩子是确定性的必须做规则,配合 CLAUDE.md 里应该做的建议。
我们用两种钩子:
-
提交时阻塞(Block-at-Submit)
主要策略。我们有个PreToolUse钩子,包裹所有Bash(git commit)命令。钩子检查/tmp/agent-pre-commit-pass文件是否存在,测试脚本只有在所有测试通过时才创建这个文件。文件不存在?钩子阻止提交,逼 Claude 进测试-修复循环,直到构建成功。 -
提示型(Hint)
简单的非阻塞钩子。智能体做次优操作时,提供即发即忘式的反馈。
我们特意不用写入时阻塞(block-at-write)钩子(比如在 Edit 或 Write 操作上)。中途打断智能体会让它困惑甚至沮丧。更有效的方法是让它完成工作,提交时再检查最终结果。
核心要点:用钩子在提交时强制状态验证(提交时阻塞)。别在写入时阻塞,让智能体完成计划,再检查最终结果。
规划模式
用 AI IDE 做大型功能变更,规划必不可少。
个人项目,我全用内置规划模式。这是在 Claude 开工前跟它对齐的方式,既定义如何构建,也设定检查点,也就是它需要停下来展示工作的地方。常用这功能能培养直觉:知道提供哪些最精简的上下文,就能得到好计划,而不会让 Claude 在实现时搞砸。
我们 monorepo 里,已经在推广基于 Claude Code SDK 的自定义规划工具。和原生规划模式类似,但经过深度提示工程,输出和我们现有的技术设计格式一致。它还能开箱即用地强制执行内部最佳实践,从代码结构到数据隐私和安全。让工程师能随心所欲地规划新功能,像资深架构师一样,至少宣传是这么说的。
核心要点:复杂变更一定要用内置规划模式,在智能体开工前对齐计划。
技能(Skills)
我同意 Simon Willison 的观点:技能(Skills)可能比 MCP 更重要。
关注我帖子的话,你会知道我在大多数开发工作流里已经放弃 MCP,转而构建简单的命令行工具(详见《AI 无法阅读你的文档》)。我对智能体自主性的心智模型已经演变成三个阶段:
- 单次提示:一个巨大提示包含所有上下文。(脆弱,不可扩展)
- 工具调用:经典智能体模型。手动创建工具,为智能体抽象现实。(更好,但引入新的抽象和上下文瓶颈)
- 脚本化:让智能体访问原始环境——二进制、脚本、文档——它即时写代码与它们交互。
基于这个模型,智能体技能是显而易见的下一步。它们是脚本化层的正式产品化。
如果你像我一样,已经偏爱命令行工具而非 MCP,那你一直在隐式享受技能(Skills)的好处。SKILL.md 文件只是更组织化、可共享、可发现的方式,用来记录这些 CLI 工具和脚本,并暴露给智能体。
核心要点:技能是正确的抽象。它们将基于脚本化的智能体模型正式化,比 MCP 代表的僵化、类 API 模型更健壮、更灵活。
MCP(Model Context Protocol)
技能出现不代表 MCP 已死(参见《MCP 的所有问题》)。以前很多人构建了糟糕、上下文沉重的 MCP,包含几十个工具,这些工具只是简单镜像 REST API(比如 read_thing_a()、read_thing_b()、update_thing_c())。
脚本化模型(现通过技能正式化)更好,但需要安全方式访问环境。在我看来,这才是 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),然后智能体对其进行脚本化操作。
Claude Code SDK
Claude Code 不只是交互式命令行,它还是强大的 SDK,用来构建全新的智能体,编码和非编码任务都行。大多数新的业余项目,我已经把它当默认智能体框架,不用 LangChain/CrewAI 之类的了。
三种主要用法:
-
大规模并行脚本
大规模重构、bug 修复或迁移,我不用交互式聊天。写简单的 Bash 脚本,并行调用claude -p "in /pathA change all refs from foo to bar"。比让主智能体管理几十个子智能体任务更可扩展、可控。 -
构建内部聊天工具
SDK 非常适合把复杂流程封装成简单聊天界面,给非技术用户用。比如安装程序出错时,回退到 Claude Code SDK 来修复问题。或者内部的 v0-at-home 工具,让设计团队在我们内部 UI 框架里随意写前端原型,想法高保真,代码更直接能用到生产。 -
快速智能体原型
最常用。不限于编码。任何智能体任务有想法(比如用自定义 CLI 或 MCP 的威胁调查智能体),我都用 Claude Code SDK 快速构建测试原型,再考虑完整部署。
核心要点:Claude Code SDK 是强大、通用的智能体框架。考虑更复杂框架前,先用它做批量代码处理、构建内部工具、快速原型新智能体。
Claude Code GHA
Claude Code GitHub Action(GHA)可能是我最喜欢但最容易被忽视的功能。概念很简单:就是在 GHA 里运行 Claude Code。但正是这种简单性让它如此强大。
类似 Cursor 的后台智能体或 Codex 托管 Web UI,但可定制性更强。你控制整个容器和环境,获得更多数据访问权限,更重要的是,比任何其他产品都强的沙盒和审计控制。还支持所有高级功能,比如钩子和 MCP。
我们用它构建自定义的随处 PR 工具。用户可以从 Slack、Jira,甚至 CloudWatch 警报触发 PR,GHA 修复 bug 或添加功能,返回一个充分测试的 PR。
因为 GHA 日志就是完整的智能体日志,我们有运维流程定期在公司层面审查这些日志,查找常见错误、Bash 错误或不一致的工程实践。这形成数据驱动的飞轮:Bug → 改进的 CLAUDE.md / CLI → 更好的智能体。
$ 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"核心要点:GHA 是将 Claude Code 投入运营的终极方式。它把 Claude Code 从个人工具变成工程系统中的核心、可审计、可自我改进的部分。
settings.json
最后,一些关键的 settings.json 配置,业余和专业工作都很有用:
-
HTTPS_PROXY/HTTP_PROXY
调试神器。用它检查原始流量,看 Claude 在发什么提示。对后台智能体来说,也是精细网络沙盒的强大工具。 -
MCP_TOOL_TIMEOUT/BASH_MAX_TIMEOUT_MS
我会调高这些值。喜欢运行长时间、复杂的命令,默认超时太保守。说实话,不确定现在有了 Bash 后台任务后是否还需要,但我保留着以防万一。 -
ANTHROPIC_API_KEY
工作中我们用企业 API 密钥(通过 apiKeyHelper)。从按席位许可证转为按使用量定价,更适合我们的工作模式。- 考虑了开发者使用量的巨大差异(我们见过工程师间使用量差 1:100 倍)。
- 工程师能试非 Claude Code 的 LLM 脚本,都在单一企业账户下。
-
permissions
偶尔自审允许 Claude 自动运行的命令列表。
核心要点:settings.json 是高级定制的强大位置。
结论
内容很多,希望对你有帮助。如果还没用过 Claude Code 或 Codex CLI 这样的 CLI 智能体,值得试试。关于这些高级功能,好的指南很少,唯一的学习方法就是亲自上手。