cfsa-antigravity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,923 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: storybook
|
|
3
|
+
description: "Comprehensive Storybook component development guide covering Component Story Format (CSF3), args and argTypes, decorators, play functions for interaction testing, visual regression testing with Chromatic, auto-docs, MDX documentation, addons (a11y, viewport, controls, actions), composition, design systems, testing with @storybook/test, portable stories, MSW integration, CI pipeline, and performance optimization. Use when building component libraries, design systems, or interactive documentation."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Storybook Component Development
|
|
8
|
+
|
|
9
|
+
## 1. Component Story Format (CSF3)
|
|
10
|
+
|
|
11
|
+
### Basic Story
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// Button.stories.tsx
|
|
15
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
16
|
+
import { Button } from './Button';
|
|
17
|
+
|
|
18
|
+
const meta = {
|
|
19
|
+
title: 'Components/Button',
|
|
20
|
+
component: Button,
|
|
21
|
+
tags: ['autodocs'],
|
|
22
|
+
parameters: {
|
|
23
|
+
layout: 'centered',
|
|
24
|
+
},
|
|
25
|
+
} satisfies Meta<typeof Button>;
|
|
26
|
+
|
|
27
|
+
export default meta;
|
|
28
|
+
type Story = StoryObj<typeof meta>;
|
|
29
|
+
|
|
30
|
+
export const Primary: Story = {
|
|
31
|
+
args: {
|
|
32
|
+
variant: 'primary',
|
|
33
|
+
children: 'Click me',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const Secondary: Story = {
|
|
38
|
+
args: {
|
|
39
|
+
variant: 'secondary',
|
|
40
|
+
children: 'Secondary action',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const Disabled: Story = {
|
|
45
|
+
args: {
|
|
46
|
+
variant: 'primary',
|
|
47
|
+
children: 'Disabled',
|
|
48
|
+
disabled: true,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const Loading: Story = {
|
|
53
|
+
args: {
|
|
54
|
+
variant: 'primary',
|
|
55
|
+
children: 'Submitting...',
|
|
56
|
+
loading: true,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Args and ArgTypes
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
const meta = {
|
|
65
|
+
title: 'Components/Button',
|
|
66
|
+
component: Button,
|
|
67
|
+
argTypes: {
|
|
68
|
+
// Control type override
|
|
69
|
+
variant: {
|
|
70
|
+
control: 'select',
|
|
71
|
+
options: ['primary', 'secondary', 'danger', 'ghost'],
|
|
72
|
+
description: 'Visual style of the button',
|
|
73
|
+
table: {
|
|
74
|
+
type: { summary: 'string' },
|
|
75
|
+
defaultValue: { summary: 'primary' },
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
size: {
|
|
79
|
+
control: 'radio',
|
|
80
|
+
options: ['sm', 'md', 'lg'],
|
|
81
|
+
},
|
|
82
|
+
// Color picker
|
|
83
|
+
backgroundColor: {
|
|
84
|
+
control: 'color',
|
|
85
|
+
},
|
|
86
|
+
// Range slider
|
|
87
|
+
borderRadius: {
|
|
88
|
+
control: { type: 'range', min: 0, max: 20, step: 1 },
|
|
89
|
+
},
|
|
90
|
+
// Disable a control
|
|
91
|
+
children: {
|
|
92
|
+
control: false,
|
|
93
|
+
},
|
|
94
|
+
// Action logging
|
|
95
|
+
onClick: {
|
|
96
|
+
action: 'clicked',
|
|
97
|
+
description: 'Callback when button is clicked',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
args: {
|
|
101
|
+
// Default args for all stories in this file
|
|
102
|
+
variant: 'primary',
|
|
103
|
+
size: 'md',
|
|
104
|
+
children: 'Button',
|
|
105
|
+
},
|
|
106
|
+
} satisfies Meta<typeof Button>;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 2. Decorators
|
|
112
|
+
|
|
113
|
+
### Layout and Provider Decorators
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// .storybook/preview.tsx
|
|
117
|
+
import type { Preview } from '@storybook/react';
|
|
118
|
+
import { ThemeProvider } from '../src/theme';
|
|
119
|
+
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
120
|
+
import '../src/styles/globals.css';
|
|
121
|
+
|
|
122
|
+
const queryClient = new QueryClient({
|
|
123
|
+
defaultOptions: {
|
|
124
|
+
queries: { retry: false, gcTime: 0 },
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
const preview: Preview = {
|
|
129
|
+
decorators: [
|
|
130
|
+
// Theme provider wrapper
|
|
131
|
+
(Story) => (
|
|
132
|
+
<ThemeProvider>
|
|
133
|
+
<Story />
|
|
134
|
+
</ThemeProvider>
|
|
135
|
+
),
|
|
136
|
+
// React Query provider
|
|
137
|
+
(Story) => (
|
|
138
|
+
<QueryClientProvider client={queryClient}>
|
|
139
|
+
<Story />
|
|
140
|
+
</QueryClientProvider>
|
|
141
|
+
),
|
|
142
|
+
// Layout wrapper
|
|
143
|
+
(Story) => (
|
|
144
|
+
<div style={{ padding: '2rem', maxWidth: '800px', margin: '0 auto' }}>
|
|
145
|
+
<Story />
|
|
146
|
+
</div>
|
|
147
|
+
),
|
|
148
|
+
],
|
|
149
|
+
parameters: {
|
|
150
|
+
controls: {
|
|
151
|
+
matchers: {
|
|
152
|
+
color: /(background|color)$/i,
|
|
153
|
+
date: /Date$/i,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export default preview;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Per-Story Decorators
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
export const InSidebar: Story = {
|
|
166
|
+
decorators: [
|
|
167
|
+
(Story) => (
|
|
168
|
+
<div style={{ width: '250px', background: '#f5f5f5', padding: '1rem' }}>
|
|
169
|
+
<Story />
|
|
170
|
+
</div>
|
|
171
|
+
),
|
|
172
|
+
],
|
|
173
|
+
args: {
|
|
174
|
+
children: 'Sidebar Item',
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// Router decorator for components that use routing
|
|
179
|
+
export const WithRouter: Story = {
|
|
180
|
+
decorators: [
|
|
181
|
+
(Story) => (
|
|
182
|
+
<MemoryRouter initialEntries={['/profile']}>
|
|
183
|
+
<Routes>
|
|
184
|
+
<Route path="/profile" element={<Story />} />
|
|
185
|
+
</Routes>
|
|
186
|
+
</MemoryRouter>
|
|
187
|
+
),
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 3. Play Functions (Interaction Testing)
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
198
|
+
import { expect, fn, userEvent, within, waitFor } from '@storybook/test';
|
|
199
|
+
import { LoginForm } from './LoginForm';
|
|
200
|
+
|
|
201
|
+
const meta = {
|
|
202
|
+
title: 'Forms/LoginForm',
|
|
203
|
+
component: LoginForm,
|
|
204
|
+
args: {
|
|
205
|
+
onSubmit: fn(),
|
|
206
|
+
},
|
|
207
|
+
} satisfies Meta<typeof LoginForm>;
|
|
208
|
+
|
|
209
|
+
export default meta;
|
|
210
|
+
type Story = StoryObj<typeof meta>;
|
|
211
|
+
|
|
212
|
+
export const FilledForm: Story = {
|
|
213
|
+
play: async ({ canvasElement, args }) => {
|
|
214
|
+
const canvas = within(canvasElement);
|
|
215
|
+
const user = userEvent.setup();
|
|
216
|
+
|
|
217
|
+
// Type into form fields
|
|
218
|
+
await user.type(canvas.getByLabelText('Email'), 'user@example.com');
|
|
219
|
+
await user.type(canvas.getByLabelText('Password'), 'password123');
|
|
220
|
+
|
|
221
|
+
// Click submit
|
|
222
|
+
await user.click(canvas.getByRole('button', { name: 'Sign in' }));
|
|
223
|
+
|
|
224
|
+
// Assert the callback was called
|
|
225
|
+
await waitFor(() => {
|
|
226
|
+
expect(args.onSubmit).toHaveBeenCalledWith({
|
|
227
|
+
email: 'user@example.com',
|
|
228
|
+
password: 'password123',
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
export const ValidationErrors: Story = {
|
|
235
|
+
play: async ({ canvasElement }) => {
|
|
236
|
+
const canvas = within(canvasElement);
|
|
237
|
+
const user = userEvent.setup();
|
|
238
|
+
|
|
239
|
+
// Submit empty form
|
|
240
|
+
await user.click(canvas.getByRole('button', { name: 'Sign in' }));
|
|
241
|
+
|
|
242
|
+
// Assert validation errors appear
|
|
243
|
+
await waitFor(() => {
|
|
244
|
+
expect(canvas.getByText('Email is required')).toBeInTheDocument();
|
|
245
|
+
expect(canvas.getByText('Password is required')).toBeInTheDocument();
|
|
246
|
+
});
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
export const PasswordToggle: Story = {
|
|
251
|
+
play: async ({ canvasElement }) => {
|
|
252
|
+
const canvas = within(canvasElement);
|
|
253
|
+
const user = userEvent.setup();
|
|
254
|
+
|
|
255
|
+
const passwordInput = canvas.getByLabelText('Password');
|
|
256
|
+
await user.type(passwordInput, 'secret');
|
|
257
|
+
|
|
258
|
+
// Password should be masked
|
|
259
|
+
expect(passwordInput).toHaveAttribute('type', 'password');
|
|
260
|
+
|
|
261
|
+
// Toggle visibility
|
|
262
|
+
await user.click(canvas.getByRole('button', { name: 'Show password' }));
|
|
263
|
+
expect(passwordInput).toHaveAttribute('type', 'text');
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Composing Play Functions
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
export const FullFlow: Story = {
|
|
272
|
+
play: async (context) => {
|
|
273
|
+
// Run the FilledForm play function first
|
|
274
|
+
await FilledForm.play!(context);
|
|
275
|
+
|
|
276
|
+
const canvas = within(context.canvasElement);
|
|
277
|
+
|
|
278
|
+
// Then continue with additional interactions
|
|
279
|
+
await waitFor(() => {
|
|
280
|
+
expect(canvas.getByText('Welcome back!')).toBeInTheDocument();
|
|
281
|
+
});
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 4. Visual Regression Testing (Chromatic)
|
|
289
|
+
|
|
290
|
+
### Setup
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
# Install Chromatic
|
|
294
|
+
npm install --save-dev chromatic
|
|
295
|
+
|
|
296
|
+
# Run visual tests
|
|
297
|
+
npx chromatic --project-token=YOUR_TOKEN
|
|
298
|
+
|
|
299
|
+
# In CI (GitHub Actions)
|
|
300
|
+
# .github/workflows/chromatic.yml
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
```yaml
|
|
304
|
+
# .github/workflows/chromatic.yml
|
|
305
|
+
name: Chromatic
|
|
306
|
+
on: push
|
|
307
|
+
|
|
308
|
+
jobs:
|
|
309
|
+
chromatic:
|
|
310
|
+
runs-on: ubuntu-latest
|
|
311
|
+
steps:
|
|
312
|
+
- uses: actions/checkout@v4
|
|
313
|
+
with:
|
|
314
|
+
fetch-depth: 0
|
|
315
|
+
- uses: actions/setup-node@v4
|
|
316
|
+
with:
|
|
317
|
+
node-version: 20
|
|
318
|
+
- run: npm ci
|
|
319
|
+
- uses: chromaui/action@latest
|
|
320
|
+
with:
|
|
321
|
+
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
|
322
|
+
exitZeroOnChanges: true
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Controlling Snapshots
|
|
326
|
+
|
|
327
|
+
```typescript
|
|
328
|
+
export const AnimatedComponent: Story = {
|
|
329
|
+
parameters: {
|
|
330
|
+
// Disable Chromatic snapshot for animated stories
|
|
331
|
+
chromatic: { disableSnapshot: true },
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
export const ResponsiveLayout: Story = {
|
|
336
|
+
parameters: {
|
|
337
|
+
// Capture at multiple viewport widths
|
|
338
|
+
chromatic: {
|
|
339
|
+
viewports: [320, 768, 1200],
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
export const DarkMode: Story = {
|
|
345
|
+
parameters: {
|
|
346
|
+
chromatic: {
|
|
347
|
+
// Capture both themes
|
|
348
|
+
modes: {
|
|
349
|
+
light: { theme: 'light' },
|
|
350
|
+
dark: { theme: 'dark' },
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
// Delay snapshot until animations complete
|
|
357
|
+
export const WithAnimation: Story = {
|
|
358
|
+
parameters: {
|
|
359
|
+
chromatic: { delay: 500 },
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## 5. Auto-Docs and MDX Documentation
|
|
367
|
+
|
|
368
|
+
### Auto-Docs (Generated from Stories)
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
// Enable by adding 'autodocs' tag
|
|
372
|
+
const meta = {
|
|
373
|
+
title: 'Components/Button',
|
|
374
|
+
component: Button,
|
|
375
|
+
tags: ['autodocs'], // Generates a Docs page automatically
|
|
376
|
+
parameters: {
|
|
377
|
+
docs: {
|
|
378
|
+
description: {
|
|
379
|
+
component: 'Primary UI button component. Supports multiple variants, '
|
|
380
|
+
+ 'sizes, and states including loading and disabled.',
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
} satisfies Meta<typeof Button>;
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### Custom MDX Documentation
|
|
388
|
+
|
|
389
|
+
```mdx
|
|
390
|
+
{/* Button.mdx */}
|
|
391
|
+
import { Meta, Story, Canvas, Controls, Source } from '@storybook/blocks';
|
|
392
|
+
import * as ButtonStories from './Button.stories';
|
|
393
|
+
|
|
394
|
+
<Meta of={ButtonStories} />
|
|
395
|
+
|
|
396
|
+
# Button
|
|
397
|
+
|
|
398
|
+
The Button component is the primary action element in the design system.
|
|
399
|
+
|
|
400
|
+
## Usage Guidelines
|
|
401
|
+
|
|
402
|
+
- Use **Primary** for the main call-to-action on a page.
|
|
403
|
+
- Use **Secondary** for less important actions.
|
|
404
|
+
- Use **Danger** for destructive actions (delete, remove).
|
|
405
|
+
- Never place two Primary buttons side by side.
|
|
406
|
+
|
|
407
|
+
## Interactive Example
|
|
408
|
+
|
|
409
|
+
<Canvas of={ButtonStories.Primary} />
|
|
410
|
+
|
|
411
|
+
## Controls
|
|
412
|
+
|
|
413
|
+
<Controls />
|
|
414
|
+
|
|
415
|
+
## Variants
|
|
416
|
+
|
|
417
|
+
<Canvas>
|
|
418
|
+
<Story of={ButtonStories.Primary} />
|
|
419
|
+
<Story of={ButtonStories.Secondary} />
|
|
420
|
+
<Story of={ButtonStories.Danger} />
|
|
421
|
+
</Canvas>
|
|
422
|
+
|
|
423
|
+
## Accessibility
|
|
424
|
+
|
|
425
|
+
- All buttons have a visible focus ring.
|
|
426
|
+
- Disabled buttons use `aria-disabled` instead of the `disabled` attribute
|
|
427
|
+
to remain in the tab order for screen readers.
|
|
428
|
+
- Loading buttons announce their state via `aria-busy="true"`.
|
|
429
|
+
|
|
430
|
+
## Source Code
|
|
431
|
+
|
|
432
|
+
<Source of={ButtonStories.Primary} />
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## 6. Addons
|
|
438
|
+
|
|
439
|
+
### Accessibility Addon (@storybook/addon-a11y)
|
|
440
|
+
|
|
441
|
+
```typescript
|
|
442
|
+
// .storybook/main.ts
|
|
443
|
+
const config: StorybookConfig = {
|
|
444
|
+
addons: [
|
|
445
|
+
'@storybook/addon-a11y',
|
|
446
|
+
// ... other addons
|
|
447
|
+
],
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
// Per-story a11y configuration
|
|
451
|
+
export const ContrastIssue: Story = {
|
|
452
|
+
parameters: {
|
|
453
|
+
a11y: {
|
|
454
|
+
config: {
|
|
455
|
+
rules: [
|
|
456
|
+
{
|
|
457
|
+
id: 'color-contrast',
|
|
458
|
+
enabled: true,
|
|
459
|
+
},
|
|
460
|
+
],
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
// Disable a11y for a specific story (rare, document why)
|
|
467
|
+
export const DecorativeOnly: Story = {
|
|
468
|
+
parameters: {
|
|
469
|
+
a11y: { disable: true },
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
### Viewport Addon
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
// .storybook/preview.ts
|
|
478
|
+
const preview: Preview = {
|
|
479
|
+
parameters: {
|
|
480
|
+
viewport: {
|
|
481
|
+
viewports: {
|
|
482
|
+
mobile: {
|
|
483
|
+
name: 'Mobile',
|
|
484
|
+
styles: { width: '375px', height: '812px' },
|
|
485
|
+
},
|
|
486
|
+
tablet: {
|
|
487
|
+
name: 'Tablet',
|
|
488
|
+
styles: { width: '768px', height: '1024px' },
|
|
489
|
+
},
|
|
490
|
+
desktop: {
|
|
491
|
+
name: 'Desktop',
|
|
492
|
+
styles: { width: '1440px', height: '900px' },
|
|
493
|
+
},
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
|
|
499
|
+
// Set default viewport for a story
|
|
500
|
+
export const MobileLayout: Story = {
|
|
501
|
+
parameters: {
|
|
502
|
+
viewport: {
|
|
503
|
+
defaultViewport: 'mobile',
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
};
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
### Actions Addon
|
|
510
|
+
|
|
511
|
+
```typescript
|
|
512
|
+
// Automatic action logging for props matching patterns
|
|
513
|
+
const meta = {
|
|
514
|
+
title: 'Components/Button',
|
|
515
|
+
component: Button,
|
|
516
|
+
argTypes: {
|
|
517
|
+
onClick: { action: 'clicked' },
|
|
518
|
+
onHover: { action: 'hovered' },
|
|
519
|
+
},
|
|
520
|
+
} satisfies Meta<typeof Button>;
|
|
521
|
+
|
|
522
|
+
// Or use fn() from @storybook/test for assertions in play functions
|
|
523
|
+
import { fn } from '@storybook/test';
|
|
524
|
+
|
|
525
|
+
const meta = {
|
|
526
|
+
args: {
|
|
527
|
+
onClick: fn(),
|
|
528
|
+
},
|
|
529
|
+
} satisfies Meta<typeof Button>;
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
---
|
|
533
|
+
|
|
534
|
+
## 7. MSW Integration
|
|
535
|
+
|
|
536
|
+
### Setup
|
|
537
|
+
|
|
538
|
+
```typescript
|
|
539
|
+
// .storybook/preview.ts
|
|
540
|
+
import { initialize, mswLoader } from 'msw-storybook-addon';
|
|
541
|
+
|
|
542
|
+
// Initialize MSW
|
|
543
|
+
initialize();
|
|
544
|
+
|
|
545
|
+
const preview: Preview = {
|
|
546
|
+
loaders: [mswLoader],
|
|
547
|
+
};
|
|
548
|
+
|
|
549
|
+
export default preview;
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### Per-Story API Mocking
|
|
553
|
+
|
|
554
|
+
```typescript
|
|
555
|
+
import { http, HttpResponse } from 'msw';
|
|
556
|
+
|
|
557
|
+
export const WithData: Story = {
|
|
558
|
+
parameters: {
|
|
559
|
+
msw: {
|
|
560
|
+
handlers: [
|
|
561
|
+
http.get('/api/users', () => {
|
|
562
|
+
return HttpResponse.json([
|
|
563
|
+
{ id: '1', name: 'Alice', role: 'Admin' },
|
|
564
|
+
{ id: '2', name: 'Bob', role: 'User' },
|
|
565
|
+
]);
|
|
566
|
+
}),
|
|
567
|
+
],
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
|
|
572
|
+
export const Loading: Story = {
|
|
573
|
+
parameters: {
|
|
574
|
+
msw: {
|
|
575
|
+
handlers: [
|
|
576
|
+
http.get('/api/users', async () => {
|
|
577
|
+
// Never resolves -- shows loading state forever
|
|
578
|
+
await new Promise(() => {});
|
|
579
|
+
}),
|
|
580
|
+
],
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
export const Error: Story = {
|
|
586
|
+
parameters: {
|
|
587
|
+
msw: {
|
|
588
|
+
handlers: [
|
|
589
|
+
http.get('/api/users', () => {
|
|
590
|
+
return HttpResponse.json(
|
|
591
|
+
{ error: 'Internal Server Error' },
|
|
592
|
+
{ status: 500 }
|
|
593
|
+
);
|
|
594
|
+
}),
|
|
595
|
+
],
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
export const Empty: Story = {
|
|
601
|
+
parameters: {
|
|
602
|
+
msw: {
|
|
603
|
+
handlers: [
|
|
604
|
+
http.get('/api/users', () => {
|
|
605
|
+
return HttpResponse.json([]);
|
|
606
|
+
}),
|
|
607
|
+
],
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
};
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
---
|
|
614
|
+
|
|
615
|
+
## 8. Portable Stories
|
|
616
|
+
|
|
617
|
+
Run Storybook stories inside any test runner (Vitest, Jest, Playwright).
|
|
618
|
+
|
|
619
|
+
```typescript
|
|
620
|
+
// Button.test.tsx
|
|
621
|
+
import { composeStories } from '@storybook/react';
|
|
622
|
+
import { render, screen } from '@testing-library/react';
|
|
623
|
+
import * as stories from './Button.stories';
|
|
624
|
+
|
|
625
|
+
const { Primary, Disabled, Loading } = composeStories(stories);
|
|
626
|
+
|
|
627
|
+
test('Primary button renders correctly', () => {
|
|
628
|
+
render(<Primary />);
|
|
629
|
+
expect(screen.getByRole('button')).toHaveTextContent('Click me');
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
test('Disabled button is not clickable', () => {
|
|
633
|
+
render(<Disabled />);
|
|
634
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
test('Loading button shows spinner', () => {
|
|
638
|
+
render(<Loading />);
|
|
639
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
640
|
+
});
|
|
641
|
+
|
|
642
|
+
// Run play functions in tests
|
|
643
|
+
test('FilledForm play function', async () => {
|
|
644
|
+
const { FilledForm } = composeStories(stories);
|
|
645
|
+
const { container } = render(<FilledForm />);
|
|
646
|
+
await FilledForm.play!({ canvasElement: container });
|
|
647
|
+
});
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## 9. Building Design Systems
|
|
653
|
+
|
|
654
|
+
### Token-Based Stories
|
|
655
|
+
|
|
656
|
+
```typescript
|
|
657
|
+
// tokens/Colors.stories.tsx
|
|
658
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
659
|
+
|
|
660
|
+
const meta = {
|
|
661
|
+
title: 'Design Tokens/Colors',
|
|
662
|
+
tags: ['autodocs'],
|
|
663
|
+
} satisfies Meta;
|
|
664
|
+
|
|
665
|
+
export default meta;
|
|
666
|
+
|
|
667
|
+
const colors = {
|
|
668
|
+
primary: { 50: '#eff6ff', 500: '#3b82f6', 900: '#1e3a5f' },
|
|
669
|
+
neutral: { 50: '#fafafa', 500: '#737373', 900: '#171717' },
|
|
670
|
+
success: { 500: '#22c55e' },
|
|
671
|
+
danger: { 500: '#ef4444' },
|
|
672
|
+
warning: { 500: '#f59e0b' },
|
|
673
|
+
};
|
|
674
|
+
|
|
675
|
+
export const ColorPalette: StoryObj = {
|
|
676
|
+
render: () => (
|
|
677
|
+
<div style={{ display: 'grid', gap: '1rem' }}>
|
|
678
|
+
{Object.entries(colors).map(([name, shades]) => (
|
|
679
|
+
<div key={name}>
|
|
680
|
+
<h3>{name}</h3>
|
|
681
|
+
<div style={{ display: 'flex', gap: '0.5rem' }}>
|
|
682
|
+
{Object.entries(shades).map(([shade, value]) => (
|
|
683
|
+
<div key={shade} style={{ textAlign: 'center' }}>
|
|
684
|
+
<div
|
|
685
|
+
style={{
|
|
686
|
+
width: 64,
|
|
687
|
+
height: 64,
|
|
688
|
+
backgroundColor: value,
|
|
689
|
+
borderRadius: 8,
|
|
690
|
+
border: '1px solid #e5e7eb',
|
|
691
|
+
}}
|
|
692
|
+
/>
|
|
693
|
+
<small>{shade}</small>
|
|
694
|
+
</div>
|
|
695
|
+
))}
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
))}
|
|
699
|
+
</div>
|
|
700
|
+
),
|
|
701
|
+
};
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### Component Status Badges
|
|
705
|
+
|
|
706
|
+
```typescript
|
|
707
|
+
// .storybook/preview.ts
|
|
708
|
+
const preview: Preview = {
|
|
709
|
+
parameters: {
|
|
710
|
+
badges: {
|
|
711
|
+
stable: {
|
|
712
|
+
title: 'Stable',
|
|
713
|
+
color: '#22c55e',
|
|
714
|
+
},
|
|
715
|
+
beta: {
|
|
716
|
+
title: 'Beta',
|
|
717
|
+
color: '#f59e0b',
|
|
718
|
+
},
|
|
719
|
+
deprecated: {
|
|
720
|
+
title: 'Deprecated',
|
|
721
|
+
color: '#ef4444',
|
|
722
|
+
},
|
|
723
|
+
},
|
|
724
|
+
},
|
|
725
|
+
};
|
|
726
|
+
|
|
727
|
+
// In stories
|
|
728
|
+
const meta = {
|
|
729
|
+
title: 'Components/Button',
|
|
730
|
+
component: Button,
|
|
731
|
+
parameters: {
|
|
732
|
+
badges: ['stable'],
|
|
733
|
+
},
|
|
734
|
+
} satisfies Meta<typeof Button>;
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## 10. Storybook Configuration
|
|
740
|
+
|
|
741
|
+
### main.ts
|
|
742
|
+
|
|
743
|
+
```typescript
|
|
744
|
+
// .storybook/main.ts
|
|
745
|
+
import type { StorybookConfig } from '@storybook/react-vite';
|
|
746
|
+
|
|
747
|
+
const config: StorybookConfig = {
|
|
748
|
+
stories: [
|
|
749
|
+
'../src/**/*.mdx',
|
|
750
|
+
'../src/**/*.stories.@(js|jsx|mjs|ts|tsx)',
|
|
751
|
+
],
|
|
752
|
+
addons: [
|
|
753
|
+
'@storybook/addon-onboarding',
|
|
754
|
+
'@storybook/addon-essentials',
|
|
755
|
+
'@storybook/addon-interactions',
|
|
756
|
+
'@storybook/addon-a11y',
|
|
757
|
+
'@storybook/addon-coverage',
|
|
758
|
+
],
|
|
759
|
+
framework: {
|
|
760
|
+
name: '@storybook/react-vite',
|
|
761
|
+
options: {},
|
|
762
|
+
},
|
|
763
|
+
docs: {
|
|
764
|
+
autodocs: 'tag',
|
|
765
|
+
},
|
|
766
|
+
staticDirs: ['../public'],
|
|
767
|
+
// TypeScript configuration
|
|
768
|
+
typescript: {
|
|
769
|
+
reactDocgen: 'react-docgen-typescript',
|
|
770
|
+
reactDocgenTypescriptOptions: {
|
|
771
|
+
shouldExtractLiteralValuesFromEnum: true,
|
|
772
|
+
propFilter: (prop) => {
|
|
773
|
+
// Filter out HTML attributes from docs
|
|
774
|
+
return prop.parent
|
|
775
|
+
? !/node_modules/.test(prop.parent.fileName)
|
|
776
|
+
: true;
|
|
777
|
+
},
|
|
778
|
+
},
|
|
779
|
+
},
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
export default config;
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## 11. CI Integration
|
|
788
|
+
|
|
789
|
+
### GitHub Actions
|
|
790
|
+
|
|
791
|
+
```yaml
|
|
792
|
+
name: Storybook CI
|
|
793
|
+
on:
|
|
794
|
+
pull_request:
|
|
795
|
+
branches: [main]
|
|
796
|
+
|
|
797
|
+
jobs:
|
|
798
|
+
storybook:
|
|
799
|
+
runs-on: ubuntu-latest
|
|
800
|
+
steps:
|
|
801
|
+
- uses: actions/checkout@v4
|
|
802
|
+
- uses: actions/setup-node@v4
|
|
803
|
+
with:
|
|
804
|
+
node-version: 20
|
|
805
|
+
cache: 'npm'
|
|
806
|
+
- run: npm ci
|
|
807
|
+
|
|
808
|
+
# Build Storybook (catches build errors)
|
|
809
|
+
- run: npm run build-storybook
|
|
810
|
+
|
|
811
|
+
# Run interaction tests
|
|
812
|
+
- name: Run Storybook tests
|
|
813
|
+
run: |
|
|
814
|
+
npx concurrently -k -s first \
|
|
815
|
+
"npx http-server storybook-static --port 6006 --silent" \
|
|
816
|
+
"npx wait-on tcp:6006 && npx test-storybook"
|
|
817
|
+
|
|
818
|
+
# Upload as artifact
|
|
819
|
+
- uses: actions/upload-artifact@v4
|
|
820
|
+
with:
|
|
821
|
+
name: storybook
|
|
822
|
+
path: storybook-static/
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
### test-storybook Configuration
|
|
826
|
+
|
|
827
|
+
```typescript
|
|
828
|
+
// .storybook/test-runner.ts
|
|
829
|
+
import type { TestRunnerConfig } from '@storybook/test-runner';
|
|
830
|
+
import { getStoryContext } from '@storybook/test-runner';
|
|
831
|
+
import { injectAxe, checkA11y } from 'axe-playwright';
|
|
832
|
+
|
|
833
|
+
const config: TestRunnerConfig = {
|
|
834
|
+
async preVisit(page) {
|
|
835
|
+
await injectAxe(page);
|
|
836
|
+
},
|
|
837
|
+
async postVisit(page, context) {
|
|
838
|
+
// Run a11y checks on every story automatically
|
|
839
|
+
const storyContext = await getStoryContext(page, context);
|
|
840
|
+
|
|
841
|
+
if (storyContext.parameters?.a11y?.disable) {
|
|
842
|
+
return;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
await checkA11y(page, '#storybook-root', {
|
|
846
|
+
detailedReport: true,
|
|
847
|
+
detailedReportOptions: {
|
|
848
|
+
html: true,
|
|
849
|
+
},
|
|
850
|
+
});
|
|
851
|
+
},
|
|
852
|
+
};
|
|
853
|
+
|
|
854
|
+
export default config;
|
|
855
|
+
```
|
|
856
|
+
|
|
857
|
+
---
|
|
858
|
+
|
|
859
|
+
## 12. Performance Optimization
|
|
860
|
+
|
|
861
|
+
### Lazy Loading Stories
|
|
862
|
+
|
|
863
|
+
```typescript
|
|
864
|
+
// Only load heavy dependencies when the story renders
|
|
865
|
+
export const HeavyComponent: Story = {
|
|
866
|
+
render: () => {
|
|
867
|
+
const [Component, setComponent] = useState<React.ComponentType | null>(null);
|
|
868
|
+
|
|
869
|
+
useEffect(() => {
|
|
870
|
+
import('../components/HeavyChart').then((mod) => {
|
|
871
|
+
setComponent(() => mod.HeavyChart);
|
|
872
|
+
});
|
|
873
|
+
}, []);
|
|
874
|
+
|
|
875
|
+
if (!Component) return <div>Loading...</div>;
|
|
876
|
+
return <Component data={sampleData} />;
|
|
877
|
+
},
|
|
878
|
+
};
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
### Build Optimization
|
|
882
|
+
|
|
883
|
+
```typescript
|
|
884
|
+
// .storybook/main.ts
|
|
885
|
+
const config: StorybookConfig = {
|
|
886
|
+
// ...
|
|
887
|
+
core: {
|
|
888
|
+
disableTelemetry: true,
|
|
889
|
+
},
|
|
890
|
+
// Reduce build size by limiting stories in CI
|
|
891
|
+
stories: process.env.CI
|
|
892
|
+
? ['../src/components/**/*.stories.tsx']
|
|
893
|
+
: ['../src/**/*.stories.@(ts|tsx|mdx)'],
|
|
894
|
+
};
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
---
|
|
898
|
+
|
|
899
|
+
## 13. Anti-Patterns
|
|
900
|
+
|
|
901
|
+
### NEVER
|
|
902
|
+
|
|
903
|
+
- Write stories without proper args (always make stories configurable via Controls)
|
|
904
|
+
- Skip play functions for interactive components (forms, modals, dropdowns)
|
|
905
|
+
- Use hardcoded test data inline (extract to shared fixtures)
|
|
906
|
+
- Create stories that depend on external services without MSW mocks
|
|
907
|
+
- Ignore accessibility addon warnings (fix them or document exceptions)
|
|
908
|
+
- Put business logic inside stories (stories render components, nothing more)
|
|
909
|
+
- Skip autodocs tags on public components (every public component needs docs)
|
|
910
|
+
- Use `.storyName` when the export name suffices (use clear export names)
|
|
911
|
+
|
|
912
|
+
### ALWAYS
|
|
913
|
+
|
|
914
|
+
- Write at least one story per visual state (default, loading, error, empty, disabled)
|
|
915
|
+
- Include play functions for interactive components
|
|
916
|
+
- Set up global decorators for providers (theme, routing, query client)
|
|
917
|
+
- Use `fn()` for event handler props to enable action logging and assertions
|
|
918
|
+
- Configure viewport addon for responsive components
|
|
919
|
+
- Enable the a11y addon globally and fix all warnings
|
|
920
|
+
- Use CSF3 format (object-based stories with `args`)
|
|
921
|
+
- Test stories in CI with `test-storybook`
|
|
922
|
+
- Organize stories by domain: `Components/Forms/Input`, `Components/Layout/Grid`
|
|
923
|
+
- Document component usage guidelines in MDX or autodocs descriptions
|