npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dsh-so/dshvm

v0.2.0

Published

Unofficial, zero-dependency multi-version manager for the DeepSeek Harness CLI (dsh): install from npm, GitHub or local, switch in a second, with optional per-version data isolation.

Readme


装上它,你机器上的 dsh 就有了一位「小管家」:想试新版本就装,想留老版本就留,dshvm use 一句话切过去,不必 npm install -g 来回覆盖;跨越会话格式里程碑的升级它替你把着关;测试新版本还可以一人一份数据、互不污染。从「想装个新版本」到「已经在跑」,不离开一条命令(或一次点击)。

这是什么?

一句话:给 dsh 配一个 nvm 式的版本管理器。

没有它,你想同时留两个 dsh 版本,得手动 npm install -g 来回覆盖、自己备份 ~/.dsh,升级前还要祈祷会话数据别被新格式弄坏。有了它,这些全变成一句话的事 —— dshvm 把 dsh 的版本与数据拆开来管:

  • 版本装进各自的槽位 ~/.dsh-versions/dsh-<id>/,全局 dsh 只是一层极薄的连接器 —— 读指针,转发给激活版本的 bin;
  • 数据默认共享一个 $DSH_HOME,需要时 dshvm isolate 一条命令切成每版本一份。

举个例子:dshvm install 0.1.5-rc.3 把版本装进独立槽位(npm 上没有的版本自动回退到 DSH GitHub 仓库源码构建),dshvm use 0.1.5-rc.3 一切 —— 全局 dsh 立刻就是它;老版本原封不动躺在槽位里,一条命令切回来。

30 秒上手

  1. 装 —— npm install -g @dsh-so/dshvm
  2. 接管 —— dshvm setup(收编你现有的全局 dsh、装上连接器;此后 dsh 由 dshvm 接管,随时可切)
  3. 切 —— dshvm install <版本> + dshvm use <版本>,随时来回

其他渠道(本地 checkout、升级、卸载)见下方安装。不想敲命令,直接跳到图形界面。

管起来长什么样?

$ dshvm list
home:  C:\Users\zhoushimin\.dsh-versions

    0.1.2-rc.1     [npm-global]  OK
    0.1.5-rc.3     [store]  OK
  * 0.1.7-rc.1     [store]  OK

$ dshvm use 0.1.5-rc.3
dsh -> 0.1.5-rc.3

$ dsh --version
0.1.5-rc.3

(真实输出有删节 —— 每个版本下面还列着它 bin 的完整路径。* 标当前激活;[npm-global] / [store] / [gh-source] / [local] 是版本来源徽章。)

常见使用场景

四个最常见的活法 —— 每个都给命令行与界面两条路。

1 · 安全尝鲜新版:不动你正在用的环境(隔离拷贝升级)

dshvm isolate 0.1.3-alpha.1 --copy   # 拷贝现有 ~/.dsh 后转为独立
dshvm use 0.1.3-alpha.1              # 激活这份独立副本

你的会话、插件、配置照常可用 —— 新版本在自己那份数据里折腾,升级永远不会污染你正在用的环境。 界面里:「已安装」页该版本行 ⋯ → 隔离(拷贝现有数据) → 行内「启动」(细节见隔离数据:三种玩法)。

2 · 日常多版本管理

dshvm install 0.1.2-rc.1     # 正常安装
dshvm use 0.1.2-rc.1         # 切换;和所有版本一样共享默认 ~/.dsh

界面里:「可安装」页点「安装」,再 ⋯ → 设为默认;或直接行内「启动」临时跑一次。

3 · 完全隔离的测试环境

dshvm isolate 0.1.3-alpha.1  # 全新、空白的 $DSH_HOME——不拷贝任何东西,不影响任何现有数据
dshvm use 0.1.3-alpha.1

在"干净房间"里测试插件 / profiles / 会话,不会向共享数据泄漏任何东西。 界面里:该版本行 ⋯ → 隔离(空白环境) → 「启动」。

4 · 随时回退、去掉隔离、清理收尾

