adversarial-reviewer
Review code through three hostile personas - the Saboteur, the New Hire, and the Security Auditor - each required to find at least one issue. Use when a…
Verify a web application works correctly in a real browser using Playwright. Covers page navigation, form submission, user interactions, console error detection, screenshot capture, and responsive layout checking. Use when you need to confirm a UI feature actually works
$ npx -y skills add KhaledSaeed18/dotclaude --skill webapp-testing --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/webapp-testingContext preview
The summary Claude sees to decide when to auto-load this skill.
Verify a web application works correctly in a real browser using Playwright. Covers page navigation, form submission, user interactions, console error detection, screenshot capture, and responsive layout checking. Use when you need to confirm a UI feature actually works
name: webapp-testing description: Verify a web application works correctly in a real browser using Playwright. Covers page navigation, form submission, user interactions, console error detection, screenshot capture, and responsive layout checking. Use when you need to confirm a UI feature actually works end-to-end, catch regressions after a change, verify a form flow completes, or check that the page is free of console errors. Requires Node.js; installs Playwright if not already present.
Test the application in a real browser rather than claiming it works from a code read alone. A passing type-check or unit test does not mean the page renders, the form submits, or the network request succeeds. Run the app, drive it with Playwright, and report what actually happened.
# Check if Playwright is installed npx playwright --version 2>/dev/null || echo "not installed" # Check if there is an existing Playwright config ls playwright.config.ts playwright.config.js 2>/dev/null
If Playwright is not installed, install it:
npm install --save-dev @playwright/test npx playwright install chromium
Check whether the dev server is already running. If not, start it before writing tests. Use the project's start script - check `package.json` for the correct command (`npm run dev`, `npm start`, etc.). The server must be running for Playwright to connect.
Before writing any test, state the scenario in plain terms:
If the user has not specified a scenario, default to: navigate to the app's root, confirm it loads without console errors, and take a screenshot.
Write a focused script that tests the specified scenario. Keep each script to one scenario.
import { chromium } from "@playwright/test";
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
viewport: { width: 1280, height: 720 },
});
const page = await context.newPage();
// Collect console errors throughout the session
const consoleErrors: string[] = [];
page.on("console", (msg) => {
if (msg.type() === "error") consoleErrors.push(msg.text());
});
// Collect failed network requests
const networkErrors: string[] = [];
page.on("requestfailed", (request) => {
networkErrors.push(`${request.method()} ${request.url()} - ${request.failure()?.errorText}`);
});
try {
// Navigate and wait for the page to be ready
await page.goto("http://localhost:3000", { waitUntil: "networkidle" });
// Take a screenshot of the initial state
await page.screenshot({ path: "screenshot-initial.png", fullPage: true });
// Example: verify a heading is present
const heading = await page.locator("h1").first().textContent();
console.log(`Page heading: ${heading}`);
// Example: fill and submit a form
// await page.fill('[name="email"]', 'test@example.com');
// await page.fill('[name="password"]', 'test-password');
// await page.click('[type="submit"]');
// await page.waitForURL('**/dashboard');
// Take a final screenshot
await page.screenshot({ path: "screenshot-final.png", fullPage: true });
console.log("Console errors:", consoleErrors.length === 0 ? "none" : consoleErrors);
console.log("Network errors:", networkErrors.length === 0 ? "none" : networkErrors);
} finally {
await browser.close();
}Adapt the script to the actual scenario. Replace the example interactions with the specific steps needed.
Use these patterns for common UI actions:
**Waiting correctly:**
// Wait for a specific element to appear (not arbitrary sleep)
await page.waitForSelector(".success-message", { state: "visible" });
// Wait for navigation
await page.waitForURL("**/dashboard");
// Wait for a network request to complete
await page.waitForResponse((resp) => resp.url().includes("/api/login") && resp.status() === 200);**Forms:**
await page.fill('[name="email"]', "user@example.com");
await page.selectOption("select#country", "US");
await page.check('[name="terms"]');
await page.click('[type="submit"]');**Responsive layout:**
// Mobile viewport
await page.setViewportSize({ width: 375, height: 812 });
await page.screenshot({ path: "screenshot-mobile.png" });
// Tablet
await page.setViewportSize({ width: 768, height: 1024 });
await page.screenshot({ path: "screenshot-tablet.png" });**Checking visibility and content:**
const isVisible = await page.locator(".error-banner").isVisible();
const text = await page.locator(".status-message").textContent();
const count = await page.locator(".list-item").count();npx ts-node test-scenario.ts # or if using @playwright/test: npx playwright test
Report the outcome as:
**Passed:** what was verified (page loaded, form submitted, URL changed, specific elements present), the screenshot paths, and the console/network error counts.
**Failed:** the exact step that failed, the error message, what the page looked like at failure (screenshot path), any console errors collected, and any failed network requests.
Do not report "the test ran" as success. Report what was actually observed: the page title, the presence or absence of specific elements, whether the expected URL was reached, and whether any console errors fired.
Reusable Claude Code extension registry. skills, subagents, slash commands, and hooks for engineering, git, testing, and security workflows. Distributed as a shadcn GitHub registry and as installable plugins.
Repo: KhaledSaeed18/dotclaude
Review code through three hostile personas - the Saboteur, the New Hire, and the Security Auditor - each required to find at least one issue. Use when a…
Review an API contract (REST or GraphQL) before or while it is implemented, checking resource naming, HTTP semantics, status codes, error shape, pagination,…
Process code-review feedback with technical rigour — understand each point, check it against the actual codebase, and respond with reasoning or implementation…
Author a new subagent for this repository end to end by scaffolding it with pnpm new, curating its tool allowlist, setting model, color, and memory in…
Author a new slash command for this repository end to end by scaffolding it with pnpm new, writing the frontmatter and argument handling, drafting the prompt…
Author a new Claude Code hook for this repository end to end by scaffolding it with pnpm new, writing the hook script and its settings.json wiring, documenting…