communique 1.2.4

Editorialized release notes powered by AI
<p align="center">
  <img src="docs/public/logo.svg" width="140" alt="communiqué logo">
</p>

# communique

AI-generated release notes for people who read release notes.

communique turns your git history, pull requests, and repository context into
polished release notes. It can print notes locally, update `CHANGELOG.md`, or
publish directly to a GitHub Release.

## Sponsors

communique is sponsored by [entire.io](https://entire.io) and [37signals](https://37signals.com).

[View all sponsors](https://jdx.dev/sponsors.html).

## Install

Install with [mise](https://mise.jdx.dev):

```sh
mise use communique
```

Or install with Cargo:

```sh
cargo install communique
```

Pre-built binaries for macOS, Linux, and Windows are available on the
[GitHub releases page](https://github.com/jdx/communique/releases).

## Setup

communique needs an LLM API key. Claude models use Anthropic; other models use
the OpenAI-compatible provider path.

```sh
# Default Claude models
export ANTHROPIC_API_KEY="sk-ant-..."

# OpenAI-compatible models
export OPENAI_API_KEY="sk-..."
```

GitHub context and GitHub Release publishing also need a token:

```sh
export GITHUB_TOKEN="$(gh auth token)"
```

Initialize a config file in your repository:

```sh
communique init
```

This creates `communique.toml`, where you can set the default model, repository,
style instructions, and project context.

## Generate Release Notes

Generate notes for a tag:

```sh
communique generate v1.2.0
```

communique automatically detects the previous tag. You can provide it explicitly
when needed:

```sh
communique generate v1.2.0 v1.1.0
```

Preview without publishing or verifying links:

```sh
communique generate v1.2.0 --dry-run
```

Write the output to a file:

```sh
communique generate v1.2.0 --output RELEASE_NOTES.md
```

## Update GitHub Releases

Publish generated notes to an existing GitHub Release:

```sh
communique generate v1.2.0 --github-release
```

communique reads commits and pull requests, lets the model inspect relevant
files and diffs, verifies links, then replaces the GitHub Release body with the
finished notes.

## Update CHANGELOG.md

Add or replace the version entry in `CHANGELOG.md`:

```sh
communique generate v1.2.0 --changelog
```

For release PRs, this keeps the `[Unreleased]` section in place and inserts the
new version entry immediately below it.

Use concise output when you do not want a full release narrative:

```sh
communique generate v1.2.0 --concise
```

You can combine concise output with changelog updates:

```sh
communique generate v1.2.0 --concise --changelog
```

## Configuration

`communique.toml` supports project-level defaults and writing guidance:

```toml
context = """
This is a Rust CLI used by platform engineers.
Call out breaking changes and migration steps clearly.
"""

system_extra = """
Write in a direct, practical tone.
Avoid marketing language.
"""

[defaults]
model = "claude-opus-4-8"
repo = "owner/repo"
max_tokens = 16384
```

CLI flags override config defaults.

## GitHub Actions

Use `fetch-depth: 0` so communique can compare tags:

```yaml
name: Release Notes

on:
  push:
    tags:
      - v[0-9]+.*

permissions:
  contents: write

jobs:
  release-notes:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - uses: jdx/mise-action@v3
      - run: mise use communique
      - name: Generate release notes
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: communique generate "${{ github.ref_name }}" --github-release
```

See the [GitHub Actions guide](docs/guide/github-actions.md) for release-plz
examples and release PR workflows.

## Common Options

```sh
communique generate v1.2.0 --repo owner/repo
communique generate v1.2.0 --model claude-opus-4-8
communique generate v1.2.0 --provider openai --base-url https://api.example.com/v1
communique generate v1.2.0 --quiet
communique generate v1.2.0 --verbose
```

## Troubleshooting

If PR details are missing, confirm `GITHUB_TOKEN` is set and can read the
repository.

If generation fails because tags cannot be compared, fetch full history and
tags:

```sh
git fetch --tags --unshallow
```

If `CHANGELOG.md` updates fail, make sure the file has an `## [Unreleased]` or
`## Unreleased` section.

## Documentation

- [Getting started]docs/guide/getting-started.md
- [Configuration]docs/guide/configuration.md
- [GitHub Actions]docs/guide/github-actions.md
- [CLI reference]docs/cli/index.md