RodarRelease

Version management and release utilities for Rodar projects. Automates semantic version bumping, changelog updates, git commits/tags.

Installation

Add rodar_release to your list of dependencies in mix.exs:

def deps do
  [
    {:rodar_release, "~> 0.1.0"}
  ]
end

With Igniter

If your project uses Igniter, you can install with automatic setup:

mix igniter.install rodar_release

This creates a CHANGELOG.md with the standard Keep a Changelog structure if one doesn't exist. To also configure a custom AI CLI:

mix igniter.install rodar_release --ai-cmd gemini

Without Igniter

If your project does not use Igniter, follow these steps after adding the dependency:

  1. Create CHANGELOG.md in your project root with the Keep a Changelog structure:

     # Changelog
    
     All notable changes to this project will be documented in this file.
    
     The format is based on [Keep a Changelog](https://keepachangelog.com),
     and this project adheres to [Semantic Versioning](https://semver.org).
    
     ## [Unreleased]
    
     ## [0.1.0] - 2026-01-01
    
     ### Added
    
     - Initial release

    Replace 0.1.0 with your current version and 2026-01-01 with today's date.

  2. (Optional) Configure AI CLI for changelog generation in config/config.exs:

     config :rodar_release, :ai_cmd, {"claude", ["-p"]}   # default (Claude Code)
     config :rodar_release, :ai_cmd, {"gemini", ["-p"]}   # Gemini CLI
     config :rodar_release, :ai_cmd, {"codex", ["e"]}     # OpenAI Codex
     config :rodar_release, :ai_cmd, {"gh", ["-p"]}       # GitHub Copilot

    If omitted, Claude Code is used by default.

  3. (Recommended) Install the changelog skill for AI-assisted dev tools:

     npx skills add rodar-project/rodar_skills --skill changelog

Semantic Versioning

This tool follows Semantic Versioning (MAJOR.MINOR.PATCH):

Pre-release identifiers (e.g. 1.0.0-rc.1) and build metadata (e.g. 1.0.0+build.42) are part of the semver spec but are not currently supported by this tool.

Usage

mix rodar_release              # list available commands
mix help rodar_release.patch   # help for a specific command

Commands

Release

mix rodar_release.patch              # bug fix:        1.0.8 -> 1.0.9
mix rodar_release.minor              # new feature:    1.0.8 -> 1.1.0
mix rodar_release.major              # breaking change: 1.0.8 -> 2.0.0
mix rodar_release.minor --dry-run    # preview changes
  1. Validates the git working directory is clean
  2. If [Unreleased] in CHANGELOG.md is empty, offers to generate an entry using Claude Code (requires claude CLI)
  3. Bumps the version in mix.exs
  4. Updates CHANGELOG.md with the release date and comparison links
  5. Commits changes with message release: vX.Y.Z
  6. Creates an annotated git tag vX.Y.Z

AI-generated changelog

When releasing with an empty [Unreleased] section, the tool gathers the git log and diff since the last tag and asks an AI CLI to suggest a changelog entry using Keep a Changelog headings (### Added, ### Changed, ### Fixed, ### Removed). You are prompted to confirm before anything is written.

By default it uses Claude Code. To use a different AI CLI, configure the command and args in your config.exs:

config :rodar_release, :ai_cmd, {"claude", ["-p"]}   # default
config :rodar_release, :ai_cmd, {"gemini", ["-p"]}   # Gemini CLI
config :rodar_release, :ai_cmd, {"codex", ["e"]}     # OpenAI Codex

The prompt is appended as the last argument.

Rollback

mix rodar_release.rollback           # undo last release (soft reset)
mix rodar_release.rollback --hard    # undo and discard changes
mix rodar_release.rollback --dry-run # preview rollback

Undoes the last release by deleting its tag and resetting the release commit. Requires the latest commit to be a release commit (release: vX.Y.Z).

Amend

mix rodar_release.amend              # fold changes into release commit
mix rodar_release.amend --dry-run    # preview amend

Amends the last release commit with any current changes and re-tags. Useful for fixing a typo or adding a missing file right after releasing.

Options

Option Applies to Description
--dry-run all commands Preview changes without applying them
--hard rollback Discard release changes entirely

Programmatic API

RodarRelease.read_version()
#=> "0.1.0"

RodarRelease.bump("1.2.3", :minor)
#=> "1.3.0"

RodarRelease.write_version("1.3.0")