关于 ship
ship 是用于将功能分支整合到目标分支的开发技能,可通过拉取请求或本地合并完成。它引导验证、合并方式选择、审查要求和工作树清理。
主要功能
- 01整合前运行验证
- 02根据 CI 状态选择 PR 或本地合并
- 03本地合并前要求代码审查
- 04整合后清理工作树
适用场景
- 01创建 PR 并启用自动合并
- 02CI 不可用时进行本地合并
- 03保留分支或经确认后丢弃
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ camacho/ ai-skills --skill ship安装后在 Claude Code 中输入/ship确认已加载。
详细介绍
发布
将分支合并到 main。有两种方式:PR(CI 正常)或本地合并(CI 不可用)。
宣布:“正在使用 /ship 集成此分支。”
前置条件
- 当前位于功能分支(而不是 main)。
/review(第 6 步)已通过,或用户已明确批准。- 已知工作树路径(清理时需要)。
- **没有待处理任务。**运行
TaskList(Claude Code),或检查.branch-context.md清单(Codex)。如果任何步骤仍为pending或in_progress,说明该步骤已跳过——返回并完成后再发布。
如果缺少任何前置条件,请说明缺少哪项并停止。
步骤 1:验证
pnpm validate
如果验证失败,请停止。先修复。
步骤 2:确定目标分支
按以下顺序确定(使用第一个成功的来源):
- 计划文件的 frontmatter — 如果存在计划文件,从
ai-workspace/plans/<name>.md中读取Target:字段。 - Reflog 父分支 — 分支的 reflog 会记录它从哪个分支创建:
TARGET=$( git -C <worktree> reflog show HEAD --pretty=format:'%gs' \ | grep "^branch: Created from" \ | head -1 \ | sed 's/branch: Created from //' \ | sed 's|^origin/||' ) - 远程 HEAD —
git -C <worktree> symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||' - 默认
main— 最后的回退选项。如果不同来源给出的结果有歧义,请询问。
步骤 3:提供选项
CI 状态依据对话上下文——如果用户说 CI 不可用、已冻结或达到计费上限,则视为不可用。不自动检测。
CI 正常(默认):
Ready to ship.
1. Open PR + auto-merge
2. Keep branch as-is
3. Discard
CI 不可用:
Ready to ship (CI down — local merge with review gate).
1. Local merge to main
2. Keep branch as-is
3. Discard
选项 1a:PR + 自动合并(CI 正常)
git -C <worktree> push -u origin <branch>
GH_REPO=<owner/repo> gh pr create \
--base "$TARGET" \
--title "<conventional-commit-title>" \
--body "$(cat <<'EOF'
## Summary
<2-3 bullets>
## Test plan
- [ ] <verification steps>
EOF
)"
GH_REPO=<owner/repo> gh pr merge --auto --merge
报告 PR URL。继续清理工作树。
**如果 PR 创建后 CI 阻止合并或运行失败:**停止。询问用户。不要自行补救、回退到本地合并或强制合并。
选项 1b:本地合并(CI 不可用)
先对差异派发 code-reviewer Agent 审查——所有自主编写的代码都必须在合并前经过审查:
claude --agent code-reviewer "Review diff: git -C <worktree> diff $TARGET..HEAD"
如果审查者返回 P0/P1 问题,请停止。先修复再继续。
调用 /local-merge,并传入 BRANCH=<branch>、TARGET=$TARGET、PRIMARY=<primary-worktree-path>、MESSAGE="merge: <branch> into $TARGET"。它会处理浅克隆、带重试的推送,以及向主工作树进行非破坏性同步。
选项 2:保持原样
报告:“保留分支 <name>。工作树位于 <path>。”
不要清理。
选项 3:丢弃
要求用户输入“discard”确认。显示分支名称、提交列表和工作树路径。
git -C <primary> worktree remove <worktree-path>
git -C <primary> branch -d <branch>
如果 branch -d 失败(存在未合并的工作),请警告用户并停止——不要使用 branch -D。只有本地删除成功后,才删除远程分支:
git push origin --delete <branch>
工作树清理
PR(1a)或本地合并(1b)完成后:
# Unlock first (matches the lock applied by /isolate)
git -C <primary> worktree unlock <worktree-path> 2>/dev/null || true
git -C <primary> worktree remove <worktree-path>
然后,如果已安装 git-trim,从本地引用中清理已失效的分支(可处理 squash 合并、rebase 合并和上游分支标记为 [gone] 的情况):
if command -v git-trim >/dev/null 2>&1; then
git -C <primary> trim --delete
fi
| 路径 | 是否清理工作树? |
|---|---|
| PR + 自动合并 | 是 |
| 本地合并 | 是 |
| 丢弃 | 是(在丢弃步骤中) |
| 保持原样 | 否 |
集成
调用方: /task(第 8 步) 配套: /isolate(清理它创建的工作树)、/review(/ship 前必须通过)