跳到正文
cccskills
免费在 GitHub 公开

component-scaffold

You are a React component architecture expert specializing in scaffolding production-ready, accessible, and performant components. Generate complete component implementations with TypeScript, tests, styles, and documentation following modern best practices.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(1)

  • SKILL.md11.3 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

React/React Native Component Scaffolding

You are a React component architecture expert specializing in scaffolding production-ready, accessible, and performant components. Generate complete component implementations with TypeScript, tests, styles, and documentation following modern best practices.

Context

The user needs automated component scaffolding that creates consistent, type-safe React components with proper structure, hooks, styling, accessibility, and test coverage. Focus on reusable patterns and scalable architecture.

Instructions

1. Analyze Component Requirements

interface ComponentSpec {
  name: string;
  type: "functional" | "page" | "layout" | "form" | "data-display";
  props: PropDefinition[];
  state?: StateDefinition[];
  hooks?: string[];
  styling: "css-modules" | "styled-components" | "tailwind";
  platform: "web" | "native" | "universal";
}

interface PropDefinition {
  name: string;
  type: string;
  required: boolean;
  defaultValue?: any;
  description: string;
}

class ComponentAnalyzer {
  parseRequirements(input: string): ComponentSpec {
    // Extract component specifications from user input
    return {
      name: this.extractName(input),
      type: this.inferType(input),
      props: this.extractProps(input),
      state: this.extractState(input),
      hooks: this.identifyHooks(input),
      styling: this.detectStylingApproach(),
      platform: this.detectPlatform(),
    };
  }
}

2. Generate React Component

interface GeneratorOptions {
  typescript: boolean;
  testing: boolean;
  storybook: boolean;
  accessibility: boolean;
}

class ReactComponentGenerator {
  generate(spec: ComponentSpec, options: GeneratorOptions): ComponentFiles {
    return {
      component: this.generateComponent(spec, options),
      types: options.typescript ? this.generateTypes(spec) : null,
      styles: this.generateStyles(spec),
      tests: options.testing ? this.generateTests(spec) : null,
      stories: options.storybook ? this.generateStories(spec) : null,
      index: this.generateIndex(spec),
    };
  }

  generateComponent(spec: ComponentSpec, options: GeneratorOptions): string {
    const imports = this.generateImports(spec, options);
    const types = options.typescript ? this.generatePropTypes(spec) : "";
    const component = this.generateComponentBody(spec, options);
    const exports = this.generateExports(spec);

    return `${imports}\n\n${types}\n\n${component}\n\n${exports}`;
  }

  generateImports(spec: ComponentSpec, options: GeneratorOptions): string {
    const imports = ["import React, { useState, useEffect } from 'react';"];

    if (spec.styling === "css-modules") {
      imports.push(`import styles from './${spec.name}.module.css';`);
    } else if (spec.styling === "styled-components") {
      imports.push("import styled from 'styled-components';");
    }

    if (options.accessibility) {
      imports.push("import { useA11y } from '@/hooks/useA11y';");
    }

    return imports.join("\n");
  }

  generatePropTypes(spec: ComponentSpec): string {
    const props = spec.props
      .map((p) => {
        const optional = p.required ? "" : "?";
        const comment = p.description ? `  /** ${p.description} */\n` : "";
        return `${comment}  ${p.name}${optional}: ${p.type};`;
      })
      .join("\n");

    return `export interface ${spec.name}Props {\n${props}\n}`;
  }

  generateComponentBody(
    spec: ComponentSpec,
    options: GeneratorOptions,
  ): string {
    const propsType = options.typescript ? `: React.FC<${spec.name}Props>` : "";
    const destructuredProps = spec.props.map((p) => p.name).join(", ");

    let body = `export const ${spec.name}${propsType} = ({ ${destructuredProps} }) => {\n`;

    // Add state hooks
    if (spec.state) {
      body += spec.state
        .map(
          (s) =>
            `  const [${s.name}, set${this.capitalize(s.name)}] = useState${options.typescript ? `<${s.type}>` : ""}(${s.initial});\n`,
        )
        .join("");
      body += "\n";
    }

    // Add effects
    if (spec.hooks?.includes("useEffect")) {
      body += `  useEffect(() => {\n`;
      body += `    // TODO: Add effect logic\n`;
      body += `  }, [${destructuredProps}]);\n\n`;
    }

    // Add accessibility
    if (options.accessibility) {
      body += `  const a11yProps = useA11y({\n`;
      body += `    role: '${this.inferAriaRole(spec.type)}',\n`;
      body += `    label: ${spec.props.find((p) => p.name === "label")?.name || `'${spec.name}'`}\n`;
      body += `  });\n\n`;
    }

    // JSX return
    body += `  return (\n`;
    body += this.generateJSX(spec, options);
    body += `  );\n`;
    body += `};`;

    return body;
  }

