---
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 定义
