Claude Code 有四种扩展机制,功能上有重叠,初学者常常不知道该用哪个。本文从"解决什么问题"出发,给出清晰的决策框架,包含每种机制的本质、适用场景、不适合的场景,以及它们组合使用的进阶模式。
四种机制的本质
| 机制 | 是什么 | 何时加载 | Token 开销 | 能否执行代码 |
|---|---|---|---|---|
| CLAUDE.md | 项目说明文档 | 每次会话自动全量加载 | 每次请求都消耗 | 否(纯文本) |
| Skills | 可复用指令模板 | 被调用时按需加载 | 只在用时消耗 | 是(!! 预处理) |
| Plugins(MCP) | 自定义工具 | 启动时连接,工具随时调用 | 工具目录始终占用 | 是(核心功能) |
| Sub-agents | 独立 AI 实例 | 主 Claude 委托时创建 | 有独立上下文 | 是(完整工具集) |
CLAUDE.md:持久的项目"宪法"
本质
每次会话自动加载的文档。Claude 带着它启动,它定义了这个项目的基本规则。
放什么
# CLAUDE.md 内容清单
## ✅ 适合放的
- 构建/测试命令(Claude 无法猜到的)
- 代码规范(与语言默认不同的约定)
- 架构决策(单体 vs 微服务、状态管理方案)
- 环境要求(特殊环境变量、工具版本要求)
- 禁止操作(不要修改 scripts/deploy.sh)
- 团队约定(分支命名规范、PR 模板格式)
## ❌ 不适合放的
- 逐步骤的操作流程(用 Skills)
- 只在特定场景用到的详细文档(用 Skills 按需加载)
- 可以从代码推断的内容(如"这是 TypeScript 项目")
- 频繁变化的信息(动态内容用 Skills 的 !! 注入)
- 超过 1000 字的内容(会稀释重要规则的影响力)内容精简测试
对每一行问:"去掉这行,Claude 会犯什么具体的错?"如果答案是"不会犯错",删掉它。
Skills:按需加载的工作流模板
本质
只在被调用时才加载到上下文的 Markdown 文件,用于封装可复用的工作流程。
用 Skills 而不是 CLAUDE.md 的信号
❶ 你不断把同样的指令粘贴到对话里
❷ CLAUDE.md 的某个部分变成了"步骤清单"而不是"规则/事实"
❸ 某些指令只在特定场景需要(PR 审查/部署/调试)
❹ 指令涉及需要实时数据的内容(git diff、PR 信息)
Skills 的四种模式
① 参考类(Reference):知识文档,Claude 工作时参考
---
name: api-conventions
description: 这个代码库的 API 设计规范
---
# API 设计规范
(详细的规范文档)② 任务类(Task):分步骤的操作流程,通常只允许用户手动触发
---
name: deploy
disable-model-invocation: true ← 关键:防止 Claude 自动触发部署!
---
# 部署流程
1. 运行测试...③ 动态注入类:包含 !! 命令,在加载时注入实时数据
---
name: pr-context
---
当前 PR 状态:!`gh pr view`④ Subagent 运行类:在独立上下文里执行,适合大量探索工作
---
name: deep-explore
context: fork
agent: Explore
---
调研 $ARGUMENTS...Skills 决策树
需要实时数据(git diff、环境变量)?
→ 用 !! 命令注入
操作有副作用(部署、发邮件、git push)?
→ disable-model-invocation: true
→ 确保只有用户手动触发
会产生大量噪音输出(日志、搜索结果)?
→ context: fork,在 Subagent 里运行
只在特定文件类型上需要?
→ paths: "**/*.tsx" 路径限定
背景知识,不是操作步骤?
→ user-invocable: false,让 Claude 自动应用
Plugins(MCP 服务器):新工具而非新指令
本质
给 Claude 新的工具(函数),而不是新的指令。Claude 像调用 Read 或 Bash 一样调用 MCP 工具。
用 Plugin 而不是 Skill 的判断
❶ 你需要 Claude 调用外部 API(GitHub、Slack、数据库)
❷ 你需要 Claude 做认证(OAuth、API Key 认证)
❸ 操作需要实时、双向的数据交互(不只是读取)
❹ 工具会被频繁调用(Plugin 比 !! 命令更高效)
Token 开销警告
每个 MCP 服务器的工具目录计入每次请求的上下文。安装 10 个 MCP 服务器、每个 10 个工具 = 每次对话多出约 100 个工具描述 = 显著的固定 Token 开销。
Plugin 的选择原则:只装实际使用的
临时需求 → 用 !! 命令(Skill 里)
频繁使用 → 安装成 Plugin
典型 Plugin vs Skill 对比
| 需求 | 用 Plugin | 用 Skill |
|---|---|---|
| 查看 GitHub PR 信息(频繁) | ✅ GitHub MCP | ❌(每次都调用 gh CLI 也可以,但 Plugin 更快) |
| 查看当前 PR 差异(一次性) | ❌ | ✅ !! `gh pr diff` |
| 查询数据库 Schema(频繁) | ✅ postgres MCP | ❌ |
| 运行自定义安全扫描脚本 | ❌ | ✅ !! `./scripts/security-scan.sh` |
| 发送 Slack 通知(偶尔) | 🤔 看频率 | ✅ !! `curl slack-webhook` |
Sub-agents:上下文隔离和并行执行
本质
独立运行的 Claude 实例,有自己的上下文窗口。主 Claude 委托任务给它,它执行后返回结果摘要。
用 Sub-agent 而不是直接在主会话做的场景
❶ 任务会产生大量"一次性"输出(日志、搜索结果、文件列表)
→ 这些输出用完就没用了,但会占满主会话上下文
→ Sub-agent 在自己的上下文里做,只返回摘要
❷ 需要并行执行多个独立任务
→ 多个 Sub-agent 同时工作
❸ 需要不同的工具访问权限
→ 自定义 Sub-agent 只有只读工具
❹ 需要不同的模型/努力等级
→ 探索任务用 Haiku,主任务用 Opus
Sub-agents 的三种触发方式
①自动委托(Claude 决定):
Claude 根据 Sub-agent 的 description 自动判断是否委托。这需要 description 写得足够精准。
②显式调用(你指定):
> 用 security-reviewer agent 审查最近的变更
> 让 Explore agent 分析 src/api 的整体结构
③Skills 触发(通过 context: fork):
---
name: my-skill
context: fork
agent: Explore
---调用这个 Skill 会自动创建一个 Explore Sub-agent 来执行 Skill 的任务。
Sub-agent vs Skills 的 context: fork
什么时候用命名 Sub-agent 文件(.claude/agents/xxx.md)?
→ 这个配置会被重复使用(安全审查员、调试专家)
→ 需要持久内存(agent 跨会话积累知识)
→ 需要精细的工具控制(只允许只读工具)
什么时候用 Skill 的 context: fork?
→ 这个任务是一次性的,不需要重复调用的配置
→ 主要目的是隔离上下文(防止探索结果污染主会话)
→ 任务相对简单,不需要复杂的 Sub-agent 配置
组合使用模式
模式 1:CLAUDE.md + Skills 分工
CLAUDE.md:
- "测试命令:npm test"
- "代码规范:使用 ES modules"
Skills:
- commit: 完整的提交流程(带 !! git status 注入)
- deploy: 完整的部署流程(disable-model-invocation: true)
- security-review: 安全审查流程(复杂但偶尔用)
模式 2:Plugin + Skill 互补
GitHub MCP Plugin:
- 获取 PR 列表、创建 Issue、检查 CI 状态
Skills(用 !! 命令):
- 获取当前 PR 的具体差异(一次性操作)
- 检查本地 git log(不需要 API)
模式 3:Sub-agent + Skill 组合
主会话 → 调用 Skill(context: fork)→ Explore Sub-agent 执行 → 返回摘要
↓ ↓
Skill 提供任务指令 独立上下文,大量探索,只返回结果
模式 4:完整的自动化工作流
每次 PR 创建时(通过 Routine):
1. 加载 security-check Skill(含 !! gh pr diff 注入)
2. 触发 Explore Sub-agent 分析变更
3. 调用 GitHub MCP Plugin 发布审查评论
4. 如果有 Critical 问题,通过 Slack MCP Plugin 通知
快速决策表
| 你的需求 | 用什么 |
|---|---|
| 项目规则,每次 Claude 都需要知道 | CLAUDE.md |
| 某个操作流程,偶尔用到 | Skills |
| 同样的指令反复粘贴 | 把它做成 Skill |
| 连接外部 API(GitHub、数据库) | Plugin(MCP) |
| 探索代码库,不想污染主会话 | Sub-agent 或 Skill(context: fork) |
| 并行执行多个独立任务 | Sub-agents |
| 特定目录/文件类型的规范 | Skills(paths: 限定) |
| 有副作用的操作(部署、发送消息) | Skill(disable-model-invocation: true) |
| 实时数据(git diff、环境状态) | Skill(!! 命令注入) |
来源:Claude Code 官方文档 - Skills | Sub-agents | Best Practices | 整理:ClaudeEagle