前言¶
DSH(DeepSeek Harness)的理念是「一切皆插件」,装的东西多了,两个问题会慢慢冒出来。一是不知道哪些插件靠谱:第三方插件的 manifest 是否完整、patch 层有没有覆盖不该动的内置行、代码里有没有高危调用,平时很难逐个确认。二是排查困难:插件没起来、服务缺失时,往往只看到 PENDING 或 FAILED 状态,不知道该停谁、该保谁。
dsh-plugin-doctor 针对的就是这两件事:把插件审计做成对话里的只读工具,把启停、安装、卸载和版本更新收进设置面板。下面介绍它的功能、安装方式和注意事项。
这是什么¶
dsh-plugin-doctor 是一个 DSH 插件管家:审计已安装插件的规范性与安全隐患,并在设置面板中提供插件管理,覆盖启停、安装、卸载、版本更新。当前版本 0.1.1,许可证 MIT,代码托管在 GitHub 的 Oo0520/dsh-plugin-doctor 仓库。
核心功能¶
Host 工具¶
插件注册五个工具,在对话中由 AI 调用:
| 工具 | 用途 | 副作用 |
|---|---|---|
plugin_audit |
审计 profile 全部 bundle:manifest 契约、patch 层风险、静态代码扫描、供应链风险 | 只读 |
plugin_list |
只读列出 loader 组合行与 fiber 运行状态(PENDING 缺失服务 / FAILED 错误) | 只读 |
plugin_toggle |
热启用/禁用插件:loader 运行时即时生效,同时写 profile cordis.patch.yml 持久化(HMR 自动应用) |
改运行状态 + patch 文件 |
plugin_uninstall |
卸载插件包(dsh plugin remove 转发 pnpm),带 dry-run 确认 |
删除依赖,需重启 |
plugin_install |
安装插件包(dsh plugin add 转发 pnpm) |
需重启 |
设置面板¶
Web 客户端里进入「设置 → 插件体检」,有插件列表和体检报告两个视图:
- 插件列表展示运行状态、版本、中文功能描述和安装时间,7 天内新装的插件标「新」徽章
- 搜索同时匹配插件名、ID 与中文描述
- 启停支持运行时热切换并持久化;禁用前会先探测是否使其他条目变 PENDING(比如停掉某个服务提供方),有则自动回滚并拒绝
- 装卸可以直接在面板安装/卸载社区插件;纯客户端插件(无
dsh.bundle)也能从孤儿 patch 行启用,重启后由市场挂载 - 版本更新会查询 npm registry 对比本地版本,支持一键升级,并能识别 pnpm
minimumReleaseAge导致的更新假象 - 界面描述跟随 DSH 语言切换,中文优先显示中文词典内容,英文下显示精简英文摘要
审计规则¶
审计规则分错误、警告、提示三级,例如:
- 错误(需处理):
eval/new Function、读取.credentials.yaml、安装期脚本(preinstall/postinstall) - 警告(建议关注):直接使用
child_process、遍历process.env、github 依赖未固定 commit - 提示:低优先级的风险提示项
体检范围 = profile bundles 列表 ∪ 非官方 dependencies,新装插件立即可扫描;@deepseek-ai/* 官方内置包仅做 manifest 轻检(trusted),不扫代码。
卸载可靠性¶
卸载的成败以清单是否还引用该包为准,而不是 pnpm 退出码。即使 pnpm 中途失败,也会强制收敛到一致状态:
- 从
package.json的dependencies与dsh.profile.bundles移除引用 - 清理
cordis.patch.yml中的残留 patch 行 - 运行时停用其 loader 条目,下次启动不再组合
- 被锁而删不掉的残留目录单独提示,可手动删除
经过上面的步骤,页面不会因残留引用出问题,也不影响系统继续运行。
安装与启用¶
两种常用安装方式,按来源二选一:
dsh plugin --profile web add dsh-plugin-doctor # npm
dsh plugin --profile web add github:Oo0520/dsh-plugin-doctor # github
也支持本地路径 / tarball 安装。仓库已包含构建产物 lib/,github 安装无需构建脚本。安装后需重启 profile。
三个注意事项:
- pnpm 供应链冷却期:pnpm 11 默认
minimumReleaseAge(约 24h)会拒绝当天新发布的包。被拦时可在命令尾部追加--config.minimum-release-age=0一次性绕过,不修改持久配置。 - link: 安装形态:本地路径安装生成
link:依赖,源目录需自带node_modules(先npm install即可);npm/tarball/github 安装无此要求。 - 配置项:只有一个
profile配置项,为目标 profile 名,默认web;运行时会优先从ctx.baseUrl自动推断当前 profile。
典型用法¶
- 启停插件:在对话中让 AI 调用
plugin_toggle,运行时即时生效,同时写入 profile 的cordis.patch.yml持久化。首次改写该文件前会自动备份为cordis.patch.yml.bak.plugin-doctor。 - 卸载插件:
plugin_uninstall默认 dry-run,必须confirm=true才真正执行;拒绝卸载@deepseek-ai/*官方包与插件自身。 - 自维护中文描述:在外部词典
~/.dsh/.plugin-doctor/descriptions.json中按{ "包名": "中文描述" }格式补充描述,优先级高于内置词典。 - 二次开发:修改
src/后运行npm run build(build:host走 tsc,build:client走 tsdown)并重启 profile。
适用场景与注意¶
适合长期使用 DSH、装了多个社区插件的用户:定期跑一次审计看新增依赖有没有风险,用面板集中处理启停和版本更新,出问题时用 plugin_list 看 PENDING/FAILED 定位。
需要明确的边界:
plugin_toggle拒绝禁用官方内置行(fs/tools/webserver/loader 等)与plugin-doctor自身,避免把自己锁在门外。- 插件以当前 dsh 进程权限运行,安装任何第三方插件前,建议先检查其源码与许可证;本插件的审计能力是辅助排查手段,不等于安全兜底。
结尾¶
dsh-plugin-doctor 把 DSH 插件的「看不见」变成「可审计、可管理」:装之前能查风险,装之后能热启停、能升级、能干净卸载。插件地址:
- 社区插件目录页:https://www.skillhub.cn/plugins/Oo0520/dsh-plugin-doctor (独立站点,与 DeepSeek / 幻方无官方从属关系)
- GitHub 仓库:https://github.com/Oo0520/dsh-plugin-doctor