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
.env exists in the project root. If it does not, stop and tell the user:
"Missing .env file. Copy .env.example to .env and fill in APPLE_TEAM_ID, APPLE_ID, and SIGNING_IDENTITY_NAME."
- Confirm the notarytool keychain profile
AC_PASSWORD works:xcrun notarytool history --keychain-profile "AC_PASSWORD" >/dev/null 2>&1
If it fails, stop and tell the user to run:xcrun notarytool store-credentials "AC_PASSWORD" --apple-id "<APPLE_ID>" --team-id "<TEAM_ID>" --password "<app-specific-password>"
- Confirm the working tree is clean (
git status --porcelain). If there are uncommitted changes, stop and tell the user to commit or stash first.
- Confirm you are on the
main branch. If not, stop and tell the user to switch to main first.
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
feat: or feat( → minor bump (e.g. 1.1.0 → 1.2.0)
- If all commits are
fix:, chore:, docs:, or similar → patch bump (e.g. 1.1.0 → 1.1.1)
- If any commit contains
BREAKING CHANGE or uses a !: suffix → ask the user what version to use
- If the commit messages are ambiguous or do not follow conventional commits, use
mcp__conductor__AskUserQuestion to ask:
- 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"
Step 3: Confirm the version
Always confirm the version before proceeding. Use mcp__conductor__AskUserQuestion:
- question: "Release as v? Commits included:\n"
- header: "Confirm release"
- multiSelect: false
- options:
- "Yes, release v"
- "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
CHANGELOG.md has an ## [Unreleased] section with content (bullet points).
- If the
## [Unreleased] section is empty or missing, draft entries from commits since the last tag:
- 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
## [Unreleased] to ## [VERSION] - YYYY-MM-DD (today's date).
- Add a new empty
## [Unreleased] section above it.
Step 4: Update the marketing site version
- Edit
site/src/pages/index.astro. Find the line containing class="requires" and replace it with:<p class="requires">v<VERSION> · Requires macOS Sequoia</p>
where <VERSION> is the confirmed 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 (
npm run build from site/)
Important Rules
- ALWAYS confirm the version with the user before proceeding
- NEVER run the release script if
.env is missing or the working tree is dirty
- 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
1---2name: release-23description: Determine the next version, update the marketing site, and run the full release pipeline.4---56Cut a new release of Chops. Determines the version from git history, updates the marketing site, and runs the release script.78## Instructions910### Step 1: Verify prerequisites11121. Confirm `.env` exists in the project root. If it does not, stop and tell the user:13 "Missing `.env` file. Copy `.env.example` to `.env` and fill in APPLE_TEAM_ID, APPLE_ID, and SIGNING_IDENTITY_NAME."142. Confirm the notarytool keychain profile `AC_PASSWORD` works:15 ```bash16 xcrun notarytool history --keychain-profile "AC_PASSWORD" >/dev/null 2>&117 ```18 If it fails, stop and tell the user to run:19 ```bash20 xcrun notarytool store-credentials "AC_PASSWORD" --apple-id "<APPLE_ID>" --team-id "<TEAM_ID>" --password "<app-specific-password>"21 ```223. Confirm the working tree is clean (`git status --porcelain`). If there are uncommitted changes, stop and tell the user to commit or stash first.234. Confirm you are on the `main` branch. If not, stop and tell the user to switch to `main` first.2425### Step 2: Determine the next version26271. Get the latest tag:28 ```bash29 git tag -l 'v*' | sort -V | tail -130 ```312. Get commits since that tag:32 ```bash33 git log <latest_tag>..HEAD --oneline --format='%s'34 ```353. If there are zero commits since the last tag, stop and tell the user there is nothing to release.364. Apply semver logic to the current latest version:37 - If any commit message starts with `feat:` or `feat(` → **minor** bump (e.g. 1.1.0 → 1.2.0)38 - If all commits are `fix:`, `chore:`, `docs:`, or similar → **patch** bump (e.g. 1.1.0 → 1.1.1)39 - If any commit contains `BREAKING CHANGE` or uses a `!:` suffix → ask the user what version to use40 - If the commit messages are ambiguous or do not follow conventional commits, use `mcp__conductor__AskUserQuestion` to ask:41 - question: "Commits since the last release don't clearly indicate the version bump. What version should this release be?"42 - header: "Release version"43 - multiSelect: false44 - options with labels: "Patch (X.Y.Z+1)", "Minor (X.Y+1.0)", "Major (X+1.0.0)", "Custom"4546### Step 3: Confirm the version4748Always confirm the version before proceeding. Use `mcp__conductor__AskUserQuestion`:49- question: "Release as v<VERSION>? Commits included:\n<commit list>"50- header: "Confirm release"51- multiSelect: false52- options:53 - "Yes, release v<VERSION>"54 - "Use a different version"55 - "Cancel"5657If the user picks "Use a different version", ask them for the version number. If they pick "Cancel", stop.5859### Step 3.5: Update CHANGELOG.md60611. Check if `CHANGELOG.md` has an `## [Unreleased]` section with content (bullet points).622. If the `## [Unreleased]` section is empty or missing, draft entries from commits since the last tag:63 - **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.64 - Bad: "feat: add skills registry browser with multi-agent install"65 - Good: "Browse and install community skills directly from the app"66 - Keep entries succinct (one line each). No technical jargon, no commit prefixes.67 - Confirm the drafted entries with the user using `mcp__conductor__AskUserQuestion`.683. Rename `## [Unreleased]` to `## [VERSION] - YYYY-MM-DD` (today's date).694. Add a new empty `## [Unreleased]` section above it.7071### Step 4: Update the marketing site version72731. Edit `site/src/pages/index.astro`. Find the line containing `class="requires"` and replace it with:74 ```html75 <p class="requires">v<VERSION> · Requires macOS Sequoia</p>76 ```77 where `<VERSION>` is the confirmed version.782. Commit this change along with the changelog:79 ```bash80 git add site/src/pages/index.astro CHANGELOG.md81 git commit -m "chore: update site version to v<VERSION>"82 git push83 ```8485### Step 5: Run the release script8687```bash88./scripts/release.sh <VERSION>89```9091This handles: xcodegen → archive → export → DMG → notarize → staple → git tag → appcast → push → GitHub Release.9293Let it run to completion. If it fails, report the error output to the user and stop. Do NOT retry automatically.9495### Step 6: Push and report9697Ensure all commits are on the remote:98```bash99git push100```101102Tell the user:103- The version that was released104- Link: `https://github.com/Shpigford/chops/releases/tag/v<VERSION>`105- Remind them to deploy the marketing site if needed (`npm run build` from `site/`)106107## Important Rules108109- ALWAYS confirm the version with the user before proceeding110- NEVER run the release script if `.env` is missing or the working tree is dirty111- NEVER skip the marketing site version update112- If the release script fails, do NOT retry — report the error and stop113- The release script handles git tagging and GitHub release creation — do not duplicate those steps