SuperAPI AI 工具集

cleanup-repo

编程与开发

查看项目

更新于 10-16 02:00

技能介绍

cleanup-repo 是一项智能体技能,用于清理 Git 仓库中的已合并工作树与分支,并执行一次文件系统卫生整理。两轮清理各自拥有独立的确认闸门,并提供 --dry-run 预览模式。分支/工作树这一轮复刻了其来源 /cleanup-branches 斜杠命令的行为;文件系统卫生这一轮(递归空目录与无主 node_modules)是本技能新增的内容。

配置

与本文件同目录的 config.json 中包含五个配置项,运行开始时读取并在整个过程中使用:

  • linearTeamName:备用 Linear 团队名称,仅在某 issue 的 get_issue 结果不携带团队时使用,默认 "Rheged Studio"。应使用名称而非 key,因为 key 会随时间变化而名称稳定。
  • issueKeys:可能作为分支名前缀的团队 key 前缀(例如 ["R"]),分支 issue ID 正则基于此构建。
  • mainBranch:分支要被计入“已合并”所需合并到的干线分支,两轮都以 origin/<mainBranch> 为比对基准,默认 "main"。
  • protectedBranches:永不删除的分支(本地与远程),默认 ["main"]。
  • linearWritebackDefault:第 10 步 Linear Done 回写提示的默认选项种子,"yes" 预填 yes,"no" 预填 no。交互闸门始终保留,不会自动应用。缺失或无法识别时按 "no" 处理。

分支的 issue 仅取其前导的 <KEY>-<n> 令牌。构建锚定正则需确定性地转义每个 key 的正则元字符,当存在多个 key 时用 (?:…) 包裹,例如 ^(?:C|R)-\d+\b,绝不使用朴素拼接 ^C|R-\d+\b。单个 key 无需包裹:^R-\d+\b。未配置 key 时匹配为空。对分支名大写后匹配一次,以避免 slug 令牌被误判为 issue。

若 Linear MCP 服务器不可用,静默跳过 Linear 状态检查与可选的 Done 回写,它们并非分支清理所必需。

使用方式

  • 试运行:cleanup-repo --dry-run,预览全部内容,不做任何更改。
  • 正常模式:cleanup-repo,先预览,确认后再删除。
  • 范围标志(互斥):cleanup-repo --branches-only 仅运行分支/工作树一轮;cleanup-repo --fs-only 仅运行文件系统一轮。

这些是技能调用而非独立 CLI:cleanup-repo 是技能,标志通过 $ARGUMENTS 传递(由智能体读取),因此在 shell 中直接执行 cleanup-repo --dry-run 不会产生任何效果。

两轮分别确认,因为影响范围不同:分支清理可恢复(reflog、重新推送、PR 仍在),无主 node_modules 可重装,但被扫除的空目录树可能是原本想保留的,因此可以接受一轮而拒绝另一轮。--dry-run 在任何确认之前短路;--branches-only / --fs-only 完全舍弃另一轮(及其预览与提示)。

流程

Step 1:从远程获取最新内容 git fetch --prune origin。

Step 2:识别待移除的工作树。运行 git worktree list,列出除主仓库目录外的所有工作树;识别已完全合并进干线的工作树、处于分离 HEAD 状态的工作树(视为废弃,可安全移除)、以及有未提交更改的工作树(单独呈现于 Step 6,绝不自动移除)。

Step 3:识别已合并分支(两趟)。第一趟用 git branch --merged origin/<mainBranch> 查找已合并的本地分支并排除受保护分支;第二趟对未被捕获的分支使用 gh pr list --head <branch> --base <mainBranch> --state merged 检测 squash 合并,并用 git rev-parse 对比本地 tip 与该 PR 的 headRefOid,相等才纳入清理列表,不等则列入“跳过的——本地 tip 领先于已合并 PR”。

Step 4:对已合并且以 issue ID 开头的分支检查 Linear issue 状态,记录团队名,追踪状态类型非 completed/canceled 的 issue。

Step 5:运行自带的文件系统卫生检测脚本:node scripts/filesystem-hygiene.mjs <repo-root> --json,输出空目录与无主 node_modules 候选列表(只读,不带 --apply)。

Step 6:显示所有待删除项,分组计数展示工作树、本地分支、远程分支、Linear issue 与文件系统条目。

Step 7:若设置了 --dry-run,在此停止并打印 DRY RUN MODE - No changes were made。

Step 8:正常模式下分别确认两轮——分支/工作树一轮、文件系统一轮。

Step 9:按顺序执行——先移除工作树(git worktree remove <path>),再 git worktree prune,然后删除本地分支(git branch -d 用于 git-merged,git branch -D 仅用于 tip 匹配的 squash-merged 分支),删除远程分支(git push origin --delete <branch>),最后以 --apply 重跑文件系统脚本。

Step 10:可选的 Linear Done 回写,通过 mcp__linear-server__list_issue_statuses 解析各团队的 Done 状态 ID 并调用 mcp__linear-server__save_issue 更新。

Step 11:汇总报告各计数与已删除项名称。

重要规则

试运行可预览而不删除;任何删除前必须确认;受保护分支永不触碰;仅删除已合并进干线的分支,squash 合并分支仅在其本地 tip 仍匹配已合并 PR 的 head 时才强制删除;先工作树后分支,文件系统一轮最后;有未提交更改的工作树绝不自动强制移除;.git/ 与主工作树永不触碰。

错误处理

任何移除失败的工作树或分支都跳过并报告,继续处理其余项;远程分支同理。

(注:输入资料中关于收费、价格、平台、具体效果等信息暂未提供。)