skills/pr/SKILL.md
Create a pull request following project conventions. TRIGGER when: user asks to create/open a PR, push and create PR, or any workflow that includes PR creation (e.g., "PR 올려줘", "푸시하고 PR 만들어줘", "commit, push, and create PR"). DO NOT TRIGGER when: user is viewing or listing existing PRs, or performing git operations without PR intent.
npx skillsauth add chanmuzi/git-conventions prInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Resolve the target base branch before proceeding. Use the first matching rule:
$ARGUMENTS contains --base <branch>, use that branch.Branch Strategy section:
## Branch Strategy
- default-base: dev
- release-base: main
- direct-to-release: hotfix/*
Apply rules:
release-basedirect-to-release pattern → use release-basedefault-base (e.g., you are on dev) → use release-basedefault-basegit branch -r | grep -E 'origin/(dev|develop)$'
b. If found:
dev/develop) → base = maindev_base=$(git merge-base HEAD origin/dev 2>/dev/null)
main_base=$(git merge-base HEAD origin/main 2>/dev/null)
The more recent merge-base indicates the parent branch. If equal, default to the integration branch.
c. If no integration branch exists → use the repo default branch.Do NOT ask for user confirmation. Instead, briefly state which base branch was selected and why (one line) when presenting the PR.
| Flag | Default | Description |
|------|---------|-------------|
| -g\|--graph | off | Include a Mermaid change-flow graph in the PR description |
Run the following commands using the resolved {base-branch}:
git log --oneline {base-branch}..HEAD 2>/dev/null || git log --oneline -10 — list commits on this branchgit diff {base-branch}...HEAD --stat 2>/dev/null || echo "Could not determine diff" — list changed files-g flag is set)Additionally build a change-flow graph for the PR description:
imports, calls, extends, emits/consumes) and conceptual (references, shared logic, configures).flowchart LR diagram. Nodes = changed files (or module groups). Edges = relationships found in step 2, labeled with relationship type.Skip condition: If no edges (relationships) are found between changed files after step 2, skip graph generation entirely. Omit the graph section from the PR description silently.
Graph rules:
flowchart LR (left-to-right).[filename.ext] format (basename + extension).imports, calls, extends, emits/consumes, reads/writes) or conceptual (references, shared logic, configures).subgraph. When ≤ 7, show individual file nodes without subgraph.Parse $ARGUMENTS:
Format: {Type}: {description}
| Type | Purpose |
|------|---------|
| Feat: | New feature |
| Fix: | Bug fix |
| Refactor: | Code restructuring |
| Style: | Formatting, linting, whitespace (no code change) |
| Perf: | Performance improvement |
| Docs: | Documentation |
| Test: | Test changes |
| Chore: | Maintenance |
| Hotfix: | Urgent fix |
| Release: | Release integration (e.g., Release: {default-base} → {release-base} 통합 (v0.5.0)) |
Write the description in the language configured in the project's CLAUDE.md. If no language is configured, follow the user's conversational language.
Assign a type label to the PR based on its title prefix. This label scheme is shared with the /issue skill for project-wide consistency. The core labels are identical; /issue additionally defines enhancement for improvement requests.
| Label | Color | PR type prefix |
|-------|-------|----------------|
| feature | 0075ca | Feat: |
| bug | d73a4a | Fix: |
| refactor | d4c5f9 | Refactor: |
| style | c5def5 | Style: |
| perf | f9d0c4 | Perf: |
| docs | 5319e7 | Docs: |
| test | bfd4f2 | Test: |
| chore | e4e669 | Chore: |
| hotfix | b60205 | Hotfix: |
| release | 1d76db | Release: |
| Label | Color |
|-------|-------|
| critical | b60205 |
| high | d93f0b |
| medium | fbca04 |
| low | 0e8a16 |
Before assigning a label, ensure it exists in the repository. Color values are 6-character hex without #:
gh label create "{label}" --color "{hex}" 2>/dev/null || true
Apply this template for feature, fix, refactor, and other non-release PRs.
###). Place them as body text below the heading — headings should contain only descriptive titles.관련 커밋: for commit SHAs, 관련 PR: for PR numbers. Never use bare 관련:.## 개요
{1-2 sentence summary: what this PR does and why}
> ⚠️ **Breaking Change**: {only if applicable — describe migration needed}
## 변경 사항
### 1. {Change category title}
- {Specific change and its purpose}
- {Specific change and its purpose}
- 관련 커밋: {sha1}, {sha2}
### 2. {Change category title}
- {Specific change and its purpose}
- 관련 PR: #{number}
{if -g flag set AND relationships found:}
## 변경 흐름
```mermaid
flowchart LR
subgraph {module_name}[{Module Display Name}]
{file_node_id}[{filename}]
end
{source_node} -->|{relationship_label}| {target_node}
{end if}
(Omit this section entirely if nothing noteworthy.)
---
## Release PR Template
Apply this template when `$ARGUMENTS` contains "release". Typically used for `{default-base} → {release-base}` integration.
Collect all merged PRs since the last release:
gh pr list --state merged --base {default-base} --limit 30 --json number,title --jq '.[] | "- #(.number) (.title)"'
Title format: `Release: {default-base} → {release-base} 통합 (vX.Y.Z)`
```markdown
## 개요
{Release summary — what this release includes}
> ⚠️ **배포 공지**: {Deployment impact notice — migration steps if any}
## 주요 변경사항
### 1. {Feature/Fix name}
- {Key change}
- {Key change}
- 관련 PR: #{PR number}
### 2. {Feature/Fix name}
- {Key change}
- 관련 PR: #{PR number}
{if -g flag set AND relationships found:}
## 변경 흐름
```mermaid
flowchart LR
subgraph {module_name}[{Module Display Name}]
{file_node_id}[{filename}]
end
{source_node} -->|{relationship_label}| {target_node}
{end if}
(Omit this section entirely if nothing noteworthy.)
---
## Task
1. **Resolve base branch** following the "Determine Base Branch" rules above.
2. Determine PR type: Release (if `$ARGUMENTS` contains "release") or Individual.
3. Sync check before pushing:
- `git fetch origin {base-branch}`
- If the local branch is behind, inform the user and suggest an appropriate action (rebase, merge, or proceed as-is).
### If Individual PR:
4. Push the branch if not already pushed: `git push -u origin {branch-name}`. If push fails due to permission denied, run `gh repo fork --remote` and retry the push. If forking fails, inform the user with the specific error and stop. If push fails for other reasons, inform the user with the specific error and stop.
5. Ensure the type label exists: `gh label create "{type_label}" --color "{hex}" 2>/dev/null || true`
6. Draft the PR title and body using the Individual PR Template, and create the PR: `gh pr create --base {base-branch} --assignee @me --label "{type_label}" --title "..." --body "$(cat <<'EOF' ... EOF)"`. If the command fails due to `--assignee` or `--label` permissions, retry without those flags **and explicitly notify the user which flag(s) were dropped and why, so they can add the assignee/label manually if needed**. Follow the session's tool permission settings for approval.
7. Return the PR URL. Include a one-line note: **Base branch: `{base-branch}`** — {reason} (e.g., "CLAUDE.md Branch Strategy 설정에 따라 결정" or "origin/dev에서 분기한 브랜치로 감지").
### If Release PR:
4. **Determine version:**
a. Check `$ARGUMENTS` for an explicit version (e.g., `/pr release v1.2.0`).
b. If not provided, detect the current version from the project:
- Read the project's CLAUDE.md for release process instructions or version conventions.
- Search for version sources: `package.json`, `pyproject.toml`, `Cargo.toml`, `marketplace.json`, or similar files that already exist in the project.
- Check recent git tags: `git tag --sort=-v:refname | head -5`
c. Analyze included changes (via merged PR titles or commit messages) and recommend a semver bump:
- Breaking changes → major
- New features (`Feat:`, `feat:`) → minor
- Fixes, refactors, docs, etc. → patch
d. Present the detected current version, the recommended next version, and the reasoning to the user. Confirm before proceeding.
5. **Pre-release file updates (conditional):**
a. If the project's CLAUDE.md defines a release process → follow it exactly.
b. Otherwise, scan for files that commonly hold version or release info and propose updates for **only files that already exist in the project**. Do NOT create new files.
- Version files (`package.json`, `pyproject.toml`, `marketplace.json`, etc.) → bump version
- `CHANGELOG.md` or similar → add release entry based on included changes
c. After making changes, show the user a summary of what was updated (files changed, old → new values).
d. Commit the changes using the project's commit convention (fall back to `chore: release vX.Y.Z` if no convention is found).
6. Push the branch: `git push -u origin {branch-name}`. If push fails due to permission denied, run `gh repo fork --remote` and retry. If forking fails, inform the user with the specific error and stop. If push fails for other reasons, inform the user with the specific error and stop.
7. Ensure the type label exists: `gh label create "release" --color "1d76db" 2>/dev/null || true`
8. Draft the PR title and body using the Release PR Template, and create the PR: `gh pr create --base {base-branch} --assignee @me --label "release" --title "..." --body "$(cat <<'EOF' ... EOF)"`. If the command fails due to `--assignee` or `--label` permissions, retry without those flags **and explicitly notify the user which flag(s) were dropped and why, so they can add the assignee/label manually if needed**. Follow the session's tool permission settings for approval.
9. Return the PR URL. Include a one-line note: **Base branch: `{base-branch}`** — {reason}. Also provide **post-merge guidance** — list the following as next steps the user should perform after merging:
- Create and push a git tag: `git tag vX.Y.Z && git push origin vX.Y.Z`
- Create a GitHub Release: `gh release create vX.Y.Z --generate-notes`
- Sync the source branch back with the base branch (e.g., `git checkout {default-base} && git merge {release-base} && git push origin {default-base}`)
- Any project-specific deployment steps described in the project's CLAUDE.md
**Important:**
- Do NOT modify commit history (squash, rebase, amend, reorder) before pushing unless the user explicitly requests it. Preserve all commits to maintain traceable context for agents and reviewers.
- For Release PRs, automatically collect all included PRs from the merge history.
- Adapt section headers and content language to the project's CLAUDE.md language setting.
- Do NOT create files that don't already exist in the project. Only update existing files.
- Always prioritize the project's own conventions and release process over the defaults above.
- **Assignee / Label**: Always include `--assignee @me` and `--label "{type_label}"` in `gh pr create`. If either flag fails due to insufficient permissions, retry without the failing flag(s) and explicitly notify the user which flag(s) were dropped and why, so they can add the assignee/label manually if needed.
- **Commit references**: Never wrap commit SHAs in backticks (e.g., `` `abc1234` ``). Backtick-wrapped SHAs render as inline code and are not clickable on GitHub. Use plain text (GitHub auto-links SHAs) or explicit markdown links: `[{short_sha}](https://github.com/{owner}/{repo}/commit/{sha})`.
development
Review PR comments, discuss improvements, and reply with resolution status. TRIGGER when: user asks to review PR feedback, check review comments, address reviewer suggestions, or handle code review (e.g., "리뷰 확인해줘", "review comments", "피드백 반영해줘"). DO NOT TRIGGER when: user is creating PRs, committing, or performing git operations without review intent.
documentation
Create a GitHub issue following project conventions with auto-labeling. TRIGGER when: user asks to create an issue, report a bug, request a feature, file a ticket, or track work (e.g., "이슈 만들어줘", "버그 리포트", "feature request", "이거 이슈로 만들어줘"). DO NOT TRIGGER when: user is viewing, listing, or commenting on existing issues without intent to create a new one.
development
Generate a copy-ready handoff prompt for transferring work context to a new session. TRIGGER when: user asks to hand off work, create a handoff prompt, transfer context, wrap up session, prepare for next session (e.g., "handoff 해줘", "다음 세션으로 넘겨줘", "작업 이관해줘", "handoff prompt 만들어줘"). DO NOT TRIGGER when: user is committing, creating PRs, reviewing code, or performing other git operations without handoff intent.
testing
Create a git commit following project conventions. TRIGGER when: user asks to commit, create a commit, stage and commit, save changes, or any workflow that includes committing (e.g., "commit and push", "commit and create PR", "커밋해줘", "커밋하고 푸시"). DO NOT TRIGGER when: user is only checking git status/diff without intent to commit.