我们最近发布了 Claude Code,这是一个用于智能体编程的命令行工具。作为一项研究项目,Claude Code 为 Anthropic 的工程师和研究人员提供了一种更原生的方式,将 Claude 集成到他们的编码工作流中。

Claude Code 故意设计得较为底层且不强制使用特定工作流,为用户提供接近原始模型的访问能力,同时保持灵活、可定制、可编写脚本并确保安全性,是一款功能强大的工具。然而,这种灵活性也带来了学习曲线,尤其对于刚接触智能体编程的工程师——直到他们建立起自己的最佳实践为止。

本文介绍了一些已被证明行之有效的通用模式,无论是 Anthropic 内部团队,还是在各种代码库、语言和环境中使用 Claude Code 的外部工程师,都从中受益。本文列出的内容并非铁律,也不适用于所有场景;请将这些建议视为起点。我们鼓励你大胆尝试,找到最适合自己的方式!

需要更详细的信息?我们的完整文档 claude.ai/code 包含本文提及的所有功能,并提供额外示例、实现细节和高级技巧。

  1. 自定义你的配置

Claude Code 是一个能自动将上下文信息拉入提示词的智能体编程助手。这种上下文收集会消耗时间和 token,但你可以通过调整环境来优化。

a. 创建 CLAUDE.md 文件

CLAUDE.md 是一个特殊文件,当开始会话时,Claude 会自动将其内容纳入上下文。因此,它是记录以下信息的理想位置:

  • 常用的 bash 命令
  • 核心文件和工具函数
  • 代码风格指南
  • 测试说明
  • 仓库协作规范(例如分支命名规则、合并还是变基等)
  • 开发环境设置(例如 pyenv use、哪些编译器可用)
  • 项目特有的异常行为或警告
  • 任何你想让 Claude 记住的信息

CLAUDE.md 文件没有强制格式要求。我们建议保持内容简洁且易于人类阅读。例如:

# Bash 命令
- npm run build:构建项目
- npm run typecheck:运行类型检查

# 代码风格
- 使用 ES 模块语法(import/export),而非 CommonJS(require)
- 尽可能解构导入(例如 import { foo } from 'bar')

# 工作流
- 完成一系列代码修改后,务必进行类型检查
- 为提升性能,尽量只运行单个测试,而非整个测试套件

你可以将 CLAUDE.md 文件放在多个位置:

  • 仓库根目录,或你运行 claude 命令的地方(最常见用法)。建议将其命名为 CLAUDE.md 并提交到 git,以便在不同会话和团队成员之间共享;也可命名为 CLAUDE.local.md 并加入 .gitignore
  • 你运行 claude 目录的任意父目录:这在单体仓库中特别有用。例如你在 root/foo 运行 claude,而 root/CLAUDE.mdroot/foo/CLAUDE.md 中都有 CLAUDE.md 文件,这两者都会被自动拉入上下文
  • 你运行 claude 目录的任意子目录:与上述情况相反,此时 Claude 会在你处理子目录文件时按需拉入 CLAUDE.md 文件
  • 家目录~/.claude/CLAUDE.md),这样会在所有你的 claude 会话中生效

运行 /init 命令时,Claude 将自动为你生成一个 CLAUDE.md 文件。

b. 优化你的 CLAUDE.md 文件

你的 CLAUDE.md 文件会成为 Claude 提示词的一部分,因此应像优化常用提示词一样不断改进。常见错误是添加大量内容而未迭代其有效性。请花时间实验,确定何种内容能让模型更好地遵循指令。

你可以手动向 CLAUDE.md 添加内容,或按下 # 键给出指令,Claude 会自动将其整合进相应的 CLAUDE.md 文件。许多工程师在编码时常按 # 记录命令、文件和风格规范,随后将 CLAUDE.md 的更改提交给团队,使其他人也能受益。

在 Anthropic,我们有时会用 提示词优化器 处理 CLAUDE.md 文件,并经常调整指令(例如用 "IMPORTANT" 或 "YOU MUST" 强调)以提高指令遵从性。

图 1:Claude Code 工具白名单

