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 自动运行的命令列表。