AI

Claude Code 实践

Posted by 汤键|兔子队列 on December 7, 2025 禁止转载
本文总共 5824 字 · 阅读全文大约需要 24 分钟

编程助手是如何工作的

当你给编程助手分配任务(比如根据报错信息修复 bug)时,它遵循的流程与人类开发者解决问题的方式非常相似: 500

  • 收集上下文 (Gather context) – 理解错误指的是什么,受影响的代码部分在哪里,以及哪些文件是相关的
  • 制定计划 (Formulate a plan) – 决定如何解决问题,例如修改代码并运行测试以验证修复
  • 采取行动 (Take action) – 通过更新文件和运行命令来实际实施解决方案

这里的关键在于,第一步和最后一步都需要助手与外部世界交互—读取文件、获取文档、运行命令或编辑代码

Tool Use

语言模型本身只能处理文本并返回文本—它们实际上无法读取文件或运行命令

如果你要求一个独立的语言模型读取文件,它会告诉你它没有这种能力

那么编程助手是如何解决这个问题的?它们会使用一种被称为 “Tool Use” 的巧妙机制

当你向编程助手发送请求时,它会自动在你的消息中添加指令,教语言模型如何请求执行动作 完整的流程如下:

  1. 你问:”main.go 文件里写了什么代码?”
  2. 编程助手向你的请求中添加工具指令
  3. 语言模型回复:”ReadFile: main.go”
  4. 编程助手读取实际文件并将内容发送回语言模型
  5. 语言模型根据文件内容给出最终答案

500 这种系统使得语言模型能够有效地”读取文件”、”编写代码”和”运行命令”

尽管它们实际上只是在生成精心格式化的文本响应

添加上下文

/init 命令

当你在新项目中首次启动 Claude 时,请运行 /init 命令

这会告诉 Claude 分析你的整个代码库并理解:

  • 项目的用途和架构
  • 重要命令和关键文件
  • 编码模式和结构

分析完代码后,Claude 会创建一个摘要并将其写入 CLAUDE.md 文件

当 Claude 请求创建该文件的权限时,你可以按 Enter 键批准每次写入操作

或者按 Shift+Tab 让 Claude 在整个会话期间自由写入文件

CLAUDE.md 文件

CLAUDE.md 文件有两个主要用途:

  • 引导 Claude 熟悉你的代码库,指出重要命令、架构和编码风格
  • 允许你给予 Claude 特定的或自定义的指示

该文件会被包含在你向 Claude 发出的每一个请求中,所以它就像是为你的项目提供了一个持久的系统提示词

CLAUDE.md 文件的位置

Claude 识别位于三个常见位置的三种不同的 CLAUDE.md 文件:

  1. CLAUDE.md – 通过 /init 生成,提交到版本控制,与其他工程师共享
  2. CLAUDE.local.md – 不与其他工程师共享,包含给 Claude 的个人指令和自定义设置
  3. ~/.claude/CLAUDE.md – 用于你机器上的所有项目,包含你希望 Claude 在所有项目中都遵循的指令

添加自定义指令

你可以通过向 CLAUDE.md 文件添加指令来自定义 Claude 的行为

例如:如果 Claude 在代码中添加了太多注释,你可以通过更新该文件来解决这个问题

使用 # 命令进入”记忆模式 (memory mode)”—这允许你智能地编辑 CLAUDE.md 文件

只需输入类似这样的内容: # Use comments sparingly. Only comment complex code.(少用注释。只注释复杂的代码。)

Claude 会自动将此指令合并到你的 CLAUDE.md 文件中

使用 @ 提及文件

当你需要 Claude 查看特定文件时,请使用 @ 符号后跟文件路径

这会自动将该文件的内容包含在你给 Claude 的请求中

例如:如果你想询问有关认证系统的问题,并且知道相关文件,你可以输入: How does the auth system work? @auth

Claude 会向你展示一系列与 auth 相关的文件供你选择,然后将选定的文件包含在对话中

CLAUDE.md 中引用文件

你也可以使用相同的 @ 语法直接在 CLAUDE.md 文件中提及文件

这对那些与项目有许多方面都相关的文件特别有用

例如:如果你有一个定义数据结构的数据库model文件,你可以将其添加到 CLAUDE.md 中: The database schema is defined in the @prisma/schema.prisma file. Reference it anytime you need to understand the structure of data stored in the database. (数据库模式定义在 @prisma/schema.prisma 文件中。每当你需要了解存储在数据库中的数据结构时,请参考它。)

当你以这种方式提及文件时,其内容会自动包含在每个请求中

因此 Claude 可以立即回答有关数据结构的问题,而无需每次都去搜索和读取模式文件

计划模式

对于需要在代码库中进行广泛调研的更复杂任务,你可以启用计划模式

此功能让 Claude 在实施更改之前对你的项目进行彻底的探索

通过按两次 Shift + Tab 启用计划模式(如果你已经开启了自动接受编辑,则按一次)

