Skills 与插件
插件 Skill
插件包内自带 Skill 的机制:扫描、优先级、启用撤回与市场展示。
插件可以在包里自带 Skill,随插件一起分发。这一页讲清「它什么时候生效、同名谁赢、市场页展示什么」。
生效条件
客户端管理器向 Skill 扫描器提供已启用插件的 Skill 目录(绝对路径),判定是逐条过的筛子:
- 插件必须启用:处于禁用、装载错误(
error)或待批准(pending-approval)状态的插件,一个目录都不会贡献——那正是用户还没点同意的东西。 - 禁用或卸载插件后,它带来的 Skill 下一轮扫描就不在了:扫描器每次装配前都重新取目录清单,不做缓存。
优先级
扫描顺序即优先级,后进的覆盖先进的:
- 插件(最低——插件带来的是合理默认,用户自己写的永远说了算)
- 全局
~/.next-cowork/skills/ - 项目
.next-cowork/skills/(最高)
反过来的话,用户在项目里放一条同名覆盖会毫无反应,而界面上两条都在。
两个插件贡献同名:按插件 id 排序先来的赢,并在诊断里写明「插件 A 和 B 都提供了名为 X 的 Skill,这一条已跳过」——结果在每台机器上一致,不取决于安装顺序。
包内布局与清单声明
my-plugin/
├── package.json # contributes.skills: [{ "path": "skills/my-skill" }]
└── skills/
└── my-skill/
└── SKILL.md- 路径必须是
skills/<name>两段:打包只会带上skills/目录,写在别处的 Skill 不会出现在包里。 <name>必须匹配^[a-z0-9][a-z0-9-]{0,63}$——它原样作为 Skill 名字交给模型。- 名字与描述只来自
SKILL.md的 frontmatter,清单里不重复声明(声明两遍必然分叉)。 - frontmatter 缺
description会整条作废:没有描述,模型无从判断什么时候该用它。 - 目录安装(开发时的「装本地目录」)里指向包外的符号链接会被拒绝——
SKILL.md的正文是要进模型上下文的。
完整字段约束见 Skills 的「SKILL.md 的规则」。
服务端校验一致
市场上传时,服务端会逐条重查同一套规则(路径形状、目录名、SKILL.md 存在且 ≤ 256 KiB、frontmatter 有 description、包内不重名)。本地 nextcowork-plugin package 与其逐条一致——校验不通过的包在打包当场就炸,不会等上传才被告知。
市场展示
插件详情页会列出包自带的 Skill 名字(发布时服务端从 skills/<name>/SKILL.md 的 frontmatter 逐个读出)。所以上架前请把 description 写好:它是市场卡片上用户判断「这条 Skill 干什么」的唯一文字,也是客户端里模型判断「什么时候调它」的唯一依据。