dshvm use 0.1.2-rc.1            # 回到共享 ~/.dsh 和旧版本
dshvm unisolate 0.1.3-alpha.1   # 删掉该版本的隔离副本
dshvm remove 0.1.2-rc.1         # 用完了就删槽位(含其隔离数据)

界面里:切回旧版本 = 行内「启动」或 ⋯ → 设为默认;⋯ → 取消隔离 删隔离副本;⋯ → 移除… 删槽位(弹确认框,不可撤销)。

它是怎么工作的?

   dsh(连接器)-> 读 ~/.dsh-versions/current-bin.txt -> node <激活 bin>
   ~/.dsh-versions/versions.json  = 版本 -> { bin, kind, realVersion }
   ~/.dsh-versions/active.txt     = 激活版本 ID

几个你可能关心的点:

  • 不 fork、不改上游 —— 连接器(dsh.cmd / dsh.ps1 / dsh)是极薄转发器,只读指针、转发给激活版本的 bin;bin 路径来自各包 package.json 的 bin 字段。装哪个版本,跑的就是哪个版本的原样代码。
  • 切换零下载、离线可用 —— 版本只装一次进槽位,use 只是改指针。
  • 代码与数据是两层 —— 槽位 ~/.dsh-versions/dsh-<id>/ 只放 dsh 的代码(bin + 它自己的 node_modules);插件、profiles、会话、配置、skills、附件、凭证都在 $DSH_HOME(默认 ~/.dsh),插件不在槽位里。
  • 不打扰运行中的会话 —— use 只影响新启动的 dsh,已运行的进程保持原版本。
  • 每个版本自己解析依赖 —— 依赖从槽位自己的 node_modules 解析;源码槽位在槽内构建,workspace 链接保持有效。
  • npm 上没有的版本也能装 —— 自动回退到 DSH GitHub 仓库源码构建,见安装来源。

会弄坏我现有的数据吗?不会。

dshvm 管版本,但把你数据的安全当头等大事 —— 三道防线:

第一道:升级跨不过会话格式里程碑。 dsh 在下列版本变更了会话格式,新版首次运行会自动迁移 ~/.dsh 里的数据。直接跳过某个里程碑升级(如 0.1.2 → 0.1.5-alpha.1),新 dsh 读不到中间格式、可能把旧会话数据破坏且无法恢复 —— dshvm 会在关键节点拦下:

| 里程碑版本 | 会话格式 | | --- | --- | | 0.1.3-alpha.1 | v2 | | 0.1.5-alpha.1 | v3 |

  • dshvm install / dshvm use 命中跨越里程碑的升级时,打印醒目的双语警告;
  • dshvm-ui 的「设为默认」会弹确认框,列出被跳过的节点和迁移步骤 —— 逐版本升:先装并切到 0.1.3-alpha.1、运行一次 dsh 完成迁移,再继续往上升。

第二道:降级也提醒。 主目录已被超过 0.1.6-alpha.1 的版本使用过、又要往旧版本装时,dshvm install 会给出三句提醒:先关掉这个环境里的 beta 功能(experimental / profile bundle 等);旧版读不了新版写入的会话;拿不准就 dshvm isolate <版本> --copy 隔离拷贝着跑。

第三道:一份数据只让一个实例写。 dsh 目前只有进程内单写者,共享 ~/.dsh 的第二个 web 实例打不开活动会话(SessionAlreadyOwnedError)。dshvm-ui 启动前会先拦下并弹确认框:可选「仍然启动」,或「隔离并启动」—— 先给该版本一份独立数据目录再启动。

隔离数据:三种玩法

所有版本默认共享一个 $DSH_HOME(插件、profiles、会话、配置、凭证全在里面)。想分开时,isolate 给某个版本一份独立的 —— 三种场景,先看图:

| 场景 | 命令 | 说明 | | --- | --- | --- | | 隔离拷贝升级 —— 保留现有会话/数据,新版本独立运行 | dshvm isolate <version> --copy | 把共享 ~/.dsh 拷进该版本自己的数据,升级不会污染你在用的会话环境 | | 多版本管理,正常升级 | dshvm install <version> | 正常安装,和所有版本一样共享默认 ~/.dsh | | 完全隔离环境测试 | dshvm isolate <version> | 一个全新、空白的 $DSH_HOME —— 不拷贝任何东西、不影响任何现有数据 |

