← 研究笔记English
技术研究 · 2026-07-24 · 24 分钟阅读 · 考据

从零做一个高质量 Agent Skill,并把它当开源项目运营

做一个 skill 的难点不在写 markdown。它藏在两件反直觉的事里:决定生死的是 description 那一行,而它的失败方式是「整条被系统丢弃」而不是「写得不够好」;而开源之后,skill 的默认结局是零采用——决定有没有人用的,几乎与代码质量无关。这篇按证据把两件事拆开讲。

研究声明

本文审查「从零做一个高质量 Agent Skill(SKILL.md + 打包代码)并在 GitHub 长期运营」的能力边界。150 个研究代理并行检索,45 条载重结论各经 3 个独立视角对抗核验(技术机制 / 实践现实 / 时效性),核验时被要求默认「这条站不住,除非你能确认」,并尽量去抓一手来源。

核验真的动手了:去读了 agentskills.io/specification、Anthropic 官方仓库的 quick_validate.py、以及本机已安装的 17 个官方 skill,纠正了初稿里大量凭记忆写错的字段名与数字。分档:【稳】=有一手来源、经得起三视角 · 【已收窄】=初稿被推翻或大幅限定,此处给修正版 · 【判断】=分析推导。

时效说明:本轮联网搜索额度耗尽,只能靠模型知识(截止约 2026 年初)+ 抓已知权威 URL。2026 年 2–7 月是明确盲区,而 Claude Code 迭代极快(核验中出现 v2.1.129 到 2.1.218 十几个 min-version 门控)。凡涉及版本/功能名/定价的结论都请当作可能过期,发布前用当前版本实测复验。

2026-07-27 更新 · 一手来源

上面的时效声明兑现了:Claude Code 团队的 Thariq(@trq212)2026-07-25 发布《The new rules of context engineering for Claude 5 models》,把盲区里「上下文工程」这一块补上了。四条直接影响本文建议,均为一手口径:

  • 约束密度要降。Claude 5 代(Opus 5 / Fable 5)上,官方把 Claude Code 系统提示词删掉 80% 以上,编码评测无可测退化——过去防最坏情况的硬规则,新模型靠周边上下文和判断就能处理。skill 正文同理,官方原话:「避免过度约束,除非真正要害」。本文第三节的写法仍成立,但禁令清单要收窄到不可违背的少数,其余交给模型判断。
  • 「给例子」从最佳实践降级为反模式。新模型上,few-shot 示例会把探索空间钉死;官方替代是「设计接口」——参数命名与取值本身就是提示(todo 工具靠 pending/in_progress/completed 三个枚举值就说清了用法)。写 scripts/ 的参数签名时把表达力设计进去,别再堆示例。
  • 渐进披露从省 token 技巧升级为官方主线。长 skill 官方明确「尽量拆成多文件」;Claude Code 自己把 code review / verification 拆成按需加载的 skill,部分工具改为 deferred loading(用到才经 ToolSearch 加载定义)。第五节的 references/ 经济学被一手确认。
  • skill 定位官方一句话:「轻量指南,编码你/你团队/你产品特有的观点、知识与实践」。模型已经会的通用知识别写,写你们与众不同的判断。配套新命令 /doctor(claude doctor)可自动「rightsize」你的 skill 与 CLAUDE.md。

第八节边界表也要修一行:记忆已从 CLAUDE.md 拆出——Claude 现在自动写 memory,靠 # 快捷键存进 CLAUDE.md 的习惯过时;CLAUDE.md 回归轻量:一句话说明仓库是干嘛的,token 花在 gotcha 上,别写模型自己看得出来的东西

先给总纲:一个高质量 skill 要同时赢两场。造出来是「让模型在装了几十个 skill 的环境里,靠一行描述可靠地选中你」;运营起来是「让陌生人在一个中位安装数为 1 的货架上找到并信任你」。两场的胜负手都不在你以为的地方——不在正文写得多精巧,而在触发面的字节预算,和分发货架的策展逻辑。

一、先认清「规范 vs Claude Code」这条分叉

这是最底层的一刀,后面所有决策都建在它上面【稳】。Agent Skills 有一份跨厂商开放规范(agentskills.io),Cursor、Gemini CLI、VS Code Copilot、OpenAI Codex 等 40+ 工具都在实现它;而 Claude Code 在规范之上有一大堆私有扩展。两者的字段集不一样,写错就掉进「本地能跑、发出去别人用不了」的坑。

