Claude Skills
AI 与机器学习

Claude Agent Skills:第一性原理深度解析

从第一性原理深入分析 Claude 的 Agent Skills 系统,探讨元工具架构、基于提示词的上下文注入机制,以及完整的执行生命周期,并结合真实案例研究进行剖析。

📚 Source Information

Original article:Hanchung Lee's Blog
Author:Hanchung Lee
Published:10/26/2025
🌐 Available in:English简体中文Français

ℹ️ This article was automatically imported and translated using Claude AI. Imported on 11/24/2025.

Claude Agent Skills:第一性原理深度解析

Claude 的 Agent Skills 系统代表了一种复杂的基于提示词的元工具架构,通过专门的指令注入来扩展 LLM 的能力。与传统的函数调用或代码执行不同,skills 通过 提示词扩展上下文修改 来改变 Claude 处理后续请求的方式,而无需编写可执行代码。

本深度解析从第一性原理出发剖析 Claude 的 Agent Skills 系统,记录了这个架构——其中一个名为"Skill"的工具作为元工具,用于将特定领域的提示词注入到对话上下文中。我们将通过 skill-creatorinternal-comms skill 作为案例研究,走完完整的生命周期,从文件解析到 API 请求结构,再到 Claude 的决策过程。

Claude Agent Skills 概述

Claude 使用 Skills 来改进其执行特定任务的方式。Skills 被定义为包含指令、脚本和资源的文件夹,Claude 可以在需要时加载。Claude 使用 声明式、基于提示词的系统 来进行 skill 发现和调用。AI 模型(Claude)根据其系统提示词中呈现的文本描述来决定调用 skills在代码层面没有算法化的 skill 选择或 AI 驱动的意图检测。 决策完全发生在 Claude 的推理过程中,基于提供的 skill 描述。

Skills 不是可执行代码。它们 不会 运行 Python 或 JavaScript,背后也没有 HTTP 服务器或函数调用。它们也不是硬编码到 Claude 的系统提示词中。Skills 存在于 API 请求结构的独立部分。

那么它们是什么?Skills 是专门的提示词模板,将特定领域的指令注入到对话上下文中。当一个 skill 被调用时,它会修改对话上下文(通过注入指令提示词)和执行上下文(通过更改工具权限并可能切换模型)。skill 不是直接执行操作,而是扩展为详细的提示词,为 Claude 解决特定类型的问题做准备。每个 skill 都作为 Claude 看到的工具模式的动态添加出现。

当用户发送请求时,Claude 会收到三样东西:用户消息、可用工具(Read、Write、Bash 等)以及 Skill 工具。Skill 工具的描述包含每个可用 skill 的格式化列表,其中包含它们的 namedescription 和其他字段的组合。Claude 阅读这个列表,并使用其原生语言理解能力将您的意图与 skill 描述进行匹配。如果您说"帮我创建一个日志 skill",Claude 会看到 internal-comms skill 的描述("当用户想要使用其公司喜欢使用的格式编写内部沟通时"),识别匹配,并使用 command: "internal-comms" 调用 Skill 工具。

术语说明:

  • Skill 工具(大写 S)= 管理所有 skills 的元工具。它与 Read、Write、Bash 等一起出现在 Claude 的 tools 数组中。
  • skills(小写 s)= 单个 skills,如 pdfskill-creatorinternal-comms。这些是 Skill 工具加载的专门指令模板。

这是一个关于 Claude 如何使用 skills 的更直观的表示。

Claude Skill Flowchart

skill 选择机制在代码层面没有算法路由或意图分类。Claude Code 不使用嵌入、分类器或模式匹配来决定调用哪个 skill。相反,系统将所有可用的 skills 格式化为嵌入在 Skill 工具提示词中的文本描述,并让 Claude 的语言模型做出决定。这是纯粹的 LLM 推理。没有正则表达式,没有关键字匹配,没有基于 ML 的意图检测。决策发生在 Claude 通过 transformer 的前向传递中,而不是在应用程序代码中。

当 Claude 调用一个 skill 时,系统遵循一个简单的工作流:加载一个 markdown 文件(SKILL.md),将其扩展为详细指令,将这些指令作为新的用户消息注入到对话上下文中,修改执行上下文(允许的工具、模型选择),并在这个丰富的环境中继续对话。这与传统工具根本不同,传统工具执行并返回结果。Skills 为 Claude 做准备 来解决问题,而不是直接解决问题。

下表有助于更好地区分工具和 Skills 及其能力之间的差异:

方面传统工具Skills
执行模型同步、直接提示词扩展
目的执行特定操作指导复杂工作流
返回值即时结果对话上下文 + 执行上下文变更
示例ReadWriteBashinternal-commsskill-creator
并发性通常安全非并发安全
类型各种始终为 "prompt"

构建 Agent Skills

现在让我们通过检查 Anthropic skill 仓库中的 skill-creator Skill 作为案例研究,深入了解如何构建 Skills。作为提醒,agent skills 是由指令、脚本和资源组成的有组织的文件夹,agents 可以动态发现和加载以更好地执行特定任务。Skills 通过将您的专业知识打包成 Claude 的可组合资源来扩展 Claude 的能力,将通用 agents 转变为符合您需求的专门 agents。

关键见解: Skill = 提示词模板 + 对话上下文注入 + 执行上下文修改 + 可选的数据文件和 Python 脚本

每个 Skill 都定义在一个名为 SKILL.md(不区分大小写)的 markdown 文件中,并带有可选的捆绑文件,这些文件存储在 /scripts/references/assets 下。这些捆绑文件可以是 Python 脚本、shell 脚本、字体定义、模板等。以 skill-creator 为例,它包含 SKILL.md、用于许可证的 LICENSE.txt 以及 /scripts 文件夹下的一些 Python 脚本。skill-creator 没有任何 /references/assets

skill-creator package

Skills 从多个来源发现和加载。Claude Code 扫描用户设置(~/.config/claude/skills/)、项目设置(.claude/skills/)、插件提供的 skills 和内置 skills 来构建可用 skills 列表。对于 Claude Desktop,我们可以按如下方式上传自定义 skill。

Claude Desktop Skill

注意: 构建 Skills 最重要的概念是 渐进式披露 —— 只显示足够的信息来帮助 agents 决定下一步做什么,然后在他们需要时揭示更多细节。对于 agent skills,它

  1. 披露 Frontmatter:最小化(名称、描述、许可证)
  2. 如果选择了 skill,加载 SKILL.md:全面但专注
  3. 然后在 skill 执行时加载辅助资源、参考和脚本