dshvm isolate 0.1.5-rc.3           # A. 该版本全新、空白的 $DSH_HOME,再 use 激活它
dshvm isolate 0.1.5-rc.3 --copy    # C. 先拷贝你的共享 ~/.dsh,再转为独立
dshvm unisolate 0.1.5-rc.3         # E. 删掉隔离副本,回到共享 ~/.dsh

两个容易疑惑的点:

  • isolate 之后,dshvm use <version> 会自动把该版本指向它自己的 $DSH_HOME;插件会落到它自己的 profiles 目录,里面建的会话/配置不会泄漏到共享 ~/.dsh 或其它版本。
  • 隔离状态存在磁盘上(~/.dsh-versions/active-data.txt + isolate/<id>/),跨终端、重启仍生效 —— 但它不是 shell 环境变量:echo $DSH_HOME 是空的,是连接器在 dsh 进程内注入的。查看:cat ~/.dsh-versions/active-data.txt。

命令

| 命令 | 作用 | | --- | --- | | dshvm list | 列出已注册版本。 | | dshvm use <version> | 切换全局 dsh(支持前缀匹配)。 | | dshvm install <source> | 安装版本 —— 见安装来源。 | | dshvm register <version> <path> | 按现状登记包根或 bin(不构建)。 | | dshvm unregister <version> | 删除注册表条目(激活项需 --force)。 | | dshvm remove <version> | 删除槽位 + 注册表条目(含隔离数据)。 | | dshvm isolate <version> [--copy] | 给版本建全新独立 ~/.dsh;--copy 从共享播种。 | | dshvm unisolate <version> | 去掉隔离副本,回到共享 ~/.dsh。 | | dshvm exec [args] | 启动激活的 dsh(连接器用);自动适配 web 端口。 | | dshvm upgrade [--check] | 把 dshvm 自身升到 npm 最新版;--check 只检查不安装。 | | dshvm setup / repair / doctor | 首次设置 / 自愈连接器 / 体检。 | | dshvm current / which [v] | 查看激活版本 / 某版本 bin 路径。 | | dshvm plugin <子命令> | 插件小管家 —— 装/升/卸插件、搜 dsh.so 目录、装场景包,见下表。 |

dshvm plugin:插件小管家

| 子命令 | 作用 | | --- | --- | | dshvm plugin scan | 扫描各 profile 已安装的插件。 | | dshvm plugin add <spec> [--smart] | 安装插件;--smart 先在沙箱副本试装,验证通过再正式装。 | | dshvm plugin upgrade <id> [--all] | 升级一个 / 全部插件。 | | dshvm plugin remove <id> | 卸载插件。 | | dshvm plugin library [id] | 搜 dsh.so 插件目录与榜单:--search / --sort stars\|downloads\|popular\|surge\|surge-downloads\|new / --kind / --level / --limit / --offset;带 id 看详情(含 dsh.so 验证记录)。 | | dshvm plugin pack list / show <id> / install <id> | 场景包:列出 / 看曲目清单 / 一键安装整包到 --profile。 | | dshvm plugin approve-builds <pkg> --profile <p> | 放行上次安装被忽略的包安装脚本后重跑安装。 | | dshvm plugin report export | 导出安装报表。 |

安装来源

dshvm install <source> 安装一个 dsh 版本:

| 来源 | 示例 | | --- | --- | | npm 注册表(@deepseek-ai/dsh) | dshvm install 0.1.2-rc.1 · npm:alpha | | GitHub 仓库,自动 | dshvm install github:deepseek-ai/deepseek-harness · .../#dsh-v0.1.3-alpha.1 · 任意 https://github.com/... | | GitHub 发布资产 | gh-release:<o/r>[@tag][#asset] | | 强制源码 | gh:<o/r>[@ref][#subpath] | | 本地源码 / tarball | dshvm install E:\src\deepseek-harness · ./pkg.tgz |

