feat: /release skill + dev-build workflow (cross-machine RC/dev wheels, no PyPI)#79
Merged
Conversation
…e flow A user-invocable skill that drives remo's release process with a mandatory local "test before PyPI" gate and approval-before-publish guardrails: - stable lane: locate the release-please "chore(main): release X.Y.Z" PR, review the bump + CHANGELOG, run the validation gate on the PR head, then merge only on explicit approval (release-please tags -> release.yml publishes). - rc lane: compute X.Y.ZrcN, bump pyproject, run the validation gate, then either hand off a local wheel (no PyPI) or, only on explicit approval, tag vX.Y.Z-rcN and publish a prerelease. - Step V validation gate: full pytest + uv build + throwaway-venv smoke that the wheel's --version matches, before any tag/merge/publish. Guardrails: never push a tag/commit or merge a release PR without explicit in-turn approval; require a clean, up-to-date main; prefer local-only testing. Pairs with the release-please integration (#78). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HAPB5GA4NVUgKFsVFVJDxN
…un artifacts
Build an installable wheel in clean CI and upload it as a run artifact you can
download and test on another machine — no git tag, no PyPI, no reserved version:
- .github/workflows/dev-build.yml: workflow_dispatch with an optional `version`
input. Stamps pyproject.toml with the base version plus a PEP 440 LOCAL
segment (+g<shortsha>), which PyPI rejects outright — so a dev build can never
leak to PyPI and every build is uniquely identifiable. Uploads dist/* as the
`remo-wheel` artifact (30-day retention). release.yml is untouched.
gh workflow run dev-build.yml [-f version=2.3.0rc1]
gh run download <run-id> -n remo-wheel && uv tool install --force ./remo_cli-*.whl
- /release skill: add a "CI dev build (cross-machine, no PyPI)" outcome to the
RC lane alongside local-only and publish-to-PyPI.
Version stamping validated locally (packaging.Version): blank -> X.Y.Z.dev<run>,
label -> X.Y.ZrcN, each with a +g<sha> local segment. actionlint clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HAPB5GA4NVUgKFsVFVJDxN
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
Two paired pieces that operationalize remo's release process, plus a PyPI-free way to move builds between machines. Pairs with the release-please integration in #78.
1.
/releaseskill (.claude/skills/release/SKILL.md)A user-invocable skill with a built-in "test before PyPI" gate and approval-before-publish guardrails:
chore(main): release X.Y.ZPR: review the bump/CHANGELOG, run the validation gate on the PR head, merge only on explicit approval.vX.Y.Z-rcNtag).pytest+uv build+ throwaway-venv smoke that--versionmatches, before anything is tagged/merged/published.2.
dev-build.yml— cross-machine artifacts, no PyPIManual-dispatch workflow that builds a wheel in clean CI and uploads it as a run artifact (
remo-wheel, 30-day retention). Build on one machine, test on another:The stamped version always carries a PEP 440 local segment (
+g<shortsha>) — which PyPI rejects outright, so a dev build physically cannot leak to PyPI, and every build is uniquely identifiable.release.ymlis untouched.Guardrails (in the skill)
main; prefer local-only testing; treat published versions as permanent.Validation & notes
actionlintclean across all workflows; version-stamp + PEP 440 checks pass locally (packaging.Version).actions/upload-artifact@v4is a floating tag (SHA unresolvable offline) — pin to@<sha> # v4to match repo convention. (checkout/setup-uv reuse the repo's existing pinned SHAs.)🤖 Generated with Claude Code