发布插件 = 做成 bundle(发行层,L10 讲过)。最小目录结构与三份文件:
hello-plugin/
├── package.json # 声明 dsh.bundle
├── cordis.patch.yml # 该包贡献的配置层
└── index.js # 补丁行引用的插件模块
// package.json —— 关键是 dsh.bundle 指向补丁文件
{
"name": "dsh-hello-plugin",
"version": "0.1.0",
"type": "module",
"main": "index.js",
"files": ["index.js", "cordis.patch.yml"],
"dsh": { "bundle": { "patch": "./cordis.patch.yml" } }
}
// index.js —— 插件本体
export const name = 'hello-plugin'
export function apply() { console.log('[hello-plugin] loaded!') }
# cordis.patch.yml —— 注意:按"包名"引用(Node 解析),不是绝对路径
- insert:
- id: hello
name: dsh-hello-plugin
dsh plugin --profile demo add ./hello-plugin # 首次自动初始化 profile(含 dsh-base)
dsh --profile demo --dump-config # 应出现 "# == dsh-hello-plugin" 层注释
dsh --profile demo # 启动
dsh plugin --profile demo remove dsh-hello-plugin # 连依赖带层一起删
安装后 profile 的 package.json 自动出现 dsh.profile.bundles 清单(dsh-base 在前,你的包追加在后),不用手写。
| 方式 | 命令 | 特点 |
|---|---|---|
| npm 发布 | dsh plugin add your-package | 最顺滑:发布时已构建好 lib/,用户装的是成品 |
| tarball | dsh plugin add ./x-0.1.0.tgz | pnpm pack 打包,同样免构建权限 |
| Git 直装 | dsh plugin add github:you/hello-plugin | 拉的是源码不是产物——见下面的坑 |
prepare 脚本(pnpm 在 git 安装后执行它构建),不能假设有 monorepo 环境;pnpm-workspace.yaml(allowBuilds: { 包名: true })再 add。github:you/x#<sha> 钉住 commit 防偷换。不想麻烦用户就走 npm / tarball。
dsh-plugin topic——官方按这个话题发现插件;拿到任何社区插件按此顺序读,10 分钟出结论:
| 步 | 看哪 | 回答什么 |
|---|---|---|
| ① manifest | package.json 的 dsh 字段 | 它是 bundle(贡献层)还是普通库?依赖哪些包? |
| ② inject | 源码的 inject 声明 | 它站在谁的肩膀上?(tools?某能力缝?) |
| ③ apply | apply 里注册了什么 | 它的本质动作:注册工具?挂监听器?提供服务? |
| ④ Config | 导出的 Config/Schema | 怎么配?有哪些必填?默认值合理吗? |
| ⑤ README | Model Experience 段 | 对模型行为和 token 开销有什么影响? |
叠加 L06 的角色判断:③里"实现某个抽象服务"→Provider;"调用某服务并注册工具"→Consumer;"只声明抽象类和类型"→Definition。角色 + 五步 = 任何插件的完整画像。
| 形态 | 识别特征 | 仓库内标准范例 |
|---|---|---|
| 工具型 | inject ['tools'] + defineTool | packages/todo/ |
| 拦截/策略型 | ctx.on 挂 waterfall 事件 | packages/guard/(循环卫生) |
| Provider 型 | extends 抽象 Service | dsh-bash-local |
| Definition 型 | 导出抽象类 + Request/Result 类型 | dsh-shell |
| UI 型 | ConversationNode / 设置卡片 | packages/client/web/ |
| 协议桥型 | stdio/wire ↔ ctx.agents 互译 | packages/acp/acp/(官方"可运行范例") |
| 模型适配型 | LlmAdapter 子类 + registerAdapter | dsh-llm-deepseek |
dsh plugin --profile demo add 装进 demo profile 并 --dump-config 验证。dsh-plugin 话题找一个社区插件,只读 package.json 预测它干什么,再用五步法验证。