c. 精心管理 Claude 的允许工具列表

默认情况下,Claude Code 会对任何可能修改系统的操作请求权限:文件写入、许多 Bash 命令、MCP 工具等。我们出于安全优先的考虑,特意采用这种保守设计。你可自定义白名单,允许你认为安全的额外工具,或允许可轻松撤销但可能存在风险的工具(如文件编辑、git commit)。

有四种管理允许工具的方法:

  • 会话中选择“始终允许”
  • 启动 Claude Code 后使用 /permissions 命令,添加或移除工具。例如添加 Edit 以始终允许文件编辑,Bash(git commit:*) 以允许提交,mcp__puppeteer__puppeteer_navigate 以允许通过 Puppeteer MCP 服务器导航
  • 手动编辑 .claude/settings.json~/.claude.json(建议将前者加入源代码控制,与团队共享)
  • 使用 --allowedTools CLI 标志 设置会话级权限

d. 若使用 GitHub,请安装 gh CLI

Claude 知道如何使用 gh CLI 与 GitHub 交互,用于创建 issues、打开 pull requests、读取评论等。若未安装 gh,Claude 仍可通过 GitHub API 或 MCP 服务器(如果已安装)与 GitHub 通信。

  1. 为 Claude 添加更多工具

Claude 可访问你的 shell 环境,你可像为自己搭建环境一样,为它创建一组便捷脚本和函数。它还可以通过 MCP 和 REST API 使用更复杂的工具。

a. 将 Claude 与 bash 工具结合使用

Claude Code 继承了你的 bash 环境,因此能访问所有你的工具。虽然 Claude 熟悉诸如 Unix 工具和 gh 等常用工具,但除非明确告知,否则它并不知道你的自定义 bash 工具:

  1. 告诉 Claude 工具名称及使用示例
  2. 让 Claude 运行 --help 查看工具文档
  3. CLAUDE.md 中记录常用工具

b. 将 Claude 与 MCP 结合使用

Claude Code 可同时作为 MCP 服务器和客户端。作为客户端,它可以连接任意数量的 MCP 服务器,通过三种方式访问其工具:

  • 项目配置(在该目录运行 Claude Code 时可用)
  • 全局配置(所有项目中可用)
  • 检入的 .mcp.json 文件(代码库中所有开发者均可使用)。例如,你可以在 .mcp.json 中添加 Puppeteer 和 Sentry 服务器,使每位开发者都能开箱即用地使用这些工具。

使用 MCP 时,启动 Claude 时加上 --mcp-debug 标志有助于识别配置问题。

c. 使用自定义斜杠命令

对于重复性工作流(如调试循环、日志分析等),可将提示词模板存储在 .claude/commands 文件夹的 Markdown 文件中。当你输入 / 时,这些模板会出现在斜杠命令菜单中。你可以将这些命令提交到 git,让团队其他成员也能使用。

自定义斜杠命令可包含特殊关键字 $ARGUMENTS 来传入参数。

例如,以下斜杠命令可用于自动拉取并修复 GitHub issue:

请分析并修复 GitHub issue:$ARGUMENTS。

请按以下步骤操作:

1. 使用 `gh issue view` 获取 issue 详细信息
2. 理解 issue 中描述的问题
3. 在代码库中搜索相关文件
4. 实施必要的更改以修复问题
5. 编写并运行测试以验证修复
6. 确保代码通过 linting 和类型检查
7. 创建描述性提交信息
8. 推送并创建 PR

请记住在所有 GitHub 相关任务中使用 GitHub CLI (`gh`)。

将上述内容放入 .claude/commands/fix-github-issue.md 后,即可在 Claude Code 中通过 /project:fix-github-issue 命令使用。例如,/project:fix-github-issue 1234 即可让 Claude 修复 issue #1234。同样,你可将个人命令添加到 ~/.claude/commands 文件夹,使其在所有会话中可用。

  1. 尝试常见工作流

Claude Code 不强制使用特定工作流,给予你充分的灵活性。在这一灵活性空间内,我们的用户社区已涌现出几种有效且成功的模式:

