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.
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 |
npx skills add dtsong/regression-test-generator下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer