Claude Code Skills+Hooks+Subagents 从入门到精通,一步到位

49 阅读1分钟

上周五晚上11点,我正准备下班,产品突然甩过来一个需求:给项目加一套完整的代码审查流程,要能自动跑lint、生成review报告、还要对接GitHub PR。

我当时就想:这活用Claude Code的Skills + Hooks + Subagents三件套,大概20分钟能搞定。

结果真搞定了。而且比我之前手写shell脚本 + GitHub Actions那一套灵活得多。

今天就把这套组合拳拆开讲清楚——从零配置到实战,手把手带你跑通Claude Code的三大高级特性。

先说清楚这三样东西是什么

很多人搞混Skills、Hooks和Subagents,我一开始也晕。

简单粗暴地讲:

  • Skills = 你给Claude写的"操作手册",告诉它遇到某类任务该怎么做。放在 .claude/skills/ 目录下,用markdown写就行
  • Hooks = 事件触发器,Claude执行某个操作的前后自动运行的脚本。比如它每次要执行bash命令前,你可以先跑一个安全检查
  • Subagents = Claude派出去的"分身",能并行干活。主线程继续跟你聊天,分身在后台帮你查代码、跑测试

三者不是互相替代的关系,而是层层递进:Skills解决"怎么做",Hooks解决"安全边界",Subagents解决"效率瓶颈"。

环境准备

我本地环境是这样的:

# 确认Claude Code版本(建议1.0.18+)
claude --version
# claude 1.0.21

# Node.js需要18+
node --version
# v20.11.0

安装就不多说了,一行命令:

# macOS / Linux
curl -fsSL https://claude.ai/install.sh | sh

# 或者用npm
npm install -g @anthropic-ai/claude-code

装好之后首次运行 claude,按提示登录你的Claude Pro/Max账号或者API key就行。

项目里建议先跑一下初始化:

cd your-project
claude
> /init

这会在项目根目录生成一个 CLAUDE.md 文件——Claude Code的"项目记忆",每次启动自动读取。这个文件很重要,后面Skills会依赖它里面的上下文。

实战一:写一个Skill,让Claude自动生成规范的PR描述

这是我用得最多的一个Skill。每次提PR不想写description?让Claude自己生成。

在项目根目录创建 .claude/skills/pr-description/SKILL.md

---
name: pr-description
description: Generate a standardized PR description based on current git changes
argument-hint: [ticket-number]
allowed-tools: Bash, Read, Write
---

然后下面写具体的指令(markdown body部分):

## PR Description Generator

You are generating a PR description. Follow these steps EXACTLY:

1. Run `git diff main...HEAD --stat` to see what files changed
2. Run `git log main..HEAD --oneline` to see commit history
3. Read the changed files if needed to understand the changes
4. Generate a PR description with this format:

### Summary
[1-2 sentences describing the overall change]

### Changes
- [Bullet point per major change]

### Test Plan
- [How to verify this works]

### Related Tickets
- [TICKET-NUMBER if provided as argument: $ARGUMENTS]

5. Output the description and ask the user to confirm before proceeding

使用方式超简单,在Claude Code里直接输入:

/pr-description JIRA-1234

Claude就会自动读取git变更,分析代码差异,然后按你定义的格式生成PR描述。

说个坑:一开始我把 allowed-tools 写成了 allowed-tools: Bash,结果Claude生成完描述想写入文件时报错——因为它没有Write权限。改成 Bash, Read, Write 之后就好了。

实战二:用Hooks给Claude加一道安全锁

Hooks是我觉得最被低估的功能。它的原理很简单:在Claude执行操作的前后,触发你指定的脚本。

比如我团队有个规矩:不允许直接push到main分支。用Hook实现:

.claude/settings.json 里配置:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "bash .claude/hooks/check-dangerous-commands.sh"
          }
        ]
      }
    ]
  }
}

然后创建 .claude/hooks/check-dangerous-commands.sh

#!/bin/bash
# 从stdin读取Claude即将执行的命令
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# 拦截危险操作
DANGEROUS_PATTERNS=(
  "git push origin main"
  "git push origin master"
  "rm -rf /"
  "DROP TABLE"
  "DROP DATABASE"
  "DELETE FROM.*WHERE 1=1"
)

for pattern in "${DANGEROUS_PATTERNS[@]}"; do
  if echo "$COMMAND" | grep -qiE "$pattern"; then
    echo "BLOCKED: Command matches dangerous pattern: $pattern"
    exit 1
  fi
done

# 通过检查
exit 0
chmod +x .claude/hooks/check-dangerous-commands.sh

这样Claude每次要跑bash命令之前,都会先过一遍这个检查脚本。匹配到危险模式就直接拦截。

实测效果:我让Claude执行 git push origin main,它直接被挡回来了,报错信息是 BLOCKED: Command matches dangerous pattern: git push origin main

