Audit and update os-packages.json/md files that document required Linux packages for each .NET release. Uses the release-notes tool to verify package names against distro archives and regenerate markdown. USE FOR: adding packages for new distro versions, fixing incorrect package names, periodic package audits. DO NOT USE FOR: supported-os.json changes (use update-supported-os skill), editing os-packages.md directly (it is generated from JSON).
Audit and update os-packages.json files in this repository. These files declare which Linux packages are required for each .NET release on each distribution. The corresponding os-packages.md files are generated from JSON — never hand-edit them.
The scope of os-packages.json is broader than supported-os.json. It includes any distro version where the package information is helpful — including pre-release versions of supported distros (e.g. Fedora 44 beta) and permanent unstable channels (Alpine edge, Debian sid).
supported-os.json and needs package entrieslibicu74 → libicu76)The tool must be installed. The public tool is now for browsing release data and CVEs. Packages are published to .
release-notesdotnet-release# GitHub Packages requires authentication — use a GitHub token (PAT or GITHUB_TOKEN)
dotnet tool install -g release-notes \
--add-source https://nuget.pkg.github.com/richlander/index.json
# Verify
release-notes --help
Note: GitHub Packages requires authentication even for public repositories. If you get a 401 error, configure credentials for the source:
dotnet nuget add source https://nuget.pkg.github.com/richlander/index.json \ --name github-richlander \ --username USERNAME \ --password "$GITHUB_TOKEN" \ --store-password-in-clear-textIn GitHub Actions,
GITHUB_TOKENis available automatically. For local use, create a personal access token withread:packagesscope.
The user provides:
Run the verify command for each .NET version to audit:
release-notes verify os-packages <version> release-notes
Examples:
# Check 10.0 against local files
release-notes verify os-packages 10.0 release-notes
# Check against live data on GitHub (no local clone needed)
release-notes verify os-packages 10.0
Interpret the exit code:
The verifier checks whether package names in the JSON actually exist in distro archives. It currently supports Ubuntu (via Launchpad API) and Debian (via packages.debian.org). Other distros are skipped.
The report uses GitHub callout blocks:
| Callout | Meaning | Action |
|---|---|---|
> [!WARNING] | Package name not found in distro archive | Fix the package name or remove the entry |
See references/verify-output-example.md for example output.
If all versions return exit code 0, the package list is current. Stop here.
Review the verify report and decide which issues to act on:
Present findings to the user with recommendations before making changes.
For each confirmed change, edit release-notes/<version>/os-packages.json.
The file has two main sections:
packages — global package definitions (id, name, required-scenarios, references)distributions — per-distro data with install commands and per-release package namesAdd a new distro release (e.g. when a version is added to supported-os.json or a pre-release is available):
Copy the most recent release entry for that distro and update:
name — display name (e.g. "Ubuntu 26.04 LTS (Resolute Raccoon)")release — version string (e.g. "26.04")Pre-release versions of supported distros are welcome (e.g. Fedora 44 before GA). The packages list is informational — it does not imply official support.
Permanent unstable channels — Alpine edge and Debian sid (Unstable) are permanent entries that should always be present. They track the rolling release and should have their package names updated when they change, but should never be removed.
{
"name": "Ubuntu 26.04 LTS (Resolute Raccoon)",
"release": "26.04",
"packages": [
{ "id": "libc", "name": "libc6" },
{ "id": "libgcc", "name": "libgcc-s1" },
{ "id": "ca-certificates", "name": "ca-certificates" },
{ "id": "openssl", "name": "libssl3t64" },
{ "id": "libstdc++", "name": "libstdc++6" },
{ "id": "libicu", "name": "libicu76" },
{ "id": "tzdata", "name": "tzdata" },
{ "id": "krb5", "name": "libgssapi-krb5-2" }
]
}
Fix a package name (e.g. libicu74 → libicu76):
Update the name field in the relevant release entry. Package names often change between major distro versions due to shared library versioning.
Remove a distro release (e.g. when it's removed from supported-os.json):
Delete the release object from the releases array for that distribution.
Key rules:
packages arrayid field in each package entry must match a top-level package definitionname is the actual package name in the distro's archive (e.g. libicu74, not icu)After updating the JSON, regenerate the markdown file:
release-notes generate os-packages <version> release-notes
This overwrites os-packages.md with content derived from the updated JSON.
Important: Do not hand-edit
os-packages.md. It is generated from JSON by the tool. If the markdown output needs to change, update the generator or its Markout template in dotnet-release instead.
Before committing, verify the generated markdown passes linting:
npx markdownlint --config .github/linters/.markdown-lint.yml release-notes/<version>/os-packages.md
CI runs markdownlint via super-linter. If linting fails, fix the generator or Markout library — do not patch the markdown by hand.
Run verify again to confirm issues are resolved:
release-notes verify os-packages <version> release-notes
Expect exit code 0 (or only skipped distros remaining).
Spot-check the generated markdown renders correctly — especially the bash install commands.
Create a branch:
git checkout -b update-os-packages-<date>
Commit all changed files (os-packages.json and os-packages.md for each version):
git add release-notes/*/os-packages.json release-notes/*/os-packages.md
git commit -m "Update OS packages — <summary of changes>"
Push and open a PR:
gh pr create --title "Update OS packages" --body "<description of changes>"
os-packages.json is broader than supported-os.json — it includes pre-release and unstable versionslibicu74 on Ubuntu 24.04 vs libicu76 on Ubuntu 26.04{packageName} placeholder in install commands is replaced with the actual package list at generation timeos-packages.json: 8.0, 9.0, 10.0