Skip to content

A release's notes are what its pull requests tell users, grouped as New, Improved and Fixed - #170

Merged
danipen merged 10 commits into
mainfrom
feature/release-notes-from-pull-requests
Oct 30, 2026
Merged

danipen merged 10 commits into
mainfrom
feature/release-notes-from-pull-requests

Conversation

@danipen

@danipen danipen commented Oct 30, 2026

Copy link
Copy Markdown
Member

What does this pull request do?

A new release's description, on the releases page and in What's New, is now the release notes its pull requests wrote for users, grouped as New, Improved and Fixed, instead of GitHub's list of pull request titles.

Release note

None: changes how a release's notes are put together; the What's New pull request carries the note users read.

Current behavior

The Release workflow opens the draft with gh release create --generate-notes: one line per pull request title, "by @user in https://github.com/…/pull/N".

Behavior with this pull request

The draft's description is, for the pull requests merged since the last release:

## New

### Run your own tools on files, changesets and branches

Add the tools you use every day … in **Settings › Tools**.

## Improved
…
## Fixed
…
## Other changes

- Mentions find any user on the server (#167)

**Full Changelog**: https://github.com/Unity-Technologies/uvcs-desktop-client/compare/v0.2.4...v0.2.5
  • Each note in the order its pull request reached main, under its kind.
  • Pull requests whose note says None: and Dependabot's are left out.
  • Those without a note it can read (merged before notes were asked for) are listed by title under "Other changes", so nothing is lost while the change settles in.
  • With nothing for users: "No changes for users in this version."

The draft can still be edited before publishing, as today.

How it was implemented

  • releaseNotesMarkdown (scripts/build/releaseNotes.ts): takes the pull requests as gh pr view --json number,title,url,body,author prints them and reads each body with readReleaseNote (Every pull request carries a release note for users, checked by CI #169). It runs as a command too: node scripts/build/releaseNotes.ts pull-requests.json [changelog-url].
  • .github/workflows/release.yml, "prepare" job:
    • Finds the pull requests from main's merge commits since the last release tag (Merge pull request #N from <owner>/…, matched on the repository's owner so the merges kept from its first home, whose numbers repeat, are left out), in topological order, without repeats.
    • Fetches each with gh pr view, joins them with jq -s, and opens the draft with --notes-file.
    • shell: bash with set -euo pipefail, so a pull request that can't be read fails the run instead of going missing.
    • It relies on main's merge method ("merge") and default message, which the step's comment and docs/features/updates.md say.
  • tsconfig.node.json: allowImportingTsExtensions, so a build script can import another by its .ts name, as Node's type stripping needs (the typecheck already runs with --noEmit).
  • Dropped:
    • GitHub's --generate-notes with a .github/release.yml grouping by labels: labels must be kept by hand, and its output is still titles.
    • Reading the pull requests through GitHub's API by date: merge commits on main are what the release actually holds.

Stacked on #169, which adds readReleaseNote; this pull request's base is that branch.

Behavior changes

  • The next release's draft looks different: grouped notes instead of a list of titles. Pull requests merged before Every pull request carries a release note for users, checked by CI #169 appear under "Other changes" by title.
  • If a pull request can't be read while preparing a release, the run now fails after pushing the tag: open the draft by hand, or delete the tag and run again (the step's comment says so).

Checklist

  • npm run typecheck and npm test pass (8,526). What the new tests cover: grouping and order; None: and Dependabot left out (its author as gh prints it, app/dependabot); pull requests without a readable note under "Other changes"; nothing for users; no changelog link without a last tag.

  • Seen working: nothing in the app changes. The step's shell was dry-run locally on the real history since v0.2.4: it found Mentions find any user on the server #167 and A selected chip at the start of a line keeps its whole ring in a comment field #168 and printed the notes above; a Dependabot pull request (Bump undici from 6.29.0 to 6.29.1 #154) added to the list was left out.

  • npm run e2e: not needed, nothing in the app changes.

  • Other areas the change reaches: pinnedActions.test.ts (no new action).

  • Reviewed in a clean context. Fixed for it:

    • Dependabot matched under REST's dependabot[bot] login, never gh's app/dependabot.
    • No pipefail, so a failed gh pr view silently dropped a pull request.
    • Merges from the repository's first home and repeated numbers; merge order (--topo-order).
    • A dead ?? ''; the doc's wrap.
    • In Every pull request carries a release note for users, checked by CI #169: notes with a # or ## heading or an unclosed code block, which would break the groups, are now refused.

    Kept: this pull request's note says None:, as the What's New pull request carries the note users read.

  • docs/ says what's now true: docs/features/updates.md ("What's New" and the Release workflow).

Fixed issues

None.

🤖 Generated with Claude Code

danipen and others added 10 commits October 30, 2026 11:11
…ed and Fixed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Fixed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s New, Improved and Fixed

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…thor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heir author

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n't read, and reads only this repository's merges

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… messages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base automatically changed from chore/release-notes-harness to main October 30, 2026 10:39
@danipen
danipen added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 5d194de Oct 30, 2026
9 checks passed
@danipen
danipen deleted the feature/release-notes-from-pull-requests branch October 30, 2026 10:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant