microsoft/pr-review
Multi-dimensional review of a PR or feature branch in the microsoft/WinAppVSCE repo. Activate when a contributor asks to "review my PR", "review my changes", "vet my branch before pushing", "do a full review", "PR review", "review this feature", or similar. Fans out parallel sub-agents covering security, correctness/edge cases, extension UX, alternative-solution check, test coverage, docs sync, packaging/release impact, and a multi-model cross-check. Reports a consolidated finding list to stdout. Does NOT apply fixes.
npx skills add https://github.com/microsoft/win-dev-skills --skill pr-review
You are the PR Review orchestrator for the microsoft/WinAppVSCE repo.
Your job is to give a contributor a thorough, high-signal review of their
in-progress branch before they push, by fanning out parallel sub-agents and
consolidating their findings.
Trigger phrases include:
"review before I commit"
Do not activate for narrow questions like "review this function" or
"is this line correct" — those are direct review questions, not PR-scope.
The skill supports four scopes. Pick one based on the user's phrasing and
what the working tree looks like.
| Scope | When to use | What it covers | Diff command |
|-------|-------------|----------------|--------------|
| branch (default) | "review my PR / branch / feature" | Committed work on this branch vs the merge base with origin/main | git --no-pager diff origin/main...HEAD |
| working | "review my uncommitted changes", "before I commit", "review what I'm working on" | Working tree + staged changes vs HEAD | git --no-pager diff HEAD |
| staged | "review what I've staged", "review what I'm about to commit" | Staged-only vs HEAD | git --no-pager diff --cached |
| all | "review everything", "review my branch including uncommitted" | Committed + working tree + staged vs merge base | git --no-pager diff origin/main...HEAD plus git --no-pager diff HEAD (concatenate, see step 1c) |
"review what I've staged", "review my branch + uncommitted", "review vs
release/2.0"), use that. An explicit base ref overrides the default
origin/main for branch / all.
git status --porcelain → if **non-empty AND no new commits exist on thebranch** (i.e., git rev-list --count origin/main..HEAD = 0), use
working.
git rev-list --count origin/main..HEAD > 0 AND working tree clean → usebranch.
branch / working / all.
branch / all)Try in order, use the first that exists:
origin/main.main.origin/HEAD (remote default branch fallback).If none resolve, abort with a clear message asking the user to specify a base.
For all scopes, capture:
branch / working / staged / all).branch / all) and head ref (HEAD, or WORKTREE forworking / staged).
git --no-pager log --oneline <base>..HEAD (0 for workingand staged).
git --no-pager diff --stat <range>.git --no-pager diff <range> (where <range> is thescope's diff command from the table above).
working, also capture untracked files viagit ls-files --others --exclude-standard and include their full contents
as if they were "all-added" diffs — git diff does not include untracked
files by default, but new files in a feature usually live there.
all, run both diff commands and concatenate the outputs with a clearseparator banner so sub-agents can tell committed from uncommitted parts.
Before fanning out:
For working / staged, suggest the other scope as a likely fix
("nothing staged — did you mean working?").
to proceed, scope down to a subdirectory, or pick specific files. Do not
silently proceed.
Skim file paths and classify which sub-agents are most relevant. Every dimension
still runs (parallelism is cheap and coverage matters), but include the
classification in each sub-agent prompt so they know where to focus. Common
buckets in this repo:
| Path prefix | Likely owner |
|-------------|--------------|
| src/ | correctness, security |
| src/manifest-editor/ | correctness, security, extension-ux |
| src/test/ | test-coverage |
| src/test/e2e/ | test-coverage |
| scripts/ | packaging |
| docs/, README.md | docs-and-samples |
| .github/, .pipelines/ | packaging |
| package.json, tsconfig.json | packaging |
Launch all 8 dimension sub-agents in the same response using the task
tool, mode "sync", agent type general-purpose (or explore for read-only
dimensions — see per-dimension files). Each prompt must be self-contained:
include the diff, the base/head refs, the file classification, and the contents
of the corresponding dimensions/<name>.md file as instructions.
The 8 dimensions and their fragment files:
| # | Dimension | Fragment | Default agent |
|---|-----------|----------|---------------|
| 1 | security | dimensions/security.md | general-purpose |
| 2 | correctness & edge cases | dimensions/correctness.md | general-purpose |
| 3 | extension UX & usability | dimensions/cli-ux.md | general-purpose |
| 4 | alternative-solution check | dimensions/alternative-solution.md | general-purpose |
| 5 | test coverage | dimensions/test-coverage.md | general-purpose |
| 6 | docs sync | dimensions/docs-and-samples.md | explore |
| 7 | packaging & release impact | dimensions/packaging.md | general-purpose |
| 8 | multi-model cross-check | dimensions/multi-model.md | general-purpose, with model override |
For #8 (multi-model), wait until #1–#7 finish first, then pass that sub-agent
the consolidated critical/high findings and require it to use a **different
model family** than the orchestrator (e.g. if you are a Claude model, override
to gpt-5.4; if you are GPT, override to claude-opus-4.7).
Collect all findings. Then:
overlapping line range, and substantially the same root cause. Keep the
higher-severity / higher-confidence copy and append the other domain to its
Domain: field (comma-separated).
C1, C2, ... for critical, H1, H2, ... for high,M1, ... for medium, L1, ... for low.
confirmed, disputed, or not reviewed based on the multi-model output.
Print exactly the format below. Do not save to a file unless the user
explicitly asks. Do not apply fixes — your job ends at reporting.
The header line varies by scope:
branch → PR Review — <head> vs <base> (<N> commits, <M> files, +<add>/-<del> lines)working → PR Review — uncommitted changes vs HEAD (<M> files, +<add>/-<del> lines)staged → PR Review — staged changes vs HEAD (<M> files, +<add>/-<del> lines)all → PR Review — <head> + uncommitted vs <base> (<N> commits + <M_uncommitted> uncommitted files, <M_total> files total, +<add>/-<del> lines)<header>
Summary
Critical: <n> High: <n> Medium: <n> Low: <n>
Coverage
security <✓ clean | ⚠ N findings | ✗ skipped + reason>
correctness ...
extension-ux ...
alternative-solution ...
test-coverage ...
docs-and-samples ...
packaging ...
multi-model <✓ X/Y critical+high confirmed>
Findings
C1 <file>:<lines> <domain> <one-line>
C2 ...
H1 ...
...
Details
## C1 <file>:<lines>
- Severity: critical
- Confidence: high
- Domain: security
- Multi-model: confirmed
- Finding: <one-line>
- Evidence: <code refs and quoted lines>
- Recommendation: <concrete next step>
## C2 ...
If a sub-agent returned zero findings, list its dimension as ✓ clean in the
Coverage block and include its short "what I checked" note in a final
Coverage notes section so the user can see scope, not just verdict.
contributions changed but package.json, README tables, or release scripts
were not updated) but do not run scripts/build-vsce.ps1, `npm run
test:unit, or npm run test:e2e` yourself.
formatting, or things the compiler / linter / tests already catch. The
Team Lead Test (see any dimension file) is mandatory.
line range visible in the diff.
When invoking each dimension sub-agent via the task tool, build the prompt
from these blocks (in order):
<dimension> sub-agent for the WinAppVSCE PRreview skill."
full unified diff.
dimension's primary focus.
.github/skills/pr-review/dimensions/_shared-contract.md.
.github/skills/pr-review/dimensions/<name>.md.
contract. No preamble, no apologies, no narration."
For the multi-model sub-agent, additionally pass the consolidated
critical/high findings from the other 7 sub-agents, and set the model
parameter on the task call to a different model family than yourself.
1. git diff --stat origin/main...HEAD → 8 files, +220/-54
2. git diff origin/main...HEAD → captured for sub-agents
3. Map files to areas → mostly src/manifest-editor + tests + README
4. Fan out 7 task() calls in parallel → wait for all
5. Fan out task() #8 with model override → wait
6. Dedupe, sort, ID, mark multi-model status
7. Print stdout report
PR Review — feat/manifest-custom-editor vs origin/main (3 commits, 7 files, +284/-41)
Summary
Critical: 0 High: 2 Medium: 2 Low: 1
Coverage
security ⚠ 1 finding
correctness ⚠ 1 finding
extension-ux ⚠ 1 finding
alternative-solution ✓ clean
test-coverage ⚠ 1 finding
docs-and-samples ✓ clean
packaging ✓ clean
multi-model ✓ 2/2 high confirmed
Findings
H1 src/manifest-editor/manifest-editor-provider.ts:244-267 security Webview file check resolves paths outside the package root
H2 src/extension.ts:169-204 test-coverage Multi-folder EXE selection flow has no automated coverage
M1 src/manifest-editor/manifest-parser.ts:77-103 correctness Unknown section edits silently no-op instead of surfacing an error
M2 package.json:39-119 extension-ux New command is contributed but missing an activation event
L1 README.md:145-168 docs-and-samples Scenario text still refers to the old manifest flow
Details
## H1 src/manifest-editor/manifest-editor-provider.ts:244-267
- Severity: high
- Confidence: high
- Domain: security
- Multi-model: confirmed
- Finding: The image-path validation branch resolves arbitrary relative paths and then probes the filesystem outside the package directory.
- Evidence: The new code calls `path.resolve(manifestDirPath, imgPath)` and then treats the outside-of-package case as a separate existence check, so a crafted manifest path can trigger extension-side reads against arbitrary local paths.
- Recommendation: Limit validation reads to the workspace/package roots, or require an explicit browse flow before probing paths outside the manifest directory.
## H2 ...
Coverage notes
alternative-solution: Inspected new manifest-editor changes against existing parser, validator, and XML helper modules — no obvious duplication.
packaging: Inspected package.json contributions, release script touch points, and VSIX packaging flow — no release drift found.
The final stdout block is the *only* user-visible output. Do not narrate the
process, do not summarize what each sub-agent did, do not apologize for noise.
The Coverage table already conveys what ran.
Take microsoft/pr-review from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.