Worktrunk:并行工作树、生命周期控制与源码分析
读 Worktrunk 批准源码:--yes、持久化与保存失败
沿 approve_command_batch 和批准存储读取真实分支,区分本次允许执行、长期记住批准以及保存失败后的行为。
你将学会
- 从 approve_command_batch 进入,而不是只看提示语
- 持久化是第二个判断,也有独立失败状态
- 继续追踪存储与匹配,才能理解批准范围
开始前需要
- 基础 Git 分支和命令行导航知识
- 可用于选做练习的一次性仓库
解释工作树边界,核对首次检出结果,并在采用自动化前审阅配置命令。
先看结论
- 接受执行和保存批准是两种状态。
- 批量函数的 --yes 路径不持久化批准。
- 模板获批,不等于它调用的代码被固定或审计完毕。
从 approve_command_batch 进入,而不是只看提示语
src/commands/command_approval.rs 中的 approve_command_batch 接收候选命令、项目标识、批准记录和标志。除非调用方已经过滤,否则它会先寻找仍需批准的命令;没有剩余项时直接返回 true。否则,--yes 允许本次执行,或由交互提示决定;拒绝则返回 false。
这个布尔值本身不足以解释完整调用流程。钩子文档说明,拒绝会跳过本次操作的全部项目命令,包括原先已经批准的命令,但操作可以在没有这些命令的情况下继续,既有批准也不会因此被撤销。结合函数与文档,才能避免把拒绝误读成取消创建或永久撤销信任。
持久化是第二个判断,也有独立失败状态
接受以后,函数只在 yes 为 false 时保存批准。重新加载失败会向上返回错误,而之后的保存失败只给出警告,不撤销本次接受;不能把这两种失败混为一谈。还应区分未接受、只允许本次和接受并持久化。下次又出现提示,可能是保存失败,不一定代表命令刚刚发生变化。
这个结论仅针对该批量函数,不能推广到所有 --yes 参数;专门添加批准的命令属于另一条路径。随稿教学模型只验证简化的决策表,不执行上游 Rust,不复现配置匹配,也不证明真实终端集成正常。模型案例通过与上游程序通过测试是两种证据。
继续追踪存储与匹配,才能理解批准范围
src/config/approvals.rs 将 approvals.toml 与可携带配置分离。load_with_fallback 在批准文件存在时以它为准,仅在不存在时读取旧配置中的批准条目。已有文件损坏会报错,而不是悄悄恢复更旧的信任决定。修改路径还会获取配置锁、重新加载,再通过存储辅助函数保存。
is_command_approved 会规范化模板变量,并检查匹配的项目键。手工编写的模式键因此可能覆盖多个仓库,不能简化成“精确仓库名下的原始字符串相等”。保存模板也不会固定它调用的脚本内容。源码包含变量规范化和模式匹配测试,本系列读取了这些测试,但没有运行上游 Rust 测试套件。
如何选择
| 比较维度 | 方案 A | 方案 B |
|---|---|---|
| Best when | You need predictable behavior and easy auditing | You need adaptive optimization and have reliable telemetry |
| Main risk | May leave performance on the table | Can become difficult to explain or debug |
实施步骤
- 1
跟踪空列表、拒绝与接受三条分支。
- 2
找出单独控制持久化的条件。
- 3
查看存储回退和项目键匹配范围。
- 4
分开标注教学模型与上游运行测试。
可复制示例
// 独立教学模型,不是上游 Worktrunk 源码。
function decision({ needed, yes, accepted, loadOk, saveOk }) {
if (!needed) return { run: true, save: false, warning: false };
if (!yes && !accepted) return { run: false, save: false, warning: false };
if (!yes && !loadOk) throw new Error("reload failed");
return { run: true, save: !yes && saveOk, warning: !yes && !saveOk };
}常见问题
接受之后为什么还会再次询问?
可能是命令变化,也可能是保存失败;先检查警告和实际批准来源,不要直接推断原因。
清除一个精确项目条目就能清除全部批准吗?
不一定。手工设置的匹配模式条目仍可能为该仓库提供批准。
资料来源
- Worktrunk / src/commands/command_approval.rs来源核查 2026-09-14
- Worktrunk / src/config/approvals.rs来源核查 2026-09-14
- Worktrunk / docs/src/content/docs/hook.md来源核查 2026-09-14