mcpField
S
ship

ship

github.com/camacho开发388 次安装
代码仓库

关于 ship

ship 是用于将功能分支整合到目标分支的开发技能,可通过拉取请求或本地合并完成。它引导验证、合并方式选择、审查要求和工作树清理。

主要功能

  1. 01整合前运行验证
  2. 02根据 CI 状态选择 PR 或本地合并
  3. 03本地合并前要求代码审查
  4. 04整合后清理工作树

适用场景

  1. 01创建 PR 并启用自动合并
  2. 02CI 不可用时进行本地合并
  3. 03保留分支或经确认后丢弃

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/camacho/ai-skills --skill ship

安装后在 Claude Code 中输入/ship确认已加载。

详细介绍

发布

将分支合并到 main。有两种方式:PR(CI 正常)或本地合并(CI 不可用)。

宣布:“正在使用 /ship 集成此分支。”

前置条件

  1. 当前位于功能分支(而不是 main)。
  2. /review(第 6 步)已通过,或用户已明确批准。
  3. 已知工作树路径(清理时需要)。
  4. **没有待处理任务。**运行 TaskList(Claude Code),或检查 .branch-context.md 清单(Codex)。如果任何步骤仍为 pending 或 in_progress,说明该步骤已跳过——返回并完成后再发布。

如果缺少任何前置条件,请说明缺少哪项并停止。

步骤 1:验证

pnpm validate

如果验证失败,请停止。先修复。

步骤 2:确定目标分支

按以下顺序确定(使用第一个成功的来源):

  1. 计划文件的 frontmatter — 如果存在计划文件,从 ai-workspace/plans/<name>.md 中读取 Target: 字段。
  2. 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/||'
    )
    
  3. 远程 HEAD — git -C <worktree> symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||'
  4. 默认 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 前必须通过)

评论

支持 Markdown