可移植的 frontmatter 是一个仅 6 键的白名单:

字段约束(规范)要点
name必填,1–64,^[a-z0-9-]+$,不首尾连字符、无 --必须等于父目录名(skills-ref 会强制);CC 允许两者不同,想可移植就让它们相等
description必填,1–1024 字符,非空,不含尖括号决定触发的那一行,见下节
license可选建议短:Apache-2.0
compatibility可选,≤500Requires git, docker, jq
metadata可选,string→string见下方警告
allowed-tools可选,标 Experimental不是沙箱,见第七节

Claude Code 私有多出约 14 个字段(when_to_usepathscontextmodelhooksdisable-model-invocation…),全部不在白名单里。两个参考校验器(Anthropic 的 quick_validate.py、agentskills 的 skills-ref)对多余键都直接报 Unexpected key(s)

最容易踩的一个错:把 Claude Code 私有字段塞进 metadata: 求「兼容」。【已收窄】这在机制上无效——CC 从顶层context/model 这些键,塞进 metadata 只会让 context: fork 之类静默失效,行为和你文档写的不一致。开源就老实只写 6 键;要给 CC 用户的私有行为,在 README 里给一段可粘贴 patch。

二、description:决定生死的那一行

启动时进上下文的只有每个 skill 的 name + description(CC 还会拼上 when_to_use)。模型要在「可能上百个 skill」里靠这一行做匹配——它是自主触发时的主要匹配文本。这里有三个必须分清的长度预算:

第三条是对开源作者最致命的机制【已收窄】,它构成一个冷启动死循环:用户装了 40 个 skill,你的新 skill 从没被调用过 → 排在第一个被降级成 name-only → 没有 description 可供匹配 → 永远不会自动触发 → 于是永远是「最少调用」。写多长的描述都救不了,因为它整条不在上下文里了。

两个能救的动作:①把最强触发词放在 description 的前 200 字符,即使被砍到只剩前段也能匹配;②在 README 里明确写「首次请用 /your-skill 手动调一次」,把它顶出「最少调用」队列。

怎么写(官方自家 skill 实证)

必须第三人称,但别误读成「只能写名词短语」。Anthropic 最好的 skill 用的是祈使句对 agent 说话——Use this skill whenever the user wants to…。被禁的是作者第一人称和对终端用户说的 You can use this to…(理由:描述被注入 system prompt,人称不一致会伤 discovery)。

长度不是固定区间,是歧义度的函数。实测官方样本 description 字符数中位数 231,不是「一句话」:

负向边界是可选的第三段,别默认全加。只有当你的仓库里有 ≥2 个语义相邻的 skill、且抢的方向明确时才写 Do NOT trigger when…——因为每个 skill 的 description 都常驻,排除子句对所有请求都收 token 税,这正是 Anthropic 17 个 skill 里只有 4 个用它的原因。

诊断顺序

/skill-name 手动能跑、自动从不触发,首要嫌疑是 description,但不是唯一。先按序排除:①frontmatter YAML 解析失败(描述里裸冒号/引号会让 skill 静默不加载,--debug 才看得到,症状和「没触发」一模一样);②任务太简单(「read this PDF」这类单步任务无论描述怎么写都不触发,官方明说 Claude 只对「自己不容易搞定」的任务查 skill);③CC 倾向 undertrigger,官方处方是描述里加一句「a little bit pushy」的 push 子句。

三、SKILL.md 正文:双峰,不是「取中间值」

实测 Anthropic 17 个非模板 SKILL.md,行数是明显的双峰【已收窄】,不是单一目标值,中间 129→236 行是空档:

按类型选档,别取中间值。规范里的 <500 行 / <5000 token推荐不是硬拒(claude-api skill 自己就 68KB/约 17k token)。但要知道机制:Claude Code 的 auto-compaction 只保留每个 skill 的前 5000 token,所有重挂 skill 共享 25000、从最近调用往回填、老的整份丢掉——所以不可违背的铁律必须写在文件顶部

