feat: add automated versioning and release process - #113
Merged
Merged
Conversation
The repo had no tags, no GitHub releases and no changelog, so the `serverInfo.version` clients see mapped to no checkout-able commit. Add release-please (`release-type: python`) on push to `main`. It opens a release PR that bumps `pyproject.toml` and writes `CHANGELOG.md` from Conventional Commit messages; merging it tags the commit and cuts a GitHub Release. The manifest is seeded at 1.1.0 so the first automated bump continues from today's version instead of restarting at 0.1.0. A release produces a GitHub Release with source and changelog only. Pushing `ghcr.io/goodbyeplanet/semcode:X.Y.Z` is left as a follow-up. Dependabot now uses the `deps` prefix rather than `chore(deps)`, so a week of dependency updates still cuts a patch release marking which dependency set was tested together. `changelog-sections` alone controls changelog display, not version bumping, so the prefix is what makes this deterministic. `CHANGELOG.md` is reconstructed by hand for 0.1.0, 1.0.0 and 1.1.0 from the full history, since nothing before this commit was ever released. Version boundaries come from `pyproject.toml`: 0.1.0 at init, 1.0.0 at the rename to semcode (d2d2c50), 1.1.0 at d8c0f1c. Document the contract in README.md and .claude/CLAUDE.md: commits must be Conventional Commits, `pyproject.toml` stays the single source of truth, and the version is never edited by hand. Refs #111 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Closes #111
The repo had zero tags, zero GitHub releases and no changelog, so the
serverInfo.versionclients read fromimportlib.metadatamapped to no commit anyone could check out. This adds the release process.What a release looks like now
release-please watches
main, opens achore(main): release X.Y.ZPR that bumpspyproject.tomland writesCHANGELOG.mdfrom Conventional Commit messages. Merging that PR tags the commitvX.Y.Zand cuts a GitHub Release. Nothing ships until a human merges it.A release produces a GitHub Release with source and changelog only — no PyPI, no image. Pushing
ghcr.io/goodbyeplanet/semcode:X.Y.Zis the one with real user-facing value and is left as a follow-up, per the issue..github/workflows/release.ymlrelease-please-action@v4on push tomain,contents:write+pull-requests:write, concurrency-guardedrelease-please-config.jsonrelease-type: python, packagesemcode, explicitchangelog-sections.release-please-manifest.json{".": "1.1.0"}so the first automated bump is 1.2.0, not 0.1.0CHANGELOG.md0.1.0/1.0.0/1.1.0.github/dependabot.ymlchore(deps)→depsREADME.md,.claude/CLAUDE.mdDecisions taken
Dependabot prefix changed to
deps. The issue asked whetherchore(deps):should warrant a release. It should — weeks of Dependabot merges otherwise produce no release boundary. Butchangelog-sectionsonly controls changelog display, not version bumping, and achore-typed commit won't reliably surface. Switching the prefix makes "deps → patch bump, listed under Dependencies" deterministic. Existingchore(deps)commits are all pre-tag, so nothing is lost.Changelog reconstructed from the full history, not seeded with a stub. Version boundaries came from
pyproject.tomlitself:0.1.0at init (2026-04-23),1.0.0at the rename to semcode (d2d2c50),1.1.0atd8c0f1c. All 70 referenced SHAs resolve. Entries from1.2.0onward are generated; the reconstructed ones are documented as frozen.Squash-merge titles: no settings change needed. The issue flagged this, but it only bites under squash-merging. This repo merge-commits, so the branch's real commits stay on
mainand release-please reads those;Merge pull request #NNNsubjects have no Conventional Commit type and are skipped. The inverse applies instead — every branch commit becomes a changelog line, so keep branch commits release-worthy or squash locally. Also: don't repeat780b670 feat: Merge conflicts— a hand-labelled merge commit like that would count as a minor bump.Tags — needs a push
Created locally, not pushed, since pushing tags is irreversible:
v0.1.0→d085d6dv1.0.0→d2d2c50v1.1.0→0f9af33(currentmain, notd8c0f1c)v1.1.0sits on currentmainbecause five commits — including the full-text-index perf work and the recall fix — shipped under that version number after the bump. It also gives release-please its commit boundary, so the first generated changelog covers only new work rather than rescanning all 181 commits. The three tags together make everycompare/link inCHANGELOG.mdresolve.Verification
uvx ruff format --check .clean,uvx ruff check .clean, 330 tests pass. JSON and YAML parse; every changelog SHA resolves. The release workflow itself can't be exercised until this is onmain.🤖 Generated with Claude Code