Repository navigation
Release tooling: CI tagging, single-source VERSION, CI tests, latest selector - #21
Merged
Merged
Conversation
What changed - Accept `release=latest` in the shared assets' playoffs/install.sh, alongside a pinned tag or commit. - Keep the deployed selector strict: each deploy writes the tag or commit SHA, and verification rejects a public selector still at latest. Why The shared assets no longer need a commit for every Play release just to keep a parseable pinned value; each deploy supplies the real reference. How to verify 1. Run pyright on scripts/release and `just package-check`. 2. Feed replace_selector a selector with `release=latest`; expect only that line to become the given tag or SHA.
What changed - Move publish-play, publish_play.py, and tag_play.py from scripts/release to .github/release. - Point the deploy workflow, justfile recipes, and docs at the new path. - Stop shipping the release scripts in the plugin payload. Why The scripts only serve CI deployment and maintainer tagging, so they belong with the workflow rather than in the installed skill. How to verify 1. Run `just package-check` and `just release-tag-check`. 2. Run `just release-check` from a clean checkout of main.
hubertp
requested review from
conikeec,
debasishg and
roberts-pumpurs
as code owners
October 2, 2026 15:38
What changed - Add a Tag Play release workflow that runs on every push to main and tags the pushed commit when its VERSION has no tag yet. - Report `version_unchanged` when the version's tag already sits on an earlier main commit, so merges without a bump succeed without tagging. - Remove the release-check, release-tag, and release-tag-check recipes. - Document the CI tagging outcomes and the direct publish-play check. Why Merging a version bump should produce its tag without a maintainer remembering to run a local command. How to verify 1. Merge a PR that keeps VERSION; expect `version_unchanged`. 2. Merge a version bump; expect `tagged` and a pushed vX.Y.Z tag.
What changed - Have `just package` write VERSION into the plugin manifests, plugins/play/package.json, pyproject.toml, and uv.lock. - Fail `just package-check` (and so `just check`) when any of them disagrees with VERSION. - Build the search User-Agent from VERSION at runtime. - Read VERSION in the bootstrap and install tests instead of hardcoding the release. - Show a vX.Y.Z placeholder in the README's pinned-install example. Why A release bump touched 16 files by hand, and a missed manifest or test string went unnoticed. Now a bump edits VERSION and runs `just package`. How to verify 1. Set VERSION to a new x.y.z and run `just package-check`; expect each stale copy listed. 2. Run `just package`, then `just test`; expect a clean check and pass.
What changed - Add a CI workflow that installs Node, uv, just, and typos, then runs `just test`, which runs `just check` first. - Make Codex detectable in the bootstrap apply tests with a fake executable on PATH instead of the machine's installed Codex. - Set DISPLAY in the guided-install tests that expect headed sign-in. - Give the preflight readiness test a temporary home with a rote skill. Why Nothing checked PRs before merge. On a clean runner, five tests failed because they read the developer's installed harnesses, display, and skills rather than setting them up. How to verify 1. Run `just test` locally; expect a pass. 2. Run the suite with an empty HOME, no DISPLAY, and a minimal PATH; expect the same pass.
roberts-pumpurs
approved these changes
Oct 4, 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.
Summary
release=latestin the installer selectorplayoffs/install.sh(inmodiqo/rote-releases) may holdrelease=latestor a pinned tag/SHA. Every deploy replaces it with the deployed tag (production) or SHA (staging); the deployed selector must show a concrete reference.Release scripts moved to
.github/release/publish-play,publish_play.py,tag_play.pymove out ofscripts/release/and out of the plugin payload; workflow, justfile, and docs point at the new path.CI tags releases (
.github/workflows/tag-release.yml)mainand tags the pushed commit when itsVERSIONhas no tag yet. A merge that keepsVERSIONreportsversion_unchanged; a tag on an unrelated commit fails and is never moved.release-check,release-tag, andrelease-tag-checkjust recipes.VERSIONis the only file to bumpjust packagewritesVERSIONinto the four plugin manifests,plugins/play/package.json,pyproject.toml, anduv.lock;just package-check(sojust check) fails while any disagree.VERSIONat runtime; tests readVERSIONinstead of hardcoding it; the README pin example usesvX.Y.Z.CI runs
just teston PRs and pushes tomain(.github/workflows/ci.yml)just testrunsjust checkfirst. Five tests that relied on the developer machine (Codex on PATH, a display, a rote skill in~/.claude) now set that up themselves.Notes
contents: write; a future admin-onlyv*tag ruleset must allow GitHub Actions.testcheck to themainruleset.rote-releasestorelease=latestshould follow this merge.Test plan
latestand pinned inputs become the given tag/SHA; strict rejections holdtagged,already_tagged,version_unchanged, refusal on an unrelated tagpackage-checklists all 7 stale copies;just packagefixes them;uv lock --checkpassesjust testpasses locally and in a cleanubuntu:24.04containertestjob passes on this PRversion_unchanged; staging deploy succeeds