Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .claude/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
Type 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.
skills CLI
$ npx skills add dotnet/core --skill update-release-graph -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .agents/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
skills CLI
$ npx skills add dotnet/core --skill update-release-graph -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .cursor/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add dotnet/core --skill update-release-graph -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .gemini/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
Installs 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).
skills CLI
$ npx skills add dotnet/core --skill update-release-graph -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .github/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
skills CLI
$ npx skills add dotnet/core --skill update-release-graph -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "update-release-graph" agent skill from https://github.com/dotnet/core/tree/main/.github/skills/update-release-graph into .opencode/skills/update-release-graph/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-release-graph", 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.
Facts
Skill name
update-release-graph
GitHub stars
22k
Token cost
~4.1k tokens
SKILL.md length
1,154 words
Files
1
Skills in repo
15
Repo updated
First seen
Licence
MIT
At a glance
Regenerates the HAL+JSON .NET release information graph from source data when new releases, CVE data or lifecycle dates change.
Works in 11 steps: Verify source data is ready → Run the graph generators → Regenerate legacy files → …
Adding a new .NET patch release to the release graph
SKILL.md covers Architecture, When to use, Prerequisites and Inputs, plus 5 more sections
Calls python3, git and dotnet; reaches nuget.pkg.github.com and learn.microsoft.com; needs GITHUB_TOKEN
What it does
The graph in `release-notes/` is a set of linked JSON files using HAL `_links` and `_embedded` properties, and it is generated from source data, never edited by hand. Inputs are `releases.json`, per-patch `release.json`, `_manifest.json` lifecycle data, an optional root `_llms.json` of overrides and `cve.json` disclosure records. Outputs include the root, major and patch indexes, the timeline hierarchy from year down to month, `llms.json` and download listings.
The `release-notes` tool offers `generate version-index`, `generate timeline-index`, `generate llms-index` and `generate indexes`, which runs all of them, each taking an input directory, an optional output directory and a `--url-root` option. The skill applies when a patch release ships, a major version is added, CVE data changes, a version reaches end of life or any source file is edited. Changes to `supported-os.json` and querying the graph belong to other skills. The excerpt is cut off at the prerequisites.
When your agent uses it
Adding a new .NET patch release to the release graph
Adding a new major version with its manifest
Refreshing timeline entries after CVE or end-of-life changes
Example prompts
“A new .NET patch release shipped, so update the release graph from the source data.”
“Add the new major version to the graph and regenerate all the indexes.”
“Refresh the timeline after I edited a cve.json file.”
Requirements
The `release-notes` graph generator tool
Workflow steps
11 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.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
python3
git
dotnet
npm
npx
gh
From the folder's file list and the shell code blocks in SKILL.md.
Network
Hosts in commands or code, which the agent is likely to contact:
nuget.pkg.github.com
learn.microsoft.com
dotnet.microsoft.com
raw.githubusercontent.com
Also links to:
datatracker.ietf.org
github.com
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names these keys or tokens, usually read from environment variables:
GITHUB_TOKEN
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Update .NET Release Graph loads about 4.1k tokens when it runs. Until then it costs about 166 tokens; SKILL.md has 1,154 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~166
When it runs· the whole SKILL.md, loaded when a task matches
~4.1k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check passed
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
Download SKILL.mdSave it as .claude/skills/update-release-graph/SKILL.md (or your agent's skills folder).
name
update-release-graph
description
Update the HAL+JSON release information graph when new .NET releases ship. Regenerates index files across the version hierarchy (root → major → patch), timeline hierarchy (timeline → year → month), llms.json, and downloads using graph generator tools. USE FOR: adding a new patch release to the graph, adding a new major version, updating timeline entries after a release, refreshing the graph after source data changes. DO NOT USE FOR: supported-os.json changes (use update-supported-os skill), querying the graph (use dotnet-releases skill on release-index branch), editing generated graph files by hand (update source data and regenerate).
Update Release Graph
Regenerate the HAL+JSON information graph in release-notes/. The graph is a set of interconnected JSON files using HAL_links and _embedded properties. It is generated from source data — never hand-edit the output files.
Architecture
Source data (inputs — edit these)
File
Location
Purpose
releases.json
{ver}/releases.json
Legacy release list with all patches, SDKs, component versions, download URLs, hashes
release.json
{ver}/{patch}/release.json
Individual patch release data (subset of releases.json entry)
_manifest.json
{ver}/_manifest.json
Lifecycle data and reference links (GA date, EOL date, what's-new, compatibility)
_llms.json
_llms.json (root, optional)
Partial overrides merged into generated llms.json
cve.json
timeline/{year}/{month}/cve.json
CVE disclosure records
Generated graph (outputs — do not hand-edit)
text
release-notes/
├── index.json ← root: all major versions
├── llms.json ← AI entry point: latest patches per supported version
├── {ver}/
│ ├── index.json ← major: all patches for this version
│ ├── manifest.json ← reference hub: compatibility, OS support, what's-new
│ ├── sdk/
│ │ ├── index.json ← SDK version index
│ │ └── sdk-{band}.json ← per-band SDK history
│ ├── downloads/
│ │ ├── index.json ← components + feature bands
│ │ ├── runtime.json ← per-RID runtime downloads
│ │ ├── sdk.json ← per-RID SDK downloads
│ │ ├── sdk-{band}.json ← per-RID band-specific SDK downloads
│ │ ├── aspnetcore.json ← per-RID ASP.NET Core downloads
│ │ └── windowsdesktop.json ← per-RID Windows Desktop downloads
│ └── {patch}/
│ └── index.json ← patch detail (immutable after creation)
└── timeline/
├── index.json ← timeline root: all years
├── {year}/
│ ├── index.json ← year: all months with releases
│ └── {month}/
│ └── index.json ← month: all patches released (immutable)
Graph generators
The release-notes tool includes four graph generation commands:
Command
Generates
From
generate version-index
Root index, major indexes, patch indexes, manifests, SDK indexes, downloads
A new .NET patch release ships (monthly servicing) — source data is updated, graph needs regenerating
A new .NET major version is added — _manifest.json and initial releases.json are created
CVE data changes — cve.json files are updated, graph needs refreshing
A .NET version reaches end-of-life — _manifest.json is updated, graph needs regenerating
Any source data file is modified and the graph should reflect the changes
Prerequisites
release-notes
The release-notes tool handles both graph generation and legacy file operations. The public dotnet-release tool is for navigating release data and CVEs. Packages are published to GitHub Packages.
bash
dotnet tool install -g release-notes \
--add-source https://nuget.pkg.github.com/richlander/index.json
# Verify — should show graph generation commands
release-notes --help
Note: GitHub Packages requires authentication even for public repositories. If you get a 401 error, configure credentials for the source:
What changed — new patch release, new major version, EOL update, CVE refresh, etc.
Which source files were updated — releases.json, release.json, _manifest.json, etc.
Optionally, a custom --url-root for link generation (defaults to the release-index branch URL)
Process — Regenerate after a new patch release
This is the most common operation. Source data (releases.json, release.json) has been updated with a new patch release.
1. Verify source data is ready
Confirm these files exist and are updated:
bash
# The major version's releases.json must include the new patch
cat release-notes/{ver}/releases.json | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(f\"Latest: {data['releases'][0]['release-version']} ({data['releases'][0]['release-date']})\")"
# The patch directory should exist with release.json
ls release-notes/{ver}/{patch}/
# Expected: release.json, {patch}.md
The _manifest.json should also be present for the major version:
# Verify release links and hashes (can take minutes — do not cancel)
release-notes verify releases release-notes
# Or for a specific version
release-notes verify releases {ver} release-notes
# Skip hash verification for faster iteration
release-notes verify releases release-notes --skip-hash
# Lint generated markdown
npx markdownlint --config .github/linters/.markdown-lint.yml release-notes/releases.md
Exit codes for verify:
0 — no issues
2 — issues found (report written to stdout as markdown)
5. Spot-check the graph
Verify key relationships are correct:
bash
# Root index lists all versions
python3 -c "
import json
data = json.load(open('release-notes/index.json'))
for r in data['_embedded']['releases']:
print(f\"{r['version']}: supported={r.get('supported', 'N/A')}\")"
# Major index has the new patch as latest
python3 -c "
import json
data = json.load(open('release-notes/{ver}/index.json'))
print(f\"Latest patch: {data['latest_patch']}\")
print(f\"First embedded: {data['_embedded']['patches'][0]['version']}\")"
# Month timeline includes the patch
python3 -c "
import json
data = json.load(open('release-notes/timeline/{year}/{month}/index.json'))
for ver, patch in data['_embedded']['patches'].items():
print(f\"{ver}: {patch['version']}\")"
# llms.json is current
python3 -c "
import json
data = json.load(open('release-notes/llms.json'))
for ver, patch in data['_embedded']['patches'].items():
print(f\"{ver}: {patch['version']} ({patch['date']})\")"
The _links section contains reference links that are merged into the generated manifest. These are links that cannot be computed (what's-new pages, compatibility docs, release blog, etc.).
Show full SKILL.md (481 more words)Show less
release.json (per-patch)
Contains the full release data for a single patch: component versions, download URLs, file hashes. This is a subset of the corresponding entry in releases.json.
The generators use release.json to:
Build patch detail indexes with embedded runtime/SDK data
Generate per-RID download files
Compute SDK feature band information
Preview releases
Preview/RC releases are stored in a different directory structure:
{ver}/preview/preview1/ for preview.1
{ver}/preview/rc1/ for RC1
The generators automatically detect this from the version string (contains -preview. or -rc.).
After GA, the generators filter previews from _embedded.patches in the major index. RC releases are kept because they have go-live support.
Update .NET Release Graph 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.
Update .NET Release Graph compared with similar skills
A skill your agent uses when adding a new RCS diagnostic in roslynator (RCS0 formatting, RCS1 general, RCS9 code-analysis), wiring roslynator EditorConfig options, or when docs say CHANGELOG.md…
A skill your agent uses when shipping a roslynator release, rolling CHANGELOG.md [Unreleased], updating the VS Code extension changelog, creating a GitHub v release, or optionally tagging cli-v.
A skill your agent uses when opening a pull request for the current branch, or when an existing pull request needs a better description - including when the check-description CI check has failed.
Guides changes to the DisCatSharp C# Discord library: tracing a payload field through parsing, serialization and caches, then validating across target frameworks.
Evolve the public surface of Nice3point.Revit.Toolkit without breaking downstream consumers: deprecate a renamed or replaced member with [Obsolete] with a JetBrains [CodeTemplate] auto-conversion…
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.
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.
Regenerates the HAL+JSON .NET release information graph from source data when new releases, CVE data or lifecycle dates change. The graph in `release-notes/` is a set of linked JSON files using HAL `_links` and `_embedded` properties, and it is generated from source data, never edited by hand.json` disclosure records.
When should I use Update .NET Release Graph?
Update .NET Release Graph fits situations like: adding a new .NET patch release to the release graph; adding a new major version with its manifest; refreshing timeline entries after CVE or end-of-life changes.
How do I install Update .NET Release Graph in Claude Code?
Run `npx skills add dotnet/core --skill update-release-graph -a claude-code`. Or copy the skill folder (.github/skills/update-release-graph in dotnet/core) into .claude/skills/update-release-graph in your project. Claude Code loads it when a task matches its description.
How do I install Update .NET Release Graph in Codex?
Run `npx skills add dotnet/core --skill update-release-graph -a codex`. Or copy the skill folder (.github/skills/update-release-graph in dotnet/core) into .agents/skills/update-release-graph in your project. Codex loads it when a task matches its description.
Can I use Update .NET Release Graph 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 dotnet/core --skill update-release-graph -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/update-release-graph, .gemini/skills/update-release-graph, .github/skills/update-release-graph and .opencode/skills/update-release-graph in your project.
What does Update .NET Release Graph need to run?
Going by SKILL.md and its folder, Update .NET Release Graph needs the command-line tools its instructions call (python3, git, dotnet, npm, npx and gh) and credentials named GITHUB_TOKEN. Our summary lists: The `release-notes` graph generator tool.
Does Update .NET Release Graph access the network?
SKILL.md names 6 domains. In commands or code: nuget.pkg.github.com, learn.microsoft.com, dotnet.microsoft.com and raw.githubusercontent.com; the agent is likely to contact these when it follows the instructions. As links in the text: datatracker.ietf.org and github.com. This is read from the text; nothing was executed.
Is Update .NET Release Graph safe to install?
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
What licence does Update .NET Release Graph use?
Update .NET Release Graph 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 Update .NET Release Graph use?
About 4.1k tokens (SKILL.md is roughly 16k 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 Update .NET Release Graph?
Skills that share tags, products or a category with Update .NET Release Graph: Add Analyzer (dotnet/roslynator, 3.5k stars), Release Roslynator (dotnet/roslynator, 3.5k stars), Open Pull Request (Gremlinq/ExRam.Gremlinq, 187 stars) and Prepare Release (Gremlinq/ExRam.Gremlinq, 187 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Update .NET Release Graph?
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.