Agent skill

Release Notes

by mono in mono/SkiaSharp

Write the polished prose for a SkiaSharp release-notes page.

MITAuto-check passedDevelopment

Install Release Notes

skills CLI
$ npx skills add mono/SkiaSharp --skill release-notes -a claude-code

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

GitHub CLI
$ gh skill install mono/SkiaSharp release-notes --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/mono/SkiaSharp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/release-notes .claude/skills/release-notes && 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-notes
GitHub stars
5.6k
Token cost
~4.5k tokens
SKILL.md length
2,377 words
Files
10 (incl. scripts)
Skills in repo
23
Repo updated
First seen
Licence
MIT

At a glance

Write the polished prose for a SkiaSharp release-notes page.

  • Works in 3 steps: .agents/skills/release-notes/scripts/prep… → You read each listed page's data.json… → .agents/skills/release-notes/scripts/rend…
  • The release-notes workflow asks you to fill in a versions notes
  • SKILL.md covers The one test for everything…, Running the full pipeline…, How to work and The slots, plus 1 more section
  • Runs Shell scripts from its folder; calls python3

What it does

Release Notes is an agent skill from mono/SkiaSharp. Write the polished prose for a SkiaSharp release-notes page. Use whenever the release-notes workflow asks you to fill in a version's notes, when you see a data.json for a release under documentation/docfx/releases/sources/, or when a user asks to draft, polish, or regenerate release notes / a changelog for a SkiaSharp version. You produce ONE small JSON file of prose (prose.json) — website page prose plus, per exact shipment tag, the reviewed GitHub Release summary; a deterministic renderer/updater builds the…

Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including scripts (for example `samples/4.148.0.data.json`, `samples/4.148.0.prose.json` and `samples/4.148.0.rendered.md`).

It sits in Development, covering Changelog and release notes. It works with GitHub. The repository describes itself as: SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile… The licence is MIT.

When your agent uses it

  • The release-notes workflow asks you to fill in a versions notes
  • You see a data.json for a release under documentation/docfx/releases/sources/
  • A user asks to draft
  • Regenerate release notes / a changelog for a SkiaSharp version

Example prompts

  • “/release-notes”

Requirements

  • Python 3
  • A Bash shell

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. .agents/skills/release-notes/scripts/prepare.sh — regenerates the API diffs
  2. You read each listed page's data.json and write its prose.json from scratch
  3. .agents/skills/release-notes/scripts/render.sh — renders every page from

What it can do on your machine

Read from SKILL.md and the folder at commit a74f7f9. 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

    Ships 2 files in scripts/ (Shell), which the agent can run.

    Shell commands in SKILL.md call:

    • python3

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

  • Network

    No URLs in SKILL.md.

    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 Notes loads about 4.5k tokens when it runs. Until then it costs about 141 tokens; SKILL.md has 2,377 words of instructions outside code blocks.

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

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); the scripts in this folder are not scanned.

SKILL.md

The full file from mono/SkiaSharp at commit a74f7f9, republished under its MIT licence (© mono). 2,377 words, ~4,468 tokens.

