Skip to content

Moo Fleet 0.2.0

Latest

Choose a tag to compare

@charsen charsen released this 30 Oct 13:39
· 6 commits to master since this release

Moo Fleet 0.2.0 —— 勾选的新文件可以整批删掉,工作区操作快了一倍

0.1.51 修的是弹窗被拖拽误关。这一版换了个方向:把工作区里最容易卡手的一件事补上,顺带把每次文件操作都要跑一遍的全量扫描砍掉。


一、勾选的新文件可以整批删除

临时生成的探针脚本、构建残留、调试用的假数据——这类文件被勾进暂存区之后,想整批丢掉,以前只能一个个取消暂存、再一个个删。

现在:勾选一批从未提交过的新文件后,分组标题栏出现「删除 N 个」。确认后取消暂存并把整批文件移入系统废纸篓,一个动作结束。

两个边界值得说明:

  • 判据是「未跟踪」或「索引状态为新增」,不是只看未跟踪。勾选本身就是 git add,勾完之后 untracked 就不再为真了——只看它会漏掉整整一类文件。这个判定放在 src/shared/file-status.ts,客户端和服务端共用同一份,不会出现两边判断不一致。
  • 勾选里混入已跟踪文件时,整批不给入口。 已跟踪文件的删除是「丢弃改动」的语义,和「删掉这个新文件」不是一回事,混在一起做容易出事。冲突文件由服务端整体拒绝,而且校验跑在任何写入之前——不会出现删了一半才发现有冲突。

服务端只回文件清单,废纸篓在四个平台上整批一次调用;只有整批失败时才逐个重试,用来定位到底是哪个文件挡住了。

二、工作区操作快了一倍

本机 20 仓合成舰队实测:

操作 0.1.51 0.2.0
暂存 46–64 ms 25 ms
取消暂存 37–39 ms 17 ms
文件列表 20 ms 10 ms
仪表盘 115 ms 95 ms(1.5 s 内的重复调用 0.7–1.3 ms)

做法是去掉重复劳动,没有引入缓存一致性的妥协:

  • 暂存、取消暂存、忽略、取消忽略、assume-unchanged 这六个接口里,每次都调用 scanRepository 做全量扫描,但调用方从不读它的返回值。删掉。(/hunks 和冲突解决确实在用 status,保留。)
  • 文件列表用 .git 存在性快检替代每请求一次的 git rev-parse --show-toplevel;只有 .git 缺失时才回退到 git,两种报错文案都保住了。
  • 仓库配置按 (mtime, size) 缓存解析结果并返回克隆,配置没变就不重复解析。
  • 判断仓库内部状态时直接读 .git(目录或 gitdir: 文件),每个仓库少起一个 git 进程。.git 文件里的路径可以含换行,所以只按前缀切一次、去掉结尾换行,不按行切。
  • 客户端五处文件动作改用 scheduleStageRefresh(),忙态不再被一次全量扫描拖住。

仪表盘的结果缓存键带 scanGeneration,任何写操作都会击穿缓存,不会读到过期数据。

三、这一版还包含(内部改动,不影响使用)

  • 构建脚本不会再覆盖已发布的 DMG。 以前同版本重建会先无条件删掉同名 DMG,等于把已经发出去的那份一起删了。现在先比对 release/Moo-Fleet-<ver>-artifacts.json 里的 sha256,一致(= 就是发出去的那一个)就先挪到 release/.published/ 留档,再照常清理。
  • 批量删除有了独立真机验收脚本(npm run verify:ui:batch,27 项断言),覆盖基线、两种视口宽度、混合选中反例、确认弹窗、取消,以及删除之后的五方对账(提示语 / 列表 / 磁盘 / 索引 / 系统废纸篓)。两处变异测试确认断言不是空转。
  • 修掉了真机套件里「Esc 关抽屉」长期失败的真因。 不是产品 bug——是套件自己在阶段 6 打开管理弹窗后忘了关,之后抽屉开在弹窗上面,而全局 Esc 从最上层往下关,每次都先去关那个看不见的弹窗。断言现在改成「必须由 Esc 关闭」,靠关闭按钮兜底算失败。

四、下载哪个

macOS:

芯片 文件 大小
Apple Silicon(M 系列) Moo-Fleet-0.2.0-macos-arm64.dmg 44.3 MiB
Intel Moo-Fleet-0.2.0-macos-x64.dmg 46.5 MiB