语气用「常驻指令」——第二人称祈使、现在时,禁 we'll / let's / in this guide(叙事化流水账的残留)。体裁是「决策表 + 不变量 + 坑清单 + 指路牌」,不是散文:H1 之后第一个元素最好是一张 3–7 行的 | Task | Approach | 路由表(Office 家族惯例),而不是复述 description 的 Overview 段。同一信息,直接给代码 ≈ 50 token,先科普再选型 ≈ 150 token——3 倍开销零增量。(2026-07 注:Claude 5 代的一手口径是「除要害外避免过度约束」——路由表和坑清单保留,禁令收窄到不可违背的少数,见文首更新框。)

四、脚本:不要先验决定「这该写脚本」

最反直觉的一条【稳】:别拍脑袋决定哪块写成脚本。做法是——草稿写完,拿 2–3 条真实用户口吻的 prompt,在同一轮同时开两个 subagent:一个带 skill、一个不带,然后读 transcript,看模型在带 skill 那一臂里仍然自己现写的同一个 helper——那才固化成 scripts/ 里的文件。判断类任务(取舍/命名/版式/语气)永远留给模型。(此法只在 Claude Code 成立;claude.ai 无 subagent,要另写降级流程。)

落地约定:

五、references/:不是加载器契约,是命名习惯

唯一让文件被读到的机制,是 SKILL.md 正文里一条模型愿意照着 Read 的路径字符串【稳】。references/ 这个目录名本身没有任何魔力。推论很硬:

六、评测:两份物理分离的文件

触发评测和执行评测必须分开,合成一份就无法定位失败层【稳】:

现成工具就一个能打:官方 skill-creator 插件(/plugin install skill-creator@claude-plugins-official),把两类评测、grading、盲测 A/B、HTML 评审页全包了。平台文档里「没有内置评测方式」那句已落后于它。⚠️两个真实坑:目录字母序会让 delta 符号反(把主目录命名 new_skill/ 避开);没有 timing.json 时 tokens 字段会静默变成字符数——所以每个 run 结束的通知要当场落盘 timing。

七、安全:allowed-tools 不是沙箱

最常见的致命误解【已收窄】:allowed-tools 是「本轮免确认授权」,不是能力限制;它在你发下一条消息时就清除。disallowed-tools 也是一轮、且是 Claude Code 专有。没有任何 frontmatter 字段是沙箱。真正的安全边界只有 settings.jsonpermissions.deny(及企业策略)。想让 skill 只读,在 README 给用户一段可粘贴的 deny 配置,别靠 frontmatter。

供应链风险的真实排序(在本机 137 个真实 SKILL.md 上校准):

  1. skill 自授 allowed-tools(尤其 Bash(*))+ 捆绑 scripts/ 里的 payload——这才是头号入口。
  2. .claude-plugin/plugin.json 让目录带 agents/hooks/.mcp.json 一起加载。
  3. hooks: frontmatter。
  4. !`cmd` 预处理(渲染阶段、模型看到前就执行)——真实出现率≈0,但一旦出现就是零交互执行。

一次性总闸:~/.claude/settings.json"disableSkillShellExecution": true。核心认知:安装一个 skill,在威胁模型上等同于安装一个可执行软件;发布方的安全责任 = 一份可机读的能力声明 + 一份可复现的审计清单 + 一份针对 prompt injection 的 SECURITY.md。

八、边界:skill / MCP / subagent / command / CLAUDE.md 怎么选

这是选错代价最大的一维。先破除一个过时的心智模型:slash command 已并入 skill——.claude/commands/deploy.md.claude/skills/deploy/SKILL.md 都产出 /deploy 且行为相同【已收窄】。所以问题不是「做 skill 还是 command」。判别式:

需求选它为什么
要新增工具 / 传输层 / 鉴权(OAuth、长连接、动态工具表)MCP五者里只有 MCP 能凭空造工具;skill 只能编排已有工具 + 自带脚本。且二者可同仓交付(skill 目录加个 plugin.json)
必须每次都发生(禁 push main、提交前必跑)hookskill 和 CLAUDE.md 都是「请求」不是「保证」;hook 才是执行保证。这是最容易付真实代价的误选
每 session 必为真的事实(构建命令、目录约定)CLAUDE.md它是唯一能穿过 /compact 从磁盘重读复活的层;skill 写「贯穿全任务的规则」在长 session 会被静默截断/丢弃
碰某类文件才跑的多步流程skill + paths:skill 也支持 paths: glob,别硬塞进 rules
要独立上下文跑的一次性任务skill + context: forksubagent 是 skill 的一个开关,不是并列的第五种东西

