Claude Code 进阶心得

Claude Code、Gemini、Cursor 和 Codex 在CLI 领域竞争越来越激烈,在 kalshi 看真正的较量似乎在 Anthropic 和 OpenAI 。其他开发者在论坛交流时,他们的选择通常取决于一些看似肤浅的东西,某个小众功能的实现,或者他们只是更喜欢某个系统提示词的 vibe。我觉得“你是绝对正确的!你太棒了“这种输出风格并不是一个大问题。我的方法是给Agent之后不管——即委派任务、设定上下文,然后让它去工作。通过最终的 PR来评判工具,而不是它实现的过程,因为其中掺杂了太多用于对齐人类偏好的成分,而非纯粹的解决问题能力。如果你还在根据“感觉好不好用”“说话顺不顺”“UI 喜不喜欢”选 CLI agent,说明你根本没用到它们最重要的能力。


Claude Code 并没有标准答案

Claude Code开发之父Boris: My setup might be surprisingly vanilla! Claude Code works great out of the box, so I personally don’t customize it much.

通用功能早已设计内置,使用 Claude Code 没有唯一正确的方式。团队故意把它设计成可以随便折腾的样子,你想如何魔改都可以。

同时开启多个 Claude Code

Boris在他的终端里开 5 个 Claude Code 实例,标签页编号 1 到 5,开着系统通知,哪个需要输入就跳过去处理。还在 claude.ai/code 网页版上跑 5 到 10 个任务。终端和网页可以互相“交接”:用&符号把本地会话转到网页,或者用–teleport 在两边来回切换。每天早上和白天会从手机 Claude 应用上启动几个任务,晚点再回来看结果。

这种“多线程”工作方式的核心逻辑是:Claude Code 擅长自主执行,很多任务不需要你盯着。你启动任务、给个方向,让它跑着,自己去忙别的。等它需要你确认的时候再切回来。

已经转为AI生成代码人类审核,而不用人去手动生成代码。

CLAUDE.md

Boris : CLAUDE.md 是团队共享的“项目记忆”。

为了有效地使用 Claude Code,最重要的单一文件就是根目录下的 CLAUDE.md。这个文件是代理的“宪法”,是它了解你特定代码库如何工作的首要来源。

在我的项目中,CLAUDE.md只记录使用的工具和 API。

如果你不能简洁地解释你的工具,那么它就不应该进入 CLAUDE.md

添加原则

  1. 是一本“错题集”,而不是一本“教科书”。 你的 CLAUDE.md 应该从小处着手,根据 Claude 做错的地方来记录。

  2. 不要 @引用文件文档。 如果你有大量的外部文档,在 CLAUDE.md 中直接@引用会造成上下文窗口急剧膨胀。你必须向Agent明确告诉什么时候以及为什么要读取该文件。

  3. 不要说“不许动”,说“此路不通,请绕行右侧。 不要仅有负面约束,当代理认为它必须使用该标志时,它会卡住。应该始终提供一个替代方案。

  4. **将 CLAUDE.md 作为一种倒逼机制。**这是最反直觉但也最有价值的一点。如果你的 CLI 命令既复杂又啰嗦,不要试图写长篇大论的 Prompt 来教会 AI 如何使用它。那是在用文档掩盖糟糕的工程设计。

    正确做法是: 写一个简单的脚本封装复杂逻辑,提供清晰的接口,然后在 CLAUDE.md 里只记录这个新命令。强迫自己把文档写短,实际上是在倒逼你简化代码库和工具链。


紧凑、上下文与清理

不时运行 /context,了解项目的上下文窗口分配,进行及时规划。因为即使你有1M上下文,达到一定上下文窗口长度时,性能也会明显下降。

  • /compact :自动压缩是不透明的、容易出错的,而且优化得不好。
  • /clear + /catchup (简单重启):默认重启方式。/clear 状态,然后运行一个自定义的 /catchup 命令,让 Claude 读取我 git 分支中的所有更改。
  • “记录并清理” (复杂重启):对于大型任务。让 Claude 将其计划和进度转储到一个 .md 文件中,/clear 状态,然后通过告诉它读取该 .md 文件并继续来开始一个新的会话。

正如不知道怎么问AI时,问问AI不知道怎么问应该怎么问。类似Claude,不知道如何记录、清理上下文时,问Claude给出建议或者行动。


自定义斜杠命令 (Custom Slash Commands)

斜杠命令只是常用提示词的简单快捷方式。

  • /catchup:提示 Claude 读取我当前 git 分支中所有更改的文件。
  • /pr:一个简单的助手,用于清理我的代码,暂存它,并准备一个 Pull Request。

不要强迫自己记住各种花里胡哨的的命令,Claude Code能够理解任何你给他的命令,前提是命令正确高效。


自定义子代理 (Custom Subagents)

