with one click
story-generator
스크린샷 비교용 Story 파일 자동 생성. "/story-gen", "스토리 생성" 등의 요청 시 사용
Menu
스크린샷 비교용 Story 파일 자동 생성. "/story-gen", "스토리 생성" 등의 요청 시 사용
React 코드 품질 분석. git diff 기반으로 변경된 코드의 클린 코드 점수 평가. "코드 리뷰", "품질 검사" 등의 요청 시 사용
AI 코드 생성 후 불필요한 코드 정리 스킬. git diff로 변경된 TS/JS 파일을 분석하여 사용되지 않는 코드를 자동 제거한다. 트리거: unused 코드 정리, 불필요한 코드 삭제, dead code 제거, 코드 클린업, AI 작업 후 정리 요청 시
순환 복잡도(Cyclomatic Complexity)가 높은 함수를 인간의 논리적 사고 흐름에 맞게 재구성하는 스킬. "복잡한 함수 정리해줘", "이 함수 읽기 어려워", "순환 복잡도 낮춰줘", "리팩토링 해줘" 등의 요청에 사용. 단순 코드 추출이 아닌 논리적 재구성을 수행하며, 성능보다 가독성과 수정 용이성을 우선시함.
Story 파일에서 컴포넌트 스크린샷 캡처. "/screenshot", "스크린샷 캡처" 등의 요청 시 사용
Deep reasoning skill using Claude Code's Agent Teams. Spawns multiple personas with enforced minimum depth, includes a challenge round where teammates critique each other, and iterates on low-confidence answers. Use when the user prefixes with "deep think", "딥씽크", "깊게 생각해", or requests thorough analysis. Best for complex architecture, debugging, algorithmic, or multi-domain problems. NOT for simple lookups. Requires: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
디자인 검증 자동화. Figma vs 구현 비교 리포트 생성. "/design-check", "디자인 검증" 등의 요청 시 사용
Based on SOC occupation classification
| name | story-generator |
| description | 스크린샷 비교용 Story 파일 자동 생성. "/story-gen", "스토리 생성" 등의 요청 시 사용 |
argument: $1
이 커맨드는 컴포넌트의 스크린샷 캡처용 Storybook Story 파일을 자동 생성합니다.
사용자로부터 컴포넌트 파일 경로를 받습니다.
src/shared/ui/card/Card.tsx, src/features/widget-builder/ui/ColumnHeader.tsx파일을 읽고 다음을 파악합니다:
컴포넌트와 같은 디렉토리 또는 인접 위치에 .stories.tsx 파일이 있는지 확인합니다.
컴포넌트를 분석하여 다음 중 하나로 분류합니다:
| 분류 | 조건 | 대응 |
|---|---|---|
| Simple | props만 필요 | 직접 렌더링 |
| MSW-dependent | API 호출 (useQuery 등) 사용 | MSW handler 설정 필요 |
| Provider-dependent | Context/Store 의존 | decorators로 Provider 래핑 |
파일 위치: __screenshots__/{ComponentName}.stories.tsx
import type { Meta, StoryObj } from '@storybook/react'
import { ComponentName } from '@/{path}'
const meta: Meta<typeof ComponentName> = {
title: 'Screenshots/{Layer}/{ComponentName}',
component: ComponentName,
parameters: { layout: 'centered' },
}
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
render: () => (
<div style={{ width: '{WIDTH}px', height: '{HEIGHT}px' }}>
<ComponentName {...props} />
</div>
),
}
import type { Meta, StoryObj } from '@storybook/react'
import { ComponentName } from '@/{path}'
// MSW handlers import
const meta: Meta<typeof ComponentName> = {
title: 'Screenshots/{Layer}/{ComponentName}',
component: ComponentName,
parameters: {
layout: 'centered',
msw: {
handlers: [
// 필요한 API mock handlers
],
},
},
}
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
render: () => (
<div style={{ width: '{WIDTH}px', height: '{HEIGHT}px' }}>
<ComponentName {...props} />
</div>
),
}
import type { Meta, StoryObj } from '@storybook/react'
import { ComponentName } from '@/{path}'
const meta: Meta<typeof ComponentName> = {
title: 'Screenshots/{Layer}/{ComponentName}',
component: ComponentName,
parameters: { layout: 'centered' },
decorators: [
Story => (
<SomeProvider>
<Story />
</SomeProvider>
),
],
}
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
render: () => (
<div style={{ width: '{WIDTH}px', height: '{HEIGHT}px' }}>
<ComponentName {...props} />
</div>
),
}
생성된 Story 파일이 올바른지 확인합니다:
@/ alias를 사용하는지 확인Screenshots/{Layer}/{ComponentName} 형식을 사용합니다.Shared, Features, Entities, Widgets, PagesScreenshots/{Layer}/{SubPath}/{ComponentName}
src/features/widget-builder/ui/ColumnHeader.tsx → Screenshots/Features/WidgetBuilder/ColumnHeader#storybook-root > * 선택자를 사용)div에 적절한 width/height를 지정합니다@/ 경로 alias를 사용합니다import { Card } from '@/shared/ui/card/Card';__screenshots__/ 디렉토리에 이미 같은 이름의 파일이 있으면 사용자에게 덮어쓸지 확인합니다Default를 사용합니다/story-gen src/shared/ui/card/Card.tsx
__screenshots__/Card.stories.tsximport type { Meta, StoryObj } from '@storybook/react'
import { Card } from '@/shared/ui/card/Card'
const meta: Meta<typeof Card> = {
title: 'Screenshots/Shared/Card',
component: Card,
parameters: { layout: 'centered' },
}
export default meta
type Story = StoryObj<typeof meta>
export const Default: Story = {
render: () => (
<div style={{ width: '384px' }}>
<Card>
<Card.Header>
<Card.Title>Card Title</Card.Title>
<Card.Description>Card description</Card.Description>
</Card.Header>
<Card.Content>
<p>Content area</p>
</Card.Content>
</Card>
</div>
),
}