Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 61 additions & 12 deletions .claude/skills/release-catalyst/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
---
name: release-catalyst
description: >
Cut a new release of Catalyst (`@bigcommerce/catalyst-core` and `@bigcommerce/catalyst-makeswift`).
Cut a new release of Catalyst (`@bigcommerce/catalyst-core`, `@bigcommerce/catalyst-makeswift`,
and `@bigcommerce/catalyst-b2b-makeswift`).
Use when the user says "/release-catalyst", "cut a release", "release catalyst", or asks to
publish new versions of the Catalyst packages. This skill orchestrates the full two-stage release
process: merging the Version Packages PR on canary, syncing integrations/makeswift, and pushing
@latest tags.
publish new versions of the Catalyst packages. This skill orchestrates the full release process:
merging the Version Packages PR on canary, syncing and releasing integrations/makeswift, then
integrations/b2b-makeswift, and pushing @latest tags.
---

# Release Catalyst
Expand Down Expand Up @@ -94,27 +95,75 @@ git fetch origin --tags
gh release view @bigcommerce/catalyst-makeswift@<version> --json tagName,name,isDraft,isPrerelease
```

## Stage 3: Push `@latest` tags
## Stage 3: Sync and release `integrations/b2b-makeswift`

Update both `@latest` tags to point to the new releases:
`integrations/b2b-makeswift` builds on `integrations/makeswift`, so it releases after Stage 2. If Stage 2 didn't cut a new makeswift release (no makeswift changes), skip this stage.

### 3a. Sync branches

Invoke the `/sync-integration-branch` skill with target `integrations/b2b-makeswift`, with one addition: during the sync (after merge, before pushing), also add a changeset for `@bigcommerce/catalyst-b2b-makeswift`:

**Determine bump type**: Match the bump type from Stage 2 (the makeswift bump).

**Create changeset file** (`.changeset/sync-makeswift-<version>.md`, where `<version>` uses hyphens instead of dots):

```markdown
---
"@bigcommerce/catalyst-b2b-makeswift": <patch|minor|major>
---

Pulls in changes from the `@bigcommerce/catalyst-makeswift@<version>` release. For more information, see the [changelog entry](https://github.com/bigcommerce/catalyst/blob/<makeswift-sha>/core/CHANGELOG.md#<version-anchor>).
```

Where `<version>` is the makeswift version released in Stage 2, `<makeswift-sha>` is the Version Packages merge commit on `integrations/makeswift`, and `<version-anchor>` is that version with dots removed. The b2b package keeps its **own** version line: the bump type mirrors makeswift's, but the resulting `@bigcommerce/catalyst-b2b-makeswift` version number is independent of makeswift's.

Include this changeset in the merge commit (amend if needed) alongside the normal sync work.

### 3b. Merge the Version Packages (`integrations/b2b-makeswift`) PR

After the sync lands, the Changesets action opens a "Version Packages (`integrations/b2b-makeswift`)" PR.

```bash
gh pr list --search "Version Packages (integrations/b2b-makeswift)" --state open --json number,title
```

Same flow as Stage 2b:
- If checks aren't running (bot PR), push an empty commit to trigger CI, then **drop it before merging** by resetting to the parent and force-pushing.
- Once approved and green, merge with `gh pr merge <number> --squash`.
- Same caveat as makeswift: squash merging is normally disallowed on `integrations/b2b-makeswift` to preserve merge bases for sync PRs. Temporarily enable it for this step, then re-disable.

### 3c. Verify the b2b release

```bash
git fetch origin --tags
gh release view @bigcommerce/catalyst-b2b-makeswift@<version> --json tagName,name,isDraft,isPrerelease
```

> **Large catch-up:** when reviving a branch that's many makeswift releases behind, run this stage once per makeswift **minor** tag (see the one-time catch-up in `/sync-integration-branch`), cutting a b2b release per rung so `@latest` marches forward cleanly.

## Stage 4: Push `@latest` tags

Update the `@latest` tags to point to the new releases (skip any package that didn't get a new release this run):

```bash
git fetch origin --tags
git tag @bigcommerce/catalyst-core@latest @bigcommerce/catalyst-core@<version> -f
git tag @bigcommerce/catalyst-makeswift@latest @bigcommerce/catalyst-makeswift@<version> -f
git tag @bigcommerce/catalyst-core@latest @bigcommerce/catalyst-core@<core-version> -f
git tag @bigcommerce/catalyst-makeswift@latest @bigcommerce/catalyst-makeswift@<makeswift-version> -f
git tag @bigcommerce/catalyst-b2b-makeswift@latest @bigcommerce/catalyst-b2b-makeswift@<b2b-version> -f
git push origin @bigcommerce/catalyst-core@latest -f
git push origin @bigcommerce/catalyst-makeswift@latest -f
git push origin @bigcommerce/catalyst-b2b-makeswift@latest -f
```

Confirm both tags were pushed successfully.
Confirm the tags were pushed successfully.

## Stage 4: Cleanup
## Stage 5: Cleanup

```bash
git checkout canary
git pull
```

Delete any leftover local branches (`changeset-release/*`, `sync-integrations-makeswift`, `integrations/makeswift`).
Delete any leftover local branches (`changeset-release/*`, `sync-integrations-makeswift`, `integrations/makeswift`, `sync-integrations-b2b-makeswift`, `integrations/b2b-makeswift`).

Report the final state: both package versions released, tags updated, branches cleaned up.
Report the final state: which package versions released, tags updated, branches cleaned up.
Loading