一键导入
gwt-pr-check
Check GitHub PR status with the gh CLI, including unmerged PR detection and post-merge new-commit detection for the current branch.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Check GitHub PR status with the gh CLI, including unmerged PR detection and post-merge new-commit detection for the current branch.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Create or update GitHub Pull Requests with the gh CLI, including deciding whether to create a new PR or only push based on existing PR merge status. Use when the user asks to open/create/edit a PR, generate a PR body/template, or says 'open a PR/create a PR/gh pr'. Defaults: base=develop, head=current branch (same-branch only; never create/switch branches).
Semantic search over project source files using vector embeddings. Use to find files related to a feature, bug, or concept.
Inspect GitHub PR for CI failures, merge conflicts, update-branch requirements, reviewer comments, change requests, and unresolved review threads. Create fix plans and implement after user approval. Reply to ALL reviewer comments with action taken or reason for not addressing, then resolve threads. Notify reviewers after fixes.
Migrate legacy spec sources to artifact-first GitHub Issue specs. Supports local `specs/SPEC-*` directories and body-canonical `gwt-spec` Issues using the bundled migration script.
PTY based communication tools for Project Mode orchestration (Lead/Coordinator/Developer).
Execute the hotfix workflow when the user asks `hotfix` or `/hotfix`: create a hotfix branch from main, guide fix+checks, open PR to main, and confirm patch release.
| name | gwt-pr-check |
| description | Check GitHub PR status with the gh CLI, including unmerged PR detection and post-merge new-commit detection for the current branch. |
Check PR status for the current branch with gh and report a recommended next action.
This skill is check-only:
head branch, and base branch.
head: current branch (git rev-parse --abbrev-ref HEAD)base: default develop unless user specifiesgit status --porcelaingit fetch origingh pr list --head <head> --state all --jsonnumber,state,mergedAt,updatedAt,url,title,mergeCommit,baseRefName,headRefNameNO_PR + recommended action CREATE_PRmergedAt == null
-> UNMERGED_PR_EXISTS + recommended action PUSH_ONLYmergedAtmergeCommit.oidgit merge-base --is-ancestor <merge_commit> HEADHEAD, count commits after merge:
git rev-list --count <merge_commit>..HEADALL_MERGED_WITH_NEW_COMMITS + CREATE_PRALL_MERGED_NO_NEW_COMMITS + NO_ACTIONHEAD:
git rev-list --count origin/<head>..HEADALL_MERGED_WITH_NEW_COMMITS + CREATE_PR (fallback)ALL_MERGED_NO_NEW_COMMITS + NO_ACTION (fallback)git rev-list --count origin/<base>..HEADCHECK_FAILED + MANUAL_CHECKReturn a human-readable summary by default.
Do not return raw JSON as the default output. If JSON is explicitly requested by the user, append it after the human summary.
Recommended status values:
NO_PRUNMERGED_PR_EXISTSALL_MERGED_WITH_NEW_COMMITSALL_MERGED_NO_NEW_COMMITSCHECK_FAILEDRecommended action values:
CREATE_PRPUSH_ONLYNO_ACTIONMANUAL_CHECKOutput 1-3 lines using a signal prefix + action keyword on line 1.
| Prefix | Action | Meaning |
|---|---|---|
>> | CREATE PR | Create a new PR |
> | PUSH ONLY | Push to existing PR |
-- | NO ACTION | Nothing to do |
!! | MANUAL CHECK | Manual check required |
Per-status format:
NO_PR:
>> CREATE PR — No PR exists for <head> -> <base>.
UNMERGED_PR_EXISTS (2 lines):
> PUSH ONLY — Unmerged PR open for `<head>`.
PR: #<number> <url>
ALL_MERGED_WITH_NEW_COMMITS (2 lines):
>> CREATE PR — <N> new commit(s) after last merge (#<pr_number>).
head: <head> -> base: <base>
ALL_MERGED_NO_NEW_COMMITS:
-- NO ACTION — All PRs merged, no new commits on <head>.
CHECK_FAILED (2 lines):
!! MANUAL CHECK — Could not determine PR status.
Reason: <reason>
head: <head> -> base: <base>
Append the following line only when the worktree is dirty:
(!) Worktree has uncommitted changes.
| Status | Prefix | Action | Template |
|---|---|---|---|
NO_PR | >> | CREATE PR | No PR exists |
UNMERGED_PR_EXISTS | > | PUSH ONLY | Unmerged PR open |
ALL_MERGED_WITH_NEW_COMMITS | >> | CREATE PR | N new commit(s) |
ALL_MERGED_NO_NEW_COMMITS | -- | NO ACTION | All PRs merged |
CHECK_FAILED | !! | MANUAL CHECK | Could not determine |
NO_PR:
>> CREATE PR — No PR exists for `feature/my-branch` -> `develop`.
UNMERGED_PR_EXISTS:
> PUSH ONLY — Unmerged PR open for `feature/my-branch`.
PR: #456 https://github.com/org/repo/pull/456
ALL_MERGED_WITH_NEW_COMMITS:
>> CREATE PR — 3 new commit(s) after last merge (#123).
head: feature/my-branch -> base: develop
ALL_MERGED_NO_NEW_COMMITS:
-- NO ACTION — All PRs merged, no new commits on `feature/my-branch`.
CHECK_FAILED:
!! MANUAL CHECK — Could not determine PR status.
Reason: Could not resolve merge commit and fallback comparison failed
head: feature/my-branch -> base: develop
With dirty worktree (appended to any status):
>> CREATE PR — 3 new commit(s) after last merge (#123).
head: feature/my-branch -> base: develop
(!) Worktree has uncommitted changes.
git rev-parse --show-toplevelgit rev-parse --abbrev-ref HEADgh auth statusgit status --porcelaingit fetch originorigin/<head>..HEAD first.# Human-readable output
python3 ".gemini/skills/gwt-pr-check/scripts/check_pr_status.py" --repo "."
# Explicit base branch
python3 ".gemini/skills/gwt-pr-check/scripts/check_pr_status.py" --repo "." --base develop
# Append machine-readable JSON after the summary
python3 ".gemini/skills/gwt-pr-check/scripts/check_pr_status.py" --repo "." --json
head="${HEAD_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}"
base="${BASE_BRANCH:-develop}"
dirty=0
if [ -n "$(git status --porcelain)" ]; then
dirty=1
fi
git fetch origin
pr_json="$(gh pr list --head "$head" --state all --json number,state,mergedAt,updatedAt,url,title,mergeCommit)"
pr_count="$(echo "$pr_json" | jq 'length')"
unmerged_count="$(echo "$pr_json" | jq 'map(select(.mergedAt == null)) | length')"
if [ "$pr_count" -eq 0 ]; then
status="NO_PR"
action="CREATE_PR"
reason="No PR found for head branch"
elif [ "$unmerged_count" -gt 0 ]; then
status="UNMERGED_PR_EXISTS"
action="PUSH_ONLY"
reason="At least one PR for the head branch is not merged"
else
merge_commit="$(echo "$pr_json" | jq -r 'sort_by(.mergedAt) | last | .mergeCommit.oid')"
merge_commit_ancestor=0
if [ -n "$merge_commit" ] && [ "$merge_commit" != "null" ] && \
git merge-base --is-ancestor "$merge_commit" HEAD 2>/dev/null; then
merge_commit_ancestor=1
new_commits="$(
git rev-list --count "$merge_commit"..HEAD 2>/dev/null || echo ""
)"
else
new_commits=""
fi
if [ -n "$new_commits" ]; then
if [ "$new_commits" -gt 0 ]; then
status="ALL_MERGED_WITH_NEW_COMMITS"
action="CREATE_PR"
reason="$new_commits commits found after last merge"
else
status="ALL_MERGED_NO_NEW_COMMITS"
action="NO_ACTION"
reason="No commits found after last merge"
fi
else
upstream_commits="$(
git rev-list --count "origin/$head"..HEAD 2>/dev/null || echo ""
)"
if [ -n "$upstream_commits" ]; then
if [ "$upstream_commits" -gt 0 ]; then
status="ALL_MERGED_WITH_NEW_COMMITS"
action="CREATE_PR"
reason="Fallback check found commits ahead of origin/$head"
else
status="ALL_MERGED_NO_NEW_COMMITS"
action="NO_ACTION"
reason="Fallback check found no commits ahead of origin/$head"
fi
else
fallback_commits="$(
git rev-list --count "origin/$base"..HEAD 2>/dev/null || echo ""
)"
if [ -n "$fallback_commits" ]; then
if [ "$fallback_commits" -gt 0 ]; then
status="ALL_MERGED_WITH_NEW_COMMITS"
action="CREATE_PR"
reason="Fallback check found commits ahead of origin/$base"
else
status="ALL_MERGED_NO_NEW_COMMITS"
action="NO_ACTION"
reason="Fallback check found no commits ahead of origin/$base"
fi
else
status="CHECK_FAILED"
action="MANUAL_CHECK"
reason="Could not resolve merge commit and fallback comparison failed"
fi
fi
fi
fi
latest_merged_pr="$(
echo "$pr_json" \
| jq -r 'sort_by(.mergedAt) | last | .number // empty'
)"
unmerged_pr="$(
echo "$pr_json" \
| jq -r 'map(select(.mergedAt == null)) | first | .number // empty'
)"
unmerged_pr_url="$(
echo "$pr_json" \
| jq -r 'map(select(.mergedAt == null)) | first | .url // empty'
)"
case "$status" in
NO_PR)
echo ">> CREATE PR — No PR exists for \`$head\` -> \`$base\`."
;;
UNMERGED_PR_EXISTS)
echo "> PUSH ONLY — Unmerged PR open for \`$head\`."
echo " PR: #$unmerged_pr $unmerged_pr_url"
;;
ALL_MERGED_WITH_NEW_COMMITS)
n="${new_commits:-$upstream_commits}"
echo ">> CREATE PR — $n new commit(s) after last merge (#$latest_merged_pr)."
echo " head: $head -> base: $base"
;;
ALL_MERGED_NO_NEW_COMMITS)
echo "-- NO ACTION — All PRs merged, no new commits on \`$head\`."
;;
*)
echo "!! MANUAL CHECK — Could not determine PR status."
echo " Reason: $reason"
echo " head: $head -> base: $base"
;;
esac
if [ "$dirty" -eq 1 ]; then
echo " (!) Worktree has uncommitted changes."
fi
gwt-pr: creates/updates PRsgwt-pr-fix: diagnoses and fixes failing PRs