semvertag 0.4.0 — composite GitHub Action
Minor release shipping the action.yml composite wrapper that has been on the deferred list since 0.3.0. Users can now write uses: modern-python/semvertag@v0 instead of pasting an 11-line install-and-run block. No CLI changes; the action wraps the existing semvertag tag --json invocation and surfaces tag / bump / status as step outputs.
If you're already using the documented pure-CLI snippet and don't want to consume third-party actions, you can stay on it — docs/providers/github.md preserves it as the "Without the composite action" recipe.
What landed
action.ymlat repo root — composite action:astral-sh/setup-uv@v7, thenuvx 'semvertag>=0.3.1,<1' tag --json, then parses the envelope intotag/bump/statusstep outputs..github/workflows/tag-major.yml— fires on release published (non-prerelease) and force-updates the floatingv0major tag so consumers can pin@v0and ride minor bumps automatically.- Dogfood workflow migration —
.github/workflows/semvertag.ymlnow consumesuses: ./, exercising the action against the working tree on every push to main. action-smokeCI job — runsuses: ./on every PR and asserts thatstatusandbumpoutputs are non-empty. Real tag creation against the GitHub API is covered by the post-merge dogfood run, not the PR-time job (forks can't havecontents: write).- README +
docs/providers/github.mdrewrite — Quick Start leads with the action; Outputs section documents the three step outputs; "Without the composite action" preserves the pure-CLI fallback for constrained environments.
CLI version floor
action.yml pins 'semvertag>=0.3.1,<1'. 0.3.1 is the minimum CLI version that ships every feature the action depends on (--json envelope, GITHUB_ACTIONS=true auto-detection, branch-prefix GitHub merge subject recognition). The floor only needs to bump when a future release breaks CLI contract — not on every minor.
Release procedure (maintainer)
Step 1: Pre-flight check
Before tagging:
- Search https://github.com/marketplace?type=actions for "semvertag" — the listing name
semvertagmust not be taken by another action.- If it's taken: edit
action.yml'sname:field to'semvertag tag'(Marketplace permits spaces in display names) and re-PR before continuing. Theuses: modern-python/semvertag@v0syntax depends on the repo slug, not the display name, so consumer-facing docs do not change.
- If it's taken: edit
- Confirm
branding.iconis one of the Feather icon names GitHub accepts andbranding.coloris one ofwhite | yellow | blue | green | orange | red | purple | gray-dark. (We shipicon: tag,color: blue— both valid.) - Confirm CI is green on main, including the new
action-smokejob.
Step 2: Cut the 0.4.0 GitHub release
This project's release tag convention is bare semver (0.4.0, no v prefix) — the same as 0.3.x and earlier. The 0.4.0 tag is created automatically by the dogfood workflow on PR merge, so it already exists when you reach this step.
Create the GitHub release pointing at the existing tag:
gh release create 0.4.0 \
--title '0.4.0 — composite GitHub Action' \
--notes-file planning/releases/0.4.0.md(Or use the GitHub web UI: Releases → "Draft a new release" → choose existing tag 0.4.0.)
publish.yml fires on release creation and pushes 0.4.0 to PyPI via just publish (which uses uv version $GITHUB_REF_NAME to inject the bare semver tag name as the package version).
Step 3: Bootstrap the floating v0 tag (one-time)
Releases use bare semver tags (0.4.0) but the floating action tag is v-prefixed (v0) so consumers can write the conventional uses: modern-python/semvertag@v0. tag-major.yml handles the v-prefix bump automatically on every release from 0.4.1 forward. For 0.4.0 specifically — the first release after the workflow landed — the floating tag does not yet exist and must be bootstrapped manually:
git fetch --tags
git tag -fa v0 0.4.0 -m 'Update v0 to 0.4.0'
git push -f origin v0After this, uses: modern-python/semvertag@v0 resolves successfully for consumers.
Step 4: Publish to Marketplace (manual UI step)
- Navigate to https://github.com/modern-python/semvertag/releases/tag/0.4.0.
- Click Edit release.
- Check Publish this Action to the GitHub Marketplace.
- Accept the Marketplace Terms of Service if prompted (one-time for the repo).
- Select Primary Category:
Continuous integration. - Select Secondary Category (optional):
Utilities. - Save the release.
Step 5: Post-publish smoke test
- Confirm the listing appears at https://github.com/marketplace/actions/semvertag (the slug derives from the
name:field; if you renamed in Step 1 the slug will differ). - In a sandbox repo, paste the README snippet (
uses: modern-python/semvertag@v0after aactions/checkout@v4withfetch-depth: 0) and confirm the workflow runs end-to-end.
Breaking changes
None. The action is additive; the pure-CLI recipe still works exactly as before (and remains documented as the fallback).
See also
- Spec:
planning/specs/2026-06-08-action-yml-composite-wrapper-design.md - Implementation plan:
planning/plans/2026-06-08-action-yml-composite-wrapper.md