编写 SKILL.md

SKILL.md 是 skill 提示词的核心。它是一个遵循两部分结构的 markdown 文件——frontmatter 和内容。frontmatter 配置 skill 如何运行(权限、模型、元数据),而 markdown 内容告诉 Claude 做什么。Frontmatter 是用 YAML 编写的 markdown 文件头部。

┌─────────────────────────────────────┐
│ 1. YAML Frontmatter (Metadata)      │ ← 配置
│    ---                              │
│    name: skill-name                 │
│    description: Brief overview      │
│    allowed-tools: "Bash, Read"      │
│    version: 1.0.0                   │
│    ---                              │
├─────────────────────────────────────┤
│ 2. Markdown Content (Instructions)  │ ← Claude 的提示词
│                                     │
│    Purpose explanation              │
│    Detailed instructions            │
│    Examples and guidelines          │
│    Step-by-step procedures          │
└─────────────────────────────────────┘

Frontmatter

frontmatter 包含控制 Claude 如何发现和使用 skill 的元数据。例如,这是来自 skill-creator 的 frontmatter:

---
name: skill-creator
description: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
license: Complete terms in LICENSE.txt
---

让我们逐一了解 frontmatter 的字段。

Claude Skills Frontmatter

name(必需)

不言自明。skill 的名称。skillnameSkill Tool 中用作 command

skillnameSkill Tool 中用作 command

description(必需)

description 字段提供 skill 功能的简要摘要。这是 Claude 用来确定何时调用 skill 的主要信号。在上面的示例中,描述明确说明"当用户想要创建新 skill 时应使用此 skill"——这种清晰、面向行动的语言有助于 Claude 将用户意图与 skill 能力匹配。

系统会自动将来源信息附加到描述中(例如,"(plugin:skills)"),这有助于在加载多个 skills 时区分来自不同来源的 skills。

when_to_use(未记录——可能已弃用或未来功能)

⚠️ 重要说明: when_to_use 字段在代码库中广泛出现,但 未在任何官方 Anthropic 文档中记录。此字段可能是:

  • 正在逐步淘汰的已弃用功能
  • 尚未正式支持的内部/实验性功能
  • 尚未发布的计划功能

建议: 依赖详细的 description 字段。在该功能出现在官方文档中之前,避免在生产 skills 中使用 when_to_use

尽管未记录,但以下是 when_to_use 目前在代码库中的工作方式:

function formatSkill(skill) {
  let description = skill.whenToUse
    ? `${skill.description} - ${skill.whenToUse}`
    : skill.description;

  return `"${skill.name}": ${description}`;
}

当存在时,when_to_use 会用连字符分隔符附加到描述中。例如:

"skill-creator": Create well-structured, reusable skills... - When user wants to build a custom skill package with scripts, references, or assets

这个组合字符串是 Claude 在 Skill 工具提示词中看到的内容。但是,由于此行为未记录,它可能在未来版本中更改或删除。更安全的方法是直接在 description 字段中包含使用指南,如上面的 skill-creator 示例所示。

license(可选)

不言自明。

allowed-tools(可选)

allowed-tools 字段定义 skill 可以在没有用户批准的情况下使用哪些工具,类似于 Claude 的 allowed-tools。

这是一个逗号分隔的字符串,会被解析为允许的工具名称数组。您可以使用通配符来限定权限范围,例如,Bash(git:*) 只允许 git 子命令,而 Bash(npm:*) 允许所有 npm 操作。skill-creator skill 使用 "Read,Write,Bash,Glob,Grep,Edit" 来赋予它广泛的文件和搜索能力。一个常见的错误是列出每个可用工具,这会造成安全风险并破坏安全模型。

只包含您的 skill 实际需要的内容——如果您只是读写文件,"Read,Write" 就足够了。

# ✅ skill-creator 允许多个工具
allowed-tools: "Read,Write,Bash,Glob,Grep,Edit"

# ✅ 仅特定 git 命令
allowed-tools: "Bash(git status:*),Bash(git diff:*),Bash(git log:*),Read,Grep"

# ✅ 仅文件操作
allowed-tools: "Read,Write,Edit,Glob,Grep"

# ❌ 不必要的表面积
allowed-tools: "Bash,Read,Write,Edit,Glob,Grep,WebSearch,Task,Agent"

# ❌ 具有所有 npm 命令的不必要表面积
allowed-tools: "Bash(npm:*),Read,Write"

model(可选)

model 字段定义 skill 可以使用哪个模型。它默认继承用户会话中的当前模型。对于代码审查等复杂任务,skills 可以请求更强大的模型,例如 Claude Opus 或其他 OSS 中文模型。如果你知道就知道。

model: "claude-opus-4-20250514"  # 使用特定模型
model: "inherit"                 # 使用会话的当前模型(默认)

versiondisable-model-invocationmode(可选)

Skills 支持三个可选的 frontmatter 字段用于版本控制和调用控制。version 字段(例如,version: "1.0.0")是用于跟踪 skill 版本的元数据字段,从 frontmatter 解析,但主要用于文档和 skill 管理目的。

disable-model-invocation 字段(布尔值)阻止 Claude 通过 Skill 工具自动调用 skill。当设置为 true 时,skill 将从显示给 Claude 的列表中排除,只能由用户通过 /skill-name 手动调用,这使其非常适合危险操作、配置命令或需要明确用户控制的交互式工作流。

mode 字段(布尔值)将 skill 分类为修改 Claude 行为或上下文的"模式命令"。当设置为 true 时,skill 会出现在 skills 列表顶部的特殊"模式命令"部分(与常规实用 skills 分开),使其对于 debug-mode、expert-mode 或 review-mode 等建立特定操作上下文或工作流的 skills 非常突出。

SKILL.md 提示词内容

在 frontmatter 之后是 markdown 内容——Claude 在调用 skill 时收到的实际提示词。这是您定义 skill 的行为、指令和工作流的地方。编写有效 skill 提示词的关键是保持专注并使用渐进式披露:在 SKILL.md 中提供核心指令,并引用外部文件以获取详细内容。

这是推荐的内容结构

---
# Frontmatter 在此处
---

# [简短目的陈述 - 1-2 句]

## 概述
[此 skill 的功能、何时使用、提供什么]

## 先决条件
[所需工具、文件或上下文]

