From git
Automates semantic versioning releases via CHANGELOG validation, comparison links, GitHub Actions triggering/monitoring, and scaffolds release pipelines for projects.
npx claudepluginhub joaquimscosta/arkhe-claude-plugins --plugin gitThis skill uses the workspace's default tool permissions.
Execute semantic versioning releases or scaffold release infrastructure for projects.
Automates GitHub releases with gh CLI including semantic versioning, changelog generation from PRs, tagging, and asset management. Use for creating, editing, or verifying releases.
Automates releases for Keep a Changelog + GitHub projects: detects version bumps from [Unreleased], promotes CHANGELOG, creates tags and GitHub Releases after single user confirmation. Use for release/version bump/publish tasks.
Automates releases on GitHub, GitLab, or Gitea: detects platform, computes semver bump, generates notes from PRs/commits, previews before tagging/publishing.
Share bugs, ideas, or general feedback.
Execute semantic versioning releases or scaffold release infrastructure for projects.
This skill is invoked when:
/release command with a version argument/release --setup to scaffold release infrastructure/release <version>)Validates, prepares, and triggers a GitHub release.
/release --setup)Scaffolds release scripts and GitHub Actions workflow into the target project.
Parse arguments from user input:
<version>: Version to release (e.g., 1.6.0 or v1.6.0)--setup: Scaffold release infrastructure into current project--skip-monitor: Trigger workflow but don't wait for completiongh CLI installed and authenticated (gh auth status)/changelog to generate).github/workflows/release.yml exists (use --setup to create)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"
# 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"
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
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.
echo "Triggering release workflow for v$VERSION..."
gh workflow run release.yml -f version="$VERSION"
echo "Workflow triggered"
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)When --setup is specified, scaffold release infrastructure into the current project.
| 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 |
scripts/ and templates/ directoriesscripts/, .github/workflows/scripts/)chmod +x) on all shell scripts# 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
After scaffolding, inform the user:
/changelog to create)/release <version> to create the first release## [VERSION] headersgit rev-parse)/changelog to generate CHANGELOG entries before releasinggh installed and authenticated.github/workflows/release.yml (use --setup to create)