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.
A skill your agent uses when rewriting, reformatting, or reviewing the notes on a published MeshLLM GitHub release, including the automatic release-notes regrouping job, its deterministic…
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Mesh-LLM/mesh-llm release-notes --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/release-notes .claude/skills/release-notes && rm -rf skills-srcUse ~/.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/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .claude/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Mesh-LLM/mesh-llm release-notes --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/release-notes .agents/skills/release-notes && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .agents/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Mesh-LLM/mesh-llm release-notes --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/release-notes .cursor/skills/release-notes && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .cursor/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Mesh-LLM/mesh-llm.git --path .agents/skills/release-notes--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Mesh-LLM/mesh-llm release-notes --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/release-notes .gemini/skills/release-notes && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .gemini/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Mesh-LLM/mesh-llm release-notesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/release-notes .github/skills/release-notes && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .github/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Mesh-LLM/mesh-llm --skill release-notes -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Mesh-LLM/mesh-llm release-notes --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Mesh-LLM/mesh-llm.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/release-notes .opencode/skills/release-notes && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "release-notes" agent skill from https://github.com/Mesh-LLM/mesh-llm/tree/main/.agents/skills/release-notes into .opencode/skills/release-notes/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "release-notes", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
release-notesA skill your agent uses when rewriting, reformatting, or reviewing the notes on a published MeshLLM GitHub release, including the automatic release-notes regrouping job, its deterministic…
Release Notes is an agent skill from Mesh-LLM/mesh-llm. Use this skill when rewriting, reformatting, or reviewing the notes on a published MeshLLM GitHub release, including the automatic release-notes regrouping job, its deterministic classifier, and its optional agent review pass.
Its SKILL.md is about 2.8k 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. It works with GitHub. The repository describes itself as: Distributed AI/LLM for the people. Share compute privately or publicly to power your agents and chat. The licence is Apache-2.0.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 2b36552. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
ghpython3justFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
keepachangelog.comconventionalcommits.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Release Notes loads about 2.8k tokens when it runs. Until then it costs about 60 tokens; SKILL.md has 1,351 words of instructions outside code blocks.
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.
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.
The full file from Mesh-LLM/mesh-llm at commit 2b36552, republished under its Apache-2.0 licence (© Mesh-LLM). 1,351 words, ~2,802 tokens.
.claude/skills/release-notes/SKILL.md (or your agent's skills folder).The release workflow publishes with GitHub-generated release notes, so every
MeshLLM release starts life as one flat ## What's Changed list. A normal minor
release carries a few hundred entries in merge order, which buries the handful
of changes a reader actually needs. The release_notes job in release.yml
regroups that list into
Keep a Changelog 1.1.0 sections right
after publication.
This skill formats notes that already exist. It does not decide release
readiness or build the change inventory from source; that is
release-validation.
word: may
be part of the sentence, as in "Durable KV prefix cache: agent prefixes
survive eviction". Nothing else about a subject changes. by @<author> in <url> tail is copied
through byte for byte, and the set of referenced pull requests is the
invariant every gate checks.### Internal, never deleted.## New Contributors and the **Full Changelog** link
stay exactly as GitHub generated them.### Other changes. A wrong section is worse than an honest unsorted one,
and misfiling a security fix as a routine fix is the worst case.gh release edit.Three passes, in this order. The first two always run and together always produce a publishable body; the third is best-effort.
flowchart TD
A["Release published"] --> B["Capture GitHub's flat list"]
B --> L["Link commits to pull requests<br/>recover what GitHub credited to a roll-up"]
L --> C["Classify by commit type<br/>feat → Added · fix → Fixed · ci → Internal"]
C --> D{"Agent reachable?"}
D -- no --> F["Deterministic notes"]
D -- yes --> E["Agent reviews the plan"]
E -- valid --> G["Reviewed notes"]
E -- "invalid or timed out" --> F
F --> P["Publish"]
G --> P
P --> V["Verify the same pull requests"]One rule gates every step after the link pass: the set of referenced pull requests must not change. Sections move, subjects lose their type prefix, but no PR is dropped, duplicated, or invented, and author credit is copied through untouched. The link pass is the one step allowed to grow that set, and it is gated the other way: it may add entries and may never drop one. Nothing publishes unless both hold.
scripts/release-notes-link.py pairs each commit in the range with the pull
request that carried it. The (#N) suffix a squash merge leaves on the subject
is authoritative and free; a commit without one costs a
repos/{repo}/commits/{sha}/pulls lookup, and a commit the API cannot place is
left unlinked rather than guessed at.
That pairing repairs two things GitHub's generated list cannot express:
Other changes;Fixed entry before this existed.Both are bounded: --api-budget caps the lookups, and every failed call falls
back to the behaviour the pipeline had before the pass existed.
scripts/release-notes-classify.py reads the canonical squash-merge commits
between the comparison base and the tag, and maps each entry by its
Conventional Commits type:
| Type | Section |
|---|---|
feat | Added (Changed when ! or BREAKING CHANGE:) |
fix | Fixed |
perf, revert | Changed |
security | Security |
ci, build, deps, chore, test, refactor, style, docs | Internal |
| anything else, or no conventional subject | Other changes |
Two rules override the type. A tooling scope — ci, release, build,
deps, xtask, bench, just — is Internal whatever the type, because a
fix(ci) repairs CI rather than the product. A Release-Notes: <Section>
commit trailer wins outright, and is the escape hatch when the type cannot
express the change.
scripts/release-notes-regroup.py then renders the plan, refusing unless it
covers the body exactly.
scripts/release-notes-generate.sh probes for a reachable agent and, only if
one answers, asks it to review the deterministic plan — chiefly the
Other changes entries and any security-relevant fix committed as a plain
fix. Its output goes through the same validation and entry-set gate as the
deterministic plan.
The agent is optional by construction. Missing CLI, absent credentials, failed
probe, exhausted quota, blown time budget, unparseable plan, or a plan that
fails validation each log a reason and keep the deterministic notes. None of
them fail the job. AGENT_MODEL is unset by default, so the pipeline ships
deterministic-only until a runner provides the CLI and credentials.
The job does this automatically for stable releases. Run it yourself to reformat an older release or to recover from a bad edit. Run every command from the repository root, and let the script own its work directory:
export RELEASE_TAG=v0.76.0 # the release to reformat
export RELEASE_NOTES_BASE=v0.75.1 # its stable comparison base
DRY_RUN=true scripts/release-notes-generate.shDRY_RUN=true renders and gates without touching the release. Publishing from
a manual run additionally needs RELEASE_NOTES_APPROVED=true, so a hand run
cannot edit a published release by accident; the release job sets that variable
explicitly in its own definition. The work directory it prints keeps
body.github.md, exactly as GitHub published it; restore with
gh release edit "$RELEASE_TAG" --notes-file <workdir>/body.github.md.
To hand-classify instead, keep the scratch files outside the repository but keep running the scripts from the repository root:
WORK="$(mktemp -d)"
gh release view "$RELEASE_TAG" --json body -q .body > "$WORK/body.md"
python3 scripts/release-notes-regroup.py --body "$WORK/body.md" --list
# write "$WORK/plan.json", then:
python3 scripts/release-notes-regroup.py \
--body "$WORK/body.md" --plan "$WORK/plan.json" --out "$WORK/new.md"The plan assigns every PR number to a section:
{
"version": "0.76.0",
"date": "2026-09-10",
"sections": [
{
"title": "Added",
"groups": [{ "title": "Serving and inference", "prs": [1228, 1439] }]
},
{ "title": "Removed", "prs": [1399] }
],
"internal": {
"summary": "CI, build, test, and repository work with no user-facing behavior change",
"groups": [{ "title": "CI and release engineering", "prs": [1244] }]
}
}A section takes either a flat prs list or groups. Section titles are a
closed set, and headings, version and date are validated before anything is
rendered. Section order follows Keep a Changelog, then Other changes, then
Internal. Omit empty sections.
Always prove no pull request was dropped, duplicated, or invented. Entry lines are not byte-identical after prefix stripping, so compare the PR set:
diff <(grep -o 'pull/[0-9]*' "$WORK/body.md" | sort) \
<(grep -o 'pull/[0-9]*' "$WORK/new.md" | sort) \
&& echo "identical pull-request sets"Conventional-commit prefixes are a strong hint, not the whole answer. When reviewing a plan by hand or as the agent pass:
perf: PR is Changed. Keep a Changelog has no performance section, and
a speedup changes existing behavior.fix: PR that closes an exposure is Security, not Fixed. Classify by
what the change protects. This is the single most valuable correction to make,
because the commit type cannot express it.feat: PR that replaces an existing subsystem is Changed, not Added.Other. Below that
a flat list reads better.### Internal goes last, wrapped in <details> with a <summary> stating
the count. Keep a blank line after <summary> or GitHub will not render the
Markdown inside it.Every entry the deterministic pass cannot classify is a commit that did not
follow Conventional Commits. scripts/hooks/commit-msg rejects those locally
(just hooks-install), just check-commits validates a range, and the
Check commit convention step in the Quality lane enforces the pull request
title in CI, which is the part that binds contributors who never install the
hook. Because the
repository squash-merges, the PR title becomes the commit subject, so the PR
title is what has to be conventional.
Coverage is a measurable property of a release:
python3 scripts/release-notes-classify.py --body body.md \
--range v0.75.1..v0.76.0 --version 0.76.0 --date 2026-09-10 --out plan.json
# classified 182/272 entries deterministically (90 in 'Other changes')v0.76.0 predates the hook and classifies 182 of 272. Releases made entirely under the hook should approach full coverage, leaving the agent pass with only genuine judgement calls.
© Mesh-LLM, 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
Just SKILL.md in .agents/skills/release-notes of Mesh-LLM/mesh-llm.
Open the folder on GitHubat commit 2b36552
Release Notes 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Release Notes this skillMesh-LLM/mesh-llm | 3.5k | — | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Cutting A ReleaseTriliumNext/Trilium | 38k | — | ~3.2k | Automated safety check: Pass | AGPL-3.0 | |
| Mole CLI Release Flowtw93/Mole | 69k | — | ~2.5k | Automated safety check: Pass | GPL-3.0 | |
| Draft Release Notesjamiepine/voicebox | 57k | — | ~941 | Automated safety check: Pass | MIT | |
| Mole Release Notes Publishertw93/Mole | 69k | — | ~1.9k | Automated safety check: Pass | GPL-3.0 | |
| Release Bumpjamiepine/voicebox | 57k | — | ~1.1k | Automated safety check: Pass | MIT |
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.
tw93/Mole
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.
jamiepine/voicebox
Writes or refreshes the Unreleased section of CHANGELOG.md as a themed narrative built from the commits, PRs and diff since the last version tag.
tw93/Mole
Publishes curated, bilingual release notes for an existing Mole version tag with gh release edit, including contributor thanks and reactions, after the release workflow finishes.
jamiepine/voicebox
Ends a release cycle by moving the Unreleased changelog notes under a dated version heading, bumping version files with bumpversion and tagging the commit.
jfernandez/bpftop
Cut a new versioned release of bpftop — pick the version, open a version-bump PR, sign-tag the merge commit on main, and draft GitHub release notes in the project's established format.
Mesh-LLM/mesh-llm
A skill your agent uses when validating a MeshLLM release candidate or current HEAD against the last GitHub release, assembling the canonical feature/fix/modification inventory, testing locally…
Mesh-LLM/mesh-llm
A skill your agent uses when running, debugging, interpreting, or documenting mesh-llm benchmark tune model-serving throughput trials, including choosing…
Mesh-LLM/mesh-llm
A skill your agent uses when adding, renaming, removing, validating, or exposing mesh-llm config settings, including built-in settings, plugin config schemas, owner-control apply behavior, CLI…
Mesh-LLM/mesh-llm
A skill your agent uses when connecting agent tools or OpenAI clients to mesh-llm — launching or configuring Goose, Claude Code, OpenCode, Pi, curl, or any OpenAI-compatible client against a local…
Mesh-LLM/mesh-llm
A skill your agent uses when converting Hugging Face SafeTensors checkpoints into split BF16 GGUF model repos with skippy-quantize on Hugging Face Jobs or a local machine, then publishing the…
Mesh-LLM/mesh-llm
A skill your agent uses when creating, monitoring, validating, or documenting low-memory Hugging Face Jobs or local runs that quantize split BF16/FP16 GGUF model repos into custom quant GGUF repos…
Works with
Categories
A skill your agent uses when rewriting, reformatting, or reviewing the notes on a published MeshLLM GitHub release, including the automatic release-notes regrouping job, its deterministic…. Release Notes is an agent skill from Mesh-LLM/mesh-llm. Use this skill when rewriting, reformatting, or reviewing the notes on a published MeshLLM GitHub release, including the automatic release-notes regrouping job, its deterministic classifier, and its optional agent review pass.
Release Notes fits situations like: reviewing the notes on a published MeshLLM GitHub release; including the automatic release-notes regrouping job; its deterministic classifier; its optional agent review pass.
Run `npx skills add Mesh-LLM/mesh-llm --skill release-notes -a claude-code`. Or copy the skill folder (.agents/skills/release-notes in Mesh-LLM/mesh-llm) into .claude/skills/release-notes in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Mesh-LLM/mesh-llm --skill release-notes -a codex`. Or copy the skill folder (.agents/skills/release-notes in Mesh-LLM/mesh-llm) into .agents/skills/release-notes in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Mesh-LLM/mesh-llm --skill release-notes -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-notes, .gemini/skills/release-notes, .github/skills/release-notes and .opencode/skills/release-notes in your project.
Going by SKILL.md and its folder, Release Notes needs the command-line tools its instructions call (gh, python3 and just). Our summary lists: Python 3.
SKILL.md names 2 domains. As links in the text: keepachangelog.com and conventionalcommits.org. This is read from the text; nothing was executed.
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.
Release Notes 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.
About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Release Notes: Cutting A Release (TriliumNext/Trilium, 38k stars), Mole CLI Release Flow (tw93/Mole, 69k stars), Draft Release Notes (jamiepine/voicebox, 57k stars) and Mole Release Notes Publisher (tw93/Mole, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Mesh-LLM (a GitHub organization) maintains it in Mesh-LLM/mesh-llm, which has 3,484 GitHub stars. The repository holds 25 skills in this directory. The repository was last updated on October 7, 2026.
Source: Mesh-LLM/mesh-llm on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.