1. 从“聊天”到“工程”:Claude Code 的范式转变
如果你还在把 Claude 当作一个“更聪明的聊天机器人”,用来写写邮件、润色文案,那你可能错过了它最核心的进化方向。最近几个月,一个名为Claude Code的生态正在开发者社区里悄然兴起,它不再是那个被动的、一问一答的助手,而是正在演变成一个可以深度集成到你的开发工作流中,拥有自主执行能力的“智能体”(Agent)。这个转变的核心,就体现在几个看似简单的配置文件和行为扩展上:CLAUDE.md、Hooks、Skills 和 Subagents。
我第一次意识到 Claude Code 的潜力,是在一个深夜调试一个复杂的 API 集成时。当时,我需要反复切换浏览器查看文档、在终端运行测试、在编辑器里修改代码,整个过程繁琐且容易出错。我尝试在 Cursor(一个集成了 AI 的编辑器)里向 Claude 描述我的问题,它给出了不错的建议,但执行起来依然需要我手动操作。直到我偶然发现了社区里有人分享的CLAUDE.md配置文件,并开始尝试 Hooks,整个体验才发生了质变。我配置了一个简单的 Hook,让 Claude 在识别到我需要测试某个 API 端点时,自动在项目根目录下运行一个预定义的curl命令,并将结果格式化后直接插入到我的代码注释中。那一刻,我感觉 Claude 从一个“顾问”变成了我的“副驾驶”,甚至开始接管一些重复性的“驾驶”任务。
Claude Code 的本质,是 Anthropic 为其 Claude 模型系列(特别是 Claude 3.5 Sonnet 及更高版本)设计的一套可编程接口与行为规范。它允许开发者通过声明式的配置和脚本,来“教导”和“约束” Claude 在特定上下文(如一个代码仓库)中如何思考、如何行动。这不仅仅是提供上下文(像传统的README.md),而是定义了交互协议。CLAUDE.md是项目的“宪法”,Hooks 是自动触发的“ reflexes”,Skills 是可插拔的“工具包”,而 Subagents 则是分工协作的“专家团队”。理解并运用好这几样东西,意味着你能将 Claude 从一个通用的对话模型,精细调校成专属于你当前项目的领域专家和自动化引擎。
这篇文章,我将结合我近期的实践和踩过的坑,为你彻底拆解 Claude Code 的这四个核心构件。无论你是想提升个人开发效率,还是为团队构建标准化的 AI 辅助工作流,理解这些概念都是第一步。我们会从最基础的配置文件开始,逐步深入到动态行为控制和多智能体协作,看看如何让 Claude 真正“懂”你的项目,并为你干活。
2. CLAUDE.md:定义项目的“游戏规则”
如果把你的代码仓库比作一个沙盒游戏,那么CLAUDE.md就是这个沙盒的规则说明书和初始道具栏。它的地位,远高于传统的README.md。README是给人看的项目介绍,而CLAUDE.md是专门给 Claude 看的“操作手册”,直接决定了 Claude 如何理解项目结构、遵守何种编码规范、以及拥有哪些初始知识。
2.1 文件定位与核心作用
CLAUDE.md通常放置在项目的根目录。当你在 Cursor、Windsurf、Claude Desktop 或任何集成了 Claude Code 的 IDE 中打开该项目时,Claude 会优先读取并解析这个文件。它的核心作用有三个:
- 设定上下文边界:明确告诉 Claude 本项目是什么、不是什么。这能有效防止 Claude 产生“幻觉”,提出与项目无关或技术栈不符的建议。例如,一个 Vue 3 + TypeScript 的前端项目,你需要在文件开头就声明这一点,避免 Claude 给出 React 或 JavaScript 的示例。
- 定义行为规范:规定 Claude 在为本项目提供帮助时应遵循的代码风格、提交信息格式、依赖管理方式等。这相当于为 AI 助理制定了团队的“开发公约”。
- 提供领域知识:注入项目特有的业务逻辑、架构设计决策、关键 API 的用法等非代码化知识。这些知识可能散落在会议记录、设计文档或资深开发者的脑子里,现在可以集中沉淀在此,让每一位参与者(包括 AI)都能快速对齐。
2.2 基础结构剖析:从模板到实战
一个有效的CLAUDE.md不是随意写就的,它有最佳实践的结构。下面是一个我用于全栈项目的模板,并附上关键注释:
# 项目宪法:在线协作白板 (Miro-like) - 后端服务 ## 项目概览与边界 - **核心定位**:本项目是一个基于 Node.js (Express) + PostgreSQL 的实时协作白板后端 API 服务,提供画布、图形元素、实时同步与用户管理功能。 - **技术栈**: - 运行时:Node.js 18+, pnpm 作为包管理器。 - 框架:Express.js,使用 async/await 处理异步。 - 数据库:PostgreSQL 15+,使用 Prisma ORM 进行数据访问。 - 实时通信:Socket.IO 用于画布元素的实时同步。 - 身份认证:JWT,密钥通过环境变量 `JWT_SECRET` 注入。 - **非本项目范畴**:前端界面实现、移动端应用、第三方支付集成。请勿在这些方向提供建议。 ## 开发规范与约束 - **代码风格**: - 使用 ES6+ 语法,强制使用 `const` 和 `let`,避免 `var`。 - 所有异步操作必须使用 `try...catch` 包裹,并在错误处理中调用 `next(error)` 传递给 Express 错误中间件。 - 导入语句使用 ES Module (`import/export`)。 - **API 设计**: - RESTful 风格,资源使用复数名词(如 `/api/boards`)。 - 响应统一格式:`{ success: boolean, data: any, message?: string, error?: string }`。 - 所有错误必须返回合适的 HTTP 状态码(4xx, 5xx)。 - **数据库**: - 所有模型定义和迁移请通过 Prisma Schema (`prisma/schema.prisma`) 进行。 - 禁止编写原生 SQL 查询,除非 Prisma 无法实现的复杂分析。 - **安全**: - 所有用户输入必须经过验证(使用 Joi 或 Zod)。 - 环境变量(如数据库连接串、JWT 密钥)必须通过 `dotenv` 从 `.env` 文件加载,且 `.env` 文件已加入 `.gitignore`。 ## 关键业务逻辑与架构决策 1. **实时同步模型**: - 采用“操作转换”简化模型。客户端发送图形元素的“增量操作”(如移动、缩放),服务端通过 Socket.IO 广播给同一画布的其他用户。 - 冲突解决策略:以后到操作为准,并在客户端提供简单的撤销/重做栈。**(重要:这是业务决策,请勿建议改为 CRDT 模型,除非有明确需求变更讨论)** 2. **数据持久化**: - 画布的完整状态每 30 秒自动保存一次(防抖)。 - 用户主动点击保存时,立即持久化。 3. **文件结构说明**: - `/src/routes` - Express 路由定义。 - `/src/controllers` - 业务逻辑处理。 - `/src/services` - 可复用的业务服务(如邮件、第三方 API 调用)。 - `/src/middlewares` - 自定义中间件(如认证、日志)。 - `/prisma` - 包含 schema、migrations 和生成的客户端。 ## 如何与 Claude 协作 - 当请求生成新代码时,请优先考虑放置在上述约定的目录结构中。 - 如果请求涉及修改数据库,请先提示:“需要更新 Prisma Schema 并生成迁移吗?” - 在提供代码片段时,请附带简要的注释说明关键逻辑。 - 如果遇到模糊的需求,请主动提问澄清,而不是猜测。注意:
CLAUDE.md是一个“活”文档。在项目初期,内容可以相对简略,随着开发过程中遇到反复需要向 Claude 解释的规则或决策,应不断将其补充进去。它也是团队新成员(包括 AI)最快的上手指南。
2.3 与.cursorrules的对比与选择
你可能会问,这和 Cursor 编辑器自带的.cursorrules文件有什么区别?这是一个非常好的问题,也是初期容易混淆的地方。
.cursorrules:这是Cursor 编辑器特定的配置文件。它主要定义 Cursor 这个 IDE 工具本身的行为,例如:自动补全的偏好、是否在保存时自动格式化、遇到特定文件类型时使用哪个 AI 模型等。它的作用域是“编辑器行为”。CLAUDE.md:这是Claude 模型特定的配置文件。它定义的是 Claude 这个 AI 在理解你的项目、生成代码和回答问题时应该遵循的规则。它的作用域是“项目认知与 AI 行为”。
一个简单的类比:.cursorrules像是给你的机械键盘设置宏键和背光模式(工具本身的使用偏好),而CLAUDE.md像是给你团队的新成员一本详细的项目入职手册(对项目内容的理解和操作规范)。
如何选择:
- 如果你只在 Cursor 中使用 Claude,并且需要精细控制编辑器行为,两者可以共存。通常,
.cursorrules用于编辑器设置,CLAUDE.md用于项目规范。 - 如果你希望在Claude Desktop、Windsurf 或其他未来支持 Claude Code 的环境中保持一致的 AI 行为,那么
CLAUDE.md是唯一的选择,因为它是 Claude 原生支持的协议。 - 在实践中,我建议优先创建和维护
CLAUDE.md,因为它更具通用性和未来性。.cursorrules仅在你有非常具体的 Cursor 编辑器调优需求时才使用。
3. Hooks:让 AI 拥有“条件反射”
如果说CLAUDE.md是静态的规则书,那么 Hooks 就是动态的触发器与自动化脚本。它们允许 Claude 在特定事件或条件满足时,自动执行一段预定义的操作。这彻底改变了人机交互模式,从“你问-它答-你做”变成了“它感知-它执行-你验收”。
3.1 Hooks 的工作原理与核心价值
Hooks 的实现原理,本质上是一种“模式匹配 + 脚本执行”的机制。当用户与 Claude 的对话内容(或项目状态变化)匹配了某个 Hook 中定义的模式时,Claude Code 的运行环境就会自动触发与之关联的脚本(Shell、Python、Node.js 等),并将脚本的输出结果作为上下文,反馈给 Claude 和用户。
它的核心价值在于:
- 自动化繁琐操作:无需手动运行命令、切换窗口。例如,自动运行测试、格式化代码、启动开发服务器、执行数据库迁移。
- 提供实时上下文:在讨论代码时,自动获取当前的 Git 状态、日志文件最新内容、API 端点实时响应,让对话基于最新事实。
- 强制执行开发流程:例如,在每次尝试修改
package.json后,自动运行pnpm install并更新pnpm-lock.yaml。
3.2 配置与实战:从简单到复杂
Hooks 通常在项目根目录下的.claude目录中配置(例如/.claude/hooks.json或作为CLAUDE.md的一部分)。下面通过几个由浅入深的例子来展示其威力。
示例一:自动运行单元测试假设我们有一个 Node.js 项目,希望在讨论任何与userService相关的代码时,能自动运行该服务的单元测试。
// .claude/hooks.json [ { "name": "Run User Service Tests", "pattern": "userService|UserService|用户服务", // 匹配对话中的关键词 "command": "npm test -- --testPathPattern=userService\\.test\\.js", // 触发的命令 "description": "当对话涉及用户服务时,自动运行其单元测试。" } ]当你在聊天中说:“userService的createUser函数好像有边界条件没处理好。” Claude 检测到userService关键词,会自动在后台运行指定的npm test命令,并将测试结果(通过、失败、错误信息)插入到对话中。你立刻就能知道你的猜测是否正确,而无需离开聊天窗口。
示例二:智能 Git 状态感知这是一个更实用的 Hook,它在每次对话开始或涉及代码变更讨论时,自动获取当前的 Git 状态,让 Claude 始终基于最新的代码分支和修改提供建议。
{ "name": "Get Git Context", "pattern": "^$|git status|当前分支|修改了", // 匹配空消息(新对话)或特定关键词 "command": "echo '## Git Status:\\n' && git status --short --branch && echo '\\n## Recent Commits:\\n' && git log --oneline -5", "description": "在对话开始时或询问状态时,提供当前的 Git 状态和最近提交。" }这个 Hook 极大地减少了“我在哪个分支?”、“我改了哪些文件?”这类元问题的沟通成本,让 Claude 的回复更具针对性。
示例三:基于文件变化的自动操作我们可以配置更精细的 Hook,监听特定文件的变更。这需要在支持文件系统监听的 IDE(如 Cursor)中,或者结合CLAUDE.md的指令来实现。
在CLAUDE.md中,你可以这样描述:
## 自动化 Hooks (IDE 特定) - **当 `prisma/schema.prisma` 文件被提及或修改后**:请提示我运行 `npx prisma generate` 和 `npx prisma migrate dev`。 - **当 `package.json` 中 `dependencies` 或 `devDependencies` 被修改后**:请自动执行 `pnpm install` 并更新锁文件。虽然这不是一个严格的 JSON 配置,但它以自然语言指令的形式,赋予了 Claude “监督”和“提醒”的能力。在一些高级集成中,这些指令可以被解析为真正的自动化脚本。
3.3 安全考量与最佳实践
Hooks 功能强大,但“能力越大,责任越大”。不当使用可能带来风险:
- 命令注入风险:永远不要将未经净化的用户输入直接拼接进 Hook 的
command中。Hook 的模式匹配应尽量精确,避免过于宽泛。 - 性能影响:避免配置会触发长时间运行命令(如完整构建、端到端测试)的 Hook,除非你确实需要。这可能会阻塞对话或消耗大量资源。
- 上下文污染:脚本输出可能很长。确保 Hook 命令的输出是简洁、相关的。可以使用
head,grep,jq等工具过滤输出。 - 版本控制:将
.claude/hooks.json纳入版本控制,方便团队共享和回溯。但注意其中是否包含敏感信息(如服务器地址、密钥),如有必要,应通过环境变量传递。
个人心得:初期不要贪多,从 1-2 个最能提升你当前工作流效率的 Hook 开始。我最开始只配置了“Git 状态感知”和“当前目录文件列表”这两个 Hook,就感觉效率提升了一个档次。随着习惯养成,再逐步添加更复杂的自动化。
4. Skills:扩展 AI 的“工具腰带”
Hooks 是自动化的,但场景相对固定。Skills 则更进一步,它为 Claude 提供了按需调用的、可复用的工具函数或外部服务接口。你可以把 Skills 想象成 Claude 随身携带的“瑞士军刀”或“工具腰带”,当它需要完成某项特定任务时,可以主动从中挑选合适的工具使用。
4.1 Skills 的本质:函数即工具
一个 Skill 本质上是一个可以被 Claude 理解和调用的函数,这个函数可以用任何语言编写(常见的是 JavaScript/TypeScript 或 Python),其核心是明确定义了:
- 输入:函数需要什么参数。
- 输出:函数返回什么结果。
- 描述:用自然语言清晰说明这个函数是做什么的、何时使用。
当 Claude 在对话中判断需要完成某个任务,且这个任务匹配了某个已注册 Skill 的描述时,它就会在回复中“提议”或直接“调用”这个 Skill,并将执行结果整合到它的回答中。
4.2 内置 Skills 与社区 Skills
Claude Code 环境通常预置了一些基础 Skills,例如:
- 文件操作:读取、写入、列出目录文件。
- 网络请求:发起 HTTP GET/POST 请求获取数据。
- Shell 命令执行:在安全沙箱中运行系统命令。
- 计算与转换:单位换算、日期计算等。
而真正的力量来自于社区和自定义 Skills。开发者可以将常用的、复杂的操作封装成 Skill,并分享给他人。例如:
- 数据库查询 Skill:封装一个安全查询生产数据库只读副本的 Skill,让 Claude 能直接获取实时数据来回答问题。
- 部署发布 Skill:封装一个触发 CI/CD 流水线、部署到特定环境的 Skill。
- 内部 API 测试 Skill:封装一个调用公司内部某个微服务 API 并格式化响应的 Skill。
4.3 如何查找与使用 Skills
在 Claude Desktop 或深度集成 Claude Code 的 IDE 中,通常会有管理 Skills 的界面。以 Claude Desktop 为例:
- 打开设置,找到“Skills”或“扩展”部分。
- 你可以浏览一个内置的 Skills 商店或仓库,里面会有社区贡献的 Skills,例如 “Summarize Webpage”, “Fetch Stock Price”, “Translate Text” 等。
- 点击安装即可。安装后,Claude 在对话中就会“知道”它拥有了这个新能力。
使用场景示例:你安装了一个 “Get Weather” 的 Skill。当你在规划一个户外活动的代码时,对 Claude 说:“帮我看看旧金山周末的天气,这会影响我们是否要启用户外模块。” Claude 会识别出这是一个获取天气的需求,自动调用 “Get Weather” Skill,传入 “San Francisco” 参数,然后将 API 返回的天气信息整合到它的回答中:“旧金山周末晴朗,气温 18-22°C,适合启用户外模块。建议的代码逻辑是...”
4.4 开发自定义 Skill:一个实战案例
社区 Skills 虽好,但最能体现价值的往往是贴合自己业务的自定义 Skill。下面我们以开发一个“查询项目待办事项”的 Skill 为例。
假设我们使用 Linear 作为项目管理工具,并且有 API 访问权限。
步骤 1:定义 Skill 元数据创建一个linear_skill.js文件,首先描述这个 Skill:
/** * @skill fetch_linear_issues * @description 从 Linear 项目中获取指定状态(如待处理、进行中)的 issues。用于在规划开发任务或评估工作量时获取实时信息。 * @param {string} projectId - Linear 项目的 ID。 * @param {string} [state="backlog"] - Issue 的状态,默认为 'backlog'。可选值:backlog, started, completed。 * @returns {Array} 返回一个 issue 对象数组,包含 title, url, assignee 等信息。 */步骤 2:实现 Skill 函数接着,实现具体的函数逻辑。这里需要处理认证(通常通过环境变量注入 API Key)和网络请求。
const LINEAR_API_KEY = process.env.LINEAR_API_KEY; const LINEAR_API_URL = 'https://api.linear.app/graphql'; async function fetchLinearIssues({ projectId, state = 'backlog' }) { const query = ` query GetProjectIssues($projectId: String!, $state: String!) { projectIssues(projectId: $projectId, filter: { state: { name: { eq: $state } } }) { nodes { title url assignee { name } estimate } } } `; const response = await fetch(LINEAR_API_URL, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': LINEAR_API_KEY, }, body: JSON.stringify({ query, variables: { projectId, state } }), }); const { data, errors } = await response.json(); if (errors) { throw new Error(`Linear API error: ${errors[0].message}`); } return data.projectIssues.nodes; } // 导出函数供 Claude Code 调用 module.exports = { fetchLinearIssues };步骤 3:注册 Skill在你的 Claude Code 环境(如通过claude.json配置文件或 IDE 插件设置)中,注册这个 Skill,指定其名称、描述、参数和对应的函数文件路径。
步骤 4:使用注册成功后,当你对 Claude 说:“看看我们‘新版仪表盘’项目里还有哪些待处理的 issues,评估一下本周的工作量。” Claude 会理解你需要调用fetch_linear_issues这个 Skill,并尝试向你询问或自动使用默认的projectId和state参数,调用该函数,最后将 Linear 返回的 issue 列表整理成清晰的摘要,甚至结合estimate(估算点数)帮你计算总工作量。
踩坑提醒:开发自定义 Skill 时,最大的坑在于权限和安全性。务必确保:
- API Keys 等敏感信息通过环境变量管理,绝对不要硬编码在 Skill 文件中。
- 为 Skill 设置最小必要权限。例如,这个 Linear Skill 应该只有读取(Read)权限,没有创建、修改或删除权限。
- 对 Skill 的输入参数做严格的验证和清理,防止注入攻击。
5. Subagents:组建专家“梦之队”
当任务变得庞大而复杂时,单个 Claude 实例可能会力不从心,或者在不同领域间切换导致上下文混乱。Subagents(子智能体)的概念就是为了解决这个问题:创建多个专门的、细粒度的 AI 智能体,让它们各司其职,协同完成一个宏观任务。
5.1 什么是 Subagents?与普通对话的区别
你可以把主 Claude 会话看作一个“项目经理”或“架构师”,而 Subagents 则是它手下的“前端专家”、“后端专家”、“数据库专家”、“测试专家”。Subagents 不是简单的多轮对话分支,而是具有以下特点:
- 独立上下文:每个 Subagent 拥有独立于主会话的对话历史和上下文。这意味着你可以让“后端专家”深入研究一个复杂的算法问题,而不会让这些冗长的讨论污染“前端专家”关于 UI 状态的上下文。
- 专门化指令:每个 Subagent 在创建时可以被赋予特定的角色、知识和行为指令(类似于一个微型的、专注的
CLAUDE.md)。例如,“数据库专家” Subagent 的指令里可能包含了详细的数据库范式、索引优化原则和本项目的 ER 图。 - 并行与协作:主智能体可以将任务分解,分派给不同的 Subagents 并行处理,然后汇总它们的结果。这模拟了真实的团队协作。
5.2 核心模式:Fan-out(扇出)工作流
Subagents 最经典的应用模式是“Fan-out”。想象一个中心节点(主智能体)将任务像扇子一样展开,分发给多个子节点(Subagents)并行处理。
实战场景:复杂功能的需求分析与技术方案设计假设你需要开发一个“用户上传图片后自动生成缩略图并检测是否包含不适内容”的功能。这是一个涉及文件处理、图像处理、外部 API 调用和数据库操作的复合任务。
- 主智能体(项目经理):你向主 Claude 会话描述这个需求。
- 任务分解与 Subagents 创建:主 Claude 分析后,决定创建三个 Subagents:
- Subagent A(文件与存储专家):指令:“你负责设计文件上传的 API 接口、在服务器本地的存储方案、以及如何将文件信息(路径、元数据)存入数据库。考虑文件命名冲突、目录结构和清理策略。”
- Subagent B(图像处理专家):指令:“你负责研究如何使用 Sharp 库生成多种尺寸的缩略图。给出具体的代码实现,并考虑异步处理、错误处理和性能。”
- Subagent C(内容审核专家):指令:“你负责调研集成云端内容审核 API(如 Google Cloud Vision SafeSearch 或 AWS Rekognition)的方案。包括 API 调用、错误处理、成本估算,以及如何将审核结果(是否安全、置信度)关联到图片记录。”
- 并行执行:主智能体将相应的子任务描述分别发送给这三个 Subagents。它们在自己的独立上下文中进行研究、编写代码草案或方案说明。
- 结果汇总:三个 Subagents 将各自的结果返回给主智能体。
- 整合与交付:主智能体综合三个专家的意见,整理出一份完整的技术设计方案文档,包括 API 设计、数据库变更、核心代码流程、依赖项列表和风险评估,然后交付给你。
这个过程,将一个需要广泛知识的复杂任务,分解成了多个可以由“领域专家”深度聚焦的子任务,大大提升了方案的质量和思考的全面性。
5.3 如何创建与管理 Subagents
在支持 Subagents 的界面中(例如 Claude Desktop 的某些实验性功能或 Claude API 的特定用法),通常有以下操作:
- 创建:在对话中,你可以通过指令(如“/create-subagent 名称:数据库专家,指令:专注于 PostgreSQL 查询优化和 Schema 设计...”)或点击 UI 按钮来创建。
- 切换与对话:你可以在主会话和各个 Subagents 的会话之间自由切换,分别与它们交流。
- 信息共享:主智能体可以向 Subagents 传递信息(如项目上下文
CLAUDE.md),Subagents 也可以将结论报告给主智能体。 - 关闭:任务完成后,可以关闭 Subagents 以释放资源。
5.4 优势、局限与最佳实践
优势:
- 深度专注:避免上下文混合,让 AI 在特定领域思考得更深。
- 模拟团队协作:非常适合需要多角度审视的复杂设计、评审或头脑风暴任务。
- 突破上下文长度限制:将长任务分解,每个子任务都在较短的上下文窗口内完成。
局限与挑战:
- 管理开销:创建和协调多个 Subagents 需要清晰的任务划分和指令编写,本身有一定成本。
- 成本:每个 Subagent 都可能消耗额外的 Token(虽然一些实现可能共享基础上下文,但推理计算是独立的)。
- 集成度:目前 Subagents 更像是一个高级的“对话管理”功能,其与 Hooks、Skills 的深度自动化联动还在演进中。
最佳实践:
- 始于主智能体:先让主 Claude 尝试解决问题。只有当问题明显需要多领域深度知识,且单一对话上下文显得混乱或浅薄时,再考虑使用 Subagents。
- 指令务必清晰:给 Subagent 的创建指令是其行为的“宪法”,要明确其角色、知识边界和输出要求。
- 定义明确的交付物:告诉 Subagents 你需要什么格式的结果(例如:“请提供 3 个优化方案,并用表格对比优缺点”、“请给出此函数的实现代码,并附上时间复杂度的分析”)。
6. 整合实践:构建一个高效的 AI 辅助开发工作流
理解了各个部件之后,关键在于如何将它们组合起来,形成一套流畅、高效的日常开发工作流。下面我以一个典型的“功能开发-调试-提交”循环为例,展示 CLAUDE.md, Hooks, Skills 和 Subagents 如何协同工作。
6.1 场景:开发一个用户个人资料编辑页面
第 1 步:上下文准备 (CLAUDE.md)当我新建一个feature/user-profile-editor分支,并打开项目时,Claude 已经通过根目录的CLAUDE.md知道了:
- 这是一个 React + TypeScript + Tailwind CSS 的前端项目。
- API 层使用
axios,且所有请求都需要携带 JWT Token。 - 用户数据模型包含
id,name,avatarUrl,bio等字段。 - 代码规范:使用函数组件和 React Hooks,必须定义 Props 接口。
这为我与 Claude 的对话奠定了高质量的起点,它不会建议我用 Class 组件或 jQuery。
第 2 步:需求分析与设计 (Subagents)我对主 Claude 说:“我们需要一个用户个人资料编辑页面,包含头像上传、姓名和简介编辑。请帮我设计一下。” 主 Claude 识别到这是一个涉及 UI、表单、文件上传和 API 集成的复合任务,建议启用 Subagents 模式。它创建了:
- UI/UX Subagent:负责设计组件结构、布局和 Tailwind 样式。
- 表单逻辑 Subagent:负责管理表单状态、验证逻辑(使用 Zod)和与 React Hook Form 的集成。
- 文件上传 Subagent:负责封装
axios上传逻辑、处理进度、预览和错误。
我分别与它们对话,快速得到了一个完整的方案:一个UserProfileEditor主组件,内部包含AvatarUploader、BioForm子组件,以及对应的 API Service 函数。
第 3 步:编码与实时辅助 (Hooks + Skills)我开始编写AvatarUploader组件。当我写到处理文件选择的逻辑时,我有点不确定FileAPI 的细节。
- Hook 触发:我输入:“这里怎么用 JavaScript 读取图片文件的宽高来做客户端校验?” 由于我的 Hook 配置了在提到“文件”、“图片”时自动运行一个检查当前目录组件结构的命令,Claude 在回复前先输出了当前
components/下的文件列表,让我确认没有重复造轮子。 - Skill 调用:Claude 在给出代码示例后,补充道:“如果你需要快速测试这个文件选择逻辑,我可以调用 ‘Create Test File’ Skill,为你生成一个包含模拟图片文件的临时 HTML 页面。” 我同意后,它调用 Skill 生成了一个测试页面,我直接在浏览器打开就能调试,无需手动搭建环境。
第 4 步:调试与测试编写过程中,我遇到了一个 API 400 错误。
- Hook 触发:我输入:“调用更新个人资料的 API 返回 400 了。” 配置的 “Debug API” Hook 被触发,自动运行了一个
curl命令,用我的测试 Token 和示例数据去请求开发环境的对应端点,并将完整的请求和响应头打印在聊天中。我立刻发现是请求体里字段名拼写错误 (avartarUrlvsavatarUrl)。 - Skill 调用:为了验证修复,我让 Claude 调用之前自定义的 “Run Single Test” Skill,只运行与用户资料相关的单元测试,快速得到反馈。
第 5 步:提交与回顾功能完成后,我准备提交代码。
- Hook 触发:我输入:“帮我写一下提交信息。” 一个配置好的 “Git Diff Context” Hook 自动运行
git diff --staged,将暂存区的变更摘要提供给 Claude。Claude 基于这些变更,生成了一条清晰、符合规范的提交信息:“feat(user-profile): add avatar upload and bio editing UI with form validation”。 - 最终检查:在推送前,我让 Claude 基于
CLAUDE.md中的规范,快速 Review 一下我修改的所有文件,看看有没有明显的代码风格问题或遗漏的边界情况。
6.2 工具链的个性化配置建议
没有放之四海而皆准的配置。我的建议是:
- 从
CLAUDE.md开始:这是性价比最高的投入。花 30 分钟为你的核心项目写一份,后续所有对话的效率都会提升。 - 逐步添加 Hooks:记录下你在一天开发中,重复手动执行超过 3 次的命令(如
git status,npm run test:unit,docker-compose logs -f backend),将它们转化为 Hooks。 - 按需开发 Skills:当某个操作(如查询数据、调用内部工具、生成特定报告)频繁到你觉得“要是 Claude 能自己干就好了”的时候,就是开发自定义 Skill 的时机。
- 谨慎使用 Subagents:将其用于每周或每月的重大设计、重构或复杂问题排查会议,而不是日常琐事。
这套工作流的核心思想,是让 AI 成为你工作流的深度参与者,而不仅仅是一个信息检索器或代码补全工具。通过CLAUDE.md赋予它知识,通过 Hooks 赋予它自动化能力,通过 Skills 赋予它扩展工具,通过 Subagents 赋予它团队协作模式。最终,你节省下来的不仅是时间,更是最宝贵的认知资源,可以更专注于真正的架构设计和创造性问题解决。