Skip to content

16 · 源码地图与阅读路线

这是一张导航图,不是文件清单。请选择一个问题,从入口追到副作用或输出,再回头看测试。

按能力定位

想理解的能力首读继续追踪测试/证据
命令路由molelib/core/commands.shtests/cli.bats
删除安全lib/core/file_ops.shapp_protection*.shsudo.shtests/core_safe_functions.bats
Cleanbin/clean.shlib/clean/*.shtests/clean*.bats
Uninstallbin/uninstall.shlib/uninstall/batch.shbrew.shtests/uninstall*.bats
Purgebin/purge.shlib/clean/project.shtests/purge*.bats
Optimizebin/optimize.shcatalog.shoutcomes.shtasks.shtests/optimize*.bats
Analyzecmd/analyze/main.gomodel.goscanner.godelete.gocmd/analyze/*_test.go
Statuscmd/status/main.gometrics*.goprocess_watch.goview.gocmd/status/*_test.go
安装更新install.shlib/manage/update.shinstaller/update Bats
发布.github/workflows/release.ymlMakefile、minos checkrelease assets + attestation

路线 A:审查一次删除

  1. 从具体命令找到候选如何生成。
  2. should_protect_path、白名单与运行状态判断。
  3. mole_delete 的调用参数,确认 mode 来源。
  4. 进入 safe_remove / safe_sudo_remove,检查副作用前复检。
  5. 回到 log_operation 与 deletion log,确认结果如何记录。
  6. 查 Bats 中对应危险路径、symlink、祖先权限与 dry-run 用例。

不要在“上层已经过滤”处停止。安全审查的终点是最后一个 rm、rename、Trash 或系统命令。

路线 B:新增一个 Clean 目标

  1. 选择已有 lib/clean 生态模块,不在 bin/clean.sh 堆清单。
  2. 明确目标是缓存叶、容器根还是用户数据。
  3. 添加运行中应用 guard 与必要超时。
  4. 让候选进入 safe_clean,不要直接 rm
  5. 验证父子去重、大小与 dry-run 汇总。
  6. 为保护/白名单/缺失路径/活跃进程编写测试。

路线 C:新增 Optimize 任务

  1. 在 catalog 注册唯一 action 与 handler。
  2. 证明任务适合自动执行,写清描述与白名单名称。
  3. handler 检测前提:sudo、应用状态、电源、网络能力。
  4. 所有返回分支设置一个且仅一个 outcome。
  5. Dry run 不产生副作用,但应报告 would-apply。
  6. 验证总 outcome 数与目录一致。

路线 D:调试 Go TUI

先区分四层:采集/扫描产生数据,cache 决定鲜度,update 消费消息改变 model,view 只渲染。UI 错位优先检查 path identity 与排序;数字不准优先检查采集与缓存覆盖;卡顿优先检查 limiter、外部命令超时和 full/fast 频率。

顶层关键文件

完成一轮源码阅读的标准

如果你能准确回答以下问题,就已经越过“浏览文件名”的阶段:

  • 哪个函数最终产生副作用,它在最后一刻重查了什么?
  • 哪些信息是缓存的,缓存陈旧时 UI/命令如何表现?
  • 用户授权的作用域是什么,是否会意外放宽系统保护?
  • 一项操作没有发生时,系统能否区分无需改变、跳过、不可用和失败?
  • 发布物的 checksum 从哪里来,安装器如何把它锚定到构建身份?

至此,全书从 CLI 输入走到了源码贡献与审查路径。建议回到最感兴趣的命令,沿本章路线对照固定提交实读一次。

独立源码研究笔记 · 非 Mole 官方文档