dsh-plugin-doctor:DSH 插件的体检与管理工具

前言

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 中途失败,也会强制收敛到一致状态:

  1. package.jsondependenciesdsh.profile.bundles 移除引用
  2. 清理 cordis.patch.yml 中的残留 patch 行
  3. 运行时停用其 loader 条目,下次启动不再组合
  4. 被锁而删不掉的残留目录单独提示,可手动删除

经过上面的步骤,页面不会因残留引用出问题,也不影响系统继续运行。

安装与启用

两种常用安装方式,按来源二选一:

dsh plugin --profile web add dsh-plugin-doctor          # npm
dsh plugin --profile web add github:Oo0520/dsh-plugin-doctor   # github

也支持本地路径 / tarball 安装。仓库已包含构建产物 lib/,github 安装无需构建脚本。安装后需重启 profile。

三个注意事项:

  1. pnpm 供应链冷却期:pnpm 11 默认 minimumReleaseAge(约 24h)会拒绝当天新发布的包。被拦时可在命令尾部追加 --config.minimum-release-age=0 一次性绕过,不修改持久配置。
  2. link: 安装形态:本地路径安装生成 link: 依赖,源目录需自带 node_modules(先 npm install 即可);npm/tarball/github 安装无此要求。
  3. 配置项:只有一个 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 buildbuild: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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye