Skills 与插件
开发插件
清单参考、贡献点一览、打包与发布流程。
面向想把插件发到 CoWork 市场的作者。工具链:create-nextcowork-plugin 生成骨架,@aidotnet/plugin-api 提供类型,nextcowork-plugin 负责打包与发布。
快速开始
npm create nextcowork-plugin@latest问三样(publisher / name / 显示名),生成一份已经能上架的骨架:清单字段齐全、两种语言的 l10n 都在、贡献点的 title 全是 %key%。骨架不会替你选能力——需要时再往 permissions 里加。
代码里通过类型包写宿主 API,nextcowork 打包时标 external,运行期由宿主注入:
import * as ncw from "nextcowork";
export function activate(context: ncw.ExtensionContext): void {
context.subscriptions.push(
ncw.commands.registerCommand("acme.hello", () =>
ncw.window.showMessage("info", "acme.demo.hello"),
),
);
}宿主侧的运行时 API 按命名空间分:env、appearance、permissions、workspace、process、net、storage、secrets、window、tabs、configuration、diagnostics、plugins。类型文件里没有出现的 API,运行期会被白名单挡掉——所以编译通过就不会遇到「这个方法不存在」。
清单(package.json)
| 字段 | 规则 |
|---|---|
name / publisher | 各匹配 ^[a-z0-9][a-z0-9-]{0,63}$;插件 id 是 publisher.name,全局唯一 |
version | semver |
kind | extension(缺省,有代码)或 webapp(零代码,只有 contributes.webApps,写了 main 会被整份拒绝) |
engines.nextcowork | 插件 API 版本 range(^x.y.z 等),比的是 API 版本不是应用版本 |
main | 单文件 ESM 的相对路径;webapp 为空串 |
activationEvents | onCommand: / onView: / onCustomEditor: / onTool: / onWorkspaceContains: / onWebApp: / onSlashCommand:,及 onStartup(市场审核默认驳回) |
permissions / optionalPermissions | 能力数组,见插件的权限模型 |
hostPermissions | 出网域名白名单 |
allowedCommands | 可执行命令白名单(裸命令名,不带路径后缀) |
dependencies | 依赖的其它插件(pluginId → range),是 ncw.plugins.connect 的准入门,也决定激活顺序 |
l10n | 本地化目录;清单里的可见文案写 %key%,不写死文案 |
贡献点(contributes)
| 键 | 说明 |
|---|---|
commands | 命令(command + %title%),其他贡献点最终都落到命令 |
menus | 菜单挂载点:tabBar/new、tabBar/context、explorer/context、explorer/new、sidebar/nav、chat/composer、commandPalette |
slashCommands | 输入框 /xxx;每条背后必须是一条已声明的命令 |
tools | Agent 工具(registerTool + inputSchema;可标 readOnly / destructive / needsNetwork / interactive) |
cardViews | 工具返回 frame 卡片时的 HTML,按 viewType 索引 |
customEditors | 按 filenamePattern 接管文件类型的编辑器 |
views | 侧栏常驻视图 / 内层 Tab(editor / sidebar / panel) |
webApps | 写死地址的网页应用(仅 https,装载时过 URL 门) |
skills | 包内自带 Skill,见插件 Skill |
agents / modes / themes | 子代理、模式、主题(与 skills 同形) |
keybindings | 快捷键(command + key + when) |
configuration | 配置项(boolean / string / number / enum) |
清单的合并规则有安全约束:插件菜单项永远排在内置项之后;单插件单菜单最多直出 3 项,其余折叠进二级菜单;图标从白名单里选;when 条件用受限表达式求值,读不懂一律不显示。
每类贡献点上限 100 项;清单认得但这一版不实现的贡献点进 unsupported 诊断,不会静默消失。
打包与发布
npx nextcowork-plugin login # 浏览器授权登录(与桌面端同一 OAuth + PKCE 流程)
npx nextcowork-plugin package . # 校验清单并打出 ZIP
npx nextcowork-plugin publish . # 打包 → 上传 → 提交审核- 本地校验与服务端的包校验逐条一致:路径穿越、单顶层目录、清单形状、能力白名单、skills 布局逐条重查,当场炸而不是上传后才被拒。
- 包限制:ZIP ≤ 20 MB,展开 ≤ 50 MB,≤ 2000 个条目,目录深度 ≤ 12,路径 ≤ 512 字符,图标 ≤ 256 KB。
- 发布的是
publisher.name@version;--changelog随版本提交更新说明。 - CLI 登录会作为一条桌面端会话出现在网站「账户 › 会话」里,可以像踢掉一台设备一样踢掉它。
上架审核
- 审核看到的是清单里那两个能力数组——请只声明你真实用到的能力。
onStartup激活默认驳回(每个常驻插件是一个 renderer 进程);优先用具体事件激活。- 包自带 Skill 会在市场详情页列出名字,
description请认真写。