review-pr

作成者: microsoft

PRを正確性、パターン準拠、テスト、アクセシビリティ、安全性の観点からレビューします。マージ準備完了度の信頼度スコアを生成します。

npx skills add https://github.com/microsoft/fluentui --skill review-pr

Review a Pull Request

Review PR $ARGUMENTS and produce a confidence score for merge readiness.

Phase 1: Gather PR Context

# PR metadata
gh pr view $ARGUMENTS --json title,body,author,labels,files,additions,deletions,baseRefName,headRefName,state,isDraft,number

# Changed files list
gh pr diff $ARGUMENTS --name-only

# Full diff
gh pr diff $ARGUMENTS

# CI status
gh pr checks $ARGUMENTS

Phase 2: Classify PR Type

Determine the PR type from changed files and metadata:

TypeDetectionCheck scope
docs-onlyAll files are *.md, docs/**, **/stories/**, **/.storybook/**Change file only
test-onlyAll files are *.test.*, *.spec.*, **/testing/**Change file + test quality
bug-fixBranch starts with fix/ or title contains "fix"All checks, extra weight on tests
featureBranch starts with feat/ or adds new exportsAll checks, extra weight on API + patterns
refactorNo new exports, restructures existing codeAll checks, extra weight on no behavior change
config/infraChanges to CI, configs, scripts onlyChange file + no regressions

For v8 packages (packages/react/): skip V9 pattern checks — those are maintenance-only with different patterns. For web-components (packages/web-components/): skip React-specific checks.

Phase 3: Run Checks

Run each check category. For each finding, assign a severity:

  • BLOCKER — must fix before merge
  • WARNING — should address
  • INFO — consider

A. Beachball Change File

Required if any published package source code changed (not just tests/stories/docs).

  • Check change/ directory in the diff for new .json files
  • Verify change type: patch for fixes, minor for features, never major without explicit approval
  • Not required for changes that only affect tests, stories, docs, or snapshots

BLOCKER if missing for published source changes.

B. V9 Component Pattern Compliance

Only for files in packages/react-components/react-*/library/src/:

CheckLook forSeverity
No React.FCReact.FC, : FC<, React.FunctionComponent in added linesBLOCKER
No hardcoded stylesHex colors #[0-9a-fA-F]{3,8}, hardcoded px values for spacing/radius/font in .styles.ts filesWARNING
Griffel usageStyle files must use makeStyles from @griffel/react, not inline stylesWARNING
mergeClasses orderUser className must be the LAST argument in mergeClasses()WARNING
Slot systemNew components must use slot.always/slot.optional and assertSlotsWARNING

Reference: docs/architecture/component-patterns.md

C. Dependency Layer Violations

For changes to package.json files or new imports in Tier 3 component packages:

  • BLOCKER if a Tier 3 package (react-button, react-menu, etc.) adds a dependency on another Tier 3 package
  • Allowed Tier 2 deps: react-utilities, react-theme, react-shared-contexts, react-tabster, react-positioning, react-portal
  • Allowed Tier 1 deps: @griffel/react, @fluentui/tokens, @fluentui/react-jsx-runtime

Reference: docs/architecture/layers.md

D. SSR Safety

Grep added lines for unguarded browser API access:

PatternSeverity
window. without canUseDOM or typeof window guard nearbyBLOCKER
document. without guardBLOCKER
navigator. without guardBLOCKER
localStorage / sessionStorage without guardBLOCKER
instanceof HTMLElementWARNING

Check 3 lines above each match for a guard (canUseDOM, typeof window !== 'undefined').

E. Testing

CheckSeverity
Source files changed but no corresponding .test.tsx changesWARNING
New component missing testing/isConformant.tsWARNING
Snapshot files need updating (render/style changes without .snap updates)INFO

F. API Surface

