From git
提交代码、推送分支、创建 MR/PR 并监控 Pipeline 状态。当用户说"提交并创建 MR"、"创建合并请求"、"commit push pr"、"帮我创建 MR"时触发。
npx claudepluginhub taptap/claude-plugins-marketplaceThis skill uses the workspace's default tool permissions.
- 当前 git 状态:!`git status`
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Automates semantic versioning and release workflow for Claude Code plugins: bumps versions in package.json, marketplace.json, plugin.json; verifies builds; creates git tags, GitHub releases, changelogs.
git statusgit branch --show-currentgit diff HEAD --statgit log --oneline -5git branch -r | head -10printenv GIT_ALLOW_NO_TICKET || echo true概要: 检测默认分支并在必要时智能创建新分支
检测默认分支:使用三级检测方法(详见 默认分支检测)
git symbolic-ref refs/remotes/origin/HEAD智能创建分支(如果在默认分支):自动分析 diff 判断分支类型
三级优先级策略(详见 任务ID提取):
git branch --show-current | grep -oE 'TAP-[0-9]+'关键: 纯数字 ID 必须转换为 TAP-xxx 格式。禁止 AI 自动推断使用 no-ticket。
执行流程:
检查用户输入是否包含 --skip-code-review 参数。
如果包含:输出 ⏭️ 已跳过代码审查 后直接进入第五步
如果不包含(默认):
输出:💡 提示:如需跳过代码审查,可使用 --skip-code-review 参数
Skill(skill: "git:code-reviewing", args: "review committed changes on current branch before push")
审查结果处理:
which glab && glab auth status
安全限制(严格禁止):glab mr approve / glab mr merge
MR 标题:
git commit --amend 修正为中文MR 描述:从 commit message 汇总(git log origin/master..HEAD --pretty=format:"%B" --reverse):
## 改动内容
- [汇总所有 commit 的改动点]
## 影响面
- [汇总所有 commit 的影响面]
.gitlab/merge_request_templates/default.md(或 Default.md):读取模板,将汇总正文填充到 ## Description 区块如果 glab 可用:
git push -u origin $(git branch --show-current)
# 检测项目是否有 claude reviewer(有则自动指派)
GIT_HOST=$(git remote get-url origin | sed 's|git@||;s|:.*||')
PROJECT_PATH=$(git remote get-url origin | sed 's|git@[^:]*:||;s|\.git$||')
PROJECT_ENC=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1],safe=''))" "$PROJECT_PATH")
HAS_CLAUDE=$(glab api "projects/${PROJECT_ENC}/members/all?query=claude" --hostname "$GIT_HOST" 2>/dev/null | \
python3 -c "import json,sys; d=json.load(sys.stdin); print('1' if any(u.get('username')=='claude' for u in d) else '0')" 2>/dev/null)
REVIEWER_FLAG=""
[ "$HAS_CLAUDE" = "1" ] && REVIEWER_FLAG="--reviewer claude"
glab mr create \
--title "$(git log -1 --pretty=%s)" \
--description "$MR_DESC" \
--yes --remove-source-branch \
$REVIEWER_FLAG
如果 glab 不可用(fallback):
git push -u origin $(git branch --show-current) -o merge_request.create
MANDATORY — 此步骤不可省略。MR/PR 创建成功后,必须立即执行 Pipeline 监控。
从 glab mr create 输出提取 MR_IID。
GitLab(使用 MR pipelines API,不要用 pipelines?ref={branch}):
PROJECT_ID=$(glab api projects/$(python3 -c "import urllib.parse; print(urllib.parse.quote('${project_path}', safe=''))") --hostname {host} | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
glab api "projects/${PROJECT_ID}/merge_requests/${MR_IID}/pipelines?per_page=1" --hostname {host}
GitHub:gh pr checks {PR_NUMBER} --repo {owner}/{repo}
使用单个前台 Bash 命令执行轮询循环。参数:首次等待 15s,间隔 30s,最多 60 次(约 30 分钟)。
GitLab 轮询脚本(变量由调用方填充):
PROJECT_ID="{project_id}"
MR_IID="{mr_iid}"
HOST="{host}"
MR_URL="{mr_url}"
BRANCH="{branch}"
TARGET="{target_branch}"
sleep 15
for i in $(seq 1 60); do
RESULT=$(glab api "projects/${PROJECT_ID}/merge_requests/${MR_IID}/pipelines?per_page=1" \
--hostname "$HOST" 2>/dev/null)
PIPELINE_ID=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d[0]['id'] if d else '')" 2>/dev/null)
STATUS=$(echo "$RESULT" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d[0]['status'] if d else 'waiting')" 2>/dev/null)
if [ -z "$PIPELINE_ID" ]; then
echo "⏳ 等待 Pipeline 创建... (${i}/60)"
sleep 30
continue
fi
JOBS=$(glab api "projects/${PROJECT_ID}/pipelines/${PIPELINE_ID}/jobs" \
--hostname "$HOST" 2>/dev/null | python3 -c "
import json, sys
jobs = json.load(sys.stdin)
parts = []
icons = {'success':'✅','failed':'❌','running':'🔄','pending':'⏳','canceled':'🚫','created':'⏳'}
for j in jobs:
parts.append(f\"{j['name']} {icons.get(j['status'],'❓')}\")
print(' | '.join(parts))
" 2>/dev/null)
ELAPSED=$((i * 30 + 15))
MINS=$((ELAPSED / 60))
SECS=$((ELAPSED % 60))
echo "⏳ Pipeline #${PIPELINE_ID}: ${STATUS} (${MINS}m${SECS}s) — ${JOBS}"
case "$STATUS" in
success)
echo "✅ Pipeline #${PIPELINE_ID} passed (${MINS}m${SECS}s)"
echo " MR: ${MR_URL}"
osascript -e "display notification \"Pipeline passed ✅\" with title \"CI/CD\" subtitle \"${BRANCH} → ${TARGET}\"" 2>/dev/null
exit 0
;;
failed)
echo "❌ Pipeline #${PIPELINE_ID} failed (${MINS}m${SECS}s)"
echo " MR: ${MR_URL}"
osascript -e "display notification \"Pipeline failed ❌\" with title \"CI/CD\" subtitle \"${BRANCH}\"" 2>/dev/null
exit 1
;;
canceled)
echo "🚫 Pipeline #${PIPELINE_ID} canceled"
exit 0
;;
esac
sleep 30
done
echo "⏰ 超时(30 分钟),请手动检查: ${MR_URL}"
拉取失败 job 日志:
glab api "projects/${PROJECT_ID}/jobs/${JOB_ID}/trace"gh run view {run_id} --log-failed分类处理:
| 类型 | 判断依据 | 处理 |
|---|---|---|
| merge 冲突 | job 名含 merge-to- 或日志含 CONFLICT | → Skill("git:fix-conflict", ...) |
| lint 错误 | golangci-lint / eslint / flake8 | → 自动修复 |
| 单元测试失败 | go test / jest / pytest | → 自动修复 |
| 编译错误 | build failed / compilation error | → 给出修复建议 |
| 基础设施问题 | timeout / network / docker pull | → 建议 retry |
| 其他 | 无法分类 | → 输出日志摘要 |
自动修复(仅 lint + test):修复代码但不 commit,通知用户确认后执行 /git:commit-push 重新提交。
--force / -f 推送glab mr approve / glab mr merge