Changelog
- mo clean: GUI app dotdirs with a matching
.appbundle or Homebrew cask are no longer flagged as orphans. - mo clean: UTM virtualization cache cleanup (skipped while UTM is running) and Lima download cache cleanup.
- mo clean:
--dry-runand real clean now agree on which orphaned system services are protected; dry-run no longer reports files it would actually skip. - mo clean:
simctlprobe timeout raised from 2s to 5s with one 8s retry, fixing the "simctl not available" warning on cold boot. - mo clean: Gradle DSL caches are preserved to keep build integrity; dry-run size output is colorized by unit.
- mo purge: Scan timeouts, spinner lifecycle, and trap handlers hardened to prevent hangs on slow filesystems.
- mo touchid: PAM file writes now use atomic
install -m 444 -o root -g wheelinstead ofmv, so/etc/pam.d/sudoalways keeps root ownership and read-only permissions after enable or disable. - Uninstall safety: Bundle ID matching switched from glob patterns to boundary-aware comparison, preventing
com.examplefrom accidentally hittingcom.example123.defaults deletenow rejects malformed bundle IDs before execution.
更新日志
- mo clean:有对应
.app或 Homebrew cask 的 GUI app dotdir 不再被误标为孤儿。 - mo clean:新增 UTM 虚拟化缓存清理(UTM 运行中自动跳过)和 Lima 下载缓存清理。
- mo clean:
--dry-run与实际清理对 protected 孤儿系统服务的判断一致,dry-run 不再虚报。 - mo clean:
simctl探测超时从 2s 提升到 5s 并加一次 8s 重试,修复重启后首次运行报 "simctl not available" 的问题。 - mo clean:Gradle DSL 缓存不再被误清理,保留构建完整性;dry-run 输出大小按 GB/MB/KB 着色。
- mo purge:扫描超时保护、spinner 生命周期、trap 处理加固,避免慢文件系统下卡住。
- mo touchid:PAM 文件写入改用原子操作
install -m 444 -o root -g wheel,enable 或 disable 后/etc/pam.d/sudo始终保持 root 所有和只读权限。 - 卸载安全:bundle ID 匹配从 glob 通配升级为边界校验,
com.example不再误命中com.example123;defaults delete执行前校验 bundle ID 格式,拒绝畸形输入。
Mole Mac App
Prefer a GUI? I recently launched Mole Mac App. The CLI stays free and open source, and the Mac app is $9 lifetime with code MOLEMAC for 20% off through May 23.
Thanks 💖
Issue reporters and PR contributors this cycle: @xronocode · @OWConnoi · @TyceHerrman. Security hardening of mo touchid prompted by a responsible disclosure from an independent researcher.