## 指令

### 步骤 1:[第一个操作]
[命令式指令]
[如需要,提供示例]

### 步骤 2:[下一个操作]
[命令式指令]

### 步骤 3:[最后操作]
[命令式指令]

## 输出格式
[如何构建结果]

## 错误处理
[失败时该做什么]

## 示例
[具体使用示例]

## 资源
[如果捆绑,引用 scripts/、references/、assets/]

例如,skill-creator skill 包含以下指令,指定创建 skills 所需工作流的每个步骤。

## Skill 创建过程

### 步骤 1:通过具体示例理解 Skill
### 步骤 2:规划可重用的 Skill 内容
### 步骤 3:初始化 Skill
### 步骤 4:编辑 Skill
### 步骤 5:打包 Skill

当 Claude 调用此 skill 时,它会收到整个提示词作为新指令,并在前面添加基本目录路径。{baseDir} 变量解析为 skill 的安装目录,允许 Claude 使用 Read 工具加载参考文件:Read({baseDir}/scripts/init_skill.py)。这种模式使主提示词保持简洁,同时使详细文档可按需获取。

提示词内容的最佳实践:

  • 保持在 5,000 字以下(约 800 行),以避免压倒性的上下文
  • 使用命令式语言("分析代码以...")而不是第二人称("您应该分析...")
  • 引用外部文件以获取详细内容,而不是嵌入所有内容
  • 使用 {baseDir} 作为路径,永远不要硬编码绝对路径,如 /home/user/project/
❌ Read /home/user/project/config.json
✅ Read {baseDir}/config.json

当调用 skill 时,Claude 只能访问 allowed-tools 中指定的工具,如果在 frontmatter 中指定,模型可能会被覆盖。skill 的基本目录路径会自动提供,使捆绑资源可访问。

与您的 Skill 捆绑资源

当您将支持资源与 SKILL.md 捆绑在一起时,Skills 变得强大。标准结构使用三个目录,每个目录都有特定用途:

my-skill/
├── SKILL.md              # 核心提示词和指令
├── scripts/              # 可执行的 Python/Bash 脚本
├── references/           # 加载到上下文中的文档
└── assets/               # 模板和二进制文件

为什么捆绑资源? 保持 SKILL.md 简洁(5,000 字以下)可防止压倒 Claude 的上下文窗口。捆绑资源让您可以提供详细的文档、自动化脚本和模板,而不会使主提示词膨胀。Claude 仅在使用渐进式披露时需要时加载它们。

scripts/ 目录

scripts/ 目录包含 Claude 通过 Bash 工具运行的可执行代码——自动化脚本、数据处理器、验证器或执行确定性操作的代码生成器。

例如,skill-creator 的 SKILL.md 这样引用脚本:

从头开始创建新 skill 时,始终运行 `init_skill.py` 脚本。该脚本可以方便地生成一个新的模板 skill 目录,自动包含 skill 所需的所有内容,使 skill 创建过程更加高效可靠。

用法:

```scripts/init_skill.py <skill-name> --path <output-directory>```

脚本:
  - 在指定路径创建 skill 目录
  - 生成带有适当 frontmatter 和 TODO 占位符的 SKILL.md 模板
  - 创建示例资源目录:scripts/、references/ 和 assets/
  - 在每个目录中添加可自定义或删除的示例文件

当 Claude 看到此指令时,它会执行 python {baseDir}/scripts/init_skill.py{baseDir} 变量会自动解析为 skill 的安装路径,使 skill 可在不同环境中移植。

使用 scripts/ 用于 复杂的多步骤操作、数据转换、API 交互,或任何需要精确逻辑的任务,这些逻辑用代码表达比用自然语言更好。

references/ 目录

references/ 目录存储 Claude 在引用时读入其上下文的文档。这是文本内容——markdown 文件、JSON schemas、配置模板或 Claude 完成任务所需的任何文档。

例如,mcp-creator 的 SKILL.md 这样引用参考:

#### 1.4 学习框架文档

**加载并阅读以下参考文件:**

- **MCP 最佳实践:** [📋 查看最佳实践](./reference/mcp_best_practices.md) - 所有 MCP 服务器的核心指南

**对于 Python 实现,还要加载:**
- **Python SDK 文档:** 使用 WebFetch 加载 `https://raw.githubusercontent.com/modelcontextprotocol/python-sdk/main/README.md`
- [🐍 Python 实现指南](./reference/python_mcp_server.md) - Python 特定的最佳实践和示例

**对于 Node/TypeScript 实现,还要加载:**
- **TypeScript SDK 文档:** 使用 WebFetch 加载 `https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/main/README.md`
- [⚡ TypeScript 实现指南](./reference/node_mcp_server.md) - Node/TypeScript 特定的最佳实践和示例

当 Claude 遇到这些指令时,它使用 Read 工具:Read({baseDir}/references/mcp_best_practices.md)。内容被加载到 Claude 的上下文中,提供详细信息而不会使 SKILL.md 变得混乱。

使用 references/ 用于 详细文档、大型模式库、检查清单、API schemas,或任何对于 SKILL.md 来说太冗长但对任务必要的文本内容。

assets/ 目录

assets/ 目录包含 Claude 按路径引用但不加载到上下文中的模板和二进制文件。将其视为 skill 的静态资源——HTML 模板、CSS 文件、图像、配置样板或字体。

在 SKILL.md 中:

使用 {baseDir}/assets/report-template.html 的模板作为报告结构。
引用 {baseDir}/assets/diagram.png 的架构图。

Claude 看到文件路径但不读取内容。相反,它可能会将模板复制到新位置、填充占位符或在生成的输出中引用路径。

使用 assets/ 用于 HTML/CSS 模板、图像、二进制文件、配置模板,或 Claude 通过路径操作而不是读入上下文的任何文件。

references/assets/ 之间的关键区别是

  • references/: 通过 Read 工具加载到 Claude 上下文中的文本内容
  • assets/: 仅按路径引用的文件,不加载到上下文中

这种区别对于上下文管理很重要。references/ 中的 10KB markdown 文件在加载时会消耗上下文 tokens。assets/ 中的 10KB HTML 模板不会。Claude 只知道路径存在。

最佳实践: 始终使用 {baseDir} 作为路径,永远不要硬编码绝对路径。这使 skills 可在用户环境、项目目录和不同安装之间移植。

常见 Skill 模式