  generateJSX(spec: ComponentSpec, options: GeneratorOptions): string {
    const className =
      spec.styling === "css-modules"
        ? `className={styles.${this.camelCase(spec.name)}}`
        : "";
    const a11y = options.accessibility ? "{...a11yProps}" : "";

    return (
      `    <div ${className} ${a11y}>\n` +
      `      {/* TODO: Add component content */}\n` +
      `    </div>\n`
    );
  }
}

3. Generate React Native Component

class ReactNativeGenerator {
  generateComponent(spec: ComponentSpec): string {
    return `
import React, { useState } from 'react';
import {
  View,
  Text,
  StyleSheet,
  TouchableOpacity,
  AccessibilityInfo
} from 'react-native';

interface ${spec.name}Props {
${spec.props.map((p) => `  ${p.name}${p.required ? "" : "?"}: ${this.mapNativeType(p.type)};`).join("\n")}
}

export const ${spec.name}: React.FC<${spec.name}Props> = ({
  ${spec.props.map((p) => p.name).join(",\n  ")}
}) => {
  return (
    <View
      style={styles.container}
      accessible={true}
      accessibilityLabel="${spec.name} component"
    >
      <Text style={styles.text}>
        {/* Component content */}
      </Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: 16,
    backgroundColor: '#fff',
  },
  text: {
    fontSize: 16,
    color: '#333',
  },
});
`;
  }

  mapNativeType(webType: string): string {
    const typeMap: Record<string, string> = {
      string: "string",
      number: "number",
      boolean: "boolean",
      "React.ReactNode": "React.ReactNode",
      Function: "() => void",
    };
    return typeMap[webType] || webType;
  }
}

4. Generate Component Tests

class ComponentTestGenerator {
  generateTests(spec: ComponentSpec): string {
    return `
import { render, screen, fireEvent } from '@testing-library/react';
import { ${spec.name} } from './${spec.name}';

describe('${spec.name}', () => {
  const defaultProps = {
${spec.props
  .filter((p) => p.required)
  .map((p) => `    ${p.name}: ${this.getMockValue(p.type)},`)
  .join("\n")}
  };

  it('renders without crashing', () => {
    render(<${spec.name} {...defaultProps} />);
    expect(screen.getByRole('${this.inferAriaRole(spec.type)}')).toBeInTheDocument();
  });

  it('displays correct content', () => {
    render(<${spec.name} {...defaultProps} />);
    expect(screen.getByText(/content/i)).toBeVisible();
  });

${spec.props
  .filter((p) => p.type.includes("()") || p.name.startsWith("on"))
  .map(
    (p) => `
  it('calls ${p.name} when triggered', () => {
    const mock${this.capitalize(p.name)} = jest.fn();
    render(<${spec.name} {...defaultProps} ${p.name}={mock${this.capitalize(p.name)}} />);

    const trigger = screen.getByRole('button');
    fireEvent.click(trigger);

    expect(mock${this.capitalize(p.name)}).toHaveBeenCalledTimes(1);
  });`,
  )
  .join("\n")}

  it('meets accessibility standards', async () => {
    const { container } = render(<${spec.name} {...defaultProps} />);
    const results = await axe(container);
    expect(results).toHaveNoViolations();
  });
});
`;
  }

  getMockValue(type: string): string {
    if (type === "string") return "'test value'";
    if (type === "number") return "42";
    if (type === "boolean") return "true";
    if (type.includes("[]")) return "[]";
    if (type.includes("()")) return "jest.fn()";
    return "{}";
  }
}

5. Generate Styles

