ship
npx skills add https://github.com/bitwize-music-studio/claude-ai-music-skills --skill ship
Agent 安装分布
Skill 文档
Your Task
Automate the complete release pipeline for this plugin using the conventional commit message provided.
Input: $ARGUMENTS
This is a conventional commit message (e.g., feat: streaming URL management tools).
Ship â Automated Code Release Pipeline
You automate the entire release workflow from uncommitted changes on main to a published GitHub Release with version bump.
Pipeline:
[uncommitted changes on main]
â create feature branch
â commit with conventional commit message
â push + create PR
â poll CI checks until all pass (or fail)
â merge PR
â pull main
â determine version bump from commit prefix
â update plugin.json + marketplace.json + CHANGELOG + README badges
â commit "chore: release 0.x.0"
â push to main (triggers auto-release.yml â GitHub Release)
â delete local feature branch
Step 0: Parse Input
Extract from $ARGUMENTS:
- Full commit message â the entire string (e.g.,
feat: streaming URL management tools) - Prefix â the conventional commit type before the colon:
feat:,fix:,feat!:,docs:,chore: - Description â everything after the prefix (e.g.,
streaming URL management tools) - Branch name â derived from the message: lowercase, spaces to hyphens, prefix becomes the branch prefix
feat: streaming URL management toolsâfeat/streaming-url-management-toolsfix: correct audio pathâfix/correct-audio-pathfeat!: breaking changeâfeat/breaking-changedocs: update READMEâdocs/update-readmechore: cleanupâchore/cleanup
- Version bump type:
feat:â MINOR (0.57.0 â 0.58.0)fix:â PATCH (0.57.0 â 0.57.1)feat!:â MAJOR (0.57.0 â 1.0.0)docs:orchore:â none (skip version bump and release steps)
If $ARGUMENTS is empty or doesn’t match a conventional commit pattern, stop and ask the user for a commit message.
Step 1: Pre-flight Checks
Run these checks. If ANY fail, stop immediately with a clear error message.
-
On main branch?
git branch --show-currentMust be
main. If not: “Switch to main first:git checkout main && git pull“ -
Uncommitted changes exist?
git status --porcelainMust have output. If empty: “No changes to ship. Make some changes first.”
-
GitHub CLI authenticated?
gh auth statusMust succeed. If not: “Run
gh auth loginfirst.” -
Read current version from
.claude-plugin/plugin.json:jq -r '.version' .claude-plugin/plugin.jsonStore as
CURRENT_VERSION.
Report: “Pre-flight passed. Current version: {CURRENT_VERSION}. Shipping: {commit message}”
Step 2: Branch + Commit + Push
-
Create feature branch:
git checkout -b {branch-name} -
Stage files â use
git statusto identify changed files. Stage them by name. Never stage.env,credentials, or secret files. Prefer specific filenames overgit add -A. -
Commit with the conventional commit message + co-author:
git commit -m "$(cat <<'EOF' {full commit message} Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> EOF )" -
Push:
git push -u origin {branch-name}
Step 3: Create PR
Create a pull request using the commit message as the title:
gh pr create --title "{full commit message}" --body "$(cat <<'EOF'
## Summary
{1-3 bullet points summarizing what changed}
## Test plan
- [ ] CI checks pass (automated)
- [ ] Version sync validates (automated)
ð¤ Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
Capture the PR number from the output for subsequent steps.
Step 4: Wait for CI Checks
Poll CI using gh pr checks with the --watch flag:
gh pr checks {pr-number} --watch --fail-level all
This blocks until all checks complete. Use a 10-minute timeout.
If any check fails:
- Report which check(s) failed
- Print the failing check URL(s) if available
- Stop the pipeline â leave the PR open for the user to investigate
- Say: “CI failed. Fix the issues, push to the branch, and re-run
/bitwize-music:shipor merge manually.” - Do NOT proceed to merge.
If all checks pass: Report “All CI checks passed.” and continue.
Step 5: Merge PR
-
Merge the PR (merge commit, delete remote branch):
gh pr merge {pr-number} --merge --delete-branch -
Switch back to main and pull:
git checkout main && git pull origin main
Step 6: Version Bump
Skip this entire step if the prefix is docs: or chore:.
6a: Calculate new version
From CURRENT_VERSION and the bump type:
- MINOR: increment middle number, reset patch to 0 (e.g., 0.57.0 â 0.58.0)
- PATCH: increment last number (e.g., 0.57.0 â 0.57.1)
- MAJOR: increment first number, reset others to 0 (e.g., 0.57.0 â 1.0.0)
Store as NEW_VERSION.
6b: Update .claude-plugin/plugin.json
Change "version": "{CURRENT_VERSION}" â "version": "{NEW_VERSION}"
6c: Update .claude-plugin/marketplace.json
Change "version": "{CURRENT_VERSION}" â "version": "{NEW_VERSION}"
6d: Update CHANGELOG.md
- Find the current
## [Unreleased]section content - Insert a new versioned section between
[Unreleased]and the previous version:- Empty
## [Unreleased]section at top - Then
## [{NEW_VERSION}] - {YYYY-MM-DD}with the content that was under Unreleased
- Empty
- The date is today’s date
6e: Update README.md badges
Update these badge lines:
- Version badge:
 - Skills count badge: count directories in