与所有工程一样,理解常见模式有助于设计有效的 skills。以下是工具集成和工作流设计最有用的模式。

模式 1:脚本自动化

用例: 需要多个命令或确定性逻辑的复杂操作。

此模式将计算任务卸载到 scripts/ 目录中的 Python 或 Bash 脚本。skill 提示词告诉 Claude 执行脚本并处理其输出。

Claude Skill Script Automation

SKILL.md 示例:

在目标目录上运行 scripts/analyzer.py:

`python {baseDir}/scripts/analyzer.py --path "$USER_PATH" --output report.json`

解析生成的 `report.json` 并呈现发现。

所需工具:

allowed-tools: "Bash(python {baseDir}/scripts/*:*), Read, Write"

模式 2:读取 - 处理 - 写入

用例: 文件转换和数据处理。

最简单的模式——读取输入,按照指令转换,写入输出。用于格式转换、数据清理或报告生成。

Claude Skill Read Process Write

SKILL.md 示例:

## 处理工作流
1. 使用 Read 工具读取输入文件
2. 根据格式解析内容
3. 按照规范转换数据
4. 使用 Write 工具写入输出
5. 报告完成并提供摘要

所需工具:

allowed-tools: "Read, Write"

模式 3:搜索 - 分析 - 报告

用例: 代码库分析和模式检测。

使用 Grep 搜索代码库中的模式,读取匹配文件以获取上下文,分析发现,并生成结构化报告。或者,搜索企业数据存储以获取数据,分析检索到的数据以获取信息,并生成结构化报告。

Claude Skill Search Analyze Report

SKILL.md 示例:

## 分析过程
1. 使用 Grep 查找相关代码模式
2. 读取每个匹配的文件
3. 分析漏洞
4. 生成结构化报告

所需工具:

allowed-tools: "Grep, Read"

模式 4:命令链执行

用例: 具有依赖关系的多步骤操作。

执行一系列命令,其中每个步骤都依赖于前一个步骤的成功。常见于类似 CI/CD 的工作流。

Claude Skill Command Chain Execution

SKILL.md 示例:

执行分析管道:
npm install && npm run lint && npm test

报告每个阶段的结果。

所需工具:

allowed-tools: "Bash(npm install:*), Bash(npm run:*), Read"

高级模式

向导式多步骤工作流

用例: 需要在每个步骤进行用户输入的复杂流程。

将复杂任务分解为离散步骤,在每个阶段之间明确用户确认。用于设置向导、配置工具或引导流程。

SKILL.md 示例:

## 工作流

### 步骤 1:初始设置
1. 询问用户项目类型
2. 验证先决条件是否存在
3. 创建基本配置
在继续之前等待用户确认。

### 步骤 2:配置
1. 呈现配置选项
2. 要求用户选择设置
3. 生成配置文件
在继续之前等待用户确认。

### 步骤 3:初始化
1. 运行初始化脚本
2. 验证设置成功
3. 报告结果

基于模板的生成

用例:assets/ 中存储的模板创建结构化输出。

加载模板,用用户提供或生成的数据填充占位符,并写入结果。常见于报告生成、样板代码创建或文档。

SKILL.md 示例:

## 生成过程
1. 从 {baseDir}/assets/template.html 读取模板
2. 解析用户需求
3. 填充模板占位符:
   -  → 用户提供的名称
   -  → 生成的摘要
   -  → 当前日期
4. 将填充的模板写入输出文件
5. 报告完成

迭代细化

用例: 需要多次传递并逐渐加深深度的流程。

首先进行广泛分析,然后对已识别的问题进行逐步更深入的探讨。用于代码审查、安全审计或质量分析。

SKILL.md 示例:

## 迭代分析

### 第 1 遍:广泛扫描
1. 搜索整个代码库以查找模式
2. 识别高级问题
3. 对发现进行分类

### 第 2 遍:深度分析
对于每个高级问题:
1. 读取完整的文件上下文
2. 分析根本原因
3. 确定严重性

### 第 3 遍:建议
对于每个发现:
1. 研究最佳实践
2. 生成特定修复
3. 估计工作量

呈现包含所有发现和建议的最终报告。

上下文聚合

用例: 从多个来源组合信息以建立全面理解。

从不同文件和工具收集数据,综合成一个连贯的图景。用于项目摘要、依赖关系分析或影响评估。

SKILL.md 示例:

## 上下文收集
1. 读取项目 README.md 以获取概述
2. 分析 package.json 以获取依赖关系
3. Grep 代码库以查找特定模式
4. 检查 git 历史记录以获取最近的更改
5. 将发现综合成连贯的摘要

Agent Skills 内部架构

在涵盖了概述和构建过程之后,我们现在可以检查 skills 实际上是如何在幕后工作的。skills 系统通过元工具架构运行,其中名为 Skill 的工具充当所有单个 skills 的容器和调度程序。这种设计从根本上将 skills 与传统工具在实现和目的上区分开来。

Skill 工具是管理所有 skills 的元工具

Skills 对象设计

传统工具如 ReadBashWrite 执行离散操作并返回即时结果。Skills 的操作方式不同。它们不是直接执行操作,而是将专门的指令注入到对话历史中,并动态修改 Claude 的执行环境。这通过两条用户消息发生——一条包含用户可见的元数据,另一条包含从 UI 隐藏但发送给 Claude 的完整 skill 提示词——并通过更改 agent 的上下文来更改权限、切换模型和调整 skill 使用期间的思考 token 参数。

Claude Skill Execution Flow

特性普通工具Skill 工具
本质直接操作执行器提示词注入 + 上下文修改器
消息角色assistant → tool_use user → tool_resultassistant → tool_use Skill user → tool_result user → skill prompt ← 注入!
复杂性简单(3-4 条消息)复杂(5-10+ 条消息)
上下文静态动态(每轮修改)
持久性仅工具交互工具交互 + skill 提示词
Token 开销最小(约 100 tokens)显著(每轮约 1,500+ tokens)
用例简单、直接的任务复杂、引导的工作流

复杂性是巨大的。普通工具生成简单的消息交换——assistant 工具调用后跟 user 结果。Skills 注入多条消息,在动态修改的上下文中运行,并承担显著的 token 开销,以提供指导 Claude 行为的专门指令。

理解 Skill 元工具的工作原理揭示了该系统的机制。让我们检查其结构:

