pr-handoff
Create or update a PR and hand it off to a coding agent worker via load balancing. Removes pending label if present, then assigns a worker.
소스 정보
- 저장소
- okou-ai/team-skills
- 최근 소스 활동
- 2026년 4월 14일 11:16
- 감지된 SKILL.md 언어
- 영어
- 스타
- 1
- 포크
- 2
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SKILL.md 표시 중
SKILL.md
소스 지침 · 읽기 전용 미리보기- name
- pr-handoff
- description
- Create or update a PR and hand it off to a coding agent worker via load balancing. Removes pending label if present, then assigns a worker.
- context
- fork
# PR Handoff Skill
You are a PR handoff specialist. Your role is to create or update a pull request and hand it off to a coding agent worker using load balancing. A key use case is when a human has resolved a `pending` PR (one that needed human intervention) and wants to hand it back to an agent.
## Arguments
Your args are: `$ARGUMENTS`
Parse the args to determine:
1. **Label parameter** (`^`): If the args contain `^` followed by a label name (e.g., `^urgent`), apply that label to the PR in addition to the worker label
2. **Worker count** (optional number): The number of coding workers for distribution. Defaults to **4** if not provided.
### Argument Examples
```
# No args — create/update PR, distribute across 4 workers
/pr-handoff
# Specify 8 workers
/pr-handoff 8
# With a specific label
/pr-handoff ^urgent
# With label and 6 workers
/pr-handoff ^backend 6
```
**Parsing rules:**
- A bare number (e.g., `4`, `8`) is the worker count
- `^label-name` is the label parameter — the `^` character followed immediately by the label name
- Arguments can appear in any order
- Defaults: worker count = `4`, label = none
---
## Workflow
This skill runs in two phases: **Create/Update PR** then **Assign Worker**.
---
## Phase 1: Create or Update PR
### Step 1: Check Current State
```bash
existing_pr=$(gh pr view --json number,url,labels 2>/dev/null)
has_uncommitted=$(git status --porcelain)
```
### Step 2a: No Existing PR → Use `/pr-create`
If no PR exists for this branch, delegate to the `pull-request create` skill to handle the full PR creation workflow (including branch creation from main if needed, staging, committing, pushing, and opening the PR):
```typescript
Skill({ skill: "pull-request", args: "create" })
```
**IMPORTANT:** Only create the PR — do NOT run `/pr-check` or any CI monitoring after creation. The assigned worker will run `/pr-check` itself. The goal here is to get the PR created and handed off as fast as possible.
This also applies when **there are uncommitted changes but no PR yet** — `/pr-create` will handle staging, committing, branch creation, and PR opening all in one step. Skip `/pr-check` as the worker handles it.
After `/pr-create` completes, capture the PR number and proceed to Phase 2.
### Step 2b: Existing PR → Push Any Pending Changes
If a PR already exists:
1. Check for uncommitted changes: `git status`
2. If there are changes, stage, commit, and push:
```bash
git add -A
git commit -m "<type>: <description>"
git push
```
3. If no changes, that's fine — proceed directly to Phase 2
**Commit message rules:** Type must be lowercase, description starts lowercase, no period, under 100 chars, imperative mood.
---
## Phase 2: Assign to Coding Worker
After the PR is created or updated, assign it to a coding agent worker.
### Step 1: Capture PR Number and Labels
Extract the PR number from Phase 1. Check current labels on the PR:
```bash
PR_LABELS=$(gh pr view $PR_NUMBER --json labels --jq '.labels[].name')
```
### Step 2: Remove `pending` Label (if present)
The `pending` label means the PR was waiting for human intervention. Since the human is now handing it off, remove it:
```bash
if echo "$PR_LABELS" | grep -q "^pending$"; then
gh pr edit $PR_NUMBER --remove-label "pending"
fi
```
### Step 3: Check for Existing Worker Label
If the PR already has a worker label (`vm01`..`vm99`), **keep it** — the PR should go back to the same worker that was working on it.
```bash
EXISTING_WORKER=$(echo "$PR_LABELS" | grep -E "^vm[0-9]{2}$" | head -1)
```
If `EXISTING_WORKER` is set, skip Steps 4-5 and go directly to Step 6 (report).
### Step 4: Get Current User and Count Issues + PRs Per Worker
Only runs if PR has no existing worker label.
Query the `vm` lanes and the `zero` lane in parallel, then merge results:
```bash
ME=$(gh api user --jq '.login')
MAX_WORKERS=<from args or 4>
FIRST_LANE=$(printf "vm%02d" 1)
LAST_LANE=$(printf "vm%02d" $MAX_WORKERS)
VM_LANES=$(${CLAUDE_PLUGIN_ROOT}/scripts/lane-status.sh "${FIRST_LANE}-${LAST_LANE}" --user "$ME") &
PID_VM=$!
ZERO_LANE=$(${CLAUDE_PLUGIN_ROOT}/scripts/lane-status.sh "zero" --user "$ME") &
PID_ZERO=$!
wait $PID_VM $PID_ZERO
# Merge into a single array: vm lanes first, zero lane appended
ALL_LANES=$(jq -s '.[0] + .[1]' <(echo "$VM_LANES") <(echo "$ZERO_LANE"))
echo "$ALL_LANES" | jq '.[] | {lane, issue_count, pr_count, total}'
```
### Step 5: Apply Worker Label
Pick the worker label with the lowest total (issues + PRs). **When totals are equal, prefer `zero` over any `vm` worker.** Break remaining ties by lowest `vm` number.
Selection logic:
1. Find the minimum total across all lanes (vm01..vmN + zero)
2. Among all lanes with that minimum total, if `zero` is one of them → select `zero`
3. Otherwise select the `vm` lane with the lowest number
```bash
gh label create "$SELECTED_LABEL" --description "Coding worker $SELECTED_LABEL" --color 0E8A16 2>/dev/null || true
gh pr edit $PR_NUMBER --add-label "$SELECTED_LABEL"
```
If `^label` was specified, add it too:
```bash
gh label create "$EXTRA_LABEL" --color EDEDED 2>/dev/null || true
gh pr edit $PR_NUMBER --add-label "$EXTRA_LABEL"
```
### Step 6: Report
Output a combined summary:
```
PR handed off: https://github.com/owner/repo/pull/123
Mode: <created / updated>
Assigned to worker: <LABEL> <(existing) if kept>
Pending label: <removed / not present>
Worker load (issues + PRs):
zero: 0 (issues: 0, PRs: 0) <-- assigned here
vm01: 3 (issues: 2, PRs: 1)
vm02: 0 (issues: 0, PRs: 0)
vm03: 3 (issues: 1, PRs: 2)
vm04: 4 (issues: 3, PRs: 1)
```
Show `zero` first in the display, followed by `vm01`..`vmN` in order.
---
## Key Rules
- **Delegate PR creation to `/pr-create`** — don't reimplement branch creation or PR creation logic
- **Create or update — both work** — the skill handles either case
- **Remove `pending` label** — this signals the PR is ready for agent work again
- **Preserve existing worker label** — if the PR already has a worker label, keep it (same agent should continue)
- **Only assign new worker if none exists** — load balance only for fresh assignments
- **Always pick the least-loaded worker** — balance is the primary goal
- **Include `zero` in load balancing** — query `zero` lane alongside `vm01`..`vmN` and consider it as a candidate
- **Prefer `zero` on ties** — when `zero` and any `vm` worker share the same minimum total, always assign to `zero`
- **Break remaining ties by lowest number** — prefer `vm01` over `vm02` when equal
- **Create labels on demand** — if `vm0N` label doesn't exist, create it
- **One worker label per PR** — do not add multiple worker labels
- **`^label` is additive** — it does not replace default labels, it adds to them
- **Display the PR URL** — always show the URL to the user at the end
GitHub에서 보기