Skip to main content

dyad:swarm-pr-review

Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, discuss findings with each other, and reach consensus on real issues. Posts a summary with merge verdict and inline comments for HIGH/MEDIUM issues.

Stars
20,485
Source
dyad-sh/dyad
Updated
2026-05-30
Slug
dyad-sh--dyad--swarm-pr-review
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/dyad-sh/dyad/HEAD/.claude/skills/swarm-pr-review/SKILL.md -o .claude/skills/swarm-pr-review.md

Drops the SKILL.md into .claude/skills/swarm-pr-review.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

Swarm PR Review

This skill uses Claude Code's agent team (swarm) functionality to perform a collaborative PR review with three specialized reviewers who discuss and reach consensus.

Overview

  1. Fetch PR diff and existing comments
  2. Create a review team with 3 specialized teammates
  3. Each teammate reviews the diff from their expert perspective
  4. Teammates discuss findings to reach consensus on real issues
  5. Team lead compiles final review with merge verdict
  6. Post summary comment + inline comments to GitHub

Team Members

Name Role Focus
correctness-reviewer Correctness & Debugging Expert Bugs, edge cases, control flow, security, error handling
code-health-reviewer Code Health Expert Dead code, duplication, complexity, meaningful comments, abstractions
ux-reviewer UX Wizard User experience, consistency, accessibility, error states, delight

Workflow

Step 1: Determine PR Number and Repo

Parse the PR number and repo from the user's input. If not provided, try to infer from the current git context:

# Get current repo
gh repo view --json nameWithOwner -q '.nameWithOwner'

# If user provides a PR URL, extract the number
# If user just says "review this PR", check for current branch PR
gh pr view --json number -q '.number'

Step 2: Fetch PR Diff and Context

IMPORTANT: Always save files to the current working directory (e.g. ./pr_diff.patch), never to /tmp/ or other directories outside the repo. In CI, only the repo working directory is accessible.

# Save the diff to current working directory (NOT /tmp/ or $SCRATCHPAD)
gh pr diff <PR_NUMBER> --repo <OWNER/REPO> > ./pr_diff.patch

# Get PR metadata
gh pr view <PR_NUMBER> --repo <OWNER/REPO> --json title,body,files,headRefOid

# Fetch existing comments to avoid duplicates
gh api repos/<OWNER/REPO>/pulls/<PR_NUMBER>/comments --paginate
gh api repos/<OWNER/REPO>/issues/<PR_NUMBER>/comments --paginate

Save the diff content and existing comments for use in the review.

Step 3: Create the Review Team

Use TeamCreate to create the team:

TeamCreate:
  team_name: "pr-review-<PR_NUMBER>"
  description: "Code review for PR #<PR_NUMBER>"

Step 4: Create Review Tasks

Create 4 tasks:

  1. "Review PR for correctness issues" - Assigned to correctness-reviewer
  2. "Review PR for code health issues" - Assigned to code-health-reviewer
  3. "Review PR for UX issues" - Assigned to ux-reviewer
  4. "Discuss and reach consensus on findings" - Blocked by tasks 1-3, no owner (team-wide)

Step 5: Spawn Teammates

Spawn all 3 teammates in parallel using the Task tool with team_name set to the team name. Each teammate should be a general-purpose subagent.