a. 探索、规划、编码、提交

这是一种适用于多数问题的通用工作流:

  1. 让 Claude 阅读相关文件、图片或 URL,你可以提供一般性指引(如“读处理日志的文件”)或具体文件名(如“读 logging.py”),但要明确告诉它目前不要写代码。 1. 在此阶段,尤其对于复杂问题,应积极使用子智能体(subagents)。让 Claude 使用子智能体验证细节或探究其疑问,尤其是在对话或任务初期,通常能保留上下文且不会明显损失效率。

  2. 让 Claude 为解决特定问题制定计划。我们建议使用“think”一词触发扩展思考模式,使 Claude 有更多计算时间来更深入评估各种选项。这些特定短语直接对应系统中不同级别的思考预算:“think” < “think hard” < “think harder” < “ultrathink”。每个级别为 Claude 分配的思考预算逐步增加。 1. 如果此步骤结果合理,可让 Claude 用文档或 GitHub issue 记录计划,以便在实现(第 3 步)不如预期时能回退到此状态。

  3. 让 Claude 用代码实现解决方案。这也是一个好时机,可要求它在实现时显式验证方案的合理性。

  4. 让 Claude 提交结果并创建 Pull Request。如相关,此时也应让 Claude 更新 README 或变更日志,说明其刚刚所做修改。

第 1-2 步至关重要——缺少这两步,Claude 往往会直接跳到编码。虽然有时这正是你想要的,但要求 Claude 先研究和计划,能显著提升需要深度前期思考的问题的处理效果。

b. 写测试,提交;编码,迭代,提交

这是 Anthropic 员工喜爱的工作流,适用于可通过单元、集成或端到端测试轻松验证的变更。在智能体编程加持下,测试驱动开发(TDD)变得更加强大:

  1. 让 Claude 根据预期的输入/输出对编写测试。要明确指出你正在采用测试驱动开发,以防止它为代码库中尚不存在的功能创建模拟实现。

  2. 让 Claude 运行测试并确认测试失败。明确要求此阶段不要编写实现代码通常很有帮助。

  3. 当你对测试满意时,让 Claude 提交测试

  4. 让 Claude 编写能通过测试的代码,并告知它不要修改测试。要求 Claude 持续迭代,直到所有测试通过。通常需要几次迭代:写代码 -> 运行测试 -> 调整代码 -> 再运行测试。 1. 此阶段可让它使用独立的子智能体验证实现是否没有过拟合测试

  5. 当对更改满意时,让 Claude 提交代码

当 Claude 有明确目标(如视觉原型、测试用例或其他输出)进行迭代时,表现最佳。通过提供测试等预期输出,Claude 可以不断修改、评估结果并逐步改进,直到成功。

c. 写代码,截图结果,迭代

类似于测试工作流,你可以为 Claude 提供视觉目标:

  1. 让 Claude 能够获取浏览器截图(例如使用 Puppeteer MCP 服务器iOS 模拟器 MCP 服务器,或手动复制/粘贴截图)。
  2. 通过复制/粘贴、拖放或提供图片路径,将视觉原型给到 Claude。
  3. 让 Claude 用代码实现设计,截图结果,并持续迭代直到结果与原型匹配
  4. 当你满意时,让 Claude 提交

与人类相似,Claude 的输出通常会随着迭代显著提升。初版可能尚可,但经过 2-3 次迭代后通常会好得多。为 Claude 提供查看其输出的工具,才能获得最佳结果。

图 2:安全的“YOLO”模式

d. 安全的“YOLO”模式

你可以使用 claude --dangerously-skip-permissions 跳过所有权限检查,让 Claude 无中断运行直至完成,而不是监督它。这种模式适用于修复 lint 错误或生成样板代码等工作流。

允许 Claude 运行任意命令有风险,可能导致数据丢失、系统损坏,甚至数据泄露(如通过提示词注入攻击)。为最小化风险,请在无网络连接的容器中使用 --dangerously-skip-permissions。可参考此使用 Docker Dev 容器的 参考实现

e. 代码库问答

