Review and merge open bot PRs: dependency updates from dotnet-maestro, codeflow from dotnet/dotnet, and OneLoc localization PRs. Produces a clickable dashboard with CI status, review state, and suspicious file flags. Use when you want to triage all open bot PRs in one pass.
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
This skill triages all open bot PRs in the MSBuild repo, produces a review dashboard, then optionally updates branches and bumps versions for merge readiness.
| Category | Author | Title Pattern | Example |
|---|---|---|---|
| Dependency update | dotnet-maestro[bot] | [<branch>] Update dependencies from dotnet/<repo> | [vs18.3] Update dependencies from dotnet/arcade |
| Codeflow | dotnet-maestro[bot] | [<branch>] Source code updates from dotnet/dotnet | [vs18.3] Source code updates from dotnet/dotnet |
| OneLoc | dotnet-bot | Localized file check-in by OneLocBuild Task: ... | Localized file check-in by OneLocBuild Task: Build definition ID 9434: Build ID ... |
Run two searches in parallel to find all open bot PRs:
Dependency updates + Codeflow:
Search: is:open author:app/dotnet-maestro repo:dotnet/msbuildOneLoc localization:
Search: is:open author:dotnet-bot repo:dotnet/msbuild ("OneLocBuild" OR "Localized file check-in")For each PR, query the following data using gh api graphql. Process PRs in parallel batches for speed.
gh api graphql -f query='
query {
repository(owner: "dotnet", name: "msbuild") {
pullRequest(number: <PR_NUMBER>) {
id
title
baseRefName
headRefName
mergeable
reviewDecision
commits(last: 1) {
nodes {
commit {
statusCheckRollup {
state
}
}
}
}
reviews(last: 10) {
nodes {
state
author { login }
}
}
reviewThreads(first: 20) {
nodes {
isResolved
comments(first: 1) {
nodes { body author { login } }
}
}
}
files(first: 50) {
nodes { path additions deletions }
totalCount
}
}
}
}
'From the response, extract:
statusCheckRollup.state — SUCCESS, FAILURE, PENDING, ERROR, EXPECTED, or null. Map ERROR to failure (❌) and EXPECTED to neutral (⚪) in the dashboard.APPROVED, REVIEW_REQUIRED, CHANGES_REQUESTEDAPPROVED reviewsCHANGES_REQUESTED)totalCount for the file count; use the first 50 file paths from files.nodes for suspicious file detection| PR Category | Expected Files | Flag if... |
|---|---|---|
| Dependency update (arcade) | eng/**, global.json | Any file outside eng/ or global.json |
| Dependency update (roslyn/nuget/runtime) | eng/Version.Details.xml, eng/Version.Details.props | Any file outside eng/ |
| Codeflow (dotnet/dotnet) | eng/Version.Details.xml | Any src/ files modified |
| OneLoc | **/xlf/*.xlf, **/Resources/*.resx | Any non-localization file, or reviewers flagging reverted translations |
For each dependency update PR:
Use the GitHub GraphQL updatePullRequestBranch mutation — the exact equivalent of the "Update branch" button:
gh api graphql -f query='
mutation {
updatePullRequestBranch(input: {pullRequestId: "<NODE_ID>"}) {
pullRequest { number headRefOid }
}
}
'Skip for vs18.10 and newer vs branches* - they don't need to increment the patch version with every dependency update anymore. Only bump for vs* branches that are older than vs18.10.
<VersionPrefix>X.Y.Z</VersionPrefix> from the target branch's eng/Versions.propsX.Y.Z → X.Y.(Z+1)git fetch origin <head-branch>
git checkout <head-branch>
# Edit eng/Versions.props: set <VersionPrefix> to X.Y.(Z+1)
git add eng/Versions.props
git commit -m "Bump VersionPrefix to X.Y.(Z+1)"
git push origin <head-branch>Note: The <VersionPrefix> line may be inline with <DotNetFinalVersionKind> — preserve that formatting.
Output a single dashboard with all PRs grouped by category. This is the most important output — it lets the user click through and approve/reject each PR.
Format:
## 🚦 Dependency Update PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13281 | main ← roslyn | ✅ SUCCESS | ✅ APPROVED (1) | 2 | ✅ Clean | https://github.com/dotnet/msbuild/pull/13281 |
| #13310 | vs17.10 ← arcade | ❌ FAILURE | 🔶 REVIEW_REQUIRED | 14 | ✅ Clean (eng/ only) | https://github.com/dotnet/msbuild/pull/13310 |
## 🔄 Codeflow PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13258 | vs18.3 ← dotnet/dotnet | ✅ SUCCESS | 🔶 REVIEW_REQUIRED | 1 | ✅ Clean | https://github.com/dotnet/msbuild/pull/13258 |
## 🌐 OneLoc PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13290 | main | ⚪ None | ⛔ CHANGES_REQUESTED | 65 | ⚠️ Reverts translations | https://github.com/dotnet/msbuild/pull/13290 |Status icons:
After the tables, add a summary:
N PRs total. M ready to merge, K need reviews, J have CI failures, L blocked.
The version is defined in eng/Versions.props:
<PropertyGroup>
<VersionPrefix>18.3.3</VersionPrefix>
</PropertyGroup>| Branch Pattern | VersionPrefix Format | Bump Needed? | Pre-release Label |
|---|---|---|---|
main | Major.Minor.0 | No | preview |
vs* | Major.Minor.Patch | Yes (+1) | servicing or preview |
| Problem | Solution |
|---|---|
updatePullRequestBranch fails | PR may have conflicts GitHub can't auto-resolve — fall back to local git merge |
| Push rejected after version bump | Branch was updated by maestro; re-fetch and retry |
VersionPrefix has no patch component (e.g. 18.6.0 on main) | This is main — skip the bump |
| OneLoc PR flagged as "reverting translations" | Do NOT merge — wait for updated translations |
dotnet/msbuild
86743d0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.