Pd = {
  name: "Skill",  // 工具名称常量:$N = "Skill"

  inputSchema: {
    command: string  // 例如,"pdf"、"skill-creator"
  },

  outputSchema: {
    success: boolean,
    commandName: string
  },

  // 🔑 关键字段:这生成 skills 列表
  prompt: async () => fN2(),

  // 验证和执行
  validateInput: async (input, context) => { /* 5 个错误代码 */ },
  checkPermissions: async (input, context) => { /* allow/deny/ask */ },
  call: async *(input, context) => { /* yields messages + context modifier */ }
}

prompt 字段将 Skill 工具与其他工具(如 ReadBash)区分开来,后者具有静态描述。Skill 工具使用动态提示词生成器,而不是固定字符串,该生成器在运行时通过聚合所有可用 skills 的名称和描述来构建其描述。这实现了 渐进式披露 —— 系统仅将最小元数据(来自 frontmatter 的 skill 名称和描述)加载到 Claude 的初始上下文中,提供足够的信息让模型决定哪个 skill 匹配用户的意图。完整的 skill 提示词仅在 Claude 做出选择后才加载,防止上下文膨胀,同时保持可发现性。

async function fN2() {
  let A = await atA(),
    {
      modeCommands: B,
      limitedRegularCommands: Q
    } = vN2(A),
    G = [...B, ...Q].map((W) => W.userFacingName()).join(", ");
  l(`Skills and commands included in Skill tool: ${G}`);
  let Z = A.length - B.length,
    Y = nS6(B),
    J = aS6(Q, Z);
  return `Execute a skill within the main conversation

<skills_instructions>
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.

How to use skills:
- Invoke skills using this tool with the skill name only (no arguments)
- When you invoke a skill, you will see <command-message>The "{name}" skill is loading</command-message>
- The skill's prompt will expand and provide detailed instructions on how to complete the task
- Examples:
  - \`command: "pdf"\` - invoke the pdf skill
  - \`command: "xlsx"\` - invoke the xlsx skill
  - \`command: "ms-office-suite:pdf"\` - invoke using fully qualified name

Important:
- Only use skills listed in <available_skills> below
- Do not invoke a skill that is already running
- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
</skills_instructions>

<available_skills>
${Y}${J}
</available_skills>
`;
}

与某些工具存在于某些 assistants(如 ChatGPT)的系统提示词中的方式不同,Claude agent skills 不存在于系统提示词中。它们作为 Skill 工具描述的一部分存在于 tools 数组中。单个 skills 的名称表示为 Skill 元工具的输入 schema 的 command 字段的一部分。为了更好地可视化它的外观,这是实际的 API 请求结构:

{
  "model": "claude-sonnet-4-5-20250929",
  "system": "You are Claude Code, Anthropic's official CLI...",  // ← 系统提示词
  "messages": [
    {"role": "user", "content": "Help me create a new skill"},
    // ... 对话历史
  ],
  "tools": [  // ← 发送给 Claude 的工具数组
    {
      "name": "Skill",  // ← 元工具
      "description": "Execute a skill...\n\n<skills_instructions>...\n\n<available_skills>\n...",
      "input_schema": {
        "type": "object",
        "properties": {
          "command": {
            "type": "string",
            "description": "The skill name (no arguments)"  // ← 单个 skill 的名称
          }
        }
      }
    },
    {
      "name": "Bash",
      "description": "Execute bash commands...",
      // ...
    },
    {
      "name": "Read",
      // ...
    }
    // ... 其他工具
  ]
}

<available_skills> 部分存在于 Skill 工具的描述中,并为每个 API 请求重新生成。系统通过聚合来自用户和项目配置、插件提供的 skills 以及任何内置 skills 的当前加载的 skills 来动态构建此列表,默认情况下受 15,000 个字符的 token 预算限制。此预算约束迫使 skill 作者编写简洁的描述,并确保工具描述不会压倒模型的上下文窗口。

Skill 对话和执行上下文注入设计

大多数 LLM API 支持可以理论上携带系统提示词的 role: "system" 消息。事实上,OpenAI 的 ChatGPT 在其系统提示词中携带其默认工具,包括用于记忆的 bio、用于任务调度的 automations、用于控制画布的 canmore、用于图像生成的 img_genfile_searchpython 和用于互联网搜索的 web。最后,工具提示词占用其系统提示词中约 90% 的 token 计数。这可能有用,但如果我们有很多工具和/或 skills 要加载到上下文中,效率就不高。

但是,系统消息具有不同的语义,使其不适合 skills。系统消息设置在整个对话中持续存在的全局上下文,以高于用户指令的权限影响所有后续轮次。

Skills 需要临时、作用域行为。skill-creator skill 应该只影响与 skill 创建相关的任务,而不是将 Claude 转变为会话其余部分的永久 PDF 专家。使用带有 isMeta: truerole: "user" 使 skill 提示词看起来像 Claude 的用户输入,使其保持临时性并局限于当前交互。skill 完成后,对话将返回正常对话上下文和执行上下文,而没有残留的行为修改。

普通工具如 ReadWriteBash 具有简单的通信模式。当 Claude 调用 Read 时,它发送文件路径,接收文件内容,并继续工作。用户在其记录中看到"Claude 使用了 Read 工具",这足够透明。工具做了一件事,返回了结果,这就是交互的结束。Skills 的操作方式根本不同。它们不是执行离散操作并返回结果,而是注入全面的指令集,这些指令集修改 Claude 如何推理和处理任务。这创建了一个普通工具从未面临的设计挑战:用户需要了解正在运行哪些 skills 以及它们在做什么的透明度,而 Claude 需要详细的、可能冗长的指令来正确执行 skill。如果用户在其聊天记录中看到完整的 skill 提示词,UI 将被数千字的内部 AI 指令弄得混乱。如果 skill 激活完全隐藏,用户将失去对系统代表他们执行的操作的可见性。解决方案需要将这两个通信通道分离成具有不同可见性规则的不同消息。

skills 系统在每条消息上使用 isMeta 标志来控制它是否出现在用户界面中。当 isMeta: false(或当省略标志并默认为 false 时),消息在用户看到的对话记录中呈现。当 isMeta: true 时,消息作为 Claude 对话上下文的一部分发送到 Anthropic API,但从不出现在 UI 中。这个简单的布尔标志实现了复杂的双通道通信:一个流用于人类用户,另一个用于 AI 模型。元工具的元提示词!

