Skip to content

EXC-1505 Add a release-changeset skill and release script - #45

Merged
macintacos merged 6 commits into
mainfrom
EXC-1505/release-changeset-skill
Oct 13, 2026
Merged

macintacos merged 6 commits into
mainfrom
EXC-1505/release-changeset-skill

Conversation

@macintacos

Copy link
Copy Markdown
Owner

Part of: EXC-1505

Change Kind: infrastructure

What changed

changeset.nvim has never been released, so every install tracked main. This adds a repo-local /release-changeset skill backed by scripts/release.py, a standalone uv script that mise run release runs: the script owns the version math, the gates (commits since the last tag, a free tag, a passing CI push run on main) and the single gh release create call, and prints one JSON object per call; the skill only writes the notes and asks once. uv, ruff and ty join the toolchain to lint, type-check and test the script, and the README and vimdoc install examples now pin version to the latest release.

What to test

  • mise run release compute minor prints {"ok":true,"version":"0.1.0","tag":"v0.1.0","previousTag":null,…} while origin has no tags; mise run release compute bogus prints a USAGE refusal and exits 2.
  • /release-changeset minor dry run shows the first-release notes and a dryRun: true result, and creates no tag or Release (git ls-remote --tags origin stays empty).
  • Blast radius: mise run lint, pre-commit, pre-push and CI now also run ruff, ty and scripts/test_release.py; mise run preflight runs the script's test too.
  • After merge and a green CI push run, /release-changeset minor cuts v0.1.0; until then the README's vim.pack example fails with "No versions fit constraint".

- Pin uv 0.13.0; ruff and ty track latest, all locked
- ruff.toml holds the formatter and linter settings
- hk runs ruff on commit and ty in check and pre-push
- scripts/release.py computes the next version from origin's tags,
  gates on commits, a free tag and a passing CI push run, and cuts
  the tag and Release in one gh call; it prints one JSON object
- scripts/test_release.py covers the version math
- mise run release execs the script
- pre-push and CI run the test
The skill drives mise run release: it takes the version from compute,
writes the Release notes outside the repo, confirms once with the
notes in the preview, then releases. A dry run asks nothing.
The vim.pack and lazy.nvim examples pin version to the latest tag.
Dropping it tracks main, which gets unreleased changes.
- Computed, Released and Refused model the JSON; an ErrorCode enum
  carries each refusal's exit code, and main is the one boundary
- The snapshot collects origin's tags and the CI run, so
  require_releasable is pure and tested
- Fetch only origin's main with an explicit refspec; local tags are
  never touched
- ruff.toml drops ignores that did nothing, D212 among them
- The skill stops on a non-zero exit or non-JSON stdout, and on Cancel
- preflight runs the script's test too
@linear-code

linear-code Bot commented Oct 13, 2026

Copy link
Copy Markdown

EXC-1505

@macintacos
macintacos merged commit d012243 into main Oct 13, 2026
2 checks passed
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