src/skills/release/SKILL.md
Automated release flow — bump version, changelog, tag, push, GitHub release. Use when user says "release", "ship", "bump version", "tag", or "publish".
npx skillsauth add Soul-Brews-Studio/oracle-skills-cli releaseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Ship sharp. Ship clean. Ship now.
Automates the full release cycle: version bump, changelog generation, git tag, push, and GitHub release creation. No more manual copy-paste release rituals.
/release patch # Bump patch (1.2.3 → 1.2.4), tag, push, release
/release minor # Bump minor (1.2.3 → 1.3.0)
/release major # Bump major (1.2.3 → 2.0.0)
/release patch --alpha # Pre-release (1.2.3 → 1.2.4-alpha.1)
/release patch --dry-run # Show what would happen, don't do it
/release patch --no-push # Tag locally, skip push + GH release
/release status # Show current version + unreleased changes
date "+🕐 %H:%M %Z (%A %d %B %Y)" && BRANCH=$(git branch --show-current)
if [ "$BRANCH" != "main" ]; then
echo "⚠️ On branch '$BRANCH' — releases should be from main"
echo "Continue anyway? [y/N]"
# WAIT for user confirmation
fi
# Must be clean working tree
if [ -n "$(git status --porcelain | grep -v '^?? ψ/')" ]; then
echo "❌ Uncommitted changes (excluding ψ/ vault files):"
git status --short | grep -v '^?? ψ/'
echo ""
echo "Commit or stash first."
exit 1
fi
# Must be up to date with remote
git fetch origin main --quiet 2>/dev/null
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/main 2>/dev/null)
if [ "$LOCAL" != "$REMOTE" ]; then
echo "⚠️ Local is not in sync with origin/main"
echo " Local: $LOCAL"
echo " Remote: $REMOTE"
echo "Pull first? [Y/n]"
fi
# Try package.json first
if [ -f package.json ]; then
CURRENT=$(python3 -c "import json; print(json.load(open('package.json'))['version'])")
VERSION_FILE="package.json"
# Try Cargo.toml
elif [ -f Cargo.toml ]; then
CURRENT=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
VERSION_FILE="Cargo.toml"
# Try VERSION file
elif [ -f VERSION ]; then
CURRENT=$(cat VERSION)
VERSION_FILE="VERSION"
else
echo "❌ Can't find version. Supported: package.json, Cargo.toml, VERSION"
exit 1
fi
echo "📦 Current version: v$CURRENT ($VERSION_FILE)"
Parse current version and bump:
IFS='.' read -r MAJOR MINOR PATCH <<< "${CURRENT%-*}"
case "$BUMP_TYPE" in
patch) PATCH=$((PATCH + 1)) ;;
minor) MINOR=$((MINOR + 1)); PATCH=0 ;;
major) MAJOR=$((MAJOR + 1)); MINOR=0; PATCH=0 ;;
esac
NEXT="$MAJOR.$MINOR.$PATCH"
# Alpha suffix
if [ "$ALPHA" = true ]; then
# Check existing alpha tags
ALPHA_NUM=$(git tag -l "v${NEXT}-alpha.*" | wc -l)
ALPHA_NUM=$((ALPHA_NUM + 1))
NEXT="${NEXT}-alpha.${ALPHA_NUM}"
fi
echo "🚀 Next version: v$NEXT"
Collect commits since last tag:
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -n "$LAST_TAG" ]; then
echo "📝 Changes since $LAST_TAG:"
echo ""
git log "$LAST_TAG"..HEAD --oneline --no-merges | while read hash msg; do
# Categorize by conventional commit prefix
case "$msg" in
feat*) echo " ✨ $msg" ;;
fix*) echo " 🐛 $msg" ;;
docs*) echo " 📚 $msg" ;;
soul*) echo " 🧬 $msg" ;;
chore*) echo " 🔧 $msg" ;;
*) echo " · $msg" ;;
esac
done
else
echo "📝 First release — all commits included"
git log --oneline -20 --no-merges
fi
ALWAYS wait for user confirmation before proceeding.
🚀 Release Plan
Version: v$CURRENT → v$NEXT
Branch: $BRANCH
Changes: N commits since $LAST_TAG
Actions:
1. Update version in $VERSION_FILE
2. Create git tag v$NEXT
3. Push to origin (main + tag)
4. Create GitHub release with changelog
Proceed? [Y/n]
If --dry-run, show the plan and stop here.
# package.json
if [ "$VERSION_FILE" = "package.json" ]; then
python3 -c "
import json
data = json.load(open('package.json'))
data['version'] = '$NEXT'
json.dump(data, open('package.json', 'w'), indent=2)
print('✅ package.json updated')
"
fi
# Cargo.toml
if [ "$VERSION_FILE" = "Cargo.toml" ]; then
sed -i "0,/^version = .*/s//version = \"$NEXT\"/" Cargo.toml
echo "✅ Cargo.toml updated"
fi
# VERSION file
if [ "$VERSION_FILE" = "VERSION" ]; then
echo "$NEXT" > VERSION
echo "✅ VERSION updated"
fi
git add "$VERSION_FILE"
git commit -m "release: v$NEXT
Co-Authored-By: Oracle <[email protected]>"
git tag -a "v$NEXT" -m "v$NEXT
$(git log "$LAST_TAG"..HEAD --oneline --no-merges 2>/dev/null)"
--no-push)git push origin main --follow-tags
CHANGELOG=$(git log "$LAST_TAG"..HEAD~1 --oneline --no-merges | while read hash msg; do
echo "- $msg"
done)
gh release create "v$NEXT" \
--title "v$NEXT" \
--notes "$CHANGELOG" \
--latest
🎉 Released v$NEXT
📦 Version: v$NEXT
🏷️ Tag: v$NEXT
📡 Pushed: origin/main
🔗 Release: https://github.com/OWNER/REPO/releases/tag/v$NEXT
**From**: [Oracle Name]
**Rule 6**: Oracle Never Pretends to Be Human
Show current state without releasing:
📦 Release Status
Current: v$CURRENT
Branch: $BRANCH
Last tag: $LAST_TAG (N commits ago)
Unreleased changes:
✨ feat: ...
🐛 fix: ...
💡 /release patch — ship these changes
vX.Y.Z or vX.Y.Z-alpha.NARGUMENTS: $ARGUMENTS
testing
Cut a beta pre-release — bump CalVer with --beta, PR to beta branch, CI auto-tags + publishes to npm @beta. Use when user says 'release beta', 'cut beta', '/release-beta', or wants to publish a beta version for pre-release testing.
testing
Cut an alpha pre-release — bump CalVer, PR to alpha branch, CI auto-tags + publishes to npm @alpha. Use when user says 'release alpha', 'cut alpha', '/release-alpha', or wants to publish an alpha version.
tools
Talk to another oracle via maw federation. Uses fleet machine names (white, mba, clinic-nat, oracle-world, phaith). Auto-signs with current oracle's [host:handle] from CLAUDE.md. Global — works from any oracle repo.
development
Log information for future reference. Use when user says "fyi", "remember this", "note that", "for your info".