自动回退 —— 裸版本号 dshvm install <version> 会自动重试:若 <version> 不在 npm 上,就从 github:deepseek-ai/deepseek-harness#dsh-v<version> 源码构建(CLI 包用 #apps/cli 钉位)。所以 dshvm install 0.1.3-alpha.1 即便没发到 npm 也能装。

  • 选项:--as <id> 改注册版本 ID;--bin <name> 为多 bin 包选 bin;GITHUB_TOKEN/GH_TOKEN 提升 GitHub 限速(也能访问私有仓库)。
  • GitHub 源码树解压会跳过 Windows tar 无法创建的条目(符号链接)并给警告;若构建需要读取 git 元数据,dshvm 会先加一个单提交快照,使 tarball 也能构建。

图形界面(dshvm-ui)

本节整节都是图形界面用法;只用命令行的话,可跳过本节直接看30 秒上手,之后的「命令」等章节也都只涉及 CLI。开发构建、架构与排障见 ui/README.md。

不想敲命令时,用同仓库的桌面启动器 鲸世启动器(dshvm-ui,Tauri 2 + React)。左侧两个入口管完全部:「启动」管版本与实例,「插件」管插件中心;顶栏换皮肤、检查更新,点 ✕ 最小化到托盘,web 实例照常后台跑。底层原则与 CLI 同源:只读状态直读 ~/.dsh-versions(DSHVM_HOME 可覆盖),所有变更操作一律转给 dshvm CLI —— 界面和命令行看到的永远是同一份事实。

获取与首次启动

| 渠道 | 内容 | | --- | --- | | NSIS 安装器 | dshvm-ui_*_x64-setup.exe;机器上已有 Node/npm 时自动执行 npm install -g @dsh-so/dshvm + dshvm setup | | MSI | 纯应用安装(不含上述自动化) | | 源码构建 | 需 Tauri 2 + Rust 工具链 + WebView2,见 ui/README.md |

安装包随 GitHub Releases 发布;某个 Release 还没附二进制时,按 ui/README.md 从源码构建。

打开后若检测到 dshvm 未安装,会先进引导页而非主界面,按提示补环境即可:

  • 引导页列出 Node.js / npm / dshvm 三项检测结果;缺 Node.js 时可一键下载并运行 Node 官方 LTS 安装器(装完点「重新检测」,必要时重启应用);
  • Node/npm 就绪后点**「一键安装 dshvm」**:等于执行 npm install -g @dsh-so/dshvm + dshvm setup,npm 输出实时滚动在页面上;
  • 用 NSIS 安装器装的应用在已有 Node 的机器上已自动做完这一步,打开即是主界面。

管理已安装版本

「已安装」页每个版本一行:●/○ 标出默认,来源徽章(store / npm-global / gh-source / local),以及 默认、🔒隔离、副本(隔离数据拷贝自共享目录)标记。行内「启动」直接拉起该版本的 web;行内 ⋯ 菜单:

| 操作 | 行为 | | --- | --- | | 设为默认 | 等于 dshvm use <id>,全局 dsh 立即改指(跨越会话格式里程碑会先弹确认框) | | 隔离(空白环境) | dshvm isolate <id>:给该版本一个独立的空 $DSH_HOME | | 隔离(拷贝现有数据) | dshvm isolate --copy:把共享 ~/.dsh 复制一份过去,行内多一枚「副本」标 | | 取消隔离 | dshvm unisolate <id>:回到共享数据 | | 移除… | 弹确认框:删除代码槽 + 注册信息 + 隔离数据目录,不可撤销;若移除的是默认版本,额外警告「默认会被清空,重新指定前 dsh 无法运行」 | | 复制 bin 路径 | 该版本 bin 的绝对路径进剪贴板 |

两个指针不一致时(active.txt 与 current-bin.txt 指向不同),底栏会提示「激活指针不一致」。

安装新版本