┌────────────────────────┐ │ Subagent │ ← 思考 / 决策 ├────────────────────────┤ │ Skills / CLIs │ ← 行为能力 ├────────────────────────┤ │ MCP │ ← 安全 / 状态 / 环境 ├────────────────────────┤ │ OS / Network / DB │ └────────────────────────┘ Subagent 决定“想什么”;Skill / CLI 决定“怎么做”;MCP 决定“在哪里、在什么边界内做”。

Boris 有子Agent(https://code.claude.com/docs/en/sub-agents )。子 Agent 是独立的 Claude 实例,专门干某类活。他有个 code-simplifier 子 Agent,在主 Claude 完成工作后自动简化代码;还有个 verify-app 子 Agent,专门负责端到端测试。


恢复、继续与历史

使用 claude --resumeclaude --continue来重启会话,适合重启出现 Bug 的终端或快速重启旧会话。

Claude Code 将所有会话历史记录存储在 ~/.claude/projects/ 中。如果需要,还是运行Claude,让它去分析改进。


Hooks

对于跑很久的任务,Boris 有几个策略:

一是让 Claude 完成后自动用后台 Agent 验证结果。你可以在提示词里要求,也可以用 Stop Hook 更确定性地触发。

注:Hooks 是 Claude Code 的"钩子"机制,让你在 Claude 执行操作的特定时刻插入自定义逻辑。你可以把它理解为"触发器":当某个事件发生时,自动执行你预设的命令或脚本。 Stop Hook 就是在 Claude 完成响应、准备交还控制权时。 相关文档:https://code.claude.com/docs/en/hooks

二是用 ralph-wiggum 插件 https://github.com/anthropics/claude-plugins-official/tree/main/plugins/ralph-wiggum 。这是一个有趣的设计:“Ralph 本质上就是一个 Bash 循环”:想象一个简单的死循环(while true),它不停地把同一个任务说明书(提示词文件)喂给 AI 智能体,让它一遍又一遍地改进工作,直到彻底完成。

三是在沙箱环境里用–permission-mode=dontAsk 或–dangerously-skip-permissions,让 Claude 不被权限确认打断,自己跑到底。

把 Claude 当成一个会犯错、但愿意修的 junior engineer。别在它写代码时盯着手,在它交作业时查作业。


规划模式 (Planning Mode)

使用内置的规划模式。可以在开始之前与 Claude 达成一致,既定义了如何构建某物,也定义需要停止并向我展示其工作的“检查点”。并且它新增human in loop,更好的对计划进行更改和挖掘。经常使用提升如何给Claude更好的提示词开始任务。


Skills

代理自主性的三个阶段:

  1. 单一提示 (Single Prompt): 在一个巨大的提示中给代理所有上下文。(这无法扩展)。
  2. 工具调用 (Tool Calling): “经典”代理模型。我们手工制作工具并为代理抽象现实。(更好,但创造了新的抽象和上下文瓶颈)。
  3. 脚本化 (Scripting): 我们给代理访问原始环境的权限——二进制文件、脚本和文档——它即时编写代码与它们交互。

Skill是人类给 Agent 的特定能力(Hardcoded)。Scripting 是 Agent 利用底层环境自创的能力(Generated on-the-fly)。

Skill依然保留了 Scripting 的本质(调用底层 CLI/脚本)。但它给这些脚本加了说明书目录。Claude Code它既能看菜单(Skills/CLAUDE.md),也能自己进厨房找调料(Scripting/直接运行 shell)。


MCP

Skill并不意味着 MCP 就应该立刻消失。MCP 的工作不是为代理抽象现实。它的工作是管理认证、网络和安全边界。它为代理提供入口点。就像Playwright 之所以适合 MCP,是因为它的核心价值在于“长期、有副作用、不可重放的状态”,而 MCP 正好是为“安全地托管状态”而存在的。

为什么 Playwright 适合做成 MCP?因为浏览器状态(Cookie、DOM、登录态)是无法被 Prompt 记忆,也无法通过简单的 CLI 重放的。这些“长期存活且有副作用”的状态,必须由 MCP 服务器这样一个宿主进程来持有,而 AI 只需要通过 MCP 接口去操作它。


Claude Code GitHub Action

在 GitHub Action 中运行 Claude Code。它类似于 Cursor 的后台代理或 Codex 托管的 Web UI,但可定制性要强得多。你控制整个容器和环境,给你更多的数据访问权限,而且比起其他任何产品,它提供了更强的沙盒化和审计控制。而且它支持 Hooks 和 MCP 等所有高级功能。

用它构建了自定义的“PR-from-anywhere”工具。用户可以从 Slack、Jira 触发 PR,GHA 将修复 Bug、添加功能并返回一个经过全面测试的 PR 。由于 GHA 日志是完整的代理日志,定期审查这些日志,查找常见的错误、bash 错误或未对齐的工程实践。这构建了一个数据驱动飞轮:Bug -> 改进的 CLAUDE.md / CLI -> 更好的Agent。


settings.json

  • HTTPS_PROXY/HTTP_PROXY:这对于调试非常好。用它来检查原始流量,看 Claude 发送了什么提示。
  • "permissions":允许 Claude 自动运行的命令列表。