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,316 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flutter
|
|
3
|
+
description: "Expert Flutter guide covering widget composition, state management (Riverpod, BLoC), navigation (GoRouter), Dart best practices (null safety, freezed, sealed classes), platform channels, performance (const widgets, RepaintBoundary, DevTools), testing (widget tests, golden tests, integration), and deployment (Fastlane, Codemagic). Use when building cross-platform apps with Flutter."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Flutter Expert Guide
|
|
8
|
+
|
|
9
|
+
> Use this skill when building iOS/Android/Web/Desktop apps with Flutter. Targets Flutter 3.x with Dart 3.x.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- Building cross-platform apps (iOS, Android, Web, Desktop)
|
|
14
|
+
- Designing widget hierarchies and custom UI
|
|
15
|
+
- Implementing state management patterns
|
|
16
|
+
- Optimizing Flutter rendering performance
|
|
17
|
+
- Writing widget and integration tests
|
|
18
|
+
|
|
19
|
+
## When NOT to Use This Skill
|
|
20
|
+
|
|
21
|
+
- React Native projects → use React Native skill
|
|
22
|
+
- Native iOS only → use SwiftUI
|
|
23
|
+
- Web-only → use a frontend framework
|
|
24
|
+
- Game development → use Flame engine or Godot
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. Project Structure (CRITICAL)
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
lib/
|
|
32
|
+
├── main.dart # Entry point
|
|
33
|
+
├── app/ # App-level config
|
|
34
|
+
│ ├── app.dart # MaterialApp / GoRouter setup
|
|
35
|
+
│ └── theme.dart # ThemeData
|
|
36
|
+
├── features/ # Feature-first organization
|
|
37
|
+
│ ├── auth/
|
|
38
|
+
│ │ ├── data/ # Repositories, data sources
|
|
39
|
+
│ │ ├── domain/ # Models, use cases
|
|
40
|
+
│ │ └── presentation/ # Screens, widgets, controllers
|
|
41
|
+
│ └── home/
|
|
42
|
+
│ ├── data/
|
|
43
|
+
│ ├── domain/
|
|
44
|
+
│ └── presentation/
|
|
45
|
+
├── shared/ # Cross-feature code
|
|
46
|
+
│ ├── widgets/ # Reusable UI components
|
|
47
|
+
│ ├── extensions/ # Dart extensions
|
|
48
|
+
│ └── utils/ # Helpers
|
|
49
|
+
└── l10n/ # Localization
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 2. Widget Composition (CRITICAL)
|
|
55
|
+
|
|
56
|
+
### Composition Over Inheritance
|
|
57
|
+
|
|
58
|
+
```dart
|
|
59
|
+
// ✅ Small, focused widgets
|
|
60
|
+
class UserAvatar extends StatelessWidget {
|
|
61
|
+
const UserAvatar({
|
|
62
|
+
super.key,
|
|
63
|
+
required this.imageUrl,
|
|
64
|
+
this.size = 40,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
final String imageUrl;
|
|
68
|
+
final double size;
|
|
69
|
+
|
|
70
|
+
@override
|
|
71
|
+
Widget build(BuildContext context) {
|
|
72
|
+
return ClipRRect(
|
|
73
|
+
borderRadius: BorderRadius.circular(size / 2),
|
|
74
|
+
child: CachedNetworkImage(
|
|
75
|
+
imageUrl: imageUrl,
|
|
76
|
+
width: size,
|
|
77
|
+
height: size,
|
|
78
|
+
fit: BoxFit.cover,
|
|
79
|
+
placeholder: (_, __) => const CircularProgressIndicator(),
|
|
80
|
+
errorWidget: (_, __, ___) => const Icon(Icons.person),
|
|
81
|
+
),
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Use `const` Constructors
|
|
88
|
+
|
|
89
|
+
```dart
|
|
90
|
+
// ✅ const prevents unnecessary rebuilds
|
|
91
|
+
const SizedBox(height: 16);
|
|
92
|
+
const Divider();
|
|
93
|
+
const Text('Static text');
|
|
94
|
+
|
|
95
|
+
// ✅ const constructor in custom widgets
|
|
96
|
+
class AppCard extends StatelessWidget {
|
|
97
|
+
const AppCard({super.key, required this.child});
|
|
98
|
+
final Widget child;
|
|
99
|
+
|
|
100
|
+
@override
|
|
101
|
+
Widget build(BuildContext context) => Card(child: child);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 3. State Management
|
|
108
|
+
|
|
109
|
+
### Riverpod (Recommended)
|
|
110
|
+
|
|
111
|
+
```dart
|
|
112
|
+
// Provider definition
|
|
113
|
+
final userProvider = FutureProvider.autoDispose<User>((ref) async {
|
|
114
|
+
final repository = ref.watch(userRepositoryProvider);
|
|
115
|
+
return repository.getCurrentUser();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Notifier for mutable state
|
|
119
|
+
@riverpod
|
|
120
|
+
class Counter extends _$Counter {
|
|
121
|
+
@override
|
|
122
|
+
int build() => 0;
|
|
123
|
+
|
|
124
|
+
void increment() => state++;
|
|
125
|
+
void decrement() => state--;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Consuming in a widget
|
|
129
|
+
class HomePage extends ConsumerWidget {
|
|
130
|
+
const HomePage({super.key});
|
|
131
|
+
|
|
132
|
+
@override
|
|
133
|
+
Widget build(BuildContext context, WidgetRef ref) {
|
|
134
|
+
final userAsync = ref.watch(userProvider);
|
|
135
|
+
|
|
136
|
+
return userAsync.when(
|
|
137
|
+
data: (user) => Text('Hello, ${user.name}'),
|
|
138
|
+
loading: () => const CircularProgressIndicator(),
|
|
139
|
+
error: (err, stack) => Text('Error: $err'),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### BLoC Pattern
|
|
146
|
+
|
|
147
|
+
```dart
|
|
148
|
+
// Events
|
|
149
|
+
sealed class AuthEvent {}
|
|
150
|
+
class LoginRequested extends AuthEvent {
|
|
151
|
+
final String email;
|
|
152
|
+
final String password;
|
|
153
|
+
LoginRequested({required this.email, required this.password});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// States
|
|
157
|
+
sealed class AuthState {}
|
|
158
|
+
class AuthInitial extends AuthState {}
|
|
159
|
+
class AuthLoading extends AuthState {}
|
|
160
|
+
class AuthSuccess extends AuthState {
|
|
161
|
+
final User user;
|
|
162
|
+
AuthSuccess(this.user);
|
|
163
|
+
}
|
|
164
|
+
class AuthFailure extends AuthState {
|
|
165
|
+
final String message;
|
|
166
|
+
AuthFailure(this.message);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Bloc
|
|
170
|
+
class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|
171
|
+
AuthBloc(this._authRepository) : super(AuthInitial()) {
|
|
172
|
+
on<LoginRequested>(_onLoginRequested);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
final AuthRepository _authRepository;
|
|
176
|
+
|
|
177
|
+
Future<void> _onLoginRequested(
|
|
178
|
+
LoginRequested event,
|
|
179
|
+
Emitter<AuthState> emit,
|
|
180
|
+
) async {
|
|
181
|
+
emit(AuthLoading());
|
|
182
|
+
try {
|
|
183
|
+
final user = await _authRepository.login(event.email, event.password);
|
|
184
|
+
emit(AuthSuccess(user));
|
|
185
|
+
} catch (e) {
|
|
186
|
+
emit(AuthFailure(e.toString()));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 4. Navigation (GoRouter)
|
|
195
|
+
|
|
196
|
+
```dart
|
|
197
|
+
final router = GoRouter(
|
|
198
|
+
initialLocation: '/',
|
|
199
|
+
redirect: (context, state) {
|
|
200
|
+
final isLoggedIn = /* check auth */;
|
|
201
|
+
if (!isLoggedIn && !state.matchedLocation.startsWith('/auth')) {
|
|
202
|
+
return '/auth/login';
|
|
203
|
+
}
|
|
204
|
+
return null;
|
|
205
|
+
},
|
|
206
|
+
routes: [
|
|
207
|
+
ShellRoute(
|
|
208
|
+
builder: (context, state, child) => ScaffoldWithNavBar(child: child),
|
|
209
|
+
routes: [
|
|
210
|
+
GoRoute(
|
|
211
|
+
path: '/',
|
|
212
|
+
builder: (context, state) => const HomeScreen(),
|
|
213
|
+
),
|
|
214
|
+
GoRoute(
|
|
215
|
+
path: '/profile/:userId',
|
|
216
|
+
builder: (context, state) {
|
|
217
|
+
final userId = state.pathParameters['userId']!;
|
|
218
|
+
return ProfileScreen(userId: userId);
|
|
219
|
+
},
|
|
220
|
+
),
|
|
221
|
+
],
|
|
222
|
+
),
|
|
223
|
+
],
|
|
224
|
+
);
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 5. Dart Best Practices
|
|
230
|
+
|
|
231
|
+
### Null Safety & Pattern Matching
|
|
232
|
+
|
|
233
|
+
```dart
|
|
234
|
+
// ✅ Exhaustive pattern matching (Dart 3)
|
|
235
|
+
String describeStatus(AuthState state) => switch (state) {
|
|
236
|
+
AuthInitial() => 'Not started',
|
|
237
|
+
AuthLoading() => 'Loading...',
|
|
238
|
+
AuthSuccess(:final user) => 'Welcome, ${user.name}',
|
|
239
|
+
AuthFailure(:final message) => 'Error: $message',
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
// ✅ Null-aware operators
|
|
243
|
+
final name = user?.name ?? 'Anonymous';
|
|
244
|
+
final items = list?.where((i) => i.isActive).toList() ?? [];
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Freezed (Immutable Models)
|
|
248
|
+
|
|
249
|
+
```dart
|
|
250
|
+
@freezed
|
|
251
|
+
class User with _$User {
|
|
252
|
+
const factory User({
|
|
253
|
+
required String id,
|
|
254
|
+
required String name,
|
|
255
|
+
required String email,
|
|
256
|
+
@Default(false) bool isVerified,
|
|
257
|
+
}) = _User;
|
|
258
|
+
|
|
259
|
+
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## 6. Performance
|
|
266
|
+
|
|
267
|
+
| Rule | Detail |
|
|
268
|
+
|------|--------|
|
|
269
|
+
| Use `const` constructors | Prevents widget rebuild when parent rebuilds |
|
|
270
|
+
| `RepaintBoundary` | Isolates expensive painting operations |
|
|
271
|
+
| `ListView.builder` | Lazy builds only visible items |
|
|
272
|
+
| Avoid `setState` at top level | Rebuilds entire subtree; use granular state |
|
|
273
|
+
| Profile with DevTools | Use Flutter DevTools timeline to find jank |
|
|
274
|
+
| `compute()` for heavy work | Isolate heavy computation to background |
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 7. Testing
|
|
279
|
+
|
|
280
|
+
```dart
|
|
281
|
+
// Widget test
|
|
282
|
+
testWidgets('displays user name', (tester) async {
|
|
283
|
+
await tester.pumpWidget(
|
|
284
|
+
const MaterialApp(home: UserCard(name: 'Alice')),
|
|
285
|
+
);
|
|
286
|
+
expect(find.text('Alice'), findsOneWidget);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// Golden test
|
|
290
|
+
testWidgets('matches golden', (tester) async {
|
|
291
|
+
await tester.pumpWidget(const MaterialApp(home: AppButton(text: 'OK')));
|
|
292
|
+
await expectLater(find.byType(AppButton), matchesGoldenFile('button.png'));
|
|
293
|
+
});
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 8. Common Anti-Patterns
|
|
299
|
+
|
|
300
|
+
1. **God widgets** — split into small, focused widgets (one job each)
|
|
301
|
+
2. **Business logic in widgets** — extract to repositories / use cases
|
|
302
|
+
3. **Not using `const`** — every static widget should be `const`
|
|
303
|
+
4. **setState for complex state** — use Riverpod or BLoC
|
|
304
|
+
5. **Hardcoded strings** — use `l10n` / ARB files for localization
|
|
305
|
+
6. **Ignoring platform conventions** — use `Cupertino` widgets on iOS, `Material` on Android
|
|
306
|
+
7. **No error boundaries** — always handle `.error` state in async providers
|
|
307
|
+
|
|
308
|
+
---
|
|
309
|
+
|
|
310
|
+
## References
|
|
311
|
+
|
|
312
|
+
- [Flutter Documentation](https://docs.flutter.dev/)
|
|
313
|
+
- [Dart Language](https://dart.dev/language)
|
|
314
|
+
- [Riverpod](https://riverpod.dev/)
|
|
315
|
+
- [GoRouter](https://pub.dev/packages/go_router)
|
|
316
|
+
- [Flutter Performance](https://docs.flutter.dev/perf)
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-native
|
|
3
|
+
description: "Expert React Native guide covering Expo vs bare workflow, navigation (React Navigation, Expo Router), native modules, platform-specific code, performance (FlatList, memo, Hermes), state management, animations (Reanimated, Gesture Handler), testing (Detox, RNTL), and deployment (EAS Build, CodePush). Use when building cross-platform mobile apps with React Native."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# React Native Expert Guide
|
|
8
|
+
|
|
9
|
+
> Use this skill when building iOS/Android apps with React Native. Targets React Native 0.73+ with Expo SDK 50+ or bare workflow.
|
|
10
|
+
|
|
11
|
+
## When to Use This Skill
|
|
12
|
+
|
|
13
|
+
- Building cross-platform mobile apps (iOS + Android)
|
|
14
|
+
- Choosing between Expo and bare React Native
|
|
15
|
+
- Implementing navigation, animations, or native modules
|
|
16
|
+
- Optimizing mobile performance (lists, renders, memory)
|
|
17
|
+
- Setting up CI/CD for mobile app deployment
|
|
18
|
+
|
|
19
|
+
## When NOT to Use This Skill
|
|
20
|
+
|
|
21
|
+
- Web-only apps → use Next.js / React
|
|
22
|
+
- Native iOS only → use SwiftUI
|
|
23
|
+
- Native Android only → use Kotlin Compose
|
|
24
|
+
- Game development → use Godot or Unity
|
|
25
|
+
- Flutter projects → use Flutter skill
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 1. Project Setup (CRITICAL)
|
|
30
|
+
|
|
31
|
+
### Expo vs Bare Workflow
|
|
32
|
+
|
|
33
|
+
| Factor | Expo (Managed) | Bare |
|
|
34
|
+
|--------|---------------|------|
|
|
35
|
+
| Setup time | Minutes | Hours |
|
|
36
|
+
| Native modules | Expo Modules API | Manual linking |
|
|
37
|
+
| OTA updates | Built-in (EAS Update) | CodePush |
|
|
38
|
+
| EAS Build | ✅ Cloud builds | Manual Xcode/Gradle |
|
|
39
|
+
| Custom native code | Via config plugins | Full access |
|
|
40
|
+
| **Recommendation** | **Start here** | Only if Expo can't support a requirement |
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# ✅ Start with Expo
|
|
44
|
+
npx create-expo-app@latest my-app --template blank-typescript
|
|
45
|
+
|
|
46
|
+
# Bare workflow (only when needed)
|
|
47
|
+
npx react-native@latest init MyApp
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Project Structure
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
src/
|
|
54
|
+
├── app/ # Expo Router screens (file-based routing)
|
|
55
|
+
│ ├── (tabs)/ # Tab layout group
|
|
56
|
+
│ │ ├── _layout.tsx
|
|
57
|
+
│ │ ├── index.tsx # Home tab
|
|
58
|
+
│ │ └── profile.tsx # Profile tab
|
|
59
|
+
│ ├── _layout.tsx # Root layout
|
|
60
|
+
│ └── [id].tsx # Dynamic route
|
|
61
|
+
├── components/ # Reusable UI components
|
|
62
|
+
│ ├── ui/ # Design system primitives
|
|
63
|
+
│ └── features/ # Feature-specific components
|
|
64
|
+
├── hooks/ # Custom hooks
|
|
65
|
+
├── services/ # API clients, storage
|
|
66
|
+
├── stores/ # State management
|
|
67
|
+
├── constants/ # Colors, dimensions, config
|
|
68
|
+
└── types/ # TypeScript type definitions
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 2. Navigation
|
|
74
|
+
|
|
75
|
+
### Expo Router (Recommended)
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
// app/_layout.tsx
|
|
79
|
+
import { Stack } from 'expo-router';
|
|
80
|
+
|
|
81
|
+
export default function RootLayout() {
|
|
82
|
+
return (
|
|
83
|
+
<Stack>
|
|
84
|
+
<Stack.Screen name="(tabs)" options={{ headerShown: false }} />
|
|
85
|
+
<Stack.Screen name="modal" options={{ presentation: 'modal' }} />
|
|
86
|
+
</Stack>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
// app/(tabs)/_layout.tsx
|
|
93
|
+
import { Tabs } from 'expo-router';
|
|
94
|
+
import { Ionicons } from '@expo/vector-icons';
|
|
95
|
+
|
|
96
|
+
export default function TabLayout() {
|
|
97
|
+
return (
|
|
98
|
+
<Tabs>
|
|
99
|
+
<Tabs.Screen
|
|
100
|
+
name="index"
|
|
101
|
+
options={{
|
|
102
|
+
title: 'Home',
|
|
103
|
+
tabBarIcon: ({ color, size }) => (
|
|
104
|
+
<Ionicons name="home" size={size} color={color} />
|
|
105
|
+
),
|
|
106
|
+
}}
|
|
107
|
+
/>
|
|
108
|
+
</Tabs>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Typed Navigation
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
import { useRouter, useLocalSearchParams } from 'expo-router';
|
|
117
|
+
|
|
118
|
+
export default function DetailScreen() {
|
|
119
|
+
const { id } = useLocalSearchParams<{ id: string }>();
|
|
120
|
+
const router = useRouter();
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<Pressable onPress={() => router.push(`/items/${id}`)}>
|
|
124
|
+
<Text>View Item {id}</Text>
|
|
125
|
+
</Pressable>
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## 3. Performance (CRITICAL)
|
|
133
|
+
|
|
134
|
+
### FlatList Optimization
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
import { FlatList, type ListRenderItem } from 'react-native';
|
|
138
|
+
|
|
139
|
+
const renderItem: ListRenderItem<Item> = ({ item }) => (
|
|
140
|
+
<ItemRow item={item} />
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const keyExtractor = (item: Item) => item.id;
|
|
144
|
+
|
|
145
|
+
<FlatList
|
|
146
|
+
data={items}
|
|
147
|
+
renderItem={renderItem}
|
|
148
|
+
keyExtractor={keyExtractor}
|
|
149
|
+
// ✅ Performance props
|
|
150
|
+
removeClippedSubviews={true}
|
|
151
|
+
maxToRenderPerBatch={10}
|
|
152
|
+
windowSize={5}
|
|
153
|
+
initialNumToRender={10}
|
|
154
|
+
getItemLayout={(_, index) => ({
|
|
155
|
+
length: ITEM_HEIGHT,
|
|
156
|
+
offset: ITEM_HEIGHT * index,
|
|
157
|
+
index,
|
|
158
|
+
})}
|
|
159
|
+
/>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Memoization
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
import { memo, useCallback, useMemo } from 'react';
|
|
166
|
+
|
|
167
|
+
// ✅ Memoize list items
|
|
168
|
+
const ItemRow = memo(function ItemRow({ item, onPress }: Props) {
|
|
169
|
+
return (
|
|
170
|
+
<Pressable onPress={() => onPress(item.id)}>
|
|
171
|
+
<Text>{item.title}</Text>
|
|
172
|
+
</Pressable>
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// ✅ Stable callbacks
|
|
177
|
+
const onItemPress = useCallback((id: string) => {
|
|
178
|
+
router.push(`/items/${id}`);
|
|
179
|
+
}, []);
|
|
180
|
+
|
|
181
|
+
// ✅ Expensive computations
|
|
182
|
+
const filteredItems = useMemo(
|
|
183
|
+
() => items.filter(i => i.category === selectedCategory),
|
|
184
|
+
[items, selectedCategory]
|
|
185
|
+
);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Image Optimization
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
import { Image } from 'expo-image';
|
|
192
|
+
|
|
193
|
+
// ✅ expo-image with caching
|
|
194
|
+
<Image
|
|
195
|
+
source={{ uri: imageUrl }}
|
|
196
|
+
style={{ width: 200, height: 200 }}
|
|
197
|
+
contentFit="cover"
|
|
198
|
+
placeholder={blurhash}
|
|
199
|
+
transition={200}
|
|
200
|
+
/>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 4. Animations
|
|
206
|
+
|
|
207
|
+
### Reanimated
|
|
208
|
+
|
|
209
|
+
```tsx
|
|
210
|
+
import Animated, {
|
|
211
|
+
useSharedValue,
|
|
212
|
+
useAnimatedStyle,
|
|
213
|
+
withSpring,
|
|
214
|
+
withTiming,
|
|
215
|
+
} from 'react-native-reanimated';
|
|
216
|
+
|
|
217
|
+
function AnimatedCard() {
|
|
218
|
+
const scale = useSharedValue(1);
|
|
219
|
+
|
|
220
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
221
|
+
transform: [{ scale: scale.value }],
|
|
222
|
+
}));
|
|
223
|
+
|
|
224
|
+
const onPressIn = () => { scale.value = withSpring(0.95); };
|
|
225
|
+
const onPressOut = () => { scale.value = withSpring(1); };
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<Pressable onPressIn={onPressIn} onPressOut={onPressOut}>
|
|
229
|
+
<Animated.View style={[styles.card, animatedStyle]}>
|
|
230
|
+
<Text>Press me</Text>
|
|
231
|
+
</Animated.View>
|
|
232
|
+
</Pressable>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Gesture Handler
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
|
|
241
|
+
|
|
242
|
+
function SwipeableCard() {
|
|
243
|
+
const translateX = useSharedValue(0);
|
|
244
|
+
|
|
245
|
+
const panGesture = Gesture.Pan()
|
|
246
|
+
.onUpdate((e) => { translateX.value = e.translationX; })
|
|
247
|
+
.onEnd(() => {
|
|
248
|
+
if (Math.abs(translateX.value) > SWIPE_THRESHOLD) {
|
|
249
|
+
translateX.value = withTiming(
|
|
250
|
+
translateX.value > 0 ? SCREEN_WIDTH : -SCREEN_WIDTH
|
|
251
|
+
);
|
|
252
|
+
} else {
|
|
253
|
+
translateX.value = withSpring(0);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
return (
|
|
258
|
+
<GestureDetector gesture={panGesture}>
|
|
259
|
+
<Animated.View style={useAnimatedStyle(() => ({
|
|
260
|
+
transform: [{ translateX: translateX.value }],
|
|
261
|
+
}))}>
|
|
262
|
+
<Text>Swipe me</Text>
|
|
263
|
+
</Animated.View>
|
|
264
|
+
</GestureDetector>
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 5. Platform-Specific Code
|
|
272
|
+
|
|
273
|
+
```tsx
|
|
274
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
275
|
+
|
|
276
|
+
const styles = StyleSheet.create({
|
|
277
|
+
container: {
|
|
278
|
+
paddingTop: Platform.OS === 'ios' ? 44 : 0,
|
|
279
|
+
...Platform.select({
|
|
280
|
+
ios: { shadowColor: '#000', shadowOffset: { width: 0, height: 2 } },
|
|
281
|
+
android: { elevation: 4 },
|
|
282
|
+
}),
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// File-based: Component.ios.tsx / Component.android.tsx
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 6. Deployment
|
|
292
|
+
|
|
293
|
+
### EAS Build (Expo)
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# Install EAS CLI
|
|
297
|
+
npm install -g eas-cli
|
|
298
|
+
|
|
299
|
+
# Configure
|
|
300
|
+
eas build:configure
|
|
301
|
+
|
|
302
|
+
# Build
|
|
303
|
+
eas build --platform all --profile production
|
|
304
|
+
|
|
305
|
+
# Submit to stores
|
|
306
|
+
eas submit --platform ios
|
|
307
|
+
eas submit --platform android
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### OTA Updates
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
# Push JS-only updates without App Store review
|
|
314
|
+
eas update --branch production --message "Bug fix"
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## 7. Common Anti-Patterns
|
|
320
|
+
|
|
321
|
+
1. **Inline styles** — use `StyleSheet.create()` for performance (styles are sent to native once)
|
|
322
|
+
2. **Anonymous functions in renderItem** — causes re-renders; extract and memoize
|
|
323
|
+
3. **ScrollView for long lists** — use `FlatList` or `FlashList` for virtualization
|
|
324
|
+
4. **Ignoring Hermes** — enable Hermes engine for faster startup and lower memory
|
|
325
|
+
5. **Not testing on real devices** — simulators miss performance issues and native behaviors
|
|
326
|
+
6. **Storing sensitive data in AsyncStorage** — use `expo-secure-store` for tokens/secrets
|
|
327
|
+
7. **Giant bundle sizes** — use `react-native-bundle-visualizer` to audit imports
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## References
|
|
332
|
+
|
|
333
|
+
- [Expo Documentation](https://docs.expo.dev/)
|
|
334
|
+
- [React Native Documentation](https://reactnative.dev/docs/getting-started)
|
|
335
|
+
- [Expo Router](https://docs.expo.dev/router/introduction/)
|
|
336
|
+
- [React Native Reanimated](https://docs.swmansion.com/react-native-reanimated/)
|
|
337
|
+
- [React Native Performance](https://reactnative.dev/docs/performance)
|