九、分发与冷启动:最反鸡汤的一维

先看证据【已收窄】:官方目录的安装数是极端幂律——某快照 265 个插件、361 万次安装,top10 占 53.8%,中位数 = 1,52% 的插件恰好只有 1 次安装。而排第一的 frontend-design 是个 41 行 SKILL.md、零脚本的东西。两个结论同时成立:代码量不是头部的条件;光「进了货架」几乎一文不值(头部 8/10 是 Anthropic 自家或大厂)。决定采用的是「被策展 / 品牌」,不是「上架」本身。

可执行的落地:

十、把它当开源项目:仓库、版本、CI

仓库最小可信集

版本与发版

SKILL.md 没有 version 字段。真正决定「用户能否收到更新」的是 .claude-plugin/plugin.jsonversion——它是 Claude Code 的更新缓存键,不 bump 等于没发版【稳,CONFIRMED】。内容型 semver 按触发面 + 环境契约定 breaking:description/when_to_use 只能 append,绝不删或收窄触发词(删了静默失效,模型直接不再加载、无报错)。但要清醒:裸 skill 上的 semver 只是沟通约定不是强制(没有渠道解析 semver 范围),版本打在 plugin 层才有真实版本串。git tag 用 {plugin-name}--v{version}(双连字符),裸 v1.2.0 会让依赖你的插件解析失败。

CI(markdown 为主的仓库怎么做有意义的门禁)

十一、治理与度量

三条经三视角全票通过【稳,CONFIRMED】:

度量要区分虚荣和信息量:主判据是 with/without 的 pass_rate delta(不是唯一——tool_calls 开销差、盲评 winner、触发准确度都独立有信息量)。star 与真实使用几乎脱钩;裸 skill 没有下载注册表,常用的四个健康比值只有两个(merged-PR/star、issue 关闭率)能直接算,想要下载数得额外包成 plugin/npm。Release 附件的 download_count 是最干净的装机代理(公开、零 PII、累计不丢)。永远别在 SKILL.md 或脚本里埋 curl 打点——它跑在别人的 agent session 里,这是「同意」问题不是技术问题。

最后一个必然会遇到的现实:AI 生成的 PR 洪水是 skill 仓库的默认结局(Anthropic 自己的 skills 仓 1023 个 PR 只 merge 44、742 个挂着、根目录连 CONTRIBUTING 都没有)。提前装闸门,interaction-limits 当临时限流而非永久关门。

十二、这份研究没能覆盖的

主要来源(经三视角核验,均抓一手):Agent Skills 开放规范 agentskills.io/specification(6 键 frontmatter 白名单、name/description/compatibility 约束);Anthropic 官方仓库 anthropics/skillsskills/skill-creator/scripts/quick_validate.py(ALLOWED_PROPERTIES 集合、尖括号拒绝、名长上限)、skills/pdf|docx|xlsx|pptx/SKILL.md(真实 description 长度与体裁、license: Proprietary)、scripts/office/validate.py(两档退出码)、评测工具链 run_eval.py/run_loop.py/aggregate_benchmark.py;agentskills/agentskillsskills-ref/src/skills_ref/validator.py(name==父目录名强制、demonstration-only 声明);Claude Code 官方文档 code.claude.com/docs/en/skills(17 字段 frontmatter 表、1536 字符 listing 截断、1% listing 预算与降级、5000/25000 token 压缩、allowed-tools 一轮授权语义、disableSkillShellExecution、slash command 已并入 skill);platform.claude.com 的 Agent Skills overview 与 best-practices(plan-validate-execute、progressive disclosure、eval 三步、one-level-deep 引用);官方 plugin 目录本机遥测快照(265 插件 / 361 万安装 / 中位数 1 / top10=53.8%);GitHub 社区健康文件文档、choosealicense(MIT vs Apache-2.0 权限表)、Keep a Changelog、CNCF/Node.js 治理文档。共 45 条载重结论进入三视角对抗核验(8 全票 / 37 部分修正 / 0 推翻),本文写的是修正版;分档与时效风险已逐条标注。2026-07-27 增补来源:Thariq(Claude Code 团队)《The new rules of context engineering for Claude 5 models》,x.com/trq212,2026-07-25。

Amos · research.xishe.ai · 转载注明出处