2.1 第一个技能包——从 5 行开始
什么是技能包?
技能包是 AI 编程工具的可复用能力单元。它解决的核心问题是:
每次和 AI 对话都要重复说明同样的要求——代码风格、审查标准、部署流程……能不能把这些"一次性说清楚,后续自动应用"?
技能包的本质:
- 一次定义:把重复的指令写成一个配置文件
- 自动加载:AI 在合适的时机自动读取并应用
- 按需触发:通过命令或对话触发特定能力
各工具的技能包实现
| 工具 | 实现方式 | 文件结构 | 触发方式 |
|---|---|---|---|
| Claude Code | Skills 目录 | .claude/skills/name/SKILL.md | /name 命令或自动发现 |
| Cursor | Custom Commands | 设置 → Commands → 自定义 | 快捷键或手动调用 |
| Windsurf | Cascade Rules | .windsurfrules 内规则块 | Cascade 自动匹配文件路径 |
| Cline | Custom Instructions | .clinerules 或设置配置 | 自动或手动 |
| Copilot | Chat Prompts | VS Code 设置 | 手动调用 |
📋 课程说明
本节以 Claude Code 为详细示例(因其功能最完整、语法最直观),但核心概念适用于所有工具。如果你使用其他工具,请参考上表理解等效实现方式。
小王的第一个技能包(Claude Code 示例)
小王决定动手了。他打开编辑器,在项目下创建了一个文件:
.claude/skills/hello/SKILL.md5 分钟后,他在 Claude Code 中输入 /hello——Claude 向他打招呼,并告诉他当前时间。
这就是技能包。 没有安装命令,没有编译步骤,没有配置文件。一个 Markdown 文件,就能给 AI 装上新的能力。
创建你的第一个技能包(Claude Code 详细教程)
Step 1:创建目录
mkdir -p .claude/skills/helloStep 2:写入 SKILL.md
---
name: hello
description: 向用户打招呼并报告当前时间
---
你好!当前时间是:
!`date`
请向用户打招呼,并告诉他们当前时间。Step 3:测试
在 Claude Code 中输入 /hello。
如果你看到了 Claude 的问候和当前时间——恭喜,你已经创建了第一个技能包!
这 5 行做了什么?
逐行拆解:
--- ← 配置块起始标记
name: hello ← 技能包的名字(决定 /hello 命令名)
description: 向用户打招呼... ← Claude 用它判断何时自动加载
--- ← 配置块结束标记
你好!当前时间是: ← 正文:Claude 看到的指令
!`date` ← 动态注入:执行 date 命令,结果替换占位符
请向用户打招呼... ← 正文:Claude 执行的具体任务三个关键点:
- name 决定命令名:目录名是
hello,所以命令是/hello。也可以通过name字段覆盖。 - description 决定是否自动加载:Claude 在会话开始时读取所有技能包的 description,判断哪些可能和当前对话相关。
!command`` 是预处理:在 Claude 看到内容之前执行,Claude 看到的是命令输出,不是命令本身。
让技能包自动触发
现在只有手动输入 /hello 才能用。让 Claude 在合适的时机自动调用:
---
name: hello
description: 向用户打招呼并报告当前时间。当用户说"你好"、"hello"、"几点了"时使用
---测试:不说 /hello,直接说"你好"或"现在几点了?"——Claude 应该自动加载并使用这个技能包。
💡 描述要"pushy"
Claude 倾向于不自动触发技能包。所以描述可以比直觉更主动一些——明确列出触发短语:"当用户说 X、Y、Z 时使用"。
其他工具用户怎么办?
Cursor 用户
- 在设置中创建 Custom Command
- 输入相同的 Markdown 内容作为 Prompt 模板
- 分配快捷键或手动调用
- Cursor 没有等价的自动触发功能,需手动执行
Windsurf 用户
- 在
.windsurfrules中添加规则块:
hello-command:
instructions: |
向用户打招呼并报告当前时间。
使用命令获取时间并输出。- Windsurf 没有等价的
/命令触发方式,需通过 Cascade 自动分析触发
Cline/Copilot 用户
- 在插件设置中配置 Custom Instructions
- 各插件实现方式不同,请参考插件文档
添加参数(Claude Code 特性)
让技能包支持自定义问候对象:
---
name: hello
description: 向用户打招呼并报告当前时间
argument-hint: "[name]"
arguments:
- name
---
向 $name 打招呼!当前时间是:
!`date`
请热情地向 $name 问好,并告诉他们当前时间。测试:输入 /hello 小明,Claude 会向小明打招呼。
参数系统(Claude Code 特性):
arguments定义命名参数的顺序$name在正文中引用参数值argument-hint在自动补全时显示提示(如[name])- 也可以用
$ARGUMENTS(全部参数)或$0、$1(按索引)
⚠️ 参数是 Claude Code 特有功能
Cursor、Windsurf 等工具的参数传递方式不同,通常需要在 Prompt 中手动描述参数占位符。
变量替换速查(Claude Code)
| 变量 | 含义 | 示例 |
|---|---|---|
$ARGUMENTS | 所有参数 | /fix 123 urgent → "123 urgent" |
$0、$1 | 按索引的参数 | /fix 123 urgent → $0 = 123 |
$name | 命名参数 | arguments: [issue-num] → $issue-num |
${CLAUDE_SESSION_ID} | 当前会话 ID | 用于日志记录 |
${CLAUDE_SKILL_DIR} | 技能包所在目录 | 用于引用脚本路径 |
本节小结
📌 本节核心要点
- 技能包是可复用能力单元:一次定义、自动加载、按需触发——所有 AI 编程工具都有类似机制
- 5 行就能创建:目录 + 配置文件,无需安装或编译(Claude Code 示例)
- 三个核心要素:name(命令名)、description(触发依据)、正文(执行指令)
- 动态注入是预处理:Claude 看到的是命令输出,不是命令本身(Claude Code 特性)
- 描述决定自动触发:写好触发短语,AI 才知道何时调用
- 参数传递方式各异:Claude Code 有
$name语法,其他工具有不同实现
思考题
- (Claude Code 用户)修改你的
/hello技能包,让它同时显示当前 git 分支名。(提示:用!git branch --show-current``) - 如果你的 description 只写了"打招呼",会出现什么问题?你会怎么改进?
- 为什么动态命令注入(如
!command``)是预处理而不是让 AI 自己执行?这样做有什么好处? - (其他工具用户)你使用的工具如何实现"打招呼"这个能力?动手尝试创建。
下一节预告
5 行技能包跑通了,接下来看看技能包的完整结构——目录、配置字段和辅助文件。你不需要每次都把所有内容塞进一个文件里。