npm 卸载 dsh 怎么做?DeepSeek Harness 全局卸载命令、报错与残留清理
npm 卸载 dsh 本身只有一行——npm uninstall -g @deepseek-ai/dsh(参数是包名,不是命令名);麻烦都在后半段:EACCES 权限错误怎么处理、卸完命令为什么还在、npx 临时目录与 ~/.dsh 数据目录各删不删。 DSH插件 与 DeepSeek插件 都不是全局包,它们装在 profile 下面,程序卸载后仍留在磁盘上。这篇按「判断装法 → 执行卸载 → 排错 → 清残留 → 验证」五步讲完。
DSH plugin 卸载第一步:确认 dsh 当初是哪种安装方式
卸载动作取决于当初的安装方式,先判断再动手,能少踩一半的坑;判断装法也是所有后续动作的前提,一条命令就能看清。 四种装法与对应的卸载动作:
| 当初怎么装的 | 判断依据 | 怎么卸 |
|---|---|---|
npm install -g | npm ls -g --depth=0 里有 @deepseek-ai/dsh | npm uninstall -g @deepseek-ai/dsh |
pnpm add -g | pnpm 全局列表里有该包 | pnpm remove -g @deepseek-ai/dsh |
只用 npx | 全局列表里没有,但命令能跑 | 没有实体可卸,清 ~/.npm/_npx 即可 |
| 源码构建 | 本机有 clone 的仓库目录 | 删仓库目录(~/.dsh 数据另算) |
三种装法的完整对照可以看《DeepSeek Harness 怎么卸载》;本篇只把 npm / pnpm 这条通道讲到能排错的程度。 操作步骤:
- 停掉正在运行的 dsh(关闭对应终端窗口或按 Ctrl+C),并确认端口已释放:
lsof -i :3080无输出(Windows 用netstat -ano | findstr 3080); - 查看 npm 全局包列表:
npm ls -g --depth=0。预期:列表中出现@deepseek-ai/dsh@<版本>,说明走的是 npm 全局安装; - 再看一眼全局目录在哪:
npm prefix -g。预期:输出形如/usr/local、/opt/homebrew或~/.nvm/versions/node/<版本>——如果是 nvm 路径,说明全局目录跟着 Node 版本走; - 顺手确认还有没有别的入口:
which -a dsh(Windows 用where dsh)。预期:只列出一条、且位于第 3 步前缀的bin下;列出多条说明机器上有两份以上安装,卸完一条还有一条。
用 nvm / fnm 的注意:每个 Node 版本各有一份全局包。第 2 步看到包、但卸完命令还在,往往是切到了另一个版本——先 nvm use <当初安装的版本> 再卸。
DSH plugin 卸载第二步:npm 与 pnpm 两种写法
确认走 npm 全局后,卸载就是一条命令;pnpm 全局换对应子命令即可。 操作步骤:
- npm 全局安装的,执行:
npm uninstall -g @deepseek-ai/dsh
-
预期:终端输出
removed ... packages(或up to date),不出现任何错误;全局包列表里该条目消失; -
pnpm 全局安装的,改用:
pnpm remove -g @deepseek-ai/dsh
-
预期:pnpm 报告已移除该包;如果当初跑过
pnpm setup,再去pnpm root -g的上一级bin目录确认dsh软链接已消失; -
若提示包不存在(
npm ERR! code E404之外的空结果或up to date),说明它早已被卸载——直接跳到验证环节。
参数永远写包名 @deepseek-ai/dsh。 写 dsh 会因找不到同名包而报 E404,这也是「卸载命令没反应」最常见的原因。
npm 卸载 DeepSeek Harness 报权限错误(EACCES / EPERM)怎么办
EACCES 的根因只有一个:当前用户对 npm 全局目录没有写权限——多半是当初用 sudo 装过,或 Node 由系统包管理器安装。 先别急着加 sudo,按安装来源选对应做法:
- 当初就是用
sudo npm install -g装的:保持一致,用sudo npm uninstall -g @deepseek-ai/dsh。预期:卸载成功;缺点是全局目录仍归 root,下次装别的全局包还会撞同一堵墙; - 用 nvm / fnm 管理 Node 的:根本不需要 sudo——先
nvm use <当初的版本>(或fnm use),再原样跑卸载命令。预期:命令直接成功,因为全局目录就在用户家目录里; - 系统 Node(Homebrew、apt、官方 pkg 装的)且全局目录归 root:卸载仍需 sudo(或用第 1 条),但建议顺手把后续全局包改到用户目录:
npm config set prefix ~/.npm-global
预期:之后 npm prefix -g 输出 ~/.npm-global;记得把 ~/.npm-global/bin 加进 PATH,否则新装的全局命令找不到。注意这只影响以后安装的包,已经装在系统目录里的那份不会因此搬迁,还是得用 sudo 卸干净;
4. 别为了省事对 nvm 环境用 sudo:sudo npm 会以 root 身份解析到另一套 Node 与另一份全局目录,可能把包装到 root 家目录,反而制造出「卸不掉」的第二份安装。
卸完 dsh 命令还在?DeepSeek Harness 多份安装与 shell 缓存排查
「卸载成功但命令还能跑」几乎都指向三件事:还有另一份安装、shell 哈希缓存、或者你本来就用 npx。 逐条排除:
- 列出全部命令入口:
which -a dsh(Windows 用where dsh)。预期:若仍有一条输出,看它落在哪个目录——/opt/homebrew/bin、/usr/local/bin、~/.nvm/versions/node/*/bin或$PNPM_HOME,按目录判断是哪份安装,再用对应的包管理器卸(见第一步的对照表); - 切换 Node 版本后重查:nvm 用户执行
nvm ls看装了哪些版本,逐个nvm use后再npm ls -g --depth=0,把出现@deepseek-ai/dsh的版本都卸一遍; - 清 shell 的命令路径缓存:执行
hash -r(zsh 也可rehash),再执行dsh --version。预期:若之前是缓存在作祟,这次会直接提示 command not found; - 确认是不是 npx 方式:如果从未全局安装,
dsh只可能来自 npx 的临时环境。执行ls ~/.npm/_npx看有没有内容,有就清掉(见下节)。预期:清理后不再有可执行的dsh。
版本相关症状(更新了但版本没变)是另一条排查线,见《dsh 更新了版本没变怎么办》。
npm 卸载 dsh 后的残留、DSH plugin 数据与 ~/.dsh 目录怎么处理
卸载只删程序,不碰用户数据;残留要分成「npm 侧缓存」和「用户数据」两类分别决定。 逐项处理:
- npx 临时环境(只有用过 npx 才需要清):
rm -rf ~/.npm/_npx
预期:目录消失;下次 npx @deepseek-ai/dsh web 会重新下载,不丢任何数据;
- npm 下载缓存(想释放磁盘时再清,不影响功能):
npm cache clean --force
预期:~/.npm/_cacache 被清空;之后首次安装需重新下载。注意它不会清 ~/.npm/_npx,两者是不同位置;
-
~/.dsh数据目录:这里存着settings.yaml、.credentials.yaml、profiles/(含已装插件)与会话日志sessions/。只想卸程序就保留——重装后配置、插件、会话都还在,这正是「卸载不影响数据」的含义; -
确定不再使用再删数据目录:
cp -r ~/.dsh ~/.dsh.bak && rm -rf ~/.dsh
预期:数据目录消失,先备份后删除,事后可从 .dsh.bak 恢复。只清聊天记录、保留配置与插件的分层做法见《DeepSeek Harness 怎么删除会话》与《dsh 怎么重置、恢复初始状态》;
- 插件比程序多活一步:插件是装在 profile 下的独立依赖,程序卸了它仍在磁盘上。想顺带清掉,删
~/.dsh/profiles/<name>即可,细节见《DSH plugin 卸载后残留怎么清理》。
DSH plugin 卸载验证、注意事项与插件侧核对
验证看三处:全局包列表、命令入口、命令能否执行——三项都干净才算卸完。 操作步骤:
npm ls -g --depth=0。预期:不再出现@deepseek-ai/dsh;which -a dsh(Windows 用where dsh)。预期:无任何输出;- 新开一个终端执行
dsh --version。预期:提示command not found/ 不是内部或外部命令。
注意事项:
- 先停进程再卸:正在运行的 dsh 会占着文件,先关服务再卸载最稳。
- 参数写包名:
npm uninstall -g @deepseek-ai/dsh,不是dsh。 - 慎用 sudo:只在当初用 sudo 装、或全局目录确属 root 时使用;nvm 环境用 sudo 会制造第二份安装。
~/.dsh是数据不是程序:卸载不会删它,删除前务必先备份——里面是设置、凭据、插件与会话。- nvm 用户逐个版本检查:每个 Node 版本各有一份全局包,切换后重新确认一遍。
- 卸载与更新是不同的通道:如果只是想换版本,别卸载重装,看《npm 怎么更新 dsh》的三条路分工。
程序卸载只处理本体;插件、来源与版本这类信息用可视化列表核对最不容易漏。 DSH Plugin Hub 的已安装列表会显示每个插件的来源(插件中心 / 手动安装)、版本与可更新状态,卸载前先在这里过一遍,就知道哪些是目录插件、哪些是当初手动装的,清理时不会误删或漏删。想通过界面卸载单个插件,走《DSH Plugin Hub 怎么卸载插件》。

来源:npm Docs - npm uninstall、deepseek-ai/deepseek-harness、官方 Quickstart。
常见问题
卸载 DeepSeek Harness 时,npm 全局装的用 npm uninstall -g @deepseek-ai/dsh,一条命令删掉包本体和 dsh 命令的软链接。当初用 pnpm 全局装的则换 pnpm remove -g @deepseek-ai/dsh;如果配置过 PNPM_HOME,再确认该目录下的 dsh 软链接已消失。卸载前先停掉正在运行的 dsh(关闭终端或 Ctrl+C)。
处理 DeepSeek Harness 卸载时的 EACCES 报错,先看当初怎么装的:用 sudo 装的就用 sudo npm uninstall -g @deepseek-ai/dsh 卸,一致即可;用 nvm 或 fnm 管理 Node 的,先切换到当初装的那个版本再卸,根本不需要 sudo;系统 Node 且全局目录属于 root 时,除了 sudo 卸载,更该做的是 npm config set prefix 把后续全局包改到用户目录,避免下次再撞同样的错误。
卸载 DeepSeek Harness 后命令还能用,有三种可能:① 本机存在多份安装(nvm 的各 Node 版本各有一份、或另有 pnpm/Homebrew 装的一份),用 which -a dsh 全部列出来逐一确认;② 当前 shell 缓存了命令路径,执行 hash -r(zsh 也可 rehash)后重试;③ 你其实一直是 npx 方式运行,从未全局安装,那本就没有可卸载的实体,清理 ~/.npm/_npx 即可。
卸载 DeepSeek Harness 后,这两处要分开决定:~/.dsh 里是设置、凭据、profile 与已装插件——只想卸程序就留着,重装后配置和插件都还在;确定不再用再删,删前先备份。npx 侧有两个可清的位置——~/.npm/_npx(临时运行环境)与 ~/.npm/_cacache(下载缓存),删掉只影响下次启动要重新下载,不影响任何用户数据。
确认 DeepSeek Harness 卸干净要三步验证:① npm ls -g --depth=0 的列表里不再出现 @deepseek-ai/dsh;② which -a dsh 没有任何输出(Windows 用 where dsh);③ 新开一个终端执行 dsh --version,提示 command not found。三项都通过,说明程序本体已卸净;剩下的只有 ~/.dsh 数据目录,属于你自己决定留不留的部分。
相关术语
- npm uninstall -g
- npm 的全局卸载子命令,参数写包名(不是命令名):它对全局目录里该包执行卸载,并移除它注册的可执行文件链接。因此卸载 DeepSeek Harness 要写 @deepseek-ai/dsh,而不是 dsh。— npm Docs - npm uninstall
- EACCES / EPERM
- npm 在全局卸载或安装时遇到的权限错误:当前用户对 npm 全局目录(prefix)没有写权限。根因通常是全局目录归 root 所有,常见于系统包管理器安装的 Node,或历史上用过 sudo 装全局包。— npm Docs - npm uninstall
- npm prefix -g
- npm prefix -g 打印当前全局安装前缀,全局包落在 <prefix>/lib/node_modules、可执行链接落在 <prefix>/bin。用 nvm 或 fnm 时该前缀随 Node 版本变化,所以每个版本各有一份全局包。— npm 官方文档
- ~/.npm/_npx
- npx 的运行环境目录:npx 把临时使用的包解到这里的哈希子目录,并复用其中的 node_modules。它是 npx 方式在磁盘上留下的主要实体,删掉后下次执行会重新下载,不影响任何用户数据。— npm 官方文档