Repository navigation
ci: create a GitHub release for each tag, with notes from its pull requests - #48
Merged
Merged
Conversation
…quests Once both packages are on PyPI, the publish workflow creates the tag's GitHub release. The notes are GitHub's generated list of the pull requests merged since the previous tag, under a line linking the two PyPI versions, since the protocol's version has no tag of its own. The start tag is passed explicitly: GitHub otherwise counts from the previous release, and there are none yet, so the first release would list every pull request. Only this job may write contents, it reads the tag from the environment rather than interpolating it into the script, and an existing release is skipped, so a rerun stays safe. .github/release.yml puts Dependabot's `dependencies` pull requests in their own section. Both packages link the releases as their PyPI changelog, and the README and CONTRIBUTING describe where release notes come from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
psinghal20
approved these changes
Oct 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
The repo has 14 version tags and no GitHub Releases, so the sidebar says "No releases published" on a project that ships several times a day. From now on, every tag gets a release. Existing tags aren't backfilled.
A
releasejob inpublish-pypi.yml. It runs afterframeworksucceeds, so a release only appears once both packages are on PyPI. It runsgh release create <tag> --verify-tag --generate-notes. Each release looks like this (this is realgenerate-notesoutput for v0.9.1265):bump-versionroll into the next release. The bot's bump commit isn't a PR, so it doesn't appear.--notes-start-tag). Otherwise GitHub counts from the previous release, and since there are none, the first release would list every PR ever merged.contents: write; the PyPI jobs keep their current permissions.$GITHUB_REF_NAMEin the environment, not${{ }}interpolated into the script, to avoid script injection.ghCLI already on the runner, not a third-party action..github/release.ymlsplits the notes into Changes and Dependencies, using thedependencieslabel Dependabot already applies (build(deps): bump the python-minor-and-patch group across 1 directory with 15 updates #33 and build(deps): bump mcp from 1.28.1 to 2.3.0 #34 carry it). Library bumps won't bury features.A
Changelogproject URL on both packages, pointing to GitHub Releases, so PyPI's sidebar links it.Docs: the README's Releases section and CONTRIBUTING now say where release notes come from. CONTRIBUTING adds that a clear PR title is also the release note.
Left out on purpose: wheels as release assets (PyPI is the canonical download, and trusted publishing already records provenance there), release-please and semantic-release (they would replace the CircleCI bump flow), and a Discussions post per release (too noisy at this cadence).
How it was tested
check-jsonschemapasses forpublish-pypi.yml(vendor.github-workflows) and.github/release.yml(SchemaStoregithub-release-config).actionlintwithshellcheckreports no findings.gh:v0.9.1264, and the header namesagentenv-framework 0.9.1265andagentenv-framework-protocol 0.1.280uv buildfor both packages: the wheels'METADATAincludeProject-URL: Changelog, andtwine check --strictpasses on all four files.uv lock --checkpasses..github/release.ymlonly from the default branch.bump-versionis set, so merging tags a release. That release is the new job's first real run, and its notes should list this PR under Changes. I'll check it after the merge.🤖 Generated with Claude Code
The PR appears safe to merge; no actionable issue was established.
What we checked:
Summary
The PyPI publishing workflow now creates a GitHub release after publishing both packages, with notes covering pull requests since the previous tag. Release notes separate dependency updates, and the package pages and contributor docs point readers to them.
Diagram
%%{init: {'theme': 'neutral'}}%% flowchart LR Tag["Version tag"] --> Protocol["Publish protocol to PyPI"] Protocol --> Framework["Publish framework to PyPI"] Framework --> Release["Create GitHub release"] Release --> Notes["Notes since previous tag"]Reviews (1) · Last reviewed commit: "ci: create a GitHub release for each tag..."