本文例行收集各类应用中优秀 Skill 的设计原则、使用技巧、应用场景,以丰富大家的使用体验!
请收藏,文档每周都会刷新和维护! 最新的更新信息:
版本:v1.03 更新:2026-08-07 收录:101

想象这样一个场景:
你请来了一位全能博士 OpenClaw,他知识渊博,非常聪明,但对你的小组、你的项目、你的公司一无所知。
而 Skills 就相当于你给他准备的"岗前培训手册"、“业务流程规范”,告诉这个博士,你们团队用什么技术栈、代码风格如何、如何部署项目……
有了这份手册,博士 OpenClaw 就能立刻进入状态,按照你们团队的做事方式快速开展。
1. Skill 结构回顾
Skill 包(技能包) 可以让智能体Agent(如 ClaudeCode、OpenCode、OpenClaw 等)学会某一特定领域的知识或工作流程,从而在处理相关任务时更专业、更高效。
是一种标准化的 AI 能力模块,本质是一个包含 SKILL.md 核心文件的文件夹,用于将特定任务的 SOP(标准作业程序)、知识、脚本和资源封装为可复用、可组合、可自动触发的单元。
AI Agent 的专项操作手册 + 执行工具包。AI Agent 的专项操作手册 + 执行工具包。纯文件、无服务、按需加载、跨平台、可组合。
1.0. Skill 发展
| 时间 | 事件 | 对 Skill 生态的影响 |
|---|---|---|
| 2023 Q4 | ChatGPT Plugin 发布 | 第一次尝试"让模型调用外部能力",但生态死于无法分发 |
| 2024 Q2 | Claude Tool Use / OpenAI Function Calling | 工具调用规范化,但 function 还是绑在 Agent 代码里 |
| 2024 Q4 | Anthropic 推出 MCP 协议 | 第一次出现"跨 Agent 的能力协议",但部署复杂(每个 MCP 是一个独立进程) |
| 2025 Q3 | Claude Code 1.0 发布 | 把 skill loading 做成一等公民,"写一个文件夹"这件事有了官方 runtime |
| 2025 Q4 | Cursor / Windsurf / Codex 陆续支持 skill 格式 | Skill 格式从 Claude 专用 → 事实上的 AI 编码工具标准 |
| 2026 Q1 | Skill 生态爆炸 | 供给端 27,720/月 |
先澄清一个常见混淆。一提到"让 AI 更聪明",市面上有 5 种方案:
| 方案 | 本质 | 加载方式 | 典型使用 |
|---|---|---|---|
| System Prompt | 对话开头的长指令 | 始终加载 | "你是一个专业的会计师……" |
| RAG | 检索相关文档 | 每次对话按相似度召回 | 问答系统、企业知识库 |
| Tool Use / Function | 模型调用外部函数 | 永久定义,按需调用 | 查天气、发邮件、调 API |
| MCP Server | 独立进程提供工具集 | 永久运行,协议对接 | 数据库连接、浏览器控制 |
| Skill | 文件夹里的 description + 指令 + 资源 | 三层按需加载 | 领域任务("审一段合同") |
1.1. Skill 的核心结构
Skill技能包的目录结构,常见如下:
my-skill/ #(1)skill(包)根目录
├── SKILL.md #(2)主文件(必须有),AI的大脑
| ├── YAML头部 #(2.1) 决定 Skill 何时被触发
| | ├── name # (2.1.1)
| | ├── description # (2.1.2)
| | └── argument-hint # (2.1.3)
| ├── 角色设定 #(2.2)
| ├── 执行流程 #(2.3)
| ├── 质量约束 #(2.4)
├── scripts/ #(3) 执行层(可选):AI的手脚,用代码搞定确定性任务
├── assets/ #(4) 模板层(可选):AI的素材库,骨架样式、图标、图片等静态资源。
├── references/ #(5) 知识层(可选):AI的知识库,API文档、规则
├── templates/ # (6) 模板(可选):AI的模具,输出模板(报告、代码、邮件)
| ├──templates.md #(6.1) 模板文件
├── examples/ # (7) 范例(可选):AI的范例,输入/输出清晰展示示例(增强理解)
| ├── examples-xx.md #(7.1) 示例输出(可选)
├── hooks/ #(8) 约束与观测(可选):记录调用、控制权限
└── _meta.json # (9)可选:版本、作者、来源等元信息(管理用)注:不同 Agent 的 Skill 结构稍有差别,但能兼容。以上蓝色为部分官方建议结构,但实际使用中可以自定义、优化和增强。
三层加载机制的官方定义在 Anthropic 的 SKILL Spec RFC 第 3.2 节。简化描述如下:
| 层 | 内容 | 加载时机 | Token 量 |
|---|---|---|---|
| L1 · description | 一句话「这个 Skill 在做什么 + 何时该激活」 | 每次对话启动时全部加载 | \~50 tokens |
| L2 · instructions | 详细操作步骤、约束、输出格式 | Agent 决定激活后才加载 | \~500-3,000 tokens |
| L3 · resources | 代码、模板、示例数据、large files | 执行过程中按 ID 拉取 | 不计入 prompt |
📣 三层加载不是 Anthropic 的工程小聪明,是 Skill 能在不爆上下文的前提下无限扩展的根本原因。description 决定 Skill 是否被看见,instructions 决定它是否被激活后做对事,resources 决定它能装下多少「重」内容而不污染 prompt。三者各司其职——这就是 Skill 区别于其他扩展机制的根本设计。
1.2. 加载原则/优先级
Skills 的逻辑很直接:在项目/或系统的目录下,集成一个 Skills 目录,里面写一个 SKILL.md 文件,告诉 Claude、OpenClaw 等智能体 Ahent 什么情况下该做什么,它会在合适的时机自动加载,你不需要每次重复提示。
Skill 在 Agent 中运作原理,请参考:【原理篇】理解 Skill 在 Agent 中运作原理,轻松实现 Skill 设计自由
不同的 Agent 定义的加载优先级稍微有区别:
skillpackage-SP-01:OpenClaw 加载规则
加载路径(优先级从高到低):后写覆盖前写,优先级高的覆盖优先级低的。
<工作区>/skills(当前项目)~/.openclaw/skills(全局共享)- 内置 Skills(OpenClaw 默认)
skillpackage-SP-02:OpenCode 加载规则
加载路径(优先级从高到低):
- < 当前工作目录 >/.opencode/skills(当前项目级 Skill,仅作用于当前工作目录下的项目,优先级最高)
- < 当前工作目录 >/.claude/skills(项目级兼容 Skill,兼容 Claude Code 格式的 Skill,优先级次之)
- < 父目录 >/.opencode/skills(父目录项目 Skill,OpenCode 启动时会向上遍历父目录,加载所有符合条件的 Skill,优先级低于当前项目级)
- < 父目录 >/.claude/skills(父目录兼容 Skill,优先级与父目录.opencode/skills 一致,按路径遍历顺序加载,后加载者覆盖先加载者)
- \~/.config/opencode/skills(全局专属 Skill,适用于当前设备上所有 OpenCode 实例,优先级较低)
- \~/.claude/skills(全局兼容 Skill,兼容 Claude Code 的全局 Skill,优先级最低)
skillpackage-SP-03:ClaudeCode 加载规则
加载路径(优先级从高到低):
- 通过--add-dir 参数指定的附加 Skill 目录(自定义共享 Skill 目录,可用于团队共享,优先级最高,需手动指定路径)
- < 当前项目目录 >/.claude/skills(当前项目专属 Skill,仅在当前项目中生效,优先级次之)
- \~/.claude/skills(用户级全局 Skill,适用于当前设备上所有 Claude Code 实例,跨项目生效,优先级较低)
- 内置 Skills(Claude Code 默认自带 Skill,随软件安装一同部署,优先级最低)
skillpackage-SP-04:通用加载原则
- 所有 Agent 均遵循“同名覆盖”规则:若不同优先级路径中存在同名 Skill,优先级高的路径中的 Skill 会完全覆盖优先级低的,低优先级 Skill 不生效。
- 加载时均优先解析 SKILL.md 文件,仅包含该文件的目录会被识别为有效 Skill,缺失该文件的目录将被忽略。
- OpenCode、ClaudeCode 支持兼容加载,可共用部分格式规范的 Skill,无需重复开发。
Skill 包 = 标准化文件夹 + SKILL.md 核心指令 + 可选资源。它让 AI 从 “通用助手” 升级为 “领域专家”,一次编写,随处复用,是构建可靠 AI Agent 的核心单元。
1.3. Skill 设计原则
💡 要从"Agent 视⻆"写 Skill
大多数人写 Skill 的时候,脑子里想的是"我怎么给人解释这件事"。宝玉反复强调一个反直觉的操作——要从 Agent 的视角去写,不是从人的视角。
这个差异看起来微小,实际决定生死。
人视角的 Skill(错误示范):
# 代码审查助手
这个 skill 帮你做代码审查。
## 怎么用
按需使用即可。Agent 视角的 Skill(对的示范):
---
name: code-review
description: Review code for bugs, style, and maintainability.
Use when: (1) user explicitly asks for code review, (2) user shares code
and says "look at this", (3) before any git commit / PR creation.
---
## Required Output Format
You MUST output a markdown table:
| File:Line | Severity | Issue | Suggested Fix |
| --- | --- | --- | --- |
Do NOT use prose. Do NOT use bullet lists. Use the table format above.
## Before You Start
1. Run `git diff HEAD` first to see what changed
2. If no diff, run `git log -5` to identify last 5 commits
3. Only review files that actually changed两者的差异不是长度,是对"读者"的假设。
人写 Skill 时默认读者"会察言观色"——看到"按需使用"能自己推断什么是"按需"。Agent 不会。Agent 需要显式触发条件(when)、显式输出格式(MUST use table)、显式前置步骤(run git diff first)。
2026 年 3 月出现的一个被低估的 skill——894 stars、1 个 SKILL.md、27KB。作者是 Sonner、Vaul、next-view-transitions 的作者 Emil Kowalski,React 设计工程圈的顶流。
他的 SKILL.md 里有一段让我停下来读三遍的东西:
## Review Format (Required)
When reviewing UI code, you MUST use a markdown table with
Before/After columns. Do NOT use a list with "Before:" and "After:"
on separate lines. Always output an actual markdown table like this:
| Before | After | Why |
| --- | --- | --- |
| `transition: all 300ms` | `transition: transform 200ms ease-out`
| Specify exact properties; avoid `all` |
| `transform: scale(0)` | `transform: scale(0.95); opacity: 0`
| Nothing in the real world appears from nothing |注意几个细节:
- Required 而不是 "recommended"——不给 Agent "看情况" 的余地
- 示例 Before/After/Why 三列——强制结构
- "Do NOT use prose"——明确排除 Agent 最容易堕落的回答方式(废话)
Nothing in the real world appears from nothing——给 "为什么" 附带可记忆的认知 anchor,帮 Agent 理解而不是死记
这份 SKILL.md 是"把人的 craft sensibility 翻译成 Agent 可读 enforce 规则"的经典样本。
skillpackage-PR-01:Skill 核心设计原则-单一、分层、清晰、明确、灵活、复用、工程化规范。
- 单一职责:一个 Skill 专注完成一项任务。
- 资源分层加载,SKILL.md 轻量化:元数据 → 指令 → 脚本 / 参考 / 资源(按需加载),复杂逻辑拆分到
scripts/、references/,大文档放references/,保持SKILL.md简洁。 - 清晰触发:
description精准描述何时调用。 - 步骤明确:指令分步、可执行、无歧义。
- 确定性脚本:重复 / 计算逻辑放入
scripts/,避免 AI 出错。 - 确定性与灵活性分离:精确操作 →
scripts/;判断生成 →SKILL.md - 可复用、可测试:示例 + 模板 + 脚本,独立验证、随处复用
- 工程化规范:统一命名、目录结构、版本管理,团队协作友好
以下为持续积累的 Skill 写作技巧详细总结。
1.4. 公共技巧
如下是一些公共类的 Skill 设计技巧,可作为所有设计活动的参考
skillpackage-PR-02:单一职责优先原则
当开发一个综合性 AI 助手 Skill 时,需要处理多种不同类型的任务,优先将复杂的多功能 Skill 拆分为独立的专业 Skill。
每个 Skill 应该只负责一项特定功能,避免 "万能 Skill" 的设计。成功案例表明,将复杂功能拆分为专业 Skill 后,准确率可从 62% 提升到 90%。
💡原⼦化——⼀个 Skill 只做⼀件事,不要搞成⼤⽽全。但 :原⼦化 ≠ 越短越好。
✅ 举例:开发一个客服系统需要同时处理订单查询、退货、产品咨询、投诉等功能的 Skill 时,
优先将复杂的多功能 Skill 拆分为独立的专业 Skill,如下:
- router-skill → 判断用户意图,派给对应的专家
- order-status-skill → 只管订单查询
- return-skill → 只管退货
- product-qa-skill → 只管产品咨询
这样做的好处是:
- 易于测试和维护
- 便于复用和分享
- 每个 Skill 的提示词都很简单,因为只需要处理一类问题
- 几天时间,准确率从 62% 提升到 90%
❌ 错误做法:
创建一个大而全的 "万能"Skill,试图一网打尽所有功能。
某电商平台客服 Agent 团队最初的做法是写一个包含订单查询、退货、产品咨询、投诉等所有功能的大 Skill,经过 80 多次迭代,3 周时间,团队凭感觉觉得 "挺好的"。
然后他们做了关键的事 —— 建了 100 个真实问题的评估集,实际准确率仅为 62%。
skillpackage--3:Skill 可传入参数,用 $ARGUMENTS 实现灵活输入
Skill 支持参数传入。你可以设计成:/test-case-design 需求描述 是直接输入文本,也可以是 /test-case-design 不加参数,让 Claude 主动问你要信息。
两种模式都支持,在 SKILL.md 里加一段判断:
## 输入处理
如果 $ARGUMENTS 不为空,直接基于它开始分析。
如果 $ARGUMENTS 为空,主动询问用户:
1. 要测试的功能是什么?
2. 有需求文档或接口文档吗?如果有,给我路径。
3. 有没有特别关注的测试维度?当用户调用 /skill-name 时,可以传入参数,技能内用变量引用:
| 变量 | 说明 | 示例 |
|---|---|---|
| $ARGUMENTS | 所有参数,合并为字符串 | /fix-bug 1234 → "1234" |
| $ARGUMENTS[N] | 第 N 个参数(从 0 开始) | $ARGUMENTS[0] → 第 1 个参数 |
| $0, $1, $2... | $ARGUMENTS[N] 的简写 | $0 同 $ARGUMENTS[0] |
| ${CLAUDE\_SESSION\_ID} | 当前会话 ID | 用于日志、临时文件命名 |
| ${CLAUDE\_SKILL\_DIR} | 技能目录的绝对路径 | 引用捆绑脚本时使用 |
单参数示例
---
name: fix-issue
description: 修复 GitHub Issue
disable-model-invocation: true
---
修复 GitHub Issue #$ARGUMENTS,遵循以下步骤:
1. 阅读 Issue 描述
2. 分析根本原因
3. 实现修复
4. 编写测试
5. 提交代码执行 /fix-issue 42 时,Claude 收到的指令变为 "修复 GitHub Issue #42,遵循以下步骤……"
多参数示例
---
name: migrate-component
description: 将组件从一个框架迁移到另一个框架
---
将 $0 组件从 $1 迁移到 $2。
保留所有现有功能和测试,不引入行为变更。执行 /migrate-component SearchBar React Vue 时,Claude 收到:"将 SearchBar 组件从 React 迁移到 Vue……"
skillpackage--4:给信息,别设限
Skill 会尽量遵循我们的指令,增大可重用性,指令太具体会限制适应性和重用性。
特别是给出的模板、示例等要求时,要注意限制度。
举例:
❌ 写一个”生成 API 文档“的 Skill 时,写死了输入输出格式、章节顺序、示例数量等太具体的要求,规定它必须怎么写(特殊情况除外)。
✅ 写一个”生成 API 文档“的 Skill 时,给出 API 的规范是什么”
skillpackage--5:拆解内容,用文件系统做渐进式披露
当设计一个包含大量专业知识的 Skill 时,如何让 AI 在需要时加载相关信息,而不是一次性加载所有内容。
借助于信息分层,做适当的层次化,不要把所有东西都塞进一个文件,大模型的上下文是有限的。
特别是有工具、接口、示例、附加信息、扩展信息等等情况下,尽可能的分层。
举例 1:
❌ 写一个”生成 API 文档“的 Skill 时,把所有相关的信息都塞进一个 Skill 里,文件有几 M 大。
✅ 写一个”生成 API 文档“的 Skill 时,强调要满足规范“,并把这个规范放进 References 下面。
举例 2:
✅ 当 Skill 包含大量内容时,设计加载机制以优化性能和用户体验。
技能使用三层加载架构,确保智能体只加载它们需要的内容:
- 触发阶段:当请求与技能描述匹配时,大模型加载完整的 SKILL.md 指令
- 执行阶段:仅在需要时,大模型读取额外的参考文件和脚本
这种渐进式披露是使 Agent Skills 灵活且可扩展的核心设计原则。
例如,品牌风格 Skill 的设计:
- 主文件只有基础配色和两行条件引用
- 创建演示文稿时 → 读 slide-decks.md
- 创建专业文档时 → 读 docs.md
做 PPT 不会被文档模板干扰,写文档不会加载 PPT 配色,两个场景互不污染,各自只用最小的上下文。
❌ 品牌风格 Skill 的设计:
将所有参考文档、脚本、模板都直接包含在 SKILL.md 中,导致文件大小超过 5000 词,加载时间增加 3-5 倍,用户体验严重下降。
一次性加载所有相关资源,导致初始加载时间过长。
举例 3:
❌ 错误做法:
某客服 Agent 在用户还没说第一句话之前,上下文就被塞了超过 2 万 tokens 的信息(完整知识库 8000 tokens、CRM 客户历史 5000 tokens、过往工单 4000 tokens、公司政策全文 3000 tokens),结果导致:
- 响应慢,成本高
- 经常答非所问
- 上下文窗口很快被填满(59)
一次性加载所有相关知识,导致上下文爆炸。
✅ 正确做法:
采用三层加载架构:
- 元数据层(始终加载)— front matter 名称和描述决定技能是否激活
- 指令层(激活时加载)— SKILL.md 主体包含核心工作流程
- 资源层(按需加载)— 参考文件,根据任务上下文有条件地加载
例如,某客服 Agent 处理 Skill 设计:
- SKILL.md → 主入口,200 词左右,解决用户哪一类问题,清晰明确的列举
- reference.md → 高级参考文档,具体的场景
- forms.md → 用户意见的表单填写专项指南
SKILL.md 只有一个简单的概述和快速入门代码,然后写了关键的话:"如果需要填写表单,读 forms.md"。
skillpackage--6:一致性原则**,一个 Skill 里,保持一致性的命名、格式、规范、术语等等
在整个 Skill 系统中保持一致的命名、格式和交互方式,提升用户体验的连贯性。
举例 1:
❌ 命名不规范或使用不一致的术语。
某团队在 Skill 开发中混用 "API endpoint"、"URL"、"API route"、"path" 等术语,导致 AI 理解混乱,行为不一致。
✅ 写一个 Skill 里,保持一致的命名、格式和交互方式,提升用户体验的连贯性:
- 统一命名规范,使用短横线命名法(kebab-case)
- 保持指令格式的一致性
- 使用一致的术语和概念表达
Skill 命名必须遵循严格规则:
- 有效名称:git-release、docker-build、pr-review、test-123、my-cool-skill
- 无效名称:Git-Release(大写)、git\_release(下划线)、git release(空格)、-git-release(以短横线开头)、git-release-(以短横线结尾)、git--release(连续短横线)
除了 SKILL.md 文件内容风格要一致性外,相应的 scripts/references/assets/examples 等等,也要保持类似:多方拼凑的内容,需要开展检查或优化,不然导致准确率低下!
skillpackage--7:安全性原则,必须考虑安全性,防止恶意输入或意外操作造成的损害
在设计 Skill 时必须考虑安全性,防止恶意输入或意外操作造成的损害。
举例 1:
✅ 写一个 Skill 里,必须考虑安全性,防止恶意输入或意外操作造成的损害,如:
- 使用 bash 时防止命令注入。
- 实施最小权限原则。
- 对敏感操作进行用户确认。
Anthropic 官方最佳实践强调:安全第一 - 使用 bash 时防止命令注入。
【极端情况】零信任架构的核心原则是 "永不信任,始终验证":
- 每个 Skill 调用都必须经过身份验证和授权检查。
- 所有输入(包括用户输入、工具返回、第三方数据)都不可信。
- 只授予完成特定任务所需的最小权限。
- 所有操作都必须被记录和审计。
❌ 忽视安全防护,直接执行用户提供的命令或数据。
某生产环境的 AI Agent 在 4 天内用 Codex 构建了 29K 行代码,结果出现了凭证泄露、无声事件循环死亡等严重安全问题。
安全是 SKILL 的核心基本要求,不然导致严重安全问题!
skillpackage--8:性能优化原则,在保证功能完整性的前提下,通过技术手段优化 Skill 的执行性能
在设计 Skill 时必须考虑性能,防止执行效率低下。
举例 1:
✅ 写一个 Skill 里,常见的性能优化手段,举例 如:
- 固定系统提示前缀,避免动态时间戳、随机 ID 导致缓存失效
- 提示词压缩:用 "代码片段 + 问题描述" 的结构化提示,替代完整代码文件传输,Token 用量减少 60%
- 智能路由:简单语法纠错用 Llama 3 8B,复杂功能开发用 GPT-4,成本降低 58%
- 缓存策略:缓存常用函数示例、API 文档,查询响应速度提升 70%
❌ 忽视性能优化,导致执行效率低下。
某数据分析 Skill 每次执行都重新加载所有依赖库和数据,没有任何缓存机制,导致相同任务的执行时间是优化后版本的 10 倍。
skillpackage--9:版本控制原则,确保能够追踪变更历史和回滚到稳定版本
对 Skill 的开发过程进行版本控制,确保能够追踪变更历史和回滚到稳定版本。
举例 1:
✅ 正确做法,举例:
- 使用 Git 进行版本控制
- 为每个 Skill 创建独立的版本分支
- 编写清晰的提交信息
- 定期进行代码审查
- ...
Anthropic 官方最佳实践强调:版本控制 - 使用 git 跟踪技能变更。
建议为每个 Skill 创建独立的 Git 仓库,或者在项目仓库中为 Skill 创建独立的目录结构,通过版本控制追踪所有变更历史。
❌ 没有版本控制,直接在生产环境中修改 Skill。
某团队直接在生产环境的服务器上修改 Skill 文件,没有任何版本控制,导致出现问题时无法回滚,也无法追踪问题产生的原因。
skillpackage--10:测试驱动原则,确保功能的正确性和稳定性
在 Skill 开发过程中实施全面的测试策略,确保功能的正确性和稳定性。
举例 1:
✅ 正确做法,举例:
- 为每个 Skill 编写单元测试
- 进行集成测试,验证 Skill 与其他组件的协作
- 在生产部署前进行充分的测试
- 建立自动化测试流程
- ...
Anthropic 官方最佳实践强调:测试 - 在生产部署前始终测试技能。建议使用自动化测试框架对 Skill 进行全面测试,包括功能测试、边界测试、异常测试等。
❌ 没有测试或仅进行简单的手动测试。
某团队在开发一个关键业务 Skill 时,仅进行了简单的功能测试就部署到生产环境,结果在面对复杂输入时出现各种问题,导致业务中断。
skillpackage--11:Skill **约束条件写死,灵活空间留给输入
这项技巧的本质是在 Skill 内部固化 “规则与边界”,在运行时通过 “输入参数” 赋予 “弹性与变化”。
简单来说:
- 写死:把不可变的规则、阈值、标准、格式写死在代码或配置中(如
max_length=100、allowed_roles=["admin"])。 - 留活:把会变的内容、个性化数据、外部变量,通过输入参数(Argument) 留给用户 / 调用方传递(如
--title "xxx"、--content "yyy")。
这样做的最大价值是:Skill 不因为小变化而频繁改代码,保持高稳定性与复用性。
3 条黄金执行原则:
原则 1:凡是 “标准 / 底线”,写死;凡是 “内容 / 变量”,留输入**
- 写死(不可变):业务规则、强制格式、权限白名单、阈值、错误码。
- 留活(可变):用户输入、动态数据、时间戳、外部参数。
原则 2:参数化所有输入
- 在
SKILL.md的argument-hint或脚本的param()中显式声明所有需要外部传入的变量。 - 禁止在脚本内部硬编码入参(除了常量)。
原则 3:约束集中管理
- 虽然写死,但不要分散写死。把所有常量 / 规则集中在一个文件或模块头部,便于统一修改。
案例 1:发送飞书 / 钉钉消息
❌ 把内容写死,把规则写活 → 灾难
脚本 send_msg.ps1(如下)
问题:
- 想发 “内存已满”,得改代码。
- 阈值 95 变了,得改代码。
- AI 不知道该传什么,也没法编排。
# 糟糕!写死了消息内容,阈值写在逻辑里
# 每次想发不同消息都得改脚本
$webhook = "https://open.feishu.cn/xxx"
$msg = "磁盘已满!!!" # 写死了,只能发这一条
# 规则写死在逻辑里,不灵活
if ($disk -gt 95) {
Invoke-RestMethod -Uri $webhook -Body @{text=$msg}
}✅ 正确做法,举例:规则写死,内容留输入
脚本 send_msg.py:(如下)
SKILL.md 调用方式:
执行流程:
- 调用 scripts/get\_disk\_usage.py 获取值
- 如果 > 95
→ 调用 scripts/send\_msg.py
--message "磁盘使用率已超限"
--value {{disk\_usage}}
优势:
- 换消息内容,不改脚本,只改输入。
- 改阈值,只改一处代码,不影响业务逻辑。
# 1. 规则写死(常量写在头部,集中管理)
WEBHOOK_URL = "https://open.feishu.cn/xxx"
ALERT_THRESHOLD = 95 # 阈值写死,不再变
# 2. 内容留输入(参数化)
parser = argparse.ArgumentParser()
parser.add_argument("--message", required=True, help="要发送的消息内容")
parser.add_argument("--value", required=True, type=int, help="当前检测值")
args = parser.parse_args()
# 3. 逻辑使用死规则 + 活输入
if args.value > ALERT_THRESHOLD:
requests.post(WEBHOOK_URL, json={"content": args.message})案例 2:生成报告(templates 结合)
❌ 把标题、作者写死
脚本(如下)
问题:
每天生成日报,标题都要改,脚本得天天改。
# 坏写法:报告标题写死
title = "2024年第一季度工作总结"
author = "张三"
# 读取模板
with open("templates/report.md", "r", encoding="utf-8") as f:
content = f.read().replace("{{title}}", title).replace("{{author}}", author)✅ 正确做法:把标题、作者留输入
脚本(如下)
SKILL.md 调用方式:
执行流程:
调用 scripts/gen\_report.py
--title "{{user\_input}}"
--author "{{username}}"
优势:
传入什么标题,就生成什么报告,脚本永远不变。
# 好写法:规则写死(模板路径固定)
TEMPLATE_PATH = "templates/report.md"
# 输入留活
parser = argparse.ArgumentParser()
parser.add_argument("--title", required=True)
parser.add_argument("--author", required=True)
args = parser.parse_args()
# 读取
with open(TEMPLATE_PATH, "r") as f:
content = f.read().replace("{{title}}", args.title).replace("{{author}}", args.author)skillpackage-RE-01 :Skill 自我迭代:把踩过的坑写进文件
💡Skill 应该具备自我迭代能力**。
翻译成人话:当 Agent 在某个任务上踩了坑,应该把这次踩坑的经验写回 Skill,下次不再踩。
这个看似简单,但 Hub 里真正这么做的 Skill 不到 3%。
活案例 · cclank/news-aggregator-skill
1,001 stars、Python、MIT license 缺失但代码质量高。这个 skill 的独特之处是——作者在 repo 根目录放了一个 MISTAKES.md,长达 6,319 字节。
内容摘录:
## 📌 Issue: WallStreetCN Timestamp Ambiguity (2026-01-24)
### 1. The Error
"OpenAI Revenue... 1h ago"(但实际事件 12h 前)
### 2. Root Cause
Data Loss: 把 Unix timestamp 转成 "HH:MM" 破坏日期信息。
Context Dependent: "09:35" 只在你知道是今天时有意义。
### 3. Fix
ALWAYS use full date-time format:
datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M')
### 4. Lesson
Don't format for "Human Readability" in the raw data layer.
Let the UI decide how to display.这份 MISTAKES.md 里有 7 个这样的 case,每个都是错误现场 → 根本原因 → 修复方案 → 预防教训的四段式结构。
这是真正的自我迭代——作者不只是修了 bug,还把 bug 的元信息写进 skill 能读到的地方。下次 Agent 处理 timestamp 时会看到这条规则,不再犯同样的错。
Hub Top 500 里,repo 根目录含有 MISTAKES.md、LESSONS.md、POSTMORTEM.md 这类文件的 skill 只有 14 个(2.8%)。其中 8 个是 fork 或模板,真正主动记录的只有 6 个。
为什么这么少?三个原因:
- 反直觉:写 Skill 时大多数人想"展示成功",不是"承认失败"
- 看似无用:MISTAKES.md 不直接让 Agent 更聪明,是"第二阶元数据"
- 要求作者有工程习惯:不是 vibe coder 能持续做的
但有意思的是——这 6 个主动记 MISTAKES 的 skill,平均 quality\_score 是 55.8,比 Top 500 整体平均(47.2)高 8.6 分。
样本小,但信号清晰:愿意写 MISTAKES.md 的作者,整体工程素养也更高。
这解释了为什么宝玉把 "自我迭代" 列为四条之一——它不是技术动作,是一种工程品性的外化。
2. SKILL.md 主文件
SKILL.md 是 skill(包)中的主文件,唯一必需文件,是 AI 的 “大脑”,是对本 skill 的导入性索引,定义技能名称、触发条件、执行步骤、输入输出、约束,让 Agent 知道有什么技能,AI 据此判断何时调用、如何执行。
Skill 设计理念:
「Skill 越多越好」 vs 「上下文越短越好」——这两件事天然冲突。
如果你只装 1 个 Skill,体验也许不错;装 10 个,每个都把完整 instructions 塞进 system prompt,模型还能扛;装 100 个,token 数直接爆炸——而且大多数 Skill 这次任务根本用不上。
这是一个看似无解的问题。直到三层渐进加载(three-stage progressive loading)方案出现,它的核心洞察很简单:
不是所有 Skill 内容都需要在每次对话开始时就被加载。Agent 只需要先看到「索引」,决定要不要展开「正文」,再在执行时按需 fetch「资源」。
这跟数据库设计里的「索引 vs 表」、跟 IDE 的「Lazy Loading」、跟操作系统的「Virtual Memory」是同一个思想——先描述,后加载。
但 Anthropic 的特殊在于:他们把这套机制烧进了 SKILL.md 的格式里,让所有作者必须遵守,于是这个分层加载变成了生态级的资产。
Hub 数据里的 SKILL.md 大小分布印证了这个设计——Top 500 中 86% 的 SKILL.md 体积在 5-30KB。这不是巧合:5KB 是「能装下 description + 简短 instructions」的下限,30KB 是「instructions 全部塞下还不爆 8K context window」的上限。
2.1. YAML元数据(头部/顶部)
KILL.md 文件第一部分为使用YAML*格式定义 的frontmatter(前言/头部)——决定 Skill 何时被触发。
name: test-case-design
description: >
根据需求描述设计测试用例。综合运用等价类划分、
边界值分析、场景法等方法,生成结构化的测试用例
文档。当用户提到"设计用例""写测试用例""帮我
出用例""测试点分析"时触发。
argument-hint: [需求描述或功能名称]
------
version: "2.1.0"
author: "Dev Team"
tags: ["办公", "PDF", "自动化"]frontmatter(前言/头部)完整配置参考表:
| 字段 | 是否必需 | 默认值 | 说明 |
|---|---|---|---|
| name | 否 | 目录名 | 技能显示名,生成 /name 斜杠命令。只能含小写字母、数字、连字符,最长 64 字符 |
| description | 推荐 | 正文第一段 | Claude 用此决定是否自动加载。前置关键词,因为超过 250 字符会被截断 |
| argument-hint | 否 | 无 | 自动补全时显示的参数提示,如 [filename] [format] |
| disable-model-invocation | 否 | FALSE | 设为 true 时,只有你能手动触发,Claude 不会自动加载使用场景建议:true 适合有副作用的操作(部署、发送消息),你不希望 Claude 自动执行。 |
| user-invocable | 否 | TRUE | 设为 false 时,从 / 菜单隐藏,只由 Claude 自动调用使用场景建议:false 适合背景知识型技能(如 legacy-system-context),Claude 应该知道,但这不是一个有意义的"命令"。 |
| allowed-tools | 否 | 继承全局 | 此技能激活时,Claude 可无需询问直接使用的工具列表 |
| model | 否 | 继承会话 | 此技能激活时使用的模型 |
| effort | 否 | 继承会话 | 努力级别:low / medium / high / max |
| context | 否 | 内联 | 设为 fork 时,在隔离的子代理中运行 |
| agent | 否 | general-purpose | 与 context: fork 配合,指定子代理类型 |
| hooks | 否 | 无 | 技能生命周期钩子配置 |
| paths | 否 | 无 | Glob 模式,限定技能只在特定文件类型时激活。让技能只在处理特定文件时才被激活,避免污染不相关的任务 |
| shell | 否 | bash | 用于 !\`command\` 注入的 shell,可选 powershell |
2.1.1. name 技能名 章节
以关键字 name 为首定义的技能名称,唯一、清晰,格式如下:
name: test-case-design # 短横线命名,小写name--12:严格命名冲突,后写覆盖前写,优先级高的覆盖优先级低的
OC/CC 等启动时,会扫描所有可用的 Skills 的YAML元数据,记忆起来。后面有业务决策时会触发判断“这个请求该不该触发。严格遵守加载原则/优先级,不然失效。
2.1.2. description 章节
以关键字 description 为首定义的触发关键词(AI 匹配意图的核心),格式如下:
name: ...
description: >
根据需求描述设计测试用例。综合运用等价类划分、
边界值分析、场景法等方法,生成结构化的测试用例
文档。当用户提到"设计用例""写测试用例""帮我
出用例""测试点分析"时触发。
argument-hint: [需求描述或功能名称]这里有个关键细节:description 写得好不好,直接决定 Skill 能不能被自动触发。
Agent 根据 description 来判断当前对话是否匹配这个 Skill。
所以你要把用户可能说的话都列进去——"设计用例""写测试用例""出用例"等等。
description 的原则:
•前置关键词:最重要的触发关键词放在最前面,因为超过 250 字符会被截断(不同 Agent 有差异)
•描述使用场景:明确说明"何时使用",如 "当用户问……时使用"
•避免过于宽泛:太宽泛会导致技能频繁被触发,影响性能
description-SP-01:Description 长度在 80tokens内,过长会被截断
Anthropic SDK 实际上对 description 字段有一个软限制:\~80 tokens(约 50 中文字 / 60 英文词)。超过会被截断展示给 Agent。这意味着 description 不只是一句话,是一句话能装下多少有用信号。
陷阱 1 · description 写成 instructions 的复制
🚯 最常见的错误:作者把 instructions 的第一段直接搬到 description 里。结果 description 长达 200+ token,被 SDK 截断后剩下的就是「碎片」。
修法:description 要重写,不能复制。它的功能跟 instructions 不⼀样——它是「⽬录条⽬」,不是 「正⽂摘要」。
description-PR-01:Description是触发器,写给"机器"看,要精准,列清触发词,简洁明了,避免模糊
OC/CC 等启动时,会扫描所有可用的 Skills 的 Description 字段,记忆起来。后面有业务决策时会触发判断“这个请求该不该触发这个 Skill"。
Description 要回答的是:什么时候用这个 Skill,而不是“这个 Skill 是做什么的”。
description 精准:用动词 + 名词,列清触发词,避免模糊
最经济的 description 公式:
[这个 Skill 解决什么问题] + [何时该激活] + [输出形态预告]⚠️ description 写得不好,Skill 永远不会被打开,这句话决定了 Skill 的命运。
典型案例:
❌ 人类风的 description(来自 Hub uncategorized 类的常见样本):
description: A helpful skill for code review✅ Agent 风的 description(来自 emilkowalski/skill):
description: |
Review UI code for animation timing, transition smoothness,
and motion design taste. ALWAYS use when the user shares
React component code involving CSS transitions, framer-motion,
view-transitions, or asks "review this animation".
Output format: markdown table with Before/After/Why columns.差别不在长度,在信息密度:
| 维度 | 人类风 | Agent 风 |
|---|---|---|
| 触发条件明示 | ❌ | ✅(「ALWAYS use when...」) |
| 输入类型限定 | ❌ | ✅(CSS transitions / framer-motion) |
| 输出格式预声明 | ❌ | ✅(markdown table with...) |
| Token 投入 | \~10 | \~50 |
其他举例:
举例 1:避免模糊
❌ ”这是一个帮助生成周报的 Skill“
✅ ”当用户要求写周报、生成站报、输出工作汇报时触发“
举例 2:避免模糊
❌ ”处理文档“
✅ "提取 PDF 文本 / 表格、合并拆分、OCR 识别,用户说 PDF 时触发"。
举例 3:简洁明了,避免模糊
❌ 使用复杂的描述或包含过多技术细节。
某法律文档分析 Agent 的工具描述过于模糊:
- 工具 1: search\_docs-- "Search documents"
- 工具 2: get\_info -- "Get information"
- 工具 3: analyze-- "Analyze content"
这样的描述让 AI 无法准确判断何时使用哪个工具,导致准确率低下。
✅ Skill 的描述和指令需要让 AI 能够快速理解和执行,同时保持用户体验的简洁性:
- 告诉模型做什么,不是如何成为 AI
- 使用简洁的语言,避免冗余描述
- 重点突出核心功能和使用场景
Anthropic 官方最佳实践强调:简洁明了 - 告诉模型做什么,不是如何成为 AI。
例如,一个优秀的 Git 提交信息生成 Skill 描述:"Create consistent releases and changelogs. Use when committing code changes, writing commit messages, or formatting git history"。
Skill 描述要简洁,告诉模型做什么而不是如何做,使用用户实际会说的语言
举例 4:精准描述设计
❌ 错误示例:
- "A helpful skill for code quality"(过于模糊,没有触发短语)
- "Runs a Python script that parses AST and generates reports"(技术性过强,不是用户语言)
- "Code review"(太简短,缺乏上下文)
有效描述的模式:. Use when . .
✅ 优秀示例:
- "Create commit messages following Sentry conventions. Use when committing code changes, writing commit messages, or formatting git history"
- "Security code review for vulnerabilities. Use when asked to 'security review', 'find vulnerabilities', 'check for security issues', 'audit security', 'OWASP review'"
description-PR-02:能力边界清晰,Description 描述的触发范围容易判断
当设计需要与其他 Skill 或工具协作的 Skill 时,必须明确界定其职责边界。
举例 1:
✅ 正确做法:
每个 Skill 必须有明确的触发条件和退出条件:
- 明确该 Skill 应该处理什么任务
- 明确该 Skill 不应该处理什么任务
- 避免在其他 Skill 的子步骤中调用(除非明确需要)
❌ 错误做法:
职责边界模糊,导致多个 Skill 之间产生冲突或重复。
微软 Azure SRE 团队最初设计自动排查 Agent 时,创建了 100 多个工具和 50 多个子代理,结果超过 4 次代理间移交的操作几乎全部失败,编排器找不到深层的子代理,两个代理互相踢皮球,陷入无限循环。
description-PR-03:负样本,Description 明确说明不应该触发该 Skill 的情况
通过设计负样本来防止 Skill 被错误触发。
举例 1:
✅ 在 description 中包含负触发条件,明确说明不应该触发该 Skill 的情况。例如:
Process Excel files and generates reports. Use when working with spreadsheets.
Do not use for CSV files or database exports.
OpenAI 建议从 10-20 个提示词开始测试,覆盖以下几类场景:
- ✅ 显式调用:直接指定 Skill 名称
- ✅ 隐式调用:描述符合场景但不提名称
- ✅ 场景调用:加入业务背景的真实提示词
- ❌ 负样本:不应该触发这个 Skill 的请求
❌ 没有负样本设计,导致 Skill 被错误触发。
某 PDF 处理 Skill 因为描述过于宽泛,导致在处理 Word 文档时也被触发,造成错误的处理结果。
description-PR-04:多场景触发设计,Description 包含多种用户可能使用的触发短语和表达方式
设计能够适应多种用户表达方式的 Skill 触发机制。
举例 1:
✅ 在 description 中包含多种用户可能使用的触发短语和表达方式。
例如,一个安全审查 Skill 的描述应该包含:
"Security code review for vulnerabilities. Use when asked to'security review', 'find vulnerabilities', 'check for security issues', 'audit security', 'OWASP review'."
❌ 只包含单一触发短语,限制了 Skill 的使用场景。
某代码审查 Skill 的描述只写了 "Code review",导致用户使用 "Review code" 或 "Check code" 等其他表达方式时无法触发该 Skill。
description-PR-05 :description 不写“何时不该激活”
只写「何时激活」是新手错。专业的 description 也写「何时不要激活」。
例:
description: |
Review TypeScript code for type-safety issues. Use when:
reviewing .ts/.tsx files. Do NOT use when: file is .py/.go/.rs;
or when user only asks about runtime errors (use debug-skill instead).这条「Do NOT use when」给 Agent 一个主动放弃的合法理由,避免它在不擅长的场景硬接活。
2.2. instructions章节
Agent 处理 Skill 时的逻辑大致是:
对话启动
↓
扫描所有可用 Skill 的 description
↓
拼成一个「Skill 目录」放进 system prompt
↓
Agent 收到用户消息后,根据 description 判断
「这个任务需要哪些 Skill 激活」
↓
对激活的 Skill 才加载完整 instructions(L2)description 让 Skill 进入 Agent 的视野,instructions 决定它能不能把任务做漂亮。
instructions 的设计有 4 条普遍规律(基于 Hub Top 500 的 instructions 文本聚类得出):
instructions-SP-01 : 必须在前 200 字内回答 5 个问题
Agent 加载 instructions 的第一段时,是先扫一眼判断「这个 Skill 真的能做我要的事吗」,没耐心看 5KB 才知道答案。所以前 200 字必须回答:
- 这个 Skill 准确做什么(不是 description 那种概括)
- 它的输入是什么(文件?文本?URL?)
- 它的输出是什么(结构化 JSON?markdown 表?修改文件?)
- 它有什么前置依赖(某个 CLI 工具?某个 API key?)
- 失败时该怎么办(重试?fallback?ask user?)
Hub Top 500 里 74% 的 instructions 前 200 字至少答了其中 4 个问题。剩 26% 把这些答案散在 instructions 各处——这 26% 平均 quality\_score 低 6.8 分。
instructions-PR-01 : [instructions风格和作用是指导,决策树 > 散文
instructions 不是教程,是决策树。Agent 不需要你讲清楚「为什么要这样做」,需要你讲清楚「在 X 情况下做 Y」。
对比两段同主题的 instructions(来自不同的 code-review skill):
❌ 散文版:
代码审查时应该综合考虑代码质量、可读性、性能、安全性等多个方面。
对于复杂的 PR,建议先理解整体架构再 deep-dive 细节。注释和命名也很重要。✅ 决策树版:
1. If diff has > 200 lines:
a. Run `git log -10 --oneline` for context
b. Read CHANGELOG.md for in-flight features
c. Skim full diff before scoring
2. For each changed file:
a. If file has tests/ → check test diff first
b. If file has SQL → MUST flag injection risks
c. If file has any URL → MUST check for credential leaks
3. Severity rubric:
CRITICAL: security issue / data loss
HIGH: regression risk / wrong abstraction
MED: style / naming / minor refactor
4. Output: table grouped by severityAgent 处理「散文版」时会自由发挥;处理「决策树版」时会逐条执行,结果方差小一个数量级。
instructions-PR-02 : 把 anti-pattern 显式 ban 掉
Agent 比人更容易陷入 hallucination 模式(「我应该展示我的能力」),所以好的 instructions 会显式列出禁止动作。
Anthropic 官方 Skill 模板里有一段值得抄的范本:
## DO NOT
- Do NOT modify files outside the user's explicit request scope.
- Do NOT install npm packages without first asking permission.
- Do NOT run `npm test` if it's already known to be broken
(check the user's last message for "tests are red" / "fix later").
- Do NOT make up file paths if you can grep for them instead.这些规则单独看都是常识,但写在 instructions 里给了 Agent 不那么发挥的合法理由。
instructions-PR-03 : instructions 大小的 sweet spot 是 5-20KB
instructions < 2KB 的 SKILL.md 平均 quality 36.3,10-20KB 的 51.4,> 40KB 的 45.2。
instructions 太短信息不足,太长 Agent 难以全部 retain。5-20KB 是 Agent 能 fully retain + 行为收敛的范围。
instructions-PR-04 :instructions把 resources应该装的内容硬塞进来
很多 Skill 把模板代码、查表数据、⻓示例都直接写进 SKILL.md 的 instructions,结果 instructions 体积膨胀到 50KB+,性能⽴刻下降。
修法:任何超过 1000 字的数据 / 模板,都搬到 resources/ ⾥,instructions 只留「在 X 情况下 fetch resources/Y」的指引。
2.3. 其他可用的属性
2.3.1. disable-model-invocation 技能描述
设为 true 时,只有你能手动触发,Claude 不会自动加载
| 配置 | 你能 /调用 | Claude 能自动调用 | 出现在 / 菜单 |
|---|---|---|---|
| (默认) | ✅ | ✅ | ✅ |
| disable-model-invocation: true | ✅ | ❌ | ✅ |
| 💡 使用场景建议 |
|---|
| disable-model-invocation: true 适合有副作用的操作(部署、发送消息),你不希望 Claude 自动执行。 |
2.3.2. user-invocable技能描述
设为 false 时,从 / 菜单隐藏,只由 Claude 自动调用
| 配置 | 你能 /调用 | Claude 能自动调用 | 出现在 / 菜单 |
|---|---|---|---|
| (默认) | ✅ | ✅ | ✅ |
| user-invocable: false | ❌ | ✅ | ❌ |
| 💡 使用场景建议 |
|---|
| user-invocable: false 适合背景知识型技能(如 legacy-system-context),Claude 应该知道,但这不是一个有意义的"命令"。 |
2.3.3. effort 技能描述
控制思考深度:可以为特定技能设置不同的思考强度,平衡速度和质量。
---
name: deep-review
description: 深度代码审查
effort: max
---注意 max 级别仅 Claude Opus 4.6 可用。
2.3.4. paths 技能描述
按文件类型激活:让技能只在处理特定文件时才被激活,避免污染不相关的任务
---
name: react-patterns
description: React 最佳实践
paths: "**/*.tsx,**/*.jsx"
---
# 这个技能只在处理 React 文件时才会被 Claude 考虑加载2.3.5. Shell 命令注入(动态上下文) 技能描述
使用 !command 语法,可以在技能被发送给 Claude 之前,先执行一段 Shell 命令,并将输出注入到技能内容中。
举例 1:内联注入
---
name: pr-summary
description: 总结当前 Pull Request 的变更
context: fork
allowed-tools: Bash(gh *)
---
## PR 上下文
- 变更差异:!`gh pr diff`
- PR 评论:!`gh pr view --comments`
- 修改文件:!`gh pr diff --name-only`
## 你的任务
请总结这个 PR 的主要变更、影响范围和潜在风险。举例 2:多行命令注入
对于多行命令,使用 \`\`\`! 代码块:
## 运行环境
node --version
npm --version
git log --oneline -5禁用 Shell 注入
管理员可以在设置中添加 "disableSkillShellExecution": true 来禁用此功能(适合安全敏感环境)。被禁用时,注入点会替换为 [shell command execution disabled by policy]。
⚠️ 重要区别
这不是 Claude 执行命令——而是 Claude Code 在发送技能给 Claude 之前预处理。Claude 只看到最终输出的文本,不知道有命令被执行过。
2.4. 角色设定
角色设定——让 AI 进入"测试工程师"模式
这一步很多教程不讲,但极其重要。不设定角色,AI 生成的用例会很泛、很"教科书"。
# 测试用例设计助手
你是一位资深测试工程师,擅长从需求中提取测试
点,并运用多种测试设计方法生成高覆盖度的用例。
你特别注重:
- 业务边界条件和异常路径
- 用户实际操作习惯和易错场景
- 接口参数校验和数据一致性2.3. 执行流程
执行流程,这是 Skill 的灵魂,执行步骤是重点。
instructions--17:流程要有明确的"步骤感"
用"第一步""第二步"来组织,不要写成一大段散文。AI 执行有步骤的指令比执行散文描述稳定得多。
举例:
如下是产品研发测试活动的常规流程,在这里,你可以把测试方法论"编码"进去。
如下是一个样例,按照实际工作中的用例设计顺序来组织流程步骤:
## 执行流程
### 第一步:需求分析
1. 解析用户输入的需求描述($ARGUMENTS)
2. 提取功能点、业务规则、输入输出
3. 识别隐含需求和边界条件
4. 列出需要澄清的模糊点(如果有)
### 第二步:测试设计方法选择
根据需求特征,选择适用的设计方法:
- 有输入范围 → 等价类划分 + 边界值分析
- 有多条件组合 → 判定表 / 因果图
- 有状态变化 → 状态迁移图
- 有业务流程 → 场景法
- 有大量参数组合 → 正交试验法
### 第三步:生成用例
每条用例必须包含:
| 字段 | 说明 |
| 用例ID | TC_模块_序号 |
| 优先级 | P0/P1/P2/P3 |
| 前置条件 | 执行前需要满足的状态 |
| 测试步骤 | 具体操作步骤 |
| 测试数据 | 具体的输入值 |
| 预期结果 | 明确可验证的结果 |
| 设计方法 | 用了什么方法得出的 |instructions--18:可让 Skill 标注每条输出结果是什么设计方法,以便快速检查
在 AI 输出结果中,可以让 Skill 标注结果有生成过程用的方案或方法,以使人在最后检查/Review 结果质量时,能更系统化的判断。
举例:
如上面流程要有明确的"步骤感"场景中,在第三步的生成用例结果中,可以增加一个字段信息:
| 设计方法 | 用了什么方法得出的 |
🚯 踩坑经历:
前:AI 每次设计出来的用例,在人工检查时,一个一个的看,没有任何规律,分类跳来跳去,看的人发晕!最后,也检查不出几个遗漏。
后:增加 ”设计方法“字段后,人工检查,可一类一类的看,很容易发现遗漏点!
经验:一定要让 Skill 标注每条用例用的是什么设计方法。这样你在 review AI 生成的用例时,可以快速判断覆盖度——如果全是等价类没有边界值,说明边界场景漏了。
💡 此技巧,可应用在任何过程中,标注 这个结果 是用的前面哪个方案、方法、处理逻辑 得到的。
2.4. 质量约束
质量约束——防止 AI 偷懒
不加约束的话,AI 特别容易生成一堆"验证输入为空""验证超长字符"这种套路用例。你需要明确告诉它什么是好用例:
## 质量要求
- 正向用例和反向用例比例约 4:6
- 测试数据必须具体,不写"合法值",写"张三"
- 预期结果必须可验证,不写"正确显示",
写"页面显示'登录成功'并跳转至首页"
- 必须覆盖:权限校验、并发场景、数据边界
- 合并重复场景,不凑数量instructions--19:显性要求"xx 数据必须具体",有助于结果的真实性
AI 在处理数据的过程中,有时会出现 “幻觉”,特别是在找不到结果的情况下,会“一本正经”的编造一些抽象的数据,若此时有约束显性要求"xx 数据必须具体",AI 就会减少幻觉出现,找到真实数据,或为空。
🚯 踩坑经历:
前:AI 每次设计出来的用例,都是很抽象,感觉放哪都能用,不具体,不能指导具体场景的应用。
后:增加 约束就是在把你脑子里的"什么是好用例"的标准外化出来。我用下来发现,加了"测试数据必须具体"这一条之后,生成的用例实用性提升了一大截!
💡 此技巧,可应用在:任何过程中,输出结果很抽象,感觉放哪都能用,不具体,不能指导具体场景的应用。
3. resources资源
Skill 技能包中 主文件SKILL.md (包括name、description、instructions )之外还有resources目录,它里面 装 如:
- 代码模板( templates/api-client.ts )
- 示例数据( examples/sample-input.json )
- ⼤型查表( data/iso-currency-codes.csv )
- 分步骤的更细 instructions( steps/01-init.md 、 steps/02-config.md )
- 测试⽤例( tests/case-001.json
- ......
description(L1) 和 instructions(L2) 都是⽂本,resources(L3) 是 ⽂件。
Leonxlnx/taste-skill。它的 resources/ 结构是这样:
taste-skill/
├── SKILL.md (L1 + L2 → 21KB)
├── resources/
│ ├── easings.css (CSS easing 常量)
│ ├── animation-timings.md (按场景查表)
│ ├── color-palettes/ (不同风格的色板)
│ │ ├── minimalist.json
│ │ ├── brutalist.json
│ │ └── soft.json
│ └── reference-sites.md (灵感参考)SKILL.md 里只有这样的引用:
For specific easing curves, fetch resources/easings.css.
For palette by style, fetch resources/color-palettes/{style}.json.Agent 在执行某个具体任务时(如「我要做一个 minimalist 风格的 hero section」),才会去 fetch resources/color-palettes/minimalist.json。SKILL.md 本身不携带这些数据,但又把它们组织得让 Agent 找得到。
这就是 resources 的优雅之处——Skill 可以做得很「重」,但运行时 Agent 实际加载的 prompt 仍然很「轻」。
💡 Skill 不是 Agent 唯一的扩展机制——还有 System Prompt、RAG、Tool Use、MCP Server 这 4 个常被混淆的概念。
| 维度 | System Prompt | RAG | Tool Use | MCP Server | Skill (3 层) |
|---|---|---|---|---|---|
| 在线/离线 | 在线(每次对话) | 在线检索 | 在线触发 | 跨进程在线 | L1 在线 / L2 按需 / L3 fetch |
| 一次加载 token | 全量 | 检索片段 | 函数签名 | 函数签名 | L1\~50 / L2 5-20K / L3 0 |
| 谁主动 | 系统注入 | Agent 检索 | Agent 调用 | Agent 调用 | Agent 决定激活 |
| 适合场景 | 永久人格 | 事实查询 | 单次动作 | 跨进程动作 | 程序性知识 + 复杂工作流 |
| 上下文消耗 | 高 | 中 | 低 | 低 | 极低(仅 L1 在线) |
5 个机制是互补的,不是竞争的。第 1 章讲过这五种的类比:
- System Prompt 是「永久人格」
- Tool 是「四肢」
- MCP 是「独立的手」
- RAG 是「百科全书」
- Skill 是「教练笔记」
Skill 的独特价值——把「该怎么做」分层组织——是其他 4 个都不具备的。System Prompt 没有按需加载;RAG 不带程序性知识;Tool/MCP 是动作而非方法论。
3.1. scripts/执行脚本
存放可执行代码(Python/Bash/Node),AI 按指令调用,不读源码、不占 token。
作用是针对特殊场景,处理精确、重复、易出错的任务,保证结果 100% 一致。
典型场景与示例:
数据处理
# scripts/extract_pdf.py
import pdfplumber
def extract_text(pdf_path):
with pdfplumber.open(pdf_path) as f:
return "\n".join([p.extract_text() for p in f.pages])系统操作
# scripts/merge_pdf.sh
# 合并多个PDF
pdftk "$@" cat output output/merged_$(date +%Y%m%d).pdfAPI 封装
# scripts/ocr_service.py
# 调用百度OCR识别扫描PDF
import requests
def ocr_scan(pdf_path):
res=requests.post("https://ocr-api.com/recognize", files={"file": open(pdf_path,"rb")})
return res.json().get("text")scripts--21:代码规范原则,Scripts 脚本遵循统一的代码规范
在开发 Skill 时遵循统一的代码规范,确保代码的可读性和可维护性。
举例 1:
✅ 正确做法,举例:
- 严格类型提示,使用 TypeScript 或类似静态类型系统
- 使用数据类(Data Classes)或 Pydantic 进行内存优化
- 使用上下文管理器和任务组实现安全并发
- 包含全面的错误处理和日志记录
- ...
例如,一个遵循最佳实践的 Python Skill 实现:
from pydantic import BaseModel
from typing import List, Dict
class SkillRequest(BaseModel):
city: str
date: str
async def run_weather_skill(request: SkillRequest) -> Dict:
"""获取指定城市的天气信息"""
try:
# 实现天气查询逻辑
return {"temperature": "25°C", "condition": "Sunny"}
except Exception as e:
logger.error(f"天气查询失败: {e}")
return {"error": "天气服务不可用"}❌ 忽视代码规范,使用不规范的命名和结构。
某 Skill 开发中使用模糊的变量名(如 a、b、c),没有类型提示,错误处理不完整,导致后续开发者无法理解代码逻辑,维护成本极高。
scripts--22:Scripts 脚本职责要单一,1 脚本 = 1 功能,命名清晰
scripts/ 是 AI 的 “手脚”,只做确定性、可复用的动作:
- 每个脚本只做一件事,做完就退出
- 不混杂逻辑、不包办全套流程、不跨领域处理
- 方便:AI 调用、调试、替换、复用、排错
一句话:
一个脚本只实现一个原子能力,Skill 用编排把它们串起来。
应用案例:
## 执行流程
1. 调用 scripts/get_system_info.ps1 获取信息
2. 调用 scripts/json_extract_field.ps1 提取磁盘使用率
3. 如果使用率 > 90%,调用 scripts/post_webhook.ps1 发送告警
4. 调用 scripts/cleanup_temp_files.ps1 清理💡 AI 只负责 “指挥”,scripts 只负责 “执行”。
scripts--24:Scripts 脚本参数化,支持命令行参数/配置,灵活复用
脚本参数化 = 把脚本里固定写死的值(路径、地址、阈值、名称等),全部抽成可外部传入的命令行参数 / 配置项。让脚本不写死、不绑定环境、可复用、可被 AI 精准调用。
💡 一句话:参数化 = 让脚本变成通用工具,而不是一次性代码。
3 条黄金规则(必须遵守)
- ✅所有可变值必须参数化(路径、域名、端口、阈值、文件名、目标地址等)
- ✅参数必须带类型、必选 / 可选、默认值、说明
- ✅脚本只做一件事,参数只控制这件事的细节
举例 1:
❌ 案例 1:文件清理脚本(最常用)
未参数化(坏写法,写死路径、写死天数)
# 写死路径、写死天数 → 只能删这个目录,无法复用
Get-ChildItem "C:\temp" -Recurse -File | Where-Object { # 写死路径
$_.LastWriteTime -lt (Get-Date).AddDays(-7) # 写死天数
} | Remove-Item -Force✅ 参数化(好写法,AI 可随意调用):
脚本如下:scripts/file/clean\_old\_files.ps1
AI 调用方式:
* clean\_old\_files.ps1 -Path "C:\\temp" -DaysOld 7
* clean\_old\_files.ps1 -Path "D:\\logs" -DaysOld 3
* clean\_old\_files.ps1 -Path "E:\\backup" -DaysOld 30 -Recurse \$false<#
.SYNOPSIS
删除指定目录下超过指定天数的文件(单一职责+参数化)
#>
param(
[Parameter(Mandatory=$true)]
[string]$Path, # 目标目录(必传)
[Parameter(Mandatory=$true)]
[int]$DaysOld, # 超过 N 天删除(必传)
[bool]$Recurse = $true # 是否递归(可选,默认开启)
)
# 脚本逻辑完全通用
$cutoff = (Get-Date).AddDays(-$DaysOld)
Get-ChildItem $Path -File -Recurse:$Recurse | Where-Object {
$_.LastWriteTime -lt $cutoff
} | Remove-Item -Force
Write-Host "已清理 $Path 下 $DaysOld 天前的文件"scripts--25:结构化错误返回,Scripts 脚本错误处理,返回码 + 日志,AI 可判断成功/失败
设计统一的错误处理机制,让 AI 能够正确识别和处理各种错误情况。
举例 1:
✅ 永远不要让工具函数抛出异常,始终返回清晰的结构化对象:
这样做的好处是 AI 能够区分 "空数据" 和 "服务故障",做出相应的处理。
如下实例代码参考:
async function get_weather({ city }) {
try {
const response = await fetch(`https://api.example.com/weather?city=${city}`);
if (!response.ok) {
return { error: `Weather API returned ${response.status}. Try again later.` }; #结构化
}
const data = await response.json();
if (!data.current) {
return { error: `No weather data found for "${city}".` }; #结构化
}
return { #结构化
city: data.location.name,
temperature: `${data.current.temp_c}°C`,
condition: data.current.condition.text
};
} catch (err) {
return { error: `Could not reach weather service: ${err.message}` }; #结构化
}
}scripts--26:错误分类,Scripts 脚本根据错误类型设计不同的处理策略
根据错误类型设计不同的处理策略,提供合适的用户反馈。
根据错误类型返回不同的用户反馈:
| 错误类型 | 返回信息 | 处理策略 |
|---|---|---|
| 速率限制 | "Service busy. Try again in a minute." | 自动重试 |
| 城市未找到 | "No results for 'Atlantis'. Check the spelling." | 提示用户检查输入 |
| API 密钥过期 | "Internal error. Contact support." | 不暴露内部问题 |
| 严重错误 | "Internal error. Try a different request." | 建议用户尝试其他操作 |
💡 如果是用户可以修复的问题,告诉他们;如果是系统问题,隐藏技术细节,提供友好的错误信息。
scripts--27:重试机制设计,Scripts 脚本减少临时环境异常等可恢复的故障,提升可靠性
设计智能的重试机制,处理临时网络错误等可恢复的故障。
举例 1:
✅ 适用场景,临时环境异常,举例:
- 网络闪断(3 秒后重试可能成功)
- 服务过载(等待几秒后可能恢复)
- 限流错误(等待冷却时间后重试)
如下实例代码参考:
async function withRetry(fn, maxAttempts = 3, baseDelayMs = 500) {
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const result = await fn();
if (result?.error && result?.retryable) throw new Error(result.error);
return result;
} catch (err) {
lastError = err;
if (attempt < maxAttempts) {
const delay = baseDelayMs * Math.pow(2, attempt - 1);
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}
return { error: `Failed after ${maxAttempts} attempts: ${lastError.message}` };
}scripts--28:优雅降级,有备选方案确保基本功能的可用性
当主要功能不可用时,Skill 需要有备选方案确保基本功能的可用性,为关键功能设计降级方案。
举例 1:
✅ 正确做法:
为每个关键功能设计降级方案:
- 主要数据源故障时,尝试备用数据源
- 备用数据源也失败时,提供降级响应
- 明确告知用户当前处于降级模式
❌ 错误做法:
某监控系统 Agent 直接将 50K tokens 的原始监控数据塞给模型分析,当数据量过大时模型直接崩溃,没有任何降级处理机制。
没有降级方案,当主要功能失败时直接返回错误或让用户重试。
scripts--29:并行处理优化,提升整体执行效率
设计支持并行处理的 Skill 架构,提升整体执行效率。
举例 1:
✅ 具体做法,举例:
- 识别可并行执行的任务,如:文件扫描时,可多文件处理
- 使用任务组(Task Group)实现安全并发
- 设计合理的并行度,避免资源竞争
例如,在处理多个文件时,可以并行读取和处理:
效果:
- 多文件处理速度提升 5-10 倍
- 资源利用率提高 80%
- 响应时间显著缩短(103)
async def process_files(files):
async with asyncio.TaskGroup() as tg:
tasks = []
for file in files:
tasks.append(tg.create_task(process_single_file(file)))
return await asyncio.gather(*tasks)scripts--30:让 Skill 读项目代码来补充上下文
这是 Claude Code Skill 比纯 ChatGPT 对话强的地方——它能读你的代码。在 SKILL.md 里加一段:
## 上下文增强(可选)
如果用户提供了接口路径或文件路径,用 Read
工具读取源码,提取:
- 参数校验规则(正则、长度限制等)
- 业务逻辑分支(if/else、switch)
- 异常处理逻辑(try/catch)
将这些信息作为补充输入,生成更精准的用例。这意味着你可以这样用:/test-case-design 请根据 src/api/user.py 中的注册接口设计用例。Claude 会先读代码,再结合你的测试方法论来生成用例。这才是 AI 测试用例设计的正确打开方式——不是凭空生成,而是基于真实代码。
scripts--31:Scripts 脚本跨平台,优先 Python(跨系统)
Scripts 跨平台 = 同一份脚本代码,不修改、不兼容处理,就能在 Windows / macOS / Linux 三大系统直接运行。
在 Skill 架构中,优先用 Python 实现跨平台脚本,彻底告别:
- PowerShell 脚本只能 Windows 跑
- Shell 脚本只能 Linux/macOS 跑
- 同功能要写 2\~3 套代码
- AI 调用时要判断系统、分支执行
💡 Scripts 跨平台 【建议】 用 Python
- 三大系统默认 / 极易安装现代 Windows/macOS/Linux 都自带或一键装 Python
- 一套代码跑所有系统无需区分系统、无需写两套逻辑
- AI 更容易调用统一命令:
python script.py,不用区分ps1/.sh - 库极丰富文件、网络、系统、数据、通知全能搞定
- 完全贴合 Skill 设计 Scripts = 执行层,跨平台 = 更强通用能力
一句话:Skill 要做到 “一处编写,全系统运行”,Scripts 建议 Python。
跨平台 Python 脚本 3 条黄金规则:
- 不写死系统路径不用
C:\temp或/tmp,用 Python 标准库自动获取 - 不用系统专属命令不用
dir/ls/ipconfig,用 Python 库实现 - 路径分隔符自动适配用
os.path或pathlib,不手写/或\
举例:
案例 1:跨平台创建临时目录:scripts/file/create\_temp\_dir.py
import tempfile
import os
def create_temp_dir():
# 自动适配系统临时目录:C:\Users\xxx\AppData\Local\Temp 或 /tmp
temp_dir = tempfile.mkdtemp(prefix="skill-task-")
return temp_dir
if __name__ == "__main__":
# 输出目录路径,供 AI/调用方获取
print(create_temp_dir())案例 2:跨平台清理旧文件(最常用):scripts/file/clean\_old\_files.py
# 删除指定目录 N 天前的文件
import os
import time
import argparse
# 脚本参数化(Skill 必备)
parser = argparse.ArgumentParser(description="跨平台清理旧文件")
parser.add_argument("--path", required=True, help="目标目录")
parser.add_argument("--days", type=int, required=True, help="超过几天删除")
args = parser.parse_args()
# 跨平台时间计算
cutoff_time = time.time() - (args.days * 86400)
# 跨平台遍历文件
for root, dirs, files in os.walk(args.path):
for file in files:
file_path = os.path.join(root, file)
if os.path.getmtime(file_path) < cutoff_time:
os.remove(file_path)
print(f"已删除: {file_path}")
# 调用命令(全系统一样)
python clean_old_files.py --path "./logs" --days 7案例 3:跨平台获取系统信息:scripts/system/get\_system\_info.py
# 获取 OS、CPU、内存、磁盘
import platform
import sys
import os
def get_info():
return {
"system": platform.system(), # Windows/Darwin(Linux)/Linux
"version": platform.version(),
"python": sys.version,
"cpu_count": os.cpu_count(),
"cwd": os.getcwd()
}
if __name__ == "__main__":
print(get_info())案例 4:跨平台发送 Webhook 通知:scripts/notify/send\_webhook.py
# 发送消息到飞书 / 钉钉 / 企业微信
import requests
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--url", required=True, help="webhook 地址")
parser.add_argument("--msg", required=True, help="消息内容")
args = parser.parse_args()
# 跨平台发送请求
resp = requests.post(args.url, json={
"msg_type": "text",
"content": {"text": args.msg}
})
print("发送成功" if resp.status_code == 200 else "发送失败")案例 5:跨平台路径拼接(绝对不能手写 \ 或 /)
import os
# 错误写法(不跨平台)
path = "logs\\2025" # Windows 专用
path = "logs/2025" # Linux/macOS 专用
# 正确写法(自动适配所有系统)
path = os.path.join("logs", "2025")以上的执行流程
- 调用 scripts/system/get\_system\_info.py 获取系统信息
- 调用 scripts/file/create\_temp\_dir.py 创建临时目录
- 业务处理...
如果文件超过 7 天
→ 调用 scripts/file/clean\_old\_files.py --path "./logs" --days 7
- 调用 scripts/notify/send\_webhook.py 发送完成通知
SKILL.md 里可以如上这样写(一套流程,全系统通吃)
3.2. assets/静态资源
存放输出所需静态文件(图片、字体、图标、样式、素材包),AI 不读取、只引用 / 复制。作用是提供输出素材,不占 token,保证结果完整性。
包里的内容,Agent 过程中 只读不解析:AI 只复制 / 引用,不理解内容。
典型场景与示例:
品牌素材
assets/logo.png(报告水印)assets/style.css(HTML 报告样式)
模板素材
assets/ppt_template.pptx(PPT 母版)assets/word_template.docx(Word 格式模板)
项目脚手架
assets/react-template/(React 项目模板)assets/api-server/(后端服务骨架)
assets--32:资源内聚原则,所有静态素材必须放进 assets,不许散放
assets 是 Skill唯一的静态资源出口,图片、样式、骨架、prompt 片段、固定模板等,统一收拢,不散落于 Skill 根目录、scripts、templates 中。
容易理解,不过多介绍了。
assets--33:静态纯粹原则 ,assets 只放 “静态”,不放代码、逻辑、脚本
assets = 死素材,不包含可执行逻辑、不包含业务代码、不包含配置。
容易理解,不过多介绍了。
assets--34:路径纯净原则,禁止绝对路径,禁止外部依赖
assets 内资源只使用相对路径,不依赖 Skill 目录以外的任何文件,保证 “拷贝即运行”。
❌ 不能出现:C:\xxx、D:\xxx、/home/user/xxx
❌ 不能引用网络资源当本地静态资源(除非明确是在线图床)
❌ 不依赖其他软件安装目录
容易理解,不过多介绍了。
assets--35:资目录结构化原则,按类型分文件夹,禁止平铺一堆文件
assets 内部必须按资源类型建子目录,不把几十张图、一堆文件直接扔 assets 根目录。
容易理解,不过多介绍了。
✅ 标准子目录建议:
images/图片、图标、封面styles/样式、排版骨架、CSS、HTML 模板骨架prompts/系统提示词片段、角色文案templates/静态模板(与 templates/ 目录区分:这里是无逻辑纯素材)files/附件、样本文件、示例素材icons/小图标(可选)
assets--36:命名规范原则,英文、小写、短横线,无中文无空格无特殊字符
统一命名规则,保证跨平台、跨工具、AI 识别都不出错。
容易理解,不过多介绍了。
✅ 只用:小写字母、数字、短横线 -、下划线 _
❌ 禁止:中文、空格、()、&、%、#、 emoji
文件名见名知意
assets--37:路径固定,要用包中的**相对路径,增加移植兼容性
assets(静态资源层):存放 Skill 运行所需的静态素材(图标、图片、模板骨架、样式文件、固定配置、prompt 片段、本地素材等)。
路径固定 + 包内相对路径:所有资源必须以 assets 目录为基准,用相对路径引用,绝不写死绝对路径(如 C:\xxx、/usr/xxx),确保 Skill 拷贝到任何电脑、任何目录都能直接运行,无路径报错。
3 条强制规则(必须遵守):
- 所有静态资源必须放在 assets/ 下,不许乱放
- 引用路径永远以 Skill 根目录为基准格式:
assets/文件夹/文件名 - 代码中永远使用「相对路径」,禁止出现绝对路径
✅ 必须:assets/images/logo.png
❌ 禁止:C:\project\my-skill\assets\logo.png
案例:
如下是定义的 my-skill 包,其中 assets 资源调用写法如下:
my-skill/
├── SKILL.md
├── assets/ # 固定根目录
│ ├── images/ # 图片、图标
│ │ ├── logo.png
│ │ └── cover.jpg
│ ├── styles/ # 样式、模板骨架
│ │ └── report.css
│ ├── prompts/ # 固定 prompt 片段
│ │ └── system.txt
│ └── files/ # 静态文件、素材
│ └── template.docx# 角色设定
使用图标:assets/images/logo.png
# 执行流程
1. 读取骨架模板:assets/styles/report.css
2. 加载系统提示词:assets/prompts/system.txt
3. 使用封面图:assets/images/cover.jpgassets--38:可复用原则,提取公共片段到 assets,避免多处复制粘贴
把多个 Skill、多个模板共用的素材,统一放到 assets 公共目录,实现一处修改、全局生效。
✅ 共用的素材,统一放到 assets 公共目录:
- 公共头部、公共底部
- 统一角色提示词
- 统一样式
- 统一图标
assets/styles/common.css
assets/prompts/common-role.txt
在 SKILL.md 或模板中引用:
使用公共样式:assets/styles/common.css
❌ 每个模板里都复制一遍相同 CSS、相同角色描述。
assets--39:轻量原则,不存放大文件、不存放可下载资源
assets 存放轻量素材,保证 Skill 体积小、加载快、移植快。
不存放如下举例:
- 不存放视频、大安装包、压缩包、镜像
- 不存放几百 MB 的模型文件
- 大文件放外部或单独仓库
- ... ...
✅ 可存放:
- 小图标
- 小封面图
- 文本片段
- 样式文件
❌ 不建议存放:
- assets/large-video.mp4
- assets/model.gguf
- assets/dataset.zip
assets--40:版本干净原则,不上传临时文件、缓存、垃圾文件
assets 只保留最终可用资源,不留过程文件、缓存、缩略图、草稿。
容易理解,不过多介绍了。
assets--41:assets 与 templates 目录严格区分(非常重要)
很多人会混淆:
- templates/:带结构、可填充变量、AI 输出用的完整模板
- assets/templates/:仅骨架、样式、片段,不直接输出
✅ 可存放:
- templates/report.md # 完整输出模板,有 {{var}}
- assets/styles/report.css # 仅样式素材
❌ 不建议存放:
- assets/完整报告模板.md # 不该放这
- templates/style.css # 不该放这
3.3. references/参考文档
references = 知识层:AI 的知识库、API 文档、规则、约束、标准、踩坑、参考资料
references 是 Skill 的只读知识层,统一存放业务规则、API 文档、标准、约束、踩坑教训;结构清晰、条目化、只放静态知识、与模板 / 资源分离、命名规范、便于 AI 理解与更新。
典型场景与示例:
- API 文档
# references/pdf_api.md
## PDF 处理AP
- 提取文本:POST /api/pdf/extract
- 合并PDF:POST /api/pdf/merge
- 参数:file_path, password, pages
- 返回:code=0成功,msg=结果,data=文件路径- 规范标准
# references/naming_rules.md
## 输出文件命名规范
- 格式:{操作类型}_{日期}_{原文件名}
- 例:extract_20260405_report.pdf、merge_20260405_all.pdf
- 禁止:中文、空格、特殊字符(!@#$)- 数据结构
// references/schema.json
{"pdf_info": {
"path": "string",
"pages": "int",
"encrypted": "bool",
"size_mb": "float"
}
}references--42:知识唯一入口原则,统一只放 references/,不散落别处
所有外部知识、业务规则、接口说明、标准、约束、禁忌、经验教训,统一只放 references/,不散落别处。
✅ 可存放:
AI 只需要从这里获取 “事实知识”
不让知识散落在 SKILL.md、scripts、templates 里
便于更新、版本管理、多人维护
如:
references/api.md
references/business-rules.md
references/lessons.md
references/standards.md
❌ 不建议存放:
SKILL.md 里写大段接口说明
scripts/ 里写业务规则注释
templates/ 里埋约束条款
根目录放一个 rules.txt
references--43:按需拆分,按主题分文件,不加载无关内容
按需拆分:按主题分文件(api.md、rules.md),不加载无关内容
my-skill/
├──
├── references/
│ ├── api.md # API规范
│ ├── rules.md # 命名/约束
│ └── schema.json # 数据结构references--44:references/只放 “静态知识”,不放逻辑、模板、代码
references 是只读知识库,不放可执行内容、不放输出模板、不放脚本。
✅ 可存放:
接口文档
业务规范
数据字典
踩坑总结
标准格式要求
❌ 不建议存放:
不放 .py / .ps1 脚本
不放带变量的输出模板
不放配置文件、运行参数
如:
references/run.py
references/template.md
references/config.json
references--45:references 按领域拆分文件,不堆砌大杂烩
知识按主题 / 业务域 / 类型拆分成多个小文件,不要一个 ref.md 写所有内容。
✅ references/可存放:
api.md # 接口字段、调用方式
business.md # 业务规则
standards.md # 格式标准
pitfalls.md # 踩坑、禁忌、常见错误
faq.md # 常见问题
data-dict.md # 数据字典
❌ 不建议存放:
references/ref.md # 几千行,包含 API、规则、坑、示例、说明一锅炖
references--46:references 知识结构化、条目化,便于 AI 理解
知识不要写成散文,要条目化、清单化、表格化,AI 更容易检索与遵守。
✅ 建议举例:
用列表、表格、加粗关键词
每条知识只讲一件事
明确:规则 / 约束 / 允许 / 禁止
## 命名规则
- 文件名必须小写
- 不能使用中文和空格
- 分隔符统一用短横线 -
## 接口字段
- code: 状态码,0=成功
- message: 返回信息❌ 不建议:
这个接口大概返回一些状态,成功一般是 0,文件名最好别用中文,不然可能会出问题……
references--47:references 文件 SKILL.md 只引用,不复制全文
SKILL.md 中不要大段粘贴 references 内容,只需引用路径。
✅ 建议举例:
业务规则参见 references/business-rules.md
接口字段参见 references/api.md
❌ 不建议:
SKILL.md 里复制几十行规则、接口说明,导致两份内容不同步。
容易理解,不过多介绍了。
references--48:“踩坑、禁忌、教训” 易错点积累,不重犯同样问题
犯过的错误、踩过的坑、不能做的事、历史教训、典型问题等等,统一归属 references。
要及时总结,随时更新进 Skill,不重犯同样问题。
references/目录 = 知识层(AI 的知识库),API 文档、规则、经验、约束、注意事项、禁忌、避坑点
my-skill/
├── SKILL.md
├── ...
├── references/ <-- 这里
│ ├── mistakes.md <-- 你犯过的错误
│ └── lessons.md <-- 你的踩坑总结、经验总结、避坑指南、历史教训
│ ├── rules.md <-- API 文档、规则、约束
├── templates/
├── examples/
├── hooks/
└── \_meta.json
举例:
输出 JSON 时字段顺序混乱:生成的 JSON 字段顺序每次都不一样。(问题一直重复发生)
输出 JSON 时字段顺序混乱:在references/rules.json 里提供标准格式。
references--49:references与 templates 严格分离,知识 ≠ 输出结构
两者区别:
references:AI 用来理解规则、查资料。不放带 {{变量}} 的模板
templates:AI 用来生成输出内容。不放业务规则说明
容易理解,不过多介绍了。
references--50:references与 assets 严格分离,知识 ≠ 静态素材
两者区别:
references:文字性知识、规则、文档。不放图片、不放样式、不放图标、不放多媒体。
assets:图片、样式、图标、prompt 片段等静态资源
容易理解,不过多介绍了。
references--51:references版本可追溯,每条重要规则可记录来源
关键业务规则、标准、接口变更,建议标注来源 / 版本 / 更新时间,便于回溯。
适合正式业务 Skill、工程类 Skill、合规类 Skill
# 业务规则 v2026-04-07
更新者:xxx
来源:业务需求文档 v3.2
1. 金额保留2位小数
2. 超时时间不得超过30sreferences--52:references 禁止放运行时动态生成内容
references 是静态知识库,不存放运行时产生的日志、缓存、结果数据。
✅ 建议举例:
只放人工整理、固化下来的知识。
❌ 不建议:
不放运行日志
不放脚本输出结果
不放临时数据
如:
references/run.log
references/temp-result.json
references/cache.txt
容易理解,不过多介绍了。
references--53:references 文件名规范,英文小写、语义明确、无特殊字符
统一命名风格,便于 AI 调用、脚本读取、移植跨平台。
容易理解,不过多介绍了。
3.4. templates/样式模板
存放固定格式模板(Markdown/Word/HTML/ 代码),AI 填充数据生成结果。
templates = 模板层:AI 的输出模具,用于生成标准化结果(报告、文案、代码、邮件、表格等),作用是保证输出格式统一、合规、美观,无需 AI 重复排版。
典型场景与示例:
- 报告模板
# templates/report.md# PDF 处理报告- 原文件:{{PDF_PATH}}
- 操作:{{ACTION}}
- 页数:{{PAGES}}
- 状态:{{STATUS}}
- 结果文件:{{OUTPUT_PATH}}
---## 内容摘要
{{CONTENT_SUMMARY}}- 代码模板
# templates/script_template.py
def {{FUNCTION_NAME}}({{PARAMS}}):
"""{{DESCRIPTION}}"""
try:
# 执行逻辑
{{CODE_BODY}}
return {"code":0, "msg":"成功", "data":result}
except Exception as e:
return {"code":1, "msg":f"失败:{str(e)}", "data":null}- 邮件模板
<!-- templates/email.html -->
<h3>PDF 处理完成</h3>
<p>您好,您的文件 {{PDF_NAME}} 已{{ACTION}}成功。</p>
<p>下载链接:<a href="{{DOWNLOAD_URL}}">点击下载</a></p>templates--54:templates 只放 “输出用模板”,不放别的
templates 目录只存放最终输出结构模板,不掺杂知识、规则、素材、脚本。
模板 = 输出骨架,AI 往里填内容。
✅ 建议举例:
只放:输出格式模板(.md/.txt/.json/.html/.sql 等)
不放:业务规则、API 文档、图片、脚本、配置
不放:参考资料、踩坑记录、说明文档
如:
templates/
report.md
email.md
api\_response.json
sql\_query.tpl
❌ 不建议:
templates/
rules.md # 规则应放 references
logo.png # 图片应放 assets
run\_script.py # 脚本应放 scripts
templates--55:templates 变量占位符统一、标准化,便于 AI 识别
模板内使用统一风格的变量占位符,让 AI 清晰知道哪里需要填充、填充什么。
✅ 推荐统一格式:
{{变量名}}{{section.子项}}- 禁止随意格式、无标识文本
如:
# {{title}}
## 概览
- 时间:{{date}}
- 负责人:{{username}}
- 结果:{{result_summary}}❌ 不建议:
这里填标题
时间:自己填时间
结果:把结果写在这里
templates--56:templates 模板与知识分离,不内嵌规则到模板里
模板只管结构,不管业务规则。
业务规则、约束、格式标准统一放 references/。
✅ 推荐:
模板不写判断逻辑
不写业务说明
不写约束条件
只保留结构与占位符
如:
# 巡检报告
{{date}}
{{device_name}}
{{status_list}}❌ 不建议:
# 巡检报告注意:磁盘 >90% 必须标红,接口超时要告警,这些规则写在下面……
templates--57:templates 一个模板一个输出目标,职责单一
1 模板 = 1 类输出,不把多种格式、多种用途混在一个文件里。
✅ 推荐:
日报模板、周报模板分开
JSON 模板、Markdown 模板分开
简洁版、详细版分开
如:
my-skill/
├──
├── templates/
│ ├── daily_report.md # 日报
│ ├── weekly_report.md # 周报
│ └── report_simple.md❌ 不建议:
my-skill/
├──
├── templates/
│ ├── all_in_one.md # 包含日报、周报、JSON、代码,混乱不堪templates--58:templates 使用相对路径引用 assets,不写死外部资源
模板如果需要引用静态资源(图片、样式),只使用 assets 相对路径,保证移植兼容。
✅ 路径格式固定:
assets/images/xxx.png
assets/styles/xxx.css
如:
<link rel="stylesheet" href="assets/styles/report.css">
<img src="assets/images/logo.png">❌ 不建议:
<img src="C:\files\logo.png">
<img src="../logo.png">templates--59:templates 模板命名语义化、英文小写、无特殊字符
文件名清晰、规范、跨平台兼容,AI 与脚本都能稳定识别。
格式:
- 小写英文 + 数字 + 短横线
- - 见名知意
- 无中文、空格、特殊符号、emoji
如:
daily-report.md
server-check.md
error-response.json
❌ 不建议:
模板最终版.md
报告(新).txt
测试模板 222\_final\_final.md
templates--60:templates 禁止在模板内写可执行代码与逻辑
模板是静态结构,不写循环、判断、脚本调用、命令执行。
格式:
不写 Python/Shell/PS 代码
不写复杂逻辑
不写 AI 执行流程
逻辑由 SKILL.md 执行流程控制
如:
{{error_list}}
{{summary}}❌ 不建议:
{% for i in list %}
if status == 'error': print(...)templates--61:templates 公共结构抽成共用模板,避免重复复制
多个模板共用的头部、尾部、格式片段,抽成公共子模板,一处修改全局生效。
建立公共子目录:
templates/common/templates/parts/
如:
my-skill/
├──
├── templates/
│ ├── common/
│ ├── header.md # 页眉
│ └── footer.md # 页脚❌ 不建议:
每个模板都复制一遍相同的头部、尾部、格式说明。
templates--62:templates 模板必须带示例注释,便于 AI 理解结构意图
模板内可加少量示例注释,帮助 AI 理解每个区块填什么、格式要求。
格式:
注释用 <!-- --> 或 --- 包裹,不污染最终输出。
如:
# {{title}}
<!-- 此处填写任务名称,不超过20字 -->
## 结果
{{result}}
<!-- 只填成功/失败/异常,不要写描述 -->❌ 不建议:
无任何说明,AI 随意填充,格式混乱。
templates--63:templates 与 SKILL.md 执行流程对应,可被直接编排调用
模板文件名、路径稳定固定,方便在 SKILL.md 中直接引用,形成 “流程 + 模板” 闭环。
格式:
## 执行流程:
1. 获取数据
2. 使用 templates/daily-report.md 生成日报
3. 输出结果❌ 不建议:
模板路径混乱、文件名经常改,导致 SKILL.md 引用失效。
templates--64:templates 模板只定义结构,不填充真实业务数据
模板是模具,不是成品。不填充真实示例数据,只保留占位符。
格式:
用户名:{{username}}
时间:{{time}}❌ 不建议:
用户名:张三
时间:2025-01-01templates--65:templates 与 assets、references 严格三层分离
明确三层边界,不混用:
- templates:输出结构
- assets:静态素材(图、样式、图标)
- references:规则、知识、约束、文档
格式:
templates/report.md # 结构
assets/style.css # 样式
references/rules.md # 规则❌ 不建议:
templates/rules.md
references/template.md
assets/report.md3.5. examples/参考示例
存放真实输入输出样例,展示技能用法与预期结果。作用是降低 AI 理解成本,减少偏差;方便用户 / 开发者测试验证。
examples = 范例层:用于清晰展示 Skill 输入输出、用法、效果、边界案例让 AI、使用者、维护者一眼看懂 “这个 Skill 到底干嘛、怎么用、长什么样”。
典型场景与示例:
- 输入示例
# examples/input.txt
操作:提取PDF文本
文件:./docs/sample.pdf
密码:无
页码:1-5- 输出示例
# examples/output.txt
✅ PDF提取成功
原文件:sample.pdf(5页,1.2MB)
结果文件:output/extract_20260405_sample.txt
内容摘要:
1. 项目概述
2. 需求分析
3. 系统设计
...- 失败示例
# examples/error.txt
❌ 失败:文件加密
原文件:protected.pdf
错误:需要密码,请提供正确密码后重试examples--66:examples 职责纯粹原则
examples 只存放真实、可复现的输入 / 输出范例,不存放知识、规则、模板、脚本、素材。
建议:
只放:示例输入、示例输出、完整对话案例、效果展示
不放:业务规则、API 文档、代码脚本、图片、配置、模板
如:
examples/
example-1-success.md
example-2-warning.md
example-3-error.md❌ 不建议:
examples/
rules.md # 应放 references
template.md # 应放 templates
script.py # 应放 scripts
logo.png # 应放 assetsexamples--67:examples 必须成对出现:输入 + 输出
一个完整范例 = 清晰输入 + 对应输出,不能只给结果不给输入,也不能只给输入不给结果。
建议:
让别人能复现
让 AI 理解预期格式
让维护者快速判断是否正常
如:
# 示例:磁盘正常巡检
## 输入
检查C盘磁盘状态
## 输出
✅ C盘使用率 45%,状态正常❌ 不建议:
# 只写输出
磁盘正常
# 只写输入
检查磁盘examples--68:examples 覆盖场景要明确,包含典型场景 、边界场景 、成功、失败、异常场景类示例
范例不只做 “成功案例”,必须覆盖:
- 正常场景
- 边界场景(阈值临界)
- 异常 / 错误场景
- 禁止 / 不支持场景
让 AI 知道什么能做、什么不能做、做到什么程度算对。
examples/
normal.md # 正常
boundary.md # 边界值
warning.md # 告警
error.md # 异常
invalid.md # 不支持的输入不建议:
examples/
demo.md # 只有一个完美案例,其他一概没有examples--69:examples 一个范例一个场景,职责单一、不堆砌
1 个示例文件 = 1 个独立场景,不要把正常、异常、边界全塞一个文件里。
建议:
- 结构清晰
- AI 易检索
- 便于单独更新
如:
examples/disk-normal.md
examples/disk-high-usage.md
examples/disk-not-found.md不建议:
examples/all-examples.md
# 里面混杂正常、异常、边界、对话、多轮操作一锅炖examples--70:examples命名语义化、小写英文、无特殊字符
文件名清晰、稳定、跨平台兼容,便于 AI 与脚本调用。
建议:
小写英文、数字、短横线 -
命名 = 场景 + 状态
无中文、空格、括号、emoji
如:
examples/
check-disk-normal.md
check-disk-warning.md
check-service-failed.md不建议:
示例1.md
测试最终版(修改).md
示范案例新的.txtexamples--71:examples格式统一、结构固定,便于 AI 理解
所有示例使用统一结构,AI 可以稳定解析范例意图。
推荐固定结构:
# 示例名称
## 场景说明
## 输入
## 输出
## 说明(可选)
如:
# 示例:服务端口不通
## 场景 目标IP端口未开放
## 输入 检查 192.168.1.10:8080
## 输出 ❌ 端口 8080 无法连接不建议:
格式混乱、散文式、无分段:
我试了一下检查端口,好像不通,返回了一堆错误信息大概是这样……examples--72:examples 范例必须真实、简短、可直接复现,用真实文件/参数,不虚构,不放理论说明
示例内容必须真实可跑,不能编造、不能夸张、不能过于冗长。
建议:
长度适中
可直接复制测试
不使用虚假占位内容冒充示例不建议:
## 输出
(此处省略一万字结果)examples--73:examples 禁止放真实敏感数据、隐私信息
示例中脱敏处理,不出现真实 IP、手机号、密钥、公司内部隐私数据。
建议:
IP 用 192.168.x.x
域名用 example.com
不出现真实姓名、工号、机密信息
如:
检查 192.168.1.100:80
用户 test_user不建议:
检查 10.123.xx.xx 真实办公IP
张三 13800138000examples--74:examples 加支持文件——放一个好用例样本
在 Skill 目录下建一个 examples/good-case.md,放一份你认为质量最高的真实用例文档。在 SKILL.md 里引用它:"对于输出格式和用例粒度,参考 examples/good-case.md"。Claude 会读取这个文件来校准输出质量。
examples--75:examples 与 templates、references 对应一致
示例输出格式必须严格对齐 templates,规则对齐 references,不出现矛盾。
建议:
示例输出 ≡ 模板最终渲染效果
示例规则 ≡ references 里的约束
如:
template 定义表格格式 → 示例也输出表格。不建议:
模板是表格,示例却是一段散文;规则说不能超过 3 条,示例却写 10 条。
examples--76:examples 用于 “教学”,不是 “文档”
examples 是演示用法,不是写说明文档,不长篇大论讲原理。
建议:
少解释,多展示
用输入输出说话
不写原理、不写架构、不写代码实现
如:
展示 “输入什么 → 得到什么”。不建议:
这个 Skill 的原理是……它的架构分为……底层实现是……
examples--77:examples 不随运行动态生成,保持静态
examples 是静态范例,不是运行日志、不是实时结果、不是缓存。
建议:
不存放脚本运行产生的临时文件
不存放日志
人工编写、人工维护
如:
手工编写、固定不变的示例。不建议:
examples/result-20260407.txt
examples/cache.json
examples/runtime.log8. 【高阶】hooks/约束与观测
hooks = 约束与观测层:用于记录调用、控制权限、拦截流程、校验输入输出、审计日志 它不是业务逻辑,也不是脚本,而是Skill 的 “门卫 + 监控 + 记录仪”。
hooks 是 Skill 的约束与观测层,专注于权限校验、输入拦截、流程控制、调用审计与日志记录;单一职责、可插拔、跨平台、无侵入、不参与业务输出,统一接口、安全可追溯,轻量高效。
Hooks 三大生命周期(所有场景都归这 3 类):
1)执行前:before\_*
校验、拦截、权限、限流、参数检查不让违规请求进入主流程
2)执行后:after\_*
日志、审计、通知、归档、数据上报记录结果、不影响主流程
3)事件触发:on\_*
出错、成功、超时、重试、中止时触发
hooks--78:Hooks 什么时候用
该用 Hooks:
- 要拦截请求
- 要校验权限 / 参数
- 要限流 / 安全 / 过滤
- 要日志 / 审计 / 留痕
- 要出错处理 / 超时
- 要结果脱敏 / 格式校验
不应该用 Hooks:
- 执行业务逻辑(scripts)
- 生成输出内容(templates)
- 存放业务规则(references)
- 存放图片 / 素材(assets)
- 存放示例(examples)
hooks--79:Hooks 的应用调用
Hooks 不是自动运行的,是「被编排」的
在 OpenClaw 体系里,Hooks 不是魔法自动执行,而是在 SKILL.md 的执行流程里显式调用。
SKILL.md(指挥)
↓ 调用
hooks/xxx.py(门卫/校验/记录)
↓ 通过才继续
scripts/xxx.py(真正干活)项目中标准接入模式(固定套路,所有 Skill 通用)
标准执行流程(强制规范)
执行流程:
1. 调用前置钩子(权限、参数、环境、限流)
2. 执行业务脚本
3. 调用后置钩子(日志、审计、通知)
4. 异常时触发错误钩子执行流程:
1. 获取输入参数:path、user、remark
2. 调用 hooks/validate_input.py 校验参数
→ 不通过则终止
3. 调用 hooks/check_permission.py 校验权限
→ 不通过则终止
4. 调用 hooks/rate_limit.py 限流检查
→ 超限则终止
5. 执行业务脚本:scripts/check_disk.py
6. 执行成功:
→ 调用 hooks/record_audit.py 记录审计日志
7. 执行失败:
→ 调用 hooks/on_error.py 发送告警
8. 无论成败:
→ 调用 hooks/cleanup_temp.py 清理临时文件hooks--80:调用前 → 参数校验 Hook
必传参数是否存在、格式是否合法,提前拦截错误。
import sys
import json
def validate(context):
# 从参数中获取输入
args = context.get("args", {})
path = args.get("path")
if not path:
return {
"allowed": False,
"message": "缺少必传参数:path"
}
if not path.strip():
return {
"allowed": False,
"message": "path 不能为空"
}
return {
"allowed": True,
"message": "参数校验通过"
}
if __name__ == "__main__":
# OpenClaw 通常以 JSON 传入上下文
context = json.loads(sys.argv[1])
result = validate(context)
print(json.dumps(result, ensure_ascii=False))在 SKILL.md 中使用
执行流程:
1. 传入参数:{"path": "{{path}}"}
2. 调用 hooks/validate_input.py,获取校验结果
3. 如果不通过 → 直接终止并返回错误信息
4. 继续执行 scripts/check_disk.pyhooks--81:调用前 → 权限校验 Hook
控制哪些人 / 哪些群 / 哪些角色能使用该 Skill。
import sys
import json
def validate(context):
# 从参数中获取输入
args = context.get("args", {})
path = args.get("path")
if not path:
return {
"allowed": False,
"message": "缺少必传参数:path"
}
if not path.strip():
return {
"allowed": False,
"message": "path 不能为空"
}
return {
"allowed": True,
"message": "参数校验通过"
}
if __name__ == "__main__":
# OpenClaw 通常以 JSON 传入上下文
context = json.loads(sys.argv[1])
result = validate(context)
print(json.dumps(result, ensure_ascii=False))在 SKILL.md 中使用
执行流程:
1. 获取调用用户:{{user_id}}
2. 调用 hooks/check_permission.py
3. 不允许则终止hooks--82:调用前 → 限流 Hook(防刷)
防止短时间频繁调用,保护系统。
import time, sys, json
RATE_LIMIT = 3 # 每分钟最多 3 次
WINDOW = 60
def check_rate(user):
now = time.time()
# 真实项目可使用 redis / 文件记录
return True
if __name__ == "__main__":
ctx = json.loads(sys.argv[1])
ok = check_rate(ctx.get("user"))
print(json.dumps({"allowed": ok}))在 SKILL.md 中使用
执行流程:
1. 传入参数:{"path": "{{path}}"}
2. 调用 hooks/validate_input.py,获取校验结果
3. 如果不通过 → 直接终止并返回错误信息
4. 继续执行 scripts/rate_limit.pyhooks--83:调用后 → 审计日志 Hook(必备)
谁、何时、调用了什么、参数是什么,安全合规必备。
import sys, json, time
def log_audit(context):
user = context.get("user")
skill = context.get("skill")
args = context.get("args")
now = time.strftime("%Y-%m-%d %H:%M:%S")
log = f"[{now}] 用户={user} 调用技能={skill} 参数={args}"
with open("audit.log", "a", encoding="utf-8") as f:
f.write(log + "\n")
return {"success": True}
if __name__ == "__main__":
log_audit(json.loads(sys.argv[1]))在 SKILL.md 中使用
执行流程:
...
5. 调用完成后,执行 hooks/record_audit.py 记录审计日志hooks--84:异常时 → 错误捕获 Hook
脚本报错自动发飞书告警。
import sys, json, requests
def send_error_alert(msg):
webhook = "https://open.feishu.cn/xxx"
requests.post(webhook, json={
"msg_type": "text",
"content": {"text": f"Skill 执行异常:{msg}"}
})
if __name__ == "__main__":
ctx = json.loads(sys.argv[1])
send_error_alert(ctx.get("error"))在 SKILL.md 中使用
执行流程:
4. 如果执行出错 → 调用 hooks/on_error.py 发送告警hooks--85:调用后 → 临时文件清理 Hook
执行完自动删除 temp 目录,不残留垃圾。
import os, sys, json
def clean(path):
if os.path.exists(path):
os.remove(path)
if __name__ == "__main__":
ctx = json.loads(sys.argv[1])
clean(ctx.get("temp_path"))在 SKILL.md 中使用
执行流程:
...执行结束...
调用 scripts/cleanup_temp.pyhooks--86:Hooks 执行前校验类(before\_*)
| 业务场景 | 约束 | 用途 | 样例 |
|---|---|---|---|
| 1. 输入参数合法性校验 | 必传参数是否存在、格式是否正确 | 防止 AI 调用失败 | hooks/validate\_input.py |
| 2. 调用权限校验 | 只有指定用户 / 角色才能用这个 Skill | 安全、权限控制 | hooks/check\_permission.py |
| 3. 调用频率限流(防刷) | 1 分钟最多调用 3 次 | 防滥用、防压垮服务 | hooks/rate\_limit.py |
| 4. 敏感内容过滤 | 输入含密码、密钥、内网 IP → 拦截 | 防泄密、合规检查 | hooks/filter\_sensitive.py |
| 5. 环境检查 | 检查是否安装 Python / 依赖 / 系统版本 | 提前报错,避免执行崩溃 | hooks/check\_environment.py |
| 6. 业务规则校验 | 磁盘阈值不能 < 50%、路径不能是系统盘 | 守住业务底线 | hooks/validate\_business\_rules.py |
hooks--87:Hooks 执行后观测类(after\_*)
| 业务场景 | 约束 | 用途 | 样例 |
|---|---|---|---|
| 7. 调用日志记录 | 谁、何时、调用了什么、参数是什么 | 可追溯、可审计 | hooks/record\_log.py |
| 8. 审计日志(安全必备) | 高危操作必须留痕:删文件、改配置、发告警 | 安全审计、合规 | hooks/record\_audit.py |
| 9. 执行结果通知 | Skill 跑完发飞书 / 邮件通知 | 实时感知结果 | hooks/notify\_result.py |
| 10. 结果数据归档 / 上报 | 把巡检结果归档到日志平台 | 数据留存、报表 | hooks/archive\_result.py |
| 11. 清理临时文件 | 执行完自动清理 temp 文件 | 不占磁盘、干净运行 | hooks/cleanup\_temp.py |
| 12. 执行耗时统计 | 记录 Skill 运行耗时 | 性能监控、优化 | hooks/track\_duration.py |
hooks--88:事件触发类(on\_*)
| 业务场景 | 约束 | 用途 | 样例 |
|---|---|---|---|
| 13. 出错自动捕获 | Skill 执行失败时自动发告警 | 错误日志可追溯 | hooks/on\_error.py |
| 14. 执行成功触发 | 成功后自动打点、上报状态 | 成功日志可追溯 | hooks/on\_success.py |
| 15. 调用超时保护 | 执行超过 10 秒自动中止 | 调用超时日志可追溯 | hooks/on\_timeout.py |
| 16. 中止 / 取消任务 | 用户中止任务时做收尾 | 中止 / 取消日志可追溯 | hooks/on\_abort.py |
| 17. 敏感操作二次确认 | 删文件、清日志 → 必须确认 | 敏感操作日志可追溯 | hooks/on\_unsafe\_operation.py |
| 18. 结果格式校验 | 输出必须是表格 / JSON / 标准格式 | 结果格式校验 | |
| hooks/validate\_output.py | |||
| 19. 数据脱敏 | 输出内容自动打码手机号、IP、密钥 | 数据安全 | hooks/desensitize\_output.py |
| 20. 自定义业务告警 | 磁盘满、服务挂了 → 触发告警 | 自定义业务告警日志可追溯 | hooks/on\_alert.py |
hooks--89:最推荐的「标准 Hooks 套装」(团队通用版)
如果你想给团队定最少但最实用的一套 hooks,固定下面 8 个就够 99% 场景:
hooks/
before_execute.py # 总入口前校验
validate_input.py # 参数校验
check_permission.py # 权限控制
rate_limit.py # 限流
after_execute.py # 执行后统一处理
record_audit.py # 审计日志(必备)
on_error.py # 错误捕获
cleanup_temp.py # 临时文件清理hooks--90:hooks 职责纯粹原则,只做拦截、校验、观测、审计
hooks 只负责在 Skill 执行前后 “插手” 控制,不做业务功能、不生成结果、不处理数据。
典型职责:
- 调用前:权限校验、参数校验、频率限制
- 调用中:流程拦截、中止判断
- 调用后:记录日志、上报结果、归档、通知
- 全程:审计、安全控制
不属于 hooks 的一律不放:
- 业务脚本、数据处理
- 输出模板
- 静态资源
- 参考知识
如:
hooks/
before_call.py # 调用前校验
after_call.py # 调用后日志
permission_check.py # 权限控制
rate_limit.py # 限流不建议:
hooks/
disk_check.py # 业务脚本,应放 scripts
report.md # 模板,应放 templates
logo.png # 资源,应放 assetshooks--91:hooks 生命周期清晰,与执行流程严格对应
hooks 按 Skill 执行生命周期命名,什么时候触发一目了然。
标准命名风格:
before_*.py:执行前after_*.py:执行后on_*.py:某事件触发validate_*.py:校验类
如:
hooks/
before_execute.py
after_execute.py
validate_input.py
on_error.py
on_success.py不建议:
hooks/
a.py
test.py
do_something.py
钩子1.pyhooks--92:hooks单一职责:一个 hook 只做一件控制事情
和 scripts 一样,hooks 必须职责单一,不要一个文件做所有控制。
便于开关、替换、维护。
建议:
权限校验单独一个 hook
参数校验单独一个
日志单独一个
限流单独一个
如:
hooks/
validate_input.py
check_permission.py
record_log.py不建议:
hooks/control_all.py
# 里面又校验、又记录、又权限、又限流hooks--93:hooks只做控制决策,不做业务实现
hooks 只返回 允许 / 拒绝 / 中止 / 警告 这类决策,不处理业务逻辑、不调用业务接口、不生成输出内容。
建议:
返回:True/False、raise 异常、返回消息
不做:查询数据、生成报告、执行命令
如:
# validate_input.py
def run(args):
if not args.get("user_id"):
raise Exception("缺少 user_id,禁止执行")不建议:
# hook 里写业务逻辑
def run(args):
data = requests.get(...) # 业务请求
result = parse(data) # 业务处理
save(result) # 业务存储hooks--94:hooks无侵入、可插拔,不破坏主流程
hooks 是附加控制,主流程 SKILL.md 不依赖某个 hook 才能跑。
关闭 / 删除 hook 后,Skill 主体功能仍然正常。
建议:
可单独启用 / 禁用
不修改主业务逻辑
不硬编码到 SKILL.md 流程内部
如:
# SKILL.md 执行流程
1. 执行前触发 hooks/before_execute.py
2. 执行业务逻辑
3. 执行后触发 hooks/after_execute.py不建议:
# SKILL.md 里把 hook 逻辑写死在流程里
1. 判断用户权限(写死逻辑,不可插拔)
2. 判断频率(写死逻辑)hooks--95:hooks统一入参出参格式,便于 AI 与框架调用
所有 hook 对外接口保持一致,AI / 调度器可以统一调用,不用逐个适配。
统一结构示例:
- 输入:skill\_context(上下文、参数、用户信息)
输出:
allowed: boolmessage: straction: continue / abort / warn
如:
def hook(context):
return {
"allowed": True,
"message": "校验通过",
"action": "continue"
}不建议:
每个 hook 返回格式不一样:有的返回字符串,有的返回数字,有的直接打印。
hooks--96:hooks优先跨平台 Python,不写系统专属脚本
hooks 是控制层,要稳定可移植,统一使用 Python,不写 .ps1 /.sh。
建议:
跨 Windows/macOS/Linux
权限、校验、日志逻辑一致
便于 AI 调用
如:
hooks/
validate_input.py
record_audit.py不建议:
hooks/
check_permission.ps1
log.shhooks--97:禁止在 hooks中输出最终结果内容
hooks 只做控制与记录,不生成、不修改最终输出。
输出由 templates + AI 主流程负责。
建议:
不写报告、表格、文案
不修改返回结果
只记录、拦截、校验
如:
# 只记录,不输出结果
def after_execute(context, result):
audit_log(f"用户 {context.user} 调用了 {context.skill}")不建议:
def after_execute(...):
print("最终报告:……") # 输出业务结果,错误hooks--98:hooks 安全与审计优先,必须可追溯
凡是涉及权限、敏感操作的 hook,必须留日志、可追溯、不可篡改。
记录至少包含:
- 用户 / 调用方
- 时间
- 输入参数(脱敏)
- 执行结果
- 是否被拦截
如:
# record_audit.py
with open("audit.log", "a", encoding="utf-8") as f:
f.write(f"{time} | {user} | {skill} | {allowed}\n")不建议:
无任何记录,出问题无法追溯。
hooks--99:hooks 命名规范:小写、下划线、语义明确
文件名小写英文 + 下划线,禁止中文、空格、特殊字符、版本号后缀。
建议:
hooks/
before_execute.py
validate_input.py
check_permission.py
record_audit_log.py不建议:
钩子.py
校验新的.pl
Hook最终版(修改).pyhooks--100:hooks 禁止放业务配置、静态资源、参考资料
hooks 只放控制逻辑,不放任何其他类型文件。
建议:
只放拦截、校验、日志类脚本。
不建议:
hooks/
config.json
api.md
logo.png
template.mdhooks--101:hooks 轻量、快速、不阻塞主流程
hook 执行要极快,不做复杂计算、不请求慢接口、不阻塞 Skill 主流程。
建议:
不做网络大文件下载
不做复杂数据计算
不做 heavy 逻辑
简单判断、快速写入日志、内存校验。
不建议:
hook 里执行模型推理、爬取网页、压缩文件等耗时操作。
9 \_meta.json
\_meta.json = Skill 的身份证 + 档案表 + 管理元数据
专门存放:版本、作者、分类、标签、依赖、更新日志、权限、描述等管理用信息,不参与业务执行,只给平台 / 工具 / 人做管理使用。
\_meta.json 模板样式
{
"name": "skill-disk-monitor",
"version": "1.0.0",
"author": "your-name",
"description": "磁盘使用率巡检与阈值告警",
"category": "system",
"tags": ["disk", "monitor", "alert", "system"],
"dependencies": {
"python": "3.8+",
"libs": ["psutil", "requests"]
},
"create_time": "2026-04-07T00:00:00Z",
"update_time": "2026-04-07T00:00:00Z",
"language": "zh-CN",
"level": "stable",
# 自定义增加项(可自定义)
"xxx":"xxxxxxxx"
}附1 - Skill 金句
Skills 能把我们的最佳实践、流程和经验,以一种可维护、可复用的方式,输入给 AI,让 AI 变得更聪明。
未来普通人使用 Agent,未必是天天重写 Prompt,而更可能是围绕一组已经沉淀好的 Skills,去持续调用、组合和优化。
用的人越多,积累的经验越多,Skills 的质量和覆盖面就越广,Skills 不再是个人本地的“小本本”,而是一个可共享、可迭代、可组合的能力生态。
一个 skill 就干一件事,单一职责,skill 越简单,触发越精准,执行越稳定。
附2 - 本文编号规约
编号规约 : [ 分层 ] - [ 对象 ] - (PR|SP|RE|PE|BE ) - (001)
所有技巧,统一“6级标题”目录
定义如下:
| [ 分层 ] | [ 对象 ] | (短标识) | 说明 | 举例 |
|---|---|---|---|---|
| skillpackage | skill技能包范围 | skillpackage-PR-001 | ||
| SKILL.md | skill主文件SKILL.md范围 | SKILL.md-SP-001 | ||
| name | SKILL.md的name属性 | name-PR-001name-SP-001name-PE-001 | ||
| description | SKILL.md的description属性 | description-PR-001 | ||
| instructions | SKILL.md的instructions属性 | instructions-SP-001 | ||
| ... | SKILL.md的 其他... 属性 | |||
| resources | skill资源包范围 | resources-PR-001 | ||
| assets | skill资源包assets类别范围 | assets-PR-001 | ||
| scripts | skill资源包scripts类别范围 | scripts-SP-001 | ||
| templates | skill资源包templates类别范围 | templates-PE-001 | ||
| examples | skill资源包examples类别范围 | examples-RE-001 | ||
| ... | skill资源包 其他... 类别范围 | |||
| hooks | skill技能包 hooks 范围 | hooks-PR-001 | ||
| ... |
短标识定义:
| 中文 | 全称 | 本文短标识缩写 | 备注 |
|---|---|---|---|
| 原则 | Principle | PR | Principle →PRIN,应该遵守的框架 |
| 规范 | Specification | SP | Specification →SPEC,有约束动作,不遵守会出问题 |
| 建议 | Recommendation | RE | Recommendation →REC,遵守后会带来方便,如可读性、结构性等等 |
| 正例 | Positive Example | PE | Positive example →PE,效果较好的实践,建议遵守 |
| 反例 | Counter Example | BE | Counterexample →CE,经验中的问题,建议遵守不重犯 |
附3 - 关键更新记录
| 更新日期 | 关键更新内容简述 | 原著权益及授权声明 |
|---|---|---|
| 2026-03-01 | 初稿输出 | iLearnAI |
| 2026-04-01 | 增加部分经验 | 【公众号-⼩徐做数分】写出好 Skills 的 5 条铁律!建议收藏\~ [https://mp.weixin.qq.com/s/nDXGKtEXBq\_En8RWilrNXQ] |
| 2026-05-01 | 增加部分经验 | 【公众号-测试论道】⼿把⼿教你⽤ ClaudeCode 打造测试⽤例设计 Skill,从 0 到 1 全流程 [https://mp.weixin.qq.com/s/YZEj6RhGr1Y31cxMkS8tHg] |
| 2026-06-1 | 增加较多基于 AgentSkillsHub 67,000+ 真实 Skill 数据的原⽣研究的经验和规范 | 原著链接:https://github.com/zhuyansen/skill-blue-book采用 CC BY-NC-SA 4.0 许可证:可以自由阅读、下载、转发、改写后再分享,但不可商业性售卖或打包成付费课程。文中参考的内容,均适遵守本许可证。 |
| | | | |
| - | - | - | - |
觉得内容不错?我要