Labsco
microsoft logo

release-note-generation

βœ“ Officialβ˜… 136,050

by microsoft Β· part of microsoft/powertoys

Toolkit for generating PowerToys release notes from GitHub milestone PRs or commit ranges. Use when asked to create release notes, summarize milestone PRs, generate changelog, prepare release documentation, generate PR review summaries locally for release notes, update README for a new release, manage PR milestones, collect PRs between commits/tags, or prepare release assets (download installers and compute installer hashes).

πŸ”₯πŸ”₯βœ“ VerifiedFreeQuick setup
πŸ”’ Repo-maintenance skill. It exists to help maintain microsoft/powertoys itself β€” it's only useful if you contribute code to that project.

This is the playbook your agent receives when the skill activates β€” you don't need to read it to use the skill, but it's here to audit before installing.

Release Note Generation Skill

Generate professional PowerToys release notes by collecting merged PRs, summarizing each PR with the local CLI agent, grouping by label, and producing user-facing summaries. Stable and preview releases share the same PR metadata, attribution, grouping, and formatting rules.

Output Directory

All generated artifacts are placed under Generated Files/ReleaseNotes/ at the repository root (gitignored).

Generated Files/ReleaseNotes/
β”œβ”€β”€ milestone_prs.json           # Raw PR data from GitHub
β”œβ”€β”€ sorted_prs.csv               # Sorted PR list with Copilot summaries
β”œβ”€β”€ prs_with_milestone.csv       # Milestone assignment tracking
β”œβ”€β”€ grouped_csv/                 # PRs grouped by label (one CSV per label)
β”œβ”€β”€ grouped_md/                  # Generated markdown summaries per label
└── v{VERSION}-release-notes.md  # Final consolidated release notes

Preview-release runs use an isolated subdirectory:

Generated Files/ReleaseNotes/preview-<buildId>/
β”œβ”€β”€ release-context.json
β”œβ”€β”€ delta-commits.json
β”œβ”€β”€ delta-prs.json
β”œβ”€β”€ removed-prs.json
β”œβ”€β”€ unattributed-commits.json
β”œβ”€β”€ MemberList.md
β”œβ”€β”€ milestone_prs.json
β”œβ”€β”€ sorted_prs.csv
β”œβ”€β”€ release-notes.md
β”œβ”€β”€ hashes.md
β”œβ”€β”€ release-manifest.json        # Local audit artifact; never uploaded
β”œβ”€β”€ assets-manifest.json         # Local asset inventory; never uploaded
└── final-review.md

When to Use This Skill

  • Generate release notes for a milestone
  • Summarize PRs merged in a release
  • Generate per-PR review summaries locally for release-notes copy
  • Assign milestones to PRs missing them
  • Collect PRs between two commits/tags
  • Update README.md for a new version
  • Prepare GitHub release assets (download installers/symbols + compute hashes)
  • Prepare a complete draft preview release from an ADO build URL or build ID
  • Compare preview contents across main and stable branch transitions

Required Variables

For a stable release, confirm {{ReleaseVersion}} with the user before starting. For a preview release, do not request a version: derive it from the candidate ADO build.

VariableDescriptionExample
{{ReleaseVersion}}Target release version0.98

Preview mode instead requires one ADO build URL or numeric build ID. It derives the version, source commit, branch, and previous release without asking the user.

Scenario routing

Read the scenario index, then follow only the selected scenario:

Workflow Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1.0 Verify gh auth + MemberList β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1.1 Collect PRs (stable range) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 1.2 Assign Milestones           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 2.1–2.4 Label PRs (auto+human)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3.1 Local-agent PR summaries    β”‚
β”‚ (writes CopilotSummary)         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3.2 (Optional) Refresh PR data  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 3.3 Group by label              β”‚
β”‚ (grouped_csv)                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4.1 Summarize (grouped_md)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ 4.2 Final notes (v{VERSION}.md) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
StepActionDetails
1.0Verify prerequisitesgh auth status must pass; generate MemberList.md
1.1Collect PRsFrom previous release tag on stable branch β†’ sorted_prs.csv
1.2Assign MilestonesEnsure all PRs have correct milestone
2.1–2.4Label PRsAuto-suggest + human label low-confidence
3.1–3.3Reviews & GroupingLocal agent summarizes each PR diff into CopilotSummary β†’ (optional refresh) β†’ group by label
4.1–4.2Summaries & FinalGenerate grouped summaries, then consolidate

Detailed workflow docs

Do not read all steps at onceβ€”only read the step you are executing.

Available Scripts

ScriptPurpose
dump-prs-since-commit.ps1Fetch PRs between commits/tags
group-prs-by-label.ps1Group PRs into CSVs
collect-or-apply-milestones.ps1Assign milestones
diff_prs.ps1Incremental PR diff
prepare-release-assets.ps1Download installers + symbols from an ADO build, compute SHA256, emit the "Installer Hashes" markdown table for the GitHub release page
get-release-build-metadata.ps1Resolve and validate the candidate build identity, version, channel, intent, and source commit
get-previous-published-release.ps1Select the latest published stable or preview release that predates the candidate queue time
get-preview-release-delta.ps1Calculate semantic added/removed PRs between exact release commits
collect-pr-metadata.ps1Normalize GitHub metadata for an explicit set of PR numbers
new-preview-release-manifest.ps1Create the auditable build, baseline, and semantic-delta release manifest
upsert-draft-preview-release.ps1Create or update a draft prerelease without exposing a publish operation
verify-draft-preview-release.ps1Verify draft flags, target commit, managed body, and uploaded assets

References

Conventions

  • Terminal usage: Disabled by default; only run scripts when user explicitly requests
  • Preview automation: An explicit request to prepare a preview release, or invocation by the Prepare Preview Release agent, authorizes the canonical preview scripts
  • Preview manifests: Keep release-manifest.json and assets-manifest.json in the local audit package; do not upload either file as a GitHub release asset
  • Preview note layout: Place the Installer Hashes section immediately after the title and short public introduction, before Highlights and all change sections
  • Batch generation: Generate ALL grouped_md files in one pass, then human reviews
  • PR order: Preserve order from sorted_prs.csv in all outputs
  • Label filtering: Keeps Product-*, Area-*, GitHub*, *Plugin, Issue-*