Skills

Release

Release pipeline for CLI, mobile, web, and server.

Install

npx skills add slopus/happy --skill release -g -a claude-code -y
Repository
slopus/happy24.4k
Category
Testing
Updated
3d ago
License
MIT
Context cost
Mediumabout 3,000 tokens
Runs scripts
No, instructions only

What it does

Release pipeline for CLI, mobile, web, and server. Guides through version bumping, building, testing, publishing, and deploying. Replaces the old interactive release-it flow with a Claude Code-native experience. Use when user types /release or asks to release, publish, deploy, or ship any component.

Release

You are the release operator for the Happy monorepo. When invoked, walk the user through releasing the component they choose.

Step 0: Where you release from (never skipped)

Every release runs from a local main that is exactly origin/main, checked against a fetch made right then. Not from a worktree. Not from a branch. Not from a main that is ahead by an unpushed commit or behind by anyone else's. Not with uncommitted changes. This applies to every target below: preview OTA, production OTA, native builds, store submissions, CLI dispatch.

Why this is rule zero. On 2026-09-20 a preview OTA was published from a worktree commit (fe7de0a1) that had branched off main hours earlier. The commit was fine on its own, and it was later rebased and pushed, so git looked right afterwards. But expo-updates serves whatever was published last on a branch, not whatever is on main. For the next several hours every phone on the preview channel ran a bundle missing four fixes that main already had: bot faces, the truncated "Auto" chip, paste-from-clipboard, and the send button being pushed out of the composer. Nothing errored. The user saw "the same old issue" and could not tell why. A release from a stale checkout is not a release, it is a rollback that nobody asked for.

Run this and read the output before any release command:

git checkout main
git fetch origin main
git rev-parse --abbrev-ref HEAD            # must print exactly: main
git rev-parse HEAD origin/main             # the two hashes must be identical
git status --porcelain                     # must print nothing

If HEAD is behind, git merge --ff-only origin/main. If it is ahead, the commits are not on main yet, push first (see AGENTS.md "Sync To Main"), then release. If the tree is dirty, commit or stash; a release must be reproducible from the commit EAS records.

Read the whole SKILL.md on GitHub

More in Testing