Skip to content
Agent Orchestration
Skill

/visual-regression

Setup visual regression testing with Storybook stories, configuration, and CI/CD workflows. Supports Chromatic, Percy, BackstopJS. Auto-invoke when user says "set up visual regression", "add Chromatic tests", "add screenshot testing", or "set up Percy".

From plugin
navigator
35531 skills6 agents1 hook

Claude Code

$ npx -y skills add qf-studio/navigator --skill visual-regression --agent claude-code

SKILL.md

visual-regression.SKILL.md
name: visual-regression
description: Setup visual regression testing with Storybook stories, configuration, and CI/CD workflows. Supports Chromatic, Percy, BackstopJS. Auto-invoke when user says "set up visual regression", "add Chromatic tests", "add screenshot testing", or "set up Percy".
allowed-tools: Read, Write, Bash, Glob
version: 1.0.0
triggers:
  - "set up visual regression"
  - "add chromatic tests"
  - "create visual tests"
  - "configure visual regression"
  - "add screenshot testing"
  - "set up percy"
  - "add backstopjs"

Visual Regression Testing Setup Skill

---

Skill Purpose

Generate complete visual regression testing setup with Storybook stories, configuration files, and CI/CD workflows.

**Supports**: Chromatic, Percy, BackstopJS **Frameworks**: React, Vue, Svelte (TypeScript/JavaScript) **CI/CD**: GitHub Actions, GitLab CI, CircleCI

---

What This Skill Does

1. **Detects existing setup**: Storybook version, VR tool, CI platform 2. **Validates component**: Extract props, variants, states 3. **Generates stories**: Complete `.stories.tsx` with all variants 4. **Creates config files**: Chromatic, Percy, or BackstopJS configuration 5. **Sets up CI/CD**: Auto-generate workflow files 6. **Provides instructions**: Next steps for API tokens, first baseline

---

Workflow

Step 1: Validate Project Setup

**Execute**: `vr_setup_validator.py`

**Check**:

  • Framework (React/Vue/Svelte) from package.json
  • Existing Storybook config (.storybook/ directory)
  • Existing VR tool (chromatic, percy, backstopjs in dependencies)
  • CI platform (.github/, .gitlab-ci.yml, .circleci/)
  • Component file exists and is valid

**Output**:

{
  "framework": "react",
  "storybook_version": "7.6.0",
  "vr_tool": "chromatic",
  "ci_platform": "github",
  "component": {
    "path": "src/components/ProfileCard.tsx",
    "name": "ProfileCard",
    "props": [...],
    "valid": true
  },
  "dependencies": {
    "installed": ["@storybook/react", "@storybook/addon-essentials"],
    "missing": ["chromatic", "@chromatic-com/storybook"]
  }
}

**If Storybook not found**: Ask user if they want to install Storybook first, provide setup instructions.

**If multiple VR tools found**: Ask user which to use (Chromatic recommended).

---

Step 2: Generate Storybook Stories

**Execute**: `story_generator.py`

**Process**: 1. Parse component file (TypeScript/JSX/Vue SFC) 2. Extract props, prop types, default values 3. Identify variants (size, variant, disabled, etc.) 4. Generate story file from template 5. Add accessibility tests (@storybook/addon-a11y) 6. Add interaction tests (if @storybook/test available)

**Template**: `templates/story-template.tsx.j2`

**Example output** (`ProfileCard.stories.tsx`):

import type { Meta, StoryObj } from '@storybook/react';
import { ProfileCard } from './ProfileCard';

const meta = {
  title: 'Components/ProfileCard',
  component: ProfileCard,
  parameters: {
    layout: 'centered',
  },
  tags: ['autodocs'],
  argTypes: {
    size: { control: 'select', options: ['sm', 'md', 'lg'] },
    variant: { control: 'select', options: ['default', 'compact'] },
  },
} satisfies Meta<typeof ProfileCard>;

export default meta;
type Story = StoryObj<typeof meta>;

export const Default: Story = {
  args: {
    name: 'John Doe',
    avatar: 'https://example.com/avatar.jpg',
    bio: 'Software Engineer',
    size: 'md',
    variant: 'default',
  },
};

export const Small: Story = {
  args: {
    ...Default.args,
    size: 'sm',
  },
};

export const Large: Story = {
  args: {
    ...Default.args,
    size: 'lg',
  },
};

