releasing
Release Workflow
Execute semantic versioning releases or scaffold release infrastructure for projects.
Usage
This skill is invoked when:
- User runs
/releasecommand with a version argument - User runs
/release --setupto scaffold release infrastructure
Two Operation Modes
Mode 1: Release (/release <version>)
Validates, prepares, and triggers a GitHub release.
Mode 2: Setup (/release --setup)
Scaffolds release scripts and GitHub Actions workflow into the target project.
Supported Arguments
Parse arguments from user input:
<version>: Version to release (e.g.,1.6.0orv1.6.0)--setup: Scaffold release infrastructure into current project--skip-monitor: Trigger workflow but don't wait for completion
Prerequisites
ghCLI installed and authenticated (gh auth status)- Git configured with push access to remote
- CHANGELOG.md with a version entry (use
/changelogto generate) .github/workflows/release.ymlexists (use--setupto create)
Release Flow Steps
Step 1: Parse and Validate Version
VERSION="${1:-}"
# Strip 'v' prefix if present
VERSION="${VERSION#v}"
# Validate semver format
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Error: Invalid version format '$VERSION'"
echo "Expected semantic version (e.g., 1.6.0)"
exit 1
fi
echo "Releasing version: $VERSION"
Step 2: Pre-flight Checks
# Check CHANGELOG.md entry exists
if ! grep -qE "^## \[$VERSION\]" CHANGELOG.md; then
echo "Error: No CHANGELOG entry found for version $VERSION"
echo "Add entry with header: ## [$VERSION] - $(date +%Y-%m-%d)"
echo "Tip: Use '/changelog' to generate the entry."
exit 1
fi
echo "CHANGELOG entry found"
# Check release doesn't already exist
if gh release view "v$VERSION" &>/dev/null; then
echo "Error: Release v$VERSION already exists"
echo "Delete first: gh release delete v$VERSION --yes"
exit 1
fi
echo "Release does not exist, proceeding"
Step 3: Add Comparison Link to CHANGELOG.md
REPO_URL=$(gh repo view --json url -q '.url')
# Skip if link already exists
if grep -qE "^\[$VERSION\]:" CHANGELOG.md; then
echo "Comparison link already exists"
else
# Find previous version (second version header)
PREV_VERSION=$(grep -E "^## \[[0-9]+\.[0-9]+\.[0-9]+\]" CHANGELOG.md \
| head -2 | tail -1 | sed 's/.*\[\([0-9.]*\)\].*/\1/')
if [[ "$PREV_VERSION" != "$VERSION" ]] && [[ -n "$PREV_VERSION" ]]; then
COMPARE_LINK="[$VERSION]: $REPO_URL/compare/v$PREV_VERSION...v$VERSION"
else
COMPARE_LINK="[$VERSION]: $REPO_URL/releases/tag/v$VERSION"
fi
# Update [Unreleased] link and add version link
sed -i.bak "s|\[Unreleased\]:.*|[Unreleased]: $REPO_URL/compare/v$VERSION...HEAD|" CHANGELOG.md
sed -i.bak "/^\[Unreleased\]:/a\\
$COMPARE_LINK" CHANGELOG.md
rm -f CHANGELOG.md.bak
echo "Added comparison link for $VERSION"
fi
Step 4: Commit and Push CHANGELOG Changes
Check if CHANGELOG.md has uncommitted changes. If so, confirm with the user before committing:
if ! git diff --quiet CHANGELOG.md 2>/dev/null; then
echo "CHANGELOG.md has uncommitted changes."
# Ask user: "CHANGELOG.md updated with comparison links. Commit and push to main?"
# If confirmed:
git add CHANGELOG.md
git commit -m "docs: prepare release $VERSION"
git push origin main
echo "Changes committed and pushed"
fi
Important: Use conversation to confirm with the user before committing and pushing. Do NOT auto-commit without confirmation.
Step 5: Trigger Release Workflow
echo "Triggering release workflow for v$VERSION..."
gh workflow run release.yml -f version="$VERSION"
echo "Workflow triggered"
Step 6: Monitor Workflow
sleep 5
RUN_ID=$(gh run list --workflow=release.yml --limit=1 --json databaseId -q '.[0].databaseId')
REPO_URL=$(gh repo view --json url -q '.url')
echo "Monitoring workflow run $RUN_ID..."
echo "View at: $REPO_URL/actions/runs/$RUN_ID"
# Poll for completion
while true; do
STATUS=$(gh run view "$RUN_ID" --json status -q '.status')
if [[ "$STATUS" == "completed" ]]; then
CONCLUSION=$(gh run view "$RUN_ID" --json conclusion -q '.conclusion')
break
fi
echo " Status: $STATUS..."
sleep 5
done
if [[ "$CONCLUSION" == "success" ]]; then
echo "Release v$VERSION created successfully!"
echo "View: $REPO_URL/releases/tag/v$VERSION"
else
echo "Workflow failed: $CONCLUSION"
echo "Logs: $REPO_URL/actions/runs/$RUN_ID"
exit 1
fi
If --skip-monitor is specified, skip this step and report the workflow URL instead.
Setup Mode (--setup)
When --setup is specified, scaffold release infrastructure into the current project.
What Gets Scaffolded
| Template File | Target Location | Purpose |
|---|---|---|
scripts/release.sh |
scripts/release.sh |
Local release orchestrator |
templates/release.yml |
.github/workflows/release.yml |
GitHub Actions workflow |
scripts/validate-changelog.sh |
.github/workflows/scripts/validate-changelog.sh |
CHANGELOG validator |
scripts/extract-release-notes.sh |
.github/workflows/scripts/extract-release-notes.sh |
Release notes extractor |
scripts/create-github-release.sh |
.github/workflows/scripts/create-github-release.sh |
GitHub release creator |
Scaffolding Process
- Read each template file from this skill's
scripts/andtemplates/directories - Create target directories (
scripts/,.github/workflows/scripts/) - Write files to target project locations
- Set executable permissions (
chmod +x) on all shell scripts - Verify all files exist
- Report created files and next steps
# Create directories
mkdir -p scripts
mkdir -p .github/workflows/scripts
# Set permissions after writing files
chmod +x scripts/release.sh
chmod +x .github/workflows/scripts/validate-changelog.sh
chmod +x .github/workflows/scripts/extract-release-notes.sh
chmod +x .github/workflows/scripts/create-github-release.sh
Post-Setup Next Steps
After scaffolding, inform the user:
- Ensure CHANGELOG.md exists (use
/changelogto create) - Commit the scaffolded files
- Run
/release <version>to create the first release
Important Notes
- CHANGELOG format: Assumes Keep a Changelog format with
## [VERSION]headers - Branch: Commits and pushes to the current branch (auto-detected via
git rev-parse) - Integration with /changelog: Use
/changelogto generate CHANGELOG entries before releasing - GitHub CLI required: Must have
ghinstalled and authenticated - Workflow file: Expects
.github/workflows/release.yml(use--setupto create)
Supporting Documentation
- WORKFLOW.md - Detailed 7-phase release process and script template reference
- EXAMPLES.md - Real-world release scenarios including first release, patch release, and setup
- TROUBLESHOOTING.md - Common issues with workflow triggers, CHANGELOG format, and gh CLI
- templates/release.yml - GitHub Actions workflow template for scaffold setup
More from joaquimscosta/arkhe-claude-plugins
domain-driven-design
Expert guidance for Domain-Driven Design architecture and implementation. Use when designing complex business systems, defining bounded contexts, structuring domain models, choosing between modular monolith vs microservices, implementing aggregates/entities/value objects, or when users mention "DDD", "domain-driven design", "bounded context", "aggregate", "domain model", "ubiquitous language", "event storming", "context mapping", "domain events", "anemic domain model", strategic design, tactical patterns, or domain modeling. Helps make architectural decisions, identify subdomains, design aggregates, and avoid common DDD pitfalls.
26generating-changelog
Analyzes git commit history and generates professional changelogs with semantic versioning, conventional commit support, and multiple output formats (Keep a Changelog, Conventional, GitHub). Use when editing CHANGELOG.md, CHANGELOG.txt, or HISTORY.md files, preparing release notes, creating releases, bumping versions, updating changelog, documenting changes, writing release notes, tracking changes, version bump, tag release, or when user mentions "changelog", "release notes", "version history", "release", "semantic versioning", or "conventional commits".
21flyway-consolidate
Analyze and consolidate Flyway SQL migrations into clean, domain-grouped CREATE TABLE migrations for pre-production projects. Use when consolidating database migrations, refactoring Flyway schemas, simplifying migration history, grouping tables by domain, or when user mentions "consolidate migrations", "merge migrations", "clean up Flyway", "refactor schema", "baseline migrations".
18managing-adrs
Create and manage Architecture Decision Records (ADRs) with auto-numbering, template detection, and index maintenance. Use when user mentions "ADR", "architecture decision", "document this decision", "create ADR", editing ADR files (docs/adr/, doc/adr/, .adr/), or discussing architectural choices and tradeoffs.
17cleaning-up-branches
Deletes merged git branches (local and remote) and flags stale unmerged branches for manual review. Use when user mentions "cleanup branches", "delete merged branches", "prune old branches", "remove stale branches", "branch cleanup", or runs /cleanup-branches command.
17design-intent-specialist
Creates accurate frontend implementations from visual references while maintaining design consistency. Use when user provides Figma URLs, screenshots, design images, requests visual implementation from reference, or asks to build UI matching a design. Automatically checks existing design intent patterns before implementation.
17