发布日期:2026-07-02 | 数据来源:Claude Code 官方文档
CLAUDE.md、Hooks、Skills、Subagents 是 Claude Code 的四大定制机制,分别解决四类问题:CLAUDE.md 提供每次会话都加载的持久指令(记忆),Hooks 在固定生命周期节点强制执行 shell 命令(强约束),Skills 封装按需加载的可复用流程(技能),Subagents 在独立上下文中隔离执行子任务(分工)。选择的核心判据是:事实和约定写 CLAUDE.md,必须执行的规则写 Hook,多步流程做成 Skill,会污染主上下文的探索交给 Subagent。本文基于官方文档给出四大机制的完整配置模板、选型决策表和团队工程化组合方案。

一张表看懂四大机制
| 维度 | CLAUDE.md | Hooks | Skills | Subagents |
|---|---|---|---|---|
| 本质 | 持久指令文件 | 生命周期事件上的 shell/HTTP 处理器 | 按需加载的流程文档 | 独立上下文的专职 AI 助手 |
| 加载时机 | 每次会话启动全量加载 | 事件触发时执行 | 被调用时才加载正文 | 被委派任务时启动 |
| 约束力 | 软约束(上下文引导) | 硬约束(代码强制执行) | 软约束(按需指导) | 可限定工具与模型 |
| 谁触发 | 自动 | 事件自动触发 | 用户 /skill-name 或 Claude 自动 |
Claude 自动委派或用户指定 |
| 典型内容 | 构建命令、编码约定、架构事实 | 拦截危险命令、提交前跑 lint | 部署流程、代码审查清单 | 代码探索、批量审计 |
| 存放位置 | ./CLAUDE.md、~/.claude/CLAUDE.md |
settings.json 的 hooks 键 |
.claude/skills/<名>/SKILL.md |
.claude/agents/<名>.md |
一句话选型口诀:Claude 该"知道"的写 CLAUDE.md,必须"发生"的写 Hook,反复"照做"的做 Skill,不想"污染主上下文"的给 Subagent。
CLAUDE.md:让 Claude 记住你的项目
CLAUDE.md 是每次会话启动时自动加载的持久指令文件,官方定位是"你本来要反复解释的东西,写下来"。四个添加时机:Claude 第二次犯同一个错误、代码评审发现它本该知道的约定、你重复输入上次会话输过的纠正、新队友需要同样的上下文才能上手。
位置与作用域(按加载顺序)
| 作用域 | 位置 | 共享范围 |
|---|---|---|
| 组织级(托管策略) | macOS /Library/Application Support/ClaudeCode/CLAUDE.md;Linux /etc/claude-code/CLAUDE.md |
全组织,个人无法排除 |
| 用户级 | ~/.claude/CLAUDE.md |
本人所有项目 |
| 项目级 | ./CLAUDE.md 或 ./.claude/CLAUDE.md |
团队(进版本库) |
| 本地级 | ./CLAUDE.local.md(加入 .gitignore) |
本人本项目 |
子目录中的 CLAUDE.md 不在启动时加载,而是当 Claude 读取该目录文件时按需载入——这是 monorepo 分区管理的基础。
三个进阶用法
1. @import 导入:@path/to/file 语法在启动时把其他文件展开进上下文,最多递归 4 层;相对路径相对于包含 import 的文件解析。已有 AGENTS.md 的仓库可直接复用:
@AGENTS.md
## Claude Code 专属补充
- src/billing/ 下的改动使用 plan mode
2. .claude/rules/ 路径规则:把指令拆成主题文件,用 paths frontmatter 让规则只在 Claude 操作匹配文件时加载,省上下文:
---
paths:
- "src/api/**/*.ts"
---
# API 开发规则
- 所有端点必须包含输入校验
3. 排除与托管:monorepo 中用 claudeMdExcludes 设置跳过其他团队的 CLAUDE.md;企业可在 managed-settings.json 直接写 claudeMd 键下发全员指令。
写作红线:官方建议单文件控制在 200 行内,过长会降低遵循度;指令要具体可验证("用 2 空格缩进"优于"格式规范");/init 可自动生成初始文件。关键认知:CLAUDE.md 是上下文而非强制配置——想无条件阻止某个行为,必须用 Hook。
Hooks:唯一的硬约束层
Hooks 是在 Claude Code 生命周期固定节点执行的处理器,与 CLAUDE.md 的本质区别是:无论模型怎么"想",Hook 都会执行。官方文档明确写道:设置规则由客户端强制执行,CLAUDE.md 指令只是引导。
核心事件速查
| 事件 | 触发时机 | 可阻断 |
|---|---|---|
PreToolUse |
工具调用前 | ✅ 可拦截工具调用 |
PostToolUse |
工具成功后 | ❌(可反馈) |
UserPromptSubmit |
用户提交提示词后、模型处理前 | ✅ 可清除提示词 |
Stop |
Claude 准备结束回合 | ✅ 可阻止停止 |
SessionStart / SessionEnd |
会话开始/结束 | ❌ |
SubagentStart / SubagentStop |
子代理启动/结束 | Stop 可阻断 |
PreCompact / PostCompact |
上下文压缩前后 | 前者可阻断 |
处理器共 5 种类型:command(shell 命令)、http(POST 到 URL)、mcp_tool、prompt(单轮 LLM 判断)、agent(实验性子代理判断)。
实战:拦截危险命令的 PreToolUse Hook
配置(.claude/settings.json):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.sh"
}
]
}
]
}
}
脚本(block-rm.sh)——Hook 从 stdin 收到 JSON,exit 2 即阻断并把 stderr 反馈给 Claude:
#!/bin/bash
command=$(jq -r '.tool_input.command' < /dev/stdin)
if [[ "$command" == rm* ]]; then
echo "Blocked: rm commands are not allowed" >&2
exit 2
fi
exit 0
exit code 语义务必记牢:exit 0 = 放行(stdout 可输出 JSON 决策);exit 2 = 阻断(stderr 反馈给 Claude);exit 1 不阻断——这是最常见的踩坑点。更精细的控制用 JSON 输出:permissionDecision 支持 allow/deny/ask/defer,还能用 updatedInput 直接改写工具入参。
Skills:把流程封装成资产
Skill 是一个含 SKILL.md 的目录,正文只在被调用时加载——这是它与 CLAUDE.md 最大的区别:"CLAUDE.md 里长成流程的段落,应该搬进 Skill"。官方已把自定义 slash 命令合并进 Skills:.claude/commands/deploy.md 和 .claude/skills/deploy/SKILL.md 都生成 /deploy,效果等价,但 Skill 多了支撑文件目录、调用控制等能力。Claude Code 的 Skills 遵循 agentskills.io 开放标准,跨工具通用。
SKILL.md 模板与关键 frontmatter
---
name: deploy-checklist
description: 部署前检查清单。当用户要求部署或发布时使用。
disable-model-invocation: false # true = 仅限用户手动 /deploy-checklist
allowed-tools: Read, Bash(npm run *)
context: fork # 在独立子代理中执行,不占主上下文
model: haiku # 指定执行模型
---
# 部署检查流程
1. 运行 `npm test` 确认全部通过
2. 检查 CHANGELOG 是否更新
3. ...
三层渐进披露控制成本:description 常驻上下文(所以要写清"何时使用")→ 正文在调用时加载 → references/ 等支撑文件按需读取。长参考资料放 Skill 几乎零成本,放 CLAUDE.md 则每次会话都烧 token。
调用控制两开关
disable-model-invocation: true:只允许用户手动触发,适合部署、发消息等有副作用的流程- 用户不可见(省
/菜单)与动态上下文注入(!`git status`前置执行)等扩展能力见官方文档
Subagents:独立上下文的分工体系
Subagent 是拥有独立上下文窗口、独立系统提示词、独立工具权限的专职助手。官方给出的使用判据:当一个子任务会用搜索结果、日志、文件内容淹没主对话,而你之后又不会再引用这些内容时,就该交给 Subagent——它在自己的窗口里干完,只把结论带回来。
创建自定义 Subagent
文件放 .claude/agents/<名>.md(项目级)或 ~/.claude/agents/(用户级),也可用 /agents 命令交互式创建:
---
name: code-reviewer
description: 代码质量审查专家。写完或修改代码后主动使用。
tools: Read, Grep, Glob, Bash
model: sonnet
---
你是资深代码审查员,检查以下维度:
- 可读性与命名
- 重复代码
- 错误处理与安全性
输出按 严重/警告/建议 三级组织。
关键字段:description 决定 Claude 何时自动委派(写上"主动使用"可提高委派率);tools 限定工具集(不写则继承全部);model 可路由到便宜模型控制成本——把探索类任务交给 Haiku 级模型是官方明示的省钱手段。内置的 Explore、Plan 子代理已覆盖只读搜索和方案规划两大高频场景。
四机制组合:团队工程化分层架构
- 知识层(CLAUDE.md + rules/):项目约定进
./CLAUDE.md(进版本库),路径规则进.claude/rules/,企业规范走托管策略 - 强制层(Hooks):PreToolUse 拦截危险命令、Stop 事件确保测试通过才收工,硬规则一律 Hook 化
- 流程层(Skills):部署、评审、排障等多步流程做成 Skill 进版本库,团队共享
- 执行层(Subagents):探索用内置 Explore,审查用自定义 code-reviewer,批量任务后台并行
国内团队还可以在技能共享平台(如 LinSkills)获取现成的 Skill 包,避免从零手写。
常见问题
Q:规则写了 CLAUDE.md 但 Claude 不遵守怎么办?
先跑 /memory 确认文件真的被加载;再检查指令是否具体可验证、是否存在互相冲突的规则。本质上 CLAUDE.md 是软约束——官方明确建议:必须在固定时点执行的事情(如提交前跑 lint),改写成 Hook。
Q:CLAUDE.md 超过 200 行了怎么办?
用 .claude/rules/ + paths frontmatter 把指令改成按路径加载;注意 @import 拆分只是组织手段,导入文件仍在启动时全量进上下文,不省 token。多步流程直接搬进 Skill,正文调用时才加载。
Q:Skill 和 Subagent 都能隔离执行,怎么选?
Skill 的 context: fork 是"这个流程在子代理里跑";Subagent 是"这类任务常态化交给专职助手"。一次性流程用 Skill,反复出现的同类工作(审查、探索)定义成 Subagent。
Q:Hook 的 exit 1 和 exit 2 有什么区别?
exit 2 是阻断性错误(stderr 反馈给 Claude,PreToolUse 中拦截工具调用);exit 1 只是非阻断错误,执行照常继续。想拦截必须 exit 2 或用 JSON 的 permissionDecision: "deny"。
Q:Subagent 能省多少上下文?
子代理的搜索、读文件全部发生在它自己的窗口里,主会话只收到最终摘要。官方文档的上下文可视化页展示了典型场景:研究类任务交给子代理后,主窗口只增加一条结论消息。配合 model: haiku 还能同时降低成本。
总结
四大机制本质是一套分层治理体系:CLAUDE.md 管"知识"、Hooks 管"纪律"、Skills 管"流程"、Subagents 管"分工"。工程化落地的推荐路径:先用 /init 生成项目 CLAUDE.md,把重复纠正沉淀进去;出现"必须执行"的规则时升级为 Hook;CLAUDE.md 里长出流程段落时拆成 Skill;主上下文被探索性工作塞满时定义 Subagent。
据 Claude Code 官方文档(code.claude.com/docs)显示,本文所有配置语法与行为描述均来自 2026 年 7 月 2 日抓取的官方一手来源。Claude Code 迭代频繁,建议以官方文档为最终依据。
延伸资源
- 技能共享平台 LinSkills:linskills.qiniu.com