# 待办与想法清单(dsh-disk-doctor) > 这份文件记录**用户提过的所有想法**,方便后续对话直接接着做。 > 最后更新:2026-10-07 --- ## 怎么用这份文件 新开一个对话时,直接说: > 读一下 `E:\disk-doctor\dsh-disk-doctor\TODO.md`,然后做第 2 项。 顶部标 ⬜ 的是没做的,✅ 是做完的。每条都写了**用户的原话**,避免我理解偏。 --- ## 🔔 本次改动(2026-10-07):分区统计 + 打开文件夹,一次做完,等你验收 **用户当时的决定**:第 6 项(把所有相关路径都扫进来、分多个界面框:数据区 / 程序文件夹区)**和第 1 项(打开文件夹按钮)一起做完再验收**。 **做了什么** - 统计分成**三个区,各自一个数字,永不相加**: | 区 | 是什么 | 本机实测 | |---|---|---| | ① DSH 数据 | `~/.dsh`(原来的 11 个分类都在这区) | 736 MB | | ② DSH 程序 | 安装目录 `E:\dsh1` **+ npm 全局安装的那一份 DSH**(都是自动探测) | 1270 MB(1015 + 255) | | ③ 系统缓存 | 桌面端用户数据 + pnpm 内容仓库 | 126 MB | - 面板改成**竖排三个框**,每个框有自己的标题、数字和一句「这些字节在哪」,框里是各类明细(①区里还有原来的总览/按插件/按聊天记录三个视图) - **路径全部自动选**:数据目录跟随 `DSH_HOME` 环境变量(别人装了也自动对);程序安装目录按运行中的程序位置探测,并且**必须真的存在 `resources/app.asar` 才认**;npm 全局安装的那份按 `%APPDATA%\npm` / `npm_config_prefix` 等位置找,且必须是真正的包目录;两个系统缓存按 `%APPDATA%` / `%LOCALAPPDATA%` 找。探测不到就老实说「没找到」,另加了一个 `appDir` 设置项可以手填覆盖 - **顺手查出第三份 DSH**:`%APPDATA%\npm\node_modules\@deepseek-ai\dsh` 是 **254.8 MB**。 之前它完全没被统计,而①区 `profiles/node_modules` 里那 500 多个 junction 全都指向它—— 也就是说「插件的 109 MB」其实复用的是这份安装。现在它独立成②区的一个分类 - **pnpm 硬链接陷阱实测解决**:`pnpm-store` 现在会报出「其中约 109 MB 与①区的插件文件是同一批物理文件」(用 inode 比对,不是猜的),所以两个区不能相加、也不是删掉就能省下这么多 - **链接安装的插件不再消失**(第 5 项):`dsh-disk-doctor` 自己现在会出现在「链接安装」清单里,带真实位置 `E:\disk-doctor\dsh-disk-doctor` 和真实大小;这些字节**不计入任何区的数字**。 同时补了一条规则:**目标已经在扫描范围内的链接不再单列**(那 510 个指向 npm 安装的链接现在就属于这类,字节算在②区,报告只用一句话说明),免得出现「不计入上面的数字」这种和事实相反的标注 - **每行都有「打开」按钮**:🟢 档**默认就能点**(`allowOpenFolder` 默认开);🟠⚪ 档需要再打开第二个开关(「允许打开需谨慎处理的位置」),因为那会露出你的对话目录和程序文件。 总开关关掉后所有「打开」按钮都会变灰,宿主也会直接拒绝 - **两个权限做成真正的开关**(原来设置页让人手打 `true`/`false`,还显示成 `false`):现在是开关 + 说明 + 改过之后才出现的「恢复默认」。 保存后**不用重启**:宿主的 volatile 字段是活引用,插件每次请求都重读配置(有 2 项测试钉住) - **加了一份颜色说明**(🟢 可以安全清理 / 🟠 要谨慎处理 / ⚪ 不要动 + 各自什么意思):面板底部一份,设置页「高级选项」里两个开关下面一份 - **设置页从 5 个字段补成 8 个**(原来两个开关根本没渲染出来):新增 `appDir`、`allowOpenFolder`、`allowOpenFolderSensitive` - 顺手改掉一个会误导的名字:`~/.dsh/electron` 原来叫「DSH 程序本体」,其实它是一整份 Electron 运行文件,现在叫「Electron 运行文件」(面板和报告两边都改了),免得跟新的「DSH 程序」区撞名 - 目录遍历改成并发(16 个子目录并行 + 原来 64 个 `lstat` 并行),因为光那份 npm 安装就有 3.3 万个文件,串行要 6.7 秒 - 归一化配置时补上「字段缺失就用文档里的默认值」:否则一个没有经过 schema 的裸配置会把 `undefined` 读成 `false`,和 schema 说的默认值正好相反(这条是拿真报告渲染面板时试出来的) - **图例行也有「打开」按钮了**(原来只有列表行有):「按插件」「按聊天记录」的饼图图例、以及「总览」饼图的每一片, 都按它所属分类判等级——🟢 直接可点,🟠⚪ 需要敏感档;折叠的「其他 N 项」展开后每一项也有按钮(汇总行本身没有,它不指向某个文件夹) - **清理功能第一步(预演)已完成**:面板多了两个框——当时叫「清理(预演)」,**现已改名为「清理」**——和「想省更多空间?这样做才对」, 详见下面第 2 项 - **图例右上角加了「显示名称 / 显示完整路径」切换**(只在「按插件」「按聊天记录」两个视图里出现): 聊天记录现在用宿主给的真实 workspace 名称 + 会话短标,例如 `disk-doctor · 64875ca0` (原来显示的是从目录名硬解出来的 `E\disk-doctor · session-`,既没有真名字也不区分会话); 插件仍用包名,因为要显示更漂亮的 `displayName` 就得去读每个插件的 `package.json`, 那会破坏「整个包只读一个文件」的隐私承诺——所以插件这块保持包名 - **图例全灰时会写明原因**:那一页的位置属于 🟠/⚪,图例上方直接写「要在设置里打开『允许打开需谨慎处理的位置』才能点开」, 免得看着像功能坏了 - **清理框里写清了「第二步会怎么做」**(用户要求):① 先移动到回收站文件夹、不是真删 ② 你重启 DSH、用一会儿确认一切正常 ③ 有问题一键撤销、按清单移回原处,确认无碍再自己清空那个文件夹 - **隐私那条按用户决定结案**:面板路由**保持不脱敏**(用户要复制真实路径),报告与日志照旧脱敏; 用户 2026-10-07 明确说「不脱敏也可以实施」 - **「完整路径」那条结案**:用户确认「已经可以直接复制和打开文件位置了」,不再需要单独的展开全文入口 - **✅ 清理功能第二步(真的移动 + 清单 + 一键撤销)已完成**——本项目唯一会动用户文件的代码,全部细节见下面第 2 项 **测试**:177 项全过(locate 18、scan 55、plugin 41、client 63),一条 `npm test` 跑完四套 **⚠️ 需要你做的验收步骤** 1. **重启 DSH**(宿主侧改了:清理路由的 POST、`allowCleanup` 字段、绿色档默认开) 2. **刷新网页**(浏览器半边是页面加载时取回的;看着不对按 Ctrl+F5) 3. 打开 **插件 → 已安装 → dsh-disk-doctor** 设置页,展开「高级选项」:现在是 **8 个字段 / 2 个开关** (主开关默认已开、敏感档默认关),下面是**颜色说明**——第 9 个字段「允许清理」已按你要求搬进面板 ⚙ 4. 回面板:🟢 档(例如「临时文件」「插件安装日志」)的「打开」按钮**直接可点**,🟠⚪ 仍是灰的;「按插件」「按聊天记录」的图例行也有「打开」 5. 把主开关**关掉**并保存 → 回面板,所有「打开」都变灰;再打开 → 又能点(**不需要重启**) 6. 看三个框的数字:① DSH 数据 ② DSH 程序(`E:\dsh1` + npm 全局安装 ≈ 1.2 GB)③ 系统缓存(写明约 109 MB 与①区是同一批物理文件) 7. 看「链接安装」清单里是不是只有 `dsh-disk-doctor → E:\disk-doctor\dsh-disk-doctor` 这一条 8. 点「清理」框里的「看看会移动什么」:应该列出几条、写出总量和目标文件夹,并写着「不会移动任何文件」; 如果你刚好在用 DSH,会看到「另有 X 字节最近 1 小时内还在改动,这次不列入计划」 9. **试第二步**:点面板右上角 **⚙** → 最下面的「允许清理(移动到回收站)」打开(写的是宿主设置,**不用重启**) 10. 回面板点「移动到回收站」→ **会先问你一次**「确定移动这 N 项吗?」→ 按钮本身变成「确定,移动」,再点一次 11. 看结果:方框变绿,写着「已移动到回收站:N 项」和「接下来:重启 DSH、用一会儿」,还有一个「撤销」按钮 12. 重启 DSH、用一会儿,确认一切正常;然后点「撤销」→ 应该显示「已移回 N 项」,东西回到原处(回收站里只留下清单) 13. 确认没问题后,**自己去清空** `~/.dsh/disk-doctor/quarantine/` 里的文件夹(插件永远不会替你删) 14. 数字对不上、或者哪一步行为和这里写的不一样,告诉我,我这边有实测脚本可以对账 > ⚠️ **2026-10-07 你实测报的两个问题,都已修好(需要重启 + Ctrl+F5)** > 1. **「点了『移动到回收站』没有反应」——是我的 bug**:按钮的禁用条件写成 > `权限没开 || 还没确认`,而**浏览器根本不会把点击交给 disabled 的按钮**, > 于是「第一次点击打开确认框」这一步永远发生不了——按钮看着活着,其实点不动。 > 现在只在权限关着时才禁用。**更该反省的是我的测试把这个 bug 当成预期行为钉住了** > (断言 `disabled === true`,注释还写着「第一次点击只是问问」),现在反过来钉「有权限时必须可点」。 > 同时移动失败会明确说原因(权限没开 / 宿主还是旧版本、要重启 / 连不上宿主), > 不再出现「什么都没发生」这种看不出所以然的界面。 > 2. **「允许清理」按你要求移到面板右上角 ⚙ 里**:它是宿主设置,所以走**和设置页同一个配置表单** > (`ctx.configForms.get(命名空间)` + `SettingsFormModel`),保存照样持久化,两处不可能不一致; > 被上层配置锁住时会明说,而不是开关自己弹回去。设置页因此变成 8 个字段 / 2 个开关, > 有测试钉住第 9 个字段**没有消失**(只是搬到了 ⚙ 里)。 > 3. **对文案时又抓到一个用户可见的 bug**:「npm 全局安装的 DSH」这个分类**没有名字**, > 面板上会直接显示原始键名 `cat_npm_global_dsh`(加分类时忘了补字典)。 > 已补中英文,并把那条测试从「手写一张分类清单」改成**直接从宿主的分类表取**—— > 以后再加分类,这条测试会立刻失败提醒补名字,不会再靠人记得。 > 4. 顺带把确认流程收干净:确认状态下**只有一个是(按钮自己变成「确定,移动」)和一个取消**, > 不再出现两个一模一样的确认按钮;移动失败时也不会同时说「这次没有可移动的内容」。 > 我实测过一次真的移动:6 个临时目录、3.8 MB,移进回收站后**逐条一一对应**,撤销后受监视区域**逐字节一致**。 > 所以你的回收站里会有一份 `20261007-030514` 的清单(状态 `undone`,6 项),看到不用惊讶,直接删掉即可。 --- ## ⬜ 待办(按用户提到的先后) ### 2. 清理功能(带回收站与撤销) —— ✅ 两步都已完成(2026-10-07),第一版到此封版 **用户原话** > 「也没有清理按钮」 > 「你说的清理方案我觉得可以,或者有没有办法就是比如放在回收站里以后,里面的东西不调用,然后重启看看能否正常运行或者看运行状态,这之后就可以根据此决定是否真正删除」 > 「注意这个插件涉及内容统计和删除是非常敏感的,一定要检查好功能」 **已商定的设计(用户已同意,现已全部实现)** 1. **只允许 🟢「可以安全清理」档参与**;🟠⚪ 一律拒绝 2. 先**预演**:列出准备移动的每一条与总量,此时**不动任何东西** 3. 用户确认后,移动到 `~/.dsh/disk-doctor/quarantine/<时间戳>/`,**保留原目录结构** 4. 生成**清单文件**,提供**一键撤销**(移回原处) 5. 用户重启验证;确认无碍后自己清空该文件夹 **✅ 第一步:预演(零风险)** - `lib/cleanup.js` + `GET /dsh-disk-doctor/cleanup`:把「**如果清理会移动什么**」列成清单, 用的是与报告同一套只读扫描,只是把 🟢 档的条目上限提到 500 条(报告只带 Top N, 而一份只列前 15 项的清单等于说假话) - 清单明确写出:`dryRun: true`、目标文件夹(**只算出来,从不创建**)、每一条的路径与大小、总量、 以及**被拒绝的档位**(每一类都带等级,讲清楚为什么不参与) - **「最近还在用」规则**:条目里**最新那个文件**的改动时间在 1 小时内的,一律不列入计划, 只报「另有 X 字节最近还在改动」(本机实测跳过了 466 KB 的临时目录)。 用的是「内部最新 mtime」而不是目录自己的时间戳——进程一直在往里写文件时,目录的 mtime 是不动的 - 面板两个框:**「清理」** 与 **「想省更多空间?这样做才对」**(点出最大的插件去卸载、 pnpm 仓库用 `pnpm store prune`、哪些绝对不要动) **✅ 第二步:真的移动 + 清单 + 一键撤销**(用户 2026-10-07 说「开始吧」) - **绝不删除**:`lib/cleanup.js` 里唯一会改动文件系统的调用是 `renameSync`, 也就是说字节永远还在某个地方;清空回收站是**用户自己**在插件之外做的事。 源码审计测试同时钉住两件事:整个包不得出现任何删除调用,且 `renameSync` 只允许出现在 `lib/cleanup.js` - **移动到** `~/.dsh/disk-doctor/quarantine/<时间戳>/<分类>/<原结构>`:保留原布局, 同名的(比如两个 profile 的 `.dsh-market`)自动加 `-2` 后缀,绝不覆盖 - **清单 `manifest.json` 每移动一条就重写一次**,所以中途崩了也有一份与磁盘一致的记录 - **撤销前重新校验**:批次名必须是时间戳;每条记录的目标必须在那个批次文件夹内; 每条记录的原始位置必须是「清理有权拥有的路径」。所以**手改过的清单也没法把文件搬到别处**, 原位置若已被占用则**拒绝而不是覆盖** - **「清理有权拥有什么」是独立于「现在存不存在」的规则**(`ownsCleanupPath`): 否则撤销时根目录自己已被移走,就永远移不回来了(这正是实测时踩到的 bug,已修并有测试) - **默认关闭**:新增配置项 `allowCleanup`(默认 `false`),设置页上是第三个开关。 关着的时候路由直接 403、面板上的按钮是灰的并写明原因 - **两次点击才移动**:第一次点只是问「确定移动这 N 项(共 X)吗?」,第二次才真的动 - **移动时重新出计划**(不是拿旧清单动手):刚刚又被写过的条目会掉出计划并报出来 - **面板**:移动后变绿的总结(移了几项、共多少、「接下来重启 DSH 用一会儿」)、**「撤销」按钮**、 以及回收站里**其他批次**各自的撤销入口;最后写着「确认没问题后自己清空那个文件夹——插件不会替你删」 - **本机实测(真的移动过一次)**:6 个临时目录、3833.3 KB → 移进回收站后逐条一一对应、 0 失败 → 撤销后 6 项全部移回、受监视区域**逐字节一致**(指纹相等),清单状态变 `undone` - 测试 **175 项全过**(locate 18 / scan 54 / plugin 40 / client 63), 其中 8 项专测移动与撤销(含手改清单、原位置被占用、批次名非法、空计划不创建文件夹) **必须向用户说明的技术真相** 「移走 → 重启 → 还能跑就说明安全」这个验证仪式**只对 🟢 档有意义**。 对「安装的插件」(🟠)来说,移走后重启**必然失败**——那是预期结果,不是"不安全"的证据。所以该档不参与清理。 **pnpm 硬链接陷阱(现已实测,不再是推测)** `pnpm-store` 的 112 MB 里有 **109 MB 与①区插件 node_modules 是同一批物理文件(硬链接)**, 面板现在会把这句写出来。所以: - **删掉 `node_modules` 可能几乎不释放磁盘空间**,必须 `pnpm store prune` 或两边一起清 - 预演里就要说明这一点,**不能把「移动 node_modules」宣传成「省了 109 MB」** - 🟢 档里**没有**硬链接内容,所以这份清单移动多少就是真省多少 **风险提示**:这是本项目唯一会**改动用户文件**的功能。实现时必须全程可回滚,且默认关闭。 **pnpm 硬链接陷阱(现已实测,不再是推测)** `pnpm-store` 的 112 MB 里有 **109 MB 与①区插件 node_modules 是同一批物理文件(硬链接)**, 面板现在会把这句写出来。所以: - **删掉 `node_modules` 可能几乎不释放磁盘空间**,必须 `pnpm store prune` 或两边一起清 - 预演里就要说明这一点,**不能把「移动 node_modules」宣传成「省了 109 MB」** **风险提示**:这是本项目唯一会**改动用户文件**的功能。实现时必须全程可回滚,且默认关闭。 --- ### 3. 面板「总览」视图的细节 —— ✅ 结案(用户 2026-10-07 确认) - ✅ 已加分类饼图(在横条图上方) - ✅ 明细行不再显示截断路径,改为可读名字 - ✅ 每行加「复制」按钮(复制**完整真实路径**) - ✅ 每行加「打开」按钮(见上面第 1 项,已做完) - ✅ **「各类占用还是截断的」这条修复,用户已确认可以**(不需要再展开全文了) - ✅ 用户 2026-10-07 明确说「完整路径的问题不是解决了吗,已经可以直接复制和打开文件位置了」—— 所以**不再需要**单独的「查看完整路径」入口:**复制拿到完整路径、打开跳到文件位置,两件事都做到了** ### 4. 报告里的隐私处理 —— ✅ 用户已确认接受(2026-10-07) - ✅ 工具输出、Markdown 报告文件、JSON 报告文件:`C:\Users\<名字>` 已替换为 `~` - ✅ **面板路由不脱敏**(`redact: false`):因为用户要复制真实路径。 这是有意的取舍:**面板 = 用户自己的屏幕**,日志/报告 = 可能被分享出去。 - ✅ 用户 2026-10-07 明确说「不脱敏也可以实施」,这条结案 --- ## ✅ 已完成(备查) | 内容 | 状态 | |---|---| | 常驻右侧栏面板(横条图、展开明细、重新统计) | ✅ 用户已确认能看到 | | 宿主只读路由取数 | ✅ | | 5 个设置字段改通俗中文/英文 + 技术项折叠 | ✅ → 已扩到 8 个 | | `USAGE.md` 面向普通人(含给别人安装的三种方式) | ✅ | | 「可以安全清理」的口径修正(113 MB 是错的,真安全的是 4 MB) | ✅ | | 三个互不重叠、相加等于总数的桶(safe/care/keep) | ✅ 有断言(现在只对①区) | | 「其他 347 MB」查明 = `~/.dsh/electron`,独立成类 | ✅ 现已正名为「Electron 运行文件」 | | 每类安全等级(🟢🟠⚪)+ 彩色圆点 | ✅ | | 饼图 + 三个视图(总览 / 按插件 / 按聊天记录) | ✅ | | 插件名/聊天名提取(不再显示 `…/node_modules/…`) | ✅ | | 右上角 ⚙ + 三个外观开关(百分比 / 完整路径 / 紧凑) | ✅ | | 饼图只画前 8 片,其余折成「其他 N 项」可展开 | ✅ | | 敏感信息审计(无 token/密码/用户名泄露) | ✅ | | **三个区独立统计(数据 / 程序 / 系统缓存),永不相加** | ✅ 本次 | | **路径自动探测:`DSH_HOME` / 程序安装目录 / npm 全局安装 / 两个系统缓存** | ✅ 本次,有 18 项测试 | | **pnpm 硬链接重叠按 inode 实测并写明** | ✅ 本次(109 MB / 112 MB) | | **链接安装的插件单列(含 `dsh-disk-doctor` 自己),不计入总数** | ✅ 本次(第 5 项) | | **查出并计入第三份 DSH:npm 全局安装 254.8 MB** | ✅ 本次 | | **每行「打开」按钮 + 安全等级二次开关** | ✅ 本次(第 1 项) | | **图例行(按插件/按聊天记录/总览饼图)也有「打开」按钮** | ✅ 本次 | | **图例右上角「名称 / 完整路径」切换 + 图例全灰时写明原因** | ✅ 本次 | | **聊天记录显示真实 workspace 名称 + 会话短标**(`disk-doctor · 64875ca0`) | ✅ 本次 | | **两个权限做成开关按钮(绿色档默认开、谨慎档默认关)** | ✅ 本次,有 6 项测试 | | **颜色说明(🟢🟠⚪ 各是什么意思)写在面板和设置页** | ✅ 本次 | | **两个开关保存后立即生效(volatile 是活引用,不再等重启)** | ✅ 本次,有 2 项测试 | | **设置页 9 个字段全部可见** | ✅ 本次(原来只有 5 个) | | **清理第一步:预演(列清单、不动任何文件)+ 省空间引导** | ✅ 本次,有 11 项测试证明磁盘没被动过 | | **清理第二步:真的移动到回收站 + 清单 + 一键撤销** | ✅ 本次,**175 项里的 8 项专测它**,本机真机实测过一轮并逐字节还原 | | **永远不删除**:全包唯一改动文件系统的调用是 `renameSync`,且只允许出现在 `lib/cleanup.js` | ✅ 有源码审计测试钉住 | | **移动默认关闭**(`allowCleanup`)+ 两次点击确认 + 手改清单也搬不动文件 | ✅ 本次 | | **清理框写明「回收站 → 重启验证 → 一键撤销」的流程** | ✅ 本次 | | **面板不脱敏 + 完整路径(复制/打开)两条:用户已确认结案** | ✅ 本次 | | **发布前审计修复**:个人信息(真实用户名)、测试的环境依赖、路由的浏览器信任栅栏、客户端四处加固、文档口径与占位符 | ✅ 本次(细节见 `DESIGN.md` 变更表最后两行) | | 测试总数 | 177 项全过(locate 18 / scan 55 / plugin 41 / client 63),`npm test` 一条命令跑完 | --- ## 📌 用户可能还想知道的 - **第一版到此封版**:功能上该有的都有了(统计分区 + 面板 + 打开/复制 + 名称切换 + 预演 + 真的移动与撤销)。 剩下的都是收尾杂项,不影响使用 - **版本号保持 `0.1.0`**:用户 2026-10-07 决定先不动(功能已经能移动文件了,但等整体验完再谈版本号) - **收尾杂项**:`repository.url` 里那个假地址占位已按用户决定**整个删掉**(npm 上该字段可选,等真有仓库地址再加); 首次 git 提交缺 `user.name`/`user.email`——用户自己写进全局 git。 仓库根目录的 `.scan-sample.mjs` / `.scan-sample-out.txt` 已经不存在了 - **按聊天记录分**:已实现(饼图),数据来自宿主已列出的会话明细 - **限制**:饼图画的是宿主列出的 **Top 15**,不是全部。装了很多插件时只画最大的那些。 用户如果要求「画全」,需要调大宿主侧的条目上限(会增加扫描耗时) - **扫描耗时**:本机全量约 5~6 秒(三个区都扫,其中光 npm 全局安装那份就有 3.3 万个文件)。 目录遍历已改成并发,链接安装的测量也有上限(每个根最多 6 个、总共 24 个、3 秒、3 万文件), 所以不会因为某个链接指向一棵大树而卡住 - **数字都是「物理字节」**:唯一例外是③区写明的硬链接重叠,它是**并列说明**,不参与相减 - **发布**:`package.json` 里已经没有 `repository` 字段了(占位符删掉,不是填了个假的);首次 git 提交仍缺 `user.name`/`user.email` --- ### 5. 「按插件」里看不到我们自己的插件(dsh-disk-doctor)—— ✅ 已解决 **现象**:`按插件` 图例里没有 `dsh-disk-doctor`,用户问是不是少统计了。 **已查证的原因(有实证)** - 该插件是**链接安装**:`~/.dsh/profiles/desktop/node_modules/dsh-disk-doctor` 是一个 **Junction**,指向 `E:\disk-doctor\dsh-disk-doctor` - 它是该目录 24 个条目里**唯一的链接**(其余 23 个是真实目录,所以 `dsh-image-gen` 等能正常显示) - 扫描器**默认不跟随符号链接/junction**(这是防止重复计数与越界的既定规则),所以这一项被跳过 - 更根本的一点:它的真实字节在 `E:\disk-doctor\...`,**本来就在扫描根目录 `~/.dsh` 之外** **修法(已实现)** - 枚举插件时识别链接项,单独列出:**目标路径 + 目标处的真实大小**,标注「链接安装,不计入总数」 - 绝不加进任何区的数字,也绝不静默丢弃 - 实测输出:`dsh-disk-doctor → E:\disk-doctor\dsh-disk-doctor,375.8 KB` - 注意:`profiles/node_modules`(共享那份)里有 500 多个指向全局 npm 树的 junction, 所以链接测量有**每个根的上限**,免得这一堆把用户自己的插件挤出清单;本机现在总共列 7 条 --- ### 6. 【重要】扫描范围之外还有大量 DSH 占用 —— ✅ 已解决(本题就是本次的三分区改造) **用户原话** > 「那还有什么东西是在你这个路径之外会产生或存在的,这样的话你这个路径不会统计不完全吗」 **实测数据(2026-10-07,本机,改造后仍是这些数字)** | 位置 | 大小 | 现在统计吗 | |---|---|---| | `~/.dsh`(数据目录) | 736.1 MB | ✅ ①区 | | `E:\dsh1`(程序安装目录) | 1015.0 MB | ✅ ②区(自动探测) | | `%APPDATA%\npm\node_modules\@deepseek-ai\dsh`(npm 全局安装的 DSH) | 254.8 MB | ✅ ②区(自动探测,本次新查出) | | `%LOCALAPPDATA%\pnpm`(pnpm 内容仓库) | 112.0 MB | ✅ ③区(并写明 109 MB 与①区重叠) | | `%APPDATA%\@deepseek-ai\dsh-desktop`(Chromium 用户数据) | 13.9 MB | ✅ ③区 | | `E:\disk-doctor\dsh-disk-doctor`(链接安装的插件) | 0.39 MB | ✅ 单列,不计入 | 改造前:**只报 735 MB(≈39%),面板却写着「DSH 的数据占了 737 MB」**,很容易被理解成「DSH 一共占这么多」。 改造后:三个区各自独立、面板顶部大数字明确写「DSH 的数据占了」,不再暗示统计了整个 DSH。 按现在三区相加(736 + 1270 + 126 ≈ 2.1 GB)也只到「可相加口径」的量级,而③区那 109 MB 仍是重叠的,所以**依旧不提供总数**。 **仍然不做的事(有意为之)**:不追求一个「DSH 总共占多少」的大数字。 因为 pnpm 仓库与插件目录共享同一批物理文件,任何单一总数都会重复计算。宁可分成三块说清楚。