在此模式下,Claude 将:

  • 阅读项目中的更多文件
  • 创建详细的实施计划
  • 准确展示它打算做什么
  • 等待你的批准后再继续

思考模式

Claude 通过”思考”模式提供不同层级的推理能力

这些模式允许 Claude 在提供解决方案之前花更多时间推理复杂问题

可用的思考模式包括:

  • “Think” – 基础推理
  • “Think more” – 扩展推理
  • “Think a lot” – 全面推理
  • “Think longer” – 长时间推理
  • “Ultrathink” – 极致推理能力

每种模式都给 Claude 提供了逐渐增加的 Token 预算,使其能够对具有挑战性的问题进行更深入的分析

何时使用计划模式 vs 思考模式

计划模式 (Planning Mode) 最适用于:

  • 需要对代码库有广泛理解的任务
  • 多步骤实施
  • 影响多个文件或组件的更改

思考模式 (Thinking Mode) 最适用于:

  • 复杂逻辑问题
  • 调试疑难问题
  • 算法挑战

控制上下文

用 Escape 键打断 Claude

有时 Claude 会搞错方向,或者试图一次性处理太多任务

你可以按 Escape (Esc) 键在 Claude 回复的中途将其打断,从而重新引导对话

当你想让 Claude 专注于一个特定任务而不是同时处理多件事时,这特别有用

例如:如果你让 Claude 为多个函数编写测试,而它开始为所有函数制定一个全面的计划,你可以打断它,让它一次只专注于一个函数

将 Escape 键与记忆 (Memories) 结合使用

Escape 技巧最强大的应用之一是修复重复性错误

当 Claude 在不同的对话中反复犯同样的错误时,你可以:

  1. Escape 停止当前的响应
  2. 使用 # 快捷键添加关于正确方法的记忆 (memory)
  3. 用修正后的信息继续对话

这可以防止 Claude 在你项目的未来对话中犯同样的错误

回溯对话

在长对话中,你可能会积累一些变得无关紧要或分散注意力的上下文

例如:如果 Claude 遇到错误并花时间进行调试,那些来回的讨论对于下一个任务可能就没有用了

你可以通过按两次 Escape 键来”倒带”对话

这会显示你发送过的所有消息,允许你跳回到较早的时间点并从那里继续

这个技巧可以帮你:

  • 保留有价值的上下文(比如 Claude 对你代码库的理解)
  • 移除干扰或无关的对话历史
  • 让 Claude 保持专注于当前任务

上下文管理命令

Claude 提供了几个命令来帮助有效地管理对话上下文:

/compact

/compact 命令会总结你整个对话历史,同时保留 Claude 已经学到的关键信息

这在以下情况非常理想:

  • Claude 获得了关于项目的宝贵知识
  • 你想继续处理相关任务
  • 对话变得很长但包含重要的上下文

当 Claude 已经学到了很多关于当前任务的知识,并且你想在它转移到下一个相关任务时保留这些知识

请使用 /compact

/clear

/clear 命令会完全移除对话历史,给你一个新的开始

这在以下情况最有用:

  • 你正在切换到一个完全不同的、不相关的任务
  • 当前的对话上下文可能会在处理新任务时让 Claude 感到困惑
  • 你想在没有任何先前上下文的情况下重新开始

自定义命令

Claude Code 自带了一些可以通过输入斜杠(/)访问的内置命令

但你也可以创建自己的自定义命令,以自动化你经常运行的重复性任务

创建自定义命令

要创建自定义命令,你需要在项目中设置特定的文件夹结构:

  1. 在你的项目目录中找到 .claude 文件夹
  2. 在其中创建一个名为 commands 的新目录
  3. 创建一个以你期望的命令名命名的 Markdown 文件(例如 audit.md

文件名即成为你的命令名—所以 audit.md 会创建 /audit 命令

示例:审计命令

这是一个用于审计项目依赖漏洞的实用自定义命令示例:

这个审计命令做三件事:

  1. 运行 npm audit 查找已安装包的漏洞
  2. 运行 npm audit fix 应用更新
  3. 运行测试以验证更新没有破坏任何东西

注意:创建命令文件后,你必须重启 Claude Code 才能让它识别新命令

带参数的命令

自定义命令可以使用 $ARGUMENTS 占位符来接受参数,这使它们更加灵活且可重用

例如:一个 write_tests.md 命令可能包含以下内容: 500

然后你可以带文件路径运行此命令: /write_tests the use-auth.ts file in the hooks directory/write_tests hooks 目录下的 use-auth.ts 文件

参数不一定非要是文件路径—它们可以是你想要传递的任何字符串,目的是为 Claude 完成任务提供上下文和方向

关键优势

  • 自动化 (Automation) – 将重复的工作流转化为单个命令
  • 一致性 (Consistency) – 确保每次都遵循相同的步骤
  • 上下文 (Context) – 为 Claude 提供针对你项目的具体指令和惯例
  • 灵活性 (Flexibility) – 使用参数让命令适用于不同的输入

自定义命令对于特定项目的工作流特别有用,例如:运行测试套件、部署代码或按照团队规范生成样板代码

钩子 (Hooks)

钩子 (Hooks) 允许你在 Claude 尝试运行工具之前或之后运行命令

它们对于实现自动化工作流非常有用

比如:在文件编辑后运行代码格式化程序,在文件更改时执行测试,或阻止访问特定文件

Hooks 是如何工作的

要理解 Hooks,让我们先回顾一下你与 Claude Code 交互时的正常流程

当你问 Claude 某些事情时,你的查询会连同工具定义一起发送给 Claude 模型

Claude 可能会决定使用工具并提供格式化的响应,然后 Claude Code 执行该工具并返回结果

Hooks 将自己插入到这个过程中,允许你在工具执行发生之前或之后立即执行代码 500

有两种类型的 hooks:

  • PreToolUse hooks (工具使用前钩子) – 在工具被调用之前运行
  • PostToolUse hooks (工具使用后钩子) – 在工具被调用之后运行

Hook 配置

Hooks 定义在 Claude 的 settings 文件中

你可以将它们添加到:

  • 全局~/.claude/settings.json (影响所有项目)
  • 项目.claude/settings.json (与团队共享)
  • 项目 (未提交).claude/settings.local.json (个人设置)

你可以在这些文件中手动编写 hooks,或者在 Claude Code 中使用 /hooks 命令 500

配置结构包含两个主要部分: 500

  1. PreToolUse Hooks (工具使用前)

PreToolUse hooks 在工具执行之前运行

它们包含一个匹配器 (matcher),用于指定针对哪些工具类型: 500

在”读取 (Read)”工具执行之前,此配置会运行指定的命令

你的命令会接收到关于 Claude 想要进行的工具调用的详细信息,你可以:

  • 允许操作正常进行
  • 阻止工具调用并向 Claude 发送错误消息
  1. PostToolUse Hooks (工具使用后)

PostToolUse hooks 在工具执行之后运行

例如:可以设置一个在 write (写入)、edit (编辑) 或 multi-edit (多重编辑) 操作后触发的钩子 500

由于工具调用已经发生,PostToolUse hooks 无法阻止该操作

但是,它们可以:

  • 运行后续操作(比如格式化刚刚编辑过的文件)
  • 向 Claude 提供关于工具使用的额外反馈 500
  1. 实际应用

以下是一些使用 hooks 的常见方式:

  • 代码格式化 – 在 Claude 编辑文件后自动格式化它们
  • 测试 – 当文件被更改时自动运行测试
  • 访问控制 – 阻止 Claude 读取或编辑特定文件
  • 代码质量 – 运行代码检查工具 (linters) 或类型检查器并向 Claude 提供反馈
  • 日志记录 – 追踪 Claude 访问或修改了哪些文件
  • 验证 – 检查命名约定或编码规范

核心要点是,Hooks 允许你通过将自己的工具和流程集成到工作流中来扩展 Claude Code 的能力

PreToolUse hooks 让你控制 Claude 能做什么

PostToolUse hooks 让你增强 Claude 已经做的事情

构建钩子

主要步骤

创建一个钩子涉及四个主要步骤: 500

  1. 决定使用 PreToolUse 还是 PostToolUse 钩子 PreToolUse 钩子可以阻止工具调用的执行,而 PostToolUse 钩子则在工具已经被使用后运行
  2. 确定你想要监控哪种类型的工具调用 – 你需要明确指定哪些工具应该触发你的钩子
  3. 编写一个接收工具调用的命令 – 该命令通过标准输入获取关于拟议工具调用的 JSON 数据
  4. 如果需要,命令应向 Claude 提供反馈 – 你命令的退出代码 (exit code) 告诉 Claude 是允许还是阻止该操作

可用工具

Claude Code 提供了几个可以通过钩子监控的内置工具 500

要查看当前设置中具体有哪些可用工具,你可以直接要求 Claude 列出一份清单

这特别有用,因为当你添加自定义 MCP 服务器时,可用工具可能会发生变化

工具调用数据结构

当你的钩子命令执行时,Claude 会通过标准输入发送包含拟议工具调用详情的 JSON 数据: 500 500

你的命令从标准输入读取此 JSON,进行解析,然后根据工具名称和输入参数决定是允许还是阻止该操作

退出代码与控制流

你的钩子命令通过退出代码与 Claude 通信: 500

  • 退出代码 0 (Exit Code 0) – 一切正常,允许工具调用继续
  • 退出代码 2 (Exit Code 2) – 阻止工具调用(仅限 PreToolUse 钩子)

当你在 PreToolUse 钩子中以代码 2 退出时

你写入标准错误的任何错误消息都会作为反馈发送给 Claude,解释操作为何被阻止

示例用例

一个常见的用例是防止 Claude 读取像 .env 这样的敏感文件

由于 Read (读取)Grep 工具都可以访问文件内容

你需要监控这两种工具类型,并检查它们是否尝试访问受限的文件路径

这种方法让你能完全控制 Claude 的文件系统访问权限,同时就某些操作为何受限提供清晰的反馈