Download SKILL.mdSave it as .claude/skills/release-notes/SKILL.md (or your agent's skills folder). This skill also uses 9 other files; get the full folder from GitHub.
name
release-notes
description
Write the polished prose for a SkiaSharp release-notes page. Use whenever the release-notes workflow asks you to fill in a version's notes, when you see a `data.json` for a release under `documentation/docfx/releases/_sources/`, or when a user asks to draft, polish, or regenerate release notes / a changelog for a SkiaSharp version. You produce ONE small JSON file of prose (`prose.json`) — website page prose plus, per exact shipment tag, the reviewed GitHub Release summary; a deterministic renderer/updater builds the page and the Release body.

Release notes — writing the prose

You are writing the human prose for one release-notes page. You do not build the page. A script (release-notes-render.py) owns every heading, table, banner, @handle, ❤️, and PR link. Your entire job is to fill a small set of prose slots, and the renderer assembles the page from those plus the facts in data.json.

The renderer owns headings, handles, contributor lists, and links so those structural elements remain consistent. Focus on turning the activity facts into a changelog a NuGet consumer wants to read.

The one test for everything you write

Would a consumer notice this change without looking inside our repo?

If yes, write about it. If no (CI tweaks, internal refactors, doc/workflow plumbing, test infra), leave it out — the renderer already collapses that noise. data.json tags every PR product / mixed / internal; treat internal as invisible unless it changed shipped behaviour, and for mixed (build config in native/, or a docs API-docs bump) judge from the title.

Running the full pipeline (prepare → write prose → render)

Producing release notes is three steps. Two are scripts you run; the middle one is the writing this skill is about.

prepare.sh   →   (you write prose.json per page)   →   render.sh
 (network)              (this skill)                     (offline)
  1. .agents/skills/release-notes/scripts/prepare.sh — regenerates the API diffs (Cake), the per-page _sources/<version>.data.json facts, and _sources/index.json, and writes the list of pages needing prose to output/files-to-polish.txt. When a page's facts changed, Prepare DELETES that page's prose.json so there is nothing stale to keep — every page on the list starts from a blank prose slate.
  2. You read each listed page's data.json and write its prose.json from scratch (below). Each page in the list has no prose.json — do not go looking for an old one to "check if it still matches"; the facts moved (new/removed PRs, re-tags), so you author fresh. Cover every product PR you'd expect a consumer to notice — a page that silently drops a real change is the failure this design prevents.
  3. .agents/skills/release-notes/scripts/render.sh — renders every page from data.json + prose.json and rebuilds TOC.yml + index.md. It fails loudly if any page on the list still lacks a prose.json (you missed one) or if prose is invalid.

Both scripts take the same three flags — --force, --min-version, --max-version — and nothing else. Choose them from what was asked:

  • "regenerate the release notes for 4.151.0" → --min-version 4.151.0 --max-version 4.151.0
  • "regenerate the release notes" (everything) → no flags
  • after changing the api-diff tools or the page format → add --force (rebuilds even cached api diffs / unchanged pages)

Everything is incremental: an unforced run skips work whose output already exists (a shipped version's api diff never changes), so a routine run is cheap — there is no "notes-only" mode to reach for.

Running locally (needs dotnet, python3, git, gh):

bash
# one version, end to end
.agents/skills/release-notes/scripts/prepare.sh --min-version 4.151.0 --max-version 4.151.0
#   … you write documentation/docfx/releases/_sources/4.151.0.prose.json …
.agents/skills/release-notes/scripts/render.sh  --min-version 4.151.0 --max-version 4.151.0

# everything
.agents/skills/release-notes/scripts/prepare.sh
.agents/skills/release-notes/scripts/render.sh

In CI a separate prepare job runs step 1, and you (the agent) do steps 2 and 3 — write each page's prose, then run release-notes-render.py --all to finalize (the workflow's tool allowlist permits python3 for exactly this).

How to work

You are given a list of pages to write (in CI, output/files-to-polish.txt; one documentation/docfx/releases/<version>.md path per line). The list may be empty — that just means no page needs new prose this run, but you must still run the final render (render.sh, or release-notes-render.py --all in CI) to materialize the deterministic pages and rebuild the TOC/index; don't exit early. Every input for a page lives in a _sources/ folder beside it — for a page releases/<version>.md the inputs are releases/_sources/<version>.data.json, releases/_sources/<version>.prose.json (what you write), and an optional releases/_sources/<version>.notes.md. HarfBuzzSharp is not a separate page — it ships inside each SkiaSharp release, so it renders as a ## HarfBuzzSharp X.Y.Z section on the SkiaSharp page (see harfbuzz_summary below). For each page:

  1. Read its _sources/<version>.data.json. It has: prs (title, author, community, tag), previews (each with its PR list), contributors (the authoritative roster), breaking_candidates, tallies, shipments (format 5+; the exact git tag(s) this page rolls up — a preview, an rc, and/or the stable release itself, see release_summaries below), and the banner/link facts.
  2. Read every breaking source named in breaking_candidates, if present: the version's *.breaking.md API diffs and every referenced _sources/*.notes.md sidecar. A cumulative page may reference notes from a skipped preview-only line. These are your material for the breaking slot — API diffs give signature removals, while notes sidecars give behavioural breaks (same signature, new runtime behaviour) that no diff can detect.
  3. Write documentation/docfx/releases/_sources/<version>.prose.json (schema: scripts/infra/docs/release-notes-schema/prose.schema.json).
  4. Render the page: python3 scripts/infra/docs/release-notes-render.py _sources/<version>.data.json _sources/<version>.prose.json <version>.md (use the full documentation/docfx/releases/ paths). If it prints PROSE VALIDATION FAILED, read the errors, fix that slot, and re-run. A clean render — the .md written — is the bar.

You never hand-edit the .md, TOC.yml, or index.md, and you never create, rename, or delete pages — release-notes-render.py --all (which render.sh runs) owns page creation and pruning. The per-page render above is just to validate your prose as you go; render.sh does the authoritative final pass — it re-renders every page and rebuilds TOC.yml + index.md from the committed JSON. Commit the _sources/<version>.prose.json and the rendered .md together (the _sources/<version>.data.json is already produced by the Prepare phase).

The slots

Each slot below lists its purpose, the cap the renderer enforces, and one good + one bad example. Caps are hard: the renderer rejects an over-long highlight, a missing contributor, or an unknown category. Stay well under and you never see an error. Where a slot is nullable or optional, the note says so — reach for null rather than padding.

theme — 2-6 words

What this release is about, shown bold in the banner. No punctuation.

  • Good: First stable v4 release
  • Bad: Version 4.148.0 (that's the title, not a theme) · Lots of fixes and new APIs (vague)
highlights_headline — one sentence, ≤20 words

The single most important thing about the release. Not a list. Decide it from the product-tagged PRs, the Skia milestone bump, and whether there are breaking changes — the one thing a consumer would care about most, in a sentence. You are not summarising every PR here.

  • Good: SkiaSharp 4.148.0 is the first stable v4 release, built on Skia m148.
  • Bad: This release adds WebP, SKStream.GetData, singleton lifecycle, pixel fixes, WinUI fixes, and more. (enumeration)
highlights_body — optional, ≤60 words, or null

Name the biggest themes to draw the reader in. Prose is best, but a short feature list is fine for a big release — just keep the whole Highlights block (headline + body) under ~100 words so it stays a lead-in, not the changelog. No PR links, no @handles. If the headline already says enough, use null.

  • Good: It adds variable fonts and animated WebP, and reworks the singleton lifecycle. This is a breaking release — check the changes below before upgrading.
  • Bad: Includes #4125, #3771, #3772, #4080, #4068 and fixes from @ramezgerges. (links + handles, and it's just PR numbers, not themes)
breaking — array, one entry per change a consumer must act on

Merge from two sources: signature removals in the *.breaking.md diff, and behavioural breaks described in breaking_candidates / the notes sidecar. Empty array is fine and renders "None in this release." Give each a title, a body that says what changed and what to do, and the prs it came from. Only write what you can substantiate: a breaking_candidate carries a hint and sometimes prs, but when its companion file isn't on disk and it lists no concrete change, fall back to the PR titles in prs you can actually read — never invent a removal you can't point at.

  • Good: {"title": "SKPaint no longer exposes legacy text state", "body": "The paint text/font members obsoleted in v3 are now compile errors — move typeface and text size onto SKFont.", "prs": [4068, 4114]}
  • Bad: {"title": "Refactoring", "body": "Various changes."} (no action, not consumer-facing)
categories — array of {heading, bullets}

The body of the page. heading must be exactly one of these six (the renderer rejects anything else — this is the closed list, in the order they render):

HeadingWhat belongs here
EngineThe Skia milestone bump and upstream engine syncs; bundled-engine changes a consumer would feel.
API SurfaceNew or changed public APIs — added types, methods, overloads, options.
Bug FixesCorrected behaviour, crashes, wrong output — even when platform-specific.
Lifecycle & InternalsDisposal, finalizers, initialization, singleton/handle lifecycle — consumer-visible runtime behaviour, not build plumbing.
PlatformPlatform-support changes: a target added or dropped, new native assets, TFM realignment.
SecurityBundled native-dependency refreshes and security fixes.

You choose which of the six to include — a section appears only when it has a real product-facing bullet, and you may use as few as one. Prefer fewer, denser sections over many one-bullet ones. Curate, don't enumerate: each bullet MERGES related PRs into one product theme (aim 3-5 bullets per section on a big release; 1-2 is perfectly fine on a servicing release — never merge distinct areas just to hit a count), with a lead (bold summary) + detail (what it means for the consumer) + the prs. The renderer adds the PR links and the ❤️ community credit — never write those yourself. A change with a migration usually belongs in breaking; don't also give it its own thin category section unless it has independent product value. Placement rule of thumb: ordinary fixes go under Bug Fixes even when platform-specific; use Platform only for platform-support additions or removals.

  • Good: {"heading": "Bug Fixes", "bullets": [{"lead": "Pixel access corrected", "detail": "GetPixelSpan now uses RowBytes for stride and the right axis for offsets.", "prs": [4148, 4128]}]} (two PRs → one theme)
  • Bad: {"heading": "Bugfixes", …} (not one of the six) · one bullet per PR restating its title · a section that lists 20 internal PRs.
Show full SKILL.md (822 more words)Show less
contributor_summaries — one line per roster login

data.contributors is authoritative — every login there needs an entry (the renderer fails otherwise) and no one else gets one. Summarise that person's work in prose; the renderer adds their @handle and PR links. This is the one place internal work is worth naming — a contributor's sample or CI work still deserves credit even though it never became a category bullet.

  • Good: "ramezgerges": "Singleton lifecycle rework, the SKPath finalizer fix, and Uno sample updates"
  • Bad: "ramezgerges": "#4080, #4068, #3796" (that's data, not a summary)
preview_summaries — one line per preview key

data.previews lists each preview/RC with the PRs that first shipped in it. Give each key a 1-2 sentence summary of what that milestone delivered. When a preview only carried internal work, describe the milestone itself (e.g. "opened the line" or "cut the release candidate") rather than forcing a product story.

  • Good: "4.148.0-p2": "Preview 2 added animated WebP encoding and the SKPath finalizer fix."
  • Bad: leaving a preview key out (the renderer fails), or restating every PR.
harfbuzz_summary — one short paragraph, or null

HarfBuzzSharp ships inside each SkiaSharp release, so its notes are a ## HarfBuzzSharp X.Y.Z section on this page, not a separate page. data.harfbuzz gives the version and prs — the PRs in this release that touched the HarfBuzz binding (a subset of the page's PRs, so you have already written about most of them above). Summarise the HarfBuzz-facing story in 1-2 sentences; the renderer adds the heading, the ❤️ credit and the PR links.

  • Required only when data.harfbuzz.prs is non-empty. When it is empty the renderer writes "No HarfBuzzSharp binding changes shipped…" itself — set harfbuzz_summary to null. When data.harfbuzz is absent (e.g. an unreleased head), omit it.
  • Good: "Adds variable-font shaping and an HBColor value type, and refreshes the bundled HarfBuzz to 8.3.0."
  • Bad: re-listing every PR, or repeating the SkiaSharp highlights verbatim.
release_summaries — optional, one entry per exact shipment tag

This slot writes for a different reader and a different surface than everything above: instead of the website page, it converges the reviewed GitHub Release summary for one exact tag. A separate deterministic updater (scripts/infra/docs/release_notes/update_github_summaries.py) renders each entry into the complete canonical body of that exact tag's GitHub Release. The updater recreates the entire body from the reviewed prose and committed exact-shipment facts: deterministic links, all human contributors, the first-time-human subset, and substantiated automation/AI assistance. It never emits a PR list, preserves old body text, or asks GitHub to generate a live region, so an old generated body is safely replaced rather than preserved. There is no release-critical deadline for it.

The visible body stays short: script-owned shipment label + reviewed headline, optional reviewed body, one compact Release notes/NuGet/Full changelog line, then optional 👥 Contributors, 🎉 First-time contributors, and 🤖 Automation and AI assistance lines. First-timers intentionally appear in both human lines. There is never a What's Changed section or PR bullet list; the website release notes are authoritative for detail.

data.shipments (format 5+, present only on a released page) lists every exact tag this page rolls up — a preview, an rc, and/or the stable release itself — each with its own tag (e.g. "v4.151.0-preview.1.1"), label (e.g. "Preview 1"), and delta prs since the previous tag (globally, not just this page's). Write one release_summaries entry per tag you have enough to say something crisp about; omit a tag entirely rather than pad it — an omitted tag is simply not converged yet, never an error.

Copy each key verbatim from data.shipments; prerelease keys include their exact Arcade build revision.

Each entry is {"headline": string, "body": string|null}:

  • headline — one plain-language sentence naming what this exact shipment is about. The updater prefixes it with the shipment's own script-owned label (**Preview 1**) and appends deterministic release-notes/NuGet/changelog links and exact-shipment attribution lines — never write a heading, link, contributor, or @handle yourself.
  • body — optional, 1-3 sentences of extra detail; null when the headline says enough.

Both strings go through the release-summary safety gate (scripts/infra/docs/release_notes/safety.py): no code fence, no CVE/security/vulnerability wording (bundled-dependency bumps stay neutral — "Updated libpng to 1.6.44.", never "security fix"), no unwritten placeholder, no heading/list/table as the opening line, and never the literal text of a managed marker. A violation fails the updater loudly rather than shipping — fix the prose in a follow-up PR; it never blocks this one.

  • Good: {"headline": "SkiaSharp 4.151.0 previews the Skia m151 engine update.", "body": "It brings the current upstream renderer into the 4.151 line without changing the managed API surface."}
  • Bad: {"headline": "Security fix for a bundled library."} (never name security/CVE details) · {"headline": "## What's New"} (that's the renderer's job) · omitting 4.151.0-preview.1 and every other tag just because the stable tag isn't ready yet (converge each tag independently, as its own prose is ready).

Why this is short

There is no separate template, grouping guide, or checklist to reconcile — the renderer is the checklist, and this file is the only instructions. If a rule isn't here, it's because the renderer already guarantees it. Write the prose; let the script build the page.

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

Files

SKILL.md and 9 other files (scripts) in .agents/skills/release-notes of mono/SkiaSharp.

  • SKILL.md
  • samples/4.148.0.data.json
  • samples/4.148.0.prose.json
  • samples/4.148.0.rendered.md
  • samples/4.151.0.data.json
  • samples/4.151.0.prose.json
  • samples/4.151.0.rendered.md
  • samples/README.md
  • scripts/prepare.sh
  • scripts/render.sh

Open the folder on GitHubat commit a74f7f9

Compare with similar skills

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.

Release Notes compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Release Notes this skillmono/SkiaSharp5.6k—~4.5kAutomated safety check: PassMIT
Cutting A ReleaseTriliumNext/Trilium38k—~3.2kAutomated safety check: PassAGPL-3.0
Mole CLI Release Flowtw93/Mole69k—~2.5kAutomated safety check: PassGPL-3.0
Draft Release Notesjamiepine/voicebox57k—~941Automated safety check: PassMIT
Mole Release Notes Publishertw93/Mole69k—~1.9kAutomated safety check: PassGPL-3.0
Release Bumpjamiepine/voicebox57k—~1.1kAutomated safety check: PassMIT

Similar skills

  • 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.

    69k GitHub stars~2.5k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Draft 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.

    57k GitHub stars~941 tokensUpdated yesterday
    DevelopmentAuto-check passed
  • 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.

    69k GitHub stars~1.9k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Release Bump

    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.

    57k GitHub stars~1.1k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Cut Release

    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.

    2.7k GitHub stars~2k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed

More from mono/SkiaSharp

All 23 skills in this repo
  • Issue Fix

    mono/SkiaSharp

    Fix bugs in SkiaSharp C bindings. An agent skill from mono/SkiaSharp.

    5.6k GitHub stars~5.1k tokensUpdated today
    Auto-check passed
  • Issue Repro

    mono/SkiaSharp

    Reproduce a SkiaSharp issue systematically and capture structured reproduction results.

    5.6k GitHub stars~4.7k tokensUpdated today
    Auto-check passed
  • Issue Triage

    mono/SkiaSharp

    Triage a SkiaSharp GitHub issue or PR into structured JSON with classification (type, area, platform, severity), suggested response, automatable actions, and companion Markdown/HTML reports.

    5.6k GitHub stars~3.4k tokensUpdated today
    Auto-check passed
  • Update native dependencies (libpng, libexpat, zlib, libwebp, harfbuzz, freetype, libjpeg-turbo, etc.) in SkiaSharp's Skia fork.

    5.6k GitHub stars~4.1k tokensUpdated today
    Auto-check passed
  • Review Skia Update

    mono/SkiaSharp

    Review a Skia upstream merge PR in mono/skia. An agent skill from mono/SkiaSharp.

    5.6k GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Sample Scout

    mono/SkiaSharp

    Scout Skia GM (golden master) samples in the externals/skia submodule to find demos worth porting to the SkiaSharp Gallery.

    5.6k GitHub stars~1.5k tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Release Notes

What does Release Notes do?

Write the polished prose for a SkiaSharp release-notes page. Release Notes is an agent skill from mono/SkiaSharp. Write the polished prose for a SkiaSharp release-notes page.

When should I use Release Notes?

Release Notes fits situations like: the release-notes workflow asks you to fill in a versions notes; you see a data.json for a release under documentation/docfx/releases/sources/; A user asks to draft; regenerate release notes / a changelog for a SkiaSharp version.

How do I install Release Notes in Claude Code?

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

How do I install Release Notes in Codex?

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

Can I use Release Notes 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 mono/SkiaSharp --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.

What does Release Notes need to run?

Going by SKILL.md and its folder, Release Notes needs a shell for the scripts in its folder and the command-line tools its instructions call (python3). Our summary lists: Python 3; A Bash shell.

Does Release Notes access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Release Notes 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Release Notes use?

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

How many tokens does Release Notes use?

About 4.5k tokens (SKILL.md is roughly 18k 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 Notes?

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.

Who maintains Release Notes?

mono (a GitHub organization) maintains it in mono/SkiaSharp, which has 5,585 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 7, 2026.

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