IMPORTANT: Each teammate's prompt must include:

  1. Their role description (from the corresponding file in references/)
  2. The full PR diff content (inline, NOT a file path - teammates cannot read files from the team lead's scratchpad)
  3. The list of existing PR comments (so they can avoid duplicates)
  4. Instructions to send their findings back as a structured message

Teammate Prompt Template

For each teammate, the prompt should follow this structure:

You are the [ROLE NAME] on a PR review team. Read your role description carefully:

<role>
[Contents of references/<role>.md]
</role>

You are reviewing PR #<NUMBER> in <REPO>: "<PR TITLE>"

<pr_description>
[PR body/description]
</pr_description>

Here is the diff to review:

<diff>
[Full diff content]
</diff>

Here are existing PR comments (do NOT flag issues already commented on):

<existing_comments>
[Existing comment data]
</existing_comments>

## Instructions

1. Read your role description carefully and review the diff from your expert perspective.
2. For each issue you find, classify it as HIGH, MEDIUM, or LOW severity using the guidelines in your role description.
3. Send your findings to the team lead using SendMessage with this format:

FINDINGS:
```json
[
  {
    "file": "path/to/file.ts",
    "line_start": 42,
    "line_end": 45,
    "severity": "MEDIUM",
    "category": "category-name",
    "title": "Brief title",
    "description": "Clear description of the issue and its impact",
    "suggestion": "How to fix (optional)"
  }
]
  1. After sending your initial findings, wait for the team lead to share other reviewers' findings.
  2. When you receive other reviewers' findings, discuss them:
    • ENDORSE issues you agree with (even if you missed them)
    • CHALLENGE issues you think are false positives or wrong severity
    • ADD context from your expertise that strengthens or weakens an issue
  3. Send your discussion responses to the team lead.

Be thorough but focused. Only flag real issues, not nitpicks disguised as issues.

IMPORTANT: Cross-reference infrastructure changes (DB migrations, new tables/columns, API endpoints, config entries) against actual usage in the diff. If a migration creates a table but no code in the PR reads from or writes to it, that's dead infrastructure and should be flagged.


### Step 6: Collect Initial Reviews

Wait for all 3 teammates to send their initial findings. Parse the JSON from each teammate's message.

### Step 7: Facilitate Discussion

Once all initial reviews are in:

1. Send each teammate a message with ALL findings from all reviewers (labeled by who found them)
2. Ask them to discuss: endorse, challenge, or add context
3. Wait for discussion responses

The message to each teammate should look like:

All initial reviews are in. Here are the findings from all three reviewers:

Correctness Reviewer Findings:

[list of issues]

Code Health Reviewer Findings:

[list of issues]

UX Reviewer Findings:

[list of issues]

Please review the other reviewers' findings from YOUR expert perspective:

  • ENDORSE issues you agree are real problems (say "ENDORSE: - <reason>")</li> <li>CHALLENGE issues you think are false positives or mis-classified (say "CHALLENGE: <title> - <reason>")</li> <li>If you have additional context that changes the severity, explain why</li> </ul> <p>Focus on issues where your expertise adds value. You don't need to comment on every issue.</p> <pre><code> ### Step 8: Compile Consensus After discussion, compile the final issue list: **Issue Classification Rules:** - An issue is **confirmed** if the original reporter + at least 1 other reviewer endorses it (or nobody challenges it) - An issue is **dropped** if challenged by 2 reviewers with valid reasoning - An issue is **downgraded** if challenged on severity with good reasoning - HIGH/MEDIUM issues get individual inline comments - LOW issues go in a collapsible details section in the summary ### Step 9: Determine Merge Verdict Based on the confirmed issues: - **:white_check_mark: YES - Ready to merge**: No HIGH issues, at most minor MEDIUM issues that are judgment calls - **:thinking: NOT SURE - Potential issues**: Has MEDIUM issues that should probably be addressed, but none are clear blockers - **:no_entry: NO - Do NOT merge**: Has HIGH severity issues or multiple serious MEDIUM issues that NEED to be fixed ### Step 10: Post GitHub Comments #### Summary Comment Post a summary comment on the PR using `gh pr comment`: ```markdown ## :mag: Dyadbot Code Review Summary **Verdict: [VERDICT EMOJI + TEXT]** Reviewed by 3 specialized agents: Correctness Expert, Code Health Expert, UX Wizard. ### Issues Summary | # | Severity | File | Issue | Found By | Endorsed By | |---|----------|------|-------|----------|-------------| | 1 | :red_circle: HIGH | `src/auth.ts:45` | SQL injection in login | Correctness | Code Health | | 2 | :yellow_circle: MEDIUM | `src/ui/modal.tsx:12` | Missing loading state | UX | Correctness | | 3 | :yellow_circle: MEDIUM | `src/utils.ts:89` | Duplicated validation logic | Code Health | - | <details> <summary>:green_circle: Low Priority Notes (X items)</summary> - **Minor naming inconsistency** - `src/helpers.ts:23` (Code Health) - **Could add hover state** - `src/button.tsx:15` (UX) </details> <details> <summary>:no_entry_sign: Dropped Issues (X items)</summary> - **~~Potential race condition~~** - Challenged by Code Health: "State is only accessed synchronously in this context" </details> --- *Generated by Dyadbot code review* </code></pre> <h4>Inline Comments</h4> <p>For each HIGH and MEDIUM issue, post an inline review comment at the relevant line using <code>gh api</code>:</p> <pre><code class="language-bash"># Post a review with inline comments gh api repos/<OWNER/REPO>/pulls/<PR_NUMBER>/reviews \ -X POST \ --input payload.json </code></pre> <p>Where payload.json contains:</p> <pre><code class="language-json">{ "commit_id": "<HEAD_SHA>", "body": "Swarm review: X issue(s) found", "event": "COMMENT", "comments": [ { "path": "src/auth.ts", "line": 45, "body": "**:red_circle: HIGH** | security | Found by: Correctness, Endorsed by: Code Health\n\n**SQL injection in login**\n\nDescription of the issue...\n\n:bulb: **Suggestion:** Use parameterized queries" } ] } </code></pre> <h3>Step 11: Shutdown Team</h3> <p>After posting comments:</p> <ol> <li>Send shutdown requests to all teammates</li> <li>Wait for shutdown confirmations</li> <li>Delete the team with TeamDelete</li> </ol> <h2>Deduplication</h2> <p>Before posting, filter out issues that match existing PR comments:</p> <ul> <li>Same file path</li> <li>Same or nearby line number (within 3 lines)</li> <li>Similar keywords in the issue title appear in the existing comment body</li> </ul> <h2>Error Handling</h2> <ul> <li>If a teammate fails to respond, proceed with the other reviewers' findings</li> <li>If no issues are found by anyone, post a clean summary: ":white_check_mark: No issues found"</li> <li>If discussion reveals all issues are false positives, still post the summary noting the review was clean</li> <li>Always post a summary comment, even if there are no issues</li> <li>Always shut down the team when done, even if there were errors</li> </ul> <h2>File Structure</h2> <pre><code>references/ correctness-reviewer.md - Role description for the correctness expert code-health-reviewer.md - Role description for the code health expert ux-reviewer.md - Role description for the UX wizard </code></pre> </div></article></div><!--$--><!--/$--></main><footer class="mt-24 border-t border-[color:var(--color-line)] bg-[color:var(--color-bg-1)]" role="contentinfo"><div class="mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-10"><div class="grid grid-cols-1 gap-10 sm:grid-cols-2 lg:grid-cols-4"><div class="space-y-3"><a class="inline-flex items-center rounded-sm leading-none transition-opacity hover:opacity-85" href="/"><span class="inline-flex items-center gap-2 leading-none text-[color:var(--color-ink-0)] sm:gap-2.5" aria-label="Mesrai Marketplace"><svg viewBox="0 0 280 65" role="img" aria-label="Mesrai" class="h-[24px] w-auto shrink-0 select-none sm:h-[26px]"><circle cx="32" cy="32" r="25" fill="currentColor"></circle><g transform="translate(32 32)"><path style="fill:var(--color-bg-0)" d="M -12 -10 C -12 -10, -8 -6, -8 0 C -8 6, -12 10, -12 10 C -12 10, -4 6, 0 0 C 4 6, 12 10, 12 10 C 12 10, 8 6, 8 0 C 8 -6, 12 -10, 12 -10 C 12 -10, 4 -6, 0 0 C -4 -6, -12 -10, -12 -10 Z"></path></g><text x="68" y="44" fill="currentColor" style="font-family:-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;font-size:36px;font-weight:700;letter-spacing:0.5px">Mesrai</text></svg><span aria-hidden="true" class="hidden h-3 w-px shrink-0 bg-[color:var(--color-line-2)] sm:inline-block"></span><span class="hidden font-mono text-[10.5px] uppercase tracking-[0.18em] text-[color:var(--color-ink-3)] sm:inline-block">Marketplace</span></span></a><p class="max-w-[28ch] text-[13px] leading-[1.6] text-[color:var(--color-ink-2)]">Production-grade code review rules, curated and installable in one click.</p></div><div><h3 class="mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]">Marketplace</h3><ul class="space-y-2"><li><a class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]" href="/library">Browse rules</a></li><li><a class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]" href="/skills">Agent skills</a></li><li><a class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]" href="/become-author">Become an author</a></li></ul></div><div><h3 class="mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]">Mesrai</h3><ul class="space-y-2"><li><a href="https://app.mesrai.com" target="_blank" rel="noopener noreferrer" class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]">Open app</a></li><li><a href="https://docs.mesrai.com" target="_blank" rel="noopener noreferrer" class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]">Documentation</a></li><li><a href="https://mesrai.com/pricing" target="_blank" rel="noopener noreferrer" class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]">Pricing</a></li></ul></div><div><h3 class="mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]">Community</h3><ul class="space-y-2"><li><a href="https://github.com/mesraiofficial" target="_blank" rel="noopener noreferrer" class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]">GitHub</a></li><li><a href="mailto:contact@mesrai.com" class="text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]">Contact</a></li></ul></div></div><div class="mt-10 flex flex-col items-start gap-2 border-t border-[color:var(--color-line)] pt-6 text-[12px] text-[color:var(--color-ink-3)] sm:flex-row sm:items-center sm:justify-between"><p>© <!-- -->2026<!-- --> Mesrai Technologies. All rights reserved.</p><p class="font-mono text-[11px] tracking-wider uppercase">Built with care · India + worldwide</p></div></div></footer></div><script src="/_next/static/chunks/02ty9.5yo_fen.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[83661,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"ThemeProvider\"]\n3:I[45872,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"Header\"]\n4:I[39756,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"default\"]\n5:I[37457,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"default\"]\n6:I[22016,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\",\"/_next/static/chunks/0pg86~w1~d355.js\"],\"\"]\ne:I[68027,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"default\",1]\n:HL[\"/_next/static/chunks/0fwxch7cdz3kv.css\",\"style\"]\n:HL[\"/_next/static/media/5f402bd2d8eef81a-s.p.16whm0euli40m.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.09zddjkbdep5a.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/9433d1a810498265-s.p.0h26ys03~gfbk.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skills\",\"s\",\"dyad-sh--dyad--swarm-pr-review\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skills\",{\"children\":[\"s\",{\"children\":[[\"slug\",\"dyad-sh--dyad--swarm-pr-review\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0fwxch7cdz3kv.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/17wr4kjvetgpg.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/01d9z6trbvl9l.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/0_3fj3rn8zo2r.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"className\":\"geist_deef94d5-module__Sms4YG__variable geist_mono_1bf8cbf6-module__FlyLvG__variable newsreader_6473ecd3-module__Kact_q__variable\",\"children\":[\"$\",\"body\",null,{\"className\":\"bg-grid-subtle min-h-svh font-sans antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"flex min-h-svh flex-col\",\"children\":[[\"$\",\"a\",null,{\"href\":\"#main\",\"className\":\"sr-only focus:not-sr-only focus:fixed focus:left-3 focus:top-3 focus:z-50 focus:rounded-md focus:bg-[color:var(--color-bg-2)] focus:px-3 focus:py-2 focus:text-[12px] focus:text-[color:var(--color-ink-0)]\",\"children\":\"Skip to main content\"}],[\"$\",\"$L3\",null,{}],[\"$\",\"main\",null,{\"id\":\"main\",\"className\":\"flex-1\",\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-3xl px-4 py-24 sm:px-6 lg:px-10\",\"children\":[\"$\",\"div\",null,{\"role\":\"status\",\"className\":\"flex flex-col items-center justify-center gap-3 rounded-[12px] border border-dashed border-[color:var(--color-line)] bg-[color:var(--color-bg-1)] px-6 py-16 text-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex size-12 items-center justify-center rounded-full border border-[color:var(--color-line)] bg-[color:var(--color-bg-2)]\",\"children\":[\"$\",\"svg\",null,{\"ref\":\"$undefined\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":24,\"height\":24,\"viewBox\":\"0 0 24 24\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":2,\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"className\":\"lucide lucide-inbox size-6 text-[color:var(--color-ink-3)]\",\"aria-hidden\":true,\"children\":[[\"$\",\"polyline\",\"o97t9d\",{\"points\":\"22 12 16 12 14 15 10 15 8 12 2 12\"}],[\"$\",\"path\",\"oot6mr\",{\"d\":\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\"}],\"$undefined\"]}]}],[\"$\",\"h3\",null,{\"className\":\"font-serif text-[18px] text-[color:var(--color-ink-0)]\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"max-w-[44ch] text-[13px] leading-[1.55] text-[color:var(--color-ink-2)]\",\"children\":\"The page you were looking for doesn't exist or was moved. Try the homepage or browse the library.\"}],[\"$\",\"div\",null,{\"className\":\"mt-2\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-wrap items-center gap-2\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/\",\"children\":\"Home\",\"ref\":null,\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-[13.5px] font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:size-4 [\u0026_svg]:shrink-0 bg-[color:var(--color-primary-light)] text-[color:var(--color-primary-dark)] hover:bg-[color:var(--color-o-600)] active:bg-[color:var(--color-o-700)] shadow-[0_1px_0_0_color-mix(in_oklab,var(--color-o-700)_50%,transparent)_inset,0_1px_2px_rgba(0,0,0,0.4)] h-9 px-4\"}],[\"$\",\"$L6\",null,{\"href\":\"/library\",\"children\":\"Browse rules\",\"ref\":null,\"className\":\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-[13.5px] font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [\u0026_svg]:size-4 [\u0026_svg]:shrink-0 border border-[color:var(--color-line)] bg-transparent text-[color:var(--color-ink-0)] hover:bg-[color:var(--color-bg-2)] hover:border-[color:var(--color-line-2)] h-9 px-4\"}]]}]}]]}]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],\"$L7\"]}]}]}]}]]}],{\"children\":[\"$L8\",{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"Ns5mKA7XDYfug19WaJf-f\"}\n"])</script><script>self.__next_f.push([1,"13:I[97367,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"OutletBoundary\"]\n14:\"$Sreact.suspense\"\n17:I[97367,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"ViewportBoundary\"]\n19:I[97367,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"footer\",null,{\"className\":\"mt-24 border-t border-[color:var(--color-line)] bg-[color:var(--color-bg-1)]\",\"role\":\"contentinfo\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 gap-10 sm:grid-cols-2 lg:grid-cols-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"space-y-3\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/\",\"className\":\"inline-flex items-center rounded-sm leading-none transition-opacity hover:opacity-85\",\"children\":[\"$\",\"span\",null,{\"className\":\"inline-flex items-center gap-2 leading-none text-[color:var(--color-ink-0)] sm:gap-2.5\",\"aria-label\":\"Mesrai Marketplace\",\"children\":[[\"$\",\"svg\",null,{\"viewBox\":\"0 0 280 65\",\"role\":\"img\",\"aria-label\":\"Mesrai\",\"className\":\"h-[24px] w-auto shrink-0 select-none sm:h-[26px]\",\"children\":[[\"$\",\"circle\",null,{\"cx\":\"32\",\"cy\":\"32\",\"r\":\"25\",\"fill\":\"currentColor\"}],[\"$\",\"g\",null,{\"transform\":\"translate(32 32)\",\"children\":[\"$\",\"path\",null,{\"style\":{\"fill\":\"var(--color-bg-0)\"},\"d\":\"M -12 -10 C -12 -10, -8 -6, -8 0 C -8 6, -12 10, -12 10 C -12 10, -4 6, 0 0 C 4 6, 12 10, 12 10 C 12 10, 8 6, 8 0 C 8 -6, 12 -10, 12 -10 C 12 -10, 4 -6, 0 0 C -4 -6, -12 -10, -12 -10 Z\"}]}],[\"$\",\"text\",null,{\"x\":\"68\",\"y\":\"44\",\"fill\":\"currentColor\",\"style\":{\"fontFamily\":\"-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif\",\"fontSize\":\"36px\",\"fontWeight\":700,\"letterSpacing\":\"0.5px\"},\"children\":\"Mesrai\"}]]}],[\"$\",\"span\",null,{\"aria-hidden\":true,\"className\":\"hidden h-3 w-px shrink-0 bg-[color:var(--color-line-2)] sm:inline-block\"}],[\"$\",\"span\",null,{\"className\":\"hidden font-mono text-[10.5px] uppercase tracking-[0.18em] text-[color:var(--color-ink-3)] sm:inline-block\",\"children\":\"Marketplace\"}]]}]}],[\"$\",\"p\",null,{\"className\":\"max-w-[28ch] text-[13px] leading-[1.6] text-[color:var(--color-ink-2)]\",\"children\":\"Production-grade code review rules, curated and installable in one click.\"}]]}],[[\"$\",\"div\",\"Marketplace\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Marketplace\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2\",\"children\":[[\"$\",\"li\",\"Browse rules\",{\"children\":[\"$\",\"$L6\",null,{\"href\":\"/library\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Browse rules\"}]}],[\"$\",\"li\",\"Agent skills\",{\"children\":[\"$\",\"$L6\",null,{\"href\":\"/skills\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Agent skills\"}]}],[\"$\",\"li\",\"Become an author\",{\"children\":[\"$\",\"$L6\",null,{\"href\":\"/become-author\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Become an author\"}]}]]}]]}],[\"$\",\"div\",\"Mesrai\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Mesrai\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2\",\"children\":[[\"$\",\"li\",\"Open app\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://app.mesrai.com\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Open app\"}]}],[\"$\",\"li\",\"Documentation\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://docs.mesrai.com\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Documentation\"}]}],[\"$\",\"li\",\"Pricing\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://mesrai.com/pricing\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Pricing\"}]}]]}]]}],[\"$\",\"div\",\"Community\",{\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-3 text-[10.5px] font-medium uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Community\"}],\"$L10\"]}]]]}],\"$L11\"]}]}]\n"])</script><script>self.__next_f.push([1,"8:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L12\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0pg86~w1~d355.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@15\"}]}]]}]\n16:[]\nc:\"$W16\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L17\",null,{\"children\":\"$L18\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L19\",null,{\"children\":[\"$\",\"$14\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1a\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/0fwxch7cdz3kv.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"10:[\"$\",\"ul\",null,{\"className\":\"space-y-2\",\"children\":[[\"$\",\"li\",\"GitHub\",{\"children\":[\"$\",\"a\",null,{\"href\":\"https://github.com/mesraiofficial\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"GitHub\"}]}],[\"$\",\"li\",\"Contact\",{\"children\":[\"$\",\"a\",null,{\"href\":\"mailto:contact@mesrai.com\",\"className\":\"text-[13.5px] text-[color:var(--color-ink-1)] transition-colors hover:text-[color:var(--color-primary-light)]\",\"children\":\"Contact\"}]}]]}]\n11:[\"$\",\"div\",null,{\"className\":\"mt-10 flex flex-col items-start gap-2 border-t border-[color:var(--color-line)] pt-6 text-[12px] text-[color:var(--color-ink-3)] sm:flex-row sm:items-center sm:justify-between\",\"children\":[[\"$\",\"p\",null,{\"children\":[\"© \",2026,\" Mesrai Technologies. All rights reserved.\"]}],[\"$\",\"p\",null,{\"className\":\"font-mono text-[11px] tracking-wider uppercase\",\"children\":\"Built with care · India + worldwide\"}]]}]\n"])</script><script>self.__next_f.push([1,"18:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0a0a0b\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"meta\",\"3\",{\"name\":\"theme-color\",\"content\":\"#fbfaf7\",\"media\":\"(prefers-color-scheme: light)\"}]]\n"])</script><script>self.__next_f.push([1,"1b:I[27201,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\"],\"IconMark\"]\n15:null\n"])</script><script>self.__next_f.push([1,"1a:[[\"$\",\"title\",\"0\",{\"children\":\"dyad:swarm-pr-review · Frontend Development · Mesrai Skills\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, dis\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"3\",{\"name\":\"keywords\",\"content\":\"code review,ai code review,pull request review,static analysis rules,Mesrai,engineering standards\"}],[\"$\",\"link\",\"4\",{\"rel\":\"canonical\",\"href\":\"https://www.marketplace.mesrai.com/skills/s/dyad-sh--dyad--swarm-pr-review\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:title\",\"content\":\"dyad:swarm-pr-review · Frontend Development · Mesrai Skills\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:description\",\"content\":\"Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, dis\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:url\",\"content\":\"https://www.marketplace.mesrai.com/skills/s/dyad-sh--dyad--swarm-pr-review\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:site_name\",\"content\":\"Mesrai Marketplace\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://www.marketplace.mesrai.com/api/og/default\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:alt\",\"content\":\"dyad:swarm-pr-review · Frontend Development · Mesrai Skills\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:site\",\"content\":\"@mesrai\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:title\",\"content\":\"dyad:swarm-pr-review · Frontend Development · Mesrai Skills\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:description\",\"content\":\"Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, dis\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:image\",\"content\":\"https://www.marketplace.mesrai.com/api/og/default\"}],[\"$\",\"link\",\"19\",{\"rel\":\"shortcut icon\",\"href\":\"/favicon.ico\"}],[\"$\",\"link\",\"20\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0hemvqz2teeos.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"23\",{\"rel\":\"icon\",\"href\":\"/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"24\",{\"rel\":\"icon\",\"href\":\"/favicon-96x96.png\",\"sizes\":\"96x96\",\"type\":\"image/png\"}],[\"$\",\"link\",\"25\",{\"rel\":\"apple-touch-icon\",\"href\":\"/favicon-96x96.png\"}],[\"$\",\"$L1b\",\"26\",{}]]\n"])</script><script>self.__next_f.push([1,"12:[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-4xl px-4 pb-24 pt-10 sm:px-6 sm:pt-14 lg:px-10\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareSourceCode\\\",\\\"name\\\":\\\"dyad:swarm-pr-review\\\",\\\"description\\\":\\\"Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, discuss findings with each other, and reach consensus on real issues. Posts a summary with merge verdict and inline comments for HIGH/MEDIUM issues.\\\",\\\"codeRepository\\\":\\\"https://github.com/dyad-sh/dyad/tree/main/.claude/skills/swarm-pr-review\\\",\\\"programmingLanguage\\\":\\\"Markdown\\\",\\\"author\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"dyad-sh\\\"},\\\"dateModified\\\":\\\"2026-05-30T18:57:39Z\\\",\\\"keywords\\\":\\\"Frontend Development, agent skill, claude code\\\",\\\"url\\\":\\\"https://www.marketplace.mesrai.com/skills/s/dyad-sh--dyad--swarm-pr-review\\\",\\\"inLanguage\\\":\\\"en\\\"}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"Skills\\\",\\\"item\\\":\\\"https://www.marketplace.mesrai.com/skills\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":2,\\\"name\\\":\\\"Frontend Development\\\",\\\"item\\\":\\\"https://www.marketplace.mesrai.com/skills/c/frontend-development\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":3,\\\"name\\\":\\\"dyad:swarm-pr-review\\\",\\\"item\\\":\\\"https://www.marketplace.mesrai.com/skills/s/dyad-sh--dyad--swarm-pr-review\\\"}]}\"}}],[\"$\",\"nav\",null,{\"aria-label\":\"Breadcrumb\",\"className\":\"mb-6 flex items-center gap-2 font-mono text-[11px] tracking-wider text-[color:var(--color-ink-3)]\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/skills\",\"className\":\"uppercase hover:text-[color:var(--color-primary-light)]\",\"children\":\"Skills\"}],[\"$\",\"span\",null,{\"aria-hidden\":true,\"children\":\"›\"}],[\"$\",\"$L6\",null,{\"href\":\"/skills/c/frontend-development\",\"className\":\"uppercase hover:text-[color:var(--color-primary-light)]\",\"children\":\"Frontend Development\"}],[\"$\",\"span\",null,{\"aria-hidden\":true,\"children\":\"›\"}],[\"$\",\"span\",null,{\"className\":\"truncate uppercase text-[color:var(--color-ink-1)]\",\"children\":\"dyad:swarm-pr-review\"}]]}],[\"$\",\"header\",null,{\"className\":\"border-b border-[color:var(--color-line)] pb-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-3 flex flex-wrap items-center gap-2\",\"children\":[[\"$\",\"$L6\",null,{\"href\":\"/skills/c/frontend-development\",\"className\":\"rounded-full border border-[color:var(--color-line)] px-2.5 py-0.5 font-mono text-[10.5px] uppercase tracking-wider text-[color:var(--color-ink-2)] hover:border-[color:var(--color-primary-light)] hover:text-[color:var(--color-primary-light)]\",\"children\":\"Frontend Development\"}],[\"$\",\"span\",null,{\"className\":\"font-mono text-[10.5px] uppercase tracking-wider text-[color:var(--color-ink-3)]\",\"children\":\"dyad-sh\"}]]}],[\"$\",\"h1\",null,{\"className\":\"font-serif text-[36px] leading-tight tracking-tight text-[color:var(--color-ink-0)] sm:text-[42px]\",\"children\":\"dyad:swarm-pr-review\"}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-[65ch] text-[15px] leading-[1.65] text-[color:var(--color-ink-2)]\",\"children\":\"Team-based PR review using Claude Code swarm. Spawns three specialized teammates (correctness expert, code health expert, UX wizard) who review the PR diff, discuss findings with each other, and reach consensus on real issues. Posts a summary with merge verdict and inline comments for HIGH/MEDIUM issues.\"}],[\"$\",\"dl\",null,{\"className\":\"mt-6 grid grid-cols-2 gap-x-6 gap-y-3 sm:grid-cols-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-1\",\"children\":[\"$L1c\",\"$L1d\"]}],\"$L1e\",\"$L1f\",\"$L20\"]}],\"$L21\"]}],\"$L22\",\"$L23\"]}]\n"])</script><script>self.__next_f.push([1,"24:I[28263,[\"/_next/static/chunks/17wr4kjvetgpg.js\",\"/_next/static/chunks/01d9z6trbvl9l.js\",\"/_next/static/chunks/0d3shmwh5_nmn.js\",\"/_next/static/chunks/0_3fj3rn8zo2r.js\",\"/_next/static/chunks/0pg86~w1~d355.js\"],\"CopyButton\"]\n1c:[\"$\",\"dt\",null,{\"className\":\"font-mono text-[10px] uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Stars\"}]\n1d:[\"$\",\"dd\",null,{\"className\":\"truncate text-[13px] text-[color:var(--color-ink-1)] \",\"title\":\"20,485\",\"children\":\"20,485\"}]\n1e:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-1\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"font-mono text-[10px] uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Source\"}],[\"$\",\"dd\",null,{\"className\":\"truncate text-[13px] text-[color:var(--color-ink-1)] \",\"title\":\"dyad-sh/dyad\",\"children\":\"dyad-sh/dyad\"}]]}]\n1f:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-1\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"font-mono text-[10px] uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Updated\"}],[\"$\",\"dd\",null,{\"className\":\"truncate text-[13px] text-[color:var(--color-ink-1)] \",\"title\":\"2026-05-30\",\"children\":\"2026-05-30\"}]]}]\n20:[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-col gap-1\",\"children\":[[\"$\",\"dt\",null,{\"className\":\"font-mono text-[10px] uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"Slug\"}],[\"$\",\"dd\",null,{\"className\":\"truncate text-[13px] text-[color:var(--color-ink-1)] font-mono text-[12px]\",\"title\":\"dyad-sh--dyad--swarm-pr-review\",\"children\":\"dyad-sh--dyad--swarm-pr-review\"}]]}]\n21:[\"$\",\"div\",null,{\"className\":\"mt-6 flex flex-wrap items-center gap-3\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://github.com/dyad-sh/dyad/tree/main/.claude/skills/swarm-pr-review\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex items-center gap-2 rounded-full bg-[color:var(--color-primary-light)] px-5 py-2.5 text-[13px] font-medium text-[color:var(--color-on-primary)] transition-opacity hover:opacity-90\",\"children\":[\"View on GitHub\",[\"$\",\"span\",null,{\"aria-hidden\":true,\"children\":\"↗\"}]]}],[\"$\",\"a\",null,{\"href\":\"https://raw.githubusercontent.com/dyad-sh/dyad/main/.claude/skills/swarm-pr-review/SKILL.md\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex items-center gap-2 rounded-full border border-[color:var(--color-line-2)] px-5 py-2.5 text-[13px] font-medium text-[color:var(--color-ink-1)] hover:border-[color:var(--color-ink-3)] hover:text-[color:var(--color-ink-0)]\",\"children\":\"Raw SKILL.md\"}],[\"$\",\"$L24\",null,{\"value\":\"https://github.com/dyad-sh/dyad/tree/main/.claude/skills/swarm-pr-review\",\"label\":\"Copy GitHub URL\"}],[\"$\",\"$L24\",null,{\"value\":\"\",\"fetchUrl\":\"https://raw.githubusercontent.com/dyad-sh/dyad/main/.claude/skills/swarm-pr-review/SKILL.md\",\"label\":\"Copy SKILL.md\"}]]}]\n"])</script><script>self.__next_f.push([1,"22:[\"$\",\"section\",null,{\"aria-label\":\"Install\",\"className\":\"mt-8 rounded-xl border border-[color:var(--color-line)] bg-[color:var(--color-bg-1)] p-5\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-2 flex items-center justify-between gap-3\",\"children\":[[\"$\",\"p\",null,{\"className\":\"font-mono text-[10.5px] uppercase tracking-[0.16em] text-[color:var(--color-ink-3)]\",\"children\":\"// install — copy + paste into any project\"}],[\"$\",\"$L24\",null,{\"value\":\"mkdir -p .claude/skills \u0026\u0026 curl -fsSL https://raw.githubusercontent.com/dyad-sh/dyad/HEAD/.claude/skills/swarm-pr-review/SKILL.md -o .claude/skills/swarm-pr-review.md\",\"label\":\"Copy\"}]]}],[\"$\",\"div\",null,{\"className\":\"relative\",\"children\":[[\"$\",\"pre\",null,{\"className\":\"overflow-x-auto rounded-md bg-[color:var(--color-bg-3)] p-3 pr-20 text-[12px] leading-[1.6] text-[color:var(--color-ink-1)]\",\"children\":[\"$\",\"code\",null,{\"children\":\"mkdir -p .claude/skills \u0026\u0026 curl -fsSL https://raw.githubusercontent.com/dyad-sh/dyad/HEAD/.claude/skills/swarm-pr-review/SKILL.md -o .claude/skills/swarm-pr-review.md\"}]}],[\"$\",\"$L24\",null,{\"value\":\"mkdir -p .claude/skills \u0026\u0026 curl -fsSL https://raw.githubusercontent.com/dyad-sh/dyad/HEAD/.claude/skills/swarm-pr-review/SKILL.md -o .claude/skills/swarm-pr-review.md\",\"variant\":\"corner\",\"label\":\"Copy\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-3 text-[12.5px] leading-[1.55] text-[color:var(--color-ink-2)]\",\"children\":[\"Drops the SKILL.md into\",\" \",[\"$\",\"code\",null,{\"className\":\"rounded bg-[color:var(--color-bg-3)] px-1.5 py-0.5 font-mono text-[11.5px]\",\"children\":[\".claude/skills/\",\"swarm-pr-review\",\".md\"]}],\". Works with Claude Code, Cursor, and any agent that loads SKILL.md files from\",\" \",[\"$\",\"code\",null,{\"className\":\"rounded bg-[color:var(--color-bg-3)] px-1.5 py-0.5 font-mono text-[11.5px]\",\"children\":\".claude/skills/\"}],\".\"]}]]}]\n"])</script><script>self.__next_f.push([1,"25:T2e1a,"])</script><script>self.__next_f.push([1,"\u003ch1\u003eSwarm PR Review\u003c/h1\u003e\n\u003cp\u003eThis skill uses Claude Code\u0026#39;s agent team (swarm) functionality to perform a collaborative PR review with three specialized reviewers who discuss and reach consensus.\u003c/p\u003e\n\u003ch2\u003eOverview\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eFetch PR diff and existing comments\u003c/li\u003e\n\u003cli\u003eCreate a review team with 3 specialized teammates\u003c/li\u003e\n\u003cli\u003eEach teammate reviews the diff from their expert perspective\u003c/li\u003e\n\u003cli\u003eTeammates discuss findings to reach consensus on real issues\u003c/li\u003e\n\u003cli\u003eTeam lead compiles final review with merge verdict\u003c/li\u003e\n\u003cli\u003ePost summary comment + inline comments to GitHub\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2\u003eTeam Members\u003c/h2\u003e\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eName\u003c/th\u003e\n\u003cth\u003eRole\u003c/th\u003e\n\u003cth\u003eFocus\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecorrectness-reviewer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCorrectness \u0026amp; Debugging Expert\u003c/td\u003e\n\u003ctd\u003eBugs, edge cases, control flow, security, error handling\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ecode-health-reviewer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eCode Health Expert\u003c/td\u003e\n\u003ctd\u003eDead code, duplication, complexity, meaningful comments, abstractions\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eux-reviewer\u003c/code\u003e\u003c/td\u003e\n\u003ctd\u003eUX Wizard\u003c/td\u003e\n\u003ctd\u003eUser experience, consistency, accessibility, error states, delight\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\u003c/table\u003e\n\u003ch2\u003eWorkflow\u003c/h2\u003e\n\u003ch3\u003eStep 1: Determine PR Number and Repo\u003c/h3\u003e\n\u003cp\u003eParse the PR number and repo from the user\u0026#39;s input. If not provided, try to infer from the current git context:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-bash\"\u003e# Get current repo\ngh repo view --json nameWithOwner -q \u0026#39;.nameWithOwner\u0026#39;\n\n# If user provides a PR URL, extract the number\n# If user just says \u0026quot;review this PR\u0026quot;, check for current branch PR\ngh pr view --json number -q \u0026#39;.number\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eStep 2: Fetch PR Diff and Context\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eIMPORTANT:\u003c/strong\u003e Always save files to the current working directory (e.g. \u003ccode\u003e./pr_diff.patch\u003c/code\u003e), never to \u003ccode\u003e/tmp/\u003c/code\u003e or other directories outside the repo. In CI, only the repo working directory is accessible.\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-bash\"\u003e# Save the diff to current working directory (NOT /tmp/ or $SCRATCHPAD)\ngh pr diff \u0026lt;PR_NUMBER\u0026gt; --repo \u0026lt;OWNER/REPO\u0026gt; \u0026gt; ./pr_diff.patch\n\n# Get PR metadata\ngh pr view \u0026lt;PR_NUMBER\u0026gt; --repo \u0026lt;OWNER/REPO\u0026gt; --json title,body,files,headRefOid\n\n# Fetch existing comments to avoid duplicates\ngh api repos/\u0026lt;OWNER/REPO\u0026gt;/pulls/\u0026lt;PR_NUMBER\u0026gt;/comments --paginate\ngh api repos/\u0026lt;OWNER/REPO\u0026gt;/issues/\u0026lt;PR_NUMBER\u0026gt;/comments --paginate\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSave the diff content and existing comments for use in the review.\u003c/p\u003e\n\u003ch3\u003eStep 3: Create the Review Team\u003c/h3\u003e\n\u003cp\u003eUse \u003ccode\u003eTeamCreate\u003c/code\u003e to create the team:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eTeamCreate:\n team_name: \u0026quot;pr-review-\u0026lt;PR_NUMBER\u0026gt;\u0026quot;\n description: \u0026quot;Code review for PR #\u0026lt;PR_NUMBER\u0026gt;\u0026quot;\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eStep 4: Create Review Tasks\u003c/h3\u003e\n\u003cp\u003eCreate 4 tasks:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e\u0026quot;Review PR for correctness issues\u0026quot;\u003c/strong\u003e - Assigned to correctness-reviewer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u0026quot;Review PR for code health issues\u0026quot;\u003c/strong\u003e - Assigned to code-health-reviewer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u0026quot;Review PR for UX issues\u0026quot;\u003c/strong\u003e - Assigned to ux-reviewer\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u0026quot;Discuss and reach consensus on findings\u0026quot;\u003c/strong\u003e - Blocked by tasks 1-3, no owner (team-wide)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3\u003eStep 5: Spawn Teammates\u003c/h3\u003e\n\u003cp\u003eSpawn all 3 teammates in parallel using the \u003ccode\u003eTask\u003c/code\u003e tool with \u003ccode\u003eteam_name\u003c/code\u003e set to the team name. Each teammate should be a \u003ccode\u003egeneral-purpose\u003c/code\u003e subagent.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIMPORTANT\u003c/strong\u003e: Each teammate\u0026#39;s prompt must include:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eTheir role description (from the corresponding file in \u003ccode\u003ereferences/\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003eThe full PR diff content (inline, NOT a file path - teammates cannot read files from the team lead\u0026#39;s scratchpad)\u003c/li\u003e\n\u003cli\u003eThe list of existing PR comments (so they can avoid duplicates)\u003c/li\u003e\n\u003cli\u003eInstructions to send their findings back as a structured message\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4\u003eTeammate Prompt Template\u003c/h4\u003e\n\u003cp\u003eFor each teammate, the prompt should follow this structure:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003eYou are the [ROLE NAME] on a PR review team. Read your role description carefully:\n\n\u0026lt;role\u0026gt;\n[Contents of references/\u0026lt;role\u0026gt;.md]\n\u0026lt;/role\u0026gt;\n\nYou are reviewing PR #\u0026lt;NUMBER\u0026gt; in \u0026lt;REPO\u0026gt;: \u0026quot;\u0026lt;PR TITLE\u0026gt;\u0026quot;\n\n\u0026lt;pr_description\u0026gt;\n[PR body/description]\n\u0026lt;/pr_description\u0026gt;\n\nHere is the diff to review:\n\n\u0026lt;diff\u0026gt;\n[Full diff content]\n\u0026lt;/diff\u0026gt;\n\nHere are existing PR comments (do NOT flag issues already commented on):\n\n\u0026lt;existing_comments\u0026gt;\n[Existing comment data]\n\u0026lt;/existing_comments\u0026gt;\n\n## Instructions\n\n1. Read your role description carefully and review the diff from your expert perspective.\n2. For each issue you find, classify it as HIGH, MEDIUM, or LOW severity using the guidelines in your role description.\n3. Send your findings to the team lead using SendMessage with this format:\n\nFINDINGS:\n```json\n[\n {\n \u0026quot;file\u0026quot;: \u0026quot;path/to/file.ts\u0026quot;,\n \u0026quot;line_start\u0026quot;: 42,\n \u0026quot;line_end\u0026quot;: 45,\n \u0026quot;severity\u0026quot;: \u0026quot;MEDIUM\u0026quot;,\n \u0026quot;category\u0026quot;: \u0026quot;category-name\u0026quot;,\n \u0026quot;title\u0026quot;: \u0026quot;Brief title\u0026quot;,\n \u0026quot;description\u0026quot;: \u0026quot;Clear description of the issue and its impact\u0026quot;,\n \u0026quot;suggestion\u0026quot;: \u0026quot;How to fix (optional)\u0026quot;\n }\n]\n\u003c/code\u003e\u003c/pre\u003e\n\u003col start=\"4\"\u003e\n\u003cli\u003eAfter sending your initial findings, wait for the team lead to share other reviewers\u0026#39; findings.\u003c/li\u003e\n\u003cli\u003eWhen you receive other reviewers\u0026#39; findings, discuss them:\u003cul\u003e\n\u003cli\u003eENDORSE issues you agree with (even if you missed them)\u003c/li\u003e\n\u003cli\u003eCHALLENGE issues you think are false positives or wrong severity\u003c/li\u003e\n\u003cli\u003eADD context from your expertise that strengthens or weakens an issue\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSend your discussion responses to the team lead.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBe thorough but focused. Only flag real issues, not nitpicks disguised as issues.\u003c/p\u003e\n\u003cp\u003eIMPORTANT: Cross-reference infrastructure changes (DB migrations, new tables/columns, API endpoints, config entries) against actual usage in the diff. If a migration creates a table but no code in the PR reads from or writes to it, that\u0026#39;s dead infrastructure and should be flagged.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n### Step 6: Collect Initial Reviews\n\nWait for all 3 teammates to send their initial findings. Parse the JSON from each teammate\u0026#39;s message.\n\n### Step 7: Facilitate Discussion\n\nOnce all initial reviews are in:\n\n1. Send each teammate a message with ALL findings from all reviewers (labeled by who found them)\n2. Ask them to discuss: endorse, challenge, or add context\n3. Wait for discussion responses\n\nThe message to each teammate should look like:\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eAll initial reviews are in. Here are the findings from all three reviewers:\u003c/p\u003e\n\u003ch2\u003eCorrectness Reviewer Findings:\u003c/h2\u003e\n\u003cp\u003e[list of issues]\u003c/p\u003e\n\u003ch2\u003eCode Health Reviewer Findings:\u003c/h2\u003e\n\u003cp\u003e[list of issues]\u003c/p\u003e\n\u003ch2\u003eUX Reviewer Findings:\u003c/h2\u003e\n\u003cp\u003e[list of issues]\u003c/p\u003e\n\u003cp\u003ePlease review the other reviewers\u0026#39; findings from YOUR expert perspective:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eENDORSE issues you agree are real problems (say \u0026quot;ENDORSE: \u003ctitle\u003e - \u003creason\u003e\u0026quot;)\u003c/li\u003e\n\u003cli\u003eCHALLENGE issues you think are false positives or mis-classified (say \u0026quot;CHALLENGE: \u003ctitle\u003e - \u003creason\u003e\u0026quot;)\u003c/li\u003e\n\u003cli\u003eIf you have additional context that changes the severity, explain why\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eFocus on issues where your expertise adds value. You don\u0026#39;t need to comment on every issue.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\n### Step 8: Compile Consensus\n\nAfter discussion, compile the final issue list:\n\n**Issue Classification Rules:**\n- An issue is **confirmed** if the original reporter + at least 1 other reviewer endorses it (or nobody challenges it)\n- An issue is **dropped** if challenged by 2 reviewers with valid reasoning\n- An issue is **downgraded** if challenged on severity with good reasoning\n- HIGH/MEDIUM issues get individual inline comments\n- LOW issues go in a collapsible details section in the summary\n\n### Step 9: Determine Merge Verdict\n\nBased on the confirmed issues:\n\n- **:white_check_mark: YES - Ready to merge**: No HIGH issues, at most minor MEDIUM issues that are judgment calls\n- **:thinking: NOT SURE - Potential issues**: Has MEDIUM issues that should probably be addressed, but none are clear blockers\n- **:no_entry: NO - Do NOT merge**: Has HIGH severity issues or multiple serious MEDIUM issues that NEED to be fixed\n\n### Step 10: Post GitHub Comments\n\n#### Summary Comment\n\nPost a summary comment on the PR using `gh pr comment`:\n\n```markdown\n## :mag: Dyadbot Code Review Summary\n\n**Verdict: [VERDICT EMOJI + TEXT]**\n\nReviewed by 3 specialized agents: Correctness Expert, Code Health Expert, UX Wizard.\n\n### Issues Summary\n\n| # | Severity | File | Issue | Found By | Endorsed By |\n|---|----------|------|-------|----------|-------------|\n| 1 | :red_circle: HIGH | `src/auth.ts:45` | SQL injection in login | Correctness | Code Health |\n| 2 | :yellow_circle: MEDIUM | `src/ui/modal.tsx:12` | Missing loading state | UX | Correctness |\n| 3 | :yellow_circle: MEDIUM | `src/utils.ts:89` | Duplicated validation logic | Code Health | - |\n\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;:green_circle: Low Priority Notes (X items)\u0026lt;/summary\u0026gt;\n\n- **Minor naming inconsistency** - `src/helpers.ts:23` (Code Health)\n- **Could add hover state** - `src/button.tsx:15` (UX)\n\n\u0026lt;/details\u0026gt;\n\n\u0026lt;details\u0026gt;\n\u0026lt;summary\u0026gt;:no_entry_sign: Dropped Issues (X items)\u0026lt;/summary\u0026gt;\n\n- **~~Potential race condition~~** - Challenged by Code Health: \u0026quot;State is only accessed synchronously in this context\u0026quot;\n\n\u0026lt;/details\u0026gt;\n\n---\n*Generated by Dyadbot code review*\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch4\u003eInline Comments\u003c/h4\u003e\n\u003cp\u003eFor each HIGH and MEDIUM issue, post an inline review comment at the relevant line using \u003ccode\u003egh api\u003c/code\u003e:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-bash\"\u003e# Post a review with inline comments\ngh api repos/\u0026lt;OWNER/REPO\u0026gt;/pulls/\u0026lt;PR_NUMBER\u0026gt;/reviews \\\n -X POST \\\n --input payload.json\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eWhere payload.json contains:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class=\"language-json\"\u003e{\n \u0026quot;commit_id\u0026quot;: \u0026quot;\u0026lt;HEAD_SHA\u0026gt;\u0026quot;,\n \u0026quot;body\u0026quot;: \u0026quot;Swarm review: X issue(s) found\u0026quot;,\n \u0026quot;event\u0026quot;: \u0026quot;COMMENT\u0026quot;,\n \u0026quot;comments\u0026quot;: [\n {\n \u0026quot;path\u0026quot;: \u0026quot;src/auth.ts\u0026quot;,\n \u0026quot;line\u0026quot;: 45,\n \u0026quot;body\u0026quot;: \u0026quot;**:red_circle: HIGH** | security | Found by: Correctness, Endorsed by: Code Health\\n\\n**SQL injection in login**\\n\\nDescription of the issue...\\n\\n:bulb: **Suggestion:** Use parameterized queries\u0026quot;\n }\n ]\n}\n\u003c/code\u003e\u003c/pre\u003e\n\u003ch3\u003eStep 11: Shutdown Team\u003c/h3\u003e\n\u003cp\u003eAfter posting comments:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSend shutdown requests to all teammates\u003c/li\u003e\n\u003cli\u003eWait for shutdown confirmations\u003c/li\u003e\n\u003cli\u003eDelete the team with TeamDelete\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2\u003eDeduplication\u003c/h2\u003e\n\u003cp\u003eBefore posting, filter out issues that match existing PR comments:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSame file path\u003c/li\u003e\n\u003cli\u003eSame or nearby line number (within 3 lines)\u003c/li\u003e\n\u003cli\u003eSimilar keywords in the issue title appear in the existing comment body\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eError Handling\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eIf a teammate fails to respond, proceed with the other reviewers\u0026#39; findings\u003c/li\u003e\n\u003cli\u003eIf no issues are found by anyone, post a clean summary: \u0026quot;:white_check_mark: No issues found\u0026quot;\u003c/li\u003e\n\u003cli\u003eIf discussion reveals all issues are false positives, still post the summary noting the review was clean\u003c/li\u003e\n\u003cli\u003eAlways post a summary comment, even if there are no issues\u003c/li\u003e\n\u003cli\u003eAlways shut down the team when done, even if there were errors\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFile Structure\u003c/h2\u003e\n\u003cpre\u003e\u003ccode\u003ereferences/\n correctness-reviewer.md - Role description for the correctness expert\n code-health-reviewer.md - Role description for the code health expert\n ux-reviewer.md - Role description for the UX wizard\n\u003c/code\u003e\u003c/pre\u003e\n"])</script><script>self.__next_f.push([1,"23:[\"$\",\"article\",null,{\"className\":\"mt-10\",\"children\":[\"$\",\"div\",null,{\"className\":\"prose-skill\",\"dangerouslySetInnerHTML\":{\"__html\":\"$25\"}}]}]\n"])</script></body></html>