Claude Code 提供了至少五种不同的方式来"指挥"Claude 的行为——CLAUDE.md、Rules、Skills、Subagents、Hooks、Output styles。很多用户搞不清楚这些机制之间的边界,什么场景该用哪个。本文基于 Anthropic 官方博客,梳理这几种"操控方式"各自的加载时机、上下文成本和适用场景,帮你把它们用对地方。
Rules:按路径精准加载,避免浪费 Token
Rules 是 .claude/rules/ 目录下的 markdown 文件,
给 Claude 特定的约束或约定
未限定范围的 Rules:
行为和 CLAUDE.md 一样,会话开始时始终加载,压缩
后也会重新注入——这可能在任务用不上的时候仍然
浪费 Token 加载无关上下文
Path-scoped Rules(路径限定规则):
通过添加 paths 字段,只在相关时才加载规则指令
示例:限定在 src/api/** 的规则,在纯文档会话中
完全不会进入上下文,只有当 Claude 读取该目录下
文件时才会被加载
---
paths:
- "src/api/**"
- "**/*.handler.ts"
---
All API handlers must validate input with Zod before
processing.
官方建议:像"迁移只能追加不能修改"这类针对特定文件的约束,最适合作为带 paths: frontmatter 的 Rule。当指令涉及横切关注点、只出现在代码库的部分(而非全部)角落时,优先选择路径限定的 Rule 而不是嵌套的 CLAUDE.md 文件。
Skills:动态加载的"操作手册"
Skills 位于 .claude/skills/,是包含指令、脚本、
资源的文件夹,Claude 会动态加载
加载机制:
- 会话开始时只加载 name 和 description
- 完整body内容在Claude调用该skill时才加载
(通过slash命令如/code-review,或任务自动匹配)
内置的 /code-review 就是一个典型的 Skill 例子——审查当前的 diff 并报告发现,不修改文件。Skill 定义了固定的操作手册,让 Claude 每次调用时都遵循同一套结构化的方法。
压缩(compaction)行为:
已调用的Skills会在压缩后被重新注入,但受限于所有
已调用Skills的总预算——如果一次会话调用了很多
Skills,最早调用的会先被丢弃
官方建议:像部署流程、发布检查清单、审查流程这类"程序性"的指令,属于 Skill 的范畴,而不是塞进 CLAUDE.md。
Subagents:隔离上下文,避免"污染"主对话
Subagents 位于 .claude/agents/,是定义特定辅助
任务的独立助手的markdown文件
每个文件用YAML frontmatter定义name、description、
可选的model和tool访问权限,body部分成为该subagent
的系统提示词
关键特性:
subagent的body部分(详细指令)不会自动加载,也
永远不会进入父对话的上下文——它在自己全新的上下文
窗口中运行,只有subagent的最终消息(通常是多个
子任务的汇总结果)加上元数据会返回主会话
扩展性:
Subagent可以嵌套多达5层深,动态工作流(dynamic
workflows)可以编排数十到数百个后台智能体,而不
需要用户手动指定每一个subagent架构细节。编排计划
和中间结果存储在脚本变量中而非Claude的上下文窗口,
这使得规模化成为可能且不损失指令保真度
官方建议:这种上下文隔离特性正是选择 Subagent 而非 Skill 的主要原因——当一个辅助任务(比如深度搜索、日志分析、依赖审计)产生的中间结果会污染主对话、且你之后不会再引用这些细节时,用 Subagent;如果你希望整个流程在主线程内展开,以便逐步查看和引导每一步,则用 Skill。
Hooks:确定性控制,而非"建议"
Hooks是用户定义的命令、HTTP端点或LLM提示,在
Claude生命周期的特定事件(文件编辑、工具调用、
会话开始等)触发时,提供更确定性的行为控制
注册位置:settings.json、托管策略设置,或skill/
agent的frontmatter
Hooks类型:command、http、mcp_tool、prompt、agent
前三种(command/http/mcp_tool)确定性执行;
后两种(prompt/agent)使用Claude的判断而非固定
规则来决定输出
上下文成本:
Hooks的配置/指令存在于主上下文窗口之外,因此上下文
成本很低。harness运行处理程序(command/http/
mcp_tool),或用独立窗口进行模型调用(prompt/
agent)
输出是否进入主窗口取决于配置:例如一个阻断型hook
的标准错误信息会保存进上下文,这样Claude能知道
调用为什么被拒绝;但大多数hook的输出默认不会
保存进主窗口,除非配置明确要求返回
官方建议:任何应该确定性发生的事情,都适合用 Hook——编辑后自动运行 linter、完成后发消息到 Slack、在特定命令执行前拦截它们。一个 PreToolUse hook 可以检查任意工具调用,并通过返回退出码 2 来拒绝执行。Hooks 和 Skills 也是构建"智能体循环"(重复运行直到满足停止条件的工作流)的基础构件。
Output styles:权重最高,需谨慎使用
Output styles是.claude/output-styles/目录下的
文件,向系统提示词注入指令
特性:
- 永远不会被压缩
- 每次会话开始时加载
- 会话内首次请求后被缓存(中等上下文成本)
因为直接位于系统提示词内,output styles拥有目前
所有方式里最高的指令遵循权重,应当谨慎使用
修改 output style 会替换默认的输出风格(除非在样式中设置 keep-coding-instructions: true)。正因为权重最高,一旦配置不当,可能对 Claude 的整体行为产生比其他任何机制都更强的影响,使用时需要格外谨慎。
决策速查表
场景 适合选择
项目通用背景/长期约定 CLAUDE.md
仅特定路径/文件类型生效的约束 Path-scoped Rule
程序性操作手册(部署/发布流程) Skill
需要隔离上下文的独立子任务 Subagent
必须确定性发生的动作(检查/通知) Hook
全局性、高权重的行为风格调整 Output style(谨慎使用)
实战建议
1. 先问自己:这个指令是"任何时候都要遵守的通用
约定"还是"只在特定文件/路径下才相关的约束"?
前者放CLAUDE.md,后者用path-scoped Rule节省
Token
2. 涉及固定流程步骤(如发布检查清单)的内容,写成
Skill而非塞进CLAUDE.md,让Claude按需调用而非
每次会话都加载
3. 需要执行深度搜索、日志分析这类会产生大量中间
结果、且你不需要在主对话中查看细节的任务,用
Subagent隔离上下文,保持主线程整洁
4. 有强制性要求(比如"编辑后必须跑lint")的场景,
不要指望prompt指令能100%被遵守,改用Hook做
确定性拦截
5. Output style仅在确实需要对Claude整体行为风格做
出全局调整时使用,避免滥用导致行为难以预测
总结
这五种机制并非相互替代关系,而是分别对应"上下文成本"和"指令权威性"这两个维度上不同的取舍——了解每种方式的加载时机、压缩行为和上下文成本,能帮助你在配置 Claude Code 项目时做出更精准的选择,而不是把所有指令一股脑塞进 CLAUDE.md,既浪费 Token 又难以维护。
来源:Steering Claude Code: when to use CLAUDE.md, skills, hooks, and subagents — Anthropic 官方博客