MCP HubMCP Hub
返回技能列表

visual-regression

alekspetrov
更新于 Today
83 次查看
47
3
47
在 GitHub 上查看
测试testingautomationdesign

关于

This skill automatically sets up visual regression testing for Storybook projects with Chromatic, Percy, or BackstopJS. It detects your existing configuration and generates the necessary stories, config files, and CI/CD workflows. Use it when you need to add or configure visual testing by triggering phrases like "set up visual regression" or "add Chromatic tests."

快速安装

Claude Code

推荐
插件命令推荐
/plugin add https://github.com/alekspetrov/navigator
Git 克隆备选方式
git clone https://github.com/alekspetrov/navigator.git ~/.claude/skills/visual-regression

在 Claude Code 中复制并粘贴此命令以安装该技能

技能文档

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"
}
  1. 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: {},
  },
};
  1. 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
        with:
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
          exitZeroOnChanges: true
          onlyChanged: true

For GitLab CI: Add job to .gitlab-ci.yml For CircleCI: Add job to .circleci/config.yml


Step 5: Provide Setup Instructions

Output to user:

✅ Visual regression testing setup complete!

## Files Created/Modified

✅ {ComponentName}.stories.tsx (Storybook story with variants)
✅ chromatic.config.json (Chromatic configuration)
✅ .storybook/main.js (Added @chromatic-com/storybook addon)
✅ package.json (Added chromatic scripts)
✅ .github/workflows/chromatic.yml (CI workflow)

## Next Steps

### 1. Install Dependencies

```bash
npm install --save-dev chromatic @chromatic-com/storybook
```

### 2. Create Chromatic Project

1. Go to https://www.chromatic.com/start
2. Sign in with GitHub
3. Create new project
4. Copy project token

### 3. Add Secret to GitHub

1. Go to repository Settings → Secrets and variables → Actions
2. Create secret: `CHROMATIC_PROJECT_TOKEN`
3. Paste your project token

### 4. Update chromatic.config.json

Replace `<PROJECT_ID_PLACEHOLDER>` with your actual project ID from Chromatic dashboard.

### 5. Create Baseline

```bash
npm run chromatic
```

This captures the initial screenshots as your baseline.

### 6. Test Visual Regression

1. Make a visual change to ProfileCard
2. Commit and push
3. CI will run Chromatic automatically
4. Review changes in Chromatic dashboard

## Documentation

See `.agent/sops/testing/visual-regression-setup.md` for detailed workflow.

## Troubleshooting

**Storybook build fails**: Ensure all component dependencies are installed
**Chromatic upload fails**: Check project token in secrets
**No changes detected**: Chromatic only runs on changed stories (use `--force-rebuild` to test)

Predefined Functions Reference

vr_setup_validator.py

def detect_storybook_config(project_root: str) -> dict
def detect_vr_tool(project_root: str) -> str
def validate_component_path(component_path: str) -> dict
def check_dependencies(project_root: str) -> dict

Returns: Validation report with detected setup and missing dependencies

story_generator.py

def analyze_component(component_path: str, framework: str) -> dict
def generate_story(component_info: dict, template_path: str) -> str
def create_accessibility_tests(component_info: dict) -> str
def create_interaction_tests(component_info: dict) -> str

Returns: Generated story file content

chromatic_config_generator.py

def generate_chromatic_config(project_info: dict) -> str
def generate_storybook_config(existing_config: dict) -> str
def generate_package_scripts(existing_scripts: dict) -> dict
def generate_percy_config(project_info: dict) -> str  # Percy alternative
def generate_backstop_config(project_info: dict) -> str  # BackstopJS alternative

Returns: Configuration file contents as strings

ci_workflow_generator.py

def detect_ci_platform(project_root: str) -> str
def generate_github_workflow(project_info: dict) -> str
def generate_gitlab_ci(project_info: dict) -> str
def generate_circleci_config(project_info: dict) -> str

Returns: CI workflow file contents


Templates Reference

  • story-template.tsx.j2: React/TypeScript story template
  • story-template.vue.j2: Vue SFC story template
  • chromatic-config.json.j2: Chromatic configuration
  • percy-config.yml.j2: Percy configuration
  • github-workflow.yml.j2: GitHub Actions workflow
  • gitlab-ci.yml.j2: GitLab CI job
  • storybook-main.js.j2: Storybook addon configuration