两个 DMG 都是 Developer ID 签名 + Apple 公证 + 票据已 staple:双击挂载、把 App 拖进「应用程序」、双击打开即可,不需要右键打开,也不需要 xattr 清除隔离属性。

Linux:

包 文件 大小
Debian / Ubuntu Moo-Fleet-0.2.0-linux-amd64.deb 95.1 MiB
通用(AppImage) Moo-Fleet-0.2.0-linux-x86_64.AppImage 94.5 MiB

Windows:

包 文件 大小 在哪
安装版(NSIS) Moo-Fleet-0.2.0-windows-x64-setup.exe 107.6 MiB 仅 GitHub
免安装 Moo-Fleet-0.2.0-windows-x64.exe 97.6 MiB GitHub

Windows 安装版超过了 Gitee 单文件 100 MiB 的上限,所以只在 GitHub 发布;Gitee 上放了 Linux 两件。

Windows 两件没有 Authenticode 签名,首次运行 SmartScreen 会提示「未知发布者」,点「更多信息 → 仍要运行」即可。这一点和之前的 Windows 包一致。

五、验证

  • npm run typecheck 通过(vue-tsc + 服务端 tsc)。
  • 单元测试 128 文件 / 1270 项全部通过(单 worker,发版口径)。
  • 真机 UI 断言 393 项全部通过,跑的是打包产物(release/macos-arm64/Moo Fleet.app 内嵌服务端,不是开发实例),控制台 0 error、0 未捕获异常。
  • 批量删除专项 27 项全部通过,并做过两次变异测试(去掉混合选中守卫 → 恰好 1 项失败;判定退回只看 untracked → 11 项连环失败),确认断言不是空转。
  • 两个 DMG:codesign --verify --deep --strict 通过,flags=0x10000(runtime),带安全时间戳(arm64 Oct 30, 2026 at 20:29:55、x64 Oct 30, 2026 at 20:36:11),stapler validate 与 hdiutil verify 均通过。
  • 包内 Info.plist:0.2.0 / build 200 / com.mooeen.fleet,两个架构一致。
  • Linux 两件:deb 的 Package / Version / Architecture 为 moo-fleet-desktop / 0.2.0 / amd64,ar 三段成员完整;AppImage 是 ELF 可执行 + AI\x02 魔数,SquashFS 从第 32,609 字节起(外壳在前)。
  • Windows 两件:PE 头(MZ + PE\0\0)正确,版本串 0.2.0 与产品名都在资源里;两件均未做 Authenticode 签名(与之前的 Windows 包一致)。

六、校验和

f80b4e29f29c9ec23253010ff0ad495685c912781f2c76184adb94595224a3df  Moo-Fleet-0.2.0-macos-arm64.dmg
f3cbb65dcbc19d4f402c6cf06e6607da0bc1cb9fb821ce7af876c61cf7a05650  Moo-Fleet-0.2.0-macos-x64.dmg
4a608a7130f7fce97db05794c7f7dfb9acd47d01c9ca8cf2d253364d606c4d60  Moo-Fleet-0.2.0-linux-amd64.deb
64084714d579b566ed6e9681e65223f650b7099276f0d4553bafe4cf3b9fd0ad  Moo-Fleet-0.2.0-linux-x86_64.AppImage
184fb2408c3cf502dc1a7d00d495d0bbf33eecb8d4d14ee6b811e73789300796  Moo-Fleet-0.2.0-windows-x64-setup.exe
7d1d4a0a02d374d569e81d5f35be7b46982b44fe5bd4eab2986bcf59b1b1c69d  Moo-Fleet-0.2.0-windows-x64.exe

七、没做的事

  • 没跑真实安装门禁(npm run test:mac-install-e2e)。它会退出 App、挂载镜像并操作 /Applications,需要单独授权。
  • 没做跨机 Gatekeeper 验收。 本机 Gatekeeper 是关的(assessments disabled),本地 spctl 通过只证明票据存在,不代表另一台干净机器上首次打开不会被拦。
  • Windows 两件未做 Authenticode 签名(需要 CSC_LINK 与 CSC_KEY_PASSWORD,当前未配置)。
  • Linux / Windows 包只做了包结构与版本校验,没有在真机 Linux / Windows 上跑过。