skills/frontend-qa/regression-test-generator/SKILL.md
Use when a verified fix needs a regression test — "write a test for this fix," "generate regression test," or "add test coverage for this bug." Auto-detects project test conventions, routes to Vitest+RTL or Playwright based on component type (sync vs async server), generates targeted tests with anti-brittleness constraints, and annotates coverage boundaries. Not for diagnosing bugs, applying fixes, or writing feature tests — use ui-bug-investigator, component-fix-and-verify, or manual test authoring respectively.
npx skillsauth add dtsong/my-claude-setup regression-test-generatorInstall 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.
Generate a targeted regression test for a verified fix — auto-detect conventions, route to the correct test framework, annotate coverage boundaries.
__tests__/ or root tests/ directory)vitest, jest, playwright) — no other shell commandsaffectedFiles, diff, diagnosis_ref, notAddressedrootCause and issueClassification.. or shell metacharacters.vitest, jest, playwright) with the generated test file path. No user-provided strings are interpolated into commands.Copy this checklist and update as you complete each step:
Progress:
- [ ] Step 1: Read the FixResult
- [ ] Step 2: Classify Component Type
- [ ] Step 3: Detect Project Conventions
- [ ] Step 4: Generate the Test
- [ ] Step 5: Place the Test File
- [ ] Step 6: Validate the Test
Note: If you've lost context of previous steps (e.g., after context compaction), check the progress checklist above. Resume from the last unchecked item. Re-read relevant reference files if needed.
Extract from the upstream FixResult:
affectedFiles — the files that were changeddiff — what changed (the fix)diagnosis_ref — the original bug descriptionnotAddressed — related issues not covered by the fixDetermine the routing target. This is a hard rule:
| Component type | Detected by | Route to |
|---|---|---|
| Sync client component | "use client" directive, uses hooks, event handlers | Vitest + RTL |
| Sync server component | No "use client", no hooks, no async | Vitest + RTL |
| Async server component | async function Component(), await in body, fetch() / cookies() / headers() | Playwright E2E |
| Mixed (client wrapper around async server) | Both patterns present | Playwright E2E for the page, Vitest+RTL for the client wrapper |
If async server component → read references/playwright-patterns.md.
Otherwise → read references/vitest-rtl-patterns.md.
Scan for existing test files near the affected component:
**/*.test.{ts,tsx}, **/*.spec.{ts,tsx}, **/__tests__/** in the same package@testing-library/react vs custom test-utils wrapperrender() vs custom render with providersgetByRole vs getByTestId vs getByText__tests__/ or .test.tsx next to component) vs root tests/ dirComponentName.test.tsx vs component-name.spec.tsx.test.tsx naming.Write the test file following detected conventions. Every generated test must include:
Header annotations (mandatory):
/**
* Regression test for: [bug title from DiagnosisReport]
* Bug: [1-sentence defect description]
* Fix: [1-sentence fix description]
*
* GUARDS AGAINST: [specific scenario this test catches]
* DOES NOT GUARD AGAINST: [related untested scenarios from notAddressed]
*/
Test structure:
describe('[ComponentName] - regression: [bug-slug]', () => {
it('should [expected behavior that was broken]', () => {
// Arrange: conditions that triggered the bug
// Act: user action that exposed the bug
// Assert: correct behavior
});
});
Anti-brittleness rules (hard constraints):
getByRole with accessible name: getByRole('button', { name: /submit/i })screen object, not destructured render returnsquerySelector('.a > .b'))Follow the convention detected in Step 3:
tests/ pattern: mirror the source directory structure.test.tsx vs .spec.tsx)Show the full file path and contents. Pause: "Write this test file?"
After writing the test file, run it once:
# Vitest
npx vitest --run --reporter=verbose <test-file>
# Jest
npx jest <test-file> --verbose
# Playwright
npx playwright test <test-file> --reporter=list
Report result:
RegressionTest:
version: "1.0"
fix_ref: "[FixResult ID]"
testFile: "path/to/ComponentName.test.tsx"
framework: "vitest-rtl | jest-rtl | playwright"
guardsAgainst: "specific regression scenario"
doesNotGuardAgainst: ["untested scenario 1", "untested scenario 2"]
conventions:
source: "detected | defaults"
nearestTestFile: "path or null"
result: { status: "pass | fail", error: "message or null" }
Pass the RegressionTest artifact path to qa-coordinator. The result contains testFile, framework, guardsAgainst, and doesNotGuardAgainst fields. This is the final phase of the QA pipeline.
| Path | Load Condition | Content Summary |
|------|---------------|-----------------|
| references/vitest-rtl-patterns.md | Step 2, sync client or server component | Query priority, rendering patterns, assertion patterns, anti-patterns |
| references/playwright-patterns.md | Step 2, async server component or mixed | Test structure, locator priority, common regression patterns, API mocking |
testing
Use to convert a Word .docx file to PDF and/or verify its page count. Triggers on: converting docx to pdf, rendering a document, checking how many pages a docx produces, or asserting a page-count constraint (e.g. a resume must stay 2 pages). Wraps LibreOffice headless conversion.
development
Security audit checklist for web applications. Use when reviewing, auditing, or hardening a web app's security posture. Covers rate limiting, auth headers, IP blocking, CORS, security middleware, input validation, file upload limits, ORM usage, and password hashing. Triggers on requests like "review security", "harden this app", "security audit", "check for vulnerabilities", or when building/reviewing API endpoints.
development
Interactive wizard to craft effective prompts using Claude Code best practices
tools
Use when batch labeling, prioritizing, and assigning GitHub issues during triage sessions.