Skip to content
twoerPublic

About

本机资产清点台账:看清机器上堆了什么——Git 仓库、工具链缓存、编辑器与 AI 工具数据一屏看尽,可回收空间单独记账,清理走废纸篓可恢复。Tauri 2 + Vue 3 双平台桌面看板,本地运行,不监听端口、不接触凭据。

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

Stacktake

本机资产清点台账——看看开发机上到底堆了什么,哪些能安全清掉。

它解决什么问题

开发机的盘不是被一个大文件吃满的,是被几百个「不敢动」的目录慢慢吃满的:

  • 构建产物:node_modules / target 散在两三百个仓库里,删掉可再生,但没人记得哪些项目还热着;
  • 包管理器缓存以十 GB 计,有的有官方清理命令、有的整个搬走也安全,你分不清哪个是哪个;
  • 停更的旧版本:版本管理器里装了一排 Node / Python,最旧的还在吃盘——可哪个版本还有项目在用?
  • AI 编码工具的日志与会话悄悄涨——日志删了没事,会话删了不会再生,而各家的目录名毫无共性;
  • 本地模型一个几 GB,是删了要重下几十 GB 的资产,不是缓存。

通用磁盘工具(DaisyDisk、系统设置的存储页)只回答「哪里大」,不回答「哪个能删」;CleanMyMac 一类清理工具敢替你删,也敢删坏开发环境。Stacktake 走中间:一台资产台账,把「什么占了地方」和「什么能安全删」分开报。它认识上面这些目录——知道哪些是可再生的产物、哪些有官方清理命令、哪些删了不会再生——所以每行的「可回收 / 可清理」有判据,删不删、删哪些,你自己决定。除三组(Git 仓库 / 工具链缓存 / 编辑器与 AI 工具)的清理入口外全程只读,清理只进废纸篓,可反悔。

总览:一行一个分组,体积 / 占比 / 可回收 / 条目数

工具链缓存:一行一个来源,含版本管理器的逐版本清单与每行的清理规则

它清点什么

下文所有体积与条目数是作者机器 2026-10-21 的一次扫描快照,用来说明界面上会看到什么,不是你机器上的预期值。界面与本文的「GB」都是 GiB(2³⁰)——同一份数据的读数比 Finder 的十进制 GB 小约 7%。这份快照是 4 组 / 340 条 / 149.3 GB,其中 23.2 GB 可回收。

  • 总览:打开即见全貌——一行一个分组(体积 / 可回收 / 条目数),点任意一行进入对应分组。它是现算的合成视图,不占扫描器、不进缓存。
  • Git 仓库(238 条 / 81.1 GB,其中 2.9 GB 构建产物可回收):哪个体积大、哪个久未动、哪个有提交没推,一行看全。带构建产物的仓库(node_modules / target 等,白名单 + 项目标记文件判定)标「有产物」并单独记账——产物是可再生的,清掉它们保住源码,往往比删整个仓库更高频;还能按目录勾选只清一部分。
  • 工具链缓存(35 条 / 36.7 GB,其中 9.5 GB 可清理):包管理器与语言运行时的缓存目录,加版本管理器的逐版本清单——不是一句「nvm 共 2.8 GB」,而是「9 个 Node 版本里 v22.19.0 一个占 1.7 GB,最旧的 v12.18.0 还占 0.08 GB」。
  • 编辑器与 AI 工具(59 条 / 22.8 GB,其中 10.8 GB 可清理):AI 工具的目录命名毫无共性——同一个东西 WorkBuddy 叫 logs,opencode 叫 log。所以不按工具建模,抽一层语义类别:日志、会话、缓存、技能、索引、配置、运行时、未知。分类决定可清理性,工具只作归属标签,筛「可清理」就能跨工具一次看全,不用记任何一家的目录名。编辑器那半同口径:扩展与已装工具不可回收,日志 / GPUCache / 索引缓存算可回收。
  • 本地模型(8 条 / 8.6 GB):Ollama / LM Studio / HuggingFace 三处的模型清单,一个模型占多少按它引用的权重 blob 计(共享层在各行各计一次)。
  • WSL 发行版(只在 Windows 上出现):每个 WSL2 发行版在宿主上就是一个 ext4.vhdx,读它的大小就知道这块盘被吃了多少。只读注册表与文件元数据,不执行任何 wsl 命令,也不进入发行版内部。

Java 环境与 iOS / Android / 鸿蒙的扫描器在仓库里但暂时不进侧栏;Docker 与 SSH 两组已实现但未注册。总览的总占用因此是有意报不满的。

