Agent skill

Release

by geoparquet in geoparquet/geoparquet-io

A skill your agent uses when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release…

Apache-2.0Auto-check passedDevelopment

Install Release

skills CLI
$ npx skills add geoparquet/geoparquet-io --skill release -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install geoparquet/geoparquet-io release --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/geoparquet/geoparquet-io.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/release .claude/skills/release && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
release
GitHub stars
172
Token cost
~2.3k tokens
SKILL.md length
1,133 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
Apache-2.0

At a glance

A skill your agent uses when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release…

  • Works in 8 steps: Preflight → Generate the section → Retitle whatever landed in ###… → …
  • Cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style
  • SKILL.md covers 1. Preflight, 2. Generate the section, 3. Retitle whatever landed in… and 4. Write the highlights, plus 6 more sections
  • Calls uv, git and gh

What it does

Release is an agent skill from geoparquet/geoparquet-io. Use when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release notes.

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Changelog and release notes and App store release. It works with GitHub. The repository describes itself as: A collection of tools for GeoParquet, built on DuckDB, GDAL & Obstore. The licence is Apache-2.0.

When your agent uses it

  • Cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style
  • Stops for human review
  • Tags and posts the GitHub release notes

Example prompts

  • “/release”

Requirements

  • Python 3

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Preflight
  2. Generate the section
  3. Retitle whatever landed in ### Uncategorized
  4. Write the highlights
  5. Human review — STOP HERE
  6. Bump and open the release PR
  7. Post the release notes
  8. Verify

What it can do on your machine

Read from SKILL.md and the folder at commit 36cf228. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • uv
    • git
    • gh
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use uv, git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Release loads about 2.3k tokens when it runs. Until then it costs about 48 tokens; SKILL.md has 1,133 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~48
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from geoparquet/geoparquet-io at commit 36cf228, republished under its Apache-2.0 licence (© geoparquet). 1,133 words, ~2,290 tokens.

