Changelog

Unreleased

Added

  • Repeat --artifact-url, with a matching --artifact-label for each, to list every published package on one line. Each package link starts with an emoji for its ecosystem, such as 🐍 for PyPI, and the comparison link now reads 📜 Full Changelog.

4.2.0 (2026-10-26)

Changes

  • Knope changeset frontmatter is now read with knope’s own line rule instead of a YAML parser, and release-creator no longer depends on PyYAML (#43) by @gaborbernat.

4.1.0 (2026-10-26)

Added

  • Every command now explains on stderr what it decided and why (#41) by @gaborbernat.

4.0.0 (2026-10-26)

Added

  • validate-news rejects a fragment or Knope changeset that contains the private-use character U+E000 or an unclosed Markdown code fence, and a reStructuredText fragment with a parser warning or error, such as an unknown directive or role, an empty code-block, or an include. These were caught only when preparing or publishing the release; fragments and notes no longer reject them (#37) by @gaborbernat.

Changes

  • fragments, validate-news and contributors run git and gh without looking them up on PATH first. A missing executable now fails with the operating system’s “No such file or directory” error instead of git is required or gh is required (#37) by @gaborbernat.

  • validate-news rejects Towncrier section entries and a package without an explicit directory only when the pull request changes the [tool.towncrier] table or towncrier.toml compared with --base (#37) by @gaborbernat.

Breaking changes

  • Remove tags --require-newer and the require_newer_tag function. tags <tag> without --previous no longer only validates the tag’s format; it selects the predecessor like --previous (#37) by @gaborbernat.

  • Remove the validate-fragment-deletions command and the validate_fragment_deletions function. It only re-checked the release commit that release preparation itself produced (#37) by @gaborbernat.

  • The fragments linker no longer fails for a shallow checkout, a fragment without an introducing commit, or a commit without exactly one squash-merged pull request. A fragment whose commit has no squash-merged pull request gets no pull request link and credits the commit author after Git’s mailmap, as the GitHub login for a GitHub noreply email and otherwise as the author name, dropping AI assistants and the [bot] suffix as pull request credits do. With several squash-merged pull requests the first is used. In a shallow checkout, and for a fragment without a commit or with an AI assistant author, the fragment stays unchanged. add_pull_request_links takes a new required commits argument, and fragment_commits_from_git returns FragmentCommit values (#37) by @gaborbernat.

  • The fragments linker no longer re-checks fragments that validate-news already checked on the pull request. It links a structured fragment, a named fragment that already links its pull request, a name without the + prefix, and a fragment with several hand-written credits instead of failing. A hand-written credit stays as written, and the linker appends the pull request link and computed credit after it. tags --next treats a name without the + prefix as a patch change. fragment_number is removed (#37) by @gaborbernat.

  • anchors returns a changelog without release headings unchanged instead of failing with no Markdown release headings found (#37) by @gaborbernat.

  • changelog no longer rejects an --output that is the tracked changelog or a --fragments directory that does not exist. render_preview no longer requires exactly one ## <package> section: it uses the first one, and with none the page has no released history (#37) by @gaborbernat.

  • contributors no longer rejects a changelog path other than .md or .rst, --package with a reStructuredText changelog, a section that already has a New Contributors subsection, a linked pull request that is not merged, or a reStructuredText section without a category heading. Unmerged pull requests are skipped, and the subsection heading falls back to a - underline (#37) by @gaborbernat.

  • fragments, notes, contributors, tags and the changelog preview no longer reject a malformed --repository, --tag, --previous or --package value, a notes --package that does not match the tag’s package, or a non-HTTPS --artifact-url. They use the value as given (#37) by @gaborbernat.

  • marketplace no longer rejects a local plugin ZIP that contains no files; it compares it with Marketplace like any other archive (#37) by @gaborbernat.

  • notes --package with a reStructuredText changelog no longer fails with package selection requires a Markdown changelog; the package is ignored (#37) by @gaborbernat.

  • notes and contributors use the first matching version section, and the first ## <package> section, instead of requiring exactly one; a missing section now raises StopIteration. notes renders an unknown category under its own name, passes Markdown text outside a category or item through unchanged, keeps empty Markdown categories, and renders reStructuredText blocks outside a category or item, and unsupported nested blocks such as a nested .. warning::, as plain text instead of failing (#37) by @gaborbernat.

  • tags --previous prints nothing for a target tag that is not a major.minor.patch release, or that names another package than --package, instead of failing. tags --next with no pending fragments selects a patch release instead of failing with no changelog fragments to release (#37) by @gaborbernat.

  • validate-news no longer rejects an empty --base, a Towncrier changelog filename other than .md or .rst, a pyproject.toml without [tool.towncrier], or a knope.toml without exactly one package. validate-news and changelog no longer check the shape of Knope extra_changelog_sections. With several [packages.<name>] tables, the first one is used (#37) by @gaborbernat.

3.2.1 (2026-10-26)

Fixed

  • The fragments linker asks GitHub about at most 40 fragment commits per GraphQL query. A batch of 50 or more exceeded GitHub’s node limit and failed with MAX_NODE_LIMIT_EXCEEDED, so release preparation with many fragments aborted (#36) by @gaborbernat.

  • The fragments linker skips a merge commit author that has no linked GitHub account and no name, instead of aborting the run with unnamed merge commit author (#36) by @gaborbernat.

  • contributors finds the version section the same way notes does, so it also accepts a leading v, a reStructuredText title that links the version to its tree, and a Keep a Changelog ## [1.2.3] - 2026-10-25 heading. Before, it reported found 0 for these changelogs (#36) by @gaborbernat.

Security

  • The fragments linker also drops merge commit authors and pull request authors whose GitHub login is a known AI assistant (claude, codex, CommandCodeBot, Copilot, in any letter case), as contributors already does. Before, only AI assistant commit emails were dropped. When no author remains, the linker adds the pull request link without a credit (#36) by @gaborbernat.

  • validate-news and the fragments linker also detect a by credit in any letter case after any non-word character, such as (by @alice) or By @alice; a :user: role with any content, such as a display name or a [bot] login; :user:, :pr: and :pull: role names in any letter case; a Markdown profile link whose text is a code span; and an HTML anchor or HTML block that links a pull request or contains #123. validate-news rejects them as hand-written attribution, and the linker treats them as already credited or linked (#36) by @gaborbernat.

3.2.0 (2026-10-25)

Added

  • Add --package to contributors. It finds the version section inside the ## <package> section of a shared Markdown changelog the same way notes --package does, and gives the New Contributors subsection that package’s #### heading and anchor (#35) by @gaborbernat.

Fixed

  • notes --package and contributors --package keep a package version anchor that sits directly after its own version heading inside that version’s section. Before, the anchor ended the section, so notes rendered toml-fmt releases with only the Full Changelog link. notes leaves the version anchor out of the release body, which starts at the first category anchor (#35) by @gaborbernat.

3.1.0 (2026-10-25)

Added

  • Add the contributors command. After towncrier build, it appends a New Contributors subsection to the new version’s section for each pull request author, other than bots and AI assistants, whose first merged pull request in the repository is in this release. notes renders that subsection last in the GitHub Release body (#34) by @gaborbernat.

  • Restore the 2.0.0 fragments, validate-news, changelog and anchors commands, Knope changeset support, tags --previous, the Towncrier templates, and the full notes rendering: reStructuredText to GitHub Markdown, anchors, category headings, the New Contributors section, and the artifact and Full Changelog links (#34) by @gaborbernat.

  • The fragments linker credits the pull request author and every human author of its merge commit, including Co-authored-by trailers, in commit order. It drops AI assistant identities, credits bots only when no human remains, and credits an author without a GitHub account by the trailer name (#34) by @gaborbernat.

Security

  • validate-news and the fragments linker also detect a bare by @handle credit, a :user: role anywhere in the prose, and a bare #123 reference, so validate-news rejects them as hand-written attribution. The rejection also covers the body of each changeset checked by validate-news --format knope (#34) by @gaborbernat.

  • validate-news rejects a Towncrier fragment that already credits an author or links a pull request, so only the fragments linker writes them (#34) by @gaborbernat.

Removed

  • Remove notes --generated-notes. notes no longer reads GitHub’s generated notes or renders a New Contributors section from them; the release body contains only the tagged changelog section (#34) by @gaborbernat.

  • Remove the hooks command. Hook updates move to Dependabot’s pre-commit ecosystem, and pre-commit.ci keeps running the hooks (#34) by @gaborbernat.

  • notes no longer checks changelog credits against GitHub’s generated notes or pull request authors, pull request link labels against their targets, or pull requests missing from the generated notes, and drops the raw HTML and GitHub link path checks that served those checks (#34) by @gaborbernat.

3.0.0 (2026-10-25)

Changes

  • The Towncrier templates always append the fragment’s issue references, as Towncrier’s own template does, since no linker adds them to the text any more (#33) by @gaborbernat.

Breaking changes

  • hooks rejects environment markers on direct dependencies, YAML aliases anywhere in the configuration, and flow-style lists that need managed pins, instead of rewriting them (#33) by @gaborbernat.

  • notes prints the tagged section in the changelog’s own format without its heading and accepts only --changelog, --tag and --package. It no longer renames categories, checks credits, adds artifact or comparison links, or converts reStructuredText to Markdown, and drops the docutils, markdown-it-py, mdformat and mdformat-gfm dependencies (#33) by @gaborbernat.

Security

  • hooks rejects dependencies that uv would read as an option, URL or path, and UV_*, PIP_* or PYTHON* keys in default_env or a hook’s env, since each could install packages the cooldown never checked (#33) by @gaborbernat.

Removed

  • Remove tags --previous; find the comparison base with git describe --tags --abbrev=0 --first-parent (#33) by @gaborbernat.

  • Remove the changelog and anchors commands and the Knope changeset support behind them (#33) by @gaborbernat.

  • Remove the fragments and validate-news commands; check news with towncrier check --compare-with and let gh release create --generate-notes credit authors. A +name fragment no longer gains a pull request link or by credit in the documentation changelog, and towncrier is no longer a runtime dependency (#33) by @gaborbernat.

  • Remove the locks command and the tomli-w dependency; generate a selectable project lock with nab lock (#33) by @gaborbernat.

2.0.0 (2026-10-25)

Changes

  • Make tags --next auto select a major release for a removal fragment, as it does for breaking, because a removed interface breaks its callers (#32) by @gaborbernat.

Fixed

  • Keep a literal ~ from a reStructuredText changelog escaped in GitHub release notes, so GitHub does not render ~text~ as strikethrough (#32) by @gaborbernat.

  • Lock a workspace member’s dependencies, and the dependencies of the project’s own extras, in place of a published copy from PyPI when a runtime dependency or extra names that member or the project itself (#32) by @gaborbernat.

  • Preserve inline code spacing and HTML entity text in GitHub release notes. Keep pull request links and verified credits with their change item across HTML breaks. Reject fragment structures that move attribution outside Towncrier’s list item and malformed HTML literal elements that are self-closing, unclosed, or crossed (#32) by @gaborbernat.

  • Resolve each release-* group under the pins of project-runtime and of the release-* groups before it, so a lock whose release selections cannot be installed together fails when it is refreshed rather than in the release job (#32) by @gaborbernat.

  • Resolve hook dependencies for a free-threaded language_version such as python3.14t instead of failing (#32) by @gaborbernat.

  • Treat a reStructuredText X.Y.Z (date) line as a release heading only when an adornment underlines it, so a version mentioned in an entry no longer ends the section (#32) by @gaborbernat.

Documentation

  • Restore the verified contributor credit for pull request #4 in the 0.1.1 changelog entry (#32) by @gaborbernat.

Breaking changes

  • Record the resolving uv version as uv-version in pylock.toml and make locks --check report a different uv before comparing the lock. Stop writing the [tool.nab] creation stamp. Existing locks must be refreshed (#32) by @gaborbernat.

  • Remove the locks options --project, --output, --tool-python, --build-requirement and --exclude-newer-package, which no caller used. The command reads pyproject.toml and writes pylock.toml in the current directory. Declare dynamic build requirements in a build dependency group and package cutoffs in [tool.release-creator.locks.exclude-newer-package] (#32) by @gaborbernat.

  • Remove the tags --next calver choice, which no caller used (#32) by @gaborbernat.

Security

  • Check credits and links inside inline HTML elements such as <code> in GitHub release notes, since GitHub renders them. Reject release entries and fragments with <details>, <summary>, or an HTML comment left open across blocks, which could hide the real author behind a false credit (#32) by @gaborbernat.

  • Check the visible text of every link in GitHub release notes. A link label that shows a pull request number, such as #5, (#5), GH-5 or a pull request URL, must point to that pull request in the release repository; credits inside link labels and GitHub links with ., .. or percent-encoded path segments are rejected (#32) by @gaborbernat.

  • Reject additional_dependencies on a hook whose language, set in the configuration or in the hook repository’s manifest, is not Python, because those dependencies would install unpinned and uncooled (#32) by @gaborbernat.

  • Reject a YAML merge key at the root of the pre-commit configuration, which hid every remote hook from the dependency closure check (#32) by @gaborbernat.

  • Reject managed hook dependency pins that select extras, because uv ignores extras in constraints and the extra’s dependencies would install unpinned (#32) by @gaborbernat.

  • Reject pre-commit configurations where two hook repositories share a hook list or hook through a YAML alias, which resolved only one repository’s dependency closure, and dependency lists that reuse an anchored entry, which received managed pins at the anchor (#32) by @gaborbernat.

  • Resolve locks with --no-python-downloads, so locks builds source distributions only with an installed Python instead of fetching a managed interpreter (#32) by @gaborbernat.

1.1.0 (2026-10-24)

Added

  • Check proposed pre-commit hook dependency pins without changing the configuration (#31) by @gaborbernat.

  • Export one selectable pylock.toml for a project’s runtime dependencies, groups, extras, Python range, and platforms (#31) by @gaborbernat.

Fixed

  • Ignore contextual pull request URLs when checking a changelog entry’s linked author credit (#31) by @gaborbernat.

Removed

  • Remove the unused package changelog CLI mode while keeping render_preview for Python callers (#31) by @gaborbernat.

1.0.1 (2026-10-24)

Security

  • Keep the required pull request check distinct from dispatch and push checks, so a skipped hook cooldown cannot satisfy branch protection (#30) by @gaborbernat.

1.0.0 (2026-10-24)

Fixed

  • Accept trailing slashes and the www.github.com host in verified release-note author links (#29) by @gaborbernat.

  • Accept valid YAML comments and quoting in Knope changeset front matter during news validation (#29) by @gaborbernat.

  • Apply one author credit to adjacent pull request references separated by whitespace or semicolons (#29) by @gaborbernat.

  • Do not count reviewer mentions as pull request author credits (#29) by @gaborbernat.

  • Escape URL punctuation when converting reStructuredText links to GitHub release Markdown (#29) by @gaborbernat.

  • Finalize a CalVer prerelease in the current month before incrementing its patch number (#29) by @gaborbernat.

  • Find the introducing commit for renamed fragments and fragments whose filenames contain non-ASCII characters (#29) by @gaborbernat.

  • Identify fragment commits by full path so nested files with the same name cannot change pull request attribution (#29) by @gaborbernat.

  • Ignore numeric fragments of unrelated bare URLs when checking release-note pull request credits (#29) by @gaborbernat.

  • Ignore pull request references inside code when linking changelog fragments (#29) by @gaborbernat.

  • Keep a numbered issue in a changelog entry when its digits only appear as the start of a longer pull request number (#29) by @gaborbernat.

  • Keep direct dependencies in a flow-style list when a trailing comment contains the managed-pin marker (#29) by @gaborbernat.

  • Keep fenced package headings inside their changelog section and reject unsupported pending fragment files in documentation previews (#29) by @gaborbernat.

  • Keep generated hook dependency pins with a folded or literal dependency item when another YAML key follows it (#29) by @gaborbernat.

  • Keep literal tildes in reStructuredText changelog entries when rendering GitHub Markdown (#29) by @gaborbernat.

  • Leave fenced code examples unchanged when repairing Markdown release anchors (#29) by @gaborbernat.

  • Match explicit GitHub author credits without case sensitivity and treat GitHub mannequin authors as unavailable accounts (#29) by @gaborbernat.

  • Pin ranged and unpinned Python hook dependencies before they run in release preparation. Preserve the caller’s version range across updates and reject YAML aliases that share an edited dependency list (#29) by @gaborbernat.

  • Preserve comments on direct dependencies when updating a flow-style hook mapping (#29) by @gaborbernat.

  • Preserve wrapped reStructuredText release notes and verify credits on short, repository-prefixed, and issue-form pull request links. Ignore pull request syntax inside code spans and blocks when checking credits (#29) by @gaborbernat.

  • Reject misleading pull request labels and GitHub author links after resolving Markdown references and nested markup (#29) by @gaborbernat.

  • Reject raw HTML hyperlinks in release entries so an @handle credit cannot point to another person (#29) by @gaborbernat.

  • Reject release-note lines that embed markup inside a category anchor (#29) by @gaborbernat.

  • Reject unsupported or empty changelog fragments in the pull request news check (#29) by @gaborbernat.

  • Render package release anchors when the package name contains underscores (#29) by @gaborbernat.

  • Require the merged pull request author in the fragment’s author list; a later reviewer mention does not count as a credit (#29) by @gaborbernat.

  • Rerun eligible hook cooldown checks daily so an unchanged bot update can become mergeable after seven days (#29) by @gaborbernat.

  • Resolve Python hook dependencies for the manifest’s language_version when the caller does not override it (#29) by @gaborbernat.

  • Resolve hook dependencies from PyPI even when the caller sets uv or pip index and resolver environment variables (#29) by @gaborbernat.

  • Stop package release notes at the next version anchor, even when the following heading is missing (#29) by @gaborbernat.

Breaking changes

  • release-creator hooks now uses a seven-day package cutoff and each hook’s configured Python version without --exclude-newer or --python-version options (#29) by @gaborbernat.

Security

  • Ignore inherited SSL_CERT_DIR and SSL_CLIENT_CERT when resolving hook pins from PyPI (#29) by @gaborbernat.

  • Reject YAML merge keys in hook definitions so shared dependencies cannot bypass exact pin updates (#29) by @gaborbernat.

  • Reject duplicate pre-commit YAML keys so effective hook dependencies cannot bypass cooldown and pin updates (#29) by @gaborbernat.

  • Reject repository-level YAML merge keys before refreshing hook pins, so a merged source cannot hide the hook package (#29) by @gaborbernat.

0.6.7 (2026-10-23)

Fixed

  • Keep a pull request mentioned in prose from inheriting the author credit of a later pull request (#27) by @gaborbernat.

  • Reject unclosed Markdown code fences and keep indented fences from moving fragment links into code (#27) by @gaborbernat.

  • Report a missing Git, GitHub CLI, or uv executable by name instead of raising a type error (#27) by @gaborbernat.

0.6.6 (2026-10-23)

Fixed

  • Restore draft changelog pages for repositories with several packages in one Markdown changelog (#26) by @gaborbernat.

0.6.5 (2026-10-23)

Changes

  • Accept a symlinked plugin archive when its ZIP members match the Marketplace upload (#25) by @gaborbernat.

Fixed

  • Keep fragment links outside trailing Markdown and RST code blocks (#25) by @gaborbernat.

  • Keep frozen hook dependency pins attached to the correct hook across YAML styles (#25) by @gaborbernat.

  • Reject GitHub release notes whose pull request credits do not match the merged authors (#25) by @gaborbernat.

Removed

  • Stop validating surrounding whitespace in Marketplace plugin IDs and versions and content in ZIP directory entries (#25) by @gaborbernat.

  • Stop validating GitHub author handle syntax and 40-character Git commit IDs before querying GitHub (#25) by @gaborbernat.

  • Remove specific missing Git, GitHub CLI, and uv errors from fragment and hook commands; missing executables surface as a type error (#25) by @gaborbernat.

0.6.4 (2026-10-23)

Changes

  • Remove unused artifact reconciliation, package changelog preview, stable-tag filtering, and numbered-PR fragment options (#22) by @gaborbernat.

Fixed

  • Keep hook dependency pins with their own hook when the pre-commit configuration uses block or flow YAML, and resolve ranged root requirements (#22) by @gaborbernat.

  • Match contributor credits to the final pull request on each generated-notes line, escape RST text in GitHub Markdown, and place fragment links outside trailing code blocks (#22) by @gaborbernat.

0.6.3 (2026-10-23)

Changes

  • Show Full Changelog as a named link in GitHub Release notes and keep release headings nested in the Sphinx changelog (#21) by @gaborbernat.

0.6.2 (2026-10-23)

Documentation

  • Keep the release-creator documentation site and its versioned changelog in reStructuredText (#19) by @gaborbernat.

0.6.1 (2026-10-23)

Fixed

  • Accept Knope changelog sections configured with footers and no changeset types (#18) by @gaborbernat.

  • Apply timeouts to the Git and Towncrier commands used for fragment checks and identify the full command when it times out (#18) by @gaborbernat.

  • Ignore Towncrier guide and marker files in PR news checks, reject malformed fragment suffixes, and report unsupported Towncrier layouts clearly (#18) by @gaborbernat.

  • Reject unknown files and renamed fragments in PR news checks while ignoring editor backup files (#18) by @gaborbernat.

  • Resolve fragment pull requests in bounded batches, reject unmerged numbered requests, and credit deleted GitHub accounts as ghost (#18) by @gaborbernat.

0.6.0 (2026-10-23)

Added

  • Link named changelog fragments to squash-merged pull requests and verified human authors using Git history and GitHub (#14) by @gaborbernat.

  • Render reStructuredText changelog entries as Markdown GitHub Release notes while preserving links and author credits (#14) by @gaborbernat.

  • Return verified PyPI file URLs for trusted-publisher attestation after comparing the complete published release with local distributions (#14) by @gaborbernat.

Changes

  • Read fragment provenance from Git without --git or --commit-map; use Nab in place of the removed locks and build-constraints commands (#14) by @gaborbernat.

Fixed

  • Accept canonical prerelease, postrelease and development tags, and use PEP 440 order when selecting previous releases (#14) by @gaborbernat.

  • Finalize a matching prerelease before applying the next version bump (#14) by @gaborbernat.

  • Fix pull request lookup for named changelog fragments during release preparation (#16) by @gaborbernat.

  • Preview standard Knope changesets without extra section configuration (#14) by @gaborbernat.

  • Read Towncrier defaults and validate fragments from project subdirectories (#14) by @gaborbernat.

  • Reject changelog fragments with the wrong file extension before release (#14) by @gaborbernat.

  • Reject shallow Git histories when attributing changelog fragments to pull requests (#14) by @gaborbernat.

  • Skip non-Python hook dependencies when refreshing pre-commit pins (#14) by @gaborbernat.

Security

  • Use the final credit in generated GitHub notes when a pull request title contains a forged credit (#14) by @gaborbernat.

Packaging

0.5.1 (2026-10-22)

Fixed

  • Refresh transitive pre-commit hook dependencies alongside direct pins, including platform-specific packages (#13) by @gaborbernat.

0.5.0 (2026-10-22)

Added

  • Add a hooks command to refresh exact pre-commit additional_dependencies pins under a release-age cutoff without rewriting the rest of the hook configuration (#11) by @gaborbernat.

  • Allow repositories whose numeric Towncrier fragment stems are pull request numbers to preserve the original pull request link and verified author during historical backfills (#11) by @gaborbernat.

  • Calculate versions from v-prefixed release tags and retain that prefix when requested (#11) by @gaborbernat.

  • Check PyPI filenames and SHA256 digests before retrying a partial upload, stage only missing files, and verify the complete published set afterward (#11) by @gaborbernat.

  • Check a JetBrains Marketplace plugin against its signed ZIP before retrying an upload (#11) by @gaborbernat.

  • Export one selectable pylock.toml for a project’s runtime dependencies, groups, extras, Python range, and platforms (#11) by @gaborbernat.

  • Include YAML support in the base package so every command works without an extra (#11) by @gaborbernat.

  • Include build backend dependencies in the full project lock and select exact, hashed build constraints for the current Python and platform (#11) by @gaborbernat.

  • Link Knope changesets to merged pull requests and repair changelog anchors after release preparation (#11) by @gaborbernat.

  • Render package and Knope draft fragments beside released history in documentation builds without changing the tracked changelog (#11) by @gaborbernat.

  • Select and validate package-prefixed tags from a mixed repository tag list (#11) by @gaborbernat.

  • Select hashed build constraints for named operating systems and Python versions, and reject a shared file when their dependency selections differ (#11) by @gaborbernat.

  • Validate changed pull request fragments with the Towncrier configuration (#11) by @gaborbernat.

Fixed

  • Convert Sphinx PEP references to links in GitHub Release notes rendered from reStructuredText changelogs (#11) by @gaborbernat.

  • Convert reStructuredText links in changelog entries to Markdown links in GitHub Release notes (#11) by @gaborbernat.

  • Credit the merged pull request author for numeric fragments without losing a separate issue link (#11) by @gaborbernat.

  • Keep GitHub first-contributor credits for human pull requests without a changelog entry (#11) by @gaborbernat.

  • Keep explicit display text from reStructuredText links in GitHub Release notes (#11) by @gaborbernat.

  • Keep first-time human contributor credits when GitHub generated notes use a level-three heading (#11) by @gaborbernat.

  • Keep wrapped reStructuredText author credits attached to their release entry (#11) by @gaborbernat.

  • Preserve RST field names inside inline code when rendering GitHub release notes (#11) by @gaborbernat.

  • Preserve each reStructuredText changelog’s configured category heading level when assembling a release (#11) by @gaborbernat.

  • Preserve named historical author credits when GitHub generated notes omit a deleted account’s handle (#11) by @gaborbernat.

  • Preserve nested lists, code blocks, and warnings when rendering reStructuredText release notes for GitHub (#11) by @gaborbernat.

  • Reject named changelog fragments without a + prefix before version selection or release assembly (#11) by @gaborbernat.

  • Render a credited historical pull request when GitHub generated notes omit it (#11) by @gaborbernat.

  • Render historical RST release headings that link to a tag but have no date (#11) by @gaborbernat.

  • Render prerelease and four-part historical version sections in GitHub Release notes (#11) by @gaborbernat.

Documentation

  • Clarify when to keep uv.lock alongside the exported pylock.toml (#11) by @gaborbernat.

0.4.1 (2026-10-19)

Fixed

  • Render historical release notes for two-part version tags such as 0.2 (#10) by @gaborbernat.

0.4.0 (2026-10-19)

Added

  • Render older uncategorized release entries under Other changes without assigning a user-facing category to them (#9) by @gaborbernat.

0.3.0 (2026-10-19)

Added

  • Select one package history from a shared Markdown changelog and keep its package-prefixed comparison tags (#8) by @gaborbernat.

  • Ship a reStructuredText Towncrier template with stable anchors that follows each changelog’s heading style (#8) by @gaborbernat.

Fixed

  • Keep Towncrier’s issue links when a release contains numbered fragments alongside named fragments (#8) by @gaborbernat.

  • Read bracketed and v-prefixed Markdown release headings when rendering GitHub Release notes (#8) by @gaborbernat.

  • Reject uncategorized release items and empty category headings before tagging or publishing a distribution (#8) by @gaborbernat.

  • Replace a changelog’s existing comparison line when rendering GitHub Release notes, so the body contains one link (#8) by @gaborbernat.

  • Select automatic release versions from reStructuredText fragments as well as Markdown fragments (#8) by @gaborbernat.

0.2.0 (2026-10-19)

Added

  • Resolve merged pull request authors for changelog credits and verify them against generated GitHub release notes (#7) by @gaborbernat.

Documentation

  • Document the feature-release policy for Python support changes (#5) by @gaborbernat. Additions and drops use feature fragments and select minor releases. New releases will not install on a dropped Python version; users who need that version can install an older release.

0.1.1 (2026-10-19)

Fixed

  • Keep verified new-contributor credits when GitHub links the contributor’s first pull request with a URL (#4) by @gaborbernat.

0.1.0 (2026-10-19)

Added

  • Add post-merge pull request links to named changelog fragments, allowing contributors to write entries before a PR number exists (#1) by @gaborbernat.

  • Calculate release versions from pending changelog fragments, with explicit bump and CalVer choices (#3) by @gaborbernat.

  • Provide a Towncrier template for Markdown changelogs with stable release and category anchors (#1) by @gaborbernat.

  • Render GitHub Release notes from tagged Markdown and reStructuredText changelogs with user-facing categories, human mentions, contributor credits, and comparison links (#1) by @gaborbernat.

  • Validate numeric release tags and select the previous tag for GitHub comparison links (#1) by @gaborbernat.

Fixed

  • Format the assembled changelog before release validation so added pull request links and author credits pass prek (#2) by @gaborbernat.

Documentation

  • Document the release flow with a tutorial, command guides, input formats, and a draft changelog in PR documentation builds (#1) by @gaborbernat.