export const Compact: Story = {
  args: {
    ...Default.args,
    variant: 'compact',
  },
};

// Accessibility test
Default.parameters = {
  a11y: {
    config: {
      rules: [
        { id: 'color-contrast', enabled: true },
        { id: 'label', enabled: true },
      ],
    },
  },
};

**Write to**: `{component_directory}/{ComponentName}.stories.tsx`

---

Step 3: Generate Configuration Files

**Execute**: `chromatic_config_generator.py` (or percy/backstop equivalent)

For Chromatic:

**Generate 3 files**:

1. **chromatic.config.json**:

{
  "projectId": "<PROJECT_ID_PLACEHOLDER>",
  "buildScriptName": "build-storybook",
  "exitZeroOnChanges": true,
  "exitOnceUploaded": true,
  "onlyChanged": true,
  "externals": ["public/**"],
  "skip": "dependabot/**",
  "ignoreLastBuildOnBranch": "main"
}

2. **Update .storybook/main.js** (add addon):

module.exports = {
  stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: [
    '@storybook/addon-links',
    '@storybook/addon-essentials',
    '@chromatic-com/storybook', // ← Added
    '@storybook/addon-interactions',
  ],
  framework: {
    name: '@storybook/react-vite',
    options: {},
  },
};

3. **Update package.json** (add scripts):

{
  "scripts": {
    "chromatic": "npx chromatic",
    "chromatic:ci": "npx chromatic --exit-zero-on-changes"
  }
}

**For Percy**: Generate `.percy.yml` instead **For BackstopJS**: Generate `backstop.config.js` instead

---

Step 4: Generate CI/CD Workflow

**Execute**: `ci_workflow_generator.py`

**Detect CI platform** from existing files:

  • `.github/workflows/` → GitHub Actions
  • `.gitlab-ci.yml` → GitLab CI
  • `.circleci/config.yml` → CircleCI
  • None → Ask user, default to GitHub Actions

GitHub Actions Example:

**Generate**: `.github/workflows/chromatic.yml`

name: Visual Regression Tests

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  chromatic:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # Required for Chromatic

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run Chromatic
        uses: chromaui/action@latest
Read more
@qf-studio
Ships withnavigator

Finish What You Start Sessions that last. AI that learns. Features that ship.

35531 skills6 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
355
Star history of qf-studio/navigator on GitHub, a chart by star-history.com

Other skills on navigator.

backend-endpoint

backend-endpoint

Create REST/GraphQL API endpoint with validation, error handling, and tests. Auto-invoke when user says "add endpoint", "create…

@qf-studio@qf-studioInstall Skill
backend-test

backend-test

Generate backend tests (unit, integration, mocks) for existing code. Auto-invoke when user says "write test for", "add test",…

@qf-studio@qf-studioInstall Skill
database-migration

database-migration

Create database migration with schema changes and rollback. Auto-invoke when user says "create migration", "add table", "modify…

@qf-studio@qf-studioInstall Skill
frontend-component

frontend-component

Create React/Vue component with TypeScript, tests, and styles. Auto-invoke when user says "create component", "add component",…

@qf-studio@qf-studioInstall Skill
frontend-test

frontend-test

Generate frontend component tests (React Testing Library, Vue Test Utils, snapshot) for existing components. Auto-invoke when…

@qf-studio@qf-studioInstall Skill
nav-brief

nav-brief

Render a one-screen intent brief (Goal/Scope/Approach/Limits/Verify/Won't-do/Contradiction) before implementing ambiguous…

@qf-studio@qf-studioInstall Skill

More skills from other plugins.

1password

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

clawdis13d393k
@steipete@steipeteInstall Skill
computer-use

computer-use

Drives the GUI of a visible local app window through `orca computer`: accessibility tree, clicks, typing, menus, dialogs, and…

orca13d111k
@stablyai@stablyaiInstall Skill
agentmail

agentmail

Use your assigned AgentMail inbox to read email tasks, explicitly send or reply, and check delivery. Provided automatically by…

paperclip13d109k
@paperclipai@paperclipaiInstall Skill
adr-create

adr-create

Create a new Architecture Decision Record with sequential numbering and AgentDB registration

@ruvnet@ruvnetInstall Skill

Questions about visual-regression.

Which coding agents can use visual-regression?
visual-regression installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.