对了,Hook的 matcher 字段支持模糊匹配。"Bash" 会匹配所有Bash工具调用,你也可以用 "Bash(git push*)" 只匹配特定的命令模式,粒度很细。

实战三:Subagents并行干活,效率直接翻倍

这是我周五晚上那20分钟的主力武器。

场景:我需要同时做三件事——审查代码质量、检查安全漏洞、验证测试覆盖率。串行跑至少15分钟,用Subagents并行跑,4分钟搞定。

在项目根目录创建 agents/ 目录,放三个agent配置:

agents/code-reviewer.md

---
name: code-reviewer
model: sonnet
effort: high
allowed-tools: Read, Grep, Glob
---
You are a senior code reviewer. Review ALL changed files in the current branch compared to main.

Focus on:
- Code quality and readability
- Design pattern violations
- Performance concerns
- Missing error handling

Run: `git diff main...HEAD --name-only` to get changed files, then read and review each one.

Return a structured review with:
1. Critical issues (must fix)
2. Suggestions (nice to have)
3. Positive notes (good patterns found)

agents/security-scanner.md

---
name: security-scanner
model: sonnet
effort: medium
allowed-tools: Read, Grep, Glob, Bash
---
Scan the codebase for security vulnerabilities:
1. Search for hardcoded secrets, API keys, tokens
2. Check for SQL injection patterns
3. Look for unsafe eval() or exec() usage
4. Verify dependency versions for known CVEs

Return findings as: SEVERITY | FILE | LINE | DESCRIPTION

agents/test-coverage.md

---
name: test-coverage
model: sonnet
effort: medium
allowed-tools: Bash, Read
---
Analyze test coverage for the current branch:
1. Run: git diff main...HEAD --name-only to get changed files
2. For each changed source file, check if a corresponding test file exists
3. Read the test files to assess coverage quality
4. Report: which files lack tests, which have weak tests, which are well-covered

使用方式——在Claude Code里让主agent派活:

Please run all three agents in parallel:
- agents/code-reviewer.md
- agents/security-scanner.md  
- agents/test-coverage.md

Each agent should work independently on the current branch changes.

Claude会启动三个并行的子agent,各自在隔离环境里跑,最后把结果汇总给你。

补充一下,如果你用的是最新版Claude Code,也可以用 --worktree 参数让每个agent在不同的git worktree里跑,避免文件冲突:

# 终端1
claude --worktree "review code quality"

# 终端2
claude --worktree "scan security issues"

# 终端3
claude --worktree "check test coverage"

三个特性怎么搭配?

我总结了一张表:

场景用什么为什么
重复性任务(部署、发版)Skills固定流程,一次定义反复用
安全管控Hooks被动拦截,不需要记
大规模并行分析Subagents快,各干各的不互相影响
Skills + Hooks复杂工作流Skill负责流程,Hook负责守门
三者全上生产级AI编程环境Skills定义行为,Hooks守边界,Subagents提效率

我现在的日常:/deploy 这个Skill负责发版,Hooks拦截所有危险git操作,复杂任务用Subagents拆分并行。基本上把Claude Code从一个聊天工具变成了一个有纪律的AI开发团队。

常见问题

Q1: Skills和CLAUDE.md有什么区别?什么时候用哪个?

CLAUDE.md是全局配置,每次对话都加载——适合放项目约定、技术栈信息这种"环境说明"。Skills是按需加载的,只在触发时才读进来——适合放具体的操作流程。打个比方:CLAUDE.md是员工手册,Skills是SOP文档。

Q2: Hooks的脚本执行失败会怎样?

PreToolUse类型的Hook如果exit code非0,Claude会取消这次操作并告诉你被拦截了。PostToolUse类型的Hook失败不影响已经执行的操作。所以安全类的检查放Pre,通知类的放Post。

Q3: Subagents会不会互相冲突?

默认情况下每个subagent在独立的上下文里运行,文件操作可能有冲突。建议:只读分析类的任务放心并行,涉及写文件的任务用 --worktree 隔离,或者串行执行。

Q4: Skill的description字段有多重要?

非常重要。如果你的Skill设置了 disable-model-invocation: false(默认),Claude会根据description自动判断是否要加载这个Skill。写得好,Claude能精准匹配场景;写得模糊,要么不触发要么乱触发。建议用英文写description,匹配更准确。

Q5: 我能在Skill里引用外部文件吗?

可以。Skill目录下可以放 references/templates/scripts/ 子目录。在SKILL.md里提到"参考 references/api-spec.md",Claude会自动去读。这个特性对大型项目特别有用——把API文档、配置模板和Skill绑在一起管理。

如果觉得有帮助,欢迎点赞收藏 ❤️ 更多AI工具实战教程,关注我第一时间获取~