| name | git-ship |
| description | 提交代码 + 推送 + 创建 MR/PR。**触发场景**:用户表达「完成了 / 搞定了 / 做好了 / 提交吧 / 推一下 / 可以提了 / ship 它 / 合并代码 / 收尾了」等完成意图时主动询问;用户输入 /git-ship 时直接执行;plan 已完成且代码改完时主动询问 ship。**禁止直接合并到 master**(必须创建 MR/PR 等待人工 Review)。 |
| argument-hint | ["可选补充说明"] |
| allowed-tools | Bash(git *), Bash(gh *), Bash(test *), Read |
git-ship
提交代码、推送、创建 MR/PR。禁止直接合并到 master。
自动触发:完成意图识别
当用户在对话里表达完成 / 提交 / 推送 / 合并语义时,主动确认后跑 git-ship 流程。
触发词(任一)
- 完成类:「完成了」/「搞定了」/「弄完了」/「做好了」/「OK 了」
- 提交类:「提交吧」/「推一下」/「可以提了」/「ship 它」
- 合并类:「合并代码」/「提交代码」/「合到 master」
- 收尾类:「结束了」/「收尾了」/「打包」
行为
触发词命中
↓
AI 主动询问:「我准备 commit 当前改动 → push 到远程 → 创 MR 到 master,确认 yes/no?」
↓
yes → 跑完整 git-ship 流程(下文步骤 1-6)
no → 询问用户具体期望(要不要先看 diff / 要不要拆 commit / 要不要换 base 分支)
边界规则
| 场景 | 处理 |
|---|
| 首次表达完成 | 必须确认——防止用户随口说"完成了"但实际未真完成(如还没跑测试 / diff 有未提交残留) |
| 同会话同分支再次完成(已确认过一次) | 可不重复确认,直接跑步骤 1-6 |
| 破坏性操作(force push / amend 已 push 的 commit / push 到 master) | 必须强制确认,不论之前已确认多少次 |
| commit 前置检查失败(如 lint / 测试不过) | 不要无脑 ship,告诉用户失败项 + 修复建议 |
| 用户语义模糊(如「先看一下」/「再看看」) | 不触发,等明确信号 |
与全局规则的关系
用户全局 ~/.claude/CLAUDE.md 写明:「涉及外部可见动作必须确认(push / 创 PR / 评论 issue)」。本 skill 的"主动确认"环节正好满足这条全局要求——AI 不直接跑 ship,先发"准备 commit + push + 创 MR"询问句让用户拍板。
反模式(禁止)
- ❌ 用户说「完成了」直接跑 push,不询问
- ❌ 用户说「完成了」但 git status 有未 stage 的改动,AI 自动 stage 一切(可能带入用户未意图的文件)
- ❌ 用户说「完成了」但当前在 master 分支(无 feature 分支),AI 直接 push 到 master 不询问
- ❌ 触发词命中但用户意图不明(如「这个功能完成了吗?」是反问),AI 应理解上下文不要硬触发
参数
$ARGUMENTS — 可选补充说明
步骤
0. swagger-repo 分支前置检查(可跳过)
如果项目根有 swagger-repo.json 且本次将合并到 master/main,先按 check-api-branch skill 的流程跑一遍。原因:开发期为了测后端 feat 分支,swagger-repo.json.branch 容易被改到非 master,忘了切回会让 master 上的 API 类型来自某人本地的 feature 分支。
判断条件(任一成立即触发提示):
test -f swagger-repo.json && echo "has-swagger=true" || echo "has-swagger=false"
git diff --name-only @{upstream}..HEAD 2>/dev/null | grep -q '^swagger-repo\.json$' && echo "touched=true" || echo "touched=false"
- 有
swagger-repo.json 且未跑过 check-api-branch -> 提示用户先按 check-api-branch skill 检查后再回来
- 用户明确说"已确认 / 跳过" -> 继续后续步骤
- 没有
swagger-repo.json -> 静默跳过本步
1. 检查状态
git status --short
git branch --show-current
- 在 master 上 → 停止,提示用 /start-task 创建分支
- 无变更 → 停止
2. 暂存
- 逐个
git add <文件>,不用 git add -A
- 排除 .env、node_modules/、dist/、密钥文件
- 可疑文件警告用户
3. Commit
- 分析 diff,生成中文 commit message(feat/fix/chore/docs/refactor)
- 展示给用户确认后提交
git commit -m "<message>
Co-Authored-By: Claude <noreply@anthropic.com>"
- hook 失败 → 修复后新建 commit,不 amend
4. 推送
git push origin <branch> -u
- rejected →
git pull --rebase 后重试
- 权限错误 → 提示用户
! ssh-add(密码四个空格)
5. 创建 MR/PR
先检测远程类型:
git remote get-url origin
GitLab(g.echo.tech):
- push 输出中已包含 MR 链接,直接提供给用户
- 或构造:
http://g.echo.tech/<group>/<repo>/-/merge_requests/new?merge_request[source_branch]=<branch>
GitHub:
gh pr create --title "<message>" --body "<body>" --base master
gh 不可用时,提供 Web URL。
6. 输出报告
## Git Ship 完成
| 步骤 | 状态 |
|------|------|
| 提交 | abc1234 -- <message> |
| 推送 | origin/<branch> |
| MR | <URL> |
等待人工 Review 后合并。
规则
- 禁止 force push
- 禁止
--no-verify
- 禁止直接合并到 master
- 冲突 → 停止,询问用户