.agents/skills/qa/SKILL.md
Autonomous QA testing across template apps using Playwright. Use when testing apps end-to-end, finding and fixing bugs, or running a QA sweep. Invoke as /qa with optional --apps and --focus args.
npx skillsauth add BuilderIO/agent-native qaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Autonomous QA testing that spins up template apps, tests them with Playwright in parallel, fixes issues, retests, and reports findings. Only alerts the user when blocked.
/qa # test mail, calendar, content, forms
/qa --apps mail,forms # test specific apps
/qa --focus "test form submission and compose" # prioritize specific flows
Args:
--apps — comma-separated app names (default: mail,calendar,content,forms)--focus — natural language guidance for what to prioritizeYou (the agent running this skill) are the orchestrator. Follow these steps in order.
Parse the user's invocation to determine:
For each app, check if required credentials exist:
| App | Check | Can test without? |
|----------|-------------------------------------------------|-------------------|
| forms | No credentials needed | Yes |
| content | No credentials needed (Notion is opt-in) | Yes |
| calendar | templates/calendar/.env has GOOGLE_CLIENT_ID | Partially — local events work, Google sync won't |
| mail | templates/mail/.env has GOOGLE_CLIENT_ID | Partially — UI renders, Gmail features won't |
Read each app's .env file (if it exists) to check. If credentials are missing:
Start each app's dev server on a dedicated port using run_in_background:
| App | Port | Command |
|----------|------|---------|
| mail | 9201 | cd templates/mail && PORT=9201 pnpm dev |
| calendar | 9202 | cd templates/calendar && PORT=9202 pnpm dev |
| content | 9203 | cd templates/content && PORT=9203 pnpm dev |
| forms | 9204 | cd templates/forms && PORT=9204 pnpm dev |
Start all servers in parallel (multiple Bash calls with run_in_background: true).
Then verify each server is ready by polling with curl:
for i in {1..30}; do curl -s -o /dev/null -w "%{http_code}" http://localhost:9201 && break; sleep 1; done
If a server fails to start within 30 seconds, skip that app and note it in the report.
For each app, read these files to understand what to test:
templates/<app>/app/routes/ or templates/<app>/app/routes.ts — discover all pagestemplates/<app>/CLAUDE.md — features, API routes, data modeltemplates/<app>/server/routes/api/ — API endpointsCombine with any --focus guidance to produce a test plan. The test plan is a numbered list of user-facing flows to verify. Example:
1. Home page loads without errors
2. Create a new item via the UI
3. Edit an existing item
4. Delete an item
5. Check all navigation links work
6. Verify no console errors on any page
7. Verify no failed network requests
Create a team and spawn one tester agent per app, all in parallel:
TeamCreate: name="qa", description="QA testing sweep"
Create one task per app:
TaskCreate: subject="QA test <app> on port <port>", description="<test plan>"
Then spawn tester agents in parallel using the Agent tool. Each agent gets:
name: qa-<app> (e.g., qa-mail)team_name: qamode: autoAfter spawning testers, wait for their idle notifications and task updates.
Gather all tester reports from their task updates. Print a compiled summary:
# QA Summary — <date>
## Apps Tested: N
## Total Issues Found: N
## Fixed: N
## Needs Review: N
### Mail App
[tester report]
### Forms App
[tester report]
...
Then shut down all teammates:
SendMessage to each tester: { type: "shutdown_request" }
Use this as the prompt when spawning each tester agent via the Agent tool. Fill in the {{placeholders}}:
START OF TESTER PROMPT
You are a QA tester for the {{app_name}} app running at http://localhost:{{port}}.
Test the app thoroughly using Playwright MCP tools. Find bugs, fix them, retest. Report your findings.
You are on team "qa". Your name is "qa-{{app_name}}".
in_progress when you startcompleted when done, with your report in the description{{credential_status}}
{{test_plan}}
Use these Playwright MCP tools:
browser_navigate to http://localhost:{{port}}<path>browser_snapshot — returns an accessibility tree showing all visible elements with ref attributesbrowser_click with ref from the snapshotbrowser_type with ref and textbrowser_fill_form with ref and valuesbrowser_console_messages — look for errorsbrowser_network_requests — look for failed requests (4xx, 5xx)browser_wait_for when you need to wait for content to appearbrowser_take_screenshot when you want to capture the visual stateFor each test in your plan:
After completing all tests, do one more pass on any pages where you found issues to verify fixes didn't break other things.
Maximum 2 full passes. Don't loop forever.
Always start by navigating to http://localhost:{{port}}/ and taking a snapshot to verify the app is running.
If the app shows an error page or fails to load, check the dev server output and try to diagnose. If it's a missing dependency or config issue, report it and stop — don't spend time debugging infrastructure.
CRITICAL: You may ONLY modify files within templates/{{app_name}}/. If a bug requires changes to packages/core/ or any other template, report it as a finding but do NOT fix it.
After modifying any source file, run:
npx prettier --write <file>
What is NOT a bug:
When you're done, update your task (via TaskUpdate) with status completed and set the description to your report:
## QA Report: {{app_name}}
### Summary: N found, N fixed, N needs review
#### Fixed
1. **Short description** — What file you changed and why
#### Needs Review
1. **Short description** — Why you couldn't fix it
#### Skipped (needs credentials)
1. **Feature name** — What credential is needed
#### Pages Tested
- /path (page name) — status (OK, N issues fixed, N needs review)
END OF TESTER PROMPT
Kill the process on the port before starting:
lsof -ti :9201 | xargs kill -9 2>/dev/null; true
Common causes:
node_modules — run pnpm install from root first.env file — some apps need one even if empty. Check .env.examplepnpm --filter @agent-native/core build firstThe Playwright MCP server must be configured in Claude Code's MCP settings. If browser tools aren't available, the tester agent should report "Playwright MCP tools not available" and stop.
After editing a file, wait 2-3 seconds. If the page doesn't update, try a hard refresh by navigating away and back. Vite HMR sometimes misses changes in server-side files — restart the dev server if needed.
This is a known issue. The tester should:
.env file exists and has the right variable names.env or data/.envtools
Public booking flow — the state machine, animations, and URL/app-state sync.
tools
Trigger-based automations — reminders, follow-ups, webhooks — across the booking lifecycle.
tools
Team event types, round-robin assignment, collective bookings, host weights, and no-show calibration.
development
The pure `computeAvailableSlots` function — inputs, outputs, invariants, and debugging guide.