让Claude Code乖乖听话!Anthropic发布Claude Code调教指南 Anthropic 官方博客放出一份 Claude Code 调教指南。这篇指南把七种自定义机制按加载时机、上下文开销和执行权限三条线划分教你如何让 Claude Code 乖乖听话不跑偏。CLAUDE.md 文件、rules规则、skills技能、subagents子代理、hooks钩子、output styles输出风格、append-system-prompt追加系统提示七种方式覆盖了 Claude Code 行为定制的全部入口。每一种在加载时机、压缩行为、上下文开销和适用场景上都不一样。把它们摆到合适的位置Claude Code 才能乖乖干活。而选哪一种机制本质上是在选你愿意为这条指令付多少上下文成本、给它多大权力。七种机制一览Anthropic 把七种自定义方式整理成一张总览表。每一种机制都对应三个核心维度指令何时进入上下文长会话压缩后是否保留权限有多大。这张表是所有判断的基础记下来或收藏起来遇到具体场景对照查就行。七种机制不是互斥关系更像一套分工明确的工具箱。Anthropic 反复强调一个核心判断维度指令是否需要在长会话压缩后保留是否值得为它付常驻上下文的成本是否需要确定性而非模型自主判断。把这三个问题想清楚七种机制的选择基本就定了。下面按机制类别拆开讲最后给一些建议帮你避坑。文件、规则与代理CLAUDE.md 是放在项目根目录的 markdown 文件会话开始就进上下文整个会话常驻。构建命令、目录布局、monorepo单体仓库结构、编码规范、团队约定都适合放这里。它分两种加载方式。一种是常驻型根目录的 CLAUDE.md可以放在共享仓库里也可以放在本地存个人偏好。会话开始就加载长会话里也不会丢失或衰减Claude Code 压缩对话时还会重新读一遍。另一种是按需型子目录里的 CLAUDE.md。比如 app/api/CLAUDE.md只有 Claude 读取 app/api 下的文件时才会加载会话开始时不会。它的压缩行为和路径限定规则一样被触碰后才会重新出现。共享仓库里CLAUDE.md 像无人维护的配置文件每个团队都往里加自己的指令没人删东西。规模一大成本就叠加。每一行都会进入每个工程师的每次会话不管相不相关既消耗 token又稀释真正重要指令的执行力度。所以文件越大越应该把团队专属约定挪到路径限定规则里把流程性内容挪到 skills 里让它们只在需要时加载。CLAUDE.md 应该控制在 200 行以内指定一个负责人像审查代码一样审查它的变更。把它当作给 Claude 看的代码库概览或者一个索引指向其他 Claude 可以按需查阅的文件。monorepo 里给每个团队的目录配一个子目录 CLAUDE.md团队只加载自己的约定。开发者可以用 claudeMdExcludes 设置跳过从不碰的团队的文件。组织级标准安全策略、合规要求可以走 MDM移动设备管理或配置管理工具统一部署到开发者机器上个人设置无法排除。rules 是放在 .claude/rules/ 目录下的 markdown 文件给 Claude 提供具体约束或约定。它和 CLAUDE.md 的差别主要在路径控制能力CLAUDE.md 是全量常驻rules 可以做精细的路径限定。不带路径限定的 rules 行为和 CLAUDE.md 一样会话开始就加载压缩时重新注入。任务无关时也会被加载浪费 token。路径限定规则通过 paths 字段控制加载时机让规则只在相关时进入上下文。限定到 src/api/** 的规则在纯文档会话里不会进上下文只有 Claude 读取 src/api/ 目录下文件时才加载。代码示例文件级别的约束比如 migrations 是只追加的适合放进 paths frontmatter前置元数据。当指令涉及跨切面关注点或出现在多个但非全部代码区域时路径限定规则比嵌套 CLAUDE.md 更合适。skills 放在 .claude/skills/ 目录下是文件夹形式的指令、脚本和资源集合由 Claude 动态加载。每个 skill 有一个 SKILL.md 文件包含名称、描述和主体。会话开始时只加载名称和描述主体在 Claude 调用该 skill 时才加载。调用方式有两种一种是通过 slash command斜杠命令比如 /code-review一种是任务自动匹配。举个例子/code-review 是一个内置 skill会审查当前的 diff代码差异并报告发现不修改文件。skill 定义了 playbook操作手册Claude 每次调用都按同一套结构化流程走。压缩时Claude Code 会按共享预算重新注入已调用的 skills。一次会话里调用了多个 skill最早的会被先丢弃。流程性指令部署工作流、发布检查清单、代码审查流程应该放进 skill 而不是 CLAUDE.md。subagents 是放在 .claude/agents/ 目录下的 markdown 文件定义用于特定副任务的隔离助手。每个文件用 YAML frontmatter包含 name、description以及可选的 model 和 tool access 字段后面跟一段主体主体会变成该 subagent 的系统提示。subagents 和 skills 类似名称、描述、工具列表在会话开始时加载但主体不会自动调用。Claude 通过 Agent toolAgent 工具调用它传入一段 prompt 字符串。主体的指令上下文不会自动调用也永远不会进入父对话。subagent 在自己的全新上下文窗口里运行回到主会话的只有 subagent 的最终消息通常是多个副任务的聚合结果加元数据。subagents 的模式可以扩展。支持最多五层嵌套动态工作流可以编排几十到几百个后台 agent不需要你逐个指定架构细节。编排计划和中间结果存在脚本变量里不在 Claude 的上下文窗口里既能扩展又不丢失指令保真度。举一个具体场景你让 Claude 做一次大型依赖审计要扫 200 个包、查每个包的安全公告、给出升级建议。如果走主线程中间结果会把上下文塞满连原始任务都丢了。换 subagent 编排每个包派一个 agent 处理只把最终汇总报告回主会话主线程还能继续推理下一步动作。隔离是选 subagent 而不是 skill 的主要原因。当副任务深度搜索、日志分析、依赖审计会让中间结果塞满主对话而你之后不会再引用这些结果时就用 subagent。当你希望流程在主线程里展开能看到并引导每一步时就用 skill。钩子、风格与提示hooks 是用户定义的命令、HTTP 端点或 LLM prompt通过在 Claude 生命周期事件文件编辑、工具调用、会话开始触发提供对 Claude 行为的确定性控制。hooks 在 settings.json、managed policy托管策略设置或 skill/agent frontmatter 里注册。类型有五种command、HTTP、mcp_tool、prompt、agent。前三种确定性执行后两种prompt 和 agent用 Claude 的判断而不是规则决定输出。hooks 上下文开销低因为配置或指令在主上下文窗口之外。harness 执行 handler处理程序或用独立窗口做模型调用。部分 hook 的输出会保存到主上下文窗口。比如阻断型 hook 的标准错误会进入上下文让 Claude 知道调用为什么被拒绝。但大多数 hook 的输出不会进主窗口除非配置明确返回。用 PreCompact 事件把聊天记录备份到另一个文件Claude 不会知道备份到了哪里。hooks 跟 CLAUDE.md、rules、skills 有本质区别原因就在这里。前三者都是给 Claude 看的指令遵循与否取决于模型当下的判断。hooks 是代码层确定性触发模型连选择权都没有。hooks 用于一切需要确定性发生的场景编辑后跑 lint、完成后发 Slack、命令执行前阻断。PreToolUse hook 可以检查任何工具调用exit code 2 就能拒绝它。它们上下文开销低因为运行的是 harness 执行的代码而不是加载进上下文给 Claude 看的指令。output styles 是放在 .claude/output-styles/ 目录下的文件把指令注入系统提示。它们不会被压缩每次会话开始就加载会话内首次请求后缓存上下文开销中等。因为它们位于系统提示里在所有方法里指令遵循权重最高需要谨慎使用。修改 output style 会替换默认 output style除非在 frontmatter 里设置 keep-coding-instructions: true。在 Claude Code 里自定义 output style 会移除告诉 Claude 它在帮用户做软件工程任务的指令以及其他关键默认指令包括如何限定改动范围、何时加或省略代码注释、遇到安全顾虑怎么办、验证习惯比如声明工作完成前先跑测试。默认情况下自定义 output style 会丢掉所有这些Claude Code 会从软件工程助手变成更通用的助手。能力没变但角色定位偏移之后模型在很多细节行为上会跟着偏。比如原本声明完成前会主动跑测试换 style 后可能就直接交差。写自定义 output style 之前先看内置的几种。Proactive、Explanatory、Learning 覆盖了最常见的需求自主性、教学模式、协作编码不用自己维护 style 文件。修改 output style 文件可能对 Claude 行为产生意料之外的大变化append-system-prompt追加系统提示flag 是另一种选择只对原始系统提示做加法。它不修改 Claude 的角色只往默认角色上加指令。追加系统提示在调用时传入只对本次调用生效不会作为文件跨会话保留。追加系统提示比其他指令传递方式上下文开销更高。它增加输入 tokenprompt caching提示缓存能降低会话内首次请求后的成本。追加系统提示适合加具体的编码标准、输出格式或领域知识。注意追加方式在执行力度上有边际递减。一般而言往系统提示里塞的指令越多Claude 遵循得越不严格尤其是互相矛盾的指令几条打架的指令放在一起模型往往会各取一部分执行结果哪条都没真正落地。落地建议实际用起来遇到下面几种情况说明你该换个地方放指令了1CLAUDE.md 里写了每次 X 都要做 Y。行为需要可靠发生时每次编辑后跑 prettier、完成后发 Slack就改成 settings.json 里的 hook。模型选择跑 formatter格式化工具和 formatter 自动跑是两回事。2CLAUDE.md 里写了绝对不能做某件事。某件事绝对不能发生时指令不是合适的工具。Claude 大多数时候会遵循但在压力下、长会话里、模糊场景里或因为任务中访问的文件里有 prompt injection提示注入模型可能失败。真正的 guardrail护栏需要确定性执行方式是 hooks 和 permissions权限。PreToolUse hook 检查调用exit code 2 阻断。managed settings托管设置更进一步由管理员部署用户本地配置无法覆盖是组织级确定性护栏的唯一方式。3CLAUDE.md 里塞了 30 行流程。流程属于 skills。CLAUDE.md 是给 Claude 始终记住的事实构建命令、monorepo 布局、团队约定。部署 runbook操作手册或安全审查清单应该放在 .claude/skills/主体只在调用时加载。4针对 API 的规则没加 paths。规则只适用于 src/api/** 时用 paths 限定能让它在无关工作时退出上下文。不限定路径的规则和把内容塞进 CLAUDE.md 在机制上完全一样永远加载永远消耗 token。5把个人偏好写进项目级 CLAUDE.md 文件。所有文件级方式都有用户级对应物无论在哪个仓库都会为每次 Claude Code 会话加载。个人偏好始终用语义化 commit 消息放本地文件。项目级文件留给团队级但特定于某个代码库的偏好。弄懂几种机制之后可以把多个机制skills、subagents、hooks、output styles打包成 plugin插件跨团队或跨项目共享一套一致的配置。一个团队沉淀出的发布检查 skill、一段 PreToolUse 阻断 hook、一套专属 output style组合成 plugin 之后新成员装上插件就能复用整套工作流不用一项项配置。让 Claude Code 听话除了指令本身还需要明白指令放哪里、什么时候加载、给多大权力。七种机制各有脾气摆错位置再精准的指令也会失效。你最常用哪一种又踩过哪种坑参考资料https://claude.com/blog/steering-claude-code-skills-hooks-rules-subagents-and-more