RStudio What's New Page
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.
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.
$ npx skills add dotnet/core --skill generate-features -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dotnet/core generate-features --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/dotnet/core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/generate-features .claude/skills/generate-features && 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 "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .claude/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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/dotnet/core/tree/main/.github/skills/generate-featuresType 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 dotnet/core --skill generate-features -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dotnet/core generate-features --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/generate-features .agents/skills/generate-features && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .agents/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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 dotnet/core --skill generate-features -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dotnet/core generate-features --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/generate-features .cursor/skills/generate-features && 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 "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .cursor/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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/dotnet/core.git --path .github/skills/generate-features--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 dotnet/core --skill generate-features -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dotnet/core generate-features --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/generate-features .gemini/skills/generate-features && 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 "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .gemini/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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 dotnet/core generate-featuresInstalls 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 dotnet/core --skill generate-features -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/generate-features .github/skills/generate-features && 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 "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .github/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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 dotnet/core --skill generate-features -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dotnet/core generate-features --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/core.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/generate-features .opencode/skills/generate-features && 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 "generate-features" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/generate-features into .opencode/skills/generate-features/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "generate-features", 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.
generate-featuresRanks 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.
Triage is the job here: the skill reads `changes.json`, which lists what shipped, and writes `features.json`, which lists what is worth telling people about. The new file keeps the same top-level fields, change IDs, repo and product keys and commit objects, so the two files can be joined, diffed and compared without conversion.
Change entries gain optional fields: a numeric `score`, a short `score_reason`, a per-dimension `score_breakdown`, a `breaking_changes` flag kept apart from the score, and `reverted_by` and `reverts` links. A 0-10 scale is suggested, where the top score marks a lead story and lower bands become grouped release-note material. Scoring follows the shared `editorial-scoring` rubric, and regenerating diffs or writing final markdown belong to other skills.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 44927bc. 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:
jqghFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom 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 Feature Scoring loads about 2.2k tokens when it runs. Until then it costs about 104 tokens; SKILL.md has 1,058 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 dotnet/core at commit 44927bc, republished under its MIT licence (© dotnet). 1,058 words, ~2,186 tokens.
.claude/skills/generate-features/SKILL.md (or your agent's skills folder).features.jsonCreate a scored, reusable feature list from changes.json.
This is the triage stage of the release notes pipeline. It turns the comprehensive manifest of shipped changes into a ranked set of candidates for external communication.
Use editorial-scoring as the canonical rubric. Do not invent a different notion of importance for this step.
changes.json answers what shipped.
features.json answers what is worth talking about, while staying schema-compatible with changes.json so the two files can be joined, diffed, and compared easily.
features.json intentionally mirrors changes.json:
release_version, release_date, changes, commitsid, repo, product, and commit key structurecommits{} object so cross-file joins still workThe only additions are optional enrichment fields on change entries, such as:
score (number) — higher means more likely to be documentedscore_reason (string) — short explanation of the scorescore_breakdown (object) — optional per-dimension scoring detailsbreaking_changes (bool) — mark changes that users may need to react to, even when they are not headline itemsreverted_by (array<string>) — optional PR URLs or refs that later backed out this changereverts (array<string>) — optional change IDs or PR URLs that this entry reverts or partially revertsThis schema is intentionally loose and can grow as the workflow learns what it needs.
breaking_changes is separate from score. A change might only be a 3 or 4 on reader interest, but still need to be carried forward as a short migration note because it can affect people upgrading.
Use a consistent numeric scale within a file. The recommended starting point is 0-10:
| Score | Reader reaction | Typical outcome |
|---|---|---|
10 | "This is the first feature I'll enable or test." | Lead story |
8+ | "I'm going to use this when I upgrade." | Strong release-note feature |
6+ | "I'm glad I know about this." | Good grouped release-note material |
4+ | "Someone will care; I can look it up later." | Optional mention or grouping candidate |
2+ | "This is a mystery to me." | Usually skip |
0 | Internal gobbledygook | Never document |
See editorial-scoring for the shared rubric and feature-scoring.md for the detailed heuristics.
Apply the 80/20 rule from that document: prefer features that make sense to most upgraders, and only keep niche items when the broader audience can still appreciate why they matter.
changes.jsonDo not invent features from memory, roadmaps, or PR titles found elsewhere. Everything in features.json must trace back to changes.json.
Do a quick mechanical revert pass before assigning any positive scores. This step
exists because the original PR may appear in the current changes.json while the
revert lands in a later preview and therefore does not appear in the same file.
Start with the obvious cases:
jq -r '.changes[] | select(.title | test("(?i)^(partial(ly)?\\s+)?revert\\b|\\bback out\\b")) | [.repo, .title, .url] | @tsv' changes.jsonThen, for each candidate you might promote into the draft, search the source repo for later merged PRs that explicitly revert or back out that PR number or URL:
gh search prs --repo dotnet/<repo> --state merged \
"\"This reverts https://github.com/dotnet/<repo>/pull/<number>\" OR \"revert <number>\" OR \"back out <number>\"" \
--json number,title,mergedAt,urlWhen a revert is found:
reverted_byreverts, when both are present in the file0 unless you can verify the shipped build still contains the featureDo not promote an item to section-worthy status until this pass is complete.
Look for signals such as:
If a change is important mainly because users need to adjust to it, set breaking_changes: true even if the score stays low. Do not inflate the score just to keep the item visible.
If several individually modest changes cluster around one theme, keep that cluster in mind as you score. Do not inflate each entry, but do preserve the related items so downstream writing can roll them up into one coherent feature writeup. Title prefixes and labels are often useful clues here, such as a set of [browser] runtime changes or multiple "Unsafe evolution" items.
Down-rank or exclude:
editorial-rules.mdIf a change depends on public APIs, use api-diff / dotnet-inspect to confirm the API exists in the actual build. Missing or reverted APIs should be scored down or excluded.
features.json already existsIf the milestone branch already has a features.json, do not throw that
work away just because changes.json was regenerated. For the full rerun
workflow, follow update-existing-branch.
Use the existing file as the editorial baseline:
This should feel like a merge operation, not a full restart.
features.jsonThe output typically lives next to changes.json:
release-notes/{major.minor}/preview/{previewN}/features.json
release-notes/{major.minor}/{major.minor.patch}/features.jsonComplete this stage before drafting component markdown. Write the actual
changes[] and commits{} from changes.json, with the same change IDs and
optional editorial annotations. A placeholder with only a release version or
a note that feature selection will happen on component branches is not a
features.json output. Score and explain the noteworthy candidates before
handing them to the writing stage; individual low-value entries do not need
scores. When review identifies a noteworthy candidate that should be left out,
record the editorial reason in that entry's score_reason and adjust its score
if needed. Even when nothing is worth a feature writeup, keep the real shipped
changes in the file so the final review can check the editorial cut.
Keep the file mechanically friendly:
changes.jsonscore optional, not requiredscore_reason brief and evidence-basedrelease-notes uses higher-scored entries to draft markdownrelease-notes can also surface low-scored entries with breaking_changes: true as one-line callouts in a breaking-changes sectionreview-release-notes re-checks the scores against editorial examples and trims over-scored items© dotnet, MIT. 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 .github/skills/generate-features of dotnet/core.
Open the folder on GitHubat commit 44927bc
Release Feature Scoring 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 Feature Scoring this skilldotnet/core | 22k | — | ~2.2k | Automated safety check: Pass | MIT | |
| RStudio What's New Pagerstudio/rstudio | 5.1k | — | ~2k | Automated safety check: Pass | Custom licence | |
| Azure App Configuration Release NotesAzure/AppConfiguration | 263 | — | ~3.1k | Automated safety check: Pass | MIT | |
| Change Documentation Writerjsmastery-pro/skills | 1.4k | — | ~2.4k | Automated safety check: Notes | MIT | |
| Moraine Release Noteseric-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 |
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.
Azure/AppConfiguration
Writes customer-facing release notes for Azure App Configuration libraries and providers in a fixed file layout, version heading and category structure.
jsmastery-pro/skills
Writes PR descriptions, changelog entries, release notes and postmortems from the actual commits and diff, and saves each one in the right place.
eric-tramel/moraine
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.
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.
frappe/skills
Write prose in "Simplified Technical English". An agent skill from frappe/skills.
dotnet/core
Audits and updates os-packages.json files listing the Linux packages each .NET release needs per distro, then regenerates the Markdown from the JSON.
dotnet/core
Audits and updates the supported-os.json files for .NET releases, checking them against upstream lifecycle data and regenerating the markdown with the release-notes tool.
dotnet/core
Validates .NET release data with the release-notes CLI: download URL liveness, SHA512 hashes, CDN latest.version files and aka.ms redirects.
dotnet/core
Produces the changes.json manifest for a .NET preview, RC or GA milestone by choosing the right VMR base and head refs and running release-notes generate changes.
dotnet/core
Audits a scored features.json file and its draft release notes against editorial examples to catch over-scored, under-scored, or missing entries.
dotnet/core
Creates and maintains the per-distro JSON files that list the native packages .NET needs on each Linux distribution, scoped to one .NET version.
Works with
Categories
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. json`, which lists what is worth telling people about. The new file keeps the same top-level fields, change IDs, repo and product keys and commit objects, so the two files can be joined, diffed and compared without conversion.
Release Feature Scoring fits situations like: ranking shipped changes before drafting release notes; flagging breaking changes that need a short upgrade note; producing one scored file that docs and blog posts filter by different cutoffs.
Run `npx skills add dotnet/core --skill generate-features -a claude-code`. Or copy the skill folder (.github/skills/generate-features in dotnet/core) into .claude/skills/generate-features in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dotnet/core --skill generate-features -a codex`. Or copy the skill folder (.github/skills/generate-features in dotnet/core) into .agents/skills/generate-features 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 dotnet/core --skill generate-features -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/generate-features, .gemini/skills/generate-features, .github/skills/generate-features and .opencode/skills/generate-features in your project.
Going by SKILL.md and its folder, Release Feature Scoring needs the command-line tools its instructions call (jq and gh). Our summary lists: A `changes.json` manifest of shipped changes.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. 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 Feature Scoring is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.7k 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 Feature Scoring: RStudio What's New Page (rstudio/rstudio, 5.1k stars), Azure App Configuration Release Notes (Azure/AppConfiguration, 263 stars), Change Documentation Writer (jsmastery-pro/skills, 1.4k stars) and Moraine Release Notes (eric-tramel/moraine, 117 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dotnet (a GitHub organization, an official publisher) maintains it in dotnet/core, which has 22,038 GitHub stars. The repository holds 15 skills in this directory. The repository was last updated on October 5, 2026.
Source: dotnet/core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.