入口:「已安装」页底部的 + 安装新版本,或「可安装」页每行的 安装。

  • 「可安装」列表合并 npm registry(走你自己的 npm,跟随你的镜像/代理配置)与 DSH GitHub tags,结果本地缓存 1 小时,↻ 刷新强制拉最新;某个源取不到时明确提示"结果可能不完整"。首行 ⭐ 推荐版本 即 npm 的 latest;alpha/beta 默认折叠在「更多」里,勾选「显示 alpha/beta 预发布版」展开(rc 直接可见)。
  • 安装对话框接受裸版本号 / npm:x / github:owner/repo#ref / 本地路径,并附三个快捷标签(npm latest / npm 指定版本 / GitHub tag)。过程分阶段显示(解析版本 → npm 下载安装 → 注册版本…)并计时;npm 警告折叠计数;失败时给出退出码、日志末尾原文与「复制日志」,安装中随时可取消。
  • 安装从不改动当前默认版本,装完需要 ⋯ → 设为默认 切过去。

启动 dsh web 与实例管理

每行的「启动」按钮拉起该版本的 web。启动在后台做的事:从 3080 起找成对空闲的端口(dsh 同时占 127.0.0.1:N 和 0.0.0.0:N+1)→ 先建日志 ~/.dsh-versions/logs/<版本>-<UTC时间戳>.log(每版本保留 10 份),之后任何失败(版本未知 / bin 损坏 / 端口耗尽)都会把原因写进去 → 启动 node <bin> web --port N --no-open,隔离版本注入自己的 DSH_HOME → 等待就绪(最多 15 秒)→ 捕获 dsh 打印的 http://127.0.0.1:N/?token=… 并用它打开浏览器。登录 token 只在启动时打印一次,由 UI 代管。

运行中的实例列在下方「运行中」面板,每行 日志 / 打开 / ↻ 重启 / ■ 停止:

  • 重启是让插件生效的开关 —— dsh web 只在启动时读一次 profiles,刚装的插件重启后才出现。重启会先停掉实例、等端口对释放(最多 5 秒,防止新实例落到别的端口让你对着一串死链),再按同一版本重新拉起。
  • 手动启动(外部)实例也能看到(扫描 netstat 与 node 命令行发现)、可以停止;但它的 token 本应用拿不到,「打开」给不了带 token 的地址,「重启」也禁用(拿不到它的数据目录指向)——想要全功能,让 dshvm-ui 自己启动。
  • 面板列表每 3 秒刷新;外部实例启动时立即扫一次、之后每 60 秒扫一次;进程一停,对应行自动消失;点「停止」该行立即移除,不等扫描。

启动失败不静默:「启动状态」区为每次未成功的启动保留一行 —— 启动中… / 启动失败 / 已拦下,带原因(悬停看全文)、日志(失败的启动必有一份)、重试;底栏同步显示完整错误详情。共用数据目录守卫:启动未隔离版本而另一实例正占用 ~/.dsh 时会先拦下弹确认框,可选「仍然启动」或「隔离并启动」。

插件中心:发现、试装、一键整包

侧栏「插件」进插件中心,三个页签,数据全部经 dshvm plugin CLI 取得。

编辑推荐 —— dsh.so 的场景包专辑墙(编辑精选、开发者工作台、创意视觉、财务运营、学生学习、老师教学、写作长文、研究文献…),每个专辑是一组搭配好的插件:

点开专辑看完整清单,每个条目带中英双语推荐理由、dsh.so 验证等级(L1 收录 → L4 装得上 → L5 跑得通)、风险等级、星数与下载量;选好 profile 点**「一键安装」**把整包装进指定 profile,没发布安装命令的条目自动跳过、不拖垮整包:

我的插件 —— 「我的安装」按 profile 分组列出已装插件(web 组在最前),每行 升级 / 日志 / 卸载;顶部输入框按 spec 装插件(dsh-ppt、@xmanrui/dsh-im、github:o/r 均可),**「一键升级」**把所有 profile 的所有插件升到最新。「我的收藏」存你点过红心的插件,不在当前页也能装:

