Anatomy
四个目录,四类职责,一条加载生命周期。搞清楚什么东西该放哪儿,Skill 就写好了一半。
01 · Structure
点击左侧任一节点,看它的职责与判断依据。
选中左侧节点查看详情。
02 · Lifecycle
从一个 Skill 被安装,到它被真正执行,中间发生了六件事。
Agent 启动时扫描 skill 目录(用户级 + 项目级),解析每个 SKILL.md 的 frontmatter,
把 name 与 description 载入索引。
此后每一轮对话,上下文中只有各个 Skill 的名字与一句话描述。 这是唯一的常驻成本,也是路由的唯一依据。
模型读用户请求,与所有 description 做匹配。这一步的准确率, 完全取决于 description 的写法——它不是一个描述,是一段路由规则。
命中后,读取 SKILL.md 正文全文并注入上下文。正文必须自足——
读完就能启动任务,不需要再到处找信息。
执行过程中,正文里的条件句指名了才去读 references/;需要时才调
scripts/(通常只读输出,不读源码);套模板时才取 assets/。
任务完成后执行「交付前自查」。遇到 Skill 未覆盖的情况,把新的做法回写进
SKILL.md——这是 Skill 越用越准的唯一原因。
03 · Frontmatter
字段不在多,在于「被谁读」。只有两个字段是普遍必需的。
| 字段 | 必需 | 作用 | 写法要点 |
|---|---|---|---|
name | 必需 | 唯一标识 | 小写字母 + 连字符,与目录名一致。用「动作-对象」结构,避开 helper/utils 这类通用词 |
description | 必需 | 触发路由的唯一依据 | 一句话功能 + 什么时候用 + 至少 3 个真实触发词。30–80 字为宜 |
agent_created | 推荐 | 标记为 AI 创建 | 允许被自动化工具改写。想让 Skill 支持自我进化就加上 |
version | 可选 | 版本追踪 | 配合 git 使用,主要给人类看 |
allowed-tools | 视平台 | 限制可用工具 | 只对只读类 Skill 有意义,能显著降低误操作风险 |
read_when | 视平台 | 补充加载条件 | 与 description 互补,写更细的加载判据 |
04 · Responsibility
一条根本原则:让模型做判断,让代码做计算。
判据:如果这件事每次的结果必须一模一样,就该是脚本。
判据:模型需要知道,但不是每次都需要知道。
references/ ├── fill-forms.md ← 只有填表单时读 ├── extract-tables.md ← 只有抽表格时读 ├── ocr-fallback.md ← 只有遇扫描件时读 └── troubleshooting.md ← 只有报错时读
ocr-fallback.md,
结合正文的「若遇到扫描件则读取…」,就能做出正确判断。
判据:不需要被读进上下文思考,而是被直接拿去用。
判据:每次执行都必须读的部分,才留在正文。
05 · Cost
理解这张表,就理解了为什么 Skill 能装 100 个而不炸。
| 层级 | 何时被读取 | 典型体积 | 成本类型 |
|---|---|---|---|
name + description | 每轮对话,始终在上下文 | ~50–100 token | 常驻 |
SKILL.md 正文 | 命中触发后 | 建议 < 500 行 | 一次性 |
references/*.md | 正文指名要读时 | 按需 | 惰性 |
scripts/* | 需要执行时(通常只读输出) | 极低 | 惰性 |
assets/* | 需要套用模板时 | 通常不读入 | 惰性 |