skills/*/and update - Test count badge: run
pytest --co -q 2>/dev/null | tail -1to get the count, update
6f: Update README “What’s New” table (for feat: and feat!: only)
If the commit is a feat: or feat!::
- Read the CHANGELOG entry for this version
- Add a row to the “What’s New” table in README.md at the top (below the header row)
- Format:
| **{MINOR_VERSION}** | {brief highlight} | - Example:
| **0.58** | Ship skill for automated code release pipeline |
6g: Update README skill count text
If a new skill was added, update the “collection of N specialized skills” text in README.md to match the badge count.
Step 7: Release Commit + Push
Skip if docs: or chore: prefix (no version bump happened).
-
Stage the version files:
git add .claude-plugin/plugin.json .claude-plugin/marketplace.json CHANGELOG.md README.md -
Commit:
git commit -m "$(cat <<'EOF' chore: release {NEW_VERSION} Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> EOF )" -
Push to main â this triggers
auto-release.ymlwhich creates the GitHub Release:git push origin main
Step 8: Cleanup
-
Delete local feature branch (it was already deleted from remote by
--delete-branch):git branch -d {branch-name} -
Report success:
Ship complete! Commit: {full commit message} Version: {CURRENT_VERSION} â {NEW_VERSION} PR: {PR URL} Release: auto-release.yml will create GitHub Release for v{NEW_VERSION} Branch {branch-name} cleaned up (local + remote).For
docs:/chore:(no version bump):Ship complete! Commit: {full commit message} Version: unchanged ({CURRENT_VERSION}) PR: {PR URL} No version bump for {prefix} commits. Branch {branch-name} cleaned up (local + remote).
Error Handling
| Scenario | Action |
|---|---|
Not on main |
Stop. Tell user to git checkout main && git pull. |
| No uncommitted changes | Stop. “Nothing to ship.” |
gh not authenticated |
Stop. Suggest gh auth login. |
| CI check fails | Stop. Report failure details. Leave PR open. |
| Merge conflict | Stop. Report conflict. Let user resolve. |
| Push rejected | Stop. Report error. Suggest git pull --rebase. |
| Invalid commit message | Stop. Show expected format with examples. |
Never force-push. Never skip CI. Never auto-close a failed PR.
Remember
- Parse the commit message first â everything flows from the prefix
- Pre-flight is non-negotiable â stop if any check fails
- Stage files by name â never
git add -Aorgit add . - CI must pass â never merge with failing checks
- Version bump follows conventional commits â
feat:= MINOR,fix:= PATCH,feat!:= MAJOR - Both JSON files must match â plugin.json and marketplace.json versions stay in sync
- CHANGELOG gets the content â move Unreleased to versioned section
- Badges must match â version, skills count, test count in README
chore: releasecommit triggers auto-release.yml â which creates the GitHub Release- Clean up branches â delete local and remote after merge
Your deliverable: Changes shipped from uncommitted code to published GitHub Release in one automated pipeline.