下面每个字段都是从真实包里读出来的,不是猜的。
| 字段 | 实例值 | 管什么 |
|---|---|---|
| name | @deepseek-ai/dsh-tools | 包名。安装与bundles用的都是它 |
| version | 0.1.2-alpha.5 | 跟宿主同代。生态惯例是跟着宿主版本号走 |
| type | module | ESM。插件必须import/export,CommonJS不行 |
| main | lib/index.js | 入口,导出name与apply(ctx) |
| exports | {“.”: …, “./invariant”: …} | 子路径导出。客户端插件还会导出 ./client |
| dsh.bundle.patch | ./cordis.patch.yml | 往宿主插入条目的入口。没有它,插件装了也不做任何事 |
| dsh.client.inject | ["@deepseek-ai/dsh-…"] | 客户端插件要注入的目标。宿主缺包会静默挂起 |
| dsh.compatibility | (dsh-context独有) | 兼容性声明。第三方可以自定义子树,不限于bundle/client |
| engines.dsh | >=0.2.0-rc.2 || … | 声明支持的宿主范围。实测不满足也照样装、照样合成,不被拦 |
| engines.node | ^22.19.0 || >=24.0.0 | 唯一的硬门,但也只是npm的EBADENGINE警告 |
| peerDependencies | cordis / dsh-agent / … | 宿主提供的依赖,插件不自带 |
最容易看漏的一个字段
dsh.bundle.patch。只有main没有patch的包,装了之后dump-config里不会出现任何新条目——不是坏了,是它本来就不打算往宿主里插东西(可能是给别人当库用的)。判断一个包是「插件」还是「库」,看这个字段最快。
两个 engines 完全不是一回事
engines.dsh:声明而已。本站实测把要求 >=0.2.0-rc.2的插件装到0.1.2上,安装成功、合成成功、没有任何拒绝。engines.node:npm会校验,但也只给EBADENGINE警告,不阻止安装。
所以别指望「声明了版本要求」能保护你。真正会出问题的是
dsh.client.inject 里宿主没有的包——那个不会给你任何警告,直接静默挂起。判断能不能跑,看inject差集,不看engines。