关于 cleanup-merged-branches
用于清理已合并 PR 对应的远程分支,并回收废弃的进行中 Issue 标记。操作先执行预览,任何更改都必须经过明确确认。
主要功能
- 01预览待删分支
- 02检查合并状态与保护规则
- 03回收过期的进行中标记
- 04检查关联的开放 PR
- 05查找合并后仍开放的 Issue
适用场景
- 01删除前审查候选分支
- 02将废弃任务放回待处理队列
- 03查找已合并但 Issue 仍开放的工作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ timschoch/ skilly --skill cleanup-merged-branches安装后在 Claude Code 中输入/cleanup-merged-branches确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/plan.shstale-claims.shstale-claims.test.sh详细介绍
删除属于已合并 PR 的远程分支。此操作具有破坏性,因此首先以 dry-run 模式运行,未经明确确认绝不删除。
删除规则
只有在所有条件都满足时,分支才可删除——规则写在 scripts/plan.sh 中,它是唯一事实来源:
- 分支仍存在于远程仓库,
- 分支有已合并的 PR,
- 分支没有未关闭的 PR,
- 分支不受保护。
受保护 = 默认分支 + staging。即使有已合并的 PR 指向这些分支,也绝不删除。没有 PR,或只有已关闭但未合并的 PR 的分支,不可删除(它从未“属于已合并的 PR”)。只在 scripts/plan.sh 中的 is_protected() 里扩展受保护分支列表,别处不要改。
步骤
- Dry-run。 运行
bash scripts/plan.sh(如果远程名称不是origin,则将远程名称作为$1传入)。它会以<branch> #<pr> <title>的格式列出可删除的分支,不会删除任何内容。得到列表后即完成。输出为空 → 报告“没有需要清理的内容”并停止。 - 展示并确认。 向用户展示完整列表,并征求明确同意。对含糊的回复不要执行删除——只有明确答复是才可以删除。每次运行都必须经过此确认关卡。
- 删除。 对每个已确认的分支运行:
git push origin --delete <branch>。不得删除计划列表以外的任何内容。 - 报告。 列出已删除的内容;注明任何推送失败的情况。
另外:过期声明(清理器)
释放已放弃的 in-progress 声明(Agent 崩溃/会话结束/从未创建 PR),以免失效声明永远将问题标记为“已被认领”。标签说明见 docs/agents/triage-labels.md;/implement 会设置此标签,PR 创建后会移除,清理器负责清除遗留标签。
过期规则。 只有在所有条件都满足时,in-progress 问题才算过期——规则写在 scripts/stale-claims.sh 中,它是唯一事实来源:
- 问题处于开启状态且带有
in-progress标签, - 问题没有关联的未关闭 PR(关联 = 未关闭 PR 的标题/正文中引用了
#N,或其 head 分支与声明评论中指定的分支相同),并且 in-progress标签的时间已超过阈值(以最新的labeled时间线事件为准):默认 24h,可通过$1/$STALE_CLAIM_HOURS覆盖。
步骤(与分支删除合并到同一次运行,并共用同一确认关卡):
- Dry-run。 运行
bash scripts/stale-claims.sh [hours]。它会以#<n> <title>的格式列出过期声明,不会更改任何内容。输出为空 → 无需清理。(逻辑验证:bash scripts/stale-claims.test.sh。) - 展示并确认。 展示列表;只有得到明确同意才执行清理。必须经过同一确认关卡。
- 清理。 对每个已确认的问题运行:
gh issue edit N --remove-label in-progress --add-label ready-for-agent(已放弃的工作会重新进入空闲队列)。不得触碰打印列表以外的任何内容。
另外:仍未关闭的问题
Closes #N 只有在 PR 合并到默认分支时才会自动关闭问题——合并到集成分支(例如 rebuild/v1)的 PR 会让 #N 永远保持开启状态。对于在此处清理的每个已合并 PR,请检查其关联问题:如果工作已进入默认分支,但问题仍处于开启状态,则手动关闭问题(gh issue close #N --reason completed --comment "merged via #<pr>")。同样的失误会让已“完成”的问题仍显示为开启状态——就在这里检查并处理。