Download SKILL.mdSave it as .claude/skills/release/SKILL.md (or your agent's skills folder).
name
release
description
Use when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release notes.

Releasing geoparquet-io

Every release section of CHANGELOG.md is generated, never hand-written. It is GitHub's own release-note list — one line per pull request, with its author and number — grouped into Keep a Changelog sections, under two to four paragraphs of highlights that you write.

There is a mandatory human review checkpoint at step 5. Nothing is bumped, tagged or published before the user approves the changelog section.

1. Preflight

bash
git checkout main && git pull
gh run list --branch main --limit 5          # main must be green
git status --short                            # must be clean
uv run pytest -n auto -m "not slow and not network and not meta"

Pick the version from what merged: a ! title or a withdrawn command means minor at least (this project is 1.x and pre-1.0 rules no longer apply), new commands mean minor, fixes alone mean patch.

2. Generate the section

bash
uv run python scripts/release_notes.py <version> --previous v<previous> --write

This replaces the ## Unreleased block with the new section. It refuses to run twice for one version. Without --write it prints to stdout, which is the way to preview.

3. Retitle whatever landed in ### Uncategorized

Pull requests whose titles carry no conventional-commit type land there. Do not edit the changelog by hand and do not touch the pull request: add a rewritten title to scripts/release_title_overrides.json, keyed by PR number, and run the generator again. The type you give it is what files the entry.

json
"645": "fix(geometry): stop the SIGSEGV in repair on tables with NULL geometry rows"

Read each pull request before you retitle it, and write the line a user should read. A test, ci, chore, style or build type files the entry as housekeeping, which is not listed — correct for a chore, wrong for a fix wearing the wrong type, so pick deliberately. Two judgements the script cannot make:

  • Give it a ! when the change removes a command, changes a default, or withdraws a capability, even though the merged title had none. Squash merges take the PR title, so a ! written in a commit body is already lost. This is how an entry reaches ### Breaking.
  • Human dependency decisions — a pin relaxed, a floor raised for a CVE — take build(deps) so they sit with the bot bumps.

Regenerate until ### Uncategorized is gone. Rerunning is safe: the overrides file makes the whole section reproducible, so nothing is lost to a second run.

4. Write the highlights

Replace the <!-- TODO ... --> placeholder with two to four paragraphs, written after reading the Breaking, Added and Changed entries. Cover, in this order:

  1. What is newly possible — the commands and capabilities added.
  2. The theme of the fixes, named concretely, not "various bug fixes".
  3. Every breaking change, with what a user has to do about it.
  4. Every first-time contributor, by name, with what they contributed.

The last paragraph is not optional. Get the material from:

bash
uv run python scripts/release_notes.py <version> --previous v<previous> --contributors

That prints every pull request each new contributor wrote, not only the first one GitHub names. For each person: say how many pull requests they sent when it was more than one, summarize the work in a sentence or two — the actual substance of it, so they can see they were read — thank them, and close by inviting them back. Do not reduce a run of ten pull requests to "various fixes".

Do not restate the entry list. Aim for what a user needs to decide whether to upgrade, and what a contributor needs to feel their work was noticed.

5. Human review — STOP HERE

Show the user the rendered section and wait for explicit approval. Say what you want checked:

  • the version number
  • the summary paragraphs
  • any entry you moved out of ### Uncategorized, and anything you promoted to ### Breaking

Do not run step 6 until the user approves. If the release ships alongside other work, put the changelog in that pull request and let review happen there.

Show full SKILL.md (550 more words)Show less

6. Bump and open the release PR

update_changelog_on_bump is off, so cz bump touches versions only and leaves the section you just wrote alone.

bash
git checkout -b release/bump-v<version>
uv run cz bump --yes                 # pyproject.toml + [tool.commitizen].version

cz bump usually cannot commit here. A pre-commit hook rewrites files mid-run, cz sees a dirty tree and stops, so you get the version edit with no commit and no tag. That is fine — make the commit yourself, with cz's own message format, because publish.yml triggers on a head commit that starts with bump::

bash
git commit -am "bump: version <previous> → <version>"   # re-run if a hook edits files

Check what you are committing. cz bump leaves uv.lock alone, so bump the geoparquet-io package version in it by hand — one line:

[[package]]
name = "geoparquet-io"
version = "<version>"

Never run uv sync to do that. An older local uv rewrites the whole lockfile into an older format (revision = 3 → revision = 1, every upload-time stripped, thousands of lines) which is a downgrade, not a dependency change. uv lock --check tells you whether your uv agrees with the committed lock; if it does not, upgrade uv rather than committing the churn.

bash
git push -u origin release/bump-v<version>
gh pr create --title "bump: version <previous> → <version>"

The PR title matters twice: the squash commit is what publish.yml matches on, and pr-title checks it. bump is a valid commitizen type, so this passes.

Merging that PR fires .github/workflows/publish.yml, which tags v<version>, publishes to PyPI, and creates the GitHub release.

7. Post the release notes

The workflow's release body is a placeholder. Replace it with the section you wrote, plus a link back to the changelog anchor. This drops GitHub's own listing of the internal and dependency pull requests, which is the intent: the compare link at the end of the section still reaches all of them.

bash
python3 - <<'PY' > /tmp/notes.md
import pathlib, re
v = "<version>"
t = pathlib.Path("CHANGELOG.md").read_text()
start = t.index(f"## v{v} ")
end = t.find("\n## ", start + 1)
heading, body = t[start:end].split("\n", 1)
# GitHub's anchor: the heading lowercased, anything but a letter, digit, space
# or hyphen dropped, then spaces to hyphens. "## v1.4.0 (2026-08-30)" gives
# "v140-2026-08-30" - the dots go, so do not build this from the version string.
anchor = re.sub(r"[^a-z0-9 -]", "", heading[3:].lower()).replace(" ", "-")
print(body.strip())
print()
print(f"Full changelog entry: https://github.com/geoparquet/geoparquet-io/blob/main/CHANGELOG.md#{anchor}")
PY

gh release edit v<version> --notes-file /tmp/notes.md

Open the printed link and confirm it lands on the heading before you finish.

8. Verify

Check the published artifact, not the local tree:

bash
uv run --isolated --no-project --with "geoparquet-io==<version>" gpio --version
gh release view v<version> --json assets --jq '[.assets[].name]'

The release should carry four assets: the wheel, the sdist, and an attestation for each.

If the publish fails after the tag is pushed

The workflow creates the tag before it uploads, so a failed upload leaves a tag with no release and nothing on PyPI. Nothing is half-published — the upload is the last step — so do not delete the tag. Fix the cause on main, then re-run:

bash
gh workflow run publish.yml --ref main

That is the documented recovery path: the run sees the tag already exists and the release does not, skips tag creation, rebuilds, publishes and creates the release.

Seen once, for the record: gh-action-pypi-publish v1.14.0 rejected the wheel with InvalidDistribution: '2.5' is not a valid metadata version, because hatchling had started writing Metadata-Version: 2.5 and the action's bundled Twine predated it. Fixed by bumping the action pin, not by downgrading the build backend or skipping verification.

Conventions this skill enforces

  • One line per pull request: - <title> by @<author> in #<number>. Titles come from the pull request, or from scripts/release_title_overrides.json where one did not follow the convention. .github/workflows/pr-title.yml checks new titles, so the overrides file should stop growing.
  • Sections in order: Breaking, Added, Changed, Fixed, Documentation, then New Contributors and the Full Changelog link.
  • Internal and dependency work is classified and counted, but not listed. A changelog is not the place for bot bumps and repo chores. A one-line note gives the counts, and the compare link and the GitHub release page still carry every one of them. Do not add them back by hand.
  • docs/CHANGELOG.md is generated from the root file by the doc-sync pre-commit hook. Never edit it.

© geoparquet, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/release of geoparquet/geoparquet-io.

Open the folder on GitHubat commit 36cf228

Compare with similar skills

Release next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Release compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release this skillgeoparquet/geoparquet-io172—~2.3kAutomated safety check: PassApache-2.0
Store Submitzhitongblog/solomd1.2k—~1.7kAutomated safety check: NotesMIT
Release New Versionkcsujeet/ilamy-calendar351—~5.8kAutomated safety check: PassMIT
Release Asc CLIrorkai/App-Store-Connect-CLI7.7k—~2.4kAutomated safety check: PassMIT
Releasebmeares/Meerschaum154—~1.1kAutomated safety check: NotesApache-2.0
Cutting A ReleaseTriliumNext/Trilium38k—~3.2kAutomated safety check: PassAGPL-3.0

Similar skills

  • Store Submit

    zhitongblog/solomd

    Publish a SoloMD release to the stores that have no usable submission API — Google Play Console and Microsoft Partner Center — by driving them through the local Unzoo Browser REST API.

    1.2k GitHub stars~1.7k tokensUpdated today
    DevelopmentAuto-check: notes
  • Release New Version

    kcsujeet/ilamy-calendar

    Cut a new release of @ilamy/calendar — analyze commits since the last tag, suggest a semver bump, draft a CHANGELOG entry in the project's existing style, run the CI gate, commit, tag, push to…

    351 GitHub stars~5.8k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Release Asc CLI

    rorkai/App-Store-Connect-CLI

    Publish and verify a new release of the App-Store-Connect-CLI repository.

    7.7k GitHub stars~2.4k tokensUpdated today
    MobileAuto-check passed
  • Release

    bmeares/Meerschaum

    Meerschaum release process — bump version, update changelog, stage dev→main PR, run CI, publish to PyPI, tag, GitHub release, build/push Docker images, rebuild docs on prod VPS.

    154 GitHub stars~1.1k tokensUpdated 1 mo ago
    DevOps & CloudAuto-check: notes
  • Cutting A Release

    TriliumNext/Trilium

    A skill your agent uses when cutting, preparing, or debugging a Trilium release — bumping the monorepo version, tagging, or diagnosing a failed "Release" workflow run.

    38k GitHub stars~3.2k tokensUpdated today
    DevelopmentAuto-check passed
  • Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.

    70k GitHub stars~2.6k tokensUpdated today
    DevelopmentAuto-check passed

Works with

Categories

Questions about Release

What does Release do?

A skill your agent uses when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release…. Release is an agent skill from geoparquet/geoparquet-io. Use when cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style, stops for human review, then bumps, tags and posts the GitHub release notes.

When should I use Release?

Release fits situations like: cutting a geoparquet-io release - builds the CHANGELOG section from merged PRs in the house style; stops for human review; tags and posts the GitHub release notes.

How do I install Release in Claude Code?

Run `npx skills add geoparquet/geoparquet-io --skill release -a claude-code`. Or copy the skill folder (.claude/skills/release in geoparquet/geoparquet-io) into .claude/skills/release in your project. Claude Code loads it when a task matches its description.

How do I install Release in Codex?

Run `npx skills add geoparquet/geoparquet-io --skill release -a codex`. Or copy the skill folder (.claude/skills/release in geoparquet/geoparquet-io) into .agents/skills/release in your project. Codex loads it when a task matches its description.

Can I use Release in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add geoparquet/geoparquet-io --skill release -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/release, .gemini/skills/release, .github/skills/release and .opencode/skills/release in your project.

What does Release need to run?

Going by SKILL.md and its folder, Release needs the command-line tools its instructions call (uv, git, gh and python3). Our summary lists: Python 3.

Does Release access the network?

SKILL.md contains no URLs. Its commands use uv, git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Release safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Release use?

Release is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Release use?

About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Release?

Skills that share tags, products or a category with Release: Store Submit (zhitongblog/solomd, 1.2k stars), Release New Version (kcsujeet/ilamy-calendar, 351 stars), Release Asc CLI (rorkai/App-Store-Connect-CLI, 7.7k stars) and Release (bmeares/Meerschaum, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Release?

geoparquet (a GitHub organization) maintains it in geoparquet/geoparquet-io, which has 172 GitHub stars. The repository was last updated on October 4, 2026.

Source: geoparquet/geoparquet-io on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.