当 skill 执行时,系统将两条单独的用户消息注入到对话历史中。第一条携带带有 isMeta: false 的 skill 元数据,使其作为状态指示器对用户可见。第二条携带带有 isMeta: true 的完整 skill 提示词,将其从 UI 隐藏,同时使其可供 Claude 使用。这种拆分通过向用户展示正在发生的事情而不会用实现细节压倒他们来解决透明度与清晰度的权衡。

元数据消息使用简洁的 XML 结构,前端可以解析并适当显示:

let metadata = [
  `<command-message>${statusMessage}</command-message>`,
  `<command-name>${skillName}</command-name>`,
  args ? `<command-args>${args}</command-args>` : null
].filter(Boolean).join('\n');

// 消息 1:无 isMeta 标志 → 默认为 false → 可见
messages.push({
  content: metadata,
  autocheckpoint: checkpointFlag
});

例如,当 PDF skill 激活时,用户在其记录中看到一个清晰的加载指示器:

<command-message>The "pdf" skill is loading</command-message>
<command-name>pdf</command-name>
<command-args>report.pdf</command-args>

此消息保持有意最小——通常为 50 到 200 个字符。XML 标签使前端能够使用特殊格式呈现它,验证是否存在适当的 <command-message> 标签,并维护会话期间执行了哪些 skills 的审计跟踪。因为 isMeta 标志在省略时默认为 false,所以此元数据会自动出现在 UI 中。

skill 提示词消息采用相反的方法。它从 SKILL.md 加载完整内容,可能会使用其他上下文对其进行扩充,并明确设置 isMeta: true 以将其从用户隐藏:

let skillPrompt = await skill.getPromptForCommand(args, context);

// 如果需要,使用前置/附加内容进行扩充
let fullPrompt = prependContent.length > 0 || appendContent.length > 0
  ? [...prependContent, ...appendContent, ...skillPrompt]
  : skillPrompt;

// 消息 2:明确的 isMeta: true → 隐藏
messages.push({
  content: fullPrompt,
  isMeta: true  // 从 UI 隐藏,发送到 API
});

典型的 skill 提示词运行 500 到 5,000 字,并提供全面的指导来转换 Claude 的行为。PDF skill 提示词可能包含:

您是 PDF 处理专家。

您的任务是使用 pdftotext 工具从 PDF 文档中提取文本。

## 过程

1. 验证 PDF 文件是否存在
2. 运行 pdftotext 命令提取文本
3. 读取输出文件
4. 向用户呈现提取的文本

## 可用工具

您可以访问:
- Bash(pdftotext:*) - 用于运行 pdftotext 命令
- Read - 用于读取提取的文本
- Write - 如果需要,用于保存结果

## 输出格式

清晰格式化地呈现提取的文本。

基本目录:/path/to/skill
用户参数:report.pdf

此提示词建立任务上下文,概述工作流,指定可用工具,定义输出格式,并提供特定于环境的路径。带有标题、列表和代码块的 markdown 结构有助于 Claude 解析和遵循指令。通过 isMeta: true,整个提示词被发送到 API,但从不会使用户的记录变得混乱。

除了核心元数据和 skill 提示词之外,skills 还可以注入附加的条件消息以用于附件和权限:

let allMessages = [
  createMessage({ content: metadata, autocheckpoint: flag }),  // 1. 元数据
  createMessage({ content: skillPrompt, isMeta: true }),       // 2. Skill 提示词
  ...attachmentMessages,                                       // 3. 附件(条件)
  ...(allowedTools.length || skill.model ? [
    createPermissionsMessage({                                 // 4. 权限(条件)
      type: "command_permissions",
      allowedTools: allowedTools,
      model: skill.useSmallFastModel ? getFastModel() : skill.model
    })
  ] : [])
];

附件消息可以携带诊断信息、文件引用或补充 skill 提示词的其他上下文。权限消息仅在 skill 在其 frontmatter 中指定 allowed-tools 或请求模型覆盖时出现,提供修改运行时执行环境的元数据。这种模块化组合允许每条消息具有特定目的,并根据 skill 的配置包含或排除,将基本的两消息模式扩展到处理更复杂的场景,同时通过 isMeta 标志保持相同的可见性控制。

为什么是两条消息而不是一条?

单消息设计将迫使做出不可能的选择。设置 isMeta: false 将使整个消息可见,将数千字的 AI 指令倾倒到用户的聊天记录中。用户会看到类似这样的东西:

┌─────────────────────────────────────────────┐
│ The "pdf" skill is loading                  │
│                                             │
│ You are a PDF processing specialist.        │
│                                             │
│ Your task is to extract text from PDF       │
│ documents using the pdftotext tool.         │
│                                             │
│ ## Process                                  │
│                                             │
│ 1. Validate the PDF file exists             │
│ 2. Run pdftotext command to extract text    │
│ 3. Read the output file                     │
│ ... [500 more lines] ...                    │
└─────────────────────────────────────────────┘

UI 变得不可用,充满了为 Claude 而不是人类设计的内部实现细节。或者,设置 isMeta: true 会隐藏所有内容,不提供关于激活了哪个 skill 或它接收了什么参数的透明度。用户将无法看到系统代表他们执行的操作。

两消息拆分通过给每条消息不同的 isMeta 值来解决这个问题。带有 isMeta: false 的消息 1 提供面向用户的透明度。带有 isMeta: true 的消息 2 为 Claude 提供详细指令。这种精细控制实现了透明度而不会造成信息过载。

消息还为根本不同的受众和目的服务:

方面元数据消息Skill 提示词消息
受众人类用户Claude(AI)
目的状态/透明度指令/指导
长度约 50-200 个字符约 500-5,000 字
格式结构化 XML自然语言 markdown
可见性应该可见应该隐藏
内容"正在发生什么?""如何做?"

代码库甚至通过不同的路径处理这些消息。元数据消息被解析为 <command-message> 标签,验证并格式化以用于 UI 显示。skill 提示词消息直接发送到 API,无需解析或验证——它是仅用于 Claude 推理过程的原始指令内容。将它们组合在一起将违反单一责任原则,迫使一条消息通过两个不同的处理管道为两个不同的受众服务。

案例研究:执行生命周期

现在涵盖了 Agent Skills 内部架构,让我们通过使用假设的 pdf skill 作为案例研究,检查完整的执行流程,走完用户说"从 report.pdf 中提取文本"时发生的事情。

Claude Skill Execution Flow

第 1 阶段:发现和加载(启动)

当 Claude Code 启动时,它会扫描 skills:

