本文翻译并润色自 Anthropic 官网,旨在介绍在各种代码库、编程语言和环境中高效使用 Claude Code 的技巧与实践。
我们最近发布了 Claude Code,一款智能编程命令行工具。作为一个研究项目,Claude Code 为 Anthropic 的工程师和研究人员提供了一种更原生的方式,将 Claude 无缝集成到他们的编程工作流中。
Claude Code 的设计刻意保持底层和灵活,提供近乎原始模型的访问能力,而不强制用户遵循特定的工作流。这种设计理念创造了一个强大、可定制、可脚本化且安全的工具。然而,这种灵感活性也意味着,对于初次接触智能编程工具的工程师来说,可能存在一定的学习曲线,直到他们摸索出自己的最佳实践。
本文概述了 Anthropic 内部团队以及外部工程师在各种代码库、语言和环境中证明行之有效的通用模式。这份清单并非一成不变或放之四海而皆准;请将这些建议视为一个起点,我们鼓励您大胆实验,找到最适合自己的方法!
想要了解更多信息?我们在 claude.ai/code 上的综合文档涵盖了本文提到的所有功能,并提供了更多示例、实现细节和高级技巧。
Claude Code 是一款会自动将上下文加载到提示中的智能编程助手。这种上下文收集虽然会消耗时间和 token,但你可以通过优化环境来提升其效率。
CLAUDE.md
文件CLAUDE.md
是一个特殊文件,Claude 在开启对话时会自动将其内容加载到上下文中。这使其成为记录以下信息的理想场所:
pyenv use
、可用的编译器等)CLAUDE.md
文件没有固定的格式要求,我们建议保持其简洁和易读。例如:
# Shell 命令
- `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
。root/foo
运行 claude
,同时在 root/CLAUDE.md
和 root/foo/CLAUDE.md
中都存在配置文件,两者都会被加载。CLAUDE.md
文件。~/.claude/CLAUDE.md
),其中的配置会应用于所有 claude
会话。当你运行 /init
命令时,Claude 会自动为你生成一个 CLAUDE.md
文件。
CLAUDE.md
文件你的 CLAUDE.md
文件是 Claude 提示词的一部分,因此应当像对待任何高频使用的提示词一样去优化它。一个常见的错误是添加大量内容后,却不迭代验证其有效性。花些时间进行实验,找到能让模型最有效遵循指令的表达方式。
你可以手动向 CLAUDE.md
添加内容,或者按下 #
键向 Claude 发出指令,它会自动将该指令整合到相关的 CLAUDE.md
中。许多工程师在编码时会频繁使用 #
来记录命令、文件和风格指南,然后在提交时一并包含 CLAUDE.md
的更改,以便团队成员共享。
在 Anthropic,我们偶尔会用提示词优化器来改进 CLAUDE.md
文件,并经常调整指令(例如使用 “IMPORTANT” 或 “YOU MUST” 来强调)以提高模型的遵循度。
默认情况下,Claude Code 会对任何可能修改你系统的操作请求授权:文件写入、许多 shell 命令、MCP 工具等。我们刻意采取这种保守的设计,以优先保障安全性。你可以自定义许可清单,允许你确信安全的工具,或是那些潜在不安全但操作易于撤销的工具(如文件编辑、git commit
)。
有四种方法可以管理许可的工具:
/permissions
命令添加或移除许可清单中的工具。例如,你可以添加 Edit
来始终允许文件编辑,Bash(git commit:*)
来允许 git 提交,或 mcp__puppeteer__puppeteer_navigate
来允许使用 Puppeteer MCP 服务器进行导航。.claude/settings.json
或 ~/.claude.json
文件(我们建议将前者提交到版本控制中与团队共享)。--allowedTools
CLI 标志为特定会话授予权限。gh
CLIClaude 知道如何使用 gh
CLI 与 GitHub 交互,例如创建 issue、开启 pull request、阅读评论等。如果未安装 gh
,Claude 仍可尝试使用 GitHub API 或 MCP 服务器(如果你已配置)。
Claude 可以访问你的 shell 环境,你可以像为自己一样为它构建便利的脚本和函数库。它还可以通过 MCP 和 REST API 利用更复杂的工具。
Claude Code 继承了你的 shell 环境,使其能够访问你所有的工具。虽然 Claude 熟悉如 Unix 工具和 gh
等常用程序,但若不加说明,它无法获知你自定义的工具。你可以:
--help
来查看工具的文档。CLAUDE.md
中记录常用的工具。Claude Code 既可作为 MCP 服务器,也可作为 MCP 客户端。作为客户端,它可以通过三种方式连接到任意数量的 MCP 服务器以访问其工具:
.mcp.json
文件中(对所有使用你代码库的人可用)。例如,你可以将 Puppeteer 和 Sentry 服务器添加到 .mcp.json
,这样团队中的每位工程师都能开箱即用。使用 MCP 时,通过 --mcp-debug
标志启动 Claude 有助于识别配置问题。
对于重复性的工作流——如调试循环、日志分析等——可以将提示模板存储在 .claude/commands
文件夹内的 Markdown 文件中。当你输入 /
时,这些命令就会出现在斜杠命令菜单中。你可以将这些命令提交到 Git,以便团队其他成员使用。
自定义斜杠命令可以包含特殊关键字 $ARGUMENTS
,以接收从命令调用中传递的参数。
例如,这是一个可用于自动拉取并修复 GitHub issue 的斜杠命令:
请分析并修复 GitHub issue:`$ARGUMENTS`。
遵循以下步骤:
1. 使用 `gh issue view` 获取 issue 详情。
2. 理解 issue 中描述的问题。
3. 搜索代码库以定位相关文件。
4. 实施必要的更改以修复 issue。
5. 编写并运行测试以验证修复效果。
6. 确保代码通过 linting 和类型检查。
7. 撰写描述清晰的提交信息。
8. 推送代码并创建 Pull Request。
请记住,所有 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
文件夹,以便在所有会话中使用。
Claude Code 不强制特定的工作流,让你能灵活地按自己的方式工作。在这种灵活性中,我们的用户社区涌现出了几种成功的模式:
这种多功能工作流适用于许多场景:
logging.py
”),但明确告诉它暂时不要编写任何代码。 README
或变更日志,以解释它所做的更改。步骤 #1 和 #2 至关重要。没有它们,Claude 倾向于直接跳到编码。虽然有时这正是你想要的,但对于需要深入思考的问题,先让 Claude 研究和规划可以显著提升最终结果的质量。
这是 Anthropic 内部最推崇的工作流之一,尤其适用于那些可以通过单元、集成或端到端测试轻松验证的变更。测试驱动开发(TDD)在智能编程时代变得更加强大:
当有明确的迭代目标时(如视觉模型、测试用例或其他输出),Claude 的表现最佳。通过提供预期的输出,Claude 可以进行修改、评估结果,并逐步改进直至成功。
与测试工作流类似,你可以为 Claude 提供视觉目标:
如同人类一样,Claude 的输出通过迭代会显著改善。虽然第一个版本可能不错,但经过 2-3 次迭代后,结果通常会好得多。为 Claude 提供查看其工作成果的工具,以获得最佳结果。
你可以使用 claude --dangerously-skip-permissions
跳过所有权限检查,让 Claude 在无人监督的情况下不间断地工作直至任务完成。此模式非常适用于修复 lint
错误或生成样板代码等任务。
警告:让 Claude 运行任意命令存在风险,可能导致数据丢失、系统损坏,甚至数据泄露(例如,通过提示注入攻击)。为了将风险降至最低,请在没有网络访问的容器中使用 --dangerously-skip-permissions
。你可以参照这个 Docker Dev Containers 实现来操作。
当接触一个新代码库时,使用 Claude Code 进行学习和探索。你可以像与另一位工程师结对编程时那样向 Claude 提问。Claude 可以智能地搜索代码库来回答各种问题,例如:
foo.rs
第 134 行的 async move { ... }
是做什么的?”CustomerOnboardingFlowImpl
处理了哪些边缘情况?”foo()
而不是 bar()
?”baz.py
第 334 行的代码在 Java 中等价于什么?”在 Anthropic,以这种方式使用 Claude Code 已成为我们的核心入职流程,它显著缩短了新成员的上手时间,并减轻了团队其他工程师的指导负担。不需要特殊的提示!只需提问,Claude 就会探索代码库为你找到答案。
Claude 可以高效地处理许多 git 操作。许多 Anthropic 工程师使用 Claude 来处理超过 90% 的 git 交互:
Claude Code 可以管理许多 GitHub 交互:
linter
警告。这让你无需记住 gh
的命令行语法,同时还能自动化处理日常任务。
Anthropic 的研究人员和数据科学家使用 Claude Code 来读写 Jupyter Notebooks。Claude 能够解释输出,包括图像,提供了一种快速探索和与数据交互的方式。虽然没有必需的工作流,但我们推荐在 VS Code 中并排打开 Claude Code 和 .ipynb
文件。
你还可以要求 Claude 在向同事展示之前,对你的 Jupyter notebook 进行清理或美化。明确告诉它要使 notebook 或其数据可视化“更具美感”,这有助于提醒它优化的目标是提升人类的阅读体验。
以下建议适用于所有工作流:
指令越具体,Claude Code 的成功率就越高,尤其是在首次尝试时。预先给出明确的指示,可以减少后续路线修正的需要。
欠佳的指令 | 具体的指令 |
---|---|
为 foo.py 添加测试。 | 为 foo.py 编写一个新测试,专门覆盖用户未登录的边缘场景。请勿使用模拟(mock)对象。 |
为什么 ExecutionFactory 的 API 这么奇怪? | 查看 ExecutionFactory 的 git 历史记录,并总结其 API 是如何演变至今的。 |
添加一个日历小部件。 | 查看主页现有小部件的实现,以理解其设计模式以及代码和接口的分离方式。HotDogWidget.php 是一个很好的起点。然后,遵循该模式实现一个新的日历小部件,允许用户选择月份,并通过翻页来选择年份。请从头开始构建,除了代码库中已有的库外,不要引入新的依赖。 |
Claude 能够推断意图,但它不会读心。具体性才能更好地确保结果符合预期。
Claude 可以通过多种方式出色地处理图像和图表:
cmd+ctrl+shift+4
将截图存入剪贴板,然后按 ctrl+v
粘贴。请注意,这里不是 macOS 常用的 cmd+v
,且该快捷键在远程连接时无效。)这在 UI 开发中将设计稿作为参考,或在分析调试时使用可视化图表时尤其有用。即便你没有提供视觉材料,明确告诉 Claude 最终结果需要“视觉上吸引人”也是有帮助的。
使用 tab
键自动补全,可以快速引用仓库中任何位置的文件或文件夹,帮助 Claude 找到或更新正确的资源。
在提示旁边粘贴特定的 URL,Claude 就可以获取并阅读其内容。为了避免对同一域名(如 docs.foo.com
)重复授权,可以使用 /permissions
将该域名添加到你的许可清单中。
虽然自动接受模式(auto-accept mode)可以让 Claude 自主工作,但当你作为一名积极的协作者,主动引导 Claude 的思路时,通常会得到更好的结果。你可以在开始时就向 Claude 详尽地解释任务,也可以在任何时候纠正它的路线。
这四个工具有助于进行路线修正:
Escape
键来中断 Claude,同时保留当前上下文,以便你重定向或补充指令。Escape
键可以回溯历史记录,编辑之前的提示,并探索不同的方向。你可以反复编辑提示,直到获得满意的结果。虽然 Claude Code 偶尔能在第一次尝试时就完美解决问题,但善用这些修正工具通常能更快地产生更优的解决方案。
/clear
保持上下文集中在长时间的会话中,Claude 的上下文窗口可能会被不相关的对话、文件内容和命令填满。这可能会降低其表现,有时还会分散它的注意力。在不同任务之间,请经常使用 /clear
命令来重置上下文窗口。
对于具有多个步骤或需要详尽解决方案的大型任务——如代码迁移、修复大量 lint 错误或运行复杂的构建脚本——可以让 Claude 使用一个 Markdown 文件(甚至是一个 GitHub issue)作为清单和工作草稿本,以提升其表现。
例如,要修复大量的 lint
问题,你可以:
lint
命令,并将所有错误(包括文件名和行号)写入一个 Markdown 清单。有几种方法可以向 Claude 提供数据:
cat foo.txt | claude
),尤其适用于日志、CSV 和大数据集。大多数会话会结合使用这些方法。例如,你可以通过管道传入一个日志文件,然后让 Claude 使用工具拉取额外的上下文来调试该日志。
Claude Code 包含一个用于非交互式场景(如 CI、预提交钩子、构建脚本和自动化任务)的无头模式。使用带提示的 -p
标志启用无头模式,并使用 --output-format stream-json
获取流式 JSON 输出。
注意:无头模式的状态不会在会话间持久化,你必须在每次调用时触发它。
无头模式可以为由 GitHub 事件触发的自动化提供动力,例如当你的仓库中创建新 issue 时。公共的 Claude Code 仓库就使用 Claude 来检查新 issue 并分配适当的标签。
linter
Claude Code 可以提供超越传统 linting
工具的代码审查,识别诸如拼写错误、过时的注释、有误导性的函数或变量名等主观问题。
除独立使用外,一些最强大的应用场景涉及并行运行多个 Claude 实例:
一个简单而有效的方法是:让一个 Claude 实例编写代码,同时让另一个实例审查或测试它。类似于与多位工程师协作,有时独立的上下文是有益的:
/clear
或在另一个终端中启动第二个 Claude 实例。/clear
),让它阅读代码和审查反馈。你也可以对测试采取类似的方法:让一个 Claude 编写测试,然后让另一个编写代码以通过这些测试。你甚至可以通过给它们分配独立的草稿本文件,并告诉它们各自读写哪个文件,来实现 Claude 实例间的通信。
这种职责分离通常比让单个 Claude 处理所有事情产生更好的结果。
许多 Anthropic 工程师的做法是,与其等待 Claude 完成每一步,不如:
git worktree
这种方法对于处理多个独立任务非常出色,是多个检出(checkout)的轻量级替代方案。git worktree
允许你从同一个仓库将多个分支检出到不同的目录中。每个 worktree 都有自己独立的工作目录,同时共享相同的 Git 历史。
使用 git worktree,你可以在项目的不同部分同时运行多个 Claude 会话,每个会话专注于其独立的任务。例如,你可以让一个 Claude 重构认证系统,而另一个构建一个完全不相关的数据可视化组件。由于任务不重叠,每个 Claude 都可以全速工作,无需等待对方或处理合并冲突。
git worktree add ../project-feature-a feature-a
cd ../project-feature-a && claude
一些提示:
git worktree remove ../project-feature-a
。claude -p
(无头模式)能以编程方式将 Claude Code 集成到更大的工作流中,同时利用其内置工具和系统提示。使用无头模式主要有两种模式:
扇出
模式,用于处理大规模迁移或分析(例如,分析数百个日志的情绪或数千个 CSV 文件):
claude -p "将 foo.py 从 React 迁移到 Vue。完成后,如果成功必须返回字符串 OK,如果失败则返回 FAIL。" --allowedTools Edit Bash(git commit:*)
流水线
模式,将 Claude 集成到现有的数据/处理流程中:
claude -p "<你的提示>" --json | your_command
,其中 your_command
是你处理流程的下一步。对于这两种用例,使用 --verbose
标志来调试 Claude 的调用可能会很有帮助。我们通常建议在生产环境中关闭详细模式,以获得更简洁的输出。