From dx-core
Generate a categorized report from an existing PR review — groups comments by category (accessibility, bug, functionality, regression, etc.), tracks patch resolution, and posts to ADO Wiki or Confluence. Use when you want to document what was reviewed in a PR.
npx claudepluginhub easingthemes/dx-aem-flow --plugin dx-coreThis skill is limited to using the following tools:
You generate a structured report from an existing PR review. The report groups review comments by category, summarizes patch outcomes, and optionally posts to the ADO wiki.
Loads GitHub PR review comments into AI session for analysis, triage, and fix planning. Default analysis-only; explicit --mode fix for auto-fixes.
Generates PR review reports verifying consistency between PR descriptions, comments, conversation contexts, and code changes. Checks bugs, vulnerabilities, and implementer sanity.
Resolves GitHub PR issues including review comments, CI failures via triage-dispatch workflow with code edits, replies, and verification.
Share bugs, ideas, or general feedback.
You generate a structured report from an existing PR review. The report groups review comments by category, summarizes patch outcomes, and optionally posts to the ADO wiki.
Read shared/ado-config.md and shared/provider-config.md for how to look up project config from .ai/config.yaml.
.ai/config.yaml tracker.provider — ado (default) or jira.ai/config.yaml scm.org — NEVER hardcode.ai/config.yaml scm.project.ai/config.yaml scm.wiki-pr-review-root — parent wiki page for PR review reports.ai/config.yaml confluence.space-key.ai/config.yaml confluence.pr-review-root — parent page title for PR review reportsThe argument is either:
https://{org}.visualstudio.com/{project}/_git/{repo}/pullrequest/{id} or https://dev.azure.com/{org}/{project}/_git/{repo}/pullrequest/{id} — extract project, repo, and pullRequestId. URL-decode the project. The URL-extracted project takes precedence over the config default.git remote get-url origin, read .ai/config.yaml for repo → ADO project mappingLoad MCP tools before any ADO calls:
ToolSearch("+ado repo")
ToolSearch("+ado pull request thread")
ToolSearch("+ado wiki")
ToolSearch("+ado work item")
Resolve the repo ID first:
mcp__ado__repo_get_repo_by_name_or_id
project: "<project from URL if provided, otherwise from config>"
repositoryNameOrId: "<repo name>"
Then fetch the PR:
mcp__ado__repo_get_pull_request_by_id
repositoryId: "<repo ID>"
pullRequestId: <PR ID>
Extract:
resourceRef relations (artifact links with vstfs:///Git/PullRequestId/)Try to find a linked ADO ticket:
Fetch the PR's work item references:
mcp__ado__repo_list_pull_requests_by_commits
Or check the PR description for work item IDs (patterns: #12345, AB#12345, ADO #12345).
If a work item is linked, fetch it:
mcp__ado__wit_get_work_item
project: "<project>"
id: <work item ID>
Extract the ticket number and title for the wiki page name.
If no linked work item is found, use the PR title and ID instead.
mcp__ado__repo_list_pull_request_threads
repositoryId: "<repo ID>"
pullRequestId: <PR ID>
For each thread, fetch the full conversation:
mcp__ado__repo_list_pull_request_thread_comments
repositoryId: "<repo ID>"
pullRequestId: <PR ID>
threadId: <thread ID>
fullResponse: true
Skip system-generated threads (status updates, vote changes, auto-merge notifications). Keep only threads that contain actual review comments — i.e., threads where:
filePath + rightFileStartLine)For each meaningful thread, extract:
<details> block with a diff?Classify each meaningful comment into one of these categories based on its content:
| Category | Indicators |
|---|---|
| Accessibility | ARIA, keyboard, focus, screen reader, alt text, semantic HTML, contrast, WCAG |
| Bug | null pointer, crash, exception, undefined, error handling, edge case, race condition |
| Security | XSS, injection, sanitization, authentication, authorization, CSRF, secrets |
| Regression | "this used to work", "breaks existing", backward compatibility, side effect |
| Functionality | logic error, wrong behavior, missing feature, incorrect output, business rule |
| Performance | memory leak, unnecessary re-render, N+1 query, large payload, caching |
| Code Quality | naming, duplication, dead code, complexity, maintainability, readability |
| Convention | project patterns, style guide, naming conventions, file structure |
Use the comment text and context to classify. If a comment spans multiple categories, pick the primary one. If unsure, default to Code Quality.
Create the report directory:
mkdir -p .ai/pr-reviews/reports
Read the report template from assets/report-template.md (relative to this skill's directory). Use the template structure as the output format — replace {{PLACEHOLDER}} tokens with actual values from the PR data collected in steps 2–4.
Write the result to .ai/pr-reviews/reports/pr-<id>-report.md.
Key formatting rules:
- **<file>:<line>** — <concise summary> *(reviewer: <comment author>)* - Status: Fixed / Declined / Open - Patch: Proposed → Fixed by author / Proposed → Declined / Proposed → Open - Author: "<brief quote>"The <meaningful-title> should be:
Examples:
[2416553] - Enhanced PLP Filter Sticky Behavior[2437173] - Security Banner & Animated Barcode Validation[No Ticket] - Fix Hero Component Null ReferenceIf the user asks to post to wiki, OR if PIPELINE_MODE=true:
Read tracker.provider from .ai/config.yaml (default: ado).
ado → follow Section 6-ADO below.jira → follow Section 6-Confluence below.scm:
wiki-id: "<wiki identifier>"
wiki-project: "<project that owns the wiki>"
wiki-pr-review-root: "<parent page path for PR review reports>"
If scm.wiki-pr-review-root is not configured:
Wiki PR review root not configured — add `scm.wiki-pr-review-root` to .ai/config.yaml.
Report saved locally only: .ai/pr-reviews/reports/pr-<id>-report.md
And STOP wiki posting.
If scm.wiki-id is not configured, same — save locally and stop.
WIKI_ROOT = <scm.wiki-pr-review-root> # e.g., /My-Wiki/PR-Reviews
PAGE_TITLE = "<ticket-number> - <meaningful-title>" # e.g., "2416553 - Enhanced PLP Filter Sticky"
WIKI_PATH = "${WIKI_ROOT}/${PAGE_TITLE}"
If no ticket number: use PR-<id> as prefix (e.g., PR-12345 - Fix Hero Null Reference).
Check if parent page exists:
mcp__ado__wiki_get_page
wikiIdentifier: <scm.wiki-id>
project: <scm.wiki-project>
path: "${WIKI_ROOT}"
If parent page doesn't exist (404), create it:
mcp__ado__wiki_create_or_update_page
wikiIdentifier: <scm.wiki-id>
project: <scm.wiki-project>
path: "${WIKI_ROOT}"
content: "# PR Review Reports\n\nAI-generated reports from pull request code reviews."
Create or update the report page:
mcp__ado__wiki_create_or_update_page
wikiIdentifier: <scm.wiki-id>
project: <scm.wiki-project>
path: "${WIKI_PATH}"
content: <contents of pr-<id>-report.md>
confluence:
space-key: "<space key>"
pr-review-root: "<parent page title for PR review reports>"
If confluence.pr-review-root is not configured:
Confluence PR review root not configured — add `confluence.pr-review-root` to .ai/config.yaml.
Report saved locally only: .ai/pr-reviews/reports/pr-<id>-report.md
And STOP wiki posting.
If confluence.space-key is not configured, same — save locally and stop.
mcp__atlassian__confluence_search
cql: "title = '<confluence.pr-review-root>' AND space = '<confluence.space-key>'"
Extract page_id → PARENT_PAGE_ID. If not found, create it:
mcp__atlassian__confluence_create_page
space_key: "<confluence.space-key>"
title: "<confluence.pr-review-root>"
body: "<h1>PR Review Reports</h1><p>AI-generated reports from pull request code reviews.</p>"
parent_id: <space root page or omit for top-level>
PAGE_TITLE = "<ticket-number> - <meaningful-title>"
mcp__atlassian__confluence_search
cql: "title = '<PAGE_TITLE>' AND ancestor = '<PARENT_PAGE_ID>' AND space = '<confluence.space-key>'"
Skills generate markdown. Before posting to Confluence, test if the MCP server accepts markdown directly by making a test call. If the page renders correctly with raw markdown, use markdown. If it renders as raw text, convert markdown to basic Confluence storage format (XHTML):
# Heading → <h1>Heading</h1>**bold** → <strong>bold</strong>*italic* → <em>italic</em>- item → <ul><li>item</li></ul><ac:structured-macro ac:name="code"><ac:plain-text-body><![CDATA[...]]></ac:plain-text-body></ac:structured-macro><table><tr><th>...</th></tr><tr><td>...</td></tr></table>[text](url) → <a href="url">text</a>If page doesn't exist:
mcp__atlassian__confluence_create_page
space_key: "<confluence.space-key>"
title: "<PAGE_TITLE>"
body: "<converted content>"
parent_id: "<PARENT_PAGE_ID>"
If page exists:
mcp__atlassian__confluence_update_page
page_id: "<existing page ID>"
title: "<PAGE_TITLE>"
body: "<converted content>"
version_number: <current version + 1>
Print: Report posted to Confluence: <space-key> > <pr-review-root> > <PAGE_TITLE>
## dx-pr-review-report complete
**<meaningful-title>** (PR #<id>)
- Ticket: <ticket number or "none">
- Total comments: <N> | Meaningful: <M>
- Categories: <list with counts>
- Patches: <P proposed, F fixed, D declined>
- Output: `.ai/pr-reviews/reports/pr-<id>-report.md`
- Wiki: <posted to path> / <local only>
/dx-pr-review-report https://dev.azure.com/myorg/MyProject/_git/MyRepo/pullrequest/12345 — Fetches PR #12345, finds 8 review threads (5 meaningful), categorizes as: 2 Bug, 2 Functionality, 1 Accessibility. 3 had patches proposed — 2 fixed, 1 declined. Generates report and offers to post to wiki.
/dx-pr-review-report 12345 — Uses current repo. Finds linked ticket #2416553. Generates report titled "2416553 - Enhanced PLP Filter Sticky Behavior". Posts to wiki at configured wiki-pr-review-root.
/dx-pr-review-report 12345 (no previous review) — PR has no review comments from anyone. Reports: "No review comments found on PR #12345 — nothing to report." and stops.
"No review comments found on PR #"
Cause: The PR has no review threads, only system-generated threads.
Fix: Run /dx-pr-review <PR URL> first to review the PR, then generate the report.
"Wiki PR review root not configured"
Cause: .ai/config.yaml is missing scm.wiki-pr-review-root.
Fix: Add the config field with the wiki parent page path.
Thread details incomplete Cause: Some threads may have been deleted or the user lacks permissions. Fix: The skill continues with available data. Missing threads are noted in the summary.
scm.wiki-pr-review-root, never hardcode.ai/config.yaml