Verify web application changes work by launching the app stack and testing in a real browser. This skill should be used when the user asks to "verify the change", "test in browser", "check if it works", or after completing a PR to validate the implementation. Requires Playwright MCP server. MUST exit if Playwright MCP is unavailable.
Launches your app stack and uses browser automation to verify PR changes work correctly in a real browser. Triggered when you ask to "verify the change", "test in browser", or "check if it works". Requires Playwright MCP server.
/plugin marketplace add fx/cc/plugin install fx-dev@fx-ccThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/playwright-mcp.mdscripts/check-playwright-mcp.shscripts/launch-app-stack.shVerify that pull request changes work correctly in a running web application using browser automation.
Playwright MCP is MANDATORY. This skill cannot function without it.
Execute these steps in order. Do not skip steps.
MUST exit if this step fails.
Test Playwright MCP by attempting to list browser tabs:
mcp__playwright__browser_tabs
action: "list"
If this tool:
❌ VERIFICATION FAILED: Playwright MCP server is not installed.
To install:
1. Run: npx @anthropic-ai/mcp-server-playwright
2. Configure in Claude Code MCP settings
3. Restart Claude Code
Do NOT proceed if Playwright MCP is unavailable.
Before launching the application, understand what to verify.
git diff main --name-only
git diff main --stat
Read the changed files and related context to understand:
# Check for existing Playwright/E2E tests
find . -name "*.spec.ts" -o -name "*.test.ts" -o -name "*.e2e.ts" | head -20
ls -la tests/ e2e/ playwright/ __tests__/ 2>/dev/null || true
If Playwright tests exist, read them to understand:
Create a mental checklist of what must be verified:
Check for docker-compose/compose files:
ls -la docker-compose.yml docker-compose.yaml compose.yml compose.yaml 2>/dev/null || echo "No compose file found"
If compose file exists:
docker compose up -d
sleep 5 # Wait for services to initialize
# Check for lockfiles in order of preference
if [[ -f "bun.lockb" ]] || [[ -f "bun.lock" ]]; then
PM="bun"
elif [[ -f "pnpm-lock.yaml" ]]; then
PM="pnpm"
elif [[ -f "yarn.lock" ]]; then
PM="yarn"
else
PM="npm"
fi
echo "Package manager: $PM"
# Only if node_modules doesn't exist
[[ -d "node_modules" ]] || $PM install
Start the dev server in background:
# Common dev commands - check package.json scripts
$PM run dev &
Wait for server to be ready:
sleep 10 # Adjust based on typical startup time
Or use Playwright to wait:
mcp__playwright__browser_navigate
url: "http://localhost:3000" # Adjust port as needed
mcp__playwright__browser_navigate
url: "http://localhost:3000"
mcp__playwright__browser_snapshot
mcp__playwright__browser_console_messages
level: "error"
If critical errors exist, report them and investigate.
Confirm the application loads and shows expected content. If it doesn't load:
This is the core verification step. Based on the PR changes identified in Step 2:
If the change affects a specific route/page:
mcp__playwright__browser_navigate
url: "http://localhost:3000/affected-route"
mcp__playwright__browser_snapshot
Check the snapshot for:
For interactive changes, test the interaction:
mcp__playwright__browser_click
element: "description of element"
ref: "ref-from-snapshot"
Then snapshot again to verify the result:
mcp__playwright__browser_snapshot
If the codebase has Playwright tests for the changed area:
The ONLY success criteria is: The actual changes made in the PR are verified to be present and working in the running application.
✅ VERIFICATION PASSED
Changes Verified:
- [specific change 1]: ✅ Working
- [specific change 2]: ✅ Working
- [specific change N]: ✅ Working
Evidence:
- [what was observed that confirms each change]
❌ VERIFICATION FAILED
Expected: [what should have been observed]
Actual: [what was actually observed]
Details:
- [specific issue 1]
- [specific issue 2]
Console Errors: [if any]
Stop background processes:
# Kill dev server if started
pkill -f "bun run dev" || pkill -f "npm run dev" || true
# Stop docker services if started
docker compose down 2>/dev/null || true
For detailed Playwright MCP tool documentation, see: references/playwright-mcp.md
scripts/launch-app-stack.sh - Detect and launch application stackscripts/check-playwright-mcp.sh - Verify Playwright MCP availability| Framework | Default Port |
|---|---|
| Vite | 5173 |
| Next.js | 3000 |
| Create React App | 3000 |
| TanStack Start | 3000 |
| Remix | 3000 |
| Nuxt | 3000 |
| SvelteKit | 5173 |
Install the MCP server and configure it in Claude Code settings.
browser_wait_forThis skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.