Cleanup 是一个用于清理项目磁盘空间的技能,目标是删除项目中不再被使用的 git worktree 和 Next.js 缓存文件夹,同时保留每个仍被会话或进程使用的 worktree 与缓存。
用途 清理项目中的 git worktree 和 Next.js 缓存文件夹以释放磁盘空间。pstack 的 Worktree 与模拟器清理 playbook 是方法基础,当两者不一致时以本技能为准。自行删除 worktree 时只使用 git worktree remove --force,绝不使用 rm -rf 或 git worktree prune。
主要能力 本技能在扫描判定中加入:运行时的会话列表和正在运行的进程决定哪些 worktree 在使用;变更已被项目 checkout 持有的 worktree 视为干净;Next.js 缓存文件夹纳入清理列表;Autopilot 规则允许安全集合无需询问即被删除。文件旁的 scripts/scan.mjs 负责做出每个判定,因此重复运行会得到相同结果。其 --landed <worktree> 模式对单个 worktree 运行相同的内容检查,card 会话在自己删除前会先运行它。
使用方式
- /cleanup scan 只列出、不删除任何内容。
- /cleanup 删除安全集合。
流程:
- 记录 df -h /。
- 用运行时的会话工具列出每个会话(含已归档),例如 Claude Code desktop 的 list_sessions,带 include_archived 且 limit 大于会话数量。把其 JSON 数组保存到运行目录。没有会话列表时任何 worktree 都不能判定为安全,所以没有会话工具的运行时只删除缓存。
- 从项目 checkout 运行 node <this skill>/scripts/scan.mjs --repo . --sessions <that file>(后台运行,因为它会用 du 测量每个文件夹)。它按 worktree 和缓存文件夹逐行输出 SAFE、ASK 或 KEEP 及其大小和原因,以及各自的数量和大小。
KEEP 的 worktree 情形:git 将其列为 locked;扫描正在其中运行;某个运行中的进程(如会话、shell 或开发服务器)在其中工作;某个未归档会话声明它;它在最近一天内变更且无会话声明;或某个服务器持有其中的缓存。lsof 无法回答时扫描也会保留它。
SAFE 的 worktree 情形:某个已归档会话曾拥有它;它位于 agent 创建 worktree 的位置;其中每项变更都已提交到分支或已在 checkout 中。仅当 checkout 持有同名(含大小写)且逐字节匹配的文件时,变更文件才算在 checkout 中。该文件不得通过符号链接文件夹等方式解析回该 worktree。被忽略的文件若可由安装或构建重新生成(如 node_modules、.next 文件夹、package.json 旁的 dist 或 build 文件夹),则无需副本;其他被忽略文件需要这样的副本,包括证明文件夹和测试报告。agent 在应用的 .claude/worktrees、临时或 scratch 文件夹以及运行目录中创建 worktree。
ASK 的 worktree 情形:无会话声明它;它位于上述文件夹之外;另一个 worktree 位于其中;它包含子模块或嵌套仓库;暂存版本与其文件不同;checkout 缺少它的某项变更或被忽略文件;其提交不在任何分支上;或 git 在其文件夹已被删除后仍列出它。
缓存的 KEEP 情形:某个运行中的服务器持有其 dev/lock 或 lock;它是构建输出(.next 或 .next-plite);或最近一小时内有人写入。生产构建(含 BUILD_ID)和某端口的 dev 缓存(.next-<port>)在最后使用后也保留一周。否则为 SAFE。位于安全 worktree 内的缓存随该 worktree 一起处理。
对于 /cleanup scan,报告表格后停止。否则按第 2 步再次保存会话列表,然后用 --delete 和新文件运行相同命令。它会测量每个安全项、再次判定,并在删除前再次列出运行中的进程,因此若扫描期间有进程开始在其中工作或服务器占用了它,该文件夹会被保留。桌面会话被重新打开但文件夹中尚无进程,是它唯一无法察觉的情况。它用 git worktree remove --force 删除 worktree,删除失败会把该行变为 ASK。绝不运行 git worktree prune 或 git stash。
向所有者列出每个 ASK 行的路径、大小、原因和会话标题。仅删除所有者指定的项,使用 git worktree remove --force <path>。所有者保留的每个用 git worktree lock --reason "<why>" <path> 锁定,以便后续扫描和会话启动提示跳过它。
再次记录 df -h /,并根据两次 df 读数报告释放的空间,因为 du 会把包存储共享的硬链接在每个文件夹中重复计数。然后报告删除了什么,以及每个保留或询问的行及其原因。
适用场景 在每个需要清理 worktree 或缓存的项目的 checkout 中运行一次。card 会话在其补丁落地时已按 chips 的 Landing 规则删除自己的 worktree,因此扫描大多会发现该规则之前遗留的 worktree、某次运行留下的证明 worktree 以及 dev 缓存。
限制 没有会话工具的运行时只能删除缓存。桌面会话重新打开但文件夹中尚无进程时无法被检测。