发现插件 —— 整个 dsh.so 插件目录装进界面:七个榜 —— 所有 / ★ 星标榜 / ⬇ 周下载榜 / 🏅 总下载榜 / ↗ 星标飙升 / ⬇↗ 下载飙升 / ✦ 新上架,配「全部 / 仅插件 / 仅生态应用」类型过滤、目录搜索、卡片/列表两种视图(右上角切换、记忆选择)与翻页器(榜单固定前 100,「所有」与搜索可翻页)。星标飙升、周下载、总下载三榜直连 dsh.so/data 官方每日快照,官方不可达时退回本地积累的快照兜底:

点任何卡片弹出详情:dsh.so 的验证记录(在哪个 dsh 版本上验证通过、何时)、官方发布的安装命令(一键复制,绝不替你拼装)、GitHub 仓库与 dsh.so 外链(外链走白名单校验,只放行 dsh.so 与 github.com):

点「安装」走沙箱试装,整条链路看图:

安装/升级/卸载的逐行输出共享一个日志面板;dsh.so 已实测可运行的 L5 生态应用按记录跳过试装直接装;勾「跳过试安装」可走直达车道。

体检与修复

「启动」页的修复中心把 dshvm doctor 的体检结果列成一张清单:体检时间 + 正常/警告/失败计数,逐项 ✓ / ⚠ / ✗ 与「建议:…」,明细可展开看条目,底部「原始体检报告」可展开完整 JSON。体检覆盖两半:本地半边(版本注册表、指针一致性、每个已注册版本、隔离数据、三个 shim、数据目录)与 dsh 半边(Node 运行时、默认 preset、profile 模块链接、persona 字段、日志分诊、启动/TLS 探针等),外加安装树完整性、koffi 原生模块、运行中的实例等升级风险项。

「一键修复」是真的会修东西:跑 dshvm doctor --fix(失效模块链接移进隔离区、迁移改名的 preset/persona,每项修复后自查),再补一次 shims 与指针重装,最后复检、按条目报数(「已修复 N 项,剩余 M 项」),每一步都有回音。

设置、更新与托盘

右上角 ⚙ 打开设置:

  • 界面语言 —— 中文 / English,即点即切;横幅皮肤 —— 海岛场景 / 鲸鱼娘两种顶栏横幅随你换;
  • npm 镜像 —— 官方 / 淘宝 / 腾讯云 / 华为云 / 自定义,保存后对之后启动的安装进程生效;
  • 退出时停止所有 web 实例 —— 默认关闭:点窗口 ✕ 是最小化到托盘(左键托盘图标恢复,托盘菜单「退出」才真退出),web 实例照常在后台跑;
  • 检查更新 —— 应用启动几秒后也会静默检查一次(无更新、离线都不打扰),发现新版弹窗展示版本号与更新说明,下载带进度、完成后自动重启安装;更新包经签名校验,以 GitHub Releases 的 latest.json 为更新源。

所有设置与偏好(语言、皮肤、视图、收藏、镜像……)持久化在 ~/.dsh-versions/ui-settings.json。


安装

| 渠道 | 命令 | 说明 | | --- | --- | --- | | npm(推荐) | npm install -g @dsh-so/dshvm | 发布版,零运行时依赖 | | 本地 checkout | npm install -g --force <path> | 发布前从源码自测;--force 用于覆盖同名全局包 |

npm install -g @dsh-so/dshvm
dshvm setup

setup 会收编你现有的全局 dsh、安装 dshvm 连接器,并把激活版本指向它。此后 dsh 由 dshvm 接管,随时可以 dshvm use 切到别的版本。

环境:Node.js ≥ 18(装 dshvm 要它,跑 dsh 也要它)+ npm;从 GitHub 源码装 dsh 版本还要 tar,git 仅当某个构建需要读取 git 元数据时使用。

环境变量

| 变量 | 含义 | 默认 | | --- | --- | --- | | DSHVM_HOME | 版本主目录。 | ~/.dsh-versions | | DSHVM_BIN_DIR | 连接器目录覆盖。 | npm 全局 bin 目录 | | GITHUB_TOKEN / GH_TOKEN | GitHub API 令牌。 | — | | DSHVM_REGISTRY | npm registry 覆盖(dshvm upgrade 用)。 | https://registry.npmjs.org | | DSHVM_NPM_REGISTRY_URL | 插件中心查 npm 元数据(作者/下载量)的 registry。 | https://registry.npmjs.org |