async function getAllCommands() {
  // 并行从所有来源加载
  let [userCommands, skillsAndPlugins, pluginCommands, builtins] =
    await Promise.all([
      loadUserCommands(),      // ~/.claude/commands/
      loadSkills(),            // .claude/skills/ + plugins
      loadPluginCommands(),    // 插件定义的命令
      getBuiltinCommands()     // 硬编码命令
    ]);

  return [...userCommands, ...skillsAndPlugins, ...pluginCommands, ...builtins]
    .filter(cmd => cmd.isEnabled());
}

// 特定 skill 加载
async function loadPluginSkills(plugin) {
  // 检查插件是否有 skills
  if (!plugin.skillsPath) return [];

  // 支持两种模式:
  // 1. skillsPath 中的根 SKILL.md
  // 2. 带有 SKILL.md 的子目录

  const skillFiles = findSkillMdFiles(plugin.skillsPath);
  const skills = [];

  for (const file of skillFiles) {
    const content = readFile(file);
    const { frontmatter, markdown } = parseFrontmatter(content);

    skills.push({
      type: "prompt",
      name: `${plugin.name}:${getSkillName(file)}`,
      description: `${frontmatter.description} (plugin:${plugin.name})`,
      whenToUse: frontmatter.when_to_use,  // ← 注意:下划线!
      allowedTools: parseTools(frontmatter['allowed-tools']),
      model: frontmatter.model === "inherit" ? undefined : frontmatter.model,
      isSkill: true,
      promptContent: markdown,
      // ... 其他字段
    });
  }

  return skills;
}

对于 pdf skill,这会产生:

{
  type: "prompt",
  name: "pdf",
  description: "Extract text from PDF documents (plugin:document-tools)",
  whenToUse: "When user wants to extract or process text from PDF files",
  allowedTools: ["Bash(pdftotext:*)", "Read", "Write"],
  model: undefined,  // 使用会话模型
  isSkill: true,
  disableModelInvocation: false,
  promptContent: "You are a PDF processing specialist...",
  // ... 其他字段
}

第 2 阶段:第 1 轮——用户请求和 Skill 选择

用户发送请求:"从 report.pdf 中提取文本"。Claude 收到此消息以及其工具数组中的 Skill 工具。在 Claude 决定调用 pdf skill 之前,系统必须在 Skill 工具的描述中呈现可用的 skills。

Skill 过滤和呈现

并非所有加载的 skills 都出现在 Skill 工具中。skill 必须在 frontmatter 中有 descriptionwhen_to_use,否则会被过滤掉。过滤标准:

async function getSkillsForSkillTool() {
  const allCommands = await getAllCommands();

  return allCommands.filter(cmd =>
    cmd.type === "prompt" &&
    cmd.isSkill === true &&
    !cmd.disableModelInvocation &&
    (cmd.source !== "builtin" || cmd.isModeCommand === true) &&
    (cmd.hasUserSpecifiedDescription || cmd.whenToUse)  // ← 必须有一个!
  );
}

Skill 格式化

每个 skill 都为 <available_skills> 部分格式化。例如,我们假设的 pdf skill 可以格式化为

"pdf": Extract text from PDF documents - When user wants to extract or process text from PDF files

function formatSkill(skill) {
  let name = skill.name;
  let description = skill.whenToUse
    ? `${skill.description} - ${skill.whenToUse}`
    : skill.description;

  return `"${name}": ${description}`;
}

Claude 的决策过程

现在,当用户提示:"从 report.pdf 中提取文本"。Claude 收到带有 Skill 工具的 API 请求,读取 <available_skills>,并推理(假设地,因为我们看不到推理轨迹):

内部推理:
- 用户想要"从 report.pdf 中提取文本"
- 这是 PDF 处理任务
- 查看可用的 skills...
- "pdf":从 PDF 文档中提取文本 - 当用户想要从 PDF 文件中提取或处理文本时
- 这匹配!用户想要从 PDF 中提取文本
- 决策:使用 command="pdf" 调用 Skill 工具

请注意,这里没有算法匹配。没有词汇匹配。没有语义匹配。没有搜索。这是纯粹的 LLM 推理,根据 skill 的描述做出决策。完成后,Claude 返回工具使用:

{
  "type": "tool_use",
  "id": "toolu_123abc",
  "name": "Skill",
  "input": {
    "command": "pdf"
  }
}

第 3 阶段:Skill 工具执行

Skill 工具现在执行。这对应于序列图中的黄色"SKILL TOOL EXECUTION"框,它在产生结果之前执行验证、权限检查、文件加载和上下文修改。

步骤 1:验证

