Config-driven branch and release helpers for Git repositories
repo-release-tools keeps release policy boring in the best possible way.
Use it from GitHub Marketplace when you want CI to validate branch names, commit subjects, and changelog policy. Install it from PyPI when you want a local CLI, hook integration, version bumps, and release-branch automation.
GitHub Marketplace action: https://github.com/marketplace/actions/repo-release-tools-policy-checks
PyPI package: https://pypi.org/project/repo-release-tools/
Choose the action if you want pull requests and pushes to fail fast when a repo drifts from your release policy.
feat/add-parserrrt doctor as a pre-release health gate- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: Anselmoo/repo-release-tools@v1.17.1
with:
check-branch-name: "true"
check-commit-subject: "true"
check-changelog: "true"
See the full action guide: https://anselmoo.github.io/repo-release-tools/action/
See the full CLI and commands reference: https://github.com/Anselmoo/repo-release-tools/blob/main/docs/commands/rrt-cli.md
Choose the package if you want the developer-side tools: branch helpers, version bumps, config inspection, pre-commit hooks, and release automation. The Python package is published on PyPI and has a CI counterpart in the GitHub Action guide.
pip install repo-release-tools
rrt init
rrt branch new feat "add parser"
rrt git commit "add parser"
rrt git doctor
rrt bump patch
Or run the CLI without installing it permanently:
uvx repo-release-tools branch new feat "add parser"
If rrt is already installed and you want the bundled agent skill for Copilot,
Claude, or Codex, install it with:
rrt skill install --target copilot-local
rrt skill install --target claude-local --target codex-local
rrt skill install --target codex-global --dry-run
For basic versioning, bump and ci-version can run without [tool.rrt] by
auto-detecting repo-root pyproject.toml, package.json, Cargo.toml,
.rrt.toml, or .config/rrt.toml.
If multiple version files are found, they are updated together. Explicit config
is for the nice extras: grouped releases, changelog paths, release branches,
lock commands, generated files, and custom patterns.
Version targets also support common language/project files such as Python
(pep621, python_version), Node/JS/TS (package_json), Go (go_version),
Rust (cargo_toml), and .NET (csproj) so multi-language repositories can
keep their release versions aligned. A mcp_server_json target keeps an MCP
Registry server.json (top-level version, each package's version, and
any oci package's image tag) in sync alongside a project's primary target.
Pick the style that matches how your repository lands changes.
incremental (default) — for teams that maintain changelog entries during development.
rrt-update-unreleased and rrt-changelog hooks stay active.changelog-strategy: auto to per-commit.rrt bump defaults to auto.squash — for repositories that squash many commits into one PR merge.
changelog-strategy: auto to release-only.rrt bump defaults to generate.Minimal config:
[tool.rrt]
release_branch = "release/v{version}"
changelog_file = "CHANGELOG.md"
changelog_workflow = "incremental" # or "squash"
[[tool.rrt.version_targets]]
path = "pyproject.toml"
kind = "pep621"
Native config is also supported in package.json ("rrt": { ... }) and
Cargo.toml ([package.metadata.rrt] / [workspace.metadata.rrt]). Go repos
should use .rrt.toml or .config/rrt.toml.
rrt CLI for branches, bumps, config inspection, and Git helpersrrt-hooks for pre-commit, lefthook, husky, and CI validationaction.ymluvx and installed-CLI workflowsIf you use Claude Code, Copilot, Cursor, or Codex on a repository that has rrt
configured, the agent will happily reimplement what rrt already does — hand-editing a
version string in three files, inventing a branch name the pre-commit hook then rejects,
or writing a changelog entry in the wrong section. Not because it lacks the tools, but
because nothing told it these are the tools for this job.
Two things fix that. Do both.
Paste the block from Agent instruction snippet below into
your repository's CLAUDE.md, AGENTS.md, or .github/copilot-instructions.md. This is
the highest-leverage step by a wide margin: it is read on every session, before the agent
has formed a plan, and it costs nothing at runtime.
uv add "repo-release-tools[mcp]"
Then add .mcp.json at the repository root — Claude Code picks it up on next start:
{
"mcpServers": {
"rrt": { "type": "stdio", "command": "uv", "args": ["run", "rrt-mcp"] }
}
}
With the server connected, most tools give the agent typed JSON instead of terminal
output it has to parse (the four lock readers and rrt_config return raw dicts instead),
commit subjects and branch names are passed as arguments instead of through shell
quoting, and mutating operations default to a dry-run preview. See the
MCP Server guide for
Claude Desktop, global install, and HTTP transport with bearer auth.
The MCP server does not cover everything. rrt docs map, rrt docs generate,
rrt docs publish, rrt docs inject, rrt tree --check, rrt toc, rrt changelog lint,
rrt changelog compare, rrt drift generate/check, rrt artifacts --check, every other
--snapshot write, and every rrt-hooks subcommand are CLI-only — a mixed session is
expected, not a fallback.
These reliably route to rrt rather than to hand-editing:
The pattern: name rrt explicitly, and name the moment ("before you create it",
"before you open the PR"). Agents route on triggers, not on capabilities.
## Use `rrt` for release policy
This repo uses `repo-release-tools` (`rrt`) to enforce branch naming, Conventional
Commits, changelog format, and version consistency. Do not hand-roll any of it.
Before you act, use `rrt`:
| When you are about to… | Use |
|---|---|
| create a branch | `rrt branch new <type> "<desc>"` — or validate the name first with `rrt-hooks check-branch-name --branch <candidate>` |
| write a commit message | `rrt git commit --type <type> "<description>"`, which builds and validates the subject before committing |
| change a version number anywhere | `rrt bump <level> --dry-run` first — never edit version strings by hand; pins and the changelog move with it |
| add a changelog entry | read the existing `[Unreleased]` first; it is hook-managed |
| open a PR | `rrt release check` and `rrt doctor` |
Rules:
- Every mutating `rrt` command takes `--dry-run`. Use it first, show the user the
preview, and only apply after they confirm.
- Never edit a version string by hand in more than one file — that is what `rrt bump` is for.
- Never hand-edit the `[Unreleased]` changelog section while the rrt hooks are active.
- If `rrt` is connected over MCP, prefer the `mcp__rrt__*` tools over shelling out:
typed responses for most tools, no shell quoting of commit subjects, and dry-run is
the default. Shell out for anything with no MCP tool (`rrt docs map`, `rrt docs
generate`, `rrt docs publish`, `rrt docs inject`, `rrt tree --check`, `rrt toc`,
`rrt changelog lint`, `rrt changelog compare`, `rrt drift generate`/`check`,
`rrt artifacts --check`, other `--snapshot` writes, `rrt-hooks *`).
- `rrt --help` lists every command. Check it before concluding rrt cannot do something.
repo-release-tools is released under the MIT License.
Some workflow ideas were initially inspired by
joseluisq/gitnow, but the rrt git
surface is intentionally narrower and reshaped around conventional branching,
safe commits, and release automation.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
uvx repo-release-toolsMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-anselmoo-repo-release-tools": {
"command": "uvx",
"args": [
"repo-release-tools"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceio.github.Anselmoo/repo-release-tools works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.