solmate-skills 1.0.2 → 2.0.1
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/AGENTS.md +49 -15
- package/CLAUDE.md +77 -0
- package/README.md +114 -60
- package/bin/cli.js +20 -0
- package/{business-plan → docs-business}/SKILL.md +8 -8
- package/{dev-docs → docs-dev}/SKILL.md +9 -6
- package/{pitch-deck → docs-pitch}/SKILL.md +8 -35
- package/{plan-docs → docs-plan}/SKILL.md +3 -5
- package/ext-awesome-design/SKILL.md +19 -0
- package/ext-k-skill/SKILL.md +21 -0
- package/hooks/install.sh +131 -0
- package/hooks/suggest-skills.sh +94 -0
- package/hooks/watch-files.sh +86 -0
- package/manage-decisions/SKILL.md +215 -0
- package/package.json +1 -1
- package/{dev-conventions → rules-dev}/SKILL.md +2 -2
- package/{manage-docs → rules-docs}/SKILL.md +14 -10
- package/{product-workflow → rules-product}/SKILL.md +90 -100
- package/{react-components → rules-react}/README.md +1 -1
- package/rules-react/SKILL.md +39 -0
- package/rules-react/package.json +15 -0
- package/{implementation-workflow → rules-workflow}/SKILL.md +2 -2
- package/{obsidian-sync → tools-obsidian}/SKILL.md +2 -2
- package/{shadcn-ui → tools-shadcn}/SKILL.md +1 -1
- package/verify-code/SKILL.md +134 -0
- package/verify-docs/SKILL.md +3 -2
- package/verify-performance/SKILL.md +221 -0
- package/verify-security/SKILL.md +205 -0
- package/design-md/README.md +0 -34
- package/design-md/SKILL.md +0 -172
- package/design-md/examples/DESIGN.md +0 -154
- package/enhance-prompt/README.md +0 -34
- package/enhance-prompt/SKILL.md +0 -204
- package/enhance-prompt/references/KEYWORDS.md +0 -114
- package/react-components/SKILL.md +0 -47
- package/react-components/package.json +0 -16
- package/remotion/README.md +0 -105
- package/remotion/SKILL.md +0 -393
- package/remotion/examples/WalkthroughComposition.tsx +0 -78
- package/remotion/examples/screens.json +0 -56
- package/remotion/resources/composition-checklist.md +0 -124
- package/remotion/resources/screen-slide-template.tsx +0 -123
- package/remotion/scripts/download-stitch-asset.sh +0 -38
- package/stitch-loop/README.md +0 -54
- package/stitch-loop/SKILL.md +0 -203
- package/stitch-loop/examples/SITE.md +0 -73
- package/stitch-loop/examples/next-prompt.md +0 -25
- package/stitch-loop/resources/baton-schema.md +0 -61
- package/stitch-loop/resources/site-template.md +0 -104
- /package/{awesome-design-md → ext-awesome-design}/.github/FUNDING.yml +0 -0
- /package/{awesome-design-md → ext-awesome-design}/.github/ISSUE_TEMPLATE/design-md-request.yml +0 -0
- /package/{awesome-design-md → ext-awesome-design}/CONTRIBUTING.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/LICENSE +0 -0
- /package/{awesome-design-md → ext-awesome-design}/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airbnb/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airbnb/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airbnb/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airbnb/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airtable/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airtable/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airtable/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/airtable/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/apple/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/apple/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/apple/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/apple/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/bmw/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/bmw/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/bmw/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/bmw/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cal/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cal/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cal/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cal/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/claude/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/claude/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/claude/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/claude/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clay/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clay/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clay/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clay/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clickhouse/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clickhouse/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clickhouse/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/clickhouse/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cohere/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cohere/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cohere/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cohere/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/coinbase/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/coinbase/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/coinbase/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/coinbase/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/composio/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/composio/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/composio/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/composio/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cursor/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cursor/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cursor/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/cursor/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/elevenlabs/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/elevenlabs/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/elevenlabs/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/elevenlabs/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/expo/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/expo/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/expo/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/expo/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/figma/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/figma/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/figma/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/figma/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/framer/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/framer/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/framer/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/framer/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/hashicorp/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/hashicorp/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/hashicorp/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/hashicorp/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ibm/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ibm/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ibm/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ibm/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/intercom/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/intercom/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/intercom/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/intercom/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/kraken/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/kraken/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/kraken/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/kraken/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/linear.app/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/linear.app/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/linear.app/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/linear.app/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/lovable/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/lovable/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/lovable/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/lovable/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/minimax/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/minimax/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/minimax/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/minimax/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mintlify/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mintlify/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mintlify/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mintlify/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/miro/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/miro/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/miro/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/miro/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mistral.ai/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mistral.ai/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mistral.ai/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mistral.ai/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mongodb/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mongodb/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mongodb/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/mongodb/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/notion/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/notion/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/notion/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/notion/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/nvidia/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/nvidia/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/nvidia/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/nvidia/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ollama/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ollama/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ollama/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/ollama/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/opencode.ai/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/opencode.ai/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/opencode.ai/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/opencode.ai/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/pinterest/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/pinterest/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/pinterest/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/pinterest/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/posthog/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/posthog/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/posthog/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/posthog/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/raycast/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/raycast/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/raycast/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/raycast/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/replicate/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/replicate/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/replicate/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/replicate/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/resend/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/resend/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/resend/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/resend/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/revolut/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/revolut/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/revolut/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/revolut/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/runwayml/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/runwayml/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/runwayml/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/runwayml/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sanity/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sanity/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sanity/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sanity/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sentry/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sentry/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sentry/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/sentry/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spacex/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spacex/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spacex/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spacex/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spotify/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spotify/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spotify/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/spotify/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/stripe/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/stripe/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/stripe/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/stripe/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/supabase/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/supabase/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/supabase/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/supabase/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/superhuman/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/superhuman/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/superhuman/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/superhuman/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/together.ai/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/together.ai/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/together.ai/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/together.ai/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/uber/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/uber/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/uber/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/uber/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/vercel/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/vercel/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/vercel/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/vercel/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/voltagent/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/voltagent/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/voltagent/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/voltagent/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/warp/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/warp/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/warp/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/warp/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/webflow/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/webflow/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/webflow/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/webflow/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/wise/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/wise/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/wise/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/wise/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/x.ai/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/x.ai/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/x.ai/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/x.ai/preview.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/zapier/DESIGN.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/zapier/README.md +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/zapier/preview-dark.html +0 -0
- /package/{awesome-design-md → ext-awesome-design}/design-md/zapier/preview.html +0 -0
- /package/{k-skill → ext-k-skill}/.changeset/config.json +0 -0
- /package/{k-skill → ext-k-skill}/.github/release-please/python-config.json +0 -0
- /package/{k-skill → ext-k-skill}/.github/release-please/python-manifest.json +0 -0
- /package/{k-skill → ext-k-skill}/.github/workflows/ci.yml +0 -0
- /package/{k-skill → ext-k-skill}/.github/workflows/release-npm.yml +0 -0
- /package/{k-skill → ext-k-skill}/.github/workflows/release-python.yml +0 -0
- /package/{k-skill → ext-k-skill}/AGENTS.md +0 -0
- /package/{k-skill → ext-k-skill}/CLAUDE.md +0 -0
- /package/{k-skill → ext-k-skill}/LICENSE +0 -0
- /package/{k-skill → ext-k-skill}/README.md +0 -0
- /package/{k-skill → ext-k-skill}/blue-ribbon-nearby/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/coupang-product-search/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/daiso-product-search/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/delivery-tracking/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/assets/k-skill-thumbnail.png +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/blue-ribbon-nearby.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/coupang-product-search.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/daiso-product-search.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/delivery-tracking.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/fine-dust-location.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/hwp.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/k-skill-proxy.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/kakao-bar-nearby.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/kakaotalk-mac.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/kbo-results.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/kleague-results.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/korean-law-search.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/ktx-booking.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/lotto-results.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/seoul-subway-arrival.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/srt-booking.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/toss-securities.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/used-car-price-search.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/features/zipcode-search.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/install.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/releasing.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/roadmap.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/security-and-secrets.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/setup.md +0 -0
- /package/{k-skill → ext-k-skill}/docs/sources.md +0 -0
- /package/{k-skill → ext-k-skill}/ecosystem.config.cjs +0 -0
- /package/{k-skill → ext-k-skill}/examples/secrets.env.example +0 -0
- /package/{k-skill → ext-k-skill}/fine-dust-location/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/hwp/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/k-skill-setup/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/kakao-bar-nearby/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/kakaotalk-mac/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/kbo-results/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/kleague-results/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/korean-law-search/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/ktx-booking/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/lotto-results/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/test/fixtures/restaurants-map.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/test/fixtures/search-zone.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/blue-ribbon-nearby/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/fixtures/online-stock.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/fixtures/search-goods.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/fixtures/store-detail.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/fixtures/store-pickup-stock.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/fixtures/store-search.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/daiso-product-search/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/test/fixtures/latest-result.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/test/fixtures/round-1216.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-lotto/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/src/airkorea.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/src/server.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/test/airkorea.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/k-skill-proxy/test/server.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/anchor-panel.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/anchor-search.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/bar-search.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/closed-bar-panel.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/non-bar-panel.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/fixtures/open-bar-panel.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kakao-bar-nearby/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/test/fixtures/schedule-kleague1-2026-03.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/test/fixtures/standings-kleague1-2026.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/kleague-results/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/src/parse.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/toss-securities/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/CHANGELOG.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/README.md +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/package.json +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/src/index.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/src/providers/sk-tagobuy.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/src/search.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/src/util.js +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/test/fixtures/tb-empty.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/test/fixtures/tb-page.html +0 -0
- /package/{k-skill → ext-k-skill}/packages/used-car-price-search/test/index.test.js +0 -0
- /package/{k-skill → ext-k-skill}/python-packages/README.md +0 -0
- /package/{k-skill → ext-k-skill}/scripts/check-setup.sh +0 -0
- /package/{k-skill → ext-k-skill}/scripts/fine_dust.py +0 -0
- /package/{k-skill → ext-k-skill}/scripts/fixtures/delivery-tracking-public-provenance.json +0 -0
- /package/{k-skill → ext-k-skill}/scripts/fixtures/delivery-tracking-public-samples.json +0 -0
- /package/{k-skill → ext-k-skill}/scripts/fixtures/fine-dust-measurements.json +0 -0
- /package/{k-skill → ext-k-skill}/scripts/fixtures/fine-dust-stations.json +0 -0
- /package/{k-skill → ext-k-skill}/scripts/ktx_booking.py +0 -0
- /package/{k-skill → ext-k-skill}/scripts/run-k-skill-proxy.sh +0 -0
- /package/{k-skill → ext-k-skill}/scripts/skill-docs.test.js +0 -0
- /package/{k-skill → ext-k-skill}/scripts/test_fine_dust.py +0 -0
- /package/{k-skill → ext-k-skill}/scripts/test_ktx_booking.py +0 -0
- /package/{k-skill → ext-k-skill}/scripts/validate-skills.sh +0 -0
- /package/{k-skill → ext-k-skill}/seoul-subway-arrival/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/srt-booking/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/toss-securities/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/tsconfig.json +0 -0
- /package/{k-skill → ext-k-skill}/used-car-price-search/SKILL.md +0 -0
- /package/{k-skill → ext-k-skill}/zipcode-search/SKILL.md +0 -0
- /package/{react-components → rules-react}/examples/gold-standard-card.tsx +0 -0
- /package/{react-components → rules-react}/resources/architecture-checklist.md +0 -0
- /package/{react-components → rules-react}/resources/component-template.tsx +0 -0
- /package/{react-components → rules-react}/resources/stitch-api-reference.md +0 -0
- /package/{react-components → rules-react}/resources/style-guide.json +0 -0
- /package/{react-components → rules-react}/scripts/fetch-stitch.sh +0 -0
- /package/{react-components → rules-react}/scripts/validate.js +0 -0
- /package/{shadcn-ui → tools-shadcn}/README.md +0 -0
- /package/{shadcn-ui → tools-shadcn}/examples/auth-layout.tsx +0 -0
- /package/{shadcn-ui → tools-shadcn}/examples/data-table.tsx +0 -0
- /package/{shadcn-ui → tools-shadcn}/examples/form-pattern.tsx +0 -0
- /package/{shadcn-ui → tools-shadcn}/resources/component-catalog.md +0 -0
- /package/{shadcn-ui → tools-shadcn}/resources/customization-guide.md +0 -0
- /package/{shadcn-ui → tools-shadcn}/resources/migration-guide.md +0 -0
- /package/{shadcn-ui → tools-shadcn}/resources/setup-guide.md +0 -0
- /package/{shadcn-ui → tools-shadcn}/scripts/verify-setup.sh +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify-performance
|
|
3
|
+
description: 브라우저 성능 및 Core Web Vitals를 점검합니다. Lighthouse 기준, LCP·CLS·FID, 번들 크기, 이미지 최적화, 렌더링 전략, 불필요한 클라이언트 코드를 체계적으로 검증합니다. 배포 전 성능 점검, "Lighthouse 확인", "성능 최적화 확인" 요청 시 사용합니다.
|
|
4
|
+
argument-hint: "[선택사항: 점검할 페이지 경로 또는 집중 영역 (예: 홈, 이미지, 번들)]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 성능 점검 스킬 (verify-performance)
|
|
8
|
+
|
|
9
|
+
Lighthouse 및 Core Web Vitals 기준으로 프론트엔드 성능을 검증합니다. 코드 분석 단계와 실측 점검 단계로 나누어 진행하고 발견된 이슈를 우선순위와 함께 보고합니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 실행 시점
|
|
14
|
+
|
|
15
|
+
- 배포 전 성능 최종 점검
|
|
16
|
+
- 새 페이지·이미지·폰트·대형 컴포넌트 추가 후
|
|
17
|
+
- "Lighthouse 점수가 낮다", "페이지가 느리다" 보고 시
|
|
18
|
+
- `rules-workflow` Step 17 (배포 가능 퀄리티 최종 검토) 수행 시
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 목표 기준 (Lighthouse Performance Score)
|
|
23
|
+
|
|
24
|
+
| 지표 | 목표 | 경고 |
|
|
25
|
+
|------|:----:|:----:|
|
|
26
|
+
| Performance Score | 90+ | 70 미만 시 차단 |
|
|
27
|
+
| LCP (Largest Contentful Paint) | ≤ 2.5s | > 4.0s 위험 |
|
|
28
|
+
| CLS (Cumulative Layout Shift) | ≤ 0.1 | > 0.25 위험 |
|
|
29
|
+
| FID / INP (Interaction to Next Paint) | ≤ 200ms | > 500ms 위험 |
|
|
30
|
+
| FCP (First Contentful Paint) | ≤ 1.8s | > 3.0s 위험 |
|
|
31
|
+
| TTFB (Time to First Byte) | ≤ 800ms | > 1.8s 위험 |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step 0: 점검 범위 확정
|
|
36
|
+
|
|
37
|
+
인자가 주어진 경우 해당 페이지/영역에 집중한다. 없으면 아래 기준으로 성능에 민감한 파일을 우선 탐색한다.
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 이미지 사용 현황
|
|
41
|
+
grep -rn "<img\|Image from\|next/image" src/ --include="*.tsx" --include="*.jsx" -l
|
|
42
|
+
|
|
43
|
+
# 동적 import 미적용 대형 컴포넌트 탐색
|
|
44
|
+
grep -rn "^import.*from" src/ --include="*.tsx" | grep -v "dynamic\|lazy" | head -40
|
|
45
|
+
|
|
46
|
+
# 클라이언트 컴포넌트 현황
|
|
47
|
+
grep -rn "'use client'" src/ --include="*.tsx" -l
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Check 1: 이미지 최적화
|
|
53
|
+
|
|
54
|
+
**LCP·CLS·네트워크 비용에 가장 큰 영향**
|
|
55
|
+
|
|
56
|
+
- `<img>` 태그 직접 사용 대신 `next/image` (또는 프레임워크 이미지 컴포넌트)를 사용하는지 확인한다.
|
|
57
|
+
- `next/image` 사용 시 `width`, `height` 또는 `fill` 속성이 지정되어 CLS가 방지되는지 점검한다.
|
|
58
|
+
- LCP 대상 이미지(히어로 이미지 등)에 `priority` 속성이 적용되어 있는지 확인한다.
|
|
59
|
+
- 외부 이미지 도메인이 `next.config.js`의 `images.domains` 또는 `remotePatterns`에 등록되어 있는지 확인한다.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
grep -rn "<img " src/ --include="*.tsx" --include="*.jsx"
|
|
63
|
+
grep -rn "next/image" src/ --include="*.tsx" -l
|
|
64
|
+
grep -rn "priority" src/ --include="*.tsx"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- 체크:
|
|
68
|
+
- [ ] `<img>` 직접 사용 없이 최적화 컴포넌트를 사용하는가?
|
|
69
|
+
- [ ] 이미지에 `width`/`height` 또는 `fill`이 지정되어 있는가?
|
|
70
|
+
- [ ] LCP 대상 이미지에 `priority`가 적용되어 있는가?
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Check 2: 렌더링 전략
|
|
75
|
+
|
|
76
|
+
**TTFB·LCP·SEO에 영향**
|
|
77
|
+
|
|
78
|
+
- 정적 콘텐츠(랜딩, 블로그, 약관)에 SSG 또는 RSC가 적용되어 있는지 확인한다.
|
|
79
|
+
- 인증이 필요한 페이지가 아님에도 전체 페이지를 `'use client'`로 선언했는지 점검한다.
|
|
80
|
+
- `useEffect`로 초기 데이터를 fetch하는 경우 서버 컴포넌트 또는 loader로 대체 가능한지 검토한다.
|
|
81
|
+
- PPR(Partial Prerendering)이 적용 가능한 페이지가 있는지 확인한다 (정적 shell + 동적 Suspense).
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# 전체 페이지 단위 'use client' 확인
|
|
85
|
+
grep -rn "'use client'" src/app/ --include="*.tsx"
|
|
86
|
+
|
|
87
|
+
# useEffect 데이터 fetch 패턴
|
|
88
|
+
grep -rn "useEffect.*fetch\|useEffect.*axios\|useEffect.*api" src/ --include="*.tsx" -l
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- 체크:
|
|
92
|
+
- [ ] 정적 콘텐츠에 SSG/RSC가 적용되어 있는가?
|
|
93
|
+
- [ ] 불필요하게 전체 페이지가 클라이언트 컴포넌트로 선언되지 않았는가?
|
|
94
|
+
- [ ] 초기 데이터 fetch를 서버에서 처리하는가?
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Check 3: 번들 크기
|
|
99
|
+
|
|
100
|
+
**FCP·TTI(Time to Interactive)에 영향**
|
|
101
|
+
|
|
102
|
+
- 빌드 출력에서 페이지별 번들 크기를 확인한다. 단일 페이지 JS가 250kB(gzip)를 초과하면 분할을 검토한다.
|
|
103
|
+
- 초기 로드에 불필요한 대형 라이브러리(차트, 에디터, 날짜 피커 등)가 동적 import 없이 포함되었는지 확인한다.
|
|
104
|
+
- `barrel export`(`index.ts`에서 전체 재내보내기) 사용 시 tree-shaking이 방해되는지 점검한다.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# 빌드 실행 및 번들 크기 확인
|
|
108
|
+
npm run build 2>&1 | grep -E "Page|Size|First Load"
|
|
109
|
+
|
|
110
|
+
# 대형 의존성 탐지
|
|
111
|
+
grep -rn "^import.*from 'recharts\|chart.js\|@tiptap\|react-quill\|moment\|lodash'" src/ --include="*.tsx" --include="*.ts" | grep -v "dynamic"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
- 체크:
|
|
115
|
+
- [ ] 단일 페이지 First Load JS가 250kB 이하인가?
|
|
116
|
+
- [ ] 대형 라이브러리에 동적 import(`next/dynamic`, `React.lazy`)가 적용되었는가?
|
|
117
|
+
- [ ] 사용하지 않는 패키지가 포함되지 않았는가?
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Check 4: 폰트 최적화
|
|
122
|
+
|
|
123
|
+
**CLS·FCP에 영향**
|
|
124
|
+
|
|
125
|
+
- `next/font` 또는 `@font-face`의 `font-display: swap`이 적용되어 있는지 확인한다.
|
|
126
|
+
- Google Fonts를 `<link>` 태그로 직접 로드하는 경우 `next/font/google`로 대체를 권장한다.
|
|
127
|
+
- 폰트 파일이 self-hosted인 경우 `preload` 힌트가 적용되어 있는지 확인한다.
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
grep -rn "fonts.googleapis\|fonts.gstatic" src/ --include="*.tsx" --include="*.html"
|
|
131
|
+
grep -rn "next/font" src/ --include="*.tsx" -l
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
- 체크:
|
|
135
|
+
- [ ] Google Fonts를 `next/font/google`로 로드하는가?
|
|
136
|
+
- [ ] `font-display: swap`이 적용되어 레이아웃 시프트가 방지되는가?
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Check 5: 불필요한 리렌더링
|
|
141
|
+
|
|
142
|
+
**INP·런타임 성능에 영향**
|
|
143
|
+
|
|
144
|
+
- 부모 컴포넌트 상태 변경 시 자식이 불필요하게 리렌더링되는지 확인한다. `React.memo`, `useMemo`, `useCallback` 적용이 필요한 곳을 점검한다.
|
|
145
|
+
- 리스트 렌더링에 `key` prop이 올바르게 사용되는지 확인한다 (index 사용 지양).
|
|
146
|
+
- 전역 상태(Context, Zustand 등)가 너무 넓은 범위에서 구독되어 불필요한 리렌더링을 유발하는지 점검한다.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
grep -rn "key={index}\|key={i}" src/ --include="*.tsx"
|
|
150
|
+
grep -rn "React\.memo\|useMemo\|useCallback" src/ --include="*.tsx" -l
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
- 체크:
|
|
154
|
+
- [ ] 리스트 `key`에 index 대신 고유 ID를 사용하는가?
|
|
155
|
+
- [ ] 무거운 연산에 `useMemo`/`useCallback`이 적용되었는가?
|
|
156
|
+
- [ ] Context가 필요한 범위에만 적용되어 있는가?
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Check 6: Lighthouse 실측 점검
|
|
161
|
+
|
|
162
|
+
코드 분석만으로는 실제 점수를 확인할 수 없다. 아래 방법으로 실측을 안내한다.
|
|
163
|
+
|
|
164
|
+
**브라우저 직접 측정 (권장):**
|
|
165
|
+
1. Chrome DevTools → Lighthouse 탭 → "Performance" 선택 → "Analyze page load" 실행
|
|
166
|
+
2. Incognito 모드에서 실행 (확장 프로그램 영향 제거)
|
|
167
|
+
3. Mobile / Desktop 각각 측정
|
|
168
|
+
|
|
169
|
+
**CLI 측정:**
|
|
170
|
+
```bash
|
|
171
|
+
# Lighthouse CLI 설치 및 실행
|
|
172
|
+
npx lighthouse http://localhost:3000 --view --output=html
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**측정 결과 기록 위치:** `docs/05_QA_Validation/` 에 `PERFORMANCE_REPORT.md` 로 저장한다.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 보고 형식
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
## 성능 점검 결과
|
|
183
|
+
|
|
184
|
+
### Lighthouse 목표 대비 현황
|
|
185
|
+
| 지표 | 목표 | 현재 | 상태 |
|
|
186
|
+
|------|:----:|:----:|:----:|
|
|
187
|
+
| Performance Score | 90+ | - | 실측 필요 |
|
|
188
|
+
| LCP | ≤ 2.5s | - | 실측 필요 |
|
|
189
|
+
| CLS | ≤ 0.1 | - | 실측 필요 |
|
|
190
|
+
|
|
191
|
+
### PASS 항목
|
|
192
|
+
- (문제 없는 체크 요약)
|
|
193
|
+
|
|
194
|
+
### 개선 필요 항목
|
|
195
|
+
| 위치 | 체크 영역 | 내용 | 예상 영향 |
|
|
196
|
+
|------|-----------|------|:---------:|
|
|
197
|
+
| src/pages/Home.tsx | 이미지 최적화 | <img> 직접 사용, LCP 지연 가능성 | LCP |
|
|
198
|
+
| src/app/layout.tsx | 폰트 최적화 | Google Fonts <link> 직접 로드 | CLS·FCP |
|
|
199
|
+
|
|
200
|
+
### 수정 권장 우선순위
|
|
201
|
+
1. [높음] ...
|
|
202
|
+
2. [중] ...
|
|
203
|
+
3. [낮음] ...
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Exceptions
|
|
209
|
+
|
|
210
|
+
1. **관리자 페이지**: 내부 사용자 전용 페이지는 Performance 70+ 기준을 적용한다.
|
|
211
|
+
2. **대형 에디터·지도 컴포넌트**: 라이브러리 특성상 번들이 큰 경우, `next/dynamic`으로 lazy load 처리 후 패스 처리한다.
|
|
212
|
+
3. **개발 환경 측정값**: Lighthouse는 반드시 `npm run build && npm start` 이후 프로덕션 빌드 기준으로 측정한다. 개발 서버(`npm run dev`) 측정값은 참고용으로만 사용한다.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 관련 스킬
|
|
217
|
+
|
|
218
|
+
- `verify-code`: 코드 품질 전반 리뷰
|
|
219
|
+
- `verify-security`: 보안 취약점 점검
|
|
220
|
+
- `rules-dev`: 렌더링 전략·코드 스플리팅 컨벤션 기준
|
|
221
|
+
- `verify-implementation`: 전체 verify-* 통합 실행 시 포함 대상
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: verify-security
|
|
3
|
+
description: 코드베이스의 보안 취약점을 점검합니다. OWASP Top 10 기준으로 인증·인가, 입력 검증, 시크릿 노출, SQL/XSS/CSRF 등 핵심 보안 이슈를 체계적으로 검증합니다. 보안 점검 요청, PR 전 보안 리뷰, 또는 "보안 확인해줘" 요청 시 사용합니다.
|
|
4
|
+
argument-hint: "[선택사항: 점검할 파일 경로, 기능명, 또는 집중 영역(예: auth, api, db)]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 보안 점검 스킬 (verify-security)
|
|
8
|
+
|
|
9
|
+
OWASP Top 10 및 프로젝트 공통 보안 기준에 따라 코드베이스의 보안 취약점을 검증합니다. 발견된 이슈를 심각도와 함께 보고하고 수정 방향을 제시합니다.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 실행 시점
|
|
14
|
+
|
|
15
|
+
- PR 전 보안 최종 검토
|
|
16
|
+
- 인증·인가·API·DB 관련 코드 변경 후
|
|
17
|
+
- 새 외부 입력 처리 경로(폼, URL 파라미터, 파일 업로드) 추가 시
|
|
18
|
+
- `rules-workflow` Step 7 (버그·크리티컬·보안 검토) 수행 시
|
|
19
|
+
- "보안 점검해줘", "취약점 확인해줘" 요청 시
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Step 0: 점검 범위 확정
|
|
24
|
+
|
|
25
|
+
인자가 주어진 경우 해당 영역에 집중한다. 없으면 아래 명령으로 변경 파일을 확인하고 보안 관련 파일(auth, api, middleware, db, env)을 우선 점검한다.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
git diff --name-only HEAD
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
보안 관련 파일 빠른 탐색:
|
|
32
|
+
```bash
|
|
33
|
+
# 인증·인가 관련
|
|
34
|
+
grep -rn "session\|token\|cookie\|jwt\|auth" src/ --include="*.ts" --include="*.tsx" -l
|
|
35
|
+
|
|
36
|
+
# 환경변수·시크릿 관련
|
|
37
|
+
grep -rn "process\.env\|NEXT_PUBLIC_" src/ --include="*.ts" --include="*.tsx" -l
|
|
38
|
+
|
|
39
|
+
# DB 쿼리 관련
|
|
40
|
+
grep -rn "sql\|query\|execute\|prepare" src/ --include="*.ts" -l
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Check 1: 시크릿 및 민감 정보 노출
|
|
46
|
+
|
|
47
|
+
**OWASP A02: Cryptographic Failures**
|
|
48
|
+
|
|
49
|
+
- 소스코드에 API 키, 비밀번호, JWT 시크릿 등이 하드코딩되어 있는지 확인한다.
|
|
50
|
+
- `NEXT_PUBLIC_` 접두어가 붙은 환경변수에 민감 정보가 포함되어 있는지 확인한다 (클라이언트에 노출됨).
|
|
51
|
+
- `.env*` 파일이 `.gitignore`에 포함되어 있는지 확인한다.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 하드코딩 시크릿 탐지
|
|
55
|
+
grep -rn "sk-\|API_KEY\|SECRET\|PASSWORD\|private_key" src/ --include="*.ts" --include="*.tsx"
|
|
56
|
+
grep -rn "NEXT_PUBLIC_.*SECRET\|NEXT_PUBLIC_.*KEY\|NEXT_PUBLIC_.*TOKEN" src/
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- 체크:
|
|
60
|
+
- [ ] 코드에 하드코딩된 시크릿이 없는가?
|
|
61
|
+
- [ ] 민감 정보가 `NEXT_PUBLIC_` 환경변수에 없는가?
|
|
62
|
+
- [ ] `.env*`가 `.gitignore`에 포함되어 있는가?
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Check 2: 인증 및 인가
|
|
67
|
+
|
|
68
|
+
**OWASP A01: Broken Access Control**
|
|
69
|
+
|
|
70
|
+
- 보호된 API 라우트·페이지에서 세션/토큰 검증이 수행되는지 확인한다.
|
|
71
|
+
- 사용자 ID, 역할(role)을 클라이언트 파라미터로 받아 신뢰하지 않는지 확인한다 (서버에서 세션 기반으로 결정해야 함).
|
|
72
|
+
- 관리자 전용 기능에 역할 검증이 적용되어 있는지 확인한다.
|
|
73
|
+
- 체크:
|
|
74
|
+
- [ ] 모든 보호 라우트에 인증 미들웨어·검증이 있는가?
|
|
75
|
+
- [ ] 역할·권한을 서버 세션에서 결정하는가? (클라이언트 파라미터 신뢰 금지)
|
|
76
|
+
- [ ] 인증되지 않은 요청이 데이터를 반환하지 않는가?
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Check 3: 입력 검증 및 XSS
|
|
81
|
+
|
|
82
|
+
**OWASP A03: Injection / A07: XSS**
|
|
83
|
+
|
|
84
|
+
- 외부 입력(폼, URL 파라미터, 헤더)에 Zod 등 스키마 검증이 적용되었는지 확인한다.
|
|
85
|
+
- `dangerouslySetInnerHTML` 사용 여부를 확인하고 입력값이 그대로 주입되지 않는지 점검한다.
|
|
86
|
+
- URL 파라미터를 URL 생성이나 리다이렉트에 사용할 때 검증 없이 넣지 않는지 확인한다.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
grep -rn "dangerouslySetInnerHTML" src/ --include="*.tsx"
|
|
90
|
+
grep -rn "innerHTML\|document\.write" src/ --include="*.ts" --include="*.tsx"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- 체크:
|
|
94
|
+
- [ ] 모든 외부 입력에 런타임 스키마 검증이 적용되었는가?
|
|
95
|
+
- [ ] `dangerouslySetInnerHTML` 사용 시 값이 sanitize되었는가?
|
|
96
|
+
- [ ] XSS 주입이 가능한 경로가 없는가?
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Check 4: SQL 인젝션 및 DB 안전성
|
|
101
|
+
|
|
102
|
+
**OWASP A03: Injection**
|
|
103
|
+
|
|
104
|
+
- 사용자 입력을 SQL 쿼리 문자열에 직접 삽입하는지 확인한다. ORM(Drizzle 등)의 파라미터 바인딩을 사용해야 한다.
|
|
105
|
+
- Raw query 사용 시 파라미터가 바인딩 방식으로 전달되는지 점검한다.
|
|
106
|
+
- 삭제·대량 업데이트 쿼리에 `WHERE` 조건이 누락되지 않았는지 확인한다.
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
grep -rn "sql\`\|execute(\|query(" src/ --include="*.ts" -A 3
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- 체크:
|
|
113
|
+
- [ ] 사용자 입력이 쿼리 문자열에 직접 삽입되지 않는가?
|
|
114
|
+
- [ ] Raw query 사용 시 파라미터 바인딩이 적용되었는가?
|
|
115
|
+
- [ ] 삭제·업데이트 쿼리에 WHERE 조건이 있는가?
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Check 5: CSRF 및 API 보안
|
|
120
|
+
|
|
121
|
+
**OWASP A01: Broken Access Control**
|
|
122
|
+
|
|
123
|
+
- 상태 변경(POST/PUT/DELETE) API에 CSRF 토큰 또는 SameSite 쿠키 설정이 적용되어 있는지 확인한다.
|
|
124
|
+
- API 라우트에서 HTTP 메서드 제한이 적용되어 있는지 확인한다 (GET 라우트가 쓰기 동작을 하지 않는가).
|
|
125
|
+
- Rate limiting이 없는 인증·OTP·비밀번호 변경 API가 있는지 확인한다.
|
|
126
|
+
- 체크:
|
|
127
|
+
- [ ] 상태 변경 API에 CSRF 방어가 적용되었는가?
|
|
128
|
+
- [ ] GET 라우트가 데이터를 변경하지 않는가?
|
|
129
|
+
- [ ] 민감 API에 rate limiting이 적용되었는가?
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Check 6: 의존성 취약점
|
|
134
|
+
|
|
135
|
+
**OWASP A06: Vulnerable and Outdated Components**
|
|
136
|
+
|
|
137
|
+
- 알려진 취약점이 있는 패키지가 있는지 확인한다.
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
npm audit --audit-level=high
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- 체크:
|
|
144
|
+
- [ ] `npm audit` 결과 high/critical 취약점이 없는가?
|
|
145
|
+
- [ ] 사용하지 않는 패키지가 정리되었는가?
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Check 7: 로깅 및 에러 노출
|
|
150
|
+
|
|
151
|
+
**OWASP A09: Security Logging and Monitoring Failures**
|
|
152
|
+
|
|
153
|
+
- 에러 응답에 스택 트레이스, DB 쿼리, 내부 경로 등 민감 정보가 포함되지 않는지 확인한다.
|
|
154
|
+
- 클라이언트에 반환하는 에러 메시지가 내부 구현을 노출하지 않는지 점검한다.
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
grep -rn "catch.*console\|catch.*res\.json\|catch.*res\.send" src/ --include="*.ts" -A 2
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- 체크:
|
|
161
|
+
- [ ] 에러 응답에 스택 트레이스가 포함되지 않는가?
|
|
162
|
+
- [ ] 에러 메시지가 내부 구현을 노출하지 않는가?
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 보고 형식
|
|
167
|
+
|
|
168
|
+
점검 결과는 다음 형식으로 보고한다:
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
## 보안 점검 결과
|
|
172
|
+
|
|
173
|
+
### PASS 항목
|
|
174
|
+
- (문제 없는 체크 요약)
|
|
175
|
+
|
|
176
|
+
### 취약점 발견 항목
|
|
177
|
+
| 위치 | OWASP | 내용 | 심각도 |
|
|
178
|
+
|------|-------|------|:------:|
|
|
179
|
+
| src/api/user.ts:30 | A01 | 역할 검증 없이 관리자 데이터 반환 | 높음 |
|
|
180
|
+
| src/components/Post.tsx:12 | A03 | dangerouslySetInnerHTML에 미검증 값 삽입 | 높음 |
|
|
181
|
+
| .env.local | A02 | .gitignore 미등록 | 높음 |
|
|
182
|
+
|
|
183
|
+
### 수정 방향
|
|
184
|
+
1. [높음] ...
|
|
185
|
+
2. [중] ...
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
심각도 기준: **높음** (즉시 수정 필요, 배포 차단) / **중** (배포 전 수정 권장) / **낮음** (보완 권장)
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Exceptions
|
|
193
|
+
|
|
194
|
+
1. **Third-party auth providers**: NextAuth, Clerk 등 외부 인증 라이브러리의 내부 구현은 점검 대상에서 제외한다.
|
|
195
|
+
2. **개발 환경 전용 코드**: `NODE_ENV === 'development'` 조건 내 디버그 로그는 심각도 낮음으로 처리한다.
|
|
196
|
+
3. **의도적 Public 엔드포인트**: 인증 없이 공개된 API가 설계상 의도된 경우, AGENTS.md 또는 API_SPECS.md에 명시된 근거가 있으면 패스 처리한다.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 관련 스킬
|
|
201
|
+
|
|
202
|
+
- `verify-code`: 보안 외 코드 품질 전반 리뷰
|
|
203
|
+
- `rules-dev`: 환경변수·DB 안전성 컨벤션 기준
|
|
204
|
+
- `rules-workflow`: Step 7 보안 검토와 연동
|
|
205
|
+
- `verify-implementation`: 전체 verify-* 통합 실행 시 포함 대상
|
package/design-md/README.md
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# Stitch Design System Documentation Skill
|
|
2
|
-
|
|
3
|
-
## Install
|
|
4
|
-
|
|
5
|
-
```bash
|
|
6
|
-
npx add-skill google-labs-code/stitch-skills --skill design-md --global
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
## Example Prompt
|
|
10
|
-
|
|
11
|
-
```text
|
|
12
|
-
Analyze my Furniture Collection project's Home screen and generate a comprehensive DESIGN.md file documenting the design system.
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Skill Structure
|
|
16
|
-
|
|
17
|
-
This repository follows the **Agent Skills** open standard. Each skill is self-contained with its own logic, workflow, and reference materials.
|
|
18
|
-
|
|
19
|
-
```text
|
|
20
|
-
design-md/
|
|
21
|
-
├── SKILL.md — Core instructions & workflow
|
|
22
|
-
├── examples/ — Sample DESIGN.md outputs
|
|
23
|
-
└── README.md — This file
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## How it Works
|
|
27
|
-
|
|
28
|
-
When activated, the agent follows a structured design analysis pipeline:
|
|
29
|
-
|
|
30
|
-
1. **Retrieval**: Uses the Stitch MCP Server to fetch project screens, HTML code, and design metadata.
|
|
31
|
-
2. **Extraction**: Identifies design tokens including colors, typography, spacing, and component patterns.
|
|
32
|
-
3. **Translation**: Converts technical CSS/Tailwind values into descriptive, natural design language.
|
|
33
|
-
4. **Synthesis**: Generates a comprehensive DESIGN.md following the semantic design system format.
|
|
34
|
-
5. **Alignment**: Ensures output follows Stitch Effective Prompting Guide principles for optimal screen generation.
|
package/design-md/SKILL.md
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: design-md
|
|
3
|
-
description: Analyze Stitch projects and synthesize a semantic design system into DESIGN.md files
|
|
4
|
-
allowed-tools:
|
|
5
|
-
- "stitch*:*"
|
|
6
|
-
- "Read"
|
|
7
|
-
- "Write"
|
|
8
|
-
- "web_fetch"
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Stitch DESIGN.md Skill
|
|
12
|
-
|
|
13
|
-
You are an expert Design Systems Lead. Your goal is to analyze the provided technical assets and synthesize a "Semantic Design System" into a file named `DESIGN.md`.
|
|
14
|
-
|
|
15
|
-
## Overview
|
|
16
|
-
|
|
17
|
-
This skill helps you create `DESIGN.md` files that serve as the "source of truth" for prompting Stitch to generate new screens that align perfectly with existing design language. Stitch interprets design through "Visual Descriptions" supported by specific color values.
|
|
18
|
-
|
|
19
|
-
## Prerequisites
|
|
20
|
-
|
|
21
|
-
- Access to the Stitch MCP Server
|
|
22
|
-
- A Stitch project with at least one designed screen
|
|
23
|
-
- Access to the Stitch Effective Prompting Guide: https://stitch.withgoogle.com/docs/learn/prompting/
|
|
24
|
-
|
|
25
|
-
## The Goal
|
|
26
|
-
|
|
27
|
-
The `DESIGN.md` file will serve as the "source of truth" for prompting Stitch to generate new screens that align perfectly with the existing design language. Stitch interprets design through "Visual Descriptions" supported by specific color values.
|
|
28
|
-
|
|
29
|
-
## Retrieval and Networking
|
|
30
|
-
|
|
31
|
-
To analyze a Stitch project, you must retrieve screen metadata and design assets using the Stitch MCP Server tools:
|
|
32
|
-
|
|
33
|
-
1. **Namespace discovery**: Run `list_tools` to find the Stitch MCP prefix. Use this prefix (e.g., `mcp_stitch:`) for all subsequent calls.
|
|
34
|
-
|
|
35
|
-
2. **Project lookup** (if Project ID is not provided):
|
|
36
|
-
- Call `[prefix]:list_projects` with `filter: "view=owned"` to retrieve all user projects
|
|
37
|
-
- Identify the target project by title or URL pattern
|
|
38
|
-
- Extract the Project ID from the `name` field (e.g., `projects/13534454087919359824`)
|
|
39
|
-
|
|
40
|
-
3. **Screen lookup** (if Screen ID is not provided):
|
|
41
|
-
- Call `[prefix]:list_screens` with the `projectId` (just the numeric ID, not the full path)
|
|
42
|
-
- Review screen titles to identify the target screen (e.g., "Home", "Landing Page")
|
|
43
|
-
- Extract the Screen ID from the screen's `name` field
|
|
44
|
-
|
|
45
|
-
4. **Metadata fetch**:
|
|
46
|
-
- Call `[prefix]:get_screen` with both `projectId` and `screenId` (both as numeric IDs only)
|
|
47
|
-
- This returns the complete screen object including:
|
|
48
|
-
- `screenshot.downloadUrl` - Visual reference of the design
|
|
49
|
-
- `htmlCode.downloadUrl` - Full HTML/CSS source code
|
|
50
|
-
- `width`, `height`, `deviceType` - Screen dimensions and target platform
|
|
51
|
-
- Project metadata including `designTheme` with color and style information
|
|
52
|
-
|
|
53
|
-
5. **Asset download**:
|
|
54
|
-
- Use `web_fetch` or `read_url_content` to download the HTML code from `htmlCode.downloadUrl`
|
|
55
|
-
- Optionally download the screenshot from `screenshot.downloadUrl` for visual reference
|
|
56
|
-
- Parse the HTML to extract Tailwind classes, custom CSS, and component patterns
|
|
57
|
-
|
|
58
|
-
6. **Project metadata extraction**:
|
|
59
|
-
- Call `[prefix]:get_project` with the project `name` (full path: `projects/{id}`) to get:
|
|
60
|
-
- `designTheme` object with color mode, fonts, roundness, custom colors
|
|
61
|
-
- Project-level design guidelines and descriptions
|
|
62
|
-
- Device type preferences and layout principles
|
|
63
|
-
|
|
64
|
-
## Analysis & Synthesis Instructions
|
|
65
|
-
|
|
66
|
-
### 1. Extract Project Identity (JSON)
|
|
67
|
-
- Locate the Project Title
|
|
68
|
-
- Locate the specific Project ID (e.g., from the `name` field in the JSON)
|
|
69
|
-
|
|
70
|
-
### 2. Define the Atmosphere (Image/HTML)
|
|
71
|
-
Evaluate the screenshot and HTML structure to capture the overall "vibe." Use evocative adjectives to describe the mood (e.g., "Airy," "Dense," "Minimalist," "Utilitarian").
|
|
72
|
-
|
|
73
|
-
### 3. Map the Color Palette (Tailwind Config/JSON)
|
|
74
|
-
Identify the key colors in the system. For each color, provide:
|
|
75
|
-
- A descriptive, natural language name that conveys its character (e.g., "Deep Muted Teal-Navy")
|
|
76
|
-
- The specific hex code in parentheses for precision (e.g., "#294056")
|
|
77
|
-
- Its specific functional role (e.g., "Used for primary actions")
|
|
78
|
-
|
|
79
|
-
### 4. Translate Geometry & Shape (CSS/Tailwind)
|
|
80
|
-
Convert technical `border-radius` and layout values into physical descriptions:
|
|
81
|
-
- Describe `rounded-full` as "Pill-shaped"
|
|
82
|
-
- Describe `rounded-lg` as "Subtly rounded corners"
|
|
83
|
-
- Describe `rounded-none` as "Sharp, squared-off edges"
|
|
84
|
-
|
|
85
|
-
### 5. Describe Depth & Elevation
|
|
86
|
-
Explain how the UI handles layers. Describe the presence and quality of shadows (e.g., "Flat," "Whisper-soft diffused shadows," or "Heavy, high-contrast drop shadows").
|
|
87
|
-
|
|
88
|
-
## Output Guidelines
|
|
89
|
-
|
|
90
|
-
- **Language:** Use descriptive design terminology and natural language exclusively
|
|
91
|
-
- **Format:** Generate a clean Markdown file following the structure below
|
|
92
|
-
- **Precision:** Include exact hex codes for colors while using descriptive names
|
|
93
|
-
- **Context:** Explain the "why" behind design decisions, not just the "what"
|
|
94
|
-
|
|
95
|
-
## Output Format (DESIGN.md Structure)
|
|
96
|
-
|
|
97
|
-
```markdown
|
|
98
|
-
# Design System: [Project Title]
|
|
99
|
-
**Project ID:** [Insert Project ID Here]
|
|
100
|
-
|
|
101
|
-
## 1. Visual Theme & Atmosphere
|
|
102
|
-
(Description of the mood, density, and aesthetic philosophy.)
|
|
103
|
-
|
|
104
|
-
## 2. Color Palette & Roles
|
|
105
|
-
(List colors by Descriptive Name + Hex Code + Functional Role.)
|
|
106
|
-
|
|
107
|
-
## 3. Typography Rules
|
|
108
|
-
(Description of font family, weight usage for headers vs. body, and letter-spacing character.)
|
|
109
|
-
|
|
110
|
-
## 4. Component Stylings
|
|
111
|
-
* **Buttons:** (Shape description, color assignment, behavior).
|
|
112
|
-
* **Cards/Containers:** (Corner roundness description, background color, shadow depth).
|
|
113
|
-
* **Inputs/Forms:** (Stroke style, background).
|
|
114
|
-
|
|
115
|
-
## 5. Layout Principles
|
|
116
|
-
(Description of whitespace strategy, margins, and grid alignment.)
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Usage Example
|
|
120
|
-
|
|
121
|
-
To use this skill for the Furniture Collection project:
|
|
122
|
-
|
|
123
|
-
1. **Retrieve project information:**
|
|
124
|
-
```
|
|
125
|
-
Use the Stitch MCP Server to get the Furniture Collection project
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
2. **Get the Home page screen details:**
|
|
129
|
-
```
|
|
130
|
-
Retrieve the Home page screen's code, image, and screen object information
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
3. **Reference best practices:**
|
|
134
|
-
```
|
|
135
|
-
Review the Stitch Effective Prompting Guide at:
|
|
136
|
-
https://stitch.withgoogle.com/docs/learn/prompting/
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
4. **Analyze and synthesize:**
|
|
140
|
-
- Extract all relevant design tokens from the screen
|
|
141
|
-
- Translate technical values into descriptive language
|
|
142
|
-
- Organize information according to the DESIGN.md structure
|
|
143
|
-
|
|
144
|
-
5. **Generate the file:**
|
|
145
|
-
- Create `DESIGN.md` in the project directory
|
|
146
|
-
- Follow the prescribed format exactly
|
|
147
|
-
- Ensure all color codes are accurate
|
|
148
|
-
- Use evocative, designer-friendly language
|
|
149
|
-
|
|
150
|
-
## Best Practices
|
|
151
|
-
|
|
152
|
-
- **Be Descriptive:** Avoid generic terms like "blue" or "rounded." Use "Ocean-deep Cerulean (#0077B6)" or "Gently curved edges"
|
|
153
|
-
- **Be Functional:** Always explain what each design element is used for
|
|
154
|
-
- **Be Consistent:** Use the same terminology throughout the document
|
|
155
|
-
- **Be Visual:** Help readers visualize the design through your descriptions
|
|
156
|
-
- **Be Precise:** Include exact values (hex codes, pixel values) in parentheses after natural language descriptions
|
|
157
|
-
|
|
158
|
-
## Tips for Success
|
|
159
|
-
|
|
160
|
-
1. **Start with the big picture:** Understand the overall aesthetic before diving into details
|
|
161
|
-
2. **Look for patterns:** Identify consistent spacing, sizing, and styling patterns
|
|
162
|
-
3. **Think semantically:** Name colors by their purpose, not just their appearance
|
|
163
|
-
4. **Consider hierarchy:** Document how visual weight and importance are communicated
|
|
164
|
-
5. **Reference the guide:** Use language and patterns from the Stitch Effective Prompting Guide
|
|
165
|
-
|
|
166
|
-
## Common Pitfalls to Avoid
|
|
167
|
-
|
|
168
|
-
- ❌ Using technical jargon without translation (e.g., "rounded-xl" instead of "generously rounded corners")
|
|
169
|
-
- ❌ Omitting color codes or using only descriptive names
|
|
170
|
-
- ❌ Forgetting to explain functional roles of design elements
|
|
171
|
-
- ❌ Being too vague in atmosphere descriptions
|
|
172
|
-
- ❌ Ignoring subtle design details like shadows or spacing patterns
|