Files
claude-code/docs/extensibility/skills.mdx
claude-code-best 2b1953ce8a docs: 重写 Skills,从源码解剖改为 Prompt 即能力的设计分析
移除 TypeScript 代码、源码路径和 16 个 frontmatter 字段枚举,
聚焦 Prompt 即能力的核心哲学、inline vs fork 的上下文权衡、
Safe Properties 正向安全设计和条件激活的按需发现。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-20 11:00:46 +08:00

124 lines
5.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Skills 技能系统"
description: "Prompt 即能力。Skill 不是代码,而是高质量的 Prompt + 权限配置的声明式封装。理解加载链路、两条执行路径和条件激活机制。"
keywords: ["Skills", "技能加载", "Prompt 即能力", "条件激活"]
---
## 核心洞见Prompt 即能力
Skill 的核心设计哲学:**复杂任务的关键不在代码逻辑,而在 Prompt 质量**。
一个代码审查 Skill 不需要审查引擎,只需告诉 AI "审查什么、按什么顺序、输出什么格式"。Skill 把这种"经验"封装为可复用的 Markdown 文件。
| | Tool | Skill |
|---|---|---|
| 粒度 | 单个原子操作(读文件、执行命令) | 完整工作流(代码审查、创建 PR |
| 本质 | TypeScript 执行逻辑 | Prompt + 权限配置的声明式封装 |
| 创建 | 需要写代码 | 写 Markdown 文件即可 |
## Skill 的来源
| 来源 | 路径 | 特点 |
|------|------|------|
| **内置命令** | 硬编码 | `/commit`、`/compact` 等 70+ 命令 |
| **Bundled Skills** | 编译时打包 | 延迟解压,享有不可截断特权 |
| **磁盘 Skills** | `.claude/skills/` | 最重要的来源,支持多层级 |
| **MCP Skills** | MCP Server 提供 | 远程内容,禁止内联 shell 命令 |
| **Legacy Commands** | `.claude/commands/` | 向后兼容旧格式 |
### 多层级磁盘加载
```
管理策略: $MANAGED_DIR/.claude/skills/ (企业管理)
用户全局: ~/.claude/skills/ (个人偏好)
项目级: .claude/skills/ (团队共享)
附加目录: --add-dir 指定的路径 (额外来源)
```
每个 Skill 是一个 `skill-name/SKILL.md` 目录。加载时解析 YAML frontmatter 提取配置。
### 安全边界
MCP Skills 的 Prompt 内容**禁止执行内联 shell 命令**。因为远程内容不可信——如果允许,恶意 MCP Server 就可以通过 Skill 注入执行任意命令。
## Frontmatter 配置
一个 SKILL.md 的完整配置:
```yaml
---
name: code-review
description: 系统性代码审查
when_to_use: "用户说审查代码、找 bug"
allowed-tools:
- Read
- Grep
- Glob
context: fork # 执行模式inline | fork
model: opus # 模型覆盖
effort: high # 努力级别
paths: # 条件激活
- "src/**/*.ts"
---
```
- `when_to_use` — AI 根据此描述自动匹配用户意图
- `allowed-tools` — 限制 Skill 可用的工具白名单
- `context` — 控制执行模式(见下文)
- `paths` — 条件激活,只在操作匹配文件时出现
## 两条执行路径
### Inline 模式(默认)
Skill 的 Prompt 内容被注入为用户消息在主对话流中继续执行。AI "穿上"了 Skill 的经验,但仍在同一个对话中。
**优点**:共享主对话的完整上下文,可以引用之前的讨论。
**缺点**Skill 的中间过程会污染主对话的上下文。
### Fork 模式(`context: fork`
Skill 在独立子 Agent 中执行,拥有独立的 token 预算和工具权限。执行完成后只返回最终结果,中间过程不保留。
**优点**:不污染主对话,适合长时间运行的任务。
**缺点**:子 Agent 看不到主对话的完整上下文。
**设计考量**:大多数 Skill 使用 inline 模式就够了——它们需要主对话的上下文。Fork 模式适合"重型"任务(如完整的代码审查),这些任务的中间步骤很多,留在主对话中会浪费大量 token。
## 权限模型
Skill 有五层权限检查:
```
Deny 规则 → 远程 Skill 自动放行 → Allow 规则 → Safe Properties 白名单 → Ask 用户确认
```
**Safe Properties 白名单**是一个包含 30 个安全属性名的列表。任何不在白名单中的属性都会触发权限请求。这是**正向安全**设计——未来新增的属性默认需要权限,而非默认允许。
## Prompt 预算
Skill 列表注入 System Prompt 时有严格预算(约上下文窗口的 1%
1. 优先保留 bundled Skills 的完整描述
2. 非 bundled Skills 按剩余预算均分
3. 预算不足时只保留名称
**设计考量**Skill 列表只是让 AI "知道有什么可用"。完整的 Skill Prompt 在 AI 选择后才加载,不需要全部塞进 System Prompt。
## 条件激活
带有 `paths` 模式的 Skill 在加载时不会立即可用。只有当被操作的文件路径匹配模式时,该 Skill 才被激活。
一个只在 `*.test.ts` 上激活的测试 Skill平时完全不可见只有当 AI 读取或编辑测试文件时才会出现。
**设计洞察**:这解决了"Skill 泛滥"问题——项目可能定义了几十个 Skill但一次对话通常只需要其中几个。条件激活让 Skill 按需出现,而不是全部堆在 AI 面前让它选择。
## 使用频率排名
Skill 的排序使用指数衰减算法:一周前的使用权重减半。这确保常用的 Skill 排在前面,但偶尔用的老 Skill 也不会完全沉底。
## 接下来
- **Hooks** — 理解 Skill 中可以使用的 Hook 机制
- **MCP 配置** — 理解 MCP Skills 的来源
- **自定义 Agent** — 理解 Skill 中指定的 Agent 定义