🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI
广告☁️ 云服务器特惠阿里云首购 8 折 · 腾讯云合作特惠
DeepSeek Harness Hub
← 返回列表

geekyfoxlab/dshm

DeepSeek Harnessspec-screened扫描:中风险在 GitHub 查看 ↗
⚠ 装前注意

dshm —— DeepSeek Harness 的版本与插件管理器

基本兼容但装前注意:未发布到 npm registry,仅可从源码安装 · 最近上游提交 2026/9/16 · 已提供中文文档

DeepSeek Harness 的版本与插件管理器:多版本隔离、插件隔离区,以及能在插件损坏时仍可启动的安全引导。

综合分
29.4
GitHub 分
29.4
用户评分
—
★ Stars
0
周下载量
—
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add geekyfoxlab/dshm
未发布到 npm registry,仅可从源码安装,改用 GitHub 源安装
信任档位:已验证本站已于 1 天前真实安装成功
是什么
dsh 原生插件 · market
装得上吗
本站已真实安装成功(非静态推断)
安全吗
本站尚未对该插件做风险分级(暂未覆盖,不等同于无风险)
还在维护吗
活跃:最近一次提交在 9 天前

档位由下列信号合成:本站实装验证(真实安装,当前最高到 L4)· 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。下方各区块是它的证据明细。 验证判据与等级说明 →

