前言¶
DeepSeek Harness(DSH)采用「一切皆插件」的加载方式:profile 里声明 bundle,启动时 cordis loader 递归挂载,实际装了多少、哪些被禁用、哪些挂载失败,往往要翻日志或猜。cordis 自带的 Loader.showLog() 能打印 apply plugin <name>,但默认关闭,且输出走 ctx.root.logger,在 dsh CLI 下既进不了启动 dsh 的那个控制台窗口,也进不了该窗口重定向的 dsh-run.log。
dsh-plugin-selfcheck 由社区维护者 xiaocxiaohai666 发布,分类为客户端插件。它在宿主进程内直接向 console 写报告:每次启动列出 loader 树里每一行插件的状态,再跑五项安装级检查;不依赖硬编码路径,读的是你当前 profile 里真实安装的插件。SkillHub 目录页:https://www.skillhub.cn/plugins/xiaocxiaohai666/dsh-plugin-selfcheck;源码与说明:https://github.com/xiaocxiaohai666/dsh-plugin-selfcheck。
这是什么¶
一句话:面向终端的 DSH 安装自检插件——启动时在启动 dsh 的控制台窗口打印完整插件 roster,以及依赖声明、peer 拒绝挂载、配置形状、Web 端口、已注册工具等检查结果,然后不再常驻干扰。
自 0.2 起,loader 树不能反映全貌:peerDependencies 与运行中宿主不兼容的插件会在挂载前被拒绝,roster 里不会出现一行,看起来会像「没装这个插件」而不是「装坏了」。插件用 deps.peer-gate 从 manifest 重算同一规则,补上这一盲区。
插件自身版本与 dsh 宿主版本无关;package.json 中当前版本为 0.2.0,表示本插件的第二次功能发布,不是「对应 dsh 0.2」。
核心功能¶
启动时插件 roster¶
输出前缀为 [selfcheck]。每一行对应 loader 树中的一个条目(递归枚举,因此行数常远大于 bundle 数量,例如一个 @linxin666/dsh-web-all 会展开成二十多行)。
| 状态 | 含义 |
|---|---|
ok |
已挂载 |
skip |
已禁用,行尾带 (disabled),不算失败 |
FAIL |
从未成功挂载,写到 stderr |
汇总行示例:plugins: 148 mounted, 28 disabled, 0 failed。挂载失败时会进入 problems / error details,并对 AggregateError 等沿 cause 链 unwrap,尽量给出最内层原因。
五项安装级检查¶
| 检查项 | 回答的问题 |
|---|---|
deps.version-drift |
各插件 package.json 里 dsh.engines.dsh 是否仍声明支持当前已安装的 @deepseek-ai/dsh 版本(支持常见 range 与 prerelease;无法解析的 range 报 undecidable,不会误报通过) |
deps.peer-gate |
哪些插件会被宿主 拒绝挂载(只计 @deepseek-ai/dsh 与 @deepseek-ai/dsh-* peer;含 profile 声明但未进树的 bundle;compatibility.json 精确版本豁免会单独标注为有意挂载) |
config.files |
profile 下 cordis.yml、cordis.patch.yml、package.json 等是否符合 loader 要求的结构 |
http.port |
对 webServer 报告的端口做 loopback GET /,确认 HTTP 是否在应答 |
tools.registered |
通过 ctx.tools.schemas() 统计面向模型的工具数量并做重复检测 |
运行时推导,无本机硬编码¶
- 插件行来自
ctx.loader.entries(),报告你实际安装的插件; - profile 目录来自 loader 上下文的
baseUrl,不是猜~/.dsh/profiles/<name>; - manifest 从运行进程 entry 向上查找,dsh 安装路径变更仍可工作。
装上新插件、重启 dsh 即可出现在列表中;无需额外配置、白名单或注册步骤。设计约束包括 inject 为空等(详见仓库 README),目的是避免诊断插件本身因注入失败而无法挂载。
输出位置与 selfcheck_status 工具¶
| 位置 | 内容 |
|---|---|
| 启动 dsh 的控制台 | 启动时实时报告 |
$DSH_HOME/dsh-plugin-selfcheck.log |
同一份文本($DSH_HOME 默认 ~/.dsh) |
$DSH_HOME/dsh-plugin-selfcheck.json |
同一份 JSON |
工具 selfcheck_status |
模型可查询并解释故障原因 |
selfcheck_status 仅在能解析 @deepseek-ai/dsh-tools 时注册;插件刻意不自带 fallback 编译器,避免与宿主 defineTool 行为不一致。无 SDK 时仍保留启动控制台报告这一主功能。
安装与启用¶
官方安装命令(profile 以 web 为例,与 README 一致):
dsh plugin --profile web add dsh-plugin-selfcheck
从本地目录链接安装:
dsh plugin --profile web add link:/path/to/dsh-plugin-selfcheck
安装后必须重启 dsh——bundle 行在启动时加载。
环境要求(来自 package.json):Node >=22.0.0;dsh.engines.dsh 与可选 peer @deepseek-ai/dsh-tools 的 range 见仓库 manifest。许可证为 MIT。
Windows 跨盘符时,pnpm 可能无法创建 symlink 导致空目录安装;README 给出了手动 junction 与 dsh plugin --profile web install reconciling 的步骤,可按原文操作。
典型输出示例¶
健康启动时,控制台大致类似(具体插件名与数量随你的 profile 变化):
[selfcheck] plugin self-check
[selfcheck] ok @deepseek-ai/dsh-base include
[selfcheck] ok dshmarket include:dsh-market
[selfcheck] skip @deepseek-ai/cordis-plugin-hmr 51ad9c62 (disabled)
[selfcheck] ---- plugins: 148 mounted, 28 disabled, 0 failed
[selfcheck] ---- install checks:
[selfcheck] ok deps.version-drift all 9 plugins declaring dsh.engines.dsh accept 0.2.0-rc.2
[selfcheck] ok deps.peer-gate no plugin rejects dsh 0.2.0-rc.2 (11 candidate(s) scanned, 0 incompatible)
[selfcheck] ok config.files ~/.dsh/profiles/web (3 files checked)
[selfcheck] ok http.port http://127.0.0.1:3080/ answered 200 in 3ms
[selfcheck] ok tools.registered 34 model-facing tools registered
[selfcheck] ---- selfcheck OK - 148 mounted, 0 failed, checks 5 ok / 0 warn / 0 fail (742ms)
当 peer 拒绝导致插件未出现在 roster 时,deps.peer-gate 会 fail 并列出包名;README 说明可通过 dsh plugin --profile <profile> allow-version <pkg>@<version> --dsh-version <host> --accept-risk 等方式处理,或移除/升级冲突插件。
适用场景与注意¶
适合谁
- 本地或 CI 启动 dsh 后,需要一眼看到「挂了哪些、禁了哪些、挂了什么错」;
- 升级 dsh 或批量加插件后,要核对
engines声明与 peer 门控,避免「树里根本没有这一行」的 silent refuse; - 怀疑 Web 端口被旧进程占用、profile YAML 结构错误或工具重复注册时,用五项检查快速定位。
注意
- 插件在当前 dsh 进程权限下读取 profile、打 HTTP 探测、写
$DSH_HOME日志;安装前请自行审阅源码与 MIT 许可证,SkillHub 为社区目录,与 DeepSeek / 幻方无官方从属关系。 - 无 Web 控制台、无客户端半部、无后台服务;primary 场景是终端优先。
- 若依赖
@deepseek-ai/dsh-tools以使用selfcheck_status,需保证 peer 可解析;否则仍可使用启动报告与 log/json 文件。
结尾¶
dsh-plugin-selfcheck 把「人类能看到的插件 roster + 五项安装自检」固定在每次启动的控制台,并同步到 log/json,必要时通过 selfcheck_status 交给模型解释。适合作为 DSH 日常运维与排障的第一屏信息。
- 目录页:https://www.skillhub.cn/plugins/xiaocxiaohai666/dsh-plugin-selfcheck
- GitHub:https://github.com/xiaocxiaohai666/dsh-plugin-selfcheck