agentleFS
BuilderIOBuilderIO/agent-native/.agents/skills/qa/SKILL.md

qa

Skill7.6k starsChanged 5 months agoMITView on GitHub

Autonomous multi-app QA sweep that drives template apps with Playwright MCP. Use only when the user explicitly runs /qa or asks for an end-to-end QA sweep. Do not load it for ordinary feature work, single-page checks, or one-off bug fixes.

  • Reads credentials

We split this skill into the rules it gives an agent

34 rules. About 0 are common, 22 are distinctive, and 12 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈22

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 12

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Prefer browser-playwright for automated QA sweeps: it runs npx -y @playwright/mcp@0.0.75.

    line 32
  2. Very specific:

    Use browser-chrome-devtools only when the test specifically needs to attach to a live Chrome session.

    line 33
  3. Very specific:

    Read each app's .env file (if it exists) only to check whether required names are present.

    line 64
  4. Distinctive:

    Only alert the user (via SendMessage to team lead or AskUserQuestion) if the app cannot start at all

    line 70
  5. Very specific:

    Start each app's dev server on a dedicated port using run_in_background:

    line 74
  6. Very specific:

    Start all servers in parallel (multiple Bash calls with run_in_background: true).

    line 83
  7. Distinctive:

    If a server fails to start within 30 seconds, skip that app and note it in the report.

    line 91
  8. Distinctive:

    Create a team and spawn one tester agent per app, all in parallel:

    line 116
  9. Distinctive:

    Create one task per app:

    line 122
  10. Distinctive:

    After spawning testers, wait for their idle notifications and task updates.

    line 137
  11. Distinctive:

    When a tester completes its task, note its findings

    line 139
  12. Distinctive:

    When a tester reports being blocked (missing credentials, app won't start, needs user input), relay that to the user via AskUserQuestion

    line 140
  13. Distinctive:

    When all testers are done, proceed to Step 7

    line 141
  14. Very specific:

    Use this as the prompt when spawning each tester agent via the Agent tool.

    line 174
  15. Distinctive:

    Test the app thoroughly using Playwright MCP tools.

    line 184
  16. Very specific:

    Use TaskUpdate to mark your task as in_progress when you start

    line 190
  17. Very specific:

    Use TaskUpdate to mark your task as completed when done, with your report in the description

    line 191
  18. Distinctive:

    If you are blocked and need user input, send a message to the team lead explaining what you need

    line 192
  19. Distinctive:

    Use these Playwright MCP tools:

    line 204
  20. Distinctive:

    Check console messages for errors

    line 222
  21. Distinctive:

    Check network requests for failures

    line 223
  22. Distinctive:

    If something is broken: a.

    line 225
  23. Distinctive:

    After completing all tests, do one more pass on any pages where you found issues to verify fixes didn't break other things.

    line 234
  24. Distinctive:

    Maximum 2 full passes: Don't loop forever.

    line 236
  25. Very specific:

    Always start by navigating to http://localhost:{{port}}/ and taking a snapshot to verify the app is running.

    line 240
  26. Distinctive:

    If the app shows an error page or fails to load, check the dev server output and try to diagnose.

    line 242
  27. Distinctive:

    After modifying any source file, run:

    line 248
  28. Very specific:

    When you're done, update your task (via TaskUpdate) with status completed and set the description to your report:

    line 272
  29. Distinctive:

    After editing a file, wait 2-3 seconds.

    line 321
  30. Very specific:

    Check the .env file exists and has the right variable names

    line 327
  31. Very specific:

    Check if the app reads from .env or data/.env

    line 328
  32. Distinctive:

    Check the server plugin that loads credentials

    line 329
  33. Distinctive:

    If unfixable, report as "needs review" with details about what the app expects vs.

    line 331
  34. Distinctive:

    Only report variable names and presence/absence.

    line 333

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

QA Testing

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.

This is an explicitly requested sweep, not a default verification step. Do not run any part of it — dev servers, browser automation, tester agents — as follow-up to a normal code change.

Usage

/qa                                            # test mail, calendar, content, forms
/qa --apps mail,forms                          # test specific apps
/qa --focus "test form submission and compose"  # prioritize specific flows

Browser MCP Readiness

QA can use the framework's built-in browser MCP capabilities instead of a hand-written mcp.config.json. The built-ins are off by default and are toggled through /_agent-native/mcp/builtin.

  • Prefer browser-playwright for automated QA sweeps: it runs npx -y @playwright/mcp@0.0.75.
  • Use browser-chrome-devtools only when the test specifically needs to attach to a live Chrome session. It runs npx -y chrome-devtools-mcp@0.26.0 --autoConnect --no-usage-statistics and requires Chrome 144+ with remote debugging enabled. Do not assume it signs into the user's Chrome profile.
  • Browser built-ins are exclusive per scope: enabling Chrome disables Playwright and enabling Playwright disables Chrome.
  • computer-use runs npx -y computer-use-mcp@1.8.0 and is macOS-only.

Args:

  • --apps — comma-separated app names (default: mail,calendar,content,forms)
  • --focus — natural language guidance for what to prioritize

Orchestrator Steps

You (the agent running this skill) are the orchestrator. Follow these steps in order.

Step 1: Parse Args

Parse the user's invocation to determine:

  • apps: which apps to test (default: mail, calendar, content, forms)
  • focus: optional test priority guidance

Step 2: Check Credential Readiness

For each app, check if required credentials exist:

AppCheckCan test without?
formsNo credentials neededYes
contentNo credentials needed (Notion is opt-in)Yes
calendartemplates/calendar/.env has GOOGLE_CLIENT_ID presentPartially — local events work, Google sync won't
mailtemplates/mail/.env has GOOGLE_CLIENT_ID presentPartially — UI renders, Gmail features won't

Read each app's .env file (if it exists) only to check whether required names are present. Never print, copy, summarize, paste, or pass .env values into tester prompts, reports, screenshots, logs, or chat. If credentials are missing:

  • Still test the app — many features work without external APIs
  • Include in the tester's instructions: "No Google credentials found. Test local features. Flag any feature that crashes without credentials as 'needs credentials' rather than a bug."
  • Only alert the user (via SendMessage to team lead or AskUserQuestion) if the app cannot start at all

Step 3: Start Dev Servers

Start each app's dev server on a dedicated port using run_in_background:

AppPortCommand
mail9201cd templates/mail && PORT=9201 pnpm dev
calendar9202cd templates/calendar && PORT=9202 pnpm dev
content9203cd templates/content && PORT=9203 pnpm dev
forms9204cd 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.

Step 4: Generate Test Plans

For each app, read these files to understand what to test:

  1. templates/<app>/app/routes/ or templates/<app>/app/routes.ts — discover all pages
  2. templates/<app>/CLAUDE.md — features, API routes, data model
  3. templates/<app>/actions/ — domain operations the UI and agent share
  4. templates/<app>/server/routes/api/ — route-only endpoints such as uploads, streaming, webhooks, and OAuth callbacks

Combine 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

Step 5: Create Team and Spawn Testers

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: qa
  • mode: auto
  • The full tester prompt (see Tester Agent Prompt below)

Step 6: Monitor and Alert

After spawning testers, wait for their idle notifications and task updates.

  • When a tester completes its task, note its findings
  • When a tester reports being blocked (missing credentials, app won't start, needs user input), relay that to the user via AskUserQuestion
  • When all testers are done, proceed to Step 7

Step 7: Compile Report and Shutdown

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" }

Tester Agent Prompt

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}}.