初到新代码库时,可使用 Claude Code 进行学习和探索。你可以像结对编程时向项目中的另一位工程师提问那样问 Claude。Claude 可以自主搜索代码库,回答一般性问题,例如:

  • 日志系统是如何工作的?
  • 如何创建新的 API 端点?
  • foo.rs 文件第 134 行的 async move { ... } 做了什么?
  • CustomerOnboardingFlowImpl 处理了哪些边界情况?
  • 为何在第 333 行调用 foo() 而不是 bar()
  • baz.py 第 334 行的等效 Java 实现是什么?

在 Anthropic,这种用法已成为核心入职工作流,显著缩短了上手时间,并减轻了其他工程师的负担。无需特殊提示!只需提问,Claude 就会探索代码以寻找答案。

图 3:让 Claude 与 git 交互

f. 让 Claude 与 git 交互

Claude 能有效处理许多 git 操作。许多 Anthropic 工程师将 Claude 用于 90% 以上的 git 操作:

  • 搜索 git 历史 以回答诸如“v1.2.3 包含了哪些变更?”、“谁负责这个特性?”或“为何这个 API 要如此设计?”等问题。明确提示 Claude 查阅 git 历史以回答此类查询很有帮助。
  • 编写提交信息:Claude 会自动查看你的变更和近期历史,综合所有相关上下文撰写提交信息
  • 处理复杂 git 操作,例如恢复文件、解决变基冲突,以及比较和移植补丁

g. 让 Claude 与 GitHub 交互

Claude Code 可管理许多 GitHub 操作:

  • 创建 Pull Requests:Claude 理解缩写 “pr”,并会根据差异和上下文生成合适的提交信息。
  • 一键解决问题:对于简单的代码审查评论,只需告诉 Claude 修复 PR 中的评论(可选地给出更具体指示),完成后推送到 PR 分支。
  • 修复构建失败 或 Linter 警告
  • 分类和筛选待处理 Issues:让 Claude 循环遍历所有开放的 GitHub Issues

这消除了记住 gh 命令行语法的需要,并自动化了日常任务。

h. 让 Claude 处理 Jupyter 笔记本

Anthropic 的研究人员和数据科学家使用 Claude Code 读写 Jupyter 笔记本。Claude 能解读输出(包括图片),提供了一种快速探索和与数据交互的方式。没有强制的工作流或提示,但我们推荐的工作流是:在 VS Code 中将 Claude Code 和 .ipynb 文件并排打开。

你也可以让 Claude 在展示给同事之前清理或美化 Jupyter 笔记本。明确告诉它让笔记本或其数据可视化“美观”通常有助于提醒它优化人类的阅读体验。

  1. 优化你的工作流

以下建议适用于所有工作流:

a. 指令要具体

Claude Code 的成功率在指令越具体时越高,尤其是在初次尝试时。事先给出明确指示,可减少后续调整的需求。

例如:

不佳良好
为 foo.py 添加测试为 foo.py 编写一个新测试用例,覆盖用户未登录这一边界情况。避免使用模拟
为什么 ExecutionFactory 有如此奇怪的 API?查阅 ExecutionFactory 的 git 历史,总结其 API 的演变过程
添加一个日历组件查看首页上现有组件的实现方式,理解代码和接口分离的模式。HotDogWidget.php 是一个很好的起点。然后遵循这一模式,实现一个新的日历组件,允许用户选择月份并通过向前/向后翻页选择年份。从头构建,只能使用代码库中已用的库

Claude 能推断意图,但无法读心。越具体,越能与预期对齐。

图 4:给 Claude 图片

b. 给 Claude 提供图片

Claude 能通过多种方法出色处理图片和图表:

  • 粘贴截图(小技巧:在 macOS 上按 cmd+ctrl+shift+4 截图到剪贴板,然后按 ctrl+v 粘贴。注意这不是通常在 Mac 上使用的 cmd+v,且远程操作无效。)
  • 直接拖放图片到提示输入框
  • 提供图片的文件路径

在以设计原型作为 UI 开发参考点,或分析调试视觉图表时,这尤其有用。若不添加视觉内容到上下文,也仍可明确告诉 Claude 结果的视觉美观性很重要。

图 5:提及你希望 Claude 查看或操作的文件

c. 提及你希望 Claude 查看或操作的文件

使用 Tab 补全,可快速引用仓库中任意位置的文件或文件夹,帮助 Claude 找到或更新正确资源。

图 6:给 Claude 提供 URL

d. 给 Claude 提供 URL

在提示中粘贴特定 URL,让 Claude 获取并阅读。为避免对相同域名(如 docs.foo.com)重复请求权限,可使用 /permissions 将域名加入白名单。

e. 提前并频繁纠正方向

虽然自动接受模式(按 Shift+Tab 切换)可让 Claude 自主工作,但你通常会通过积极参与和引导获得更好的结果。最好的做法是在开始时彻底向 Claude 解释任务,同时也可以随时纠正其方向。

以下四个工具可帮助纠正方向:

  • 在编码前让 Claude 制定计划。明确告知在确认计划合理前不要编码。
  • 按 Esc 键中断 Claude 在任何阶段(思考、工具调用、文件编辑)的操作,保留上下文以便你重新引导或扩展指令。
  • 双击 Esc 键回溯历史,编辑之前的提示,并探索不同方向。可以反复编辑提示直到获得满意结果。
  • 让 Claude 撤销更改,通常与上述方法结合使用,以尝试不同路径。

尽管 Claude Code 偶尔能第一次就完美解决问题,但使用这些纠正工具通常能更快获得更好的解决方案。

f. 使用 /clear 保持上下文聚焦

长时间会话中,Claude 的上下文窗口可能充满不相关的对话、文件内容和命令,这会降低性能,有时还会干扰 Claude。在任务之间频繁使用 /clear 命令可重置上下文窗口。

g. 复杂工作流使用清单和草稿纸

对于多步骤的大任务或需要详尽解决方案的任务(如代码迁移、批量修复 lint 错误或运行复杂构建脚本),让 Claude 使用 Markdown 文件(甚至 GitHub issue)作为清单和工作草稿,能提升表现:

例如,修复大量 lint 问题,可按以下步骤进行:

  1. 让 Claude 运行 lint 命令,并将所有错误(含文件名和行号)写入 Markdown 清单
  2. 指示 Claude 逐个解决问题,修复并验证后再勾选并进入下一个

h. 将数据传入 Claude

有几种方法可向 Claude 提供数据:

  • 直接复制粘贴到提示中(最常用方法)
  • 通过管道传入 Claude Code(例如 cat foo.txt | claude),对日志、CSV 和大数据特别有用
  • 让 Claude 通过 bash 命令、MCP 工具或自定义斜杠命令拉取数据
  • 让 Claude 读取文件或获取 URL(也适用于图片)

多数会话会结合使用这些方法。例如,你可以通过管道传入日志文件,然后告诉 Claude 使用工具拉取更多上下文来调试日志。

  1. 使用无头模式自动化你的基础设施

Claude Code 提供无头模式,用于 CI、提交前钩子、构建脚本和自动化等非交互式场景。使用 -p 标志加提示词启用无头模式,使用 --output-format stream-json 获取流式 JSON 输出。

注意:无头模式不会在会话间持久存在,必须在每次会话中触发。

a. 使用 Claude 进行 issue 筛选

无头模式可驱动由 GitHub 事件触发的自动化,例如代码库中创建新 issue 时。例如,公开的 Claude Code 仓库 使用 Claude 检查传入的新 issue 并分配适当标签。

b. 将 Claude 作为 linter 使用

Claude Code 可提供主观代码审查,识别传统 linter 工具检测不到的问题,如拼写错误、陈旧注释、误导性的函数或变量名等。

  1. 通过多 Claude 工作流提升能力

除了独立使用,一些最强大的应用涉及并行运行多个 Claude 实例:

a. 一个 Claude 写代码;另一个 Claude 验证

