Toolkit for generating PowerToys release notes from GitHub milestone PRs or commit ranges...
Generate professional release notes for PowerToys milestones by collecting merged PRs, summarizing each PR with the local CLI agent, grouping by label, and producing user-facing summaries.
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
gh) installed and authenticated — The collection script uses gh pr view and gh api graphql to fetch PR metadata and co-author information. Run gh auth status to verify; if not logged in, run gh auth login first. See Step 1.0.0 for details.az login) with the azure-devops extension; access to the microsoft/Dart ADO project⚠️ Before starting, confirm {{ReleaseVersion}} with the user. If not provided, ASK: "What release version are we generating notes for? (e.g., 0.98)"
| Variable | Description | Example |
|---|---|---|
{{ReleaseVersion}} |
Target release version | 0.98 |
┌────────────────────────────────┐
│ 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) │
└────────────────────────────────┘
| Step | Action | Details |
|---|---|---|
| 1.0 | Verify prerequisites | gh auth status must pass; generate MemberList.md |
| 1.1 | Collect PRs | From previous release tag on stable branch → sorted_prs.csv |
| 1.2 | Assign Milestones | Ensure all PRs have correct milestone |
| 2.1–2.4 | Label PRs | Auto-suggest + human label low-confidence |
| 3.1–3.3 | Reviews & Grouping | Local agent summarizes each PR diff into CopilotSummary → (optional refresh) → group by label |
| 4.1–4.2 | Summaries & Final | Generate grouped summaries, then consolidate |
Do not read all steps at once—only read the step you are executing.
| Script | Purpose |
|---|---|
| dump-prs-since-commit.ps1 | Fetch PRs between commits/tags |
| group-prs-by-label.ps1 | Group PRs into CSVs |
| collect-or-apply-milestones.ps1 | Assign milestones |
| diff_prs.ps1 | Incremental PR diff |
| prepare-release-assets.ps1 | Download installers + symbols from an ADO build, compute SHA256, emit the "Installer Hashes" markdown table for the GitHub release page |
sorted_prs.csv in all outputsProduct-*, Area-*, GitHub*, *Plugin, Issue-*| Issue | Solution |
|---|---|
gh command not found |
Install GitHub CLI and add to PATH |
| No PRs returned | Verify milestone title matches exactly |
Empty CopilotSummary for many PRs |
Run Step 3.1 (local-agent summaries). Do not use mcp_github_request_copilot_review from a CLI/coding agent — the GitHub API rejects bot-initiated review requests, so the column will stay empty. |
| Many unlabeled PRs | Return to labeling step before grouping |
prepare-release-assets.ps1 fails with "Failed to acquire ADO access token" |
Run az login and ensure you have access to the microsoft/Dart ADO project |
