前言¶
DeepSeek Harness(DSH)的桌面客户端退出方式比较有限:要么去找窗口的关闭按钮,要么在任务管理器里找进程。如果你习惯在命令行里工作,想在脚本里、快捷方式里或者终端窗口里直接说一句”关掉客户端”,原生是做不到的。
dsh-command-quit 就是解决这个问题的第三方插件。它给客户端补上两条退出通道:对话框里的斜杠指令 /quit-dsh,以及任意终端窗口里的 quit-dsh。两条通道都走同一条应用原生退出流程,不会强杀进程。
下面介绍这个插件。
这是什么¶
dsh-command-quit 是一个 DSH 客户端插件,维护者是 Noobboi-22401,当前版本 1.4.0,仓库地址是 https://github.com/Noobboi-22401/dsh-command-quit 。它做的事情很集中:让 DSH 桌面客户端可以被命令关闭。
有几点需要先说清楚,来自 README 的原文声明:
- 不是 DeepSeek 官方插件,与 DeepSeek 官方没有任何关系。配置面板里那几项设置只是借用了 DSH 自带的插件设置入口,控件是 DSH 提供的公共控件,排在同一个分组里,仅此而已。
- 代码由 Deepseek V4.1 Flash 编写,上传者只做了基本功能测试,未逐行复查代码,可能存在未知的 bug。
- 许可证是 MIT。
这个插件在社区目录站点上的分类是「客户端」,星标数为 0(以目录页当前显示为准)。
核心功能¶
插件提供两种退出方式,走的是同一条应用原生退出流程。
一、对话框指令。 在 DSH 对话框里输入 /quit-dsh 并回车,客户端关闭。输入 /q 会看到 /quit-dsh 候选,按 Tab 之后补全并立即执行——当前版本里补全和执行是一步完成的。也可以在命令面板里选择 quit-dsh,描述是「关闭 DeepSeek Harness 客户端(退出程序)」。
二、终端命令。 在任意终端窗口(PowerShell、cmd、Windows Terminal、Git Bash 都行)输入 quit-dsh 并回车,同样关闭客户端。默认会先问一句”确认退出吗 [y/N]”,只有输入 y、yes 或 是 才继续,直接回车等于不退出。
两种方式都不能绕过客户端自己的确认框:如果此时还有任务在跑,会弹出确认框,而不是直接杀掉进程。同时开着多个客户端时,一次会把它们都请退出。
运行时不消耗 Token。 命令完全在本地处理,只是通过 IPC 让应用外壳退出,不会发起任何模型调用,不计入 token 用量。
安装与启用¶
安装插件¶
从 GitHub 安装,用 install_bundle:
install_bundle github:Noobboi-22401/dsh-command-quit
也可以克隆下来走本地路径安装。先克隆:
git clone https://github.com/Noobboi-22401/dsh-command-quit.git
然后:
install_bundle link:<克隆到的绝对路径>/dsh-command-quit
安装由 DSH 自带的 plugin_manager 完成,它会执行 pnpm add、把 dsh-command-quit 写进 profile 的 dsh.profile.bundles、建立符号链接并更新 lockfile。
生效方式:必须打退出补丁¶
从 1.4.0 起,/quit-dsh 需要给客户端打一次”退出补丁”。原因是桌面客户端对子进程发来的消息只认固定几种,其余一律当成异常:它会报一句 dsh desktop host sent an invalid IPC event,把干活的进程掐掉,然后弹出”应用无法启动或已意外停止”的窗口。所以插件在发送之前会先检查补丁在不在,没打就只回答一句话、不发消息,不会再崩。
打补丁最省事的方式是双击插件目录里的 install-dsh-quit.cmd,它本来是装终端命令的,现在会顺便找到客户端、打好补丁并记住客户端位置。如果不想装终端命令、只想让 /quit-dsh 能用,在插件目录执行一次:
node tools\patch-asar.mjs
补丁只改客户端 app.asar 里的两处语句,改完文件大小一个字节都不变,不会破坏客户端自身的完整性校验,也能用一条命令精确还原。打完要重启客户端才生效——profile 的 bundle 列表在客户端启动时读取,刚装上的插件也要重启后再用。
补丁状态可以随时查:
node tools\patch-asar.mjs --check # patched / unpatched / unknown
node tools\patch-asar.mjs --revert # 还原出厂字节
客户端升级之后¶
客户端升级会换掉 app.asar,补丁随之消失,/quit-dsh 会回答”这个客户端还没打好退出补丁”,不会崩溃。重新双击一次 install-dsh-quit.cmd 或跑一次 node tools\patch-asar.mjs,然后重启客户端。
另外,终端命令的启动文件写在 DSH 的安装目录里,客户端升级有可能把它清掉。升级后 quit-dsh 不见了,同样是双击一次 install-dsh-quit.cmd,配置页的状态行会显示”尚未安装”。
典型用法¶
对话框里退出¶
在输入框输入 /q,下方出现 /quit-dsh 候选,按 Tab 就会补全并立即执行。如果此时还有任务在跑,先弹确认框。命令面板里也能找到 quit-dsh。
终端里退出¶
终端命令需要先装一次,之后就能在任何终端窗口用。
安装步骤(只做一次):
- 打开插件文件夹,双击
install-dsh-quit.cmd。 - 看到”安装完成”后关掉窗口。
- 重新打开一个终端(已经开着的终端认不到新命令),输入
quit-dsh回车。
安装做两件事:把两个几行的小文件写进 DSH 自己的命令目录(也就是放着 dsh.cmd 的那个目录),并且顺带找到客户端、打好补丁、记住位置。两件都不需要管理员权限,客户端开着也能做。
实际跑起来的样子:
> quit-dsh
即将关闭 DeepSeek Harness 客户端。
(如果客户端里还有任务在跑,关的时候它自己还会再弹一次确认框。)
确认退出吗? [y/N] y
正在请求关闭 DeepSeek Harness 客户端…
已发送退出请求,客户端正在关闭。
几个参数:
| 命令 | 作用 |
|---|---|
quit-dsh |
先问一句,答 y 才退出(默认行为) |
quit-dsh --yes |
不询问,直接退出(写脚本或快捷方式时用) |
quit-dsh --list |
只列出正在运行的客户端,不退出 |
quit-dsh --help |
显示说明 |
改命令名¶
两个命令名都可以自己改。在 DSH 界面左侧栏打开插件页面,在官方分组里找到”退出命令”,点开就能改。
对话框命令的四个预设是 /quit、/quit-dsh、/quitdsh、/qd,也可以在”命令名”输入框里直接打 / 后面那一段。同一时刻只生效一个,保存后立刻生效、不需要重启,旧名字同时失效。
保存前会过两道检查,不通过就拒绝保存(输入框变红、保存按钮点不动):
- 格式。 必须以小写英文字母开头,只能包含小写字母、数字、下划线和连字符。
- 撞名。 不能和 DSH 内置命令、其他插件已注册的命令重名。这里有个坑:DSH 的命令分两层存放,
compact、goal、plan这类登记在会话/预设作用域里,export、feedback这类才是全局的。只检查全局层的话,compact会被当成没人用,结果退出命令登记成功却被同名内置命令遮住,输入它根本不会退出。插件现在的检查会遍历注册表里所有已知作用域,任一层被占用就拒绝保存。
万一已经把撞名保存进去了,插件启动时发现这个名字不可用,会自动退回默认命令名 /quit-dsh 并在日志里写明。还有一种保存时查不出来的情况——另一个插件在某个会话跑起来之后才登记同名命令——插件会监听 DSH 的命令表变化通知,发现被盖住后就自动改回 /quit-dsh,并在插件配置页显示红字、在应用界面底部弹出横幅,不用打开设置页也能看到,可以点 × 关掉。关掉只关这一条,换个名字再撞、或重启后仍是同一个冲突,会再弹一次。
配置由 DSH 自己保管,写进当前 profile 的 cordis.patch.yml,插件目录下不会产生独立的配置文件。冲突提醒作为 notice 字段写进同一个配置项,只有真的发生时才出现,换回可用的名字后会自动清掉。
终端命令名在同一配置页的”终端命令”一节里改,默认 quit-dsh,预设有 quit-dsh、dsh-quit、dshq、dsq。改完保存后,已安装的启动文件会自动改名,不用重新安装。不过已经开着的终端要重新打开才能认到新名字,因为终端会缓存 PATH 上的命令。
终端命令那一节还有两个开关:
| 控件 | 默认 | 说明 |
|---|---|---|
| 启用终端退出功能 | 开 | 关掉后 quit-dsh 不会退出客户端,只提示功能已关闭,已经安装的启动文件会保留 |
| 执行前先询问确认(y/N) | 开 | 关掉后 quit-dsh 直接退出、不再提问。上一项关掉时这一项会变灰 |
终端命令名保存时也检查撞名:若该名字在 PATH 上已被别的文件占用,保存直接拒绝并列出占用的文件,因为终端解析命令看的是整个 PATH,撞名会让你的命令变成另一个程序。Windows 的保留设备名(con、nul、com1 等)同样拒绝。
终端命令怎么关掉客户端的¶
终端里的 quit-dsh 和插件是两个不同的进程,客户端内部那条”请退出”的专线插件的子进程够得着,终端够不着。所以插件在客户端运行时会开一个只允许本机连接的小接口:优先 Windows 命名管道,环境不支持时退回 127.0.0.1 回环端口,并拒绝任何非本机来源的连接。接口门牌号不是秘密,另配一把 64 位十六进制的随机口令,放在 ~/.dsh-command-quit/ 下。终端命令读到门牌号和口令、连上去说”请退出”,插件收到后做的事和 /quit-dsh 完全相同。口令对不上会被明确拒绝。
适用场景与注意事项¶
适合这几类人:
- 习惯在终端里干活,想让客户端在脚本或快捷方式里被正常关掉的人。
- 希望用斜杠命令退出客户端、而不是找窗口关闭按钮的人。
- 需要在有任务在跑时仍能安全退出、不想强杀进程的人。
使用前要注意几件事:
- 插件以 DSH 进程权限运行。 它提供的功能是给客户端打补丁、注册命令,安装前应先检查源码和许可证。许可证是 MIT,源码在 GitHub 上公开可查。
- 1.3.0 版本已作废。 1.3.0 声称”不再需要给客户端打补丁,直接用客户端自带的官方退出消息”——README 明确说这个判断是错的,按它做会让客户端弹崩溃窗口。1.4.0 已改回打补丁的方式。如果你装的是 1.3.0,先移除再装 1.4.0:
remove_bundle dsh-command-quit
install_bundle github:Noobboi-22401/dsh-command-quit
已经有终端命令的(例如用过测试版)不用先手动删除,插件按”第几代”识别自己写过的启动文件,发现旧版会自动换成新版。升级之后记得重启客户端。
3. 卸载时补丁要撤掉。 卸载分几步:先用 remove_bundle dsh-command-quit 移除插件,再重启客户端;如果装过终端命令,双击 uninstall-dsh-quit.cmd。它只删带本插件标记的那两个文件,你自己创建的同名文件不会被动,客户端的 /quit-dsh 不受影响。正常卸载时 uninstall-dsh-quit.cmd 会自动把补丁撤掉;如果插件目录已经被删掉,要手动在仍留有插件副本的目录执行 node tools\patch-asar.mjs --revert 还原。
结尾¶
dsh-command-quit 的价值在于把退出这个动作标准化成了命令:对话框里有 /quit-dsh,终端里有 quit-dsh,两条通道都走客户端的原生退出流程、不强杀、不丢数据,而且不消耗 Token。命令名和确认方式都能自己配,撞名有现场提示。
它不是官方插件,代码由模型生成、只做过基本功能测试,装之前建议先过一遍源码。
目录页:https://www.skillhub.cn/plugins/Noobboi-22401/dsh-command-quit
GitHub:https://github.com/Noobboi-22401/dsh-command-quit