Creates a release PR, bumps versions, and drafts releases on GitHub.
Install
mkdir -p .claude/skills/ship-hta218 && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/17576" && unzip -o skill.zip -d .claude/skills/ship-hta218 && rm skill.zipInstalls to .claude/skills/ship-hta218
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Create a release PR to main with version bump and draft a GitHub releaseKey capabilities
- →Collect all changes since main branch
- →Detect versioning scheme (Semver or Calendar)
- →Bump project version in package.json
- →Commit version bump and lock file updates
- →Create a pull request to main with a summarized changelog
- →Draft a GitHub release with grouped changes
How it works
The skill automates the release process by collecting changes, detecting the versioning scheme, bumping the project version, and creating a pull request to the main branch. It also drafts a GitHub release with a summarized changelog.
Inputs & outputs
When to use ship
- →Shipping a new software version
- →Automating release PR generation
- →Versioning project releases
About this skill
Create a pull request from the current working branch to main, ensure the version is bumped, and draft a GitHub release. The user will review, merge, and publish manually.
Usage
/ship— auto-detect versioning scheme and walk through the process/ship 2.5.0— use a specific version/ship patch— shorthand for semver bump type
Process
Step 1: Preflight checks
Run these commands in parallel to understand the current state:
git status
git branch --show-current
git log main..HEAD --oneline
gh auth status
Verify:
- There are no uncommitted changes. If there are, warn the user and stop.
- The current branch is NOT
main. If it is, warn the user and stop. - There is at least one commit ahead of
main. If not, inform the user there is nothing to ship. ghCLI is authenticated. If not, inform the user and stop.
Step 2: Collect all changes since main
git log main..HEAD --pretty=format:"%h %s (by @%an)" --no-merges
Also gather PR numbers if commits came from merged PRs:
git log main..HEAD --pretty=format:"%h %s" --no-merges
For each commit, check if it is associated with a PR:
gh api repos/{owner}/{repo}/commits/{sha}/pulls --jq '.[0].number' 2>/dev/null
Build a list of all changes with their authors and references (commit hash or PR number).
Step 3: Check version and detect versioning scheme
Read the current version from package.json:
node -p "require('./package.json').version"
Detect the versioning scheme:
| Scheme | Pattern | Examples |
|---|---|---|
| Semver | MAJOR.MINOR.PATCH | 2.5.0, 1.0.3, 0.9.1 |
| Calendar versioning | Contains year/month/date-like segments | 2026.3.18, 25.03.1 |
If $ARGUMENTS provides a version or bump type, use it:
- Exact version (e.g.,
2.5.0) — use as-is - Bump type (
major,minor,patch) — calculate the next version from current
If $ARGUMENTS does not specify a version, check if the version was already bumped compared to main:
git show main:package.json | node -p "JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')).version"
- If the version is the same as
main, a bump is required — ask the user (see below). - If the version is already different from
main:- Semver: the version is already bumped. Use the current version and skip to Step 4.
- Calendar versioning: the version may be stale (bumped days or weeks ago). Always ask the user to confirm — see the calver prompt below.
For semver (when bump is needed), present the options:
Current version:
2.4.1What version bump do you need?
- patch ->
2.4.2(bug fixes, small changes)- minor ->
2.5.0(new features, backward compatible)- major ->
3.0.0(breaking changes)
For calendar versioning (always ask, even if already different from main):
Current version:
2025.12.3Today's date version:2026.3.18(Recommended) Use today's date as the version, keep current (2025.12.3), or enter a custom one?
If the user picks today's date, update the version. If they choose to keep the current version, skip the bump. If they enter a custom version, use that.
Step 4: Apply version bump
If a version bump is needed (version same as main, or calver and user chose a new version):
Update package.json with the new version. Use a precise edit — only change the "version" field.
Then re-install dependencies to update the lock file:
ni
Commit the version bump:
git add package.json
Also stage the lock file (package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lockb — whichever exists)
git add package-lock.json pnpm-lock.yaml yarn.lock bun.lockb 2>/dev/null git commit -m "Bump version to <new-version>"
Push the branch:
git push -u origin $(git branch --show-current)
Step 5: Create the PR to main
Build the PR title using the version and a summary of changes:
Title format: v<version> - <short summary of changes>
The short summary should capture the main themes from the changes (features, fixes, optimizations). Keep it under 72 characters total. Examples:
v2.5.0 - Add dark mode, fix cart calculation, optimize image loadingv2026.3.18 - Redesign settings page, update dependencies
Build the PR body by grouping changes into categories:
## What's in this release
### New features
- Add dark mode toggle (#45)
- Add user onboarding flow (#52)
### Bug fixes
- Fix cart total when discount applied (#48)
- Fix null pointer in auth middleware (a1b2c3d)
### Improvements
- Optimize image loading for product pages (#50)
- Refactor payment utils for reusability (#51)
### Other
- Update dependencies (d4e5f6g)
Grouping rules:
- Scan each change's commit message or PR title to determine the category
- Features: new functionality, "add", "implement", "introduce"
- Bug fixes: "fix", "resolve", "correct", "patch"
- Improvements: "optimize", "refactor", "improve", "update", "enhance", "clean up"
- Other: anything that does not fit the above (config, docs, chore, deps)
- Skip empty categories
- Each item references either
#<PR-number>or<short-commit-hash>depending on what is available
Create the PR:
gh pr create
--base main
--head "$(git branch --show-current)"
--title "v<version> - <short summary>"
--body "$(cat <<'EOF'
<the grouped changelog body from above>
EOF
)"
Step 6: Draft a GitHub release
Create a draft release targeting main with tag v<version>.
Build the release body. List all changes, each in this format:
<description of change> by @<author> in #<PR-number>
or if no PR exists for that change:
<description of change> by @<author> at <commit-hash>
Rules for the release body:
- Use simple English, no emojis
- Remove duplicate entries (same change appearing in multiple commits)
- Skip trivial changes (typo fixes, formatting-only, merge commits)
- Group by category (same groups as the PR body) if there are more than 10 items
- If 10 or fewer items, a flat list is fine
- Each line starts with a capital letter
- Add a "New Contributors" section at the end if there are first-time contributors to the repo (check with
gh api)
gh release create "v<version>"
--target main
--title "v<version>"
--draft
--notes "$(cat <<'EOF'
What's Changed
- Add dark mode toggle by @hta218 in #45
- Fix cart total calculation when discount is applied by @dev2 in #48
- Optimize image loading for product pages by @hta218 in #50
- Update dependencies by @hta218 at a1b2c3d
Full Changelog: https://github.com/<owner>/<repo>/compare/v<prev-version>...v<version> EOF )"
Always append a "Full Changelog" link at the bottom comparing the previous version tag to the new version.
Step 7: Summary
Output a final summary:
Ship complete!
Version: v<version> PR: <pr-url> Release: <release-url> (draft)
Next steps:
- Review the PR: <pr-url>
- Review the release: <release-url>
- Merge the PR
- Publish the release
Error Handling
- If
ghCLI is not installed or not authenticated, inform the user and stop - If there are uncommitted changes, warn and stop — do not auto-commit
- If already on
main, warn the user and stop - If no commits ahead of
main, inform the user there is nothing to ship - If
package.jsondoes not exist, skip version bump logic and ask the user for a version string to use in the PR title and release tag - If
nifails, show the error and ask the user if they want to continue without updating the lock file - If PR creation fails (e.g., PR already exists), show the error and provide the URL to the existing PR
- If release creation fails, show the error but still report the PR as successful
- If push fails, show the error and let the user resolve it
Important Notes
- This command does NOT merge the PR or publish the release — the user does that manually
- The release is always created as a draft
- The PR targets
mainunless the user specifies otherwise via arguments - Use
ni(notnpm installorpnpm install) to re-install — it auto-detects the package manager - Do NOT create a git tag locally — the tag is created by GitHub when the release is published
- Keep the PR title concise but descriptive — it becomes the merge commit message
User Arguments
$ARGUMENTS
When not to use it
- →When the current branch is `main`
- →When `gh` CLI is not installed or authenticated
Prerequisites
Limitations
- →Does not merge the PR or publish the release automatically
- →Requires `gh` CLI to be installed and authenticated
- →Cannot proceed if there are uncommitted changes
How it compares
This skill standardizes and automates the entire release PR and draft release creation, ensuring consistent versioning and changelog generation, unlike a manual process that can be error-prone.
Compared to similar skills
ship side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| ship (this skill) | 0 | 1mo | Review | Intermediate |
| github-release-management | 4 | 5mo | Review | Advanced |
| agent-release-swarm | 1 | 5mo | Review | Advanced |
| magerun-release | 1 | 5mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by hta218
View all by hta218 →You might also like
github-release-management
ruvnet
Comprehensive GitHub release orchestration with AI swarm coordination for automated versioning, testing, deployment, and rollback management
agent-release-swarm
ruvnet
Agent skill for release-swarm - invoke with $agent-release-swarm
magerun-release
netz98
Technical release process for n98-magerun2
release
ziggy42
Use this skill when the user wants to cut a new release.
release-branch
mono
Create a release branch for SkiaSharp. Use when user says "release X", "start release X", "create release branch for X", "I want to release", or "release now". This is the FIRST step of releasing - creates branch and pushes to trigger CI. Can auto-detect next preview version from main branch.
release-minor
knuckleswtf
Automates the process of tagging a new minor release for Scribe by analyzing commit messages, updating the changelog, and creating a GitHub release.