Skills 与 Hooks
将常用工作流封装为可复用的 Skill,用 Hooks 实现事件驱动的自动化
如果你发现自己在 Claude Code 里重复做同样的事——每次都要解释相同的编码规范、每次都要手动跑 lint、每次都要描述同一套部署流程——那就该考虑把它们封装起来了。
重复操作超过两次,就该自动化。 Claude Code 提供了 Skills 和 Hooks 两种扩展机制,分别解决不同的问题。
Skills:可复用的知识与工作流
Skills 是一种 Markdown 文件,放在 .claude/skills/ 目录下。你可以把它理解为给 Claude Code 写的"操作手册"——告诉它在特定场景下该怎么做。
目录结构
.claude/
├── CLAUDE.md # 项目级别的全局规则
└── skills/
├── fix-issue.md # 修 Bug 的标准流程
├── review-pr.md # Code Review 规范
├── api-standards.md # API 设计规范
└── deploy-guide.md # 部署流程指南每个 Skill 文件就是一个普通的 Markdown 文件,用自然语言描述你的规范或流程。
两种类型的 Skill
知识型 Skill——定义规范和标准,让 Claude Code 在相关场景下自动遵守:
# API 设计规范
## 路由命名
- 使用复数名词:/api/users, /api/posts
- 嵌套资源用子路由:/api/users/:id/posts
- 操作类接口用动词:/api/auth/login
## 响应格式
所有 API 统一返回以下格式:
{
"code": 0,
"data": {},
"message": "success"
}
## 错误处理
- 400: 参数校验失败
- 401: 未认证
- 403: 无权限
- 404: 资源不存在
- 500: 服务端错误,使用 src/shared/lib/errors.ts 中的 AppError 类工作流型 Skill——定义一套操作步骤,用 /skill-name 手动触发:
# 修复 Issue 流程
## 触发方式
/fix-issue <issue-number>
## 步骤
1. 读取 GitHub Issue 的描述和评论
2. 分析问题,确认影响范围
3. 找到相关代码文件
4. 写修复代码
5. 运行现有测试确认不回归
6. 为修复写一个针对性的测试
7. 提交代码,commit message 格式:fix: 简要描述 (#issue-number)手动调用与自动加载
- 手动调用:在对话中输入
/fix-issue 42,Claude Code 会加载对应的 Skill 文件并按步骤执行 - 自动加载:知识型 Skill 会在相关场景中被自动引用,比如你在写 API 时,API 规范的 Skill 会自动生效
防止自动触发
如果某个 Skill 你只想手动调用,不想让 Claude Code 自动加载,可以在文件开头加上:
---
disable-model-invocation: true
---这样只有你显式输入 /skill-name 时才会触发。
Hooks:事件驱动的确定性执行
Hooks 和 Skills 解决的是不同层面的问题:
- Skills 是建议性的——Claude Code 会参考但不一定严格执行
- Hooks 是确定性的——只要事件触发,必定执行指定的命令
Hooks 配置在 .claude/settings.json 中,当特定事件发生时自动运行你指定的 Shell 命令。
支持的 Hook 类型
| Hook | 触发时机 | 典型用途 |
|---|---|---|
PreToolUse | 在工具调用之前 | 参数校验、安全检查 |
PostToolUse | 在工具调用之后 | 自动格式化、lint 检查 |
Stop | Claude Code 完成任务准备停止时 | 自动运行测试、生成总结 |
PostCompact | 上下文压缩完成后 | 补充关键信息 |
PermissionRequest | 请求用户授权时 | 自动批准特定操作 |
PermissionDenied | 用户拒绝授权后 | 记录日志、尝试替代方案 |
实用案例:自动格式化
每次 Claude Code 编辑或创建文件后自动运行 ESLint 格式化:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"command": "npx eslint --fix $CLAUDE_FILE_PATH 2>/dev/null || true"
}
]
}
}这个配置做了什么:
PostToolUse:在工具调用完成后触发matcher: "Edit|Write":只在 Edit 或 Write 工具被使用时触发(不是每个工具都触发)command:运行 ESLint 自动修复,2>/dev/null || true确保即使 lint 失败也不会中断 Claude Code 的工作流
再比如,每次 Claude Code 完成任务时自动运行测试:
{
"hooks": {
"Stop": [
{
"command": "pnpm test --run 2>&1 | tail -20"
}
]
}
}三种扩展机制对比
Claude Code 有三种扩展能力,它们各有所长:
| 维度 | Skills | Hooks | MCP |
|---|---|---|---|
| 本质 | Markdown 文档 | Shell 命令 | 外部服务协议 |
| 确定性 | 建议性,Claude 可能不严格遵守 | 确定性,必定执行 | 确定性,由外部服务保证 |
| 触发方式 | 手动 /skill-name 或自动加载 | 事件驱动,自动触发 | Claude 根据需要调用 |
| 适用场景 | 编码规范、工作流程、最佳实践 | 格式化、lint、测试、安全检查 | 数据库查询、外部 API、浏览器操作 |
| 学习成本 | 低,写 Markdown 就行 | 中,需要了解事件和 Shell | 中高,需要配置 MCP Server |
[!NOTE] 三种机制不是互斥的,实际项目中通常会组合使用。比如用 Skill 定义 API 规范,用 Hook 自动格式化代码,用 MCP 连接数据库。
从哪里开始
如果你刚接触这些概念,建议按这个顺序上手:
- 先写一个知识型 Skill——把你项目的编码规范写成
.claude/skills/coding-standards.md - 加一个 PostToolUse Hook——自动格式化代码,减少手动操作
- 写一个工作流型 Skill——封装你最常重复的操作(比如修 Bug 流程、Code Review 流程)
- 等需要外部服务时再接 MCP——下一节详细讲
本章节为会员专属内容
购买全站技能解锁即可免费阅读所有进阶教程,包括对话技巧、扩展能力、实战项目和思维模型等完整内容。
已购买会员?请先登录你的账号,即可自动解锁。

