release-kit 0.9.14

A canonical release workflow: a technology-agnostic method, per-technology bindings, and the rk CLI that lands and serves them.
Documentation
# git-cliff configuration. rk release request asks git-cliff for the next
# version, which git-cliff derives from Conventional Commits, and writes the
# changelog through it deterministically. pyproject.toml stays the committed
# source of truth, and uv version writes it together with uv.lock.

[changelog]
header = """
# Changelog

All notable changes to this project are documented in this file.
"""
body = """
## [{% if version %}{{ version | trim_start_matches(pat="v") }}{% else %}unreleased{% endif %}]{% if timestamp %} - {{ timestamp | date(format="%Y-%m-%d") }}{% endif %}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group }}
{% for commit in commits %}
- {{ commit.message | upper_first }}
{%- endfor %}
{% endfor %}
"""
trim = true

[git]
conventional_commits = true
filter_unconventional = true
tag_pattern = "v[0-9].*"
commit_parsers = [
  { message = "^feat", group = "Added" },
  { message = "^fix", group = "Fixed" },
  { message = "^docs", group = "Documentation" },
  { message = "^perf", group = "Performance" },
  { message = "^refactor", group = "Refactored" },
  { message = "^chore\\(release\\)", skip = true },
  { message = "^chore", group = "Miscellaneous" },
]

[bump]
# A project whose committed version has no release yet, such as a fresh
# 0.1.0, proposes that version unchanged. Only a 0.0.0 baseline takes this
# initial tag as its first proposal.
initial_tag = "v0.1.0"
# Before 1.0.0 the minor position is the breaking position: a feature bumps
# the patch and a breaking change bumps the minor, per the method invariant.
features_always_bump_minor = false
breaking_always_bump_major = false