From ccmagic
Systematically QA test a web app in a real browser — find bugs, fix them, verify with screenshots
How this skill is triggered — by the user, by Claude, or both
Slash command
/ccmagic:browser-qa [URL] [--quick|--exhaustive] [--scope PAGE][URL] [--quick|--exhaustive] [--scope PAGE]sonnetThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Systematically test a web application like a real user — navigate every page, click every button, fill every form, check every state. When you find bugs, fix them in source code with atomic commits and re-verify with before/after screenshots.
Systematically test a web application like a real user — navigate every page, click every button, fill every form, check every state. When you find bugs, fix them in source code with atomic commits and re-verify with before/after screenshots.
Browser required: This skill uses Chrome DevTools MCP for all interactions. If unavailable, it cannot run (there's no meaningful fallback for interactive QA).
| Argument | Description |
|---|---|
| (empty) | Auto-detect dev server, or ask for URL |
<URL> | Target URL to test |
--quick | Critical + high severity only, 3-5 pages |
--exhaustive | All severities including cosmetic, full site coverage |
--scope PAGE | Focus on a specific page or flow (e.g., --scope billing) |
--diff | Scope to pages affected by current branch changes |
Tier defaults:
for port in 3000 4000 5173 8080 8000; do curl -s -o /dev/null -w "%{http_code}" "http://localhost:$port" 2>/dev/null | grep -q "200\|301\|302" && echo "FOUND: http://localhost:$port" && break; done
If no server found and no URL given, use AskUserQuestion to ask.
When --diff or auto-detected (feature branch, no URL):
git diff main...HEAD --name-only — find changed filesgit status --porcelain
If dirty, use AskUserQuestion:
Try mcp__chrome_devtools__navigate_page with the target URL. If the tool errors:
"Chrome DevTools MCP is unavailable. /browser-qa requires a browser connection to test interactively. Check that Chrome DevTools MCP is configured and a browser is accessible."
Stop — there's no meaningful fallback for interactive QA.
Navigate to the target URL and map the application:
mcp__chrome_devtools__take_screenshot, then Read to show inlinemcp__chrome_devtools__take_snapshot to understand page structureJSON.stringify([...document.querySelectorAll('a[href],nav a,[role=link]')].map(a => ({text: a.textContent.trim().slice(0,40), href: a.href})).filter(a => a.href.startsWith(location.origin)).slice(0,30))
mcp__chrome_devtools__list_console_messagesFor each page in scope:
mcp__chrome_devtools__navigate_page to the pagemcp__chrome_devtools__take_screenshot — baseline screenshotmcp__chrome_devtools__list_console_messages — check for JS errorsmcp__chrome_devtools__list_network_requests — check for failed requests (4xx, 5xx)Get all interactive elements via mcp__chrome_devtools__take_snapshot (accessibility tree), then systematically test:
Buttons: Click each button. Check for:
Links: Click internal links. Check for:
Forms: For each form on the page:
mcp__chrome_devtools__fill — submit — check successDropdowns/Selects: Open each, verify options render, select an option, verify state updates.
Modals/Dialogs: Trigger each modal. Check: renders correctly, can be dismissed (X button, escape key, backdrop click), form inside modal works.
For each page:
mcp__chrome_devtools__resize_page to 375 (mobile) — screenshotmcp__chrome_devtools__resize_page to 768 (tablet) — screenshotmcp__chrome_devtools__resize_page to 1440 (desktop) — restoreWalk 2-4 key user flows end-to-end (the most important things a user would do):
For each flow:
Common flows to test (select based on what the app does):
mcp__chrome_devtools__lighthouse_audit on the homepage — extract:
Flag performance issues as QA findings if:
Compile all issues found. For each issue:
- id: ISSUE-NNN
- severity: critical | high | medium | low
- category: functionality | form | navigation | error-handling | responsive | performance | accessibility
- page: URL where found
- description: what's broken
- repro: steps to reproduce
- evidence: screenshot filename
- fixable: true | false
Sort by severity. Apply tier filter:
Mark unfixable issues (third-party widgets, infrastructure) as "deferred" regardless of tier.
Output the triage summary:
QA found N issues: X critical, Y high, Z medium, W low
Fixing: A issues (based on [tier] tier)
Deferred: B issues
For each fixable issue, in severity order:
Use Grep/Glob to find the source file responsible. Search for:
git add <only-changed-files>
git commit -m "fix(qa): ISSUE-NNN — short description"
One commit per fix. Never bundle.
mcp__chrome_devtools__take_screenshot — after screenshotmcp__chrome_devtools__list_console_messages — confirm no new errorsgit revert HEAD → mark as deferredEvery 5 fixes (or after any revert), evaluate:
Risk score:
Each revert: +15%
Each fix touching >3 files: +5%
After fix 15: +1% per additional fix
Touching unrelated files: +20%
If risk > 20%: STOP. Show the user what's been done. Ask whether to continue via AskUserQuestion.
Hard cap: 30 fixes. After 30, stop regardless of remaining issues.
After all fixes:
mcp__chrome_devtools__list_console_messages on each — check for new errorsIf regressions found, WARN prominently.
# Browser QA Report
Target: [URL]
Tier: [quick | standard | exhaustive]
Date: [ISO 8601]
## Summary
- Pages tested: N
- Issues found: X critical, Y high, Z medium, W low
- Fixes applied: N (verified: A, best-effort: B, reverted: C)
- Deferred: N issues
- Console errors: before M → after N
## Issues & Fixes
### ISSUE-001 [critical] [verified]
**Page:** /checkout
**Bug:** Submit button does nothing when cart has >10 items
**Repro:** Add 11 items → click checkout → click submit → nothing happens
**Fix:** Fixed overflow check in cart-validator.js:42
**Commit:** `abc1234`
**Before:** [screenshot]
**After:** [screenshot]
### ISSUE-002 [high] [deferred]
**Page:** /settings
**Bug:** Password change form accepts empty password
**Repro:** Go to settings → clear password field → click save → succeeds
**Note:** Deferred — requires backend validation change
[... remaining issues ...]
## Performance
- Lighthouse Performance: [score]
- LCP: [value]
- CLS: [value]
- Accessibility: [score]
## Ship Readiness
[One-paragraph assessment: is this ready to ship? What must be fixed first?]
## PR Summary
> QA found N issues, fixed M. Health: [before] → [after]. [Ship-ready | Needs fixes: list]
When invoked, immediately begin testing without asking for confirmation (unless no URL can be determined). Test like a skeptical user — click everything, try to break things, fill forms with weird data. Every bug must include reproduction steps and a screenshot. Quality over speed — 10 well-documented bugs with fixes beat 30 vague observations.
npx claudepluginhub devondragon/ccmagic --plugin ccmagicCreates bite-sized, testable implementation plans from specs or requirements, with file structure and task decomposition. Activates before coding multi-step tasks.