DSH_HOME 是 dsh 的数据主目录,由隔离数据模式使用,不是 dshvm 的设置项。

升级 dshvm 自身

dshvm 自己也是 npm 包,升级它不用重装:

dshvm upgrade --check      # 只看看有没有新版本
dshvm upgrade              # 升到 npm 上的 latest
  • 读 npm registry 上 @dsh-so/dshvm 的 latest;已是最新就直接退出,什么都不做。
  • 实际动作就是 npm install -g @dsh-so/dshvm@latest,所以 npm 得在 PATH 上。
  • 若当前运行的不是全局 npm 安装(例如在 checkout 里跑 node bin/dshvm.js),默认拒绝执行,以免悄悄多装一份全局副本;确实要装加 --force。
  • 私有镜像:设 DSHVM_REGISTRY(或 npm 自己的 npm_config_registry);--check --json 输出一行 JSON(current / latest / updateAvailable / installMethod / registry),供脚本消费。

卸载

按需选一档:每档都会移除 dshvm,区别是保留多少受管状态(连接器、版本、数据)。

| 档 | 命令 | dsh 结果 | | --- | --- | --- | | 0 | npm uninstall -g dshvm | 照常可用(连接器 + ~/.dsh-versions 保留) | | 1 | + 移除/还原 dshvm 连接器 | 回退到你自己的 npm 全局 dsh | | 2 | + rm -rf ~/.dsh-versions | 只剩你自己的 npm 全局 dsh |

源码 checkout 位于 ~/.dsh-versions 之外,所以第 2 档也不会删它们 —— 只删 dshvm 指向它们的指针。

常见问题

Q:use 会影响运行中的会话吗? A:不会 —— 已运行的进程保持原版本;新启动的 dsh 用激活版本。

Q:dsh web 报端口被占用? A:dshvm 自动适配:占用则用下一个空闲端口(--port);也可 dsh web --port <n> 自定。

Q:要装的版本不在 npm 上(如 0.1.3-alpha.1)? A:直接 dshvm install 0.1.3-alpha.1 —— 自动回退到 DSH GitHub 源码构建。

Q:界面里刚装的插件没出现? A:dsh web 只在启动时读一次 profiles —— 到「运行中」面板点该实例的 ↻ 重启(外部启动的实例在它自己的终端里重启)。

Q:图形界面点「启动」像没反应? A:多半是"共用数据目录"守卫拦下了(弹框 + 底栏 + 「启动状态」区都有记录),选"仍然启动"或"隔离并启动"。更多排障见 ui/README.md。

Q:含符号链接的仓库在 Windows 解压失败? A:跳过并警告,DSH 本体可构建;仅当没有可用的根目录时才失败。

Q:只支持 Windows? A:不是 —— 连接器与路径跨平台;CLI 的 CI 覆盖 Linux / macOS,启动器安装包由 CI 出三平台。

开发与参与贡献

npm test                 # 离线套件(不联网、不碰你的 ~/.dsh-versions)
npm run test:install     # 真实 dsh 安装 + 运行检查(需联网)

cd ui && npm run tauri dev    # 启动器开发窗口(热更新)
  • npm test 逐个跑 test/*.test.js(各自独立进程内 node:test)并做 lib/ 加载检查;用临时 home,在受限沙箱也能跑。
  • npm run test:install 在临时环境装遍每个真实来源(npm dsh、一个通用 npm 包、GitHub 发布 tgz);设 DSHVM_TEST_SOURCE=1 还会构建一个不在 npm 上的源码版。
  • CI 在 Ubuntu / macOS / Windows 上对 Node 18/20/22 跑离线套件;真实安装集成为手动 workflow_dispatch 任务。启动器另有 ui-ci.yml 三系统矩阵与 ui-v* tag 的三平台打包发布。

欢迎提 Issue 和 PR。改动提交前先跑一遍离线套件 npm test;涉及桌面的改动见 ui/README.md。

许可

MIT —— © dshvm 贡献者。DSH 版权归 DeepSeek 所有;dshvm 是独立的社区工具。