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

- 收集上下文 (Gather context) – 理解错误指的是什么,受影响的代码部分在哪里,以及哪些文件是相关的
- 制定计划 (Formulate a plan) – 决定如何解决问题,例如修改代码并运行测试以验证修复
- 采取行动 (Take action) – 通过更新文件和运行命令来实际实施解决方案
这里的关键在于,第一步和最后一步都需要助手与外部世界交互—读取文件、获取文档、运行命令或编辑代码
Tool Use
语言模型本身只能处理文本并返回文本—它们实际上无法读取文件或运行命令
如果你要求一个独立的语言模型读取文件,它会告诉你它没有这种能力
那么编程助手是如何解决这个问题的?它们会使用一种被称为 “Tool Use” 的巧妙机制
当你向编程助手发送请求时,它会自动在你的消息中添加指令,教语言模型如何请求执行动作 完整的流程如下:
- 你问:”main.go 文件里写了什么代码?”
- 编程助手向你的请求中添加工具指令
- 语言模型回复:”ReadFile: main.go”
- 编程助手读取实际文件并将内容发送回语言模型
- 语言模型根据文件内容给出最终答案
这种系统使得语言模型能够有效地”读取文件”、”编写代码”和”运行命令”
尽管它们实际上只是在生成精心格式化的文本响应
添加上下文
/init 命令
当你在新项目中首次启动 Claude 时,请运行 /init 命令
这会告诉 Claude 分析你的整个代码库并理解:
- 项目的用途和架构
- 重要命令和关键文件
- 编码模式和结构
分析完代码后,Claude 会创建一个摘要并将其写入 CLAUDE.md 文件
当 Claude 请求创建该文件的权限时,你可以按 Enter 键批准每次写入操作
或者按 Shift+Tab 让 Claude 在整个会话期间自由写入文件
CLAUDE.md 文件
CLAUDE.md 文件有两个主要用途:
- 引导 Claude 熟悉你的代码库,指出重要命令、架构和编码风格
- 允许你给予 Claude 特定的或自定义的指示
该文件会被包含在你向 Claude 发出的每一个请求中,所以它就像是为你的项目提供了一个持久的系统提示词
CLAUDE.md 文件的位置
Claude 识别位于三个常见位置的三种不同的 CLAUDE.md 文件:
CLAUDE.md– 通过/init生成,提交到版本控制,与其他工程师共享CLAUDE.local.md– 不与其他工程师共享,包含给 Claude 的个人指令和自定义设置~/.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 在不同的对话中反复犯同样的错误时,你可以:
- 按 Escape 停止当前的响应
- 使用
#快捷键添加关于正确方法的记忆 (memory) - 用修正后的信息继续对话
这可以防止 Claude 在你项目的未来对话中犯同样的错误
回溯对话
在长对话中,你可能会积累一些变得无关紧要或分散注意力的上下文
例如:如果 Claude 遇到错误并花时间进行调试,那些来回的讨论对于下一个任务可能就没有用了
你可以通过按两次 Escape 键来”倒带”对话
这会显示你发送过的所有消息,允许你跳回到较早的时间点并从那里继续
这个技巧可以帮你:
- 保留有价值的上下文(比如 Claude 对你代码库的理解)
- 移除干扰或无关的对话历史
- 让 Claude 保持专注于当前任务
上下文管理命令
Claude 提供了几个命令来帮助有效地管理对话上下文:
/compact
/compact 命令会总结你整个对话历史,同时保留 Claude 已经学到的关键信息
这在以下情况非常理想:
- Claude 获得了关于项目的宝贵知识
- 你想继续处理相关任务
- 对话变得很长但包含重要的上下文
当 Claude 已经学到了很多关于当前任务的知识,并且你想在它转移到下一个相关任务时保留这些知识
请使用 /compact
/clear
/clear 命令会完全移除对话历史,给你一个新的开始
这在以下情况最有用:
- 你正在切换到一个完全不同的、不相关的任务
- 当前的对话上下文可能会在处理新任务时让 Claude 感到困惑
- 你想在没有任何先前上下文的情况下重新开始
自定义命令
Claude Code 自带了一些可以通过输入斜杠(/)访问的内置命令
但你也可以创建自己的自定义命令,以自动化你经常运行的重复性任务
创建自定义命令
要创建自定义命令,你需要在项目中设置特定的文件夹结构:
- 在你的项目目录中找到
.claude文件夹 - 在其中创建一个名为
commands的新目录 - 创建一个以你期望的命令名命名的 Markdown 文件(例如
audit.md)
文件名即成为你的命令名—所以 audit.md 会创建 /audit 命令
示例:审计命令
这是一个用于审计项目依赖漏洞的实用自定义命令示例:
这个审计命令做三件事:
- 运行
npm audit查找已安装包的漏洞 - 运行
npm audit fix应用更新 - 运行测试以验证更新没有破坏任何东西
注意:创建命令文件后,你必须重启 Claude Code 才能让它识别新命令
带参数的命令
自定义命令可以使用 $ARGUMENTS 占位符来接受参数,这使它们更加灵活且可重用
例如:一个 write_tests.md 命令可能包含以下内容:

