pr-release automates release preparation for any GitHub repository. It inspects conventional commits, determines the next semantic version, generates changelog entries with git-cliff, and orchestrates the Git and GitHub steps needed to open or update a release pull request.
The tool wraps the end-to-end release workflow:
- Calculates the next semantic version based on commits since the last tag
- Generates release notes via
git-cliff - Creates or updates release branches and tags
- Manages NPM package version bumps when a
tools/workspace is present - Produces ready-to-merge release pull requests with rollback support
Configuration is optional for common CI environments. The loader resolves settings in the following order:
- Environment variables (
GITHUB_REPOSITORY,GITHUB_OWNER,GITHUB_REPOSITORY_OWNER,GITHUB_REPOSITORY_NAME,PR_RELEASE_*,COMPOZY_RELEASE_*) - YAML configuration file (
.pr-release.yamlor the legacy name.compozy-release.yaml) - Git remote discovery (
originremote)
Example configuration file:
# .pr-release.yaml
github_token: "ghp_your_token" # Optional; falls back to environment variables
# github_owner and github_repo automatically default to the detected repository
# tools_dir defaults to "tools"
# npm_token is required only when publishing packages
npm_token: "your-npm-token"
tools_dir: "tools"| Variable | Description | Required |
|---|---|---|
GITHUB_TOKEN, PR_RELEASE_GITHUB_TOKEN, COMPOZY_RELEASE_GITHUB_TOKEN, RELEASE_TOKEN |
GitHub token used for API calls | Only for GitHub operations |
GITHUB_REPOSITORY |
<owner>/<repo> slug. Highest priority for repository detection |
No |
GITHUB_OWNER, GITHUB_REPOSITORY_OWNER, PR_RELEASE_GITHUB_OWNER, COMPOZY_RELEASE_GITHUB_OWNER |
Explicit owner override | No |
GITHUB_REPOSITORY_NAME, PR_RELEASE_GITHUB_REPO, COMPOZY_RELEASE_GITHUB_REPO |
Explicit repository name override | No |
TOOLS_DIR, PR_RELEASE_TOOLS_DIR, COMPOZY_RELEASE_TOOLS_DIR |
Directory containing NPM workspaces | No (defaults to tools) |
NPM_TOKEN, PR_RELEASE_NPM_TOKEN, COMPOZY_RELEASE_NPM_TOKEN |
Token for publishing to NPM | Required for publishing |
The CLI is built with Cobra and exposes the following commands:
| Command | Description |
|---|---|
pr-release |
Run the full release orchestration workflow |
dry-run |
Execute release steps without pushing or opening PRs |
version |
Print build metadata |
Run go run . <command> --help for detailed flags.
# Fetch the latest tag from the releases API (requires jq)
VERSION=$(curl -sSf https://api.github.com/repos/compozy/releasepr/releases/latest | jq -r .tag_name)
# Map local OS/Arch to the archive naming used by GoReleaser
OS=$(uname | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
case "$ARCH" in
x86_64) ARCH="x86_64" ;;
amd64) ARCH="x86_64" ;;
arm64 | aarch64) ARCH="arm64" ;;
*) echo "Unsupported architecture: $ARCH" && exit 1 ;;
esac
# Download and extract the published binary
curl -L "https://github.com/compozy/releasepr/releases/download/${VERSION}/pr-release_${VERSION}_${OS}_${ARCH}.tar.gz" \
-o pr-release.tgz
tar -xzf pr-release.tgz
# Verify the installation
./pr-release/pr-release version
# Run the orchestrator
GITHUB_TOKEN=... ./pr-release/pr-release pr-release --dry-run --enable-rollbackPrefer not to use
jq? Head to the Releases page, pick the desired tag manually, and substitute it for${VERSION}in the snippet above.
go install github.com/compozy/releasepr@latest
~/go/bin/releasepr versionname: Release Dry Run
on:
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-latest
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.25.2"
- name: Run pr-release dry run
run: go run . pr-release --dry-run --ci-outputcmd/– CLI commands and dependency injection containerinternal/orchestrator/– High-level workflows coordinating repositories and servicesinternal/usecase/– Business logic for atomic release stepsinternal/repository/– Git, GitHub, filesystem adaptersinternal/service/– Integrations such asgit-cliff,npm, and GoReleaserinternal/config/– Configuration loading, validation, and repository detection
The release workflow relies on additional secrets when running in CI:
| Secret | Purpose |
|---|---|
GORELEASER_KEY |
GoReleaser Pro license key |
AUR_KEY |
AUR publishing |
NPM_TOKEN |
Publish packages to npm |
The repository ships with ci.yml for validation and release.yml for automated release pull requests, dry-run verification, and production releases. These workflows assume the same environment variables described above and do not embed repo-specific defaults.
For more details on contributing or extending the CLI, inspect the orchestrator and use case packages, and review the .cursor/rules/ guidelines that define coding and testing standards for the project.