release-drafter
Skill1 starsChanged 6 months agoMITView on GitHub
Configure Release Drafter for automated release notes, label-based categorization, and semantic version suggestions in GitHub Actions.
- Reads credentials
- Installs packages
We split this skill into the rules it gives an agent
21 rules. About 0 are common, 12 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈12
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Use this skill when creating automated release notes workflows with GitHub Actions.
- Distinctive: line 29
Key benefit: Always have release notes ready - just review and publish.
- Distinctive: line 76
Create a draft release (if none exists)
- Distinctive: line 77
Add the PR to the release notes
- Distinctive: line 78
Update the version number
- Very specific: line 168
Use in template, header, footer, name-template, tag-template:
- Very specific: line 347
Use default if no matching labels found
- Very specific: line 389
Remove specific users from $CONTRIBUTORS:
- Distinctive: line 405
Search and replace in generated changelog:
- Very specific: line 532
If current version is 2.5, then:
- Distinctive: line 582
Use outputs in subsequent steps:
- Distinctive: line 775
Use Release Drafter for drafts, semantic-release for publishing:
- Distinctive: line 876
No PRs merged since last release
- Very specific: line 877
All PRs excluded by exclude-labels
- Distinctive: line 909
No PRs with version labels
- Very specific: line 914
Ensure PRs have labels matching version-resolver
- Very specific: line 915
Check tag format: v1.2.3 vs 1.2.3
- Very specific: line 923
Solution: Ensure tag-template format matches published releases.
- Distinctive: line 983
Include upgrade instructions: if breaking changes
- Very specific: line 1073
ALWAYS configure version-resolver: if using $RESOLVED_VERSION - otherwise it defaults to patch.
- Distinctive: line 1075
ALWAYS test config with a test PR: before relying on it - create a PR, merge it, check draft.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Release Drafter - Automated Release Notes
Use this skill when creating automated release notes workflows with GitHub Actions. Release Drafter drafts release notes by aggregating merged pull requests, categorizing them by labels, and suggesting version numbers based on semantic versioning.
When to Use
- Adding automated release note drafting to a GitHub repository
- Setting up PR autolabeling based on file paths, branches, or title patterns
- Configuring semantic version resolution (patch/minor/major) from PR labels
- Creating a publication workflow that publishes draft releases via GitHub Actions
What is Release Drafter?
Release Drafter automatically:
- Creates draft releases as PRs are merged
- Categorizes changes by PR labels (Features, Bug Fixes, etc.)
- Suggests next version number (patch, minor, major)
- Auto-labels PRs based on files/branches/title/body
- Maintains a changelog in draft releases
- Publishes releases on demand
Key benefit: Always have release notes ready - just review and publish.
Quick Start
Step 1: Create GitHub Actions Workflow
Create .github/workflows/release-drafter.yml:
name: Release Drafter
on:
push:
branches:
- main
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: read
jobs:
update_release_draft:
permissions:
contents: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Step 2: Create Configuration File
Create .github/release-drafter.yml:
template: |
## What's Changed
$CHANGESStep 3: Merge a PR
Once you merge a pull request, Release Drafter will:
- Create a draft release (if none exists)
- Add the PR to the release notes
- Update the version number
That's it. You now have automated release notes.
Basic Configuration
Minimal Config
# .github/release-drafter.yml
template: |
## Changes
$CHANGESRecommended Config
# .github/release-drafter.yml
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
## What's Changed
$CHANGES
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
categories:
- title: '🚀 Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- 'bug'
- title: '📚 Documentation'
label: 'documentation'
- title: '🧰 Maintenance'
label: 'chore'
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
patch:
labels:
- 'patch'
default: patchConfiguration Options
Core Settings
| Option | Required | Description |
template | Yes | Body of the draft release. Use template variables. |
name-template | No | Release name template. Example: "v$NEXT_PATCH_VERSION" |
tag-template | No | Release tag template. Example: "v$NEXT_PATCH_VERSION" |
change-template | No | Format for each PR entry. Default: "* $TITLE (#$NUMBER) @$AUTHOR" |
header | No | Prepended to template |
footer | No | Appended to template |
Advanced Settings
| Option | Description |
category-template | Template for category headings. Default: "## $TITLE" |
version-template | Custom version format. Default: "$MAJOR.$MINOR.$PATCH" |
change-title-escapes | Characters to escape in PR titles. Default: "" |
no-changes-template | Text when no PRs merged. Default: "* No changes" |
no-contributors-template | Text when no contributors. Default: "No contributors" |
sort-by | Sort by merged_at or title. Default: merged_at |
sort-direction | ascending or descending. Default: descending |
prerelease | Mark as prerelease. Default: false |
latest | Mark as latest. Values: true, false, legacy. Default: true |
commitish | Target branch/commit. Default: workflow ref |
Template Variables
Main Template Variables
Use in template, header, footer, name-template, tag-template:
| Variable | Description | Example |
$CHANGES | List of merged PRs | (formatted list) |
$CONTRIBUTORS | Comma-separated contributor list | @alice, @bob, @charlie |
$PREVIOUS_TAG | Previous release tag | v1.2.3 |
$REPOSITORY | Current repository | myorg/myapp |
$OWNER | Repository owner | myorg |
Version Variables
| Variable | Description | Example (from v1.2.3) |
$NEXT_PATCH_VERSION | Next patch version | v1.2.4 |
$NEXT_MINOR_VERSION | Next minor version | v1.3.0 |
$NEXT_MAJOR_VERSION | Next major version | v2.0.0 |
$RESOLVED_VERSION | Auto-resolved by labels | (varies) |
Change Template Variables
Use in change-template:
| Variable | Description | Example |
$NUMBER | PR number | 42 |
$TITLE | PR title | Add alien technology |
$AUTHOR | PR author username | gracehopper |
$BODY | PR body | Fixed spelling mistake |
$URL | PR URL | https://github.com/... |
$BASE_REF_NAME | Base branch | main |
$HEAD_REF_NAME | PR branch | fix/bug-123 |
Category Template Variables
Use in category-template:
| Variable | Description |
$TITLE | Category title |
Categorize Pull Requests
Group PRs by labels into sections:
categories:
- title: '🚀 Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- 'bug'
- title: '📚 Documentation'
label: 'documentation'
- title: '🔒 Security'
label: 'security'
- title: '⬆️ Dependencies'
label: 'dependencies'
collapse-after: 5 # Collapse if more than 5 PRs
- title: '🧰 Maintenance'
labels:
- 'chore'
- 'refactor'Result:
## 🚀 Features
- Add authentication system @alice (#123)
- Implement dark mode @bob (#124)
## 🐛 Bug Fixes
- Fix memory leak in parser @charlie (#125)
## ⬆️ Dependencies
<details>
<summary>6 changes</summary>
- Bump lodash from 4.17.19 to 4.17.21 @dependabot (#126)
- Update typescript to 5.0.0 @dependabot (#127)
...
</details>Note: collapse-after automatically collapses categories with many PRs.
Auto-Label Pull Requests
Automatically label PRs based on file changes, branch name, title, or body:
autolabeler:
# Label by files changed
- label: 'documentation'
files:
- '*.md'
- 'docs/**/*'
# Label by branch name (regex)
- label: 'feature'
branch:
- '/^feature\/.+/'
- '/^feat\/.+/'
- label: 'bugfix'
branch:
- '/^fix\/.+/'
- '/^bugfix\/.+/'
# Label by PR title (regex)
- label: 'breaking'
title:
- '/breaking change/i'
- '/BREAKING:/i'
# Label by PR body (regex)
- label: 'needs-review'
body:
- '/JIRA-[0-9]{1,4}/'
# Multiple matchers (any match = label applied)
- label: 'dependencies'
files:
- 'package.json'
- 'package-lock.json'
- 'go.mod'
- 'go.sum'
title:
- '/^(build|deps):/i'Matchers:
files- Glob patternsbranch- Regextitle- Regexbody- Regex
Logic: Matchers are evaluated independently. Label is applied if any matcher succeeds.
Version Resolution
Auto-increment version based on PR labels:
version-resolver:
major:
labels:
- 'breaking'
- 'major'
minor:
labels:
- 'feature'
- 'enhancement'
- 'minor'
patch:
labels:
- 'fix'
- 'bugfix'
- 'patch'
default: patchLogic:
- Scan all PRs since last release
- Find highest priority label (major > minor > patch)
- Increment that version component
- Use
defaultif no matching labels found
Example:
Current version: v1.2.3
Merged PRs:
- PR #1: labels
[bugfix]→ patch - PR #2: labels
[feature]→ minor - PR #3: labels
[fix]→ patch
Highest: minor
Result: $RESOLVED_VERSION = 1.3.0
Exclude/Include Pull Requests
Exclude by Label
exclude-labels:
- 'skip-changelog'
- 'no-release-notes'
- 'duplicate'PRs with these labels are omitted from release notes.
Include Only Specific Labels
include-labels:
- 'production-ready'
- 'approved'Only PRs with these labels appear in release notes.
Note: exclude-labels and include-labels can be used together. Include is applied first, then exclude.
Exclude Contributors
Remove specific users from $CONTRIBUTORS:
exclude-contributors:
- 'dependabot'
- 'dependabot[bot]'
- 'github-actions[bot]'
- 'myusername'Useful for:
- Hiding bots
- Hiding yourself to highlight external contributors
Replacers
Search and replace in generated changelog:
replacers:
# Link CVE IDs
- search: '/CVE-(\\d{4})-(\\d+)/g'
replace: 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-$1-$2'
# Link Jira tickets
- search: '/JIRA-([0-9]+)/g'
replace: 'https://jira.example.com/browse/JIRA-$1'
# Expand usernames
- search: '@myorg-bot'
replace: 'MyOrg Automation Bot'
# Remove internal references
- search: '/\\[INTERNAL\\].*/g'
replace: ''Replacers run in order on the final changelog body.
Advanced Template Examples
Include Previous Tag and Date
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
## Changes since $PREVIOUS_TAG
$CHANGES
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSIONContributor Shoutouts
template: |
## What's Changed
$CHANGES
## 👏 Contributors
Thanks to all contributors who made this release possible: $CONTRIBUTORSComplex Multi-Section Template
template: |
## 📦 Release v$RESOLVED_VERSION
### What's Changed
$CHANGES
### 🔗 Links
- [Documentation](https://docs.example.com)
- [Migration Guide](https://docs.example.com/migration/v$RESOLVED_VERSION)
- [Full Changelog](https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION)
### 👥 Contributors
$CONTRIBUTORS
---
**Installation:** `npm install $REPOSITORY@$RESOLVED_VERSION`
header: |
🎉 We're excited to announce the release of v$RESOLVED_VERSION!
footer: |
---
Found a bug? [Report it here](https://github.com/$OWNER/$REPOSITORY/issues/new)Prerelease Configuration
Basic Prerelease
prerelease: trueDraft releases will be marked as prerelease.
Prerelease with Identifier
prerelease: true
prerelease-identifier: 'beta'Versions will be: v1.2.3-beta.1, v1.2.3-beta.2, etc.
Automatic prerelease increment: Each merge bumps the prerelease number.
Conditional Prerelease (via Action Input)
# .github/workflows/release-drafter.yml
- uses: release-drafter/release-drafter@v6
with:
prerelease: ${{ github.ref != 'refs/heads/main' }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Prereleases on non-main branches, regular releases on main.
Non-Semantic Versioning Projects
Override version format:
version-template: '$MAJOR.$MINOR'If current version is 2.5, then:
$NEXT_MINOR_VERSION=2.6$NEXT_MAJOR_VERSION=3.0
Date-Based Versioning
version-template: 'YYYY.MM.DD'
name-template: 'Release $RESOLVED_VERSION'
tag-template: 'release-$RESOLVED_VERSION'Requires manual version setting via action input.
Action Inputs
Override configuration via workflow:
- uses: release-drafter/release-drafter@v6
with:
config-name: my-custom-config.yml
name: 'Custom Release Name'
tag: 'v1.2.3'
version: '1.2.3'
publish: true
prerelease: false
latest: true
commitish: 'main'
disable-autolabeler: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}| Input | Description |
config-name | Config file name (relative to .github/). Default: release-drafter.yml |
name | Override release name |
tag | Override tag name |
version | Override version (bypasses resolver) |
publish | Immediately publish release. Default: false |
prerelease | Mark as prerelease |
latest | Mark as latest |
commitish | Target branch/commit |
header | Prepend text to body |
footer | Append text to body |
disable-autolabeler | Disable auto-labeling |
Action Outputs
Use outputs in subsequent steps:
- uses: release-drafter/release-drafter@v6
id: release_drafter
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Use release info
run: |
echo "Release ID: ${{ steps.release_drafter.outputs.id }}"
echo "Release URL: ${{ steps.release_drafter.outputs.html_url }}"
echo "Tag: ${{ steps.release_drafter.outputs.tag_name }}"
echo "Version: ${{ steps.release_drafter.outputs.resolved_version }}"| Output | Description |
id | Release ID |
name | Release name |
tag_name | Tag name |
body | Release body (markdown) |
html_url | Release page URL |
upload_url | Asset upload URL |
resolved_version | Resolved version (e.g., 1.2.3) |
major_version | Major component |
minor_version | Minor component |
patch_version | Patch component |
Complete Workflow Examples
Basic: Draft Only
name: Release Drafter
on:
push:
branches: [main]
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Advanced: Auto-Publish on Tag
name: Release
on:
push:
branches: [main]
tags: ['v*']
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
draft:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish:
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
with:
publish: true
name: 'Release ${{ github.ref_name }}'
tag: ${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Production: Draft, Build, Publish
name: Release Pipeline
on:
push:
branches: [main]
tags: ['v*']
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
draft:
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-and-publish:
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build artifacts
run: |
npm ci
npm run build
npm run package
- uses: release-drafter/release-drafter@v6
id: release
with:
publish: true
name: 'Release ${{ github.ref_name }}'
tag: ${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.release.outputs.upload_url }}
asset_path: ./dist/myapp.zip
asset_name: myapp-${{ github.ref_name }}.zip
asset_content_type: application/zipMonorepo: Multiple Drafts
name: Release Drafter
on:
push:
branches: [main]
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
draft-api:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter-api.yml
name: 'API v$RESOLVED_VERSION'
tag: 'api/v$RESOLVED_VERSION'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
draft-web:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
with:
config-name: release-drafter-web.yml
name: 'Web v$RESOLVED_VERSION'
tag: 'web/v$RESOLVED_VERSION'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Integration Patterns
With Semantic Release
Use Release Drafter for drafts, semantic-release for publishing:
name: Release
on:
push:
branches: [main]
jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}With Changesets
name: Release
on:
push:
branches: [main]
jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
changesets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: changesets/action@v1
with:
publish: npm run release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}With Docker Build
name: Release
on:
push:
tags: ['v*']
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: release-drafter/release-drafter@v6
id: release
with:
publish: true
tag: ${{ github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
push: true
tags: |
myorg/myapp:${{ steps.release.outputs.resolved_version }}
myorg/myapp:latestTroubleshooting
Draft Not Created
Symptoms: Workflow runs but no draft appears.
Causes:
- No PRs merged since last release
- All PRs excluded by
exclude-labels include-labelsfiltering out all PRs- Insufficient permissions
Solutions:
permissions:
contents: write
pull-requests: writeAuto-Labeler Not Working
Symptoms: PRs not getting labels.
Causes:
- Workflow doesn't trigger on PR events
- Regex patterns incorrect
disable-autolabeler: true
Solutions:
on:
pull_request:
types: [opened, reopened, synchronize]Version Not Incrementing
Symptoms: $RESOLVED_VERSION stays the same.
Causes:
- No PRs with version labels
version-resolvernot configured- Previous release tag format doesn't match
tag-template
Solutions:
- Ensure PRs have labels matching
version-resolver - Check tag format:
v1.2.3vs1.2.3
Multiple Drafts Created
Symptoms: New draft for each merge.
Cause: Tag template doesn't match existing releases.
Solution: Ensure tag-template format matches published releases.
Recommended Practices
Label Strategy
Recommended labels:
# Create these labels in your repo
- name: 'breaking'
color: 'D73A49'
description: 'Breaking change'
- name: 'feature'
color: '0E8A16'
description: 'New feature'
- name: 'bugfix'
color: 'D93F0B'
description: 'Bug fix'
- name: 'documentation'
color: '0075CA'
description: 'Documentation'
- name: 'dependencies'
color: '0366D6'
description: 'Dependency update'
- name: 'skip-changelog'
color: 'FFFFFF'
description: 'Exclude from release notes'Workflow Organization
.github/
workflows/
release-drafter.yml # Main workflow
release-drafter.yml # Main config
release-drafter-api.yml # Per-service config (monorepo)
release-drafter-web.ymlSecurity
permissions:
contents: write # Minimum for creating releases
pull-requests: write # Minimum for auto-labeling
# Don't grant unnecessary permissionsTemplate Guidance
- Use emojis for visual categories
- Link to full changelog for detailed history
- Thank contributors to encourage contributions
- Include upgrade instructions if breaking changes
- Link to documentation for new features
Common Configurations
Dependabot-Friendly
autolabeler:
- label: 'dependencies'
files:
- 'package.json'
- 'package-lock.json'
branch:
- '/^dependabot\//'
categories:
- title: '⬆️ Dependencies'
label: 'dependencies'
collapse-after: 10
exclude-contributors:
- 'dependabot'
- 'dependabot[bot]'Conventional Commits Compatible
autolabeler:
- label: 'breaking'
title:
- '/^[a-z]+(\(.+\))?!:/'
- '/^BREAKING CHANGE:/'
- label: 'feature'
title:
- '/^feat(\(.+\))?:/'
- label: 'bugfix'
title:
- '/^fix(\(.+\))?:/'
- label: 'documentation'
title:
- '/^docs(\(.+\))?:/'
- label: 'chore'
title:
- '/^chore(\(.+\))?:/'
version-resolver:
major:
labels: ['breaking']
minor:
labels: ['feature']
patch:
labels: ['bugfix']
default: patchBot-Focused
autolabeler:
- label: 'renovate'
branch:
- '/^renovate\//'
- label: 'dependabot'
branch:
- '/^dependabot\//'
categories:
- title: '🤖 Automated Updates'
labels:
- 'renovate'
- 'dependabot'
collapse-after: 5
exclude-contributors:
- 'renovate[bot]'
- 'dependabot[bot]'
- 'github-actions[bot]'Rules
- ALWAYS trigger on both push and pull_request events - push updates drafts, pull_request enables auto-labeling.
- ALWAYS set proper permissions -
contents: writeandpull-requests: writeare required. - ALWAYS configure version-resolver if using
$RESOLVED_VERSION- otherwise it defaults to patch. - ALWAYS use consistent tag format -
tag-templatemust match your existing tags (e.g.,v1.2.3vs1.2.3). - ALWAYS test config with a test PR before relying on it - create a PR, merge it, check draft.
- Use autolabeler extensively - reduces manual labeling work and ensures consistent categorization.
- Use collapse-after for dependency categories - keeps release notes readable.
- Exclude bot contributors from
$CONTRIBUTORS- focuses on human contributions. - Create labels before using them - autolabeler and categories won't work with non-existent labels.
- Pin action version (
@v6) - don't use@latestor@masterin production. - Use emoji in category titles - improves readability and visual appeal.
- Link to full changelog in template - provides access to complete history.
- Store config in default branch - Release Drafter only reads from default branch.
Quick Reference
Minimal Production Config
# .github/workflows/release-drafter.yml
name: Release Drafter
on:
push:
branches: [main]
pull_request:
types: [opened, reopened, synchronize]
permissions:
contents: write
pull-requests: write
jobs:
draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}# .github/release-drafter.yml
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
## What's Changed
$CHANGES
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
categories:
- title: '🚀 Features'
labels: ['feature', 'enhancement']
- title: '🐛 Bug Fixes'
labels: ['fix', 'bugfix', 'bug']
- title: '📚 Documentation'
label: 'documentation'
- title: '🧰 Maintenance'
label: 'chore'
version-resolver:
major:
labels: ['breaking', 'major']
minor:
labels: ['feature', 'minor']
patch:
labels: ['fix', 'patch']
default: patch
autolabeler:
- label: 'feature'
branch: ['/^feat(ure)?\/.+/']
- label: 'bugfix'
branch: ['/^(fix|bugfix)\/.+/']
- label: 'documentation'
files: ['*.md', 'docs/**/*']
- label: 'dependencies'
files: ['package*.json', 'go.mod', 'go.sum']Resources
Inputs
- GitHub repository with PRs and labels
- Release Drafter config (
.github/release-drafter.yml) defining categories, version templates, and autolabel rules
Outputs
- A GitHub Actions workflow (
.github/workflows/release-drafter.yml) that maintains a living draft release, updated on every merged PR - Draft release notes categorised by label and a suggested next semantic version
Examples
# .github/release-drafter.yml — minimal config
template: |
## Changes
$CHANGES
categories:
- title: "🚀 Features"
labels: [feature]
- title: "🐛 Bug Fixes"
labels: [bug]
version-resolver:
major: { labels: [breaking] }
minor: { labels: [feature] }
default: patchIn this repository36 other files it gives its agents.
- skills/backend-best-practices/AGENTS.mdAGENTS.md
- adr-writerSkill
- application-healthchecksSkill
- backend-best-practicesSkill
- bspec-prd-discoverySkill
- bspec-story-implementationSkill
- bspec-story-reviewSkill
- bspec-story-syncSkill
- bspec-technical-architectureSkill
- bspec-workflowSkill
- conventional-commitsSkill
- copier-scaffoldSkill
- devenvSkill
- direnvSkill
- docker-composeSkill
- dockerfileSkill
- docker-setupSkill
- docs-writerSkill
- github-actions-dockerSkill
- gitleaks-setupSkill
- golang-developmentSkill
- golang-slogSkill
- golang-testingSkill
- playwright-devenvSkill
- project-webappSkill
- readme-writerSkill
- release-drafter-setupSkill
- release-notesSkill
- renovate-pr-triageSkill
- renovate-setupSkill
- structured-loggingSkill
- summarize-articleSkill
- summarize-youtube-videoSkill
- tailwind-v4Skill
- vicinae-extensionsSkill
- zensical-setupSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

