一再重复的痛苦

你是否曾经不得不一遍又一遍地向某人解释相同的内容?那就想象一下,这种情况还是发生在一台几小时内就会“忘记”你的话的机器人上。

“Claude,提交操作前必须通过测试。” “Claude,我跟你说过要用格式 类型: 描述。” “别加表情符号,拜托!”

这就是我每天的写照,直到我发现了 技能(Skills)。简单来说,就是你只需写一次指令,Claude会永远听以执行。就像训练一只狗一样,只不过这次不需要狗粮。

什么是技能?

从 2.1.3 版本开始,Claude Code 将之前的 斜杠命令(slash commands) 合并成了一种更强大的功能:技能(Skills)。它们是 Markdown 文件,Claude 可以通过以下两种方式执行:

  1. 手动:当你输入 /我的技能 时触发
  2. 自动:当 Claude 检测到应该使用它时触发

第二点是这个功能的魔力所在。你再也不需要记得手动调用命令了。如果你设置了一个技能,告诉系统:“在用户完成任务且存在未提交更改时使用”,Claude 会自动帮你完成。

它就如同一个不需要你吩咐也会知道什么时候该收拾餐桌的管家。

技能存放在哪里?

~/.claude/skills/          # 个人技能(适用于所有你的项目)
.claude/skills/            # 项目技能(与团队共享)
~/.claude/commands/        # 旧版支持,仍然可用
.claude/commands/          # 旧版支持,仍然可用

如果你希望只有你自己可以使用某个技能,可以将其放在 home 目录下。如果你希望整个团队都能用它,则可以将其提交到代码库中。就是这么简单。

技能的基本结构

一个技能是包含 YAML frontmatter 和内容的 Markdown 文件:

---
name: mi-skill
description: 简要描述此技能的功能
---

# 指令

当调用此技能时,Claude 应执行的具体操作。

这已经是最简单的形式了。但其实 frontmatter 中还有更多值得关注的选项。

必填字段

name

技能的唯一标识符。只能使用小写字母、数字和连字符(最多 64 个字符)。这个字段必须和文件名或文件夹名称一致。

name: check-types      # ✓ 合法
name: Check_Types      # ✗ 非法(含大写字母和下划线)

description

这是最重要的字段。 Claude 使用这个字段来:

  1. 决定何时自动调用技能
  2. 理解技能的功能

最多 1024 个字符。请使用用户自然会说的关键词。

# 错误 —— 描述过于笼统
description: 处理提交操作

# 正确 —— 描述具体且有触发条件
description: >
  创建 Git 提交时验证代码类型检查、代码风格和测试。
  当用户说“提交”、“保存更改”或完成任务并有未提交更改时使用。

可选字段

model

为此技能指定特定的模型。适用于需要更多计算能力的任务。

model: opus    # 用于安全审核和复杂重构
model: sonnet  # 性能与成本的平衡选择
model: haiku   # 适合简单、快速的任务

如果不指定,将使用当前会话的默认模型。

allowed-tools

限制 Claude 可以使用哪些工具。对于只读或安全技能来说非常重要。

# 只能读取,不能修改
allowed-tools:

  - Read
  - Grep
  - Glob

# 只能执行特定命令
allowed-tools:

  - Bash(git:*)      # 仅允许 Git 命令
  - Bash(uv:*)       # 仅允许 uv 命令
  - Read

实际示例:一个不能改变任何内容的分析技能:

---
name: analyze-deps
description: 分析项目的依赖关系而不修改任何内容。
allowed-tools:

  - Read
  - Grep
  - Bash(uv pip list:*)
---

context: fork

在独立的子代理中执行技能,该子代理具有自己的上下文。主对话记录不会被污染。

context: fork

适用于多步复杂操作,避免在聊天中添加多余信息。

agent

此字段仅在 context: fork 指定时有效。定义执行技能的代理类型。

context: fork
agent: Explore    # 快速探索代理
agent: Plan       # 规划代理

user-invocable

控制技能是否显示在 / 菜单中(斜杠命令)。默认值为 true。

user-invocable: false  # 不在菜单中显示,但 Claude 可以自动调用

适用于只应在自动触发时使用的内部技能。

disable-model-invocation

禁止 Claude 自动调用此技能。只有你能通过 /技能名称 激活它。

disable-model-invocation: true

适用于需要明确人工决策的破坏性或成本高昂的操作。

hooks

定义技能生命周期内执行的钩子。支持 PreToolUse、PostToolUse 和 Stop。

hooks:
  PreToolUse:
    - matcher: "Bash"
      hooks:
        - type: command
          command: "./scripts/validate-input.sh $TOOL_INPUT"
          once: true

替代变量

在技能的内容中可以使用:

变量含义
$ARGUMENTS调用 /skill arg1 arg2 时的参数
${CLAUDE_SESSION_ID}当前会话的 ID(用于日志记录)

总结表

字段必填作用
name✓技能标识符
description✓使用技能的条件和功能描述
model指定特定模型
allowed-tools限制工具使用范围
contextfork 表示使用独立子代理
agent使用的代理类型(需配合 context: fork)
user-invocable控制是否出现在斜杠命令菜单中
disable-model-invocation禁止自动调用
hooks定义生命周期中的钩子

完整示例

---
name: security-audit
description: >
  OWASP 安全审核。当需要检查安全问题、查找漏洞,或上线生产环境前使用。
model: opus
allowed-tools:

  - Read
  - Grep
  - Glob

user-invocable: true
disable-model-invocation: true  # 仅手动触发,因耗时较长
---

# 安全审核

[instrucciones...]

更多参考,请查看 Agent Skills 官方文档。

[…]

本文原文为西班牙语,借助AI翻译。