隐私与安全边界

敢帮你删东西的工具,得先说清它不碰什么。这些是设计前提,不是免责声明:

  • 不接触任何凭据:不读私钥、不进 ~/.ssh;AI 工具目录只读文件名、不读任何文件内容——凭据压根不进入数据流,而不是「读出来再抹掉」。唯一的破例是 Ollama 的 manifest JSON(本地模型组):它是层清单,不含凭据,而不读它就无法知道一个模型引用哪些权重 blob。
  • 扫描走白名单,只在已知路径里扫,不 glob ~/.* 或整个 ~/Library/Caches。
  • 只揭示位置,不打开任何东西。「在访达中显示」与「复制路径」不写盘、不执行任何程序;刻意不做「打开」——打开一个路径会执行它(.app / .command / 安装包都会被跑起来)。也不代跑用户级命令:pnpm store prune 这类官方清理命令写在每行的「清理方式」里由你自己跑,「替你执行」这个口子不开。
  • 不监听端口,不是 HTTP 服务,没有跨域攻击面。这是选 Tauri 而不是 Web 的主要原因。
  • 清理是唯一的写盘动作,只开三组(Git 仓库 / 工具链缓存 / 编辑器与 AI 工具)。弹窗列明将移入废纸篓的路径与字节数,确认才执行;移入废纸篓而非硬删,可恢复;服务端不信任前端传来的条目 id,动手前回白名单重查一遍。会话含完整对话记录与代码片段,删除后不会自动重建,弹窗单独说明。其余分组仍然只读。

界面上的数字怎么读

这几条不是实现细节,是界面上每个数字的含义:

  • 体积是占用空间,不是逻辑大小。删掉一个目录实际能回收的正好是占用空间:APFS/HFS+ 上压缩、副本(clone)、稀疏文件都会让逻辑大小显著偏离实际占用,用逻辑大小会把「可回收」报虚。Unix 上与 du 同源;同一趟遍历内硬链接按 (dev, inode) 去重,跨条目共享的硬链接各算各的,所以行加总可能大于全局唯一字节数。
  • 「可清理」= 点下去真能删掉,不是「删了按需重下」。所以有官方清理命令的缓存(npm / pnpm / uv / pip / Homebrew / Go / Deno / NuGet / Composer 等)一概不标可清理,命令写在每行的「清理方式」里由你自己跑——pnpm store prune 只删没被引用的包,比搬走整个目录精确得多。代价是这几组的可回收数字明显小于目录实际占用。
  • 版本管理器逐版本成行,且一律不可回收。合成一行只会得到一句「2.8 GB」,真正有用的是「9 个 Node 版本里 v22.19.0 一个占 1.7 GB,最旧的 v12.18.0 还占 0.08 GB」。能不能卸取决于哪些项目在用它,本工具不读项目文件,报一个数会让人照着删掉还在用的版本。想知道哪个版本能卸,用各家自己的 uninstall 命令(写在每行的「说明」里)。
  • 模型是资产不是缓存。删一个要重新下载几十 GB,所以本地模型组永不标可回收,台账价值在「装了哪些模型、各占多少」。一个模型占多少按它引用的权重 blob 计(共享层在各行各计一次),不是文件大小直接加。

体积统计与本地模型记账的完整口径(硬链接去重范围、60 秒超时、manifest 明细)见 docs/known-limits.md。

装

从 Releases 下载最新版(macOS arm64 DMG / Windows x64 exe);也可以从源码构建:

npm install
npm run tauri build

产物在 src-tauri/target/release/bundle/。

macOS 首次打开:产物是 ad-hoc 签名(代码签名与资源封存有效,但没有 Apple 公证),浏览器下载后 Gatekeeper 会拦一次,提示「Apple 无法检查其是否包含恶意软件」。绕过任选其一:系统设置 → 隐私与安全性里点「仍要打开」(被拦一次后出现);访达里右键 → 打开;或对 DMG 执行一次 xattr -cr <文件> 再重新挂载。v0.1.3 及更早版本的产物签名无效,会提示「已损坏」且没有任何绕过入口——该问题已自 v0.1.4 修复,请用最新版。应用内更新(设置页里检查并下载)不走浏览器隔离,不受此影响;它下完会自动打开安装包并退出本程序。手动拖拽覆盖旧版时先退出 Stacktake——运行中的 .app 替换不掉,访达会报「正在使用中」(Windows 的 NSIS 安装器会替用户杀掉运行中的进程,DMG 拖拽是纯文件操作,没有这层能力)。