Your Mission

Test the app thoroughly using Playwright MCP tools. Find bugs, fix them, retest. Report your findings.

Team Context

You are on team "qa". Your name is "qa-{{app_name}}".

  • Use TaskUpdate to mark your task as in_progress when you start
  • Use TaskUpdate to mark your task as completed when done, with your report in the description
  • If you are blocked and need user input, send a message to the team lead explaining what you need

Credential Status

{{credential_status}}

Test Plan

{{test_plan}}

How to Test

Use these Playwright MCP tools:

  1. Navigate: browser_navigate to http://localhost:{{port}}<path>
  2. See the page: browser_snapshot — returns an accessibility tree showing all visible elements with ref attributes
  3. Click: browser_click with ref from the snapshot
  4. Type: browser_type with ref and text
  5. Fill forms: browser_fill_form with ref and values
  6. Check console: browser_console_messages — look for errors
  7. Check network: browser_network_requests — look for failed requests (4xx, 5xx)
  8. Wait: browser_wait_for when you need to wait for content to appear
  9. Screenshot: browser_take_screenshot when you want to capture the visual state

Testing Loop

For each test in your plan:

  1. Navigate to the relevant page
  2. Take a snapshot to see what's on screen
  3. Check console messages for errors
  4. Check network requests for failures
  5. Interact with the page — click buttons, fill forms, navigate flows
  6. If something is broken: a. Document: what page, what's wrong b. Read the relevant source files to understand the issue c. Fix the code d. Wait 2-3 seconds for Vite HMR to hot-reload e. Retest by taking a new snapshot f. If still broken after 3 attempts, mark as "needs human review" and move on
  7. Move to the next test

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.

Start by navigating to the home page

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.

Isolation Rules

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 Counts as a Bug

  • Page crashes or shows error overlay
  • Console errors (not warnings — errors only)
  • Network requests returning 4xx or 5xx
  • Buttons/links that don't work
  • Forms that don't submit
  • Data that doesn't save or display
  • Layout severely broken (overlapping text, invisible elements)
  • Features described in CLAUDE.md that don't work

What is NOT a bug:

  • Minor styling preferences
  • Missing features that aren't described in CLAUDE.md
  • Warnings in console
  • Slow loading (unless > 10 seconds)

Report Format

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


Troubleshooting

Port already in use

Kill the process on the port before starting:

lsof -ti :9201 | xargs kill -9 2>/dev/null; true

Dev server won't start

Common causes:

  • Missing node_modules — run pnpm install from root first
  • Missing .env file — some apps need one even if empty. Check .env.example
  • Port conflict — kill stale processes (see above)
  • Build error in core — run pnpm --filter @agent-native/core build first

Playwright MCP not responding

The 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.

HMR not picking up changes

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.

App shows "credentials not configured" when they are

This is a known issue. The tester should:

  1. Check the .env file exists and has the right variable names
  2. Check if the app reads from .env or data/.env
  3. Check the server plugin that loads credentials
  4. Try to fix the credential detection logic
  5. If unfixable, report as "needs review" with details about what the app expects vs. what's configured

Only report variable names and presence/absence. Do not include secret values.

Download now (ZIP)

Trending

Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data

Week of Aug 30: 0 new projectsWeek of Sep 6: 0 new projectsWeek of Sep 13: 0 new projectsWeek of Sep 20: 0 new projectsWeek of Sep 27: 0 new projectsWeek of Oct 4: 0 new projectsWeek of Oct 11: 0 new projectsWeek of Oct 18: 0 new projects
Aug 2026Sep 2026Oct 2026
New projects taking a version of this file each week, over the 8 weeks our latest run read: only 0 in all, so this is a hint, not a trend.

Who's talking about BuilderIO/agent-native

The biggest 5 of 61 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 61

Talked about on GitHub and Bluesky (61 times).

On GitHub · 50

45 more on GitHub

On Bluesky · 11

6 more on Bluesky

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.