Tabler Release Notes Intro
tabler/tabler
Writes the hand-written intro for a Tabler GitHub release, built from changesets, docs pages and upgrade guides in a fixed layout with a picture per headline feature.
Rewrites a moraine GitHub release body into a usage-focused format with install block, what's new, platform table, upgrade notes and one deduplicated changelog.
$ npx skills add eric-tramel/moraine --skill release-notes -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install eric-tramel/moraine 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/eric-tramel/moraine.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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/eric-tramel/moraine/tree/main/.claude/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 eric-tramel/moraine --skill release-notes -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install eric-tramel/moraine release-notes --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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 eric-tramel/moraine --skill release-notes -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install eric-tramel/moraine release-notes --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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/eric-tramel/moraine.git --path .claude/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 eric-tramel/moraine --skill release-notes -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install eric-tramel/moraine release-notes --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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 eric-tramel/moraine 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 eric-tramel/moraine --skill release-notes -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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 eric-tramel/moraine --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 eric-tramel/moraine release-notes --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/eric-tramel/moraine.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/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/eric-tramel/moraine/tree/main/.claude/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-notesRewrites a moraine GitHub release body into a usage-focused format with install block, what's new, platform table, upgrade notes and one deduplicated changelog.
You run it as /release-notes with a tag such as v0.4.2. The agent reads the current auto-generated body, which repeats its changelog several times because each release matrix job appends one, collects PR summaries for user-visible features, and publishes the rewrite with gh release edit and a notes file. If the tag is not on GitHub yet, it stops and explains rather than creating a release.
It first classifies the release. A landmark release gets the full body with install, screenshots and upgrade notes, a patch release keeps only the under-the-hood section, and a minor one drops sections that did not change. The platform support table must match the wheel platform mapping in scripts/build-python-wheels.py, and exactly one changelog block is kept at the bottom. The folder also holds scripts/shoot-monitor.mjs. The model does not invoke this skill on its own.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 2fb4aec. 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.
Ships 1 file in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
ghuvbunnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and uv, which can reach the network depending on how they are called.
From 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.
Moraine Release Notes loads about 2.7k tokens when it runs. Until then it costs about 111 tokens; SKILL.md has 778 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); the scripts in this folder are not scanned.
The full file from eric-tramel/moraine at commit 2fb4aec, republished under its Apache-2.0 licence (© eric-tramel). 778 words, ~2,689 tokens.
.claude/skills/release-notes/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You are rewriting a GitHub release body in moraine's house format. The input
is a tag (e.g. v0.4.2); the output is an updated release body published via
gh release edit <tag> --notes-file <path>.
Your goal is usage-focused, not commit-focused. A reader skimming the release page should understand in 30 seconds: how do I install this, what new thing can I do with it, and am I supposed to do anything when I upgrade?
/release-notes v0.4.2 — rewrite the v0.4.2 release body.
If the tag doesn't exist on GitHub yet, stop and explain. Do not create a
release; the release is cut by .github/workflows/release-moraine.yml on tag
push.
# Current (auto-generated) body. It's usually duplicated 3-6× because the
# release matrix runs softprops/action-gh-release from each target job, each
# time with generate_release_notes: true. You will dedupe in step 3.
gh release view "$TAG" --json body -q .body > /tmp/release-body.current.md
# Previous release tag, for the compare link and upgrade section.
prev_tag="$(gh release list --limit 20 --json tagName,isDraft,isPrerelease -q \
'[.[] | select(.isDraft==false and .isPrerelease==false and .tagName!=env.TAG) | .tagName] | .[0]')"
# Full list of PRs merged since the previous tag, for context.
gh pr list --state merged --search "merged:>=<prev-tag-date>" --json number,title,url
# or simpler — trust the auto-generated list and just read it.Also read:
scripts/build-python-wheels.py — keep the "Platform support" table in
sync with TARGET_TO_WHEEL_PLATFORM.gh pr view <n> --json body -q .body). Prefer the PR's own summary over inventing one.Before writing, classify the release:
Don't force a section that has nothing to say.
Every matrix job appended its own ## What's Changed ... **Full Changelog**
block. Keep exactly one. The simplest path: open the current body in an
editor, delete all but the first block, move it to the bottom under a
## Changelog heading.
Check the dedupe with:
grep -c '^## What.s Changed' /tmp/release-body.current.md # should be 1 after dedupe
grep -c 'Full Changelog' /tmp/release-body.current.md # should be 1Template (copy/paste, then fill in):
# moraine <TAG>
<one-sentence pitch — what is the headline story of this release?>
## 🚀 Install
```bash
uv tool install moraine-cli
moraine up<one short paragraph expanding on the install command, plus the upgrade recipe for existing users if relevant>
<feature title> (#<PR>)<2-4 sentences describing the user-visible outcome, in usage-first language. Start with what a user does or sees, not with what you changed.>
<optional: side-by-side screenshot table; see "Screenshots" below>
<repeat per major feature; 2-4 subsections is ideal, 5+ feels padded>
<PR> — one line, user-facing angle if any| Platform | Wheel | Notes |
|---|---|---|
| Linux x86_64 | manylinux_2_28_x86_64 | glibc 2.28+ (Debian 12+, Ubuntu 20.04+, RHEL 9+, AL2023) |
| Linux aarch64 | manylinux_2_28_aarch64 | same floor |
| macOS Apple Silicon | macosx_11_0_arm64 | macOS 11.0+ |
| macOS Intel | — | not published; use scripts/install.sh |
| Windows | — | not supported yet |
(Pull the tags from scripts/build-python-wheels.py::TARGET_TO_WHEEL_PLATFORM.
If the platform table hasn't changed since last release, skip this section.)
<prev-tag>moraine down
uv tool upgrade moraine-cli # or: uv tool install --reinstall moraine-cli
moraine up && moraine status<only include this section if there's something the user has to do. If it's just a bug-fix release, skip it.>
<the single deduped auto-generated list from step 3 goes here>
Full Changelog: https://github.com/eric-tramel/moraine/compare/<prev-tag>...<TAG>
### 5. Tone + style rules
- **Usage-first sentences.** "You can now see tool-call latencies in the
monitor" → good. "Adds a new flamegraph component" → bad.
- **Link every PR** the first time you mention a feature: `([#247](url))`.
- **No hedging.** Drop "essentially", "basically", "just". Say what it does.
- **Quote sparingly.** Never copy more than a few lines from a PR body
verbatim; always rewrite for the release audience.
- **Emojis anchor the major sections only** (🚀 🆕 🛠 🐧 ⬆️). Don't sprinkle
them through prose.
- **Call out breaking changes in the section they happen in**, with the
word "removed" or "requires" — not buried in the changelog.
- **Honest platform support.** If Windows isn't supported, the table says
"not supported yet", not "coming soon".
- **Don't promise canary-week timing.** The runbook in
`docs/operations/pypi-release.md` covers that; the release notes are for
the release itself.
### 6. Screenshots (optional, for UX-impacting releases)
Skip this section for patch releases. Include for any release where the
monitor UI visibly changed or install/CLI flows have a step the user can
see. Screenshots are especially worth the effort for the "landmark release"
class above.
**Preconditions:**
- `moraine up` is running on the host (check `curl -sf http://127.0.0.1:8080/
>/dev/null && echo OK`). If not, stop and ask the user to start it.
- `web/monitor/node_modules/playwright` exists (part of the repo's dev
install). If not, run `cd web/monitor && bun install --frozen-lockfile`.
**Capture:**
```bash
node .claude/skills/release-notes/scripts/shoot-monitor.mjs \
"<session title substring>" /tmp/moraine-shotsThe script drives headless chromium, waits for the Live Analytics charts +
sessions list to render, clicks the first session card whose visible title
contains <session title substring> (case-insensitive), and writes three
PNGs:
01-sessions-landing.png — the Sessions surface with Live Analytics02-session-detail.png — transcript pane for the clicked session03-session-flamegraph.png — flamegraph tab for the same sessionLight theme is Playwright's default; use it (it reads better in release notes than dark chrome against the session rows).
Sensitivity review — mandatory before uploading:
01-sessions-landing.png. Session
titles are the first user prompt of that session, verbatim. They
often mention internal project names, ticket numbers, or colleague names.02-session-detail.png and 03-session-flamegraph.png, look for:/Users/<name>/ — reveals username +
dir layoutPick a session whose content is already public (referenced by number in a public GitHub issue/PR, or directly about moraine's open-source development). Sessions about unrelated work are tempting because they're visually busy, but they're usually riskier.
Upload + embed:
# Rename for a stable, human-legible asset name on the release page.
cp /tmp/moraine-shots/02-session-detail.png \
/tmp/moraine-shots/moraine-monitor-sessions-transcript.png
cp /tmp/moraine-shots/03-session-flamegraph.png \
/tmp/moraine-shots/moraine-monitor-sessions-flamegraph.png
gh release upload "$TAG" \
/tmp/moraine-shots/moraine-monitor-sessions-transcript.png \
/tmp/moraine-shots/moraine-monitor-sessions-flamegraph.png \
--clobberEmbed side-by-side inside the relevant ### <feature> section of the body.
Tables render cleaner than raw HTML in GitHub markdown and each image can
link to its own full-size asset for click-to-zoom:
| Transcript view | Flamegraph view |
|---|---|
| [](https://github.com/eric-tramel/moraine/releases/download/<TAG>/moraine-monitor-sessions-transcript.png) | [](https://github.com/eric-tramel/moraine/releases/download/<TAG>/moraine-monitor-sessions-flamegraph.png) |Release-asset URLs are stable — they won't rot when you clean up issue
attachments. They render inline because GitHub serves them with the right
Content-Type.
gh release edit "$TAG" --notes-file /tmp/release-body.new.mdThen verify:
# Count should drop to 1 of each
gh release view "$TAG" --json body -q .body | grep -c '^## What.s Changed'
gh release view "$TAG" --json body -q .body | grep -c 'Full Changelog'
# Total body length should be ~5-8k (v0.4.2 settled at 7.1k). If it's
# over 10k, you probably didn't dedupe; under 2k, you probably skipped
# sections the release needed.
gh release view "$TAG" --json body -q .body | wc -cShow the user the final URL (https://github.com/eric-tramel/moraine/releases/tag/<TAG>)
and the body length. They'll spot-check.
Use https://github.com/eric-tramel/moraine/releases/tag/v0.4.2 as the canonical example of this format. It was cut with this skill's predecessor workflow and is the specimen the format was distilled from.
© eric-tramel, 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
SKILL.md and 1 other file (scripts) in .claude/skills/release-notes of eric-tramel/moraine.
Open the folder on GitHubat commit 2fb4aec
Moraine 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 |
|---|---|---|---|---|---|---|
| Moraine Release Notes this skilleric-tramel/moraine | 117 | — | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Tabler Release Notes Introtabler/tabler | 42k | — | ~1.8k | Automated safety check: Pass | MIT | |
| CicdRussellSB/pytrendy | 106 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Mole Release Notes Publishertw93/Mole | 69k | — | ~1.9k | Automated safety check: Pass | GPL-3.0 | |
| RStudio What's New Pagerstudio/rstudio | 5.1k | — | ~2k | Automated safety check: Pass | Custom licence | |
| Release Feature Scoringdotnet/core | 22k | — | ~2.2k | Automated safety check: Pass | MIT |
tabler/tabler
Writes the hand-written intro for a Tabler GitHub release, built from changesets, docs pages and upgrade guides in a fixed layout with a picture per headline feature.
RussellSB/pytrendy
A skill your agent uses when touching .github/workflows/, release config (.releaserc), mkdocs.yml, docs deploy, or the whats-new generator.
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.
rstudio/rstudio
Turns the current release's NEWS.md entries into the RStudio Desktop What's New page, picking only what Desktop users care about, then commits and opens a PR.
dotnet/core
Ranks the changes in a release manifest and writes a scored features file that release notes, docs and blog posts can each cut at their own threshold.
Azure/AppConfiguration
Writes customer-facing release notes for Azure App Configuration libraries and providers in a fixed file layout, version heading and category structure.
eric-tramel/moraine
Cuts and publishes a Moraine release end to end: version bump PR, tag, GitHub release notes, workflow check and PyPI package verification.
eric-tramel/moraine
Coordinates a delegated review of a Moraine PR or local change by seven focused reviewer subagents, merges their findings and follows up on the fixes.
eric-tramel/moraine
Looks at a pull request for the smallest good design, hunting for simplifications and architectural moves that remove whole classes of problems.
eric-tramel/moraine
Reviews a pull request for idiomatic implementation: use of the language, standard library, ecosystem conventions and the repository's own patterns.
eric-tramel/moraine
Review a PR through the CodeReviewSecurityReview persona. An agent skill from eric-tramel/moraine.
eric-tramel/moraine
Turn a rough feature, bug, refactor, architecture, documentation, or operations idea into a ready-to-implement local plan file.
Works with
Categories
Rewrites a moraine GitHub release body into a usage-focused format with install block, what's new, platform table, upgrade notes and one deduplicated changelog. 2. The agent reads the current auto-generated body, which repeats its changelog several times because each release matrix job appends one, collects PR summaries for user-visible features, and publishes the rewrite with gh release edit and a notes file.
Moraine Release Notes fits situations like: preparing the GitHub release page for a freshly tagged moraine version; cleaning up an auto-generated release body that repeats its changelog; deciding which sections a patch release and a landmark release each need.
Run `npx skills add eric-tramel/moraine --skill release-notes -a claude-code`. Or copy the skill folder (.claude/skills/release-notes in eric-tramel/moraine) into .claude/skills/release-notes in your project. Claude Code loads it when a task matches its description.
Run `npx skills add eric-tramel/moraine --skill release-notes -a codex`. Or copy the skill folder (.claude/skills/release-notes in eric-tramel/moraine) 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 eric-tramel/moraine --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, Moraine Release Notes needs JavaScript for the scripts in its folder and the command-line tools its instructions call (gh, uv, bun and node). Our summary lists: GitHub CLI (`gh`) authenticated for the moraine repository; The release tag already pushed to GitHub.
SKILL.md contains no URLs. Its commands use gh and uv, which can reach the network depending on how they are called. 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. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Moraine 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.7k 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 Moraine Release Notes: Tabler Release Notes Intro (tabler/tabler, 42k stars), Cicd (RussellSB/pytrendy, 106 stars), Mole Release Notes Publisher (tw93/Mole, 69k stars) and RStudio What's New Page (rstudio/rstudio, 5.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
eric-tramel (a GitHub user) maintains it in eric-tramel/moraine, which has 117 GitHub stars. The repository holds 19 skills in this directory. The repository was last updated on October 5, 2026.
Source: eric-tramel/moraine on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.