async validateInput({ command }, context) {
  let skillName = command.trim().replace(/^\//, "");

  // 错误 1:空
  if (!skillName) return { result: false, errorCode: 1 };

  // 错误 2:未知 skill
  const allSkills = await getAllCommands();
  if (!skillExists(skillName, allSkills)) {
    return { result: false, errorCode: 2 };
  }

  // 错误 3:无法加载
  const skill = getSkill(skillName, allSkills);
  if (!skill) return { result: false, errorCode: 3 };

  // 错误 4:禁用模型调用
  if (skill.disableModelInvocation) {
    return { result: false, errorCode: 4 };
  }

  // 错误 5:不是基于提示词的
  if (skill.type !== "prompt") {
    return { result: false, errorCode: 5 };
  }

  return { result: true };
}

pdf skill 通过所有验证检查 ✓

步骤 2:权限检查

async checkPermissions({ command }, context) {
  const skillName = command.trim().replace(/^\//, "");
  const permContext = (await context.getAppState()).toolPermissionContext;

  // 检查拒绝规则
  for (const [pattern, rule] of getDenyRules(permContext)) {
    if (matches(skillName, pattern)) {
      return { behavior: "deny", message: "Blocked by permission rules" };
    }
  }

  // 检查允许规则
  for (const [pattern, rule] of getAllowRules(permContext)) {
    if (matches(skillName, pattern)) {
      return { behavior: "allow" };
    }
  }

  // 默认:询问用户
  return { behavior: "ask", message: `Execute skill: ${skillName}` };
}

假设没有规则,用户会被提示:"执行 skill:pdf?"

用户批准 ✓

步骤 3:加载 Skill 文件并生成执行上下文修改

通过验证和权限批准后,Skill 工具加载 skill 文件并准备执行上下文修改:

async *call({ command }, context) {
  const skillName = command.trim().replace(/^\//, "");
  const allSkills = await getAllCommands();
  const skill = getSkill(skillName, allSkills);

  // 加载 skill 提示词
  const promptContent = await skill.getPromptForCommand("", context);

  // 生成元数据标签
  const metadata = [
    `<command-message>The "${skill.userFacingName()}" skill is loading</command-message>`,
    `<command-name>${skill.userFacingName()}</command-name>`
  ].join('\n');

  // 创建消息
  const messages = [
    { type: "user", content: metadata },  // 用户可见
    { type: "user", content: promptContent, isMeta: true },  // 对用户隐藏,对 Claude 可见
    // ... 附件、权限
  ];

  // 提取配置
  const allowedTools = skill.allowedTools || [];
  const modelOverride = skill.model;

  // 使用执行上下文修改器产生结果
  yield {
    type: "result",
    data: { success: true, commandName: skillName },
    newMessages: messages,

    // 🔑 执行上下文修改函数
    contextModifier(context) {
      let modified = context;

      // 注入允许的工具
      if (allowedTools.length > 0) {
        modified = {
          ...modified,
          async getAppState() {
            const state = await context.getAppState();
            return {
              ...state,
              toolPermissionContext: {
                ...state.toolPermissionContext,
                alwaysAllowRules: {
                  ...state.toolPermissionContext.alwaysAllowRules,
                  command: [
                    ...state.toolPermissionContext.alwaysAllowRules.command || [],
                    ...allowedTools  // ← 预先批准这些工具
                  ]
                }
              }
            };
          }
        };
      }

      // 覆盖模型
      if (modelOverride) {
        modified = {
          ...modified,
          options: {
            ...modified.options,
            mainLoopModel: modelOverride
          }
        };
      }

      return modified;
    }
  };
}

Skill 工具产生其结果,包含 newMessages(元数据 + skill 提示词 + 对话上下文注入的权限)和 contextModifier(工具权限 + 执行上下文修改的模型覆盖)。这完成了序列图中的黄色"SKILL TOOL EXECUTION"框。

第 4 阶段:发送到 API(第 1 轮完成)

系统构建完整的消息数组以发送到 Anthropic API。这包括对话中的所有消息以及新注入的 skill 消息:

// 为第 1 轮发送到 API 的完整消息数组
{
  model: "claude-sonnet-4-5-20250929",
  messages: [
    {
      role: "user",
      content: "Extract text from report.pdf"
    },
    {
      role: "assistant",
      content: [
        {
          type: "tool_use",
          id: "toolu_123abc",
          name: "Skill",
          input: { command: "pdf" }
        }
      ]
    },
    {
      role: "user",
      content: "<command-message>The \"pdf\" skill is loading</command-message>\n<command-name>pdf</command-name>"
      // isMeta: false(默认)- 对 UI 中的用户可见
    },
    {
      role: "user",
      content: "You are a PDF processing specialist...\n\n## Process\n1. Validate PDF exists\n2. Run pdftotext...",
      isMeta: true  // 从 UI 隐藏,发送到 API
    },
    {
      role: "user",
      content: {
        type: "command_permissions",
        allowedTools: ["Bash(pdftotext:*)", "Read", "Write"],
        model: undefined
      }
    }
  ]
}

Turn 1 Completion

上面显示了我们到目前为止所做的事情。应用执行上下文修改器,预先批准 Bash(pdftotext:*)ReadWrite 以用于后续工具调用。请求被发送到 Anthropic API。这结束了 skill 执行。如果这是一个普通工具,我们就完成了。但是,skills 不同。Agent skill 只注入了对话上下文和执行上下文。这意味着我们仍然需要使用所有这些注入的上下文调用 Claude agent 来完成用户的请求!

第 5 阶段:Bash 工具执行(使用 Skill 上下文的工具使用!)

Claude 收到带有注入对话上下文的 API 响应。skill 提示词已转换 Claude 的行为,为其提供:

  • 专门的 PDF 处理指令(对话上下文)
  • 预先批准访问 Bash(pdftotext:*)ReadWrite 工具(执行上下文)
  • 要遵循的清晰工作流(对话上下文)

Claude 处理上下文并遵循 pdf skill 的工作流:

我将从 report.pdf 中提取文本。让我处理文件。

[遵循 pdf skill 的指令]
1. 验证 report.pdf 是否存在
2. 运行 pdftotext 命令提取文本
3. 读取输出文件
4. 向您呈现提取的文本

Claude 使用 Bash 工具(预先批准,不需要用户提示):

{
  "type": "tool_use",
  "id": "toolu_456def",
  "name": "Bash",
  "input": {
    "command": "pdftotext report.pdf output.txt",
    "description": "Extract text from PDF using pdftotext"
  }
}

Bash 工具成功执行,返回结果。然后 Claude 使用 Read 工具读取输出文件,并向用户呈现提取的文本。skill 已成功指导 Claude 完成专门的 PDF 提取工作流,方法是将指令注入对话上下文并修改工具权限的执行上下文。

结论:心智模型回顾

Claude Code 中的 Skills 是 基于提示词的对话和执行上下文修改器,通过元工具架构工作:

关键要点:

  1. Skills 是 SKILL.md 文件中的 提示词模板,不是可执行代码
  2. Skill 工具(大写 S)是 tools 数组中的元工具,管理单个 skills,不在系统提示词中
  3. Skills 通过注入指令提示词(通过 isMeta: true 消息)修改对话上下文
  4. Skills 通过更改工具权限和模型选择 修改执行上下文
  5. 选择通过 LLM 推理 发生,不是算法匹配
  6. 工具权限通过执行上下文修改 作用域到 skill 执行
  7. Skills 每次调用注入两条用户消息——一条用于用户可见的元数据,一条用于发送到 API 的隐藏指令

优雅的设计: 通过将专门知识视为 修改对话上下文的提示词修改执行上下文的权限,而不是 执行的代码,Claude Code 实现了传统函数调用难以实现的灵活性、安全性和可组合性。

参考资料


ℹ️ 来源信息

原文: Claude Agent Skills: A First Principles Deep Dive

  • 来源: Hanchung Lee's Blog
  • 作者: Hanchung Lee
  • 发布: 2025 年 10 月 26 日
  • 导入: 2025 年 11 月 24 日
  • 许可证: Copyright © 2025 Hanchung Lee

本文通过 fumadocs-article-importer skill 使用 Claude AI 自动导入和翻译。