🟢实装验证通过· 2026/9/25
由本站实装验证器在真实 dsh 环境安装成功,非静态推断。
数据截至 2026/9/22(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查⚠ 装前注意

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

✗npm 包dshm(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=20.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

未发布到 npm registry,仅可从源码安装

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/22 19:20:12

用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

由 DeepSeek 最新模型翻译生成
dshm —— DeepSeek Harness 的版本与插件管理器

npm version
License: MIT
Node: >=20

一个坏插件就能让 DeepSeek Harness 完全无法启动。dshm 让 DSH 本体永远起得来。

DSH(DeepSeek Harness)迭代很快,第三方插件常常跟不上。
而 DSH 的启动是 fail-loud 的:只要装载树里有任何一个条目未处于 ACTIVE
(包括 PENDING),整个进程就会退出。于是日常会变成:你装了个插件,第二天 DSH 就再也打不开了。

dshm 解决这件事,外加版本管理的三个痛点:

1. 插件加载失败不会拖垮本体 —— 启动前预检 + 可回滚的隔离注入(quarantine)
2. 多个 DSH 版本互不干扰 —— 一个版本一个运行域,结构性防污染
3. 启动不用你操心端口 —— 自动选空闲端口,多开不撞车
4. 起了的进程管得住 —— list / status / stop,不用再 ps + kill

为什么用它而不是自己折腾:DSH 的 --patch 通道、运行域配对、插件级联隔离
这些细节极易踩坑(一个坏插件会级联拖垮健康插件)。dshm 把这些坑一次性填平,
并做到零第三方运行时依赖、零侵入官方包。

配套阅读:ARCHITECTURE.md(架构图与设计思路)、COMPATIBILITY.md(兼容性与升级指引)。

安装

要求:Node.js ≥ 20(无需任何第三方运行时依赖)。

npm install -g dshm

装好后直接用 dshm 命令(也可从源码运行 dshm):

dshm --version    # → 0.1.0
dshm --help

推荐的最小流程:

1. 看有哪些版本可用
dshm versions

2. 装一个版本(会创建配对的运行域)
dshm install 0.1.2-rc.1

3. 建一个档位(引用未安装的版本会被拒绝)
dshm slot create latest -v 0.1.2-rc.1

4. 先预检:只看报告,默认不改动任何文件
dshm preflight --profile web --dsh-version 0.1.2-rc.1

5. 按档位启动(端口自动选择,不需要写 --port)
dshm start latest

它解决了什么问题

| 痛点 | dshm 的做法 |
|---|---|
| 坏插件让 DSH 起不来 | preflight 预检 + quarantine/nuclear 隔离,先让本体起得来 |
| 多个版本互相污染 | 运行域路径只由版本号推导,结构性防污染 |
| 装多个版本要手管端口 | start 自动从 3080 起选空闲端口,多开不撞车 |
| 起了进程管不住 | --detach + list/status/stop,进程登记可回收 |
| 装失败留垃圾、装得慢没反馈 | 原子安装 + 失败自愈 + 进度提示 |

反馈与问题

- 报 bug / 提需求:GitHub Issues
- 社群:见仓库首页公告(用于问题反馈与讨论)

⚠️ 先读这一条:隔离能救什么、不能救什么

最容易被误解的一句承诺:

quarantine / nuclear 能救的是「激活级」故障,不能救「装配级」故障。
也就是说 —— 「跑了 quarantine 就一定能起来」是错的。

DSH 启动分两个阶段,隔离只在第二阶段有效:

| 阶段 | 何时 | 隔离能否修复 | 例子 |
|---|---|---|---|
| 装配级 | 读 profile 清单与各 bundle 补丁文件时 | ❌ 不能 | bundle 缺 dsh.bundle、补丁文件不存在、包不可解析 |
| 激活级 | 施加补丁层、装载插件树时 | ✅ 能 | 插件抛错、依赖缺失、服务未就绪 |

原因:官方在 loadProfile() 里读每一个 bundle 的补丁文件,
这一步发生在任何补丁被应用之前 —— dshm 产出的 disabled 行根本没机会执行。

实测(真实 DSH + 真实坏插件):

装配级故障 + 注入 disabled:true  → 报错完全不变,退出码仍为 1  ❌
激活级故障 + 注入 disabled:true  → 退出码 0,该行真实被禁        ✅

遇到装配级故障时,dshm 如实上报「隔离无法修复」,并给出
dsh plugin --profile  remove  指引 —— 不假装能修。

命令一览

| 命令 | 作用 |
|---|---|
| versions(别名 ls) | 列出本地已安装与远程可用的 DSH 版本 |
| install  | 安装一个 DSH 版本到独立目录,并创建配对运行域 |
| remove  | 卸载版本(被档位引用时拒绝,--force 强制) |
| use  | 设置默认档位 |
| slots / slot create\|set\|remove | 运行档位的增删改查 |
| start [档位] | 按档位启动 DSH(端口自动选择;--detach 后台运行;其后参数原样透传给 DSH) |
| list | 列出当前由 dshm 启动、仍在运行的 DSH 进程(档位/版本/PID/运行域) |
| status  | 查询某档位进程的运行状态(已退出/未登记如实报告,退出码 3) |
| stop  | 停止某档位对应的运行中进程(SIGTERM → 宽限 → SIGKILL 回收) |
| preflight | 启动前插件预检(只报告,默认不改动任何文件;--execute 运行期验证) |
| quarantine | 按忽略模式生成隔离产物 |
| doctor | 环境体检:安装完整性、配对一致性、插件健康度 |

参数透传

只有 dshm start 有透传区。 档位名之后的参数会被原样交给 DSH,
管理器不解析、不改写:

dshm start latest --patch ./x.yml --resume abc
dshm start latest -- -h     # 把 -h 交给 DSH,而不是 dshm

端口:不写也会自动选,写了就优先

--port 不是必要参数。 启动服务型入口时,管理器会自动从默认端口
3080 起选择一个空闲端口并注入,因此你日常那个占着 3080 的 DSH
不影响第二个档位启动:

dshm start latest              # 端口自动选(3080 被占则 3081、3082…顺延)
dshm start latest --dry-run    # 预演:打印最终选定的端口
dshm start latest -- --port 3092   # 显式指定端口

| 情况 | 行为 |
|---|---|
| 不写端口 | 自动从 3080 起找第一个空闲端口并注入;无需知晓 3080 是否被占用 |
| 显式写端口 | 优先使用你给的端口,不会被替换成别的端口 |
| 显式端口不可用 | 明确报错(退出码 4),并提示换端口 —— 不会静默改端口 |
| 非服务型启动 | 不注入端口参数(例如 --version / --help 这类纯查询,不会被变成常驻服务) |

⚠️ 为什么显式端口不可用时宁可报错、也不偷偷换一个:
若静默换端口,你会按原来的端口去访问却连不上,且失败原因难以归因。
显式端口是你明确表达的意图,管理器不会替你改掉它。

--port 必须写在档位名之后(透传区),因为它属于 DSH 原生参数。
写在档位名之前会被当成管理器自身选项而报用法错误。

进程生命周期:--detach / list / status / stop

start 缺省前台阻塞运行;加 --detach 则脱离当前终端、后台运行并立即返回。
无论前台还是后台,启动的进程都会被登记到 state/running.json,无需借助 ps/kill
即可定位与回收:

dshm start latest --detach    # 后台启动,返回 PID 并登记
dshm list                     # 列出仍在运行的进程(档位/版本/PID/运行域)
dshm status latest            # 查某档位进程详情(运行中给详情,已退出如实报告)
dshm stop latest              # 停止:SIGTERM → 宽限 2s → SIGKILL 兜底回收

要点:

- 只列仍存活的进程:list/status 会实时校验 PID 存活(kill(pid, 0)),
已退出的登记会被自然过滤,绝不把僵尸记录误报为运行中。
- 停止是「礼貌 + 兜底」:stop 先发 SIGTERM 等待优雅退出,宽限期后仍未退出
再 SIGKILL 强制回收,成功后从登记中清除。
- 如实报告不存在:status/stop 对已退出或从未登记的档位如实报告,并以退出码 3
表示「目标不存在」,绝不误报成功。

⚠️ list 语义变更:dshm list 现在不是 versions 的别名,而是独立的
「列举运行中的进程」命令。要列出版本,请用 dshm versions 或其保留别名
dshm ls(ls 与 versions 完全等价)。旧脚本里若用 dshm list 列版本,
请改为 dshm ls 或 dshm versions。

退出码

| 码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 一般错误 |
| 2 | 用法错误 |
| 3 | 目标不存在 |
| 4 | 状态冲突 |
| 5 | 体检发现问题 |
| 6 | 运行域污染 |

忽略模式

| 模式 | 行为 |
|---|---|
| strict | 不隔离。有任何插件问题就拒绝启动 —— 适合开发插件时排查问题 |
| quarantine(默认) | 只隔离坏掉的插件,保留其余 |
| nuclear | 隔离一切非本体条目,最大化「起得来」的概率 |

忽略模式的下限,是「保证 DSH 本体可启动」。
第三方插件是否可用不在保证范围内 —— 这是刻意的取舍:
先让 harness 能起来,再谈插件好不好用。

dshm start latest --ignore-mode nuclear

级联:为什么隔离一个不够

隔离提供 service 的插件 A,会让健康的下游插件 B 永远处于 PENDING ——
而 DSH 把 PENDING 也算作失败,于是本体照样起不来。

所以 dshm 的终止条件不是「隔离了几个插件」,而是
「本体真的能启动了」:

隔离 A 一个     → B 永远 PENDING → 本体仍失败(exit=1)
隔离 A + B      → 本体启动成功(exit=0)✅

多版本:一个运行域一个版本

铁律:一个 DSH_HOME ↔ 恰好一个 DSH 版本。

DSH 官方有一个回退农场 $DSH_HOME/profiles/node_modules/。
若两个版本共用一个运行域,后启动的版本会静默把自己的包写进去 ——
另一个版本下次启动就会加载到错误版本的 core。

dshm 从结构上消除这个问题:运行域路径只由版本号推导,
调用方无法传入任意路径:

~/.dsh-manager/
├── versions/0.1.2-rc.1/     ← 安装
├── versions/0.1.5-rc.2/
└── homes/0.1.2-rc.1/        ← 运行域,与版本一一配对
└── profiles/web/

⚠️ 注意 dshm 的运行域(~/.dsh-manager/homes//)与 DSH 自身的
用户目录(~/.dsh/)不是同一个位置。用 --home 或
DSH_MANAGER_HOME 可指定管理器根目录。

用 doctor 可随时校验配对关系:

dshm doctor

环境体检

dshm doctor

三项检查:

1. 安装完整性 —— 版本目录、清单、入口是否齐全
2. 配对一致性 —— 运行域是否指向其配对版本(跨版本污染检测)
3. 插件健康度 —— 逐个插件的可解析性与严重度分级

doctor 同时支持回退条目的两种形态:符号链接形态与
代理目录形态(官方打包发行时写入的形态)。

设计约束:零侵入

dshm 不修改任何官方包,不写用户的 profile 文件,只通过官方
--patch 通道注入:

bundle 自带补丁 → profile.patches → home 层补丁 → --patch 覆盖层(最高优先级)

为什么选 --patch 作为主通道:两条通道对「文件缺失」的语义不对称 ——

| 通道 | 文件缺失时 |
|---|---|
| home 层 $DSH_HOME/cordis.patch.yml | 静默忽略 |
| --patch  | 抛错 |

用 --patch 意味着不传参数就天然等于「无隔离」,
不需要造空文件,也不会留下半写坏状态。

隔离产物缺省使用静态 disabled: true,一旦写入就必然生效 ——
即使用户不经 dshm、自己手工启动 DSH 也同样有效。
!!js 运行时守卫是可选项,因为它依赖环境变量:变量没设就会静默失效。

当前状态

- 全仓测试:npm test 全绿(当前 450 条,随变更增长,以实际输出为准)
- 零第三方运行时依赖:仅用 Node 内置模块
- 能力契约:6 个 spec(版本、档位、启动、预检、隔离、体检)均有独立回归覆盖

已知边界与升级指引见 COMPATIBILITY.md。

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

同作者(geekyfoxlab)的其他插件

💬 加入社群

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

DPharness QQ 群二维码,QQ 扫码进群
QQ 扫码进群
DPharness 飞书群二维码,飞书扫码进群
飞书扫码进群