Skip to content

feat: /release skill + dev-build workflow (cross-machine RC/dev wheels, no PyPI)#79

Merged
pofallon merged 2 commits into
mainfrom
feat/release-skill
Jul 25, 2026
Merged

feat: /release skill + dev-build workflow (cross-machine RC/dev wheels, no PyPI)#79
pofallon merged 2 commits into
mainfrom
feat/release-skill

Conversation

@pofallon

@pofallon pofallon commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

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. /release skill (.claude/skills/release/SKILL.md)

A user-invocable skill with a built-in "test before PyPI" gate and approval-before-publish guardrails:

  • Stable lane — drive the release-please chore(main): release X.Y.Z PR: review the bump/CHANGELOG, run the validation gate on the PR head, merge only on explicit approval.
  • RC lane — three outcomes: local-only (wheel handoff, no PyPI), CI dev build (run artifact, no PyPI — see below), or publish a prerelease (only on explicit approval → vX.Y.Z-rcN tag).
  • Validation gate — full pytest + uv build + throwaway-venv smoke that --version matches, before anything is tagged/merged/published.

2. dev-build.yml — cross-machine artifacts, no PyPI

Manual-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:

gh workflow run dev-build.yml                      # -> 2.2.0.dev<run>+g<sha>
gh workflow run dev-build.yml -f version=2.3.0rc1  # -> 2.3.0rc1+g<sha>
# on ANY machine:
gh run download <run-id> -n remo-wheel -D ./dl && uv tool install --force ./dl/remo_cli-*.whl

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.yml is untouched.

Guardrails (in the skill)

  • 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; treat published versions as permanent.

Validation & notes

  • actionlint clean across all workflows; version-stamp + PEP 440 checks pass locally (packaging.Version).
  • Pin-me: actions/upload-artifact@v4 is a floating tag (SHA unresolvable offline) — pin to @<sha> # v4 to match repo convention. (checkout/setup-uv reuse the repo's existing pinned SHAs.)
  • Merge ci(release): add release-please for stable releases (two-lane flow) #78 first so the skill's stable lane references an existing release-please workflow; the skill's RC/dev lanes work regardless.

🤖 Generated with Claude Code

pofallon and others added 2 commits July 23, 2026 01:10
…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
@pofallon pofallon changed the title feat(skill): add /release skill to operationalize the two-lane release flow feat: /release skill + dev-build workflow (cross-machine RC/dev wheels, no PyPI) Jul 25, 2026
@pofallon
pofallon merged commit bb0dc89 into main Jul 25, 2026
10 of 11 checks passed
@pofallon
pofallon deleted the feat/release-skill branch July 25, 2026 00:24
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