扫描策略

默认吃缓存,启动时不扫描。 有缓存直接返回,窗口毫秒级有内容,不做任何后台扫描;只有无缓存(首次运行)才真扫;之后只有点「重扫」才更新。早先的版本是「先出缓存 + 后台自动重扫」,刻意去掉了:数据变化极慢(本机两百多个仓库里近 7 天有提交的只有个位数),新扫的结果和缓存几乎一样,却让每次打开都在后台啃几十秒磁盘。代价是看到的可能是几天前的快照——页头一直显示「数据更新于 X 小时前」,要不要刷新交给人判断。「重扫」分两档:组视图里只重扫当前分组(秒级),总览里才是全量;清理完成后的自动刷新同样只扫被清理的那一组。因为各组刷新时刻不同,状态栏的「数据更新于」按当前视图取对应分组的扫描时间。

作者机器(4 组 / 340 条)全量扫描实测 28.8 秒(debug 构建的 cargo run --example dump,2026-10-20;release 更快)。瓶颈全在目录体积统计——用原生遍历(scan/dirsize.rs),不 shell 出 du。两个体积统计密集的分组并行跑只能收回一部分时间(并发会在 APFS 元数据层互相排队),所以「每加一个重分组,重扫就变慢」没有并行能兜底。

已知限制

  • 体积统计走原生遍历,是全量扫描唯一的瓶颈。个别超大目录会触发真超时(60 秒,每层递归都查截止),该条目体积显示为 —。
  • AI 工具的分类靠目录名匹配,覆盖率约六成。未识别的一律归入「未知」且不开放清理,所以漏识别的代价只是少显示一块可回收空间,不会误删。
  • 嵌套仓库的父仓库体积已扣除子仓库,但父子关系用 Path::starts_with 判断,跨盘的嵌套不会被识别。
  • 「Git 仓库」默认扫描六个常见位置(~/Documents/Code、~/Projects、~/Developer、~/code、~/src、~/workspace)。代码在其它盘或目录时,可从仓库空状态点「补充目录」,或在设置「Git 仓库扫描目录」添加;默认位置只读,移除补充目录不会删除文件;与已有范围重叠的目录(同一处或互为父子)会被拒绝,不静默改列表。其它分组不识别环境变量改过的位置。
  • 工具链缓存与 AI 工具都走白名单,LarkShell、微信开发者工具这类应用缓存不在内。加新来源前先确认删除后果。
  • Windows 上不做硬链接去重,file_index 未稳定:那里的体积数字只虚不高,不会显示成错的数。
  • WSL 的体积不等于发行版里实际用了多少,而且只涨不缩:发行版里删文件只在虚拟盘内部留空洞,Windows 侧尺寸纹丝不动,要还空间得三步(sudo fstrim -av → wsl --shutdown → Optimize-VHD -Mode Full),步骤写在界面里,本工具一条都不做。WSL1 没有虚拟磁盘,体积显示为「—」。位置与体积的读取没在 Windows 实机上跑过(开发机是 macOS)。
  • 上面这些数字是本机一次快照,不是承诺。重扫之后数字会变,量级不变——要看当前值就 cargo run --example dump 跑一次。

开发

npm install
npm run tauri dev

验证分三档,改什么就跑什么,红不往下走:npm run verify:quick(内环:fmt + clippy + 类型检查 + 前端单测 + 文档门禁,秒级,改完就跑)→ npm run verify(外环:内环 + 测试 + 构建,提交前)→ npm run verify:full(评估档:外环 + 全量扫描契约校验)。导出扫描结果为 JSON 供人工核对:cd src-tauri && cargo run --example dump;跑测试(只读本机真实数据,不做任何写入):cd src-tauri && cargo test。

Rust 1.93 / edition 2024 / Tauri 2 / Vue 3 / Tailwind v4;src-tauri/.cargo/config.toml 的 rsproxy 镜像源必须提交(国内直连 crates.io 会超时)。数据契约、扫描器注册方式与前端约束见 AGENTS.md。

About

本机资产清点台账:看清机器上堆了什么——Git 仓库、工具链缓存、编辑器与 AI 工具数据一屏看尽,可回收空间单独记账,清理走废纸篓可恢复。Tauri 2 + Vue 3 双平台桌面看板,本地运行,不监听端口、不接触凭据。

Resources

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages