Chops release
Determine the next version, update the marketing site, and run the full release pipeline.
install
source · Clone the upstream repo
git clone https://github.com/Shpigford/chops
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Shpigford/chops "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/release" ~/.claude/skills/shpigford-chops-release && rm -rf "$T"
manifest:
.claude/skills/release/SKILL.mdsource content
Cut a new release of Chops. Determines the version from git history, updates the marketing site, and runs the release script.
Instructions
Step 1: Verify prerequisites
- Confirm
exists in the project root. If it does not, stop and tell the user: "Missing.env
file. Copy.env
to.env.example
and fill in APPLE_TEAM_ID, APPLE_ID, and SIGNING_IDENTITY_NAME.".env - Confirm the notarytool keychain profile
works:AC_PASSWORD
If it fails, stop and tell the user to run:xcrun notarytool history --keychain-profile "AC_PASSWORD" >/dev/null 2>&1xcrun notarytool store-credentials "AC_PASSWORD" --apple-id "<APPLE_ID>" --team-id "<TEAM_ID>" --password "<app-specific-password>" - Confirm the working tree is clean (
). If there are uncommitted changes, stop and tell the user to commit or stash first.git status --porcelain - Confirm you are on the
branch. If not, stop and tell the user to switch tomain
first.main
Step 2: Determine the next version
- Get the latest tag:
git tag -l 'v*' | sort -V | tail -1 - Get commits since that tag:
git log <latest_tag>..HEAD --oneline --format='%s' - If there are zero commits since the last tag, stop and tell the user there is nothing to release.
- Apply semver logic to the current latest version:
- If any commit message starts with
orfeat:
→ minor bump (e.g. 1.1.0 → 1.2.0)feat( - If all commits are
,fix:
,chore:
, or similar → patch bump (e.g. 1.1.0 → 1.1.1)docs: - If any commit contains
or uses aBREAKING CHANGE
suffix → ask the user what version to use!: - If the commit messages are ambiguous or do not follow conventional commits, use
to ask:mcp__conductor__AskUserQuestion- question: "Commits since the last release don't clearly indicate the version bump. What version should this release be?"
- header: "Release version"
- multiSelect: false
- options with labels: "Patch (X.Y.Z+1)", "Minor (X.Y+1.0)", "Major (X+1.0.0)", "Custom"
- If any commit message starts with
Step 3: Confirm the version
Always confirm the version before proceeding. Use
mcp__conductor__AskUserQuestion:
- question: "Release as v<VERSION>? Commits included:\n<commit list>"
- header: "Confirm release"
- multiSelect: false
- options:
- "Yes, release v<VERSION>"
- "Use a different version"
- "Cancel"
If the user picks "Use a different version", ask them for the version number. If they pick "Cancel", stop.
Step 3.5: Update CHANGELOG.md
- Check if
has anCHANGELOG.md
section with content (bullet points).## [Unreleased] - If the
section is empty or missing, draft entries from commits since the last tag:## [Unreleased]- Rewrite each entry to be user-facing. Don't echo commit messages. Describe what changed from the user's perspective — what it enables, fixes, or improves.
- Bad: "feat: add skills registry browser with multi-agent install"
- Good: "Browse and install community skills directly from the app"
- Keep entries succinct (one line each). No technical jargon, no commit prefixes.
- Confirm the drafted entries with the user using
.mcp__conductor__AskUserQuestion
- Rename
to## [Unreleased]
(today's date).## [VERSION] - YYYY-MM-DD - Add a new empty
section above it.## [Unreleased]
Step 4: Update the marketing site version
- Edit
. Find the line containingsite/src/pages/index.astro
and replace it with:class="requires"
where<p class="requires">v<VERSION> · Requires macOS Sequoia</p>
is the confirmed version.<VERSION> - Commit this change along with the changelog:
git add site/src/pages/index.astro CHANGELOG.md git commit -m "chore: update site version to v<VERSION>" git push
Step 5: Run the release script
./scripts/release.sh <VERSION>
This handles: xcodegen → archive → export → DMG → notarize → staple → git tag → appcast → push → GitHub Release.
Let it run to completion. If it fails, report the error output to the user and stop. Do NOT retry automatically.
Step 6: Push and report
Ensure all commits are on the remote:
git push
Tell the user:
- The version that was released
- Link:
https://github.com/Shpigford/chops/releases/tag/v<VERSION> - Remind them to deploy the marketing site if needed (
fromnpm run build
)site/
Important Rules
- ALWAYS confirm the version with the user before proceeding
- NEVER run the release script if
is missing or the working tree is dirty.env - NEVER skip the marketing site version update
- If the release script fails, do NOT retry — report the error and stop
- The release script handles git tagging and GitHub release creation — do not duplicate those steps