🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

配置体检工具 asdf17128/dsh-doctor

DeepSeek Harnessv0.4.3
asdf1712867 天前有提交已提供中文文档扫描:含敏感能力

扫描失效补丁与被覆盖的配置字段

28.9/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:npm 同名包「dsh-doctor」归属 astra3294/dsh-doctor,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add asdf17128/dsh-doctor
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · dev
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/25·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 67 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

npm 同名包「dsh-doctor」归属 astra3294/dsh-doctor,装到的可能不是本插件

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-doctor @ 0.4.3
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/23 13:51:49

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 15 处,展示前 15 条)
  • 读取本地文件
    src/dump.js:30
    if (existsSync(local)) return { cmd: local, args: [] };
  • 读取本地文件
    src/dump.js:73
    if (!existsSync(path)) continue;
  • 读取本地文件
    src/dump.js:76
    text = readFileSync(path, "utf8");
  • 读取本地文件
    src/dump.js:97
    if (!existsSync(path)) return null;
  • 读取本地文件
    src/dump.js:99
    return { path, json: JSON.parse(readFileSync(path, "utf8")) };
  • 发起网络请求
    src/checks/plugins.js:26
    const res = await fetch(url, {
  • 读取本地文件
    src/checks/tools.js:50
    entries = readdirSync(dir, { withFileTypes: true });
  • 读取本地文件
    src/checks/tools.js:63
    if (statSync(path).size > MAX_FILE_BYTES) continue;
  • 读取本地文件
    src/checks/tools.js:64
    const src = readFileSync(path, "utf8");
  • 读取本地文件
    src/checks/tools.js:85
    entries = readdirSync(nodeModules, { withFileTypes: true });
  • 读取本地文件
    src/checks/tools.js:95
    inner = readdirSync(scope, { withFileTypes: true });
  • 读取本地文件
    src/checks/tools.js:121
    if (!existsSync(root)) continue;
  • 读取本地文件
    src/fix.js:123
    let text = readFileSync(file.path, "utf8");
  • 写入本地文件
    src/fix.js:133
    copyFileSync(file.path, `${file.path}.bak`);
  • 写入本地文件
    src/fix.js:134
    writeFileSync(file.path, text);
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 扫描失效补丁
  • 识别丢失配置字段
  • 发现无人维护插件

找出 DeepSeek Harness(dsh)补丁悄悄弄坏的东西——失效补丁、整份配置替换时丢掉的配置字段、没人维护的插件。只读,零依赖。

README

由 DeepSeek 最新模型翻译生成
dsh-doctor ci 你的 dsh 配置里有一些设置已经悄悄失效了。这个工具告诉你是哪些。 npx github:asdf17128/dsh-doctor 一条命令、十秒钟、只读。零配置、零注册、零依赖。 为什么你改的设置没生效 dsh 有两个行为会正常启动、退出码 0,所以没有任何东西提醒你: patch 会整体替换一个条目的 config。 你只改了一个字段,同一条目下所有你没重写的字段全部从启动的树里消失,插件于是跑在你从没选过的默认值上。 config: fallbackMaxWords: 12 - fallbackMaxBytes: 40 ← 静默消失 - maxTitleBytes: 80 ← 静默消失 entry id 打错等于没写。 写成 agent-defualt-model,dsh 往 stderr 打一行就照常启动。用 Web UI 起的话你根本看不见那一行——只会觉得「我明明改了怎么没反应」。 升级改了 entry id 之后这两种情况都会变多,而且都要等到行为漂移了几周才被发现。
展开完整文档(README 剩余 1 节)
dsh-doctor

ci

你的 dsh 配置里有一些设置已经悄悄失效了。这个工具告诉你是哪些。

npx github:asdf17128/dsh-doctor

一条命令、十秒钟、只读。零配置、零注册、零依赖。

为什么你改的设置没生效

dsh 有两个行为会正常启动、退出码 0,所以没有任何东西提醒你:

patch 会整体替换一个条目的 config。 你只改了一个字段,同一条目下所有你没重写的字段全部从启动的树里消失,插件于是跑在你从没选过的默认值上。

config:
fallbackMaxWords: 12
- fallbackMaxBytes: 40 ← 静默消失
- maxTitleBytes: 80 ← 静默消失

entry id 打错等于没写。 写成 agent-defualt-model,dsh 往 stderr 打一行就照常启动。用 Web UI 起的话你根本看不见那一行——只会觉得「我明明改了怎么没反应」。

升级改了 entry id 之后这两种情况都会变多,而且都要等到行为漂移了几周才被发现。

效果

dsh-doctor · profile web · 130 entries (25 disabled)

✗ patch on "session-title" dropped 2 default config fields config-clobber
@deepseek-ai/dsh-session-title
dsh replaces an entry's whole config when a patch targets it. These fields
were in the shipped defaults but are missing from the tree that boots, so
the plugin now runs without them.
- fallbackMaxBytes: 40
- maxTitleBytes: 80

fix Restate them in your patch for "session-title":
fallbackMaxBytes: 40
maxTitleBytes: 80

✗ patch targets "agent-defualt-model", which is not in the composed tree dead-patch
~/.dsh/profiles/web/cordis.patch.yml patches an entry id that does not
exist, so dsh prints one stderr warning and boots without it. Everything
in that patch is inert.

fix Did you mean "agent-default-model"? Rename the id, or delete the
patch block if the plugin is gone.

2 error

作为 dsh 插件使用

装进 profile 后,dsh-doctor 会注册一个 config_doctor 工具,让 agent 能检查它自己正跑在什么配置上:

dsh plugin --profile web add dsh-doctor

然后直接问它「我改的 session-title 怎么没生效」,它会从合成树里给答案而不是猜。
只读;--fix 保持只在 CLI 里可用——改写你的 patch 文件不该由 agent 在一轮对话里做。

检查项

| 规则 | 级别 | 检出什么 |
| config-clobber | error | patch 因为没重写而丢掉的默认配置字段 |
| dead-patch | error | patch 指向树里不存在的 entry id(带拼写纠正建议) |
| tool-collision | error | 两个已挂载插件注册了同名工具——dsh 会直接拒绝启动 |
| plugin-not-mounted | warn | 装进 profile 但根本没被加载的插件 |
| plugin-stale | warn | 超过 180 天没发新版的第三方插件 |
| entry-removed | warn | 被你的 patch 层移除的官方条目 |
| entry-toggled / entry-added | info | 与官方 profile 的其他差异,让改动可见 |

explain 模式

配置健康的人只会看到「no problems found」,这句话没告诉他任何东西。--explain 用来回答「我这套 dsh 到底装了什么」:

Your harness: 130 entries, 103 active, 25 disabled, 2 conditional

Web UI 32
Tools 18 (16 off)
Sessions & history 11
Agent loop 5 (1 off)
...

Conditional (2) — enablement is decided at mount time, not here
bash-sandbox !!js process.platform === 'win32'
pwsh-sandbox !!js process.platform !== 'win32'

disabled: 是 !!js 表达式的条目会被单独列为 conditional,而不是压成布尔值——它到底开不开取决于启动时的机器,本工具不会执行你的配置去猜这个答案。

用法

npx dsh-doctor # 检查 web profile
npx dsh-doctor --explain # 描述这棵树,而不是检查它
npx dsh-doctor --profile headless # 指定 profile
npx dsh-doctor --verbose # 显示 info 级别提示
npx dsh-doctor --json # 机器可读输出
npx dsh-doctor --fix # 自动把被抹掉的字段补回去
npx dsh-doctor --offline # 跳过 npm registry 查询
npx dsh-doctor --quiet # 只在有问题时输出

退出码:0 正常或仅有警告 · 1 至少一个 error · 2 无法检查。

适合放进 CI,或者在升级 dsh 前跑一次:

npx dsh-doctor --quiet || echo "升级 dsh 前先检查一下你的 patch"

--fix

--fix 会把 patch 丢掉的字段按官方默认值补回同一个 config: 块:

- id: session-title
config:
fallbackMaxWords: 12
+ fallbackMaxBytes: 40
+ maxTitleBytes: 80

只在这个块内部改动——注释、顺序、其他条目全部逐字节不变——写之前先在旁边生成 .bak。嵌套路径会列出来让你手动处理而不是猜着写;dead-patch 永远不自动修,因为"改名还是删掉"是你的判断。

原理

直接复用 dsh 自己的合成结果:

- dsh --profile --dump-config —— 真正启动的树(bundles → profile patch → home patch → overlay)
- dsh --profile --dump-default-config —— 去掉你的用户层之后的同一棵树

所有结论都来自这两者的差异,所以能把问题归因到你自己的 patch,而不是上游默认值。此外还会读取 profile 的 package.json 和各层 cordis.patch.yml。

任何情况下都不会加载插件,也不会执行配置里的 !!js 表达式。

关于"只读"这件事有两个必须说清的例外:

- --fix 是会写的,这是设计如此——只动被标记的那个 config: 块,写前留 .bak。
- 合成 profile 是 dsh 自己的动作,而 dsh 在一个 profile 首次被使用时会落地模板。
所以如果你的 $DSH_HOME 里还没有任何 profile,跑一次会留下 profiles// ——是 dsh 建的不是本工具建的,但指向全新目录前值得知道。

安装与卸载

当 CLI 用不需要安装,npx dsh-doctor 直接跑。

当插件用:

dsh plugin --profile web add github:asdf17128/dsh-doctor # 安装
dsh plugin --profile web remove dsh-doctor # 卸载

卸载后 config_doctor 工具消失,不留任何残留——这个插件从不写入你的 Harness home。

兼容性

基于 @deepseek-ai/dsh 0.1.0-rc.5 验证。dsh 处于 developer preview,会有破坏性变更;检查逻辑读的是 --dump-config 的输出,所以那个格式一旦变动会最先受影响。
如果新版 dsh 下报出奇怪结果,提 issue 我来定位差异。

环境要求

Node 18+,以及一个可用的 dsh(优先用本地 node_modules/.bin/dsh,否则用 PATH 上的)。

为什么做这个

dsh 处于 developer preview,会有破坏性变更;「一切皆插件」意味着你的树是一叠 patch 层,而分层规则在一个方向上格外不留情——上面那些失败模式全是静默的。这个工具负责把它们说出来。

行为基于 @deepseek-ai/dsh 0.1.0-rc.5 实测验证。

参与

欢迎提 issue 和 PR,尤其欢迎带复现步骤的新检查规则。npm test 跑测试。

许可

MIT
预览分享卡片长什么样 ↓asdf17128/dsh-doctor
分享 · DeepSeek Harness Hub
asdf17128/dsh-doctor

扫描失效补丁与被覆盖的配置字段

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部