然后你可以带文件路径运行此命令:
/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 将自己插入到这个过程中,允许你在工具执行发生之前或之后立即执行代码

有两种类型的 hooks:
- PreToolUse hooks (工具使用前钩子) – 在工具被调用之前运行
- PostToolUse hooks (工具使用后钩子) – 在工具被调用之后运行
Hook 配置
Hooks 定义在 Claude 的 settings 文件中
你可以将它们添加到:
- 全局 –
~/.claude/settings.json(影响所有项目) - 项目 –
.claude/settings.json(与团队共享) - 项目 (未提交) –
.claude/settings.local.json(个人设置)
你可以在这些文件中手动编写 hooks,或者在 Claude Code 中使用 /hooks 命令

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

- PreToolUse Hooks (工具使用前)
PreToolUse hooks 在工具执行之前运行
它们包含一个匹配器 (matcher),用于指定针对哪些工具类型:

在”读取 (Read)”工具执行之前,此配置会运行指定的命令
你的命令会接收到关于 Claude 想要进行的工具调用的详细信息,你可以:
- 允许操作正常进行
- 阻止工具调用并向 Claude 发送错误消息
- PostToolUse Hooks (工具使用后)
PostToolUse hooks 在工具执行之后运行
例如:可以设置一个在 write (写入)、edit (编辑) 或 multi-edit (多重编辑) 操作后触发的钩子

由于工具调用已经发生,PostToolUse hooks 无法阻止该操作
但是,它们可以:
- 运行后续操作(比如格式化刚刚编辑过的文件)
- 向 Claude 提供关于工具使用的额外反馈

- 实际应用
以下是一些使用 hooks 的常见方式:
- 代码格式化 – 在 Claude 编辑文件后自动格式化它们
- 测试 – 当文件被更改时自动运行测试
- 访问控制 – 阻止 Claude 读取或编辑特定文件
- 代码质量 – 运行代码检查工具 (linters) 或类型检查器并向 Claude 提供反馈
- 日志记录 – 追踪 Claude 访问或修改了哪些文件
- 验证 – 检查命名约定或编码规范
核心要点是,Hooks 允许你通过将自己的工具和流程集成到工作流中来扩展 Claude Code 的能力
PreToolUse hooks 让你控制 Claude 能做什么
而 PostToolUse hooks 让你增强 Claude 已经做的事情
构建钩子
主要步骤
创建一个钩子涉及四个主要步骤:

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

要查看当前设置中具体有哪些可用工具,你可以直接要求 Claude 列出一份清单
这特别有用,因为当你添加自定义 MCP 服务器时,可用工具可能会发生变化
工具调用数据结构
当你的钩子命令执行时,Claude 会通过标准输入发送包含拟议工具调用详情的 JSON 数据:

你的命令从标准输入读取此 JSON,进行解析,然后根据工具名称和输入参数决定是允许还是阻止该操作
退出代码与控制流
你的钩子命令通过退出代码与 Claude 通信:

- 退出代码 0 (Exit Code 0) – 一切正常,允许工具调用继续
- 退出代码 2 (Exit Code 2) – 阻止工具调用(仅限 PreToolUse 钩子)
当你在 PreToolUse 钩子中以代码 2 退出时
你写入标准错误的任何错误消息都会作为反馈发送给 Claude,解释操作为何被阻止
示例用例
一个常见的用例是防止 Claude 读取像 .env 这样的敏感文件
由于 Read (读取) 和 Grep 工具都可以访问文件内容
你需要监控这两种工具类型,并检查它们是否尝试访问受限的文件路径
这种方法让你能完全控制 Claude 的文件系统访问权限,同时就某些操作为何受限提供清晰的反馈