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 检查
StopClaude 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 有三种扩展能力,它们各有所长:

维度SkillsHooksMCP
本质Markdown 文档Shell 命令外部服务协议
确定性建议性,Claude 可能不严格遵守确定性,必定执行确定性,由外部服务保证
触发方式手动 /skill-name 或自动加载事件驱动,自动触发Claude 根据需要调用
适用场景编码规范、工作流程、最佳实践格式化、lint、测试、安全检查数据库查询、外部 API、浏览器操作
学习成本低,写 Markdown 就行中,需要了解事件和 Shell中高,需要配置 MCP Server

[!NOTE] 三种机制不是互斥的,实际项目中通常会组合使用。比如用 Skill 定义 API 规范,用 Hook 自动格式化代码,用 MCP 连接数据库。


从哪里开始

如果你刚接触这些概念,建议按这个顺序上手:

  1. 先写一个知识型 Skill——把你项目的编码规范写成 .claude/skills/coding-standards.md
  2. 加一个 PostToolUse Hook——自动格式化代码,减少手动操作
  3. 写一个工作流型 Skill——封装你最常重复的操作(比如修 Bug 流程、Code Review 流程)
  4. 等需要外部服务时再接 MCP——下一节详细讲

本章节为会员专属内容

购买全站技能解锁即可免费阅读所有进阶教程,包括对话技巧、扩展能力、实战项目和思维模型等完整内容。

已购买会员?请先登录你的账号,即可自动解锁。