Best for
- Use this skill when adding stories for new components, updating existing stories, or fixing Storybook-related issues.
compozy/compozy/.agents/skills/storybook-stories/SKILL.md
Create, update, or refactor Storybook stories following the project's standard patterns. Use this skill when adding stories for new components, updating existing stories, or fixing Storybook-related issues.
Decision brief
This skill enforces consistent Storybook story creation patterns across the application. It ensures that all components have proper documentation, interactive examples, and follow the established project structure.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/compozy/compozy --skill ".agents/skills/storybook-stories"Inspect the Agent Skill "storybook-stories" from https://github.com/compozy/compozy/blob/19b8ae06c03954205295478f982c32f3658ca94e/.agents/skills/storybook-stories/SKILL.md at commit 19b8ae06c03954205295478f982c32f3658ca94e. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. File Location & Naming - Place story files in a stories/ folder within the same category folder as the component. - Example: src/components/base/accordion.tsx - src/components/base/stories/accordion.stories.tsx. - Use the Storybook instance that matches the layer: - packages/…
Base Components First: Always check @compozy/ui for existing components before creating new ones
Review the “Example Template” section in the pinned source before continuing.
Review the “Using Base UI Components from @compozy/ui” section in the pinned source before continuing.
Review the “Story for Base UI Component (from @compozy/ui)” section in the pinned source before continuing.
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 91/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 2,672 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
This skill enforces consistent Storybook story creation patterns across the application. It ensures that all components have proper documentation, interactive examples, and follow the established project structure.
<critical_component_usage> MANDATORY: Always Use Base UI Components from @compozy/ui
CRITICAL REQUIREMENTS:
@compozy/ui package (packages/ui)@.cursor/rules/react.mdc and @.cursor/rules/shadcn.mdcbg-background, text-foreground, border-border) instead of explicit colors@compozy/uibg-white, text-black) - always use design tokenstags: ["autodocs"] or enable Storybook autodocs on any story meta (packages/ui, web/src/components/ui, or web/src/systems/**). Use parameters.docs.description.component, JSDoc on stories, and the Docs addon manually if needed.Available Base Components:
All components from packages/ui/src/components are available via @compozy/ui:
packages/ui/src/index.ts for complete list of exportsDesign System Rules:
@.cursor/rules/react.mdc@.cursor/rules/shadcn.mdcbg-background, text-foreground, border-border, etc.
</critical_component_usage>File Location & Naming
stories/ folder within the same category folder as the component.src/components/base/accordion.tsx -> src/components/base/stories/accordion.stories.tsx.packages/ui/.storybook for packages/ui/src/components/*.stories.tsxweb/.storybook for web/src/components/ui/**/*.stories.tsx and web/src/systems/**/components/stories/*.stories.tsxComponent Imports
@compozy/uiimport { Button, Card, Dialog } from "@compozy/ui";packages/ui/src/index.ts to see available components before creating new onesMeta Configuration
components/custom/ComponentName or components/ui/ComponentName.component in the meta object.parameters.layout to "centered" by default.parameters.docs.description.component to describe the component.decorators if the component requires a specific container width or context.const meta: Meta<typeof Component> = { ... }tags: ["autodocs"] to meta (any layer). Autodocs inflates generated docs noise and is forbidden in this repo.web system stories may rely on the shared QueryClient + router + MSW decorators from web/.storybook/preview.ts; prefer those global decorators over per-story provider duplication.Story Definition
type Story = StoryObj<typeof meta>;.Default story as the primary example.args property, even if empty: args: {}systems/<name>/<ComponentName>.Render vs Args
render functions for compound components (like Accordion, Dialog, Select) that require children composition.args for simple components (like Button, Badge) where props define the variation.render, include args: {} propertyDesign System Compliance
bg-background, text-foreground, border-borderbg-white, text-black, border-gray-200@.cursor/rules/shadcn.mdcimport type { Meta, StoryObj } from "@storybook/react";
import { Button, Card, CardHeader, CardTitle, CardContent } from "@compozy/ui";
import { MyCustomComponent } from "./my-custom-component";
const meta: Meta<typeof MyCustomComponent> = {
title: "components/custom/MyCustomComponent",
component: MyCustomComponent,
parameters: {
layout: "centered",
docs: {
description: {
component: "A custom component that composes base UI components from @compozy/ui.",
},
},
},
// Optional decorator using design tokens
decorators: [
Story => (
<div className="w-[400px] p-4 bg-background border border-border rounded-lg">
<Story />
</div>
),
],
};
export default meta;
type Story = StoryObj<typeof meta>;
/**
* Default usage showing the standard behavior
* Uses base Button and Card components from @compozy/ui
*/
export const Default: Story = {
args: {},
render: () => (
<Card>
<CardHeader>
<CardTitle>My Custom Component</CardTitle>
</CardHeader>
<CardContent>
<MyCustomComponent>
<Button variant="default">Action</Button>
</MyCustomComponent>
</CardContent>
</Card>
),
};
/**
* Variation with specific props
* All styling uses design tokens (bg-background, text-foreground, etc.)
*/
export const WithVariant: Story = {
args: {},
render: () => (
<div className="bg-card border border-border rounded-lg p-4">
<MyCustomComponent variant="secondary">
<Button variant="outline">Secondary Action</Button>
</MyCustomComponent>
</div>
),
};
import type { Meta, StoryObj } from "@storybook/react";
import { Button } from "@compozy/ui";
const meta: Meta<typeof Button> = {
title: "components/ui/Button",
component: Button,
parameters: {
layout: "centered",
docs: {
description: {
component: "A button component with multiple variants and sizes.",
},
},
},
};
export default meta;
type Story = StoryObj<typeof meta>;
/**
* Default button with standard styling
*/
export const Default: Story = {
args: {
children: "Button",
variant: "default",
size: "default",
},
};
/**
* All variants using design tokens
*/
export const AllVariants: Story = {
args: {},
render: () => (
<div className="flex flex-wrap gap-4 bg-background p-4 rounded-lg">
<Button variant="default">Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="muted">Muted</Button>
</div>
),
};
Do not use Storybook autodocs. Never set tags: ["autodocs"] on meta for packages/ui, web/src/components/ui, or web/src/systems/** stories. Rationale: autodocs-generated pages add noise and duplicate what we already express with concise stories, parameters.docs.description.component, and per-story JSDoc. If a component needs richer prose, write it in the description fields and keep the canvas as the source of truth.
Story Count Guidelines:
@compozy/ui for existing components before creating new ones@compozy/uibg-background, text-foreground, etc.) instead of explicit colorsrender function sets up the component in a way that allows interaction (e.g., not force-controlled unless necessary)meta: const meta: Meta<typeof Component>args: {} in all stories, even when using custom render functions@.cursor/rules/react.mdc@.cursor/rules/shadcn.mdc❌ Creating components from scratch when base components exist:
// ❌ BAD: Creating a button from scratch
export const Bad: Story = {
render: () => <button className="bg-blue-500 text-white px-4 py-2 rounded">Click me</button>,
};
// ✅ GOOD: Using base Button from @compozy/ui
import { Button } from "@compozy/ui";
export const Good: Story = {
args: {},
render: () => <Button variant="default">Click me</Button>,
};
❌ Enabling autodocs on meta:
// ❌ BAD: autodocs tag (forbidden in this repo)
const meta: Meta<typeof Button> = {
title: "ui/Button",
component: Button,
tags: ["autodocs"],
};
// ✅ GOOD: no autodocs tag; describe the component in parameters.docs
const meta: Meta<typeof Button> = {
title: "ui/Button",
component: Button,
parameters: {
layout: "centered",
docs: {
description: {
component: "Primary action button with variants and sizes.",
},
},
},
};
❌ Using explicit colors instead of design tokens:
// ❌ BAD: Using explicit colors
<div className="bg-white text-black border-gray-200">
// ✅ GOOD: Using design tokens
<div className="bg-background text-foreground border-border">
❌ Missing args property:
// ❌ BAD: Missing args property
export const Bad: Story = {
render: () => <Button>Click</Button>,
};
// ✅ GOOD: Including args property
export const Good: Story = {
args: {},
render: () => <Button>Click</Button>,
};
❌ Missing explicit type annotation:
// ❌ BAD: Type inference
const meta = {
title: "Components/Button",
component: Button,
} satisfies Meta<typeof Button>;
// ✅ GOOD: Explicit type annotation
const meta: Meta<typeof Button> = {
title: "Components/Button",
component: Button,
};
❌ Over-engineering stories with unnecessary examples:
// ❌ BAD: Too many stories with similar variations
export const Default: Story = { ... };
export const WithIcon: Story = { ... };
export const WithIconLeft: Story = { ... };
export const WithIconRight: Story = { ... };
export const WithLongText: Story = { ... };
export const WithShortText: Story = { ... };
export const Disabled: Story = { ... };
export const Loading: Story = { ... };
export const WithTooltip: Story = { ... };
export const InCard: Story = { ... };
export const InDialog: Story = { ... };
// ... 10+ stories for a simple button
// ✅ GOOD: Concise, focused stories
export const Default: Story = {
args: {
children: "Button",
variant: "default",
},
};
export const Variants: Story = {
args: {},
render: () => (
<div className="flex gap-2">
<Button variant="default">Default</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
</div>
),
};
export const Disabled: Story = {
args: {
children: "Disabled",
disabled: true,
},
};
// Only 3 stories covering essential use cases
❌ Over-complicated mock data or scenarios:
// ❌ BAD: Unnecessarily complex mock data
const mockUsers = [
{ id: "1", name: "John Doe", email: "[email protected]", role: "admin", avatar: "...", lastLogin: "...", permissions: [...], metadata: {...} },
{ id: "2", name: "Jane Smith", email: "[email protected]", role: "user", avatar: "...", lastLogin: "...", permissions: [...], metadata: {...} },
// ... 10 more users with full data
];
// ✅ GOOD: Minimal, realistic data
const mockUsers = [
{ id: "1", name: "John Doe", email: "[email protected]" },
{ id: "2", name: "Jane Smith", email: "[email protected]" },
];
Frequently asked questions
This skill enforces consistent Storybook story creation patterns across the application. It ensures that all components have proper documentation, interactive examples, and follow the established project structure.
The source record exposes this install command: npx skills add https://github.com/compozy/compozy --skill ".agents/skills/storybook-stories". Inspect the command and pinned source before running it.
Alternatives
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
coreyhaines31/marketingskills
When the user wants to reduce churn, build cancellation flows, set up save offers, recover failed payments, or implement retention strategies. Also use when the user mentions 'churn,' 'cancel flow,' 'offboarding,' 'save offer,' 'dunning,' 'failed payment recovery,' 'win-back,' 'retention,' 'exit survey,' 'pause subscription,' 'involuntary churn,' 'people keep canceling,' 'churn rate is too high,' 'how do I keep users,' or 'customers are leaving.' Use this whenever someone is losing subscribers o
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance
oaustegard/claude-skills
Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre