我们最近发布了 Claude Code,这是一个用于 AI 智能体编码的命令行工具。作为研究项目开发的 Claude Code 为 Anthropic 的工程师和研究人员提供了一种更原生的方式将 Claude 整合到编码工作流程中。
Claude Code 有意设计得较为底层且不带强制观点,提供接近原始模型的访问权限,而不强制特定的工作流程。这种设计理念创造了一个灵活、可定制、可编写脚本且安全的强大工具。虽然功能强大,但这种灵活性对于刚接触 AI 智能体编码工具的工程师来说存在学习曲线——至少在他们形成自己的最佳实践之前是如此。
本文概述了已被证明有效的一般模式,这些模式不仅适用于 Anthropic 的内部团队,也适用于在各种代码库、语言和环境中使用 Claude Code 的外部工程师。这份清单中的内容并非一成不变,也不普遍适用;可以将这些建议视为起点。我们鼓励你进行实验,找到最适合你的方法!
1. 自定义您的设置
Claude Code 是一个 AI 智能体编码助手,它自动将上下文整合到提示中。这种上下文收集会消耗时间和 token,但您可以通过环境调整来优化它。
a. 创建 CLAUDE.md 文件
CLAUDE.md 是一个特殊文件,当开始对话时 Claude 会自动将其加入上下文。这使其成为记录以下内容的理想场所:
- 常用的 bash 命令
- 核心文件和实用函数
- 代码风格指南
- 测试说明
- 代码仓库规范(例如,分支命名,合并与变基等)
- 开发者环境设置(例如,使用 pyenv,哪些编译器可用)
- 项目特有的任何意外行为或警告
- 您希望 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 的目录的任何父目录。这对于多仓库项目(monorepos)最有用,您可能从 root/foo 运行 claude,并在 root/CLAUDE.md 和 root/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,我们偶尔会通过提示优化器(prompt improver)运行 CLAUDE.md 文件,并经常调整指令(例如添加"重要"或"必须"等强调词)以提高指令遵循度。
c. 精心策划 Claude 的允许工具列表
默认情况下,Claude Code 会请求任何可能修改您系统的操作的权限:文件写入、许多 bash 命令、MCP 工具等。我们有意以这种谨慎的方式设计 Claude Code,以优先考虑安全性。您可以自定义允许列表,以授权您知道安全的其他工具,或允许潜在不安全但易于撤消的工具(例如,文件编辑,git commit)。
有四种管理允许工具的方式:
- 在会话期间出现提示时选择"总是允许"。
- 在启动 Claude Code 后使用 /allowed-tools 命令来添加或删除允许列表中的工具。例如,您可以添加 Edit 以始终允许文件编辑,Bash(git commit:*) 以允许 git 提交,或 mcp__puppeteer__puppeteer_navigate 以允许使用 Puppeteer MCP 服务器进行导航。
- 手动编辑您的 .claude/settings.json 或 ~/.claude.json(我们建议将前者提交到源代码控制中以与您的团队共享)。
- 使用 --allowedTools CLI 标志进行特定会话的权限设置。
d. 如果使用 GitHub,请安装 gh CLI
Claude 知道如何使用 gh CLI 与 GitHub 交互,用于创建问题、打开拉取请求、阅读评论等。如果没有安装 gh,Claude 仍然可以使用 GitHub API 或 MCP 服务器(如果您已安装这些)。
2. 为 Claude 提供更多工具
Claude 可以访问您的 shell 环境,您可以为它构建便利脚本和函数集,就像为自己构建一样。它还可以通过 MCP 和 REST API 利用更复杂的工具。
a. 将 Claude 与 bash 工具结合使用
Claude Code 继承了您的 bash 环境,使其能够访问您的所有工具。虽然 Claude 了解常见的工具,如 unix 工具和 gh,但如果没有指令,它将不会知道您的自定义 bash 工具:
- 告诉 Claude 工具名称及使用示例
- 告诉 Claude 运行 –help 以查看工具文档
- 在 CLAUDE.md 中记录常用工具
b. 将 Claude 与 MCP 结合使用
Claude Code 既是 MCP 服务器也是客户端。作为客户端,它可以连接到任意数量的 MCP 服务器,通过以下三种方式访问它们的工具:
- 在项目配置中(在该目录中运行 Claude Code 时可用)
- 在全局配置中(在所有项目中可用)
- 在版本控制系统中的 .mcp.json 文件中(对在您代码库中工作的任何人都可用)。例如,您可以将 Puppeteer 和 Sentry 服务器添加到您的 .mcp.json 中,这样每个在您的代码库中工作的工程师都可以立即使用这些工具。
使用 MCP 时,启动 Claude 时使用 --mcp-debug 标志有助于识别配置问题。
c. 使用自定义斜杠命令
对于重复的工作流程——调试循环、日志分析等——将提示模板存储在 .claude/commands 文件夹中的 Markdown 文件中。当您输入 / 时,这些命令通过斜杠命令菜单可用。您可以将这些命令提交到 git 中,使它们对您团队的其他成员可用。
自定义斜杠命令可以包含特殊关键字 $ARGUMENTS,以从命令调用传递参数。
例如,这里有一个斜杠命令,您可以用它自动拉取并修复 Github 问题:
请分析并修复 GitHub 问题:$ARGUMENTS。
按照以下步骤操作:
1. 使用 `gh issue view` 获取问题详情
2. 理解问题中描述的问题
3. 搜索代码库中的相关文件
4. 实施必要的更改以修复问题
5. 编写并运行测试以验证修复
6. 确保代码通过代码检查和类型检查
7. 创建描述性的提交信息
8. 推送并创建 PR
记住使用 GitHub CLI(`gh`)处理所有 GitHub 相关任务。
将上述内容放入 .claude/commands/fix-github-issue.md 中,使其在 Claude Code 中作为 /project:fix-github-issue 命令可用。例如,您可以使用 /project:fix-github-issue 1234 让 Claude 修复问题 #1234。同样,您可以将您自己的个人命令添加到 ~/.claude/commands 文件夹中,以便在所有会话中都可使用这些命令。
3. 尝试常见工作流程
Claude Code 不强制特定的工作流程,给您灵活性,可以按照您想要的方式使用它。在这种灵活性提供的空间内,我们的用户社区中已经出现了几种成功的模式,可以有效地使用 Claude Code:
a. 探索、规划、编码、提交
这种多功能工作流程适用于许多问题:
- 请求 Claude 阅读相关文件、图像或 URL,提供一般指示(“阅读处理日志记录的文件”)或具体文件名(“阅读 logging.py”),但明确告诉它现在还不要编写任何代码。
- 这是工作流程中应该考虑大量使用 AI 子智能体的部分,特别是对于复杂问题。告诉 Claude 使用 AI 子智能体来验证细节或调查它可能有的特定问题,尤其是在对话或任务的早期阶段,往往能在不损失效率的情况下保持上下文可用性。
- 请求 Claude 制定解决特定问题的计划。我们建议使用"think"一词触发扩展思考模式,这给予 Claude 额外的计算时间来更彻底地评估替代方案。这些特定短语直接映射到系统中增加的思考计算预算水平:“think”<“think hard”<“think harder”<“ultrathink”。每个级别为 Claude 分配逐渐增加的思考计算资源。
- 如果这一步的结果看起来合理,您可以让 Claude 创建一个文档或 GitHub 问题来记录其计划,这样如果实现(第 3 步)不是您想要的,您可以重置到这个位置。
- 请求 Claude 用代码实现其解决方案。这也是一个好地方,可以请求它在实现解决方案的各个部分时明确验证其解决方案的合理性。
- 请求 Claude 提交结果并创建拉取请求。如果相关,这也是一个好时机让 Claude 更新任何 README 或更新日志,解释它刚刚做了什么。
步骤 #1-#2 至关重要——如果没有它们,Claude 倾向于直接跳到编码解决方案。虽然有时这正是您想要的,但请求 Claude 首先研究和规划会显著提高需要前期深入思考的问题的性能。
b. 编写测试、提交;编码、迭代、提交
这是 Anthropic 最喜欢的工作流程,适用于可以通过单元测试、集成测试或端到端测试轻松验证的更改。使用 AI 智能体编码时,测试驱动开发(TDD)变得更加强大:
- 请求 Claude 基于预期的输入/输出对编写测试。明确表示您正在进行测试驱动开发,这样它就会避免创建模拟实现,即使是对代码库中尚不存在的功能也是如此。
- 告诉 Claude 运行测试并确认它们失败。明确告诉它在这个阶段不要编写任何实现代码通常很有帮助。
- 当您对测试满意时,请求 Claude 提交测试。
- 请求 Claude 编写通过测试的代码,指示它不要修改测试。告诉 Claude 继续直到所有测试通过。通常 Claude 需要几次迭代来编写代码、运行测试、调整代码并再次运行测试。
- 在这个阶段,请求它使用独立的 AI 子智能体验证实现没有过度拟合测试会有所帮助
- 当您对更改满意时,请求 Claude 提交代码。
当 Claude 有一个明确的目标来迭代——视觉模型、测试用例或其他类型的输出时,它表现最佳。通过提供预期的输出(如测试),Claude 可以进行更改、评估结果并逐步改进,直到成功。
c. 编写代码、截图结果、迭代
类似于测试工作流程,您可以为 Claude 提供视觉目标:
- 给 Claude 一种截取浏览器截图的方法(例如,使用 Puppeteer MCP 服务器、iOS 模拟器 MCP 服务器 或手动复制/粘贴截图到 Claude)。
- 给 Claude 一个视觉模型,通过复制/粘贴或拖放图像直接到提示输入中,或者给 Claude 图像文件路径。
- 请求 Claude 用代码实现设计,截取结果的截图,并迭代直到其结果匹配模型。
- 当您满意时,请求 Claude 提交。
就像人类一样,Claude 的输出通常会随着迭代显著改进。虽然第一个版本可能已经很好,但经过 2-3 次迭代,它通常会看起来好得多。给 Claude 工具来查看其输出,以获得最佳结果。
d. 安全 YOLO 模式
不是监督 Claude,您可以使用 claude --dangerously-skip-permissions 绕过所有权限检查,让 Claude 不中断地工作直到完成。这适用于修复 lint 错误或生成样板代码等工作流程。
让 Claude 运行任意命令是有风险的,可能导致数据丢失、系统损坏,甚至数据泄露(例如,通过提示注入攻击)。为了最小化这些风险,使用 --dangerously-skip-permissions 在没有互联网访问的容器中。您可以参考使用 Docker Dev Containers 的参考实现。
e. 代码库问答
在接触新代码库时,使用 Claude Code 进行学习和探索。您可以向 Claude 提出与结对编程(pair programming)时向项目中的另一位工程师提出的相同类型的问题。Claude 可以主动搜索代码库,回答一般性问题,如:
- 日志记录是如何工作的?
- 如何创建新的 API 端点?
- foo.rs 第 134 行的 async move { … } 做什么?
- CustomerOnboardingFlowImpl 处理哪些边缘情况?
- 为什么我们在第 333 行调用 foo() 而不是 bar()?
- baz.py 第 334 行的 Java 等价物是什么?
在 Anthropic,以这种方式使用 Claude Code 已成为我们的核心入职工作流程,显著改善了上手时间并减轻了其他工程师的负担。不需要特殊提示!只需提出问题,Claude 将探索代码以找到答案。
f. 使用 Claude 与 git 交互
Claude 可以有效地处理许多 git 操作。许多 Anthropic 工程师使用 Claude 处理 90% 以上的 git 交互:
- 搜索 git 历史记录以回答问题,如"v1.2.3 中包含哪些更改?"、“谁拥有这个特定功能?“或"为什么这个 API 这样设计?“明确提示 Claude 查看 git 历史记录来回答这类查询会有所帮助。
- 撰写提交信息。Claude 将自动查看您的更改和最近的历史记录,以撰写考虑到所有相关上下文的信息
- 处理复杂的 git 操作,如恢复文件、解决变基冲突以及比较和移植补丁
g. 使用 Claude 与 GitHub 交互
Claude Code 可以管理许多 GitHub 交互:
- 创建拉取请求:Claude 理解简写"pr”,并将根据差异和周围上下文生成适当的提交信息。
- 实现一次性解决方案,用于简单的代码审查评论:只需告诉它修复您 PR 上的评论(可选,给它更具体的指示),并在完成后推送回 PR 分支。
- 修复失败的构建或 linter 警告
- 分类和分流开放问题,方法是请求 Claude 循环处理开放的 GitHub 问题
这消除了记住 gh 命令行语法的需要,同时自动化了常规任务。
h. 使用 Claude 处理 Jupyter notebooks
Anthropic 的研究人员和数据科学家使用 Claude Code 读写 Jupyter notebooks。Claude 可以解释输出,包括图像,提供快速探索和交互数据的方式。没有必需的提示或工作流程,但我们推荐的工作流程是在 VS Code 中并排打开 Claude Code 和 .ipynb 文件。
您还可以请求 Claude 在向同事展示之前清理或改进 Jupyter notebook 的美观性。具体告诉它让 notebook 或其数据可视化"美观"往往有助于提醒它正在优化人类查看体验。
4. 优化您的工作流程
以下建议适用于所有工作流程:
a. 在指令中具体明确
Claude Code 的成功率在首次尝试时会随着更具体的指令显著提高。提前给出清晰的方向可减少后期需要的修正。
例如:
不佳 | 良好 |
---|---|
为 foo.py 添加测试 | 为 foo.py 编写一个新的测试用例,覆盖用户已注销的边缘情况。避免使用模拟 |
为什么 ExecutionFactory 有如此奇怪的 api? | 查看 ExecutionFactory 的 git 历史并总结其 api 是如何形成的 |
添加日历小部件 | 查看主页上现有小部件的实现方式,了解模式,特别是代码和接口如何分离。HotDogWidget.php 是一个很好的起点。然后,遵循模式实现一个新的日历小部件,让用户选择月份并向前/向后翻页选择年份。从头开始构建,不使用代码库其余部分已使用的库以外的库。 |
Claude 可以推断意图,但它不能读心。具体明确会更好地符合期望。
b. 给 Claude 提供图像
Claude 通过几种方法擅长处理图像和图表:
- 粘贴截图(专业提示:在 macOS 中按 cmd+ctrl+shift+4 截图到剪贴板,然后按 ctrl+v 粘贴)
- 拖放图像直接到提示输入中
- 提供文件路径给图像
这在使用设计模型作为 UI 开发的参考点,以及用于分析和调试的视觉图表时特别有用。如果您没有将视觉元素添加到上下文中,明确告诉 Claude 结果的视觉吸引力有多重要仍然会有所帮助。
c. 提及您希望 Claude 查看或处理的文件
使用 tab 补全功能(tab completion)快速引用存储库中任何位置的文件或文件夹,帮助 Claude 找到或更新正确的资源。
d. 给 Claude 提供 URL
在提示旁边粘贴特定的 URL,让 Claude 获取并阅读。为避免对相同域名(例如,docs.foo.com)的权限提示,使用 /allowed-tools 将域名添加到您的允许列表中。
e. 及早且频繁地调整方向
虽然自动接受模式(按 shift+tab 切换)允许 Claude 自主工作,但通过成为积极的合作者并指导 Claude 的方法,您通常会获得更好的结果。您可以通过在开始时彻底解释任务给 Claude 获得最佳结果,但您也可以随时调整 Claude 的方向。
这四个工具可帮助调整方向:
- 请求 Claude 在编码前制定计划。明确告诉它直到您确认其计划看起来不错之前不要编码。
- 按 Escape 键中断 Claude 在任何阶段(思考、工具调用、文件编辑),保留上下文以便您可以重定向或扩展指令。
- 双击 Escape 跳回历史记录,编辑之前的提示,并探索不同的方向。您可以编辑提示并重复,直到获得您想要的结果。
- 请求 Claude 撤消更改,通常与选项 #2 结合使用,以采取不同的方法。
虽然 Claude Code 偶尔会在第一次尝试时完美解决问题,但使用这些调整工具通常会更快地产生更好的解决方案。
f. 使用 /clear 保持上下文集中
在长时间会话中,Claude 的上下文窗口(context window)可能会充满无关的对话、文件内容和命令。这可能会降低性能,有时会分散 Claude 的注意力。在任务之间频繁使用 /clear 命令重置上下文窗口。
g. 对复杂工作流使用清单和草稿板
对于具有多个步骤或需要详尽解决方案的大型任务——如代码迁移、修复众多 lint 错误或运行复杂的构建脚本——通过让 Claude 使用 Markdown 文件(甚至 GitHub 问题!)作为清单和工作草稿板来提高性能:
例如,要修复大量的 lint 问题,您可以执行以下操作:
- 告诉 Claude 运行 lint 命令并将所有结果错误(带有文件名和行号)写入 Markdown 清单
- 指示 Claude 逐一解决每个问题,在检查并移动到下一个之前修复和验证
h. 将数据传递给 Claude
向 Claude 提供数据的几种方法:
- 复制并粘贴直接到您的提示中(最常见的方法)
- 通过管道传输到 Claude Code(例如,cat foo.txt | claude),特别适用于日志、CSV 和大数据
- 告诉 Claude 通过 bash 命令、MCP 工具或自定义斜杠命令拉取数据
- 请求 Claude 读取文件或获取 URL(也适用于图像)
大多数会话涉及这些方法的组合。例如,您可以通过管道传入日志文件,然后告诉 Claude 使用工具拉取额外的上下文来调试日志。
5. 使用无头模式自动化您的基础设施
Claude Code 包含无头模式(headless mode,无界面运行模式),用于非交互式环境,如 CI、预提交钩子(pre-commit hooks)、构建脚本和自动化。使用 -p 标志和提示启用无头模式,以及 --output-format stream-json 获取流式 JSON 输出。
请注意,无头模式在会话之间不会持久保存。您必须每个会话触发它。
a. 使用 Claude 进行问题分类
无头模式可以为 GitHub 事件触发的自动化提供动力,例如当在您的存储库中创建新问题时。例如,公共 Claude Code 存储库使用 Claude 检查新问题并分配适当的标签。
b. 使用 Claude 作为代码检查工具(linter)
Claude Code 可以提供超出传统代码检查工具检测范围的主观代码审查,识别诸如拼写错误、过时的注释、误导性的函数或变量名等问题。
6. 使用多 Claude 工作流程进阶
除了独立使用外,一些最强大的应用涉及并行运行多个 Claude 实例:
a. 让一个 Claude 编写代码;使用另一个 Claude 进行验证
一个简单但有效的方法是让一个 Claude 编写代码,而另一个审查或测试它。类似于与多个工程师一起工作,有时具有单独的上下文是有益的:
- 使用 Claude 编写代码
- 运行 /clear 或在另一个终端中启动第二个 Claude
- 让第二个 Claude 审查第一个 Claude 的工作
- 启动另一个 Claude(或再次 /clear)来阅读代码和审查反馈
- 让这个 Claude 根据反馈编辑代码
您可以对测试做类似的事情:让一个 Claude 编写测试,然后让另一个 Claude 编写代码来通过测试。您甚至可以让您的 Claude 实例相互通信,方法是给它们单独的工作草稿并告诉它们写入哪一个和读取哪一个。
这种分离通常比让单个 Claude 处理所有事情产生更好的结果。
b. 拥有多个代码库检出
不是等待 Claude 完成每个步骤,Anthropic 的许多工程师会做以下事情:
- 在单独的文件夹中创建 3-4 个 git 检出
- 在单独的终端选项卡中打开每个文件夹
- 在每个文件夹中启动 Claude,分配不同的任务
- 循环检查进度并批准/拒绝权限请求
c. 使用 git 工作树
这种方法在多个独立任务中表现出色,提供了比多个检出更轻量级的替代方案。Git 工作树允许您将同一存储库的多个分支检出到单独的目录中。每个工作树都有自己的工作目录(working directory)和隔离的文件,同时共享相同的 Git 历史记录和引用日志。
使用 git 工作树使您能够同时运行多个 Claude 会话,每个会话专注于项目的不同部分,各自专注于自己的独立任务。例如,您可能有一个 Claude 重构您的身份验证系统,而另一个构建一个完全无关的数据可视化组件。由于任务不重叠,每个 Claude 都可以全速工作,而不必等待对方的更改或处理合并冲突:
- 创建工作树:git worktree add ../project-feature-a feature-a
- 在每个工作树中启动 Claude:cd ../project-feature-a && claude
- 根据需要创建其他工作树(在新的终端选项卡中重复步骤 1-2)
一些提示:
- 使用一致的命名约定
- 每个工作树维护一个终端选项卡
- 如果您在 Mac 上使用 iTerm2,设置通知,以便在 Claude 需要注意时收到提醒
- 为不同的工作树使用单独的 IDE 窗口
- 完成后清理:git worktree remove ../project-feature-a
d. 在自定义框架中使用无头模式
claude -p(无头模式)以编程方式将 Claude Code 集成到更大的工作流程中,同时利用其内置工具和系统提示。使用无头模式有两种主要模式:
1. 扇出模式(fan out)处理大型迁移或分析(例如,分析数百个日志中的情绪或分析数千个 CSV 文件):
- 让 Claude 编写脚本生成任务列表。例如,生成需要从框架 A 迁移到框架 B 的 2000 个文件的列表。
- 循环遍历任务,以编程方式为每个任务调用 Claude,并给它一个任务和一组可以使用的工具。例如:claude -p “将 foo.py 从 React 迁移到 Vue。当您完成后,如果成功,您必须返回字符串 OK,如果任务失败,则返回 FAIL。” –allowedTools Edit Bash(git commit:*)”
- 多次运行脚本并完善您的提示以获得所需的结果。
2. 管道模式(pipelining)将 Claude 集成到现有的数据处理流程中:
- 执行命令 claude -p “<您的提示>” –json | your_command,其中 your_command 是您的处理管道的下一步
- 就是这样!JSON 输出(可选)可以提供结构化数据,便于自动化处理。
对于这两种用例,使用 --verbose 标志有助于调试 Claude 的调用过程。我们通常建议在生产环境中关闭详细模式以获得更清晰的输出。