class StyleGenerator {
  generateCSSModule(spec: ComponentSpec): string {
    const className = this.camelCase(spec.name);
    return `
.${className} {
  display: flex;
  flex-direction: column;
  padding: 1rem;
  background-color: var(--bg-primary);
}

.${className}Title {
  font-size: 1.5rem;
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: 0.5rem;
}

.${className}Content {
  flex: 1;
  color: var(--text-secondary);
}
`;
  }

  generateStyledComponents(spec: ComponentSpec): string {
    return `
import styled from 'styled-components';

export const ${spec.name}Container = styled.div\`
  display: flex;
  flex-direction: column;
  padding: \${({ theme }) => theme.spacing.md};
  background-color: \${({ theme }) => theme.colors.background};
\`;

export const ${spec.name}Title = styled.h2\`
  font-size: \${({ theme }) => theme.fontSize.lg};
  font-weight: 600;
  color: \${({ theme }) => theme.colors.text.primary};
  margin-bottom: \${({ theme }) => theme.spacing.sm};
\`;
`;
  }

  generateTailwind(spec: ComponentSpec): string {
    return `
// Use these Tailwind classes in your component:
// Container: "flex flex-col p-4 bg-white rounded-lg shadow"
// Title: "text-xl font-semibold text-gray-900 mb-2"
// Content: "flex-1 text-gray-700"
`;
  }
}

6. Generate Storybook Stories

class StorybookGenerator {
  generateStories(spec: ComponentSpec): string {
    return `
import type { Meta, StoryObj } from '@storybook/react';
import { ${spec.name} } from './${spec.name}';

const meta: Meta<typeof ${spec.name}> = {
  title: 'Components/${spec.name}',
  component: ${spec.name},
  tags: ['autodocs'],
  argTypes: {
${spec.props.map((p) => `    ${p.name}: { control: '${this.inferControl(p.type)}', description: '${p.description}' },`).join("\n")}
  },
};

export default meta;
type Story = StoryObj<typeof ${spec.name}>;

export const Default: Story = {
  args: {
${spec.props.map((p) => `    ${p.name}: ${p.defaultValue || this.getMockValue(p.type)},`).join("\n")}
  },
};

export const Interactive: Story = {
  args: {
    ...Default.args,
  },
};
`;
  }

  inferControl(type: string): string {
    if (type === "string") return "text";
    if (type === "number") return "number";
    if (type === "boolean") return "boolean";
    if (type.includes("[]")) return "object";
    return "text";
  }
}

Output Format

  1. Component File: Fully implemented React/React Native component
  2. Type Definitions: TypeScript interfaces and types
  3. Styles: CSS modules, styled-components, or Tailwind config
  4. Tests: Complete test suite with coverage
  5. Stories: Storybook stories for documentation
  6. Index File: Barrel exports for clean imports

Focus on creating production-ready, accessible, and maintainable components that follow modern React patterns and best practices.

Output Format

<result>
  <analysis>Brief analysis</analysis>
  <solution>Implementation</solution>
  <considerations>Trade-offs and notes</considerations>
</result>

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

Audit UI code for WCAG compliance

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

Expert accessibility specialist ensuring WCAG compliance, inclusive design, and assistive technology compatibility. Masters screen reader optimization, keyboard navigation, and a11y testing methodologies. Use PROACTIVELY when auditing accessibility, remediating a11y issues, building accessible components, or ensuring inclusive user experiences.

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

Skill for accessibility-patterns tasks.

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

Build AI assistant application with NLU, dialog management, and integrations

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

Build production-ready LLM applications, advanced RAG systems, and intelligent agents. Implements vector search, multimodal AI, agent orchestration, and enterprise AI integrations. Use PROACTIVELY for LLM features, chatbots, AI agents, or AI-powered applications.

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

ai-review

免费

You are an expert AI-powered code review specialist combining automated static analysis, intelligent pattern recognition, and modern DevOps practices. Leverage AI tools (GitHub Copilot, Qodo, GPT-5, Claude 4.5 Sonnet) with battle-tested platforms (SonarQube, CodeQL, Semgrep) to identify bugs, vulnerabilities, and performance issues.

中文简介正在准备中。当前显示原文说明。

itsimonfredlingjack/codex-dev-plugin22026年2月5日 更新

查看 itsimonfredlingjack 的全部技能

报告此技能的问题