Automated semantic releases with AI-powered changelogs for monorepos and multi-language projects.
- Conventional Commits Analysis - Automatically determines version bumps (major/minor/patch) from commit messages
- Multi-Language Support - Rust, Node.js, Python, Go, Elixir, C#
- Monorepo Support - Handles multiple packages with dependency graph resolution
- AI-Powered Changelogs - Optional AI enhancement using Claude API
- PR-Based Workflow - Creates release PRs for review before publishing
- Zero Configuration - Works out of the box with sensible defaults
┌─────────────────────────────────────────────────────────────────┐
│ 1. Action runs clikd release prepare --ci │
│ ├── Analyzes conventional commits │
│ ├── Bumps versions (major/minor/patch) │
│ ├── Generates changelogs (with optional AI) │
│ ├── Creates release manifest in clikd/releases/ │
│ └── Creates Pull Request │
├─────────────────────────────────────────────────────────────────┤
│ 2. You review and merge the PR │
├─────────────────────────────────────────────────────────────────┤
│ 3. GitHub App (clikd-bot) handles post-merge: │
│ ├── Creates Git tags │
│ ├── Creates GitHub Releases │
│ └── Cleans up manifest files │
└─────────────────────────────────────────────────────────────────┘
name: Release
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}Before using this action, initialize clikd in your repository:
# Install clikd
curl -fsSL https://clikd.dev/install.sh | sh
# Initialize release management
clikd release initThis creates a clikd/ directory with configuration files.
| Input | Description | Required | Default |
|---|---|---|---|
version |
Version of clikd to install | No | latest |
bump |
Version bump type: major, minor, patch, auto |
No | auto |
projects |
Per-project bumps (e.g., gate:major,rig:minor) |
No | - |
anthropic-api-key |
API key for AI changelogs | No | - |
github-token |
GitHub token for PR creation | No | github.token |
working-directory |
Working directory | No | . |
dry-run |
Run without creating PR | No | false |
git-user-name |
Git user name for commits | No | github-actions[bot] |
git-user-email |
Git user email for commits | No | github-actions[bot]@users.noreply.github.com |
| Output | Description |
|---|---|
pr-created |
true if a release PR was created |
pr-url |
URL of the created pull request |
pr-number |
Number of the created pull request |
releases |
JSON array of packages to be released |
release-count |
Number of packages in the release |
[
{
"name": "my-package",
"old_version": "1.0.0",
"new_version": "1.1.0"
}
]- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
bump: major- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
projects: 'api:major,web:minor,shared:patch'- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
dry-run: true- id: release
uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Show PR
if: steps.release.outputs.pr-created == 'true'
run: |
echo "Release PR: ${{ steps.release.outputs.pr-url }}"
echo "Packages: ${{ steps.release.outputs.release-count }}"- id: release
uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Enable auto-merge
if: steps.release.outputs.pr-created == 'true'
run: gh pr merge --auto --squash "${{ steps.release.outputs.pr-number }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
git-user-name: 'Release Bot'
git-user-email: 'release-bot@example.com'- uses: clikd-inc/release-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
version: '0.6.0'Version bumps are determined by commit prefixes:
| Prefix | Version Bump | Example |
|---|---|---|
feat: |
Minor | feat: add new API endpoint |
feat!: or BREAKING CHANGE: |
Major | feat!: redesign API |
fix: |
Patch | fix: resolve memory leak |
perf: |
Patch | perf: optimize query |
refactor: |
Patch | refactor: simplify logic |
chore:, docs:, ci:, test: |
No bump | docs: update README |
| Language | Version Files |
|---|---|
| Rust | Cargo.toml |
| Node.js | package.json |
| Python | pyproject.toml, setup.py |
| Go | go.mod |
| Elixir | mix.exs |
| C# | *.csproj |
- Ensure commits follow Conventional Commits format
- Check that
clikd/directory exists (runclikd release init) - Verify
fetch-depth: 0in checkout action
- Add
permissions: contents: writeandpull-requests: writeto your workflow - For fine-grained PATs, ensure "Contents: Read and write" and "Pull requests: Read and write" permissions
- Verify
ANTHROPIC_API_KEYis set correctly - Check API key has sufficient credits/quota
MIT License - see LICENSE for details.
Contributions welcome! Please read our Contributing Guide first.