一种简单但有效的方法是让一个 Claude 写代码,另一个审核或测试。就像与多名工程师合作,有时独立的上下文更有利:

  1. 用 Claude 写代码
  2. 运行 /clear 或在另一终端启动第二个 Claude
  3. 让第二个 Claude 审核第一个 Claude 的工作
  4. 启动另一个 Claude(或再次 /clear)读取代码和审核反馈
  5. 让这个 Claude 根据反馈修改代码

你也可以对测试这样做:让一个 Claude 写测试,另一个 Claude 写出通过测试的代码。你甚至可以让 Claude 实例相互通信,通过给它们分配不同的工作草稿并指定写入和读取哪个。

这种分离方式的结果通常优于让单个 Claude 处理所有事情。

b. 使用多个代码库副本

无需等待 Claude 完成每一步,Anthropic 的许多工程师会:

  1. 在不同文件夹中创建 3-4 个 git 副本
  2. 在多个终端标签中打开每个文件夹
  3. 在每个文件夹中启动 Claude,分配不同任务
  4. 轮流切换,检查进度并批准/拒绝权限请求

c. 使用 git worktrees

此方法适用于多个独立任务,比多个副本更轻量。git worktrees 允许你从同一个仓库检出多个分支到不同目录。每个 worktree 拥有独立的文件工作目录,同时共享相同的 Git 历史和 reflog。

使用 git worktrees 可让你在项目的不同部分同时运行多个 Claude 会话,每个会话专注于独立任务。例如,你可让一个 Claude 重构认证系统,同时另一个开发完全无关的数据可视化组件。由于任务不重叠,每个 Claude 可全速工作,无需等待对方的更改或处理合并冲突:

  1. 创建 worktreesgit worktree add ../project-feature-a feature-a
  2. 在每个 worktree 中启动 Claudecd ../project-feature-a && claude
  3. 根据需要创建更多 worktrees(在新终端标签中重复步骤 1-2)

一些提示:

  • 使用一致的命名规范
  • 每个 worktree 对应一个终端标签
  • 如果你在 Mac 上使用 iTerm2,设置通知,当 Claude 需要关注时提醒你
  • 为不同 worktrees 使用单独的 IDE 窗口
  • 完成后清理:git worktree remove ../project-feature-a

d. 在自定义框架中使用无头模式

claude -p(无头模式)可编程地将 Claude Code 集成到更大工作流中,同时利用其内置工具和系统提示。无头模式有两种主要使用模式:

  1. 分发处理(Fanning out):处理大型迁移或分析(如分析数百条日志的情感或分析数千个 CSV):

  2. 让 Claude 写一个脚本生成任务列表。例如生成 2000 个需要从框架 A 迁移到框架 B 的文件列表。

  3. 遍历任务,为每个任务编程调用 Claude,并给出任务和可用工具集。例如:claude -p “将 foo.py 从 React 迁移到 Vue。完成后,必须返回字符串 OK(成功)或 FAIL(失败)。” --allowedTools Edit Bash(git commit:*)

  4. 多次运行脚本,并优化你的提示词以获得理想结果。

  5. 流水线处理(Pipelining):将 Claude 集成到现有数据/处理流水线:

  6. 调用 claude -p “<你的提示>” --json | your_command,其中 your_command 是处理流水线的下一步

  7. 完成!可选的 JSON 输出有助于为自动化处理提供结构。

对于这两种用例,使用 --verbose 标志调试 Claude 调用可能会有帮助。我们通常建议在生产环境中关闭详细模式,以获得更清爽的输出。

你在使用 Claude Code 时有哪些技巧和最佳实践?@AnthropicAI 让我们看看你在构建什么!

致谢

作者:Boris Cherny。本工作借鉴了 Claude Code 用户社区的广泛最佳实践,他们富有创意的方法和工作流程持续启发着我们。特别感谢 Daisy Hollman、Ashwin Bhat、Cat Wu、Sid Bidasaria、Cal Rueb、Nodir Turakulov、Barry Zhang、Drew Hodun 以及其他许多 Anthropic 工程师,他们对 Claude Code 的宝贵见解和实践经验帮助塑造了这些建议。

图 7:互锁的拼图块,具有复杂几何形状和精细表面纹理