← 研究笔记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可选,不超过 500 字符Requires 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 从顶层contextmodel 这些键,塞进 metadata 只会让 context: fork 之类静默失效,行为和你文档写的不一致。开源就老实只写 6 键;要给 CC 用户的私有行为,在 README 里给一段可粘贴 patch。

二、description:决定能不能被选中的那一行

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

第三条是对开源作者最致命的机制【已收窄】,它构成一个冷启动死循环:用户装了 40 个 skill,你的新 skill 从没被调用过,于是排在第一个被降级成只剩 name,没有 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:descriptionwhen_to_use 只能 append,绝不删或收窄触发词,删了会静默失效,模型直接不再加载,而且没有报错。但要清醒,裸 skill 上的 semver 只是沟通约定,不是强制,没有渠道解析 semver 范围,版本打在 plugin 层才有真实版本串。git tag 用 {plugin-name}--v{version}(双连字符),裸 v1.2.0 会让依赖你的插件解析失败。

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

十一、治理与度量

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

度量要区分虚荣指标和有信息量的指标。主判据是有 skill 与无 skill 的 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 · 转载注明出处