Link Ticket To Session
JayantDevkar/claude-code-karma
Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma.
Create a GitHub pull request from the current branch. An agent skill from wanteddev/montage-web.
$ npx skills add wanteddev/montage-web --skill create-pr -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install wanteddev/montage-web create-pr --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/create-pr .claude/skills/create-pr && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .claude/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-prType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add wanteddev/montage-web --skill create-pr -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install wanteddev/montage-web create-pr --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/create-pr .agents/skills/create-pr && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .agents/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wanteddev/montage-web --skill create-pr -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install wanteddev/montage-web create-pr --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/create-pr .cursor/skills/create-pr && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .cursor/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/wanteddev/montage-web.git --path .claude/skills/create-pr--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add wanteddev/montage-web --skill create-pr -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install wanteddev/montage-web create-pr --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/create-pr .gemini/skills/create-pr && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .gemini/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install wanteddev/montage-web create-prInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add wanteddev/montage-web --skill create-pr -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/create-pr .github/skills/create-pr && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .github/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wanteddev/montage-web --skill create-pr -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install wanteddev/montage-web create-pr --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/create-pr .opencode/skills/create-pr && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "create-pr" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude/skills/create-pr into .opencode/skills/create-pr/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "create-pr", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
create-prCreate a GitHub pull request from the current branch. An agent skill from wanteddev/montage-web.
Create PR is an agent skill from wanteddev/montage-web. Create a GitHub pull request from the current branch. Handles uncommitted/unpushed changes by asking the user before committing, always self-assigns, attaches a semver release milestone derived from lerna.json (creating it if missing) for release-relevant PRs and skips the milestone for release-irrelevant PRs (docs-only / .claude/ / root-meta changes), and enriches the PR description with Jira issue details when the branch name contains an issue ID like PROJ-123. Use this skill whenever the user says "PR 만들어줘"…
Its SKILL.md is about 6.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Pull requests and Project management. It works with Jira and GitHub. The repository describes itself as: 🎨 Wanted Web Design System - Montage. The licence is MIT.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 58f924f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghnodejqFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Create PR loads about 6.8k tokens when it runs. Until then it costs about 171 tokens; SKILL.md has 3,100 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
s by name. Wildcards routinely sweep up `.env`, credentials, and stray build artifacts.Skip anything that looks like a secret (`.env*`, `credentials*`, `*.pem`).Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from wanteddev/montage-web at commit 58f924f, republished under its MIT licence (© wanteddev). 3,100 words, ~6,828 tokens.
.claude/skills/create-pr/SKILL.md (or your agent's skills folder).A workflow for opening a GitHub pull request from the current branch with sensible defaults: confirm-before-commit, push if needed, self-assign, and Jira-enriched description.
These are non-negotiable. Build the workflow around them.
--assignee @me. Unassigned PRs sit in review queues invisibly because reviewers filter by assignee.<major>.<minor>.<patch>) computed from lerna.json; the milestone is what release tooling and the changelog generator key off, and an unmilestoned package PR is invisible to the release. Exception: PRs whose entire diff is release-irrelevant (docs-only, .claude/ environment files, root-level meta files like AGENTS.md / CLAUDE.md) do not produce a published package version and must not carry a milestone — attaching one would pollute the release notes with non-shipping changes. See step 8 for the classifier.main/master — abort and ask the user to switch to a feature branch.--no-verify to skip hooks. If a hook fails, surface the error and let the user decide.git add -A / git add . — stage files by name. Wildcards routinely sweep up .env, credentials, and stray build artifacts.Co-Authored-By: Claude ... trailer. This is required by the top-level system instructions and is easy to forget when copying the heredoc template — surface it explicitly here. See step 3 for the exact format.Run these in parallel — they're independent:
git rev-parse --git-dir # confirm git repo
gh auth status # confirm gh CLI auth
git rev-parse --abbrev-ref HEAD # current branch
git status --porcelain # uncommitted changes
git log --oneline -10 # recent commit style
git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null # upstreamIf any precondition fails (not a repo, not authed, on main/master, branch has zero commits ahead of base), stop and explain — don't try to recover silently.
gh pr view --json url,state,title 2>/dev/nullIf one exists and is open, show the URL and ask whether the user wants to update its description, leave a comment, or push more commits. Don't create a duplicate.
If git status --porcelain is non-empty:
Show the user a concise summary (file list with M/A/D/?? markers).
Ask explicitly: "다음 변경사항을 모두 커밋하고 PR을 생성할까요?" — list the files. Wait for an answer.
If the user says yes:
Run git diff and git diff --cached to understand what's changing.
Read recent commits (git log --oneline -10) to match the repo's style — this codebase uses Conventional Commits (feat(scope): ..., fix(scope): ..., chore: ...).
Draft a commit message that focuses on why, not what. One subject line, optional body.
Stage files by name (never -A / .). Skip anything that looks like a secret (.env*, credentials*, *.pem).
Commit with a heredoc to preserve formatting. The trailing Co-Authored-By: trailer is mandatory — it's required by the top-level system instructions and is easy to forget when copying this template. Put it as the last line, separated by a blank line so git's trailer parser picks it up. Use the model you actually are right now — read your own model name/version from the runtime environment (the system prompt surfaces it) and substitute it into <your-model-name> below. Do not copy a hardcoded model from this example.
git commit -m "$(cat <<'EOF'
feat(scope): short subject
Optional body explaining why.
Co-Authored-By: <your-model-name> <noreply@anthropic.com>
EOF
)"If a pre-commit hook fails, fix the underlying issue and create a new commit. Never --amend to dodge the failure (the failed commit didn't happen, so amend would rewrite the previous one).
If the user says no, ask: "이미 커밋된 변경사항만으로 PR을 생성할까요, 아니면 중단할까요?"
git push -u origin <branch>git push--force without explicit user confirmation.Apply this regex to the current branch: [A-Z][A-Z0-9]+-\d+
The ideal branch pattern in this repo is feature/<git-username>/<JIRA-ID> (e.g. feature/sh031224/PI-82494). Other shapes still match: feat/PROJ-123-add-thing, PROJ-123_fix_bug, bugfix/PROJ-123. The recognized Jira project keys are PI, FE, DP, DEF, LIVE, WRP — see workflow.md.
mcp__plugin_atlassian_atlassian__getJiraIssue in available tools), fetch the issue. Extract: summary, status, issue type, assignee, and the first paragraph of the description (skip if the description is empty or noisy).Don't silently proceed. The repo's commit-msg hook warns on every commit when a feature/* branch lacks a Jira ID, and release notes lose context without a ticket link. Before opening the PR, surface this and recommend creating a Jira ticket first:
"현재 브랜치(
<branch>)에 Jira 이슈 ID가 없습니다. 이 repo는feature/<username>/<JIRA-ID>패턴이 표준이라, PR 열기 전에 Jira 티켓을 먼저 만드는 걸 추천드려요.
atlassian:triage-issue스킬로 티켓을 만들거나, 직접 Jira에서 만든 뒤- 새 브랜치
feature/<username>/<JIRA-ID>로 cherry-pick / rebase 해서 다시 시도그래도 지금 PR을 그대로 진행할까요? (typo fix 같은 throwaway 변경이면 OK)"
Wait for the user's answer:
atlassian:triage-issue or let them do it manually. Don't try to rename the branch yourself; cherry-picking onto a freshly named branch is their call.feature/* branch shape (e.g. fix/..., docs/...) where the hook doesn't warn → the recommendation is softer; mention it once but don't block.The PR title must be Conventional Commits format — <type>(<scope>): <subject> (or <type>: <subject> if no scope, <type>!: for breaking). This is non-negotiable: PRs are squash-merged here, so the PR title becomes the merged commit message, which lerna parses to compute the version bump and generate the changelog. A non-conventional title silently breaks both. commitlint enforces it on commits but not on PR titles, so this skill is the gate.
Allowed types (matching the existing repo history): feat, fix, chore, docs, refactor, perf, test, style, build, ci. Common scopes are package names (core, engine, icon, theme, ci) — check git log --oneline -20 to match what's in use.
How to derive the title:
! / BREAKING CHANGE → <type>!:, any feat → feat:, otherwise pick the dominant type.feat/PROJ-123-add-modal → feat: add modal. Don't copy a non-conventional commit subject into the PR title — fix it.Validate the final title against the regex roughly as ^(feat|fix|chore|docs|refactor|perf|test|style|build|ci)(\([a-z0-9-]+\))?!?: .+$ before passing it to gh. If it doesn't match, fix it — don't ship a malformed title.
The Jira ID does not belong in the title (Conventional Commits has no slot for it and prefixing breaks the regex). Keep it in the body.
Template:
## Summary
- <bullet derived from commits / diff>
- <one bullet per logical change>
## Jira
[PROJ-123](https://your-domain.atlassian.net/browse/PROJ-123) — <issue summary>
- Status: <status>
- Type: <type>
<first paragraph of issue description, if useful>
## Test plan
- [ ] <derived from what changed — UI changes get a manual check, logic gets test coverage notes>Drop the Jira section entirely if no ticket was found. Drop Test plan items if the change is trivial (typo fix, dep bump) — don't pad with filler checkboxes.
For the Summary, look at git log <base>..HEAD --oneline and the cumulative diff — not just the latest commit. Multi-commit branches need a unified summary.
The PR must be attached to a semver milestone (<major>.<minor>.<patch>) — unless it has zero release impact, in which case it must not carry one. Run the classifier first.
Inspect the cumulative diff on this branch:
BASE=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null \
|| gh repo view --json defaultBranchRef -q .defaultBranchRef.name)
git diff --name-only "origin/$BASE...HEAD"The PR is release-irrelevant (skip the milestone entirely — do not run 8a–8e, and omit --milestone in step 9) when every changed path matches one of:
docs/** (the docs site package — not published).claude/** (Claude Code environment: settings, hooks, skills, references, scripts)AGENTS.md, CLAUDE.md, README.md, .gitignore, .editorconfig, .prettierrc*, .eslintrc* (and similar tooling configs that don't ship inside any package)If any changed path falls outside that set — especially anything under packages/<pkg>/src/**, packages/<pkg>/package.json, or lerna.json — the PR is release-relevant and must follow the normal milestone flow (8a–8e).
When you classify a PR as release-irrelevant, briefly say so to the user before creating it: "이 PR은 docs/.claude 변경만 있어서 배포 영향이 없으므로 마일스톤 없이 생성할게요." This lets them correct you if they actually wanted a release.
When in doubt — mixed diff, or a single suspicious file in packages/** — treat it as release-relevant and ask if it should be split.
If release-irrelevant, skip to step 9. Otherwise continue with 8a.
node -p "require('./lerna.json').version" # or: cat lerna.json | jq -r .versionThis returns something like 3.5.0. If lerna.json is missing or the version is malformed, abort and tell the user — don't guess.
Inspect the commits on this branch (git log <base>..HEAD --pretty=%s) and apply Conventional Commits rules:
| Highest-impact commit on branch | Bump |
|---|---|
Any commit with ! (e.g. feat!:) or BREAKING CHANGE: | major |
Any feat: / feat(scope): | minor |
Otherwise (fix, perf, refactor, docs, chore, …) | patch |
Use the highest bump any single commit triggers — one breaking change wins over ten fix commits.
If the bump type is genuinely ambiguous (mixed commit types where the impact isn't clear, or non-conventional messages), ask the user: "이 PR을 patch / minor / major 중 어디로 릴리즈할까요? (현재 버전: 3.5.0 → patch=3.5.1, minor=3.6.0, major=4.0.0)"
From <major>.<minor>.<patch>:
<major>.<minor>.<patch + 1><major>.<minor + 1>.0<major + 1>.0.0Examples (current version 3.5.0): patch → 3.5.1, minor → 3.6.0, major → 4.0.0.
OWNER_REPO=$(gh repo view --json owner,name -q '.owner.login + "/" + .name')
# List existing open milestones
gh api "repos/$OWNER_REPO/milestones?state=open" --jq '.[].title'If the target version is not in that list, create it:
gh api -X POST "repos/$OWNER_REPO/milestones" -f title="3.6.0"Don't create milestones speculatively for the other bump types — only the one this PR ships under.
feature/<version> base branchThis sub-step only runs when the bump type is major. Skip it for patch/minor.
Major releases never merge straight into main. They live on a long-running branch named feature/<major>.<minor>.<patch> (e.g. feature/4.0.0) so breaking changes can pile up safely while main keeps shipping the current major. The PR's base branch must be that major branch.
Run these checks:
TARGET_VERSION="4.0.0" # from step 8c
MAJOR_BRANCH="feature/$TARGET_VERSION"
CURRENT_BASE=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null \
|| gh repo view --json defaultBranchRef -q .defaultBranchRef.name)
# Does the major branch exist on the remote?
git ls-remote --exit-code --heads origin "$MAJOR_BRANCH" >/dev/null 2>&1Then branch on the result:
Major branch doesn't exist on the remote → stop and warn:
"이 PR은 major 버전 bump (4.0.0) 으로 판단됐는데
feature/4.0.0브랜치가 원격에 없습니다. 정말 major 작업이 맞나요?
- 정말 major면: 먼저
git checkout main && git pull && git checkout -b feature/4.0.0 && git push -u origin feature/4.0.0으로 major 브랜치를 만든 다음, 현재 브랜치를git rebase feature/4.0.0로 그 위에 다시 올리고 PR을 다시 시도해주세요.- major가 아니라면 (실수로
feat!:/BREAKING CHANGE:가 들어간 거면) 커밋 메시지를 정정해서 minor/patch 로 다시 판정되게 해주세요."
Wait for the user — never auto-create the major branch yourself, since that's a release-management decision the user owns.
Major branch exists, but the PR's base is main/default branch → stop and warn:
"major bump (4.0.0) 인데 base 브랜치가
main입니다. major 작업은feature/4.0.0위로 올라가야 합니다. 다음 둘 중 하나로 진행해주세요:
- 정말 major:
git fetch origin && git rebase origin/feature/4.0.0후 다시 PR (또는gh pr create --base feature/4.0.0 ...)- 사실 major 아님: 커밋 메시지에서
!/BREAKING CHANGE:를 제거해 minor/patch 로 다시 판정"
Wait for confirmation. If the user confirms it's really major, prefer rebasing locally onto the major branch over just changing --base — rebasing surfaces conflicts with the in-progress major work now instead of at merge time.
Major branch exists AND base is already feature/<version> → proceed to step 8f.
The point of this gate is to prevent breaking changes from leaking into the current major's release line. Don't skip it just because the user is in a hurry — a misrouted major PR is much more expensive to clean up after merge than the 30 seconds of friction here.
MIGRATION.mdThis sub-step only runs when the bump type is major. Skip it for patch/minor.
Major releases ship breaking changes, and this repo documents every breaking change in the root MIGRATION.md so consumers can upgrade without spelunking through the changelog. The file is organized strictly by version, then by topic:
## <major>.<minor>.<patch> ← H2: target version (e.g. `## 4.0.0`)
### <Component / Area> ← H3: per-change topic (e.g. `### Modal`, `### 패키지명 변경`)
<AS-IS / TO-BE explanation, codemod command, manual steps, etc.>Before creating the PR, ask the user:
"이 PR은 major bump(
<target-version>)으로 판단됐는데, 소비자가 업그레이드할 때 손볼 게 있는 변경인가요? 있다면MIGRATION.md에 가이드를 추가할게요. (예: API 시그니처 변경, prop 제거/이름 변경, 기본 동작 변경, 패키지명 변경 등 — codemod로 자동화 못 하는 사용자 작업이 1줄이라도 있으면 'yes')"
Branch on the answer:
마이그레이션 필요 없음 (순수 내부 리팩터, 의존성 정리만, 사용자 영향 없는 변경) → 그대로 step 9로 진행. MIGRATION.md는 건드리지 않는다.
마이그레이션 필요 → 사용자에게 변경 내용을 간단히 받아 (이미 대화 맥락에 있으면 그걸로 충분) MIGRATION.md 에 항목을 추가한다.
작성 규칙 — 위계를 정확히 지킨다:
# Migration Guide H1 이 이미 있다. 새로 만들지 말 것.## <target-version> H2 섹션이 이미 있으면 그 섹션 안에 새로운 ### <Topic> 을 append. 같은 컴포넌트/주제의 H3 가 이미 있으면 그 안에 내용을 합치거나 sub-bullet 으로 정리.## <target-version> 블록을 새로 만든다. 버전 순서는 내림차순 (최신이 위) 이 컨벤션이다.파일 편집 후:
MIGRATION.md 한 파일만 staged 해서 별도 커밋을 만든다 — 컨벤션 그대로 docs(migration): document <target-version> breaking changes for <area> 같은 형식, 그리고 step 3 의 Co-Authored-By: trailer 규칙을 동일하게 적용.git push 로 원격에 반영한 뒤 step 9 로 진행.사용자가 변경 내용을 글로 풀어주기 어려워하면, 이 브랜치의 commit 메시지와 diff 를 기반으로 1차 초안을 만들어 보여주고 거기서 다듬는 방향으로 진행한다.
gh pr create \
--title "..." \
--body "$(cat <<'EOF'
...body here...
EOF
)" \
--assignee @me \
--milestone "3.6.0" \
# for major bumps only — base must be the major branch:
# --base "feature/4.0.0"--assignee @me is always mandatory. --milestone <version> is mandatory for release-relevant PRs and must be omitted for release-irrelevant ones (the docs-only / .claude/ / root-meta classification from step 8.0). For major bumps, also pass --base feature/<version> (the major branch you validated in step 8e); for patch/minor or release-irrelevant PRs, omit --base and let gh use the default.
If the branch is clearly still in progress (commit messages like "wip", "fixup", or the user mentioned it's not ready), pass --draft as well.
Print the PR URL the gh command returned. That's it — no summary recap.
| Situation | Behavior |
|---|---|
| Detached HEAD | Abort. Ask the user to checkout a branch. |
On main/master | Abort. Tell user to create a feature branch. |
| Zero commits ahead of base | Abort. Nothing to PR. |
| PR already open for branch | Show URL, ask what they want to do. Don't duplicate. |
| Push rejected (non-fast-forward) | Surface error, ask before resolving. Never auto --force. |
| Pre-commit hook fails | Fix root cause, create new commit. Never --no-verify. |
| Jira ticket inaccessible / MCP unavailable | Include bare [PROJ-123] reference in body, don't block. |
Branch has Jira-looking string but it's not really a ticket (e.g. RFC-2119) | Try fetching; if 404, fall back gracefully. |
| Multiple Jira IDs in branch | Use the first match; mention others in the body if relevant. |
lerna.json missing or version unparseable | Abort only if the PR is release-relevant. If the diff is docs-only / .claude/ / root-meta, no milestone is needed so lerna.json doesn't matter. |
Diff is entirely under docs/, .claude/, or root meta files (AGENTS.md, CLAUDE.md, README.md, tooling configs) | Skip the milestone (steps 8a–8e and --milestone in step 9). Tell the user "배포 영향이 없어 마일스톤 없이 생성합니다." before opening. |
Mixed diff — some release-relevant files plus some docs/.claude/ files | Treat as release-relevant (the package files determine the bump). Optionally suggest splitting into two PRs if the docs/.claude portion is unrelated. |
| Bump type ambiguous (mixed commit types, non-conventional messages) | Ask the user explicitly; don't guess. |
| Target milestone already exists | Reuse it. Don't create a duplicate. |
| Milestone create fails (permissions / race) | Surface the error and stop — don't open the PR unmilestoned. |
Major bump but feature/<version> branch missing on remote | Stop. Warn user, confirm "정말 major 작업?", recommend creating the major branch from main and rebasing. Never auto-create the major branch. |
Major bump but PR base is main/default | Stop. Warn, confirm intent, recommend git rebase origin/feature/<version> (or fix commit messages if it's actually not major). |
| Major bump confirmed and base is correct | Pass --base feature/<version> to gh pr create. |
Visual regression snapshots are taken in GitHub Actions — local environments produce different pixels (font rendering, anti-aliasing) so you can't update them from your machine. If CI's visual test job fails on the PR:
Open the failing job's artifacts and confirm the rendering diff is intentional.
If it is, run the snapshot-update workflow against the PR branch:
gh workflow run visual-test-update.yml --ref <branch-name>This regenerates snapshots inside CI and commits them back to the branch. Pull the new commit before pushing more changes.
If the diff is not intentional, don't update the snapshots — fix the underlying regression in the component/style.
See workflow.md › Visual regression tests for the longer explanation.
main. Conversely, attaching a milestone to a PR that ships nothing (docs-only, .claude/ env changes, root meta) inflates the changelog with non-shipping entries — so those PRs intentionally omit the milestone.feature/<version> base branch: breaking changes that land on main immediately go out to every consumer on the next patch — there's no way to stage them. The feature/<version> branch is the staging area where breaking changes accumulate until the major release is intentional. Letting one major PR slip onto main corrupts the entire current major's release line.--force, no --no-verify, no git add -A: each shortcut has a real way to lose work or leak secrets. The friction is the feature.© wanteddev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/create-pr of wanteddev/montage-web.
Open the folder on GitHubat commit 58f924f
Create PR next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Create PR this skillwanteddev/montage-web | 117 | — | ~6.8k | Automated safety check: Notes | MIT | |
| Link Ticket To SessionJayantDevkar/claude-code-karma | 329 | — | ~1.8k | Automated safety check: Notes | Apache-2.0 | |
| Dynamo PR DescriptionDynamoDS/Dynamo | 2k | — | ~880 | Automated safety check: Pass | Apache-2.0 | |
| Adhoc PRshopsys/shopsys | 350 | — | ~2.3k | Automated safety check: Pass | Custom licence | |
| Code Reviewsortie-ai/sortie | 196 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Review Release Noteschef/chef-web-docs | 143 | — | ~5.2k | Automated safety check: Pass | Custom licence |
JayantDevkar/claude-code-karma
Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma.
DynamoDS/Dynamo
Generate PR descriptions for Dynamo that align with the team template section names and order.
shopsys/shopsys
Ad-hoc Pull Request Publisher — commits the current changes, pushes the branch, opens a GitHub pull request against the repository's default branch, and creates a matching SSP Jira issue in the…
sortie-ai/sortie
Reviews pull requests in this repository for the defect classes a mechanical checklist misses: documentation that outlived the code it describes, reaction and retry state that leaks or clobbers a…
chef/chef-web-docs
Read a release notes file and edit it using Jira release data and GitHub pull requests as co-equal, optional sources.
yonatangross/orchestkit
Creates GitHub pull requests with pre-flight validation, conventional title formatting, and structured summary generation.
wanteddev/montage-web
This skill should be used when the user asks to create a new Montage migration skill for the montage-web-migration plugin (e.g.
wanteddev/montage-web
Guide for building UI with Montage (Wanted Design System) in React/Next.js projects.
wanteddev/montage-web
Sync icons from the Figma file into icon and open a PR by dispatching the figma-icon-sync-code-connect.yml GitHub Actions workflow.
Categories
Create a GitHub pull request from the current branch. An agent skill from wanteddev/montage-web. Create PR is an agent skill from wanteddev/montage-web. Create a GitHub pull request from the current branch.
Create PR fits situations like: the user says PR 만들어줘; create a pull request; signals theyre ready to ship the current branch — even if they dont explicitly say PR.
Run `npx skills add wanteddev/montage-web --skill create-pr -a claude-code`. Or copy the skill folder (.claude/skills/create-pr in wanteddev/montage-web) into .claude/skills/create-pr in your project. Claude Code loads it when a task matches its description.
Run `npx skills add wanteddev/montage-web --skill create-pr -a codex`. Or copy the skill folder (.claude/skills/create-pr in wanteddev/montage-web) into .agents/skills/create-pr in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add wanteddev/montage-web --skill create-pr -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/create-pr, .gemini/skills/create-pr, .github/skills/create-pr and .opencode/skills/create-pr in your project.
Going by SKILL.md and its folder, Create PR needs the command-line tools its instructions call (git, gh, node and jq).
SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Create PR is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.8k tokens (SKILL.md is roughly 27k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Create PR: Link Ticket To Session (JayantDevkar/claude-code-karma, 329 stars), Dynamo PR Description (DynamoDS/Dynamo, 2k stars), Adhoc PR (shopsys/shopsys, 350 stars) and Code Review (sortie-ai/sortie, 196 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
wanteddev (a GitHub organization) maintains it in wanteddev/montage-web, which has 117 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 8, 2026.
Source: wanteddev/montage-web on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.