Examples

Example 1: Simple Component

User: "Set up visual regression for ProfileCard component"

→ Detects: React, existing Storybook, no VR tool
→ Generates: ProfileCard.stories.tsx with 4 variants
→ Creates: Chromatic config, GitHub workflow
→ Outputs: Setup instructions

See: examples/simple-component-vr.md

Example 2: Full Design System

User: "Set up visual regression for entire design system"

→ Detects: React, Storybook, components in src/components/
→ Generates: Stories for all components (Button, Input, Card, etc.)
→ Creates: Chromatic config with design token validation
→ Outputs: Bulk setup instructions

See: examples/design-system-vr.md

Example 3: Existing Storybook

User: "Add Chromatic to existing Storybook"

→ Detects: Storybook v7, existing stories
→ Adds: @chromatic-com/storybook addon
→ Creates: Chromatic config, CI workflow
→ Preserves: Existing stories and configuration

See: examples/existing-storybook-vr.md


Integration with product-design Skill

After product-design generates implementation plan, suggest visual regression:

"Implementation plan created! Consider setting up visual regression testing:

  'Set up visual regression for {ComponentName}'

This ensures pixel-perfect implementation and prevents visual drift."

Tool Comparison

Chromatic (Recommended)

  • ✅ Purpose-built for Storybook
  • ✅ Component-focused testing
  • ✅ UI review workflow
  • ✅ Free tier: 5,000 snapshots/month
  • ❌ Requires cloud service

Percy

  • ✅ Multi-framework support
  • ✅ Responsive testing
  • ✅ Visual reviews
  • ❌ More expensive
  • ❌ Less Storybook-specific

BackstopJS

  • ✅ Open source, self-hosted
  • ✅ No cloud dependency
  • ✅ Free
  • ❌ More manual setup
  • ❌ Less automation

Default: Chromatic (best Storybook integration)


Error Handling

Component Not Found

Error: Component file not found at {path}

Please provide correct path:
  "Set up visual regression for src/components/ProfileCard.tsx"

Storybook Not Installed

Storybook not detected. Install first:

  npm install --save-dev @storybook/react @storybook/addon-essentials
  npx storybook init

Then retry: "Set up visual regression for ProfileCard"

Multiple VR Tools Detected

Multiple VR tools found: chromatic, percy

Which should I use?
  - "Use Chromatic for visual regression"
  - "Use Percy for visual regression"

Best Practices

  1. Start with key components: Don't test everything, focus on design system primitives
  2. Use interaction tests: Combine visual + functional testing
  3. Baseline on main: Always merge baselines to main branch
  4. Review changes: Don't auto-accept visual changes
  5. Test states: Capture hover, focus, error states
  6. Accessibility: Include a11y tests in all stories

Token Efficiency

Traditional approach (50k tokens):

  1. Read Storybook docs (20k)
  2. Read Chromatic docs (15k)
  3. Write stories manually (10k)
  4. Configure CI (5k)

With visual-regression skill (3k tokens):

  1. Skill auto-invokes (0 tokens)
  2. Instructions load (3k tokens)
  3. Functions execute (0 tokens)

Savings: 94% (47k tokens)


Version History

  • v3.3.0: Initial release with Chromatic support
  • Future: Percy, BackstopJS, Vue, Svelte support

Last Updated: 2025-10-21 Skill Type: Project-specific Generator: nav-skill-creator (self-improving)

GitHub 仓库

alekspetrov/navigator
路径: skills/visual-regression

相关推荐技能

content-collections

Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。

查看技能

creating-opencode-plugins

该Skill为开发者创建OpenCode插件提供指导,涵盖命令、文件、LSP等25+种事件类型。它详细说明了插件结构、事件API规范及JavaScript/TypeScript实现模式,帮助开发者构建事件驱动的模块。适用于需要拦截操作、扩展功能或自定义AI助手行为的插件开发场景。

查看技能

sglang

SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。

查看技能

evaluating-llms-harness

测试

该Skill通过60+个学术基准测试(如MMLU、GSM8K等)评估大语言模型质量,适用于模型对比、学术研究及训练进度追踪。它支持HuggingFace、vLLM和API接口,被EleutherAI等行业领先机构广泛采用。开发者可通过简单命令行快速对模型进行多任务批量评估。

查看技能