前言¶
跑久了的 Windows 开发机,磁盘一般不是「满了」,而是「不知道是什么占的」。缓存、包管理仓库、崩溃转储、浏览器缓存、应用更新器留下的安装包,混在一起;手动清怕删错,不清又看着容量条着急。写个清理脚本不难,难的是边界:哪些目录可以放心删,哪些只能量不能删,哪些需要提权才删得动。
下面介绍的 dsh-disk-cleaner 就是把这件事拆成两部分的 DSH 插件。安装命令在资料里没有现成写法,本文只讲它的机制和我核对过的事实。
这是什么¶
dsh-disk-cleaner 是 stallenlu 维护的 DSH 磁盘空间插件,MIT 许可,仓库 stallenlu/dsh-disk-cleaner。README 标题行写的就是「Disk Cleaner for DeepSeek Harness: scan known-safe caches, assess what cannot be cleaned, get a ranked plan」。仓库当前版本 1.6.0,README 标注的开发与实测版本是 DSH 0.2.1-rc.5,因为它用到了 plugins.bundle.config 和 settings.section;engines.node 为 >=22,但仅用于跑冒烟测试。平台声明是 Windows,清理路径按 Windows 目录布局构造。
它有意把两件事分开做:
- Clean:三十二个「已知安全」的位置,先扫描看各占多少,再按面向用户的步骤删除。只有这三十二个位置会被删。
- Assess:插件不会删的那些东西——已装程序、WSL 虚拟磁盘、Windows 组件存储、聊天应用数据、你自己的文件夹。这部分只做只读测量和列表,永不删除。
评估收尾时给一份 plan:同样的数字,按「你动手要付多少代价」排序;插件自己跑不了的步骤,附上可直接复制的 Windows 命令。
核心功能¶
先讲机制上的第一点:面板(HTTP 路由)和 agent 工具走的是同一套操作,清理逻辑只在 lib/catalog.js 里存在一份,路由和 disk_cleaner 工具是它的两个调用方。
扫描与分组¶
三十二个目标并发测量,同时给出每个目标占多少空间、有多少文件。顶部有一排已挂载卷的筛选条,扫描或清理可以限定在某个盘;在该盘上没有目标的行会消失。
三十二个目标按七个标题分组:系统临时、开发工具、浏览器缓存、应用缓存、残留更新器、备份、孤立数据。整组目标都读数为 0 B 的分组默认折叠,列表打开时先看有东西可清的部分。
风险标签与按龄删除¶
每个目标标 safe 或 caution,并给一行理由,理由来自固定词表:in-use、rebuild、elevation、pending-update、rollback、superseded、history、duplicate、database-backup、orphan。面板里有常驻的图例,所以 caution 不会变成「未知」。
删除不是一刀切:temp 和 windows-temp 只删一天以上的文件,正在被程序占用的文件会跳过;app-updaters 等目标按三天空窗和其它年龄线处理。目录里所有路径都由目标 id 在代码里构造出来,调用方传的是 id 而不是路径,于是用户给的字符串到不了 unlink。
只读评估与方案¶
评估阶段只读地遍历磁盘,结果分成 Windows、已装软件、你自己的文件三组,再加十个最大的 app-data 文件夹。任何一行都能在 Explorer 里打开所在目录。
方案最多九步,按动手代价从低到高排。下面三段命令来自 lib/plan.js 实际拼出的内容,是插件认为自己跑不了、交给用户的步骤:
wsl --shutdown
diskpart
select vdisk file="C:\...\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
Dism.exe /Online /Cleanup-Image /StartComponentCleanup
powercfg.exe /hibernate off
方案里还有:可直接清理的 safe 目标、需要用户同意的 caution 目标、需要提权才能删的目标、建议去「设置」处理的安装软件、可以把文件夹搬到别的盘的场景,以及磁盘余量不足时的提示行(lib/plan.js 里把余量低于总容量 12% 的盘标为 pressure)。低于 200 MB 的单一步骤被当作噪声忽略。
面板记忆与 agent 工具¶
扫描结果、勾选项、评估结论在切换面板再切回来后仍在。agent 侧有一个 disk_cleaner 工具,把前述「五个动作」以对模型友好的方式暴露出去;面板和 agent 看到的是同一份清理逻辑。
双语言与入口布局¶
UI 跟随宿主 locale,仓库里 zh 和 en 词典同时发布。入口可以只放侧边栏图标、只放设置区,或两者都放(默认两者)。这个偏好以及「扫描后默认勾选哪些」「删除前是否先确认」,都放在插件自己的配置卡片里,面板的 ⚙ 按钮也能切换。
安装与启用¶
仓库把插件写成一个 bundle:包内的 dsh 字段声明了 patch 和客户端注入,cordis.patch.yml 只做一件事——插入一个 id 为 dsh-disk-cleaner 的行,这是 bundle 加载的开关。
# cordis.patch.yml
# The insert row is what makes this bundle load; keep the id on its own line.
- insert:
- id: dsh-disk-cleaner
name: 'dsh-disk-cleaner'
对应到 package.json:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": {
"platform": "web",
"inject": [
"@deepseek-ai/dsh-client-locale",
"@deepseek-ai/dsh-client-ui-slots"
]
}
}
README 没有给出安装命令行写法,本文不凭名称拼接。如果你已有 DSH 的 bundle 加载路径,按包名 dsh-disk-cleaner 注册即可;不确定就先读 README 的「验证」一节,再决定怎么并入。
典型用法¶
按面板流程走一遍,顺序是先扫描、再评估、最后执行。
1、打开面板,点扫描。三十二个目标并发测量,结果按七个分组展示,全部为 0 B 的组自动折叠。
2、对照图例看标签。purge / 纯缓存且 safe 的条目,删掉只影响下次启动时打开稍慢;带 rebuild、elevation、pending-update、rollback 之类的条目先看清理由再勾。
3、只想看某个盘,用顶部卷条过滤。
4、对 safe 目标执行清理;插件默认会先问一次(这个行为可以在配置卡片里改)。
5、切到评估页,看 Windows / 已装软件 / 你自己的文件三组占用,以及十个最大的 app-data 文件夹;点某行在 Explorer 里打开。
6、读方案。插件能跑的步骤有按钮;跑不了的步骤给一段可复制的命令,比如 WSL 虚拟磁盘压缩、组件存储清理、关闭休眠。
7、重跑评估会把数字重新测一遍;带 force 的调用会绕过十分钟的缓存。
适用场景与注意¶
适合的场景很具体:Windows 开发机,跑着 DSH、VS Code Remote、各种带缓存的应用,磁盘紧张但不想让人对着容量条猜。差距在于它把「删」和「量」分开:能删的只有那三十二个位置,其它一律只量不删。
几点要留意:
- 插件以当前 DSH 进程的权限运行。目录里标了
elevation的目标(例如C:\Windows\SoftwareDistribution\Download)在普通权限下删不掉——方案不会把它包装成「现在就能释放」,而是标成提权步骤。要真正清掉这部分,需要以提权方式运行插件。 caution不是「不确定」,是「有代价」:rebuild意味着下次启动变慢,rollback意味着少一份回滚副本,superseded是版本已经不高于已装版本,history/database-backup是旁边有活跃文件的备份。删除前请按这个顺序确认。- 三十二之外的内容(已装程序、WSL 虚拟磁盘、组件存储、聊天数据、个人目录)只出现在评估里,永远不会被删。
- 安装第三方插件前应检查源码和许可证。许可证是 MIT;仓库在 2026-11-04 创建,最近一次提交在 2026-11-05,星标数为 0,说明社区验证还很少。
- 平台限制写在 README 里:清理路径按 Windows 目录布局构造。非 Windows 环境需要自行验证路径是否成立。
结尾¶
它的价值不在「又一个磁盘清理器」,而在边界清楚:三十二个位置可删,其余只量不删,方案按动手代价排序。对想要知道自己机器上到底是什么在占空间的人来说,比直接给一段 Cleanmgr /sageset 之类的脚本好定位。目录页在 https://www.skillhub.cn/plugins/stallenlu/dsh-disk-cleaner ,源码在 https://github.com/stallenlu/dsh-disk-cleaner 。