Prepare Release

SkillDev tools

Prepare a release PR by bumping package versions (patch, minor, or major).

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Prepare Release skill

What this skill tells your AI

The instructions your AI receives, as published by itsbencodes/cookies in .claude/skills/prepare-release/SKILL.md and read by ahel’s review.

Ask the user for the bump type (patch | minor | major) if not provided.

Each publishable package is bumped independently — only packages that have changed since the last release tag are bumped (and later published). Packages may drift in version over time; this is fine because cross-package dependencies use caret ranges.

1. Fetch latest origin/main and tags

git fetch origin main --tags

2. Identify the last release tag

LAST_TAG=$(git describe --tags --abbrev=0 origin/main)
echo "Last release: $LAST_TAG"

3. Detect changed packages

For each publishable package (skip react-cookie-demo), check whether its directory has changed since $LAST_TAG:

BUMP_TYPE='<patch|minor|major>'
CHANGED=()
for pkg in react-cookie universal-cookie universal-cookie-express universal-cookie-koa; do
  if ! git diff --quiet "$LAST_TAG" origin/main -- "packages/$pkg/"; then
    CHANGED+=("$pkg")
  fi
done

if [ ${#CHANGED[@]} -eq 0 ]; then
  echo "No packages changed since $LAST_TAG — nothing to release."
  exit 1
fi

echo "Changed packages: ${CHANGED[*]}"

4. Compute new versions per package and pick release version

Each changed package bumps from its own current version on origin/main. The release version (used for the branch name and PR title) is the highest new version across all bumped packages.

RELEASE_VERSION=""
declare -A NEW_VERSIONS
for pkg in "${CHANGED[@]}"; do
  NV=$(node -p "
    const v = JSON.parse(require('child_process').execSync('git show origin/main:packages/$pkg/package.json')).version.split('.').map(Number);
    const t = '$BUMP_TYPE';
    if (t==='major') { v[0]++; v[1]=0; v[2]=0; }
    else if (t==='minor') { v[1]++; v[2]=0; }
    else { v[2]++; }
    v.join('.')
  ")
  NEW_VERSIONS[$pkg]=$NV
  if [ -z "$RELEASE_VERSION" ] || [ "$(printf '%s\n%s' "$NV" "$RELEASE_VERSION" | sort -V | tail -1)" = "$NV" ]; then
    RELEASE_VERSION=$NV
  fi
done
echo "Release version: v$RELEASE_VERSION"
for pkg in "${CHANGED[@]}"; do echo "  $pkg -> ${NEW_VERSIONS[$pkg]}"; done

5. Create release branch off origin/main

git checkout -b release/v$RELEASE_VERSION origin/main

6. Bump versions for changed packages only

for pkg in "${CHANGED[@]}"; do
  NV=${NEW_VERSIONS[$pkg]}
  node -e "const f='packages/$pkg/package.json';const p=require('./'+f);p.version='$NV';require('fs').writeFileSync(f,JSON.stringify(p,null,2)+'\n')"
done

Verify with grep -H '"version"' packages/*/package.json.

7. Commit, push, open PR with auto-merge

Use the commit skill. Stage only packages/*/package.json. Title Bump to v$RELEASE_VERSION. Body lists each bumped package:

Release v$RELEASE_VERSION

- <pkg> -> <new-version>

After PR is open, enable auto-merge:

gh pr merge --auto --squash

Signals

GitHub stars
215
Forks
26
Last commit
May 2026
Advanced
Catalog kind
skill
Gateway key
prepare-release-itsbencodes
Source
github.com/itsbencodes/cookies