CheckSeverity
Public API changed but etc/*.api.md not updatedWARNING
Existing exports removed (breaking change)BLOCKER
New exports added (flag for human review)INFO

G. Accessibility

CheckSeverity
Existing aria-* attributes removedBLOCKER
onClick without onKeyDown/onKeyUp handlerWARNING
Interactive elements missing role or aria-*WARNING
Images/icons without aria-label or aria-hiddenWARNING

H. Security and Quality

CheckSeverity
eval() or new Function()BLOCKER
dangerouslySetInnerHTMLWARNING
console.log / debugger in production codeWARNING
// @ts-ignore without explanationWARNING
any type in new codeINFO

I. Documentation coverage

A code change frequently lands something that someone downstream needs to learn about. The "someone" splits into two audiences with very different reading habits, so this check actually walks two passes:

  • Pass 1 — user-facing docs. Component consumers (storybook stories, migration guides, docsite, MDX, change-file comments).
  • Pass 2 — harness / agent-facing docs. Future agent sessions reading the skills, AGENTS.md, docs/workflows/*, and docs/architecture/*. When a PR changes a build target, a script, a CI step, a label taxonomy, a project-board field, or an assumption that a skill makes, the skill or harness doc has to be updated in the same PR — otherwise every fresh /triage-issues, /visual-test, /review-pr, etc. invocation pays the discovery cost over again.

Both passes ask the same two questions: should this PR have updated docs, and if so, did it? Bug fixes that restore documented behavior, internal refactors, and test-only PRs default to PASS in both passes — the interesting cases are below.

Pass 1 — user-facing docs

Source changeExpected doc surface
New prop on a public component (added in *.types.ts)A Storybook story or MDX entry under packages/react-components/react-<name>/stories/ that exercises the prop
New public export added to a library/src/index.ts barrelA story or MDX entry covering it (or a justified note in the PR body)
New component package (new directory under packages/react-components/react-*)Stories package, library/docs/Spec.md, and an entry on the docsite (apps/public-docsite-v9)
Behavior change to a public API's defaults (e.g. a new conditional in use*_unstable that changes observable output)Mention in library/docs/MIGRATION.md or a "BREAKING CHANGE / behavior change" section in the PR body
Removal or deprecation of a public exportlibrary/docs/MIGRATION.md entry and/or a @deprecated JSDoc on the symbol
New design token, classname constant, or CSS custom propertyA line in the relevant docs (often the component's stories MDX) explaining how to use/override it

Pass 2 — harness engineering / agent-facing docs

This pass exists because skills are part of the contract, not just convenience. When the skills are stale, the agents are wrong — quietly. Symptoms: a /visual-test invocation that points at a nonexistent project name, a /triage-issues flow that recommends a label the repo no longer has, a /triage-board skill that misses a new view filter the maintainers added.

Walk the diff for any of these and check whether the matching agent-facing doc was updated:

Source changeExpected harness update
New / renamed nx target (project.json, nx.json, generators)Any skill that invokes that target — visual-test, lint-check, package-info, v9-component. The skill literally types the target name; it's not auto-discovered.
New / renamed top-level package.json scriptSame. Plus docs/workflows/contributing.md if it's contributor-facing.
New label, label rename, or label taxonomy change in the repo (gh api repos/.../labels)triage-issues/references/triage-labels.md — the skill uses an allow-list and gh issue edit rejects unknown labels.
New / changed project-board field, view filter, or option IDtriage-board/references/team-mapping.md (option IDs) and the view-filter mirror in triage-board/SKILL.md.
New convention contributors are expected to follow (file layout, naming, "always do X")AGENTS.md / CLAUDE.md (they're symlinked) — the rules section is the agent's first read.
New layered dependency rule, package-tier reshuffle, or CODEOWNERS rewritedocs/architecture/layers.md, docs/team-routing.md, plus triage-board/references/team-mapping.md if a CODEOWNERS handle gained or lost a confident mapping.
New first-time-setup requirement (e.g. a workspace package whose lib-commonjs/ must be pre-built)docs/workflows/contributing.md "First-time setup" section AND the troubleshooting block of any skill that hits the failure mode (visual-test already does this for the unstable-deps case).
New skill, agent hook, or .claude/-level configurationAGENTS.md skills table + the .claude/skills/<name>/SKILL.md bridge file.
Removal or move of a path that any skill greps for or hard-codesThe skill that referenced it. Search the skills (grep -rn "<old-path>" .agents/skills/) before merging.
Authentication / token-scope / permission changes that affect gh callsThe skill's preflight section. Concrete past examples: the EMU vs non-EMU active-account gotcha and the read:project vs project scope distinction now baked into triage-board's preflight.
New external-tool name or behavior change (e.g. assignee identity for an automated agent)The relevant skill. Concrete past example: assigning to Copilot literally fails with "Bot does not have access" — only copilot-swe-agent works. That belongs in any skill that assigns to Copilot.

When docs are NOT expected (default to PASS)

  • Pure bug fix that restores documented behavior
  • Internal refactor with no exported-symbol or behavior change
  • Build / CI changes that have no contributor-facing or skill-facing impact
  • Test-only PRs
  • Style-only PRs (typo, formatting) on internal code

Severity

SituationSeverity
Public export removed or behavior-changed without MIGRATION.md entryBLOCKER
Skill references a renamed or removed path / target / label that this PR changes (skill will literally fail next run)BLOCKER
New public component / new public hook with no story or MDXWARNING
New public prop with no story exercising itWARNING
New design token / className constant with no usage exampleWARNING
Behavior change to public defaults with no PR-body calloutWARNING
New label / project field / nx target / convention without the matching skill or AGENTS.md / docs/workflows/ updateWARNING
New first-time-setup requirement without contributing.md mentionWARNING
PR description explicitly defers docs to a follow-up (link cited)INFO
Docs / harness change exists but feels minimal — could be more thoroughINFO

How to actually run this check

The model should walk the diff, not guess.

  1. Group changed files into surfaces. Code surfaces (library/src/**, index.ts barrels, *.types.ts); user-doc surfaces (stories/**, library/docs/**, apps/public-docsite-v9/**); harness surfaces (.agents/skills/**, .claude/**, AGENTS.md, CLAUDE.md, docs/workflows/**, docs/architecture/**, docs/team-routing.md, project.json, nx.json, root package.json scripts, .github/CODEOWNERS, .github/labeler.yml).
  2. If the PR is purely a doc/harness surface, the check is PASS — it's documentation already.
  3. For each row in the user-facing table that matches a code change in the diff, verify the corresponding doc surface was also touched. If not, raise the matching severity.
  4. For each row in the harness-engineering table that matches, verify the corresponding skill or harness doc was also touched. Be specific: name the skill that needs updating, not just "a skill."
  5. Cross-search: when a PR renames a path, target, or label, run grep -rn "<old-name>" .agents/skills/ docs/ AGENTS.md to find references that will break. Anything that turns up is a BLOCKER unless this PR also updates it.
  6. Read the PR body before reporting. Authors often pre-empt with "docs follow-up tracked in #NNNN" or "harness skills updated in commit X" — those move findings from WARNING to INFO when the deferral is explicit and reasonable.

Phase 4: Calculate Confidence Score

Start at 100

For each BLOCKER:  -25 points
For each WARNING:  -5 points
For each INFO:     -1 point

Bonuses:
  +5 if tests added/updated alongside source changes
  +3 if change file present and well-described
  +2 if PR description is thorough

Floor at 0, cap at 100.

Score interpretation:

  • 90–100: High confidence — safe to merge
  • 70–89: Moderate confidence — minor concerns
  • 50–69: Low confidence — needs attention
  • 0–49: Not safe to merge — blockers present

Phase 5: Produce Output

Use this exact format (also used verbatim as the PR-comment body in Phase 6 — don't duplicate work).

Start directly with the score. Skip a header title, author, type, packages-affected, and CI-status preamble — when this is posted as a PR comment, all of that is already visible in the GitHub UI immediately above the comment, so repeating it just pushes the actually-useful content (score + findings) below the fold. The classification work from Phase 2 still happens; it just isn't echoed back at the reader.

### Confidence Score: <score>/100

<one-sentence summary>

### Findings

#### Blockers (must fix before merge)
- [ ] <finding with file:line reference>

#### Warnings (should address)
- [ ] <finding with file:line reference>

#### Info (consider)
- <finding>

### Category Breakdown

| Category | Status | Notes |
|----------|--------|-------|
| Change file | PASS/FAIL | ... |
| V9 patterns | PASS/WARN | ... |
| Dep layers | PASS/FAIL | ... |
| SSR safety | PASS/WARN | ... |
| Testing | PASS/WARN | ... |
| API surface | PASS/WARN | ... |
| Accessibility | PASS/WARN | ... |
| Security/Quality | PASS/WARN | ... |
| Docs coverage | PASS/WARN/FAIL | ... |

### Recommendation

APPROVE / REQUEST_CHANGES / COMMENT

<brief rationale>

Phase 6: Post the review back to the PR

After presenting the output in the chat, post the same text as a comment on the PR so the review is visible to maintainers and to Copilot (when the PR author is copilot-swe-agent, the comment becomes actionable feedback).

Save the output from Phase 5 to a temp file so the markdown isn't mangled by shell quoting, then:

gh pr comment $ARGUMENTS --repo microsoft/fluentui --body-file /tmp/pr-review-$ARGUMENTS.md

Append a single trailer line to the body so the post is identifiable:

---
*Posted via the `/review-pr` skill.*

The posted comment should be identical to what you rendered in chat — don't paraphrase or summarize. The chat output and the PR comment must match so the user can trust that what they saw is what the maintainers see.

Pre-checks before posting:

  1. Confirm the active gh account has write access to the PR's repo (EMU accounts read fine but silently fail on writes):
    gh api graphql -f query='{ viewer { login } repository(owner:"microsoft", name:"fluentui") { viewerPermission } }'
    
    If viewerPermission is NONE, stop and ask the user to gh auth switch --user <non-emu-account>.
  2. Don't post on PRs from your own branches unless explicitly asked — self-review comments are noise.
  3. If REQUEST_CHANGES is the recommendation, still post the comment but note to the user that only a formal review (gh pr review --request-changes) actually blocks merge; a comment is advisory.

When to skip posting:

  • The user explicitly asks for a review without posting ("review but don't post").
  • The PR has an existing comment from this skill within the last day on the same head SHA — avoid duplicate noise. Look for the *Posted via the \/review-pr` skill.*` trailer.
  • Draft PRs where the user is clearly still iterating (state=OPEN, isDraft=true, recent force-push) — offer to post but don't do it by default.

Notes

  • For large PRs (50+ files), prioritize: published source files > test files > config. Note reduced confidence due to review scope.
  • Draft PRs: still review but note WIP status.
  • Merge conflicts: flag as BLOCKER if detected.
  • The ### Confidence Score: NN/100 line must always appear on its own line for machine parsing.

microsoftのその他のスキル

oss-growth
microsoft
OSS成長ハッカーのペルソナ
agent-framework-azure-ai-py
microsoft
Microsoft Agent Framework Python SDK(agent-framework-azure-ai)を使用してAzure AI Foundryエージェントを構築します。AzureAIAgentsProviderを使用した永続的なエージェントの作成、ホスト型ツール(コードインタープリター、ファイル検索、ウェブ検索)の使用、MCPサーバーの統合、会話スレッドの管理、ストリーミング応答の実装時に使用します。関数ツール、構造化出力、マルチツールエージェントをカバーします。
development
airunway-aks-setup
microsoft
AKS上でAI Runwayをセットアップ — ベアクラスターからモデル実行まで。クラスター検証、コントローラーインストール、GPU評価、プロバイダー設定、初回デプロイをカバー。対象: 「AI Runwayのセットアップ」「AKSクラスターのオンボード」「AI Runwayのインストール」「airunway setup」「AKSへのモデルデプロイ」「AKSでのGPU推論」「AKSでのKAITOセットアップ」「AKSでのLLM実行」「AKSでのvLLM」「AKSでのモデルサービング設定」「AI Runwayコントローラー」。
devops
appinsights-instrumentation
microsoft
Azure Application Insightsを使用したWebアプリのインストルメンテーションに関するガイダンス。テレメトリパターン、SDKセットアップ、構成リファレンスを提供します。対象: アプリのインストルメンテーション方法、App Insights SDK、テレメトリパターン、App Insightsとは何か、Application Insightsガイダンス、インストルメンテーション例、APMベストプラクティス。
devops
applicationinsights-web-ts
microsoft
Application Insights JavaScript SDK(@microsoft/applicationinsights-web)を使用してブラウザ/Webアプリを計測します。Real User Monitoring(RUM)— ページビュー、クリック、AJAX/fetch依存関係、例外、カスタムイベント、およびバックエンドのOpenTelemetryトレースに関連付けられたブラウザ側のGenAIエージェントトレースに使用します。SDKローダースクリプトとnpmセットアップ、フレームワーク拡張機能(React、React Native、Angular)、Click Analytics、テレメトリ初期化子、およびブラウザから生成されるエージェント/ツール/モデルスパンのOTel GenAIセマンティック規約をカバーします。
devops
azure-ai-anomalydetector-java
microsoft
Azure AI Anomaly Detector SDK for Javaを使用して異常検出アプリケーションを構築します。単変量/多変量異常検出、時系列分析、またはAIを活用したモニタリングを実装する際に使用します。
development
azure-ai-language-conversations-py
microsoft
azure-ai-language-conversations Python SDKを使用して会話言語理解(CLU)を実装します。ConversationAnalysisClientを使用して会話の意図とエンティティを分析する場合、NLP機能を構築する場合、またはアプリケーションに言語理解を統合する場合に使用します。
development
azure-ai-ml-py
microsoft
Azure Machine Learning SDK v2 for Python。MLワークスペース、ジョブ、モデル、データセット、コンピュート、パイプラインに使用します。 トリガー: 「azure-ai-ml」、「MLClient」、「ワークスペース」、「モデルレジストリ」、「トレーニングジョブ」、「データセット」。
development