SKILL.md 文件,其中包含说明,Claude 会将其添加到其工具包中。Claude 在相关时使用 skills,或者你可以使用 /skill-name 直接调用一个。
当你不断将相同的说明、检查清单或多步骤程序粘贴到聊天中时,或者当 CLAUDE.md 的某个部分已经演变成一个程序而不是事实时,就创建一个 skill。与 CLAUDE.md 内容不同,skill 的主体仅在使用时加载,因此长参考资料在你需要之前几乎不花费任何成本。
对于内置命令如
/help 和 /compact,以及捆绑的 skills 如 /debug 和 /code-review,请参阅命令参考。自定义命令已合并到 skills 中。 .claude/commands/deploy.md 中的文件和 .claude/skills/deploy/SKILL.md 中的 skill 都会创建 /deploy 并以相同的方式工作。你现有的 .claude/commands/ 文件继续工作。Skills 添加了可选功能:支持文件的目录、用于控制你或 Claude 是否调用它们的 frontmatter,以及 Claude 在相关时自动加载它们的能力。捆绑技能
Claude Code 包含一组捆绑技能,例如/doctor、/code-review、/batch、/debug、/loop 和 /claude-api。捆绑技能是基于提示的:它们为 Claude 提供详细的指令,让它使用其工具来协调工作。大多数内置命令则直接执行固定逻辑。
您调用捆绑技能的方式与调用任何其他技能相同,即输入 / 后跟技能名称。Claude 在相关时会自动调用某些捆绑技能;其他技能(包括 /verify)仅在您调用它们时运行,这样可以让您控制这些耗时较长的检查何时花费时间和令牌。
大多数捆绑技能在每个会话中都可用。少数技能取决于特定功能:例如,/workflow-authoring 仅在动态工作流启用时可用。
要关闭捆绑技能,请使用 disableBundledSkills 设置。
在 Claude Code v2.1.205 及更高版本中,当
disableBundledSkills 打开时,/doctor 设置检查仍然可以输入。要隐藏它,请设置 DISABLE_DOCTOR_COMMAND 环境变量或 skillOverrides 条目 "doctor": "off"。在 v2.1.205 之前,/doctor 是内置命令而不是捆绑技能。运行并验证您的应用
三个捆绑技能协同工作来启动您的应用并根据运行中的应用而不仅仅是测试来确认更改:/run 和 /verify 无需设置即可工作。它们从您的项目类型(CLI、服务器、TUI、浏览器驱动)以及 README、package.json 或 Makefile 中的内容推断启动。对于需要超出标准启动范围的任何内容的项目,该推断变得不可靠:数据库、env 文件、图形会话、多步骤构建。
/run-skill-generator 改为记录配方。它从干净的环境中让您的应用运行,捕获有效的内容(安装命令、环境变量、启动脚本),并将其作为每个项目的技能提交到 .claude/skills/run-<name>/。之后,/run、/verify 和存储库中的任何其他代理都遵循记录的配方而不是重新发现它。每个项目运行一次 /run-skill-generator,如果构建或启动过程更改,则再次运行。
/verify 也可以记录自己的配方。当它必须在没有记录的配方的情况下构建和驱动您的应用时,它会将有效的内容写入存储库根目录的 .claude/skills/verify/SKILL.md,或在 monorepo 中的受触及的包目录中,以便后续运行和其他代理遵循相同的步骤。在存储库根目录,记录的技能替换捆绑的 /verify。这需要 Claude Code v2.1.200 或更高版本。
Claude 仅在它引导运行出错时编辑记录的文件,例如失败的命令或缺少的步骤,因此您可以提交文件而无需每个会话的差异。在 v2.1.205 之前,捆绑技能告诉 Claude 折叠运行学到的任何内容,这导致频繁的合并冲突。
开始使用
创建你的第一个 skill
这个示例创建了一个 skill,它总结你的 git 仓库中未提交的更改,并标记任何有风险的内容。它在 Claude 读取之前将实时差异拉入提示中,因此响应基于你的实际工作树,而不是 Claude 从打开的文件中猜测的内容。当你询问你的更改时,Claude 会自动加载该 skill,或者你可以使用/summarize-changes 直接调用它。
1
创建 skill 目录
在你的个人 skills 文件夹中为该 skill 创建一个目录。个人 skills 在所有项目中都可用。
2
编写 SKILL.md
每个 skill 都需要一个
SKILL.md 文件,包含两部分:--- 标记之间的 YAML frontmatter,告诉 Claude 何时使用该 skill,以及包含 Claude 在 skill 运行时遵循的说明的 markdown 内容。目录名称成为你输入的命令,description 帮助 Claude 决定何时自动加载该 skill。将其保存到 ~/.claude/skills/summarize-changes/SKILL.md:!`git diff HEAD` 行使用动态上下文注入:Claude Code 运行该命令,并在 Claude 看到 skill 内容之前将该行替换为其输出,因此说明会随着当前差异已内联而到达。3
测试 skill
打开一个 git 项目,对任何文件进行小的编辑,并通过运行 或直接使用 skill 名称调用它:无论哪种方式,Claude 都应该用你的编辑的简短摘要和风险列表进行响应。
claude 启动 Claude Code。你可以通过两种方式测试该 skill。让 Claude 自动调用它,通过询问与描述匹配的内容:选择 skills 的加载位置
保存 skill 的位置决定了哪些会话会加载它。将其保存在主目录下可以在每个项目中使用,将其提交到存储库可以与在那里工作的所有人共享,或通过 plugin 或托管设置分发以覆盖整个团队。
Skill 文件夹还遵循以下规则:
- 符号链接文件夹:enterprise、personal 或 project 位置中的
<skill-name>条目可以是指向磁盘上其他位置的目录的符号链接。Claude Code 从目标读取SKILL.md并加载 skill,即使多个位置指向同一目标也只加载一次。Plugin skills 以不同方式处理符号链接。 - 保留名称:不要将 skill 文件夹命名为
synced,无论大小写如何。Claude Code 使用~/.claude/skills/synced/来存放 从 claude.ai 下载的 skills,并跳过您在 enterprise、personal 和 project 位置中以该名称创建的 skill。 - 命令文件:
.claude/commands/中的 Markdown 文件是较旧的格式,仍然有效。它支持相同的 frontmatter,除了name和paths。要找到您输入以调用它的名称,请参阅 Skill 如何获得其命令名称。对于新工作,更倾向于使用 skill,因为 skills 还支持 支持文件。 - Skill 文件夹作为 plugin:将
.claude-plugin/plugin.json添加到 skill 文件夹,它将作为 plugin 加载,名称为<name>@skills-dir,因此它可以捆绑 agents、hooks 和 MCP 服务器。在项目的.claude/skills/中,这需要首先接受工作区信任对话框。
在 monorepos 和子目录中加载 skills
Claude Code 从启动它的目录中的.claude/skills/ 以及直到存储库根目录的每个父目录中加载项目 skills,因此在 packages/frontend/ 中启动仍然会获取在根目录中定义的 skills。当您在 v2.1.246 或更高版本上 使用 /cd 移动会话 时,Claude Code 会添加新目录的项目 skills。
在链接的 git worktree 中运行的会话中,Claude Code 仅在 worktree 根目录之前搜索父目录。在 Claude Code v2.1.277 或更高版本上,当 worktree 检出在其根目录处没有 .claude/skills 目录时,Claude Code 会改为加载主检出的项目 skills。请参阅 Worktrees 与主检出共享的内容。
.claude/skills/ 目录中启动位置下方的 Skills 在启动时不会加载。它们在 Claude 首次读取或编辑该子目录中的文件时加载,并在会话的其余时间保持可用。在此之前,它们不会出现在 / 菜单中,您也无法按名称调用它们。要更早加载它们,请使用子目录的路径运行 /add-dir,这需要 Claude Code v2.1.257 或更高版本。
当嵌套 skill 与另一个 skill 共享名称时,两者都保持可用。在存储库根目录和 apps/web/.claude/skills/ 中都有一个 deploy skill 的情况下:
/deploy运行根 skill。Claude Code 还为 Claude 列出目录限定的变体,并提供说明以调用其目录包含它正在处理的文件的那个,因此嵌套 skill 仍然适用于apps/web/中的工作。/apps/web:deploy单独运行嵌套 skill。其描述命名了它适用的目录。
从项目外的目录加载 skills
当您使用--add-dir 或 /add-dir 添加目录时,Claude Code 会加载该目录的 .claude/skills/ 中的 skills,以及其 .claude/commands/ 和 .claude/agents/。Agent SDK 通过 TypeScript 中的 additionalDirectories 或 Python 中的 add_dirs 添加的目录以相同方式加载,因为 SDK 将它们作为 --add-dir 传递。settings.json 中的 permissions.additionalDirectories 设置仅授予文件访问权限,不加载这些中的任何一个。
Claude Code 监视您在启动时使用 --add-dir 传递的目录中的 .claude/skills/,如 在会话期间编辑 skill 所述。它不监视添加目录的 .claude/commands/ 或 .claude/agents/,因此在更改那里的文件后重新启动会话。
这些加载取决于 project 设置源,默认情况下处于启用状态。strictPluginOnlyCustomization 策略、bare mode 和 --safe-mode 各自进一步限制它们,如这些页面所述。请参阅 额外目录授予文件访问权限,而不是配置 以获取添加目录加载的完整表格,包括 CLAUDE.md 和 plugin 设置。
解决共享名称的 skills
当两个 skills 共享名称时,每个来自的位置决定了/name 运行哪一个。该表涵盖 enterprise、personal、project、nested、plugin 和 claude.ai 位置、捆绑的 skills 和命令文件:
在 Cowork 和云会话中使用 skills
Cowork 会话和 云会话,包括 routines,不会读取您机器上的~/.claude/skills/。交互式和计划的 Cowork 会话都加载为您的 claude.ai 账户启用的 skills,在会话启动时同步;从 Desktop 应用侧边栏中的 Customize 或从 claude.ai 上的 skills 设置管理它们。云会话还加载提交到克隆存储库的 .claude/skills/ 的项目 skills。
如果 skill 仅存在于您机器上的 ~/.claude/skills/ 中,当 routine 调用它时,Claude Code 会报告找不到该 skill,因为每个 routine 运行都作为新的云会话启动。要在这些会话中使用个人 skill:
- 对于 Cowork 和云会话,为您的 claude.ai 账户启用该 skill。
- 对于云会话,您可以改为将 skill 提交到存储库的
.claude/skills/。在存储库的.claude/settings.json中声明的 plugins 和仅在您的用户设置中启用的 plugins 不会在云会话中加载。
~/.claude/skills/。
从 claude.ai 同步的 Skills
如果您使用 Cowork 或云会话,或在终端中使用 claude.ai 账户登录 Claude Code,本部分适用于您。在这些会话中,Claude Code 加载为您的 claude.ai 账户启用的 skills,无需您进行任何设置,如 同步的 skills 加载位置 所述。这些 skills 包括您在 claude.ai 设置中创建或打开的 skills、您的组织在那里提供的 skills 以及 Anthropic 的内置 skills,如pdf 和 xlsx。
Claude Code 从您的账户下载同步的 skill,而不是读取您在会话运行的机器上编写的文件,因此它对同步的 skills 应用不适用于您存储在 skills 位置 中的 skills 的规则。
同步的 skills 加载位置
在 Cowork 或云会话中,Claude Code 加载为您的 claude.ai 账户启用的 skills,Cowork 和云会话中的 Skills 说明了如何选择这些会话获得哪些 skills。 在您的终端中,Claude Code 在您使用 claude.ai 账户登录的会话中同步这些 skills。当会话启动时,Claude Code 在后台将您账户的 skills 下载到~/.claude/skills/synced/ 中,然后在会话运行时大约每 10 分钟检查一次 claude.ai 的更改。当检查发现 skill 在 claude.ai 上被添加、编辑或关闭时,Claude Code 在运行的会话中添加、更新或删除它,无需重新启动。终端会话中的同步需要 Claude Code v2.1.273 或更高版本。
同步永远不会延迟启动,因为 Claude 仅在调用 skill 时等待其下载。因此,短的 非交互式 运行可以在新添加的 skill 下载之前完成,在这种情况下,稍后的会话会下载它。要使非交互式运行下载您的 skills 并在回答提示之前等待列表,请将 CLAUDE_CODE_SYNC_SKILLS 设置为 1。
Claude Code 仅在使用您的 claude.ai 账户登录并 从 Anthropic 获取功能标志 的会话中同步。它不在这些会话中同步:
- 不使用
/login存储的登录的会话,例如使用 API 密钥进行身份验证的会话,或ANTHROPIC_AUTH_TOKEN、CLAUDE_CODE_OAUTH_TOKEN或apiKeyHelper脚本提供凭证的会话 - 不获取功能标志的会话,例如 Amazon Bedrock 上的会话或您设置
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC的会话 - bare mode 中的会话或您使用
--safe-mode启动的会话 - 您的组织的托管设置 将 skills 锁定到 plugin 源 的会话,或您使用
--setting-sources列表启动的会话,该列表省略了user
/login 登录,重新启动 Claude Code 以开始同步。
较早会话同步的 Skills 保留在磁盘上。Claude Code 在登录到同一账户的后续会话中加载它们,即使它无法到达 claude.ai。
Claude Code 下载同步的 skills,从不上传它们。如果您或 Claude 编辑 ~/.claude/skills/synced/ 下的文件,更改不会保存到您的 claude.ai 账户,稍后的同步可能会覆盖或删除它。要更改同步的 skill,在 claude.ai 上更新它;下一次同步会下载新版本。
要查看哪些 skills 已同步,请运行 /skills。菜单在 claude.ai sync 下列出它们。
Anthropic 的某些 skills,如 pdf 和 xlsx,总是同步。对于其余的,在 claude.ai 上的 skills 设置中打开或关闭 skill 以更改它是否同步。
要停止在机器上同步,请在您的用户设置中将 syncClaudeAiSkills 设置为 false。Claude Code 停止下载,下次启动时它会将已同步的 skills 移动到 ~/.claude/skills/.trash/,不再加载它们。您的组织可以通过在 claude.ai 上关闭 Skills 来为所有人关闭同步。要在保持 Skills 打开的情况下停止同步,它可以在 托管设置 中设置相同的密钥。
如果您的组织在 claude.ai 上关闭 Skills,Claude Code 会删除下载的 skills,它们停止加载。删除的 skills 移动到 ~/.claude/skills/.trash/,您可以在 保留扫描 删除它们之前恢复文件。一旦您的组织重新打开 Skills,Claude Code 会在下一次同步时下载您启用的 skills。
当同步的 skill 名称与另一个命令匹配时
您可以通过其完整名称/anthropic-skills:<name> 或其短名称 /<name> 调用同步的 skill。当另一个命令使用该短名称时,/<name> 运行另一个命令,同步的 skill 仅作为 /anthropic-skills:<name> 运行。使用本地 deploy skill 和同步的 deploy 时,/deploy 运行本地 skill,/anthropic-skills:deploy 运行同步的。在 v2.1.269 之前,同步的 skill 仅有其短名称。
另一个命令可以是以下任何一个:
- 内置命令或 捆绑 skill,包括在您的会话中不可用的,例如在您关闭捆绑 skills 后
- 任何 本地级别 的 skill 或
.claude/commands/中的文件 - Plugin skill
- MCP prompt
/skills 菜单和 /context 在 claude.ai sync 下分组同步的 skills,/ 命令菜单将它们标记为来自 claude.ai。
比较名称时,Claude Code 忽略大小写、间距和不可见字符,并将兼容性形式(如全宽字母和破折号变体)视为其纯等效形式。例如,名为 Commit 的同步 skill 和名为 commit 的本地 skill 计为相同名称,因此 /commit 继续运行您的本地 skill。
仅因来自另一个字母表的相似字母而不同的名称计为不同名称,claude.ai sync 标签是您区分两者的方式。这些检查和标签需要 Claude Code v2.1.228 或更高版本。
Claude Code 如何处理同步 skill 的 frontmatter
Claude Code 对同步 skill 的 frontmatter 应用两条规则:- Claude Code 在每种会话中都遵守 frontmatter,因此
allowed-tools授权通过正常的 权限流 进行。 - Claude Code 清理 skill 提供的显示文本,如其描述。它删除控制字符,在到达 Claude 的文本(如描述)中,它还转义尖括号,以便文本无法模仿 Claude Code 的内部格式。此清理需要 Claude Code v2.1.228 或更高版本。
Claude Code 如何处理同步 skill 的正文
Claude Code 对同步 skill 的正文的处理取决于会话运行的位置:- 在云会话中,正文保持本地 skill 具有的行为,因为会话在隔离的容器中运行。
- 在您桌面上的 Cowork 会话中,正文保持本地 skill 具有的行为,除了 Claude Code 将每个
!命令行替换为disableSkillShellExecution占位符,就像它对您在那里提供的每个 skill 所做的那样。 - 在您机器上的任何其他会话中,Claude Code 不运行
!命令,不附加@引用命名的文件(就像它对本地 skill 所做的那样),不替换${CLAUDE_PROJECT_DIR}和${CLAUDE_SESSION_ID}占位符,因此@引用和两个占位符都作为文字文本到达 Claude。!命令行也作为文字文本到达 Claude,或当disableSkillShellExecution打开时作为该占位符。此处理需要 Claude Code v2.1.228 或更高版本。
在会话期间编辑 skill
Claude Code 监视 skill 目录的文件更改,除了在 bare mode 中。当您在~/.claude/skills/、项目 .claude/skills/ 或 --add-dir 目录内的 .claude/skills/ 中添加、编辑或删除 skill 时,Claude Code 在当前会话中获取更改,无需重新启动。如果您创建会话启动时不存在的顶级 skills 目录,重新启动 Claude Code 以便它可以监视新目录。
实时更改检测仅涵盖 SKILL.md 文本。对于也是 plugin 的 skill 文件夹,对 hooks/、.mcp.json、agents/ 和 output-styles/ 的更改需要 /reload-plugins 才能生效。
删除 skill
删除 skill 的方式取决于它来自何处:- Personal 或 project skill:删除 skill 的目录,
~/.claude/skills/<skill-name>/或.claude/skills/<skill-name>/。Claude Code 在当前会话中从/skills中删除它;Claude Code 已从中加载的内容遵循 skill 内容生命周期。 - Enterprise skill:管理员从 托管设置目录 内的
.claude/skills/中删除 skill 的目录,例如 Linux 上的/etc/claude-code/.claude/skills/<skill-name>/。 - Plugin skill:从
/plugin菜单禁用或卸载提供它的 plugin,或使用/plugin uninstall <plugin-name>@<marketplace-name>。Claude Code 在 更改应用 时或重新启动时卸载 plugin 的 skills。 - 从 claude.ai 同步的 Skill:在您 启用它 的同一位置为您的 claude.ai 账户关闭该 skill。Claude Code 在下一次 同步您的 skills 时从
~/.claude/skills/synced/中删除它。如果您改为手动删除目录,下一次同步会在 skill 在 claude.ai 上保持启用的情况下再次下载它。 - 捆绑 skill:将
disableBundledSkills设置为true以关闭捆绑 skills,或在skillOverrides中将一个 skill 设置为"off"以隐藏它。
disable-model-invocation: true,或在 skillOverrides 中设置 "user-invocable-only"(当您不想编辑文件时)。
配置 skills
Skills 通过位于SKILL.md 顶部的 YAML frontmatter 和随后的 markdown 内容进行配置。
Skill 内容的类型
Skill 文件可以包含任何说明,但思考你想如何调用它们有助于指导应该包含什么内容: 参考内容添加 Claude 应用于你当前工作的知识。约定、模式、风格指南、领域知识。此内容以内联方式运行,以便 Claude 可以将其与你的对话上下文一起使用。/skill-name 调用的操作,而不是让 Claude 决定何时运行它们。添加 disable-model-invocation: true 以防止 Claude 自动触发它。下面的示例添加了 context: fork,它在自己的子代理上下文中运行 skill;请参阅在子代理中运行 skills。
Frontmatter 参考
使用位于SKILL.md 文件顶部 --- 标记之间的 YAML frontmatter 配置 skill,并在关闭 --- 后将 skill 的说明写成 Markdown。字段名称使用由连字符分隔的小写单词,除了 when_to_use。.claude/commands/ 中的命令文件接受相同的字段,除了 name 和 paths。此示例设置四个字段:
description 是推荐的,以便 Claude 知道何时使用该 skill。字段名称必须与表格完全匹配,包括连字符:Claude Code 会忽略它不识别的字段而不报告错误。
Claude Code 仅在开始 --- 是文件的第一行时读取 frontmatter。否则,它将整个文件(包括 --- 标记)视为 skill 内容。如果标记之间的 YAML 无法解析,skill 仍然加载但没有设置字段;请参阅Skill 未触发以查找并修复错误。
布尔字段接受 yes、no、on、off、1 和 0(任何字母大小写),以及 true 和 false。在 v2.1.218 之前,Claude Code 仅识别 true 和 false。
在 Claude Code 外使用 skill frontmatter
Claude Code 接受上表中的每个字段。在 Claude Code 外,你只能使用Agent Skills 规范中的字段:
当你为Cowork 和云会话启用个人 skill(包括例程)时,你将其上传到 claude.ai,因此适用相同的规则。
如果你包含规范不允许的任何字段,打包或上传将失败并出现硬错误,而不是忽略该字段:
skill 如何获得其命令名称
你键入以调用 skill 的命令来自 skill 文件的位置,对于插件 skills,还来自 frontmattername 字段。在个人或项目 skill 中,name 仅设置在 skill 列表中显示的显示标签,命令仍来自目录名称。在插件 skill 中,name 设置命令的最后一段,插件前缀保持不变。
下表显示了每个布局的命令名称来自何处:
在插件 skill 中,frontmatter
name 替换命令最后一段中的目录名称,因此 my-plugin/skills/review/SKILL.md 带有 name: fancy 变为 /my-plugin:fancy。裸 /fancy 也调用该 skill,除非另一个命令已使用该名称。如果你写的 name 已经以插件自己的前缀开头,Claude Code 在 v2.1.246 或更高版本上不会再次添加前缀。例如,name: my-plugin:fancy 仍然变为 /my-plugin:fancy。从 v2.1.216 到 v2.1.245,当 name 已经携带前缀时,Claude Code 会加倍前缀。
在非交互式会话中,名称 help 和 feedback 不是为其仅限终端的内置命令保留的,因此具有其中一个名称的插件 skill 在那里保持其裸命令。每个其他仅限终端的内置命令的名称(如 /login)即使该命令无法在这些会话中运行,仍然保留。
对于插件根 SKILL.md,没有 skill 目录来获取名称,因此 name 提供整个最后一段。没有 name 字段,Claude Code 回退到插件的目录名称。
可用的字符串替换
Skills 支持 skill 内容中动态值的字符串替换:
Claude Code 在两个地方替换
${CLAUDE_SKILL_DIR} 和 ${CLAUDE_PROJECT_DIR}:skill 的 markdown 内容和allowed-tools frontmatter 中的 Bash 规则。在插件 skill 中,Claude Code 在相同的两个地方替换 ${CLAUDE_PLUGIN_ROOT} 和 ${CLAUDE_PLUGIN_DATA}。在两个地方使用相同的变量让 skill 运行捆绑的脚本而无需许可提示。以下 skill 显示了该模式:
~/.claude/skills/render-chart/,${CLAUDE_SKILL_DIR} 的两个出现都扩展到该目录。allowed-tools 规则然后匹配 skill 正文告诉 Claude 运行的确切命令,因此脚本运行而无需提示。
${CLAUDE_PROJECT_DIR} 替换需要 Claude Code v2.1.196 或更高版本。
索引参数使用 shell 风格的引用,因此用引号包装多字值以将其作为单个参数传递。例如,/my-skill "hello world" second 使 $0 扩展到 hello world,$1 扩展到 second。$ARGUMENTS 占位符始终扩展到完整的参数字符串,如输入的那样。
没有对应参数的索引占位符,例如仅传递一个参数时的 $2,在内容中保持不变。来自arguments frontmatter 的没有匹配参数的命名占位符扩展为空字符串。
如果你传递的参数值本身包含文本(如 $1 或 $ARGUMENTS),Claude Code 将其作为文字文本插入,不会扩展它。例如,如果 skill 的正文包含 Summarize $0,你运行 /summarize "$ARGUMENTS from yesterday",Claude 接收 Summarize $ARGUMENTS from yesterday。Claude Code 仍然在插入参数后替换 ${CLAUDE_*} 变量(如 ${CLAUDE_SKILL_DIR})。
要在数字、ARGUMENTS 或声明的参数名称之前包含文字 $,例如散文中的 $1.00,用反斜杠转义它:\$1.00。任何其他 $ 之前的反斜杠保持不变。仅直接在令牌之前的单个反斜杠转义它。双反斜杠(如 \\$1)在原地保留两个反斜杠,$1 仍然扩展到参数值。反斜杠转义仅涵盖这些参数占位符。反斜杠不会阻止 ${CLAUDE_*} 变量的替换,其中变量适用。
使用替换的示例:
添加支持文件
Skills 可以在其目录中包含多个文件。这使SKILL.md 专注于要点,同时让 Claude 仅在需要时访问详细的参考材料。大型参考文档、API 规范或示例集合不需要在每次 skill 运行时加载到上下文中。
SKILL.md 引用支持文件,以便 Claude 知道每个文件包含什么以及何时加载它:
控制谁调用 skill
默认情况下,你和 Claude 都可以调用任何 skill。你可以键入/skill-name 直接调用它,Claude 可以在与你的对话相关时自动加载它。两个 frontmatter 字段让你限制这一点:
-
disable-model-invocation: true:仅你可以调用该 skill。用于具有副作用或你想控制时间的工作流,如/commit、/deploy或/send-slack-message。你不希望 Claude 因为你的代码看起来准备好就决定部署。 -
user-invocable: false:仅 Claude 可以调用该 skill。用于不可作为命令操作的背景知识。legacy-system-contextskill 解释了旧系统的工作原理。Claude 在相关时应该知道这一点,但/legacy-system-context对用户来说不是一个有意义的操作。
disable-model-invocation: true,Claude 无法自动运行该 skill:
/deploy。
以下是两个字段如何影响调用和上下文加载:
在常规会话中,skill 描述被加载到上下文中,以便 Claude 知道什么可用,但完整 skill 内容仅在调用时加载。具有预加载 skills 的子代理的工作方式不同:完整 skill 内容在启动时注入。
Skill 内容生命周期
当你或 Claude 调用 skill 时,渲染的SKILL.md 内容作为单个消息进入对话,并在后续回合中保持在那里。此持久性适用于 skill 的说明,而不是其权限:allowed-tools 授权在你发送下一条消息时被清除。Claude Code 不会在后续回合中重新读取 skill 文件,因此将应该在整个任务中应用的指导写成常设说明,而不是一次性步骤。
当 Claude 重新调用一个其渲染内容与已在上下文中的副本相同的 skill 时,Claude Code 添加一个简短的注释,说明该 skill 已加载,而不是内容的第二个副本。当渲染内容不同时,因为参数改变或动态上下文命令产生了新输出,Claude Code 再次附加完整内容。
自动压缩在令牌预算内携带调用的 skills。当对话被总结以释放上下文时,Claude Code 在总结后重新附加每个 skill 的最新调用,保留每个的前 5,000 个令牌。重新附加的 skills 共享 25,000 个令牌的组合预算。Claude Code 从最近调用的 skill 开始填充此预算,因此如果你在一个会话中调用了许多,较旧的 skills 可能在压缩后完全被删除。
如果 skill 似乎在第一个响应后停止影响行为,内容通常仍然存在,模型选择其他工具或方法。加强 skill 的 description 和说明,以便模型继续偏好它,或使用hooks来确定性地强制行为。如果 skill 很大或你在它之后调用了其他几个,在压缩后重新调用它以恢复完整内容。
为 skill 预先批准工具
allowed-tools 字段在调用 skill 的回合中为列出的工具授予权限,以便 Claude 可以使用它们而无需提示你批准。当你发送下一条消息时,授权被清除,即使 skill 内容保持在上下文中;再次调用 skill 会为该回合重新应用它。它不限制哪些工具可用:每个工具仍然可调用,你的权限设置仍然管理未列出的工具。要为整个会话而不是单个回合预先批准工具,请改为向这些权限设置添加允许规则。
工作区信任不会限制此字段。Claude Code 在你或 Claude 调用 skill 时应用项目 skill 的 allowed-tools,包括在你从未信任的文件夹中的 -p 运行。skill 可以授予自己广泛的工具访问权限,因此在你在那里运行 Claude Code 之前,查看检入存储库的 skills 的 allowed-tools。
此 skill 让 Claude 在你调用它时运行 git 命令而无需每次使用批准:
disallowed-tools 中列出它们。当你发送下一条消息时,限制被清除。与拒绝规则一样,该字段在任何其他工具保持时无法删除EndConversation。要在所有 skills 和提示中阻止工具,在你的权限设置中添加拒绝规则。
将参数传递给 skills
你和 Claude 都可以在调用 skill 时传递参数。参数可通过$ARGUMENTS 占位符获得。
此 skill 按编号修复 GitHub 问题。$ARGUMENTS 占位符被替换为 skill 名称后面的任何内容:
/fix-issue 123 时,Claude 接收”Fix GitHub issue 123 following our coding standards…”
如果你使用参数调用 skill,但 skill 内容中没有占位符接收一个,Claude Code 将 ARGUMENTS: <your input> 附加到 skill 内容的末尾,以便 Claude 仍然看到你键入的内容。占位符是 $ARGUMENTS、索引形式(如 $1)或命名参数。没有其位置参数的索引占位符保持为文字文本,不计为接收一个。命名占位符计数,即使其位置没有参数,因为它扩展为空字符串。
你也可以在一条消息的开始处堆叠多个 skills。键入 /write-tests /fix-issue 123 加载两个 skills 并将尾随文本 123 作为 $ARGUMENTS 传递给每个。在 v2.1.199 之前,仅第一个 skill 加载并接收 /fix-issue 123 作为文字参数文本。
Claude Code 扩展第一个 skill 加上最多五个在其后堆叠的。扩展在第一个不是内联用户可调用 skill 的令牌处停止,因此作为分叉子代理运行的 skill(如/code-review)或其参数本身可能以斜杠命令开头的 skill(如 /loop)也在那里结束运行。该令牌和其后的所有内容成为每个扩展 skill 的参数文本。从 v2.1.218 开始,/code-review 作为分叉子代理运行;在早期版本上,它以内联方式运行并堆叠。
要按位置访问单个参数,使用 $ARGUMENTS[N] 或较短的 $N:
/migrate-component SearchBar JavaScript TypeScript 将 $ARGUMENTS[0] 替换为 SearchBar,$ARGUMENTS[1] 替换为 JavaScript,$ARGUMENTS[2] 替换为 TypeScript。使用 $N 简写的相同 skill:
高级模式
注入动态上下文
!`<command>` 语法在技能内容发送给 Claude 之前运行 shell 命令。命令输出替换占位符,因此 Claude 接收实际数据,而不是命令本身。当技能从你的 claude.ai 账户同步时,Claude Code 不会在你的机器上运行这些命令。这个限制需要 Claude Code v2.1.228 或更高版本。
这个技能通过使用 GitHub CLI 获取实时 PR 数据来总结拉取请求。!`gh pr diff` 和其他命令首先运行,它们的输出被插入到提示中:
!`<command>` 占位符,因此命令无法为后续传递发出占位符来扩展。
内联形式仅在 ! 出现在行首或紧跟在空格后时被识别。如果 ! 跟在另一个字符后面,如 KEY=!`cmd`,占位符保留为字面文本,命令不运行。
对于多行命令,使用以 ```! 开头的围栏代码块而不是内联形式:
"disableSkillShellExecution": true。每个命令都被替换为 [shell command execution disabled by policy] 而不是被运行。捆绑和托管技能不受影响。此设置在托管设置中最有用,用户无法覆盖它。
当命令出现在从你的 claude.ai 账户同步的技能中时,Claude Code 永远不会在你的机器上运行这些命令,无论此设置如何。这个限制需要 Claude Code v2.1.228 或更高版本。Claude Code 如何处理同步技能的主体说明了在每种会话中 Claude 接收什么来代替命令。
注入命令如何运行
Claude Code 从技能的 frontmatter 中的shell 键和你的环境中选择运行技能的注入命令的工具。除了一个会直接导致调用失败的组合外,每个组合都通过 Bash 工具或 PowerShell 工具运行命令:
shell: powershell,启用了 PowerShell 工具:命令通过 PowerShell 工具运行。shell: bash当 bash 不可用时:调用在任何命令运行之前失败。这发生在没有 Git Bash 的 Windows 上。Claude Code 显示Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found。- 任何其他组合:当 bash 可用时,命令通过 Bash 工具运行。当它不可用时,它们通过 PowerShell 工具运行。
- 工作目录:Claude Code 在会话 shell 的当前工作目录中运行每个命令。当 Claude 运行
cd时,该目录会移动。在必须每次都以相同方式解析的路径中使用${CLAUDE_SKILL_DIR}或${CLAUDE_PROJECT_DIR}。 - stderr:使用默认的
bashshell,Claude Code 将 stderr 合并到 stdout。命令写入 stderr 的任何内容都会出现在注入的文本中。 - 超时:每个命令在 Bash 工具的默认 2 分钟超时下运行。当 Bash 工具将超时的命令移到后台时,技能仍然呈现。注入的文本报告移动并命名后台任务和收集命令输出的文件。当命令是 Bash 工具从不自动后台化的命令之一时,Claude Code 在超时时杀死它。该失败中止调用。
- 输出大小:超过 Bash 工具内联上限的输出作为文件路径加短预览到达,而不是截断的文本。输出限制涵盖上限以及如何调整每个边界。
当注入命令失败时
失败的命令中止整个技能调用,而不仅仅是其自己的占位符。Claude 永远看不到该调用的技能内容。中止显示Shell command failed for pattern "..."。错误消息包括命令的输出在 [stderr] 下。
使用默认的 bash shell,任何非零退出代码都算作失败。一个例外适用:Claude Code 将来自搜索和比较命令的退出代码 1 视为正常结果并注入其输出。退出代码 2 或更高的代码即使对于这些命令也会失败。
哪些命令获得例外取决于 shell:
- 默认
bashshell:输出限制下列出的命令 shell: powershell,当启用 PowerShell 工具时:一个不同的集合,包括grep和git diff但不包括find或diff
bash shell,将 || true 附加到任何你期望退出非零的其他命令。一个在发现问题时退出 1 的检查脚本就是一个例子。
注入命令的权限检查
注入命令在技能呈现时永远不会提示权限。Claude Code 首先根据你的权限规则检查每一个。命令与拒绝规则匹配的命令会中止调用,显示Shell command permission check failed for pattern "..."。
在自动模式之外,当命令的权限检查返回除允许之外的任何内容时,Claude Code 会中止调用。这包括通常会询问你的规则。要防止不匹配的命令在此处中止,请使用 allowed-tools 预先批准它。拒绝和询问规则仍然会覆盖 allowed-tools。请参阅管理权限。
在自动模式中,原本需要你批准的命令不会中止调用。技能加载时带有指令,告诉 Claude 首先运行该命令,然后 Claude 自己的调用通过自动模式的常规检查。调用仍然会在分叉技能中中止,该技能设置 agent,以及在 Claude 没有运行注入命令的 shell 工具的会话中。
在子代理中运行技能
当你希望技能在隔离中运行时,将context: fork 添加到你的 frontmatter。Claude Code 启动 agent 字段中设置的类型的新子代理,并将技能内容作为其提示提供给它。子代理看不到你的对话历史,因此技能的说明必须独立存在。
尽管名称如此,具有
context: fork 的技能不会在当前对话的分叉中运行,这会将你迄今为止讨论的所有内容交给子代理。当任务依赖于该历史时,分叉对话而不是使用 context: fork。background: false 以改为在调用技能的轮次中等待结果。在 v2.1.218 之前,分叉的技能总是阻止轮次直到它们完成。
Claude Code 也会等待结果,即使技能没有设置 background: false,在这些情况下:
- 在非交互模式中,使用
-p标志或 Agent SDK - 当你将
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS设置为1时,这也会关闭所有其他后台任务功能 - 当你在同一技能的早期调用仍在运行时调用分叉技能时
- 当计划任务以技能作为其提示触发时
background: false 以保持完整的工具集。
在后台运行的分叉技能在你的会话的检查点之外应用其编辑,因此 /rewind 不会撤销它们;使用 git 来恢复它们。
技能和子代理在两个方向上协同工作:
使用
context: fork,你在你的技能中编写任务并选择一个代理类型来执行它。内置的 Explore 和 Plan 代理跳过 CLAUDE.md 和 git 状态以保持其上下文较小,因此使用 agent: Explore 的分叉技能仅看到 SKILL.md 内容和代理自己的系统提示。对于相反的情况,你定义一个使用技能作为参考材料的自定义子代理,请参阅子代理。
示例:使用 Explore 代理的研究技能
这个技能在分叉的 Explore 代理中运行研究。技能内容成为任务,代理提供针对代码库探索优化的只读工具:- 创建一个新的隔离上下文
- 子代理接收技能内容作为其提示(“Research $ARGUMENTS thoroughly…”)
agent字段确定执行环境(模型、工具和权限)- 子代理总结其结果并在完成时将其返回到你的主对话
agent 字段指定要使用的子代理配置。选项包括内置代理(Explore、Plan、general-purpose)或来自 .claude/agents/ 的任何自定义子代理。如果省略,使用 general-purpose。
限制 Claude 的技能访问
默认情况下,Claude 可以调用任何没有设置disable-model-invocation: true 的技能。定义 allowed-tools 的技能在调用技能的轮次中授予 Claude 对这些工具的访问权限而无需逐次批准;当你发送下一条消息时,授权清除。你的权限设置仍然管理所有其他工具的基线批准行为。一些内置命令也可通过 Skill 工具获得,包括 /init 和 /security-review。其他内置命令如 /compact 则不可用。
控制 Claude 可以调用哪些技能的三种方法:
通过在 /permissions 中拒绝 Skill 工具来禁用所有技能:
Skill(name) 用于精确匹配,Skill(name *) 用于带任何参数的前缀匹配。
如果你的 deny 规则命名别名或不合格的名称而不是技能自己的名称,Claude Code 仍然会阻止该技能:使用 Skill(review) 它通过其 /review 别名阻止捆绑的 /code-review,使用 Skill(deploy) 它通过其不合格的名称阻止列为 apps/web:deploy 的嵌套技能。在 v2.1.260 之前,当拒绝规则仅命名不合格的名称时,Claude Code 不会阻止列在其合格名称下的嵌套技能。
Claude Code 仅针对技能自己的名称和 Claude 调用中的名称匹配 allow 规则。
通过向其 frontmatter 添加 disable-model-invocation: true 来隐藏单个技能。这将技能从 Claude 的上下文中完全删除。
使用
user-invocable: false,你无法调用该技能,但 Claude 仍然可以。要防止 Claude 通过 Skill 工具调用它,请设置 disable-model-invocation: true。从设置覆盖技能可见性
skillOverrides 设置从你的设置而不是技能自己的 frontmatter 控制技能可见性。将其用于你不想编辑 SKILL.md 的技能,例如检入共享项目仓库的技能。/skills 菜单为你编写它:突出显示一个技能并按 Space 循环状态,然后按 Esc 保存到 .claude/settings.local.json。
每个键是一个技能名称,每个值是四种状态之一:
/skills 菜单将 "user-invocable-only" 状态标记为 user-only。
从 v2.1.199 开始,"off" 也会从广告给远程控制客户端和Agent SDK调用者的命令列表中隐藏技能,除了终端 / 菜单。按其全名调用隐藏的技能仍然返回 skillOverrides 错误而不是运行它。
不在 skillOverrides 中的技能被视为 "on"。下面的示例将一个技能折叠为其名称,并完全关闭另一个:
checkup 用于 /doctor。如果你在托管设置中或在你使用 --settings 标志传递的文件中的别名下设置 skillOverrides 条目,Claude Code 会将其应用于别名后面的技能。你只能通过别名进一步限制技能,永远不能使其更可见,如果你也在托管设置中的技能自己的名称下设置条目,该条目优先。在 v2.1.260 之前,Claude Code 不会在任何设置源中的别名下应用条目到技能。
在用户、项目和本地设置中,Claude Code 仅针对技能名称匹配条目。如果你在那里为 review 设置条目,它适用于名为 review 的技能,而不是通过其 /review 别名的捆绑 /code-review。
插件技能不受 skillOverrides 影响。通过 /plugin 管理那些。
查找未使用的技能
技能列表中的每个技能都会在每个轮次上添加到你的上下文中,无论 Claude 是否曾使用过它。运行/skill-doctor 以查看每个技能的成本以及它被使用的频率,以便你可以决定关闭哪些。在交互式会话中,报告在 /plugin 管理器的 Stats 选项卡中打开。在非交互模式中使用 -p,Claude Code 将其打印为文本。
该报告涵盖你的会话中的技能,除了捆绑技能和企业技能。它标记列表中从未被调用的技能,并说明在哪里关闭它们。在它告诉你在哪里关闭的技能中,从具有最高上下文成本的技能开始。该报告还列出你最近未使用的插件。
/skill-doctor 需要 Claude Code v2.1.252 或更高版本,在跳过功能标志获取的会话中不可用。如果你从你的手机或浏览器通过远程控制运行 /skill-doctor,Claude Code 回复Skill usage reports are not available on this connection.。在运行会话的机器上的终端中运行 /skill-doctor。
评估和迭代技能
看到技能触发告诉你 Claude 找到了它,但不代表它做了你想要的事情。要知道技能是否有效,需要分别测量两件事:Claude 是否在应该调用的提示上调用它,以及当它调用时输出是否与你的预期相符。 两者的检查都是基线比较。收集几个现实的提示,在启用技能的新会话中运行每个提示,然后在禁用技能的情况下再运行一次,并比较结果。新会话很重要,因为编写技能时留下的上下文会掩盖书面说明中的差距。 两个工具可以自动化该比较。对于在插件中发布的技能,claude plugin eval在隔离会话中运行每个提示,既有插件也没有插件,使用你定义的或它为你编写的评分器对其进行评分,并在低于阈值时以非零状态退出,以便你可以在 CI 上对其进行门控。对于在 Claude Code 对话中迭代单个技能,下面的 skill-creator 插件使用其自己的 evals/evals.json 格式运行类似的循环。这两种格式不可互换。
使用 skill-creator 运行评估
skill-creator 插件在 Claude Code 内自动化比较循环。从官方市场安装它:
Marketplace "claude-plugins-official" not found:使用/plugin marketplace add anthropics/claude-plugins-official添加市场,然后重试安装。- 插件在市场中找不到:检查插件名称。
Run /reload-plugins to activate.,Claude Code 随后会为你运行该重新加载。如果重新加载警告你的下一条消息会重新读取对话,请运行 /reload-plugins --force 以在当前会话中使插件的技能可用。然后要求 Claude 评估现有技能,例如 evaluate my summarize-changes skill with skill-creator。该插件会引导你编写测试用例并运行循环:
- 测试用例:在技能目录内的
evals/evals.json中存储提示、输入文件和预期行为 - 隔离运行:为每个测试用例生成一个子代理,以便每次运行都从干净的上下文开始,并记录令牌计数和持续时间
- 评分:针对输出检查每个断言,并将通过或失败以及证据写入
grading.json - 基准:将有技能与无技能的通过率、时间和令牌聚合到
benchmark.json中,以便你可以比较通过率改进与令牌和时间开销 - 版本比较:在技能的两个版本之间运行盲 A/B 测试,以便你可以在提交编辑之前确认它是一个改进
- 描述调整:生成应该触发和不应该触发的提示,测量命中率,并在技能在错误的请求上激活时提议描述编辑
- 审查查看器:打开一个 HTML 报告,你可以在其中检查每个输出并记录下一次迭代读取的定性反馈
分享 skills
Skills 可以根据你的受众在不同的范围内分发:生成可视化输出
Skills 可以捆绑并运行任何语言的脚本,为 Claude 提供超越单个提示符可能实现的功能。一种模式是生成可视化输出:在浏览器中打开的交互式 HTML 文件,用于探索数据、调试或创建报告。 此示例创建一个代码库浏览器:一个交互式树形视图,你可以在其中展开和折叠目录、一目了然地查看文件大小,并通过颜色识别文件类型。 创建 Skill 目录:~/.claude/skills/codebase-visualizer/SKILL.md。描述告诉 Claude 何时激活此 Skill,说明告诉 Claude 运行捆绑的脚本。脚本路径使用 ${CLAUDE_SKILL_DIR},因此无论 skill 是在个人、项目还是 plugin 级别安装,它都能正确解析:
~/.claude/skills/codebase-visualizer/scripts/visualize.py。此脚本扫描目录树并生成一个自包含的 HTML 文件,包含:
- 一个摘要侧边栏,显示文件计数、目录计数、总大小和文件类型数量
- 一个条形图,按文件类型(按大小排名前 8)分解代码库
- 一个可折叠树,你可以在其中展开和折叠目录,带有颜色编码的文件类型指示器
Generated /path/to/codebase-map.html,并在浏览器中打开它。如果你在无浏览器环境中工作,其中没有浏览器打开,打印的路径确认脚本成功。
此模式适用于任何可视化输出:依赖关系图、测试覆盖率报告、API 文档或数据库架构可视化。捆绑的脚本完成工作,而 Claude 处理编排。
故障排除
Skill 未触发
如果 Claude 在预期时没有使用你的 skill:- 检查描述是否包含用户会自然说出的关键词
- 验证 skill 是否出现在
What skills are available?中 - 尝试重新表述你的请求以更接近描述
- 如果 skill 是用户可调用的,使用
/skill-name直接调用它
/skill-name 仍然有效,但 Claude 无法匹配你的 description。使用 --debug 运行以查看解析错误。
如果 skill 在 plugin 中,你可以在现实提示中测量它触发的频率,而不是逐个检查:使用 tool_used: Skill grader 编写一个 eval case,并在每次描述更改后使用 claude plugin eval 运行它。
要找到 frontmatter 无法解析的 SKILL.md 文件,在 skills 目录上运行 claude plugin validate,例如对于项目 skills 运行 claude plugin validate .claude/skills,或对于个人 skills 运行 claude plugin validate ~/.claude/skills。需要 Claude Code v2.1.233 或更高版本。
Skill 触发过于频繁
如果 Claude 在你不想要的时候使用你的 skill:- 使描述更具体
- 如果你只想要手动调用,添加
disable-model-invocation: true
Skill 描述被截断
Claude Code 将 skill 名称和描述的列表加载到上下文中,以便 Claude 知道有哪些可用。列表始终包含每个 skill 名称,但如果你有很多 skills,Claude Code 会缩短描述以适应列表的字符预算,这可能会删除 Claude 需要匹配你的请求的关键词。预算按模型上下文窗口的 1% 进行缩放。当列表溢出时,Claude Code 从你调用最少的 skills 开始删除描述,所以你使用最多的 skills 保持其完整文本。 运行/doctor 以估计列表的上下文成本及其最大贡献者。要找到值得关闭的 skills,运行 /skill-doctor。当列表超过其预算时,Claude Code 也会向调试日志写入警告,可通过 --debug 查看。
/context 中的 Skills 行报告应用预算后列表的大小,因此它与模型接收的内容相匹配。在 v2.1.196 之前,该行计算每个描述的完整文本,可能显示的值比配置的预算大几倍。
要提高预算,设置 skillListingBudgetFraction 设置(例如 0.02 = 2%)或 SLASH_COMMAND_TOOL_CHAR_BUDGET 环境变量为固定字符数。要为其他 skills 释放预算,在 skillOverrides 中将低优先级条目设置为 "name-only",以便它们在没有描述的情况下列出。你也可以在源处修剪 description 和 when_to_use 文本:将关键用例放在首位,因为每个条目的组合文本被限制在 1,536 个字符,无论预算如何。该上限可通过 skillListingMaxDescChars 配置。
个人 skills 消失了
如果你在~/.claude/skills/ 中创建的 skill 文件夹消失了,请查看 ~/.claude/skills/.trash/。当 Claude Code 从 claude.ai 同步 skills 时,它会将它们下载到单独的 synced 子文件夹中,不会移动或删除你创建的文件夹。
在 v2.1.280 之前,~/.claude/skills/ 中名为 manifest.json 的文件会导致 Claude Code 将该文件列出的 skill 文件夹移动到 ~/.claude/skills/.trash/ 下的带时间戳的文件夹中,这些 skills 停止加载。
要恢复一个 skill,将其文件夹从带时间戳的文件夹移回 ~/.claude/skills/。在 保留扫描 删除垃圾条目之前执行此操作,默认情况下在移动到垃圾箱后 30 天。
相关资源
- 调试你的配置:诊断为什么 skill 没有出现或触发
- 在 agentskills.io 上评估 skill 输出质量:eval 文件格式和迭代工作流
- Skill 创作最佳实践:适用于 Claude 产品的写作指导
- Subagents:将任务委派给专门的代理
- Plugins:打包和分发 skills 与其他扩展
- Hooks:围绕工具事件自动化工作流
- Memory:管理 CLAUDE.md 文件以获得持久上下文
- Commands:内置命令和捆绑 skills 的参考
- Permissions:控制工具和 skill 访问
- Claude Tag skills:提交到仓库的项目 skills 在该仓库在 Claude Tag 频道中使用时也会加载