临时 Worktree 清理规则
了解 30 天扫描、忽略文件保护、构建产物豁免及排障。
每次 CLI 启动会检查崩溃等留下的临时 agent worktree。清理采用保守条件,但不是所有 git-ignored 文件都被永久保留。
成为候选的条件
只有 slug 恰好为 agent-<7hex> 且目录 mtime 超过 30 天才考虑。普通命名 worktree 不扫描;用户手工命名成同样形状也无法区分,因此不应给需要长期保留的工作使用该模式。
读取 Git 状态出错、存在未提交内容或存在不可从远端到达的提交时跳过。这里的 stale sweep 提交判定与显式 remove 的“其他本地/远端引用”条件不同,不应混为一条。
未提交与忽略文件
扫描使用带 --untracked-files=normal --ignored=matching 的 status,普通 .env、.qwen/pr-drafts 等被忽略内容也能保住 checkout。
以下内容可被视为可丢弃:
- 根层第一段是 node_modules、dist、coverage 的 ignored 条目,包括其中单独列出的文件。
- 更深层同名 ignored 目录,只有 Git 把条目折叠到该目录自身时才豁免;规则仅匹配其内部内容而逐项列出时,不等价。
- symlink 本身,删除只解除链接;折叠目录必须非空且全部成员都是链接,旁边有真实文件或空目录会保留。
- daemon 的 .qwen-session 标记,只有 untracked/ignored 时豁免;tracked 标记的修改仍当作工作保留。
因此 root dist/archive.zip 即使有需要的产物也可能随候选清理;而 untracked 的 ?? dist/ 不享受 ignored 豁免。嵌套名为 coverage 的普通文件也不是构建目录豁免。
Git 因特殊字符而引用的路径不继续解析,按有工作保留。
排障
先用 git worktree list 检查真实 checkout,再核对分支、目录内容和会话所有权。调试日志中的 cleanupStaleAgentWorktrees: keeping 说明为什么保留,worktreeHasWork: waiving 说明哪些条目触发了豁免。
不要因为目录超过 30 天就假定应删除;mtime 条件只是候选入口,后续内容与提交检查仍必须通过。显式移除见生命周期。