用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill story-generator命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | story-generator |
| description | 스크린샷 비교용 Story 파일 자동 생성. "/story-gen", "스토리 생성" 등의 요청 시 사용 Use when this capability is needed. |
| metadata | {"author":"gihwan-dev"} |
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 {} />
),
}
생성된 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>
Content area
),
}
Converted and distributed by TomeVault — claim your Tome and manage your conversions.