vibefast-cli 1.2.1 → 1.3.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/README.md +30 -95
- package/dist/__tests__/recipes.test.js +94 -91
- package/dist/__tests__/recipes.test.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +301 -125
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/checklist.d.ts.map +1 -1
- package/dist/commands/checklist.js +85 -44
- package/dist/commands/checklist.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +13 -4
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +118 -26
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +202 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +61 -3
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +20 -18
- package/dist/core/auth.js.map +1 -1
- package/dist/core/codemod.d.ts +33 -0
- package/dist/core/codemod.d.ts.map +1 -1
- package/dist/core/codemod.js +116 -0
- package/dist/core/codemod.js.map +1 -1
- package/dist/core/detect.d.ts.map +1 -1
- package/dist/core/detect.js +24 -7
- package/dist/core/detect.js.map +1 -1
- package/dist/core/journal.d.ts +1 -0
- package/dist/core/journal.d.ts.map +1 -1
- package/dist/core/journal.js.map +1 -1
- package/dist/core/recipes.d.ts.map +1 -1
- package/dist/core/recipes.js +25 -7
- package/dist/core/recipes.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/docs/architecture.md +50 -0
- package/docs/commands.md +78 -0
- package/docs/contributing.md +27 -0
- package/docs/quickstart.md +50 -0
- package/docs/recipes.md +57 -0
- package/docs/troubleshooting.md +31 -0
- package/package.json +2 -2
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/demo.tsx +445 -0
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +355 -0
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/types.ts +31 -0
- package/recipes/0/recipe.json +18 -0
- package/recipes/animated-chip/apps/native/src/components/advanced-ui/chip/demo.tsx +2 -1
- package/recipes/animated-chip/recipe.json +5 -2
- package/recipes/animated-chip-native@latest.zip +0 -0
- package/recipes/animated-chip@latest.zip +0 -0
- package/recipes/animated-switch/apps/native/src/components/advanced-ui/switch/demo.tsx +1 -1
- package/recipes/animated-switch/recipe.json +5 -2
- package/recipes/animated-switch-native@latest.zip +0 -0
- package/recipes/animated-switch@latest.zip +0 -0
- package/recipes/audio-recorder/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
- package/recipes/audio-recorder/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -2
- package/recipes/audio-recorder/recipe.json +7 -2
- package/recipes/audio-recorder-native@latest.zip +0 -0
- package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
- package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -1
- package/recipes/audio-recorder-supabase/recipe.json +12 -16
- package/recipes/audio-recorder-supabase-native@latest.zip +0 -0
- package/recipes/audio-recorder-supabase@latest.zip +0 -0
- package/recipes/audio-recorder@latest.zip +0 -0
- package/recipes/charts/apps/native/src/app/charts/index.tsx +3 -0
- package/recipes/charts/apps/native/src/features/charts/components/bar-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/candlestick-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/column-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/doughnut-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/line-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/radar-chart.tsx +3 -1
- package/recipes/charts/apps/native/src/features/charts/components/stacked-bar-chart.tsx +3 -1
- package/recipes/charts/recipe.json +13 -4
- package/recipes/charts-native@latest.zip +0 -0
- package/recipes/charts@latest.zip +0 -0
- package/recipes/chatbot/apps/native/src/features/chatbot/components/chat-markdown.tsx +86 -86
- package/recipes/chatbot/apps/native/src/features/chatbot/components/markdown/code-block.tsx +4 -4
- package/recipes/chatbot/recipe.json +3 -40
- package/recipes/chatbot-native@latest.zip +0 -0
- package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/chat-markdown.tsx +4 -1
- package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/markdown/code-block.tsx +86 -53
- package/recipes/chatbot-supabase/recipe.json +3 -42
- package/recipes/chatbot-supabase-native@latest.zip +0 -0
- package/recipes/chatbot-supabase@latest.zip +0 -0
- package/recipes/chatbot@latest.zip +0 -0
- package/recipes/glowing-button/recipe.json +6 -2
- package/recipes/glowing-button-native@latest.zip +0 -0
- package/recipes/glowing-button@latest.zip +0 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/index.tsx +50 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/results.tsx +2 -0
- package/recipes/image-analysis/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +2 -2
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/camera.tsx +72 -65
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +65 -47
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading-screen.tsx +43 -2
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading.tsx +34 -1
- package/recipes/image-analysis/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +83 -2
- package/recipes/image-analysis/recipe.json +11 -19
- package/recipes/image-analysis-native@latest.zip +0 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/index.tsx +50 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/results.tsx +2 -0
- package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
- package/recipes/image-analysis-supabase/recipe.json +10 -37
- package/recipes/image-analysis-supabase-native@latest.zip +0 -0
- package/recipes/image-analysis-supabase@latest.zip +0 -0
- package/recipes/image-analysis@latest.zip +0 -0
- package/recipes/image-analyzer/apps/native/src/app/(root)/(protected)/image-analyzer/index.tsx +2 -0
- package/recipes/image-generator/apps/native/src/app/image-generator/gallery.tsx +3 -0
- package/recipes/image-generator/apps/native/src/app/image-generator/index.tsx +3 -0
- package/recipes/image-generator/recipe.json +8 -18
- package/recipes/image-generator-native@latest.zip +0 -0
- package/recipes/image-generator-supabase/recipe.json +6 -35
- package/recipes/image-generator-supabase-native@latest.zip +0 -0
- package/recipes/image-generator-supabase@latest.zip +0 -0
- package/recipes/image-generator@latest.zip +0 -0
- package/recipes/ios-widget/recipe.json +18 -119
- package/recipes/ios-widget-native@latest.zip +0 -0
- package/recipes/ios-widget@latest.zip +0 -0
- package/recipes/number-stepper/apps/native/src/components/advanced-ui/stepper/demo.tsx +1 -1
- package/recipes/number-stepper/recipe.json +5 -2
- package/recipes/number-stepper-native@latest.zip +0 -0
- package/recipes/number-stepper@latest.zip +0 -0
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/interactive-onboarding.tsx +11 -18
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/ai-tone-step.tsx +5 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/currency-step.tsx +9 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-ai-step.tsx +8 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-chatbot-step.tsx +6 -5
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-manual-step.tsx +4 -3
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-scan-step.tsx +6 -5
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/main-reason-step.tsx +5 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/notification-step.tsx +7 -6
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/overspend-step.tsx +5 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/personalizing-step.tsx +8 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/rating-step.tsx +6 -5
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/reminder-step.tsx +5 -6
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/safety-step.tsx +5 -4
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/struggle-step.tsx +5 -7
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/welcome-step.tsx +7 -6
- package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/ui/onboarding-header.tsx +4 -3
- package/recipes/onboarding/recipe.json +9 -6
- package/recipes/onboarding-native@latest.zip +0 -0
- package/recipes/onboarding@latest.zip +0 -0
- package/recipes/payments/apps/native/src/app/paywall/index.tsx +74 -0
- package/recipes/payments/apps/native/src/app/paywall/local.tsx +25 -0
- package/recipes/payments/apps/native/src/app/paywall/remote.tsx +23 -0
- package/recipes/payments/packages/backend/convex/payments.ts +21 -3
- package/recipes/payments/recipe.json +14 -34
- package/recipes/payments-native@latest.zip +0 -0
- package/recipes/payments-supabase/apps/native/src/app/paywall/index.tsx +74 -0
- package/recipes/payments-supabase/apps/native/src/app/paywall/local.tsx +25 -0
- package/recipes/payments-supabase/apps/native/src/app/paywall/remote.tsx +23 -0
- package/recipes/payments-supabase/recipe.json +16 -23
- package/recipes/payments-supabase-native@latest.zip +0 -0
- package/recipes/payments-supabase@latest.zip +0 -0
- package/recipes/payments@latest.zip +0 -0
- package/recipes/posthog/apps/native/src/components/analytics/navigation-tracker.tsx +14 -0
- package/recipes/posthog/apps/native/src/lib/hooks/use-navigation-analytics.ts +44 -0
- package/recipes/posthog/apps/native/src/providers/posthog-provider.tsx +51 -0
- package/recipes/posthog/recipe.json +60 -0
- package/recipes/posthog-native@latest.zip +0 -0
- package/recipes/progress-circle/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +1 -1
- package/recipes/progress-circle/recipe.json +5 -2
- package/recipes/progress-circle-native@latest.zip +0 -0
- package/recipes/progress-circle@latest.zip +0 -0
- package/recipes/quiz/apps/native/src/app/quiz/index.tsx +47 -0
- package/recipes/quiz/recipe.json +9 -6
- package/recipes/quiz-native@latest.zip +0 -0
- package/recipes/quiz@latest.zip +0 -0
- package/recipes/screen-kits/apps/native/src/app/screen-kits/_layout.tsx +12 -0
- package/recipes/screen-kits/apps/native/src/app/screen-kits/index.tsx +114 -0
- package/recipes/screen-kits/apps/native/src/features/screen-kits/index.ts +1 -0
- package/recipes/screen-kits/apps/native/src/features/screen-kits/types.ts +28 -0
- package/recipes/screen-kits/recipe.json +26 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/_layout.tsx +12 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/home.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/index.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-complete.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-fail.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/skill-tree.tsx +5 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/duo-button.tsx +174 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/skill-button.tsx +186 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/xp-header.tsx +115 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/constants.ts +89 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/index.ts +3 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/home-screen.tsx +225 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-complete-screen.tsx +485 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-fail-screen.tsx +105 -0
- package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-screen.tsx +384 -0
- package/recipes/screen-kits-duolingo/recipe.json +58 -0
- package/recipes/screen-kits-duolingo-native@latest.zip +0 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/_layout.tsx +45 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/asset-detail.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/notifications.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/receive.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/send.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/swap.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/wallet.tsx +3 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/ActionButtons.tsx +78 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/AssetRow.tsx +94 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/BalanceCard.tsx +118 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/constants.ts +85 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/asset-detail.tsx +378 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/notifications.tsx +210 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/receive-modal.tsx +317 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/send-modal.tsx +420 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/swap-modal.tsx +363 -0
- package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/wallet-dashboard.tsx +281 -0
- package/recipes/screen-kits-finance/recipe.json +46 -0
- package/recipes/screen-kits-finance-native@latest.zip +0 -0
- package/recipes/screen-kits-fitness/apps/native/assets/sounds/timer-beep.wav +0 -0
- package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/_layout.tsx +10 -0
- package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/index.tsx +6 -0
- package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/timer.tsx +3 -0
- package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/workout.tsx +3 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-components.tsx +500 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-settings-modal.tsx +352 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/workout-card.tsx +105 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/constants.ts +189 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/hooks/use-timer.ts +307 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/index.ts +1 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/timer-screen.tsx +278 -0
- package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/workout-dashboard.tsx +350 -0
- package/recipes/screen-kits-fitness/recipe.json +63 -0
- package/recipes/screen-kits-fitness-native@latest.zip +0 -0
- package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/habits.tsx +1 -0
- package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/kanban.tsx +1 -0
- package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/routes.ts +4 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/AddTaskModal.tsx +246 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/DraggableTaskCard.tsx +92 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/KanbanColumn.tsx +238 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/TaskCard.tsx +144 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/add-habit-modal.tsx +271 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/constants.ts +295 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/kanban-utils.ts +62 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/habit-tracker.tsx +1160 -0
- package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/kanban-board.tsx +432 -0
- package/recipes/screen-kits-habits/recipe.json +52 -0
- package/recipes/screen-kits-habits-native@latest.zip +0 -0
- package/recipes/screen-kits-native@latest.zip +0 -0
- package/recipes/sentry/apps/native/src/providers/sentry-provider.tsx +64 -0
- package/recipes/sentry/recipe.json +39 -0
- package/recipes/sentry-native@latest.zip +0 -0
- package/recipes/swipe-slider/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +1 -1
- package/recipes/swipe-slider/recipe.json +5 -2
- package/recipes/swipe-slider-native@latest.zip +0 -0
- package/recipes/swipe-slider@latest.zip +0 -0
- package/recipes/timeline/apps/native/src/components/advanced-ui/timeline/demo.tsx +2 -1
- package/recipes/timeline/recipe.json +5 -2
- package/recipes/timeline-native@latest.zip +0 -0
- package/recipes/timeline@latest.zip +0 -0
- package/recipes/tracker-app/apps/native/src/app/tracker-app/index.tsx +1 -0
- package/recipes/tracker-app/recipe.json +10 -7
- package/recipes/tracker-app-native@latest.zip +0 -0
- package/recipes/tracker-app@latest.zip +0 -0
- package/recipes/upload-all.sh +8 -31
- package/recipes/voice-bot/apps/native/src/app/voice-bot/index.tsx +56 -0
- package/recipes/voice-bot/recipe.json +31 -7
- package/recipes/voice-bot-native@latest.zip +0 -0
- package/recipes/voice-bot@latest.zip +0 -0
- package/recipes/wake-word/apps/native/src/app/{(root)/(protected)/test-wake-word.tsx → test-wake-word.tsx} +43 -4
- package/recipes/wake-word/recipe.json +16 -26
- package/recipes/wake-word-native@latest.zip +0 -0
- package/recipes/wake-word@latest.zip +0 -0
- package/scripts/create-advanced-ui-recipes.sh +46 -19
- package/scripts/create-recipes.mjs +471 -117
- package/scripts/package-recipes.mjs +76 -0
- package/scripts/publish-all.sh +6 -2
- package/CHANGELOG.md +0 -198
- package/docs/archive/AUTO-DETECT-DEPS.md +0 -607
- package/docs/archive/FINAL-PACKAGE-STRATEGY.md +0 -583
- package/docs/archive/FINAL-SIMPLE-PLAN.md +0 -487
- package/docs/archive/FINAL-STATUS.md +0 -144
- package/docs/archive/FLOW-DIAGRAM.md +0 -1629
- package/docs/archive/GOTCHAS-AND-RISKS.md +0 -801
- package/docs/archive/IMPLEMENTATION-PLAN.md +0 -1360
- package/docs/archive/PLAN.md +0 -453
- package/docs/archive/PRODUCTION-READINESS.md +0 -684
- package/docs/archive/PRODUCTION-TEST-RESULTS.md +0 -465
- package/docs/archive/SIMPLIFIED-PLAN.md +0 -578
- package/docs/archive/STATUS.md +0 -199
- package/docs/archive/SUCCESS.md +0 -259
- package/docs/archive/TEST-SUMMARY.md +0 -261
- package/docs/archive/TESTING-CHECKLIST.md +0 -450
- package/docs/archive/USER-MODIFICATIONS.md +0 -448
- package/docs/decisions.md +0 -55
- package/docs/manual-testing.md +0 -91
- package/docs/next-steps.md +0 -12
- package/recipes/README.md +0 -156
- package/recipes/audio-recorder-supabase/packages/backend/src/services/recordings.ts +0 -369
- package/recipes/chatbot/apps/native/src/api-client/chatbot.ts +0 -83
- package/recipes/chatbot/packages/backend/convex/agents.ts +0 -115
- package/recipes/chatbot/packages/backend/convex/tools/index.ts +0 -18
- package/recipes/chatbot/packages/backend/convex/tools/knowledgeRetrieval.ts +0 -97
- package/recipes/chatbot/packages/backend/convex/tools/tavilySearch.ts +0 -83
- package/recipes/chatbot/packages/backend/convex/tools/userProfile.ts +0 -72
- package/recipes/chatbot-supabase/apps/native/src/api-client/supabase/chatbot.ts +0 -515
- package/recipes/chatbot-supabase/packages/backend/src/services/conversations.ts +0 -243
- package/recipes/chatbot-supabase/packages/backend/src/services/messages.ts +0 -327
- package/recipes/image-analysis/apps/native/src/api-client/image-analyzer.ts +0 -62
- package/recipes/image-analysis-supabase/packages/backend/src/services/image-analyses.ts +0 -132
- package/recipes/image-generator/apps/native/src/api-client/image-generator.ts +0 -34
- package/recipes/payments/apps/native/src/api-client/payments.ts +0 -44
- package/recipes/payments-supabase/packages/backend/src/services/payments.ts +0 -201
- package/recipes/posthog.json +0 -47
- package/recipes/revenuecat.json +0 -43
- package/recipes/sentry.json +0 -47
- package/recipes/wake-word/apps/native/assets/vosk-model/README.md +0 -103
- package/recipes/wake-word/apps/native/scripts/download-vosk-model.mjs +0 -127
- /package/recipes/{audio-recorder/apps/native/src/app/(root)/(protected) → audio-recorder-supabase/apps/native/src/app}/audio-recorder/index.tsx +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/AppIntent.swift +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/CalorieTrackerWidget.swift +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/HabitTrackerWidget.swift +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Info.plist +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/WidgetLiveActivity.swift +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/expo-target.config.js +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/generated.entitlements +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/index.swift +0 -0
- /package/recipes/ios-widget/{targets → apps/native/targets}/widget/widgets.swift +0 -0
|
@@ -1,684 +0,0 @@
|
|
|
1
|
-
# 🚀 Production Readiness Assessment
|
|
2
|
-
|
|
3
|
-
## Current Status: ⚠️ ALMOST READY (Needs Critical Improvements)
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## ✅ What's Working Well
|
|
8
|
-
|
|
9
|
-
### Core Functionality
|
|
10
|
-
- ✅ Authentication with license tokens
|
|
11
|
-
- ✅ Device management (2 device limit)
|
|
12
|
-
- ✅ Recipe fetching from Cloudflare R2
|
|
13
|
-
- ✅ File installation with watermarking
|
|
14
|
-
- ✅ Navigation injection
|
|
15
|
-
- ✅ Journal tracking for clean removal
|
|
16
|
-
- ✅ Path security (prevents directory traversal)
|
|
17
|
-
- ✅ Dry-run mode for previewing changes
|
|
18
|
-
- ✅ Error handling and user-friendly messages
|
|
19
|
-
|
|
20
|
-
### Infrastructure
|
|
21
|
-
- ✅ Cloudflare Worker deployed and tested
|
|
22
|
-
- ✅ KV storage for licenses
|
|
23
|
-
- ✅ R2 storage for recipes
|
|
24
|
-
- ✅ Token hashing (SHA-256)
|
|
25
|
-
- ✅ Device tracking
|
|
26
|
-
|
|
27
|
-
### Developer Experience
|
|
28
|
-
- ✅ Simple commands (`vf add`, `vf remove`, etc.)
|
|
29
|
-
- ✅ Good error messages
|
|
30
|
-
- ✅ Doctor command for validation
|
|
31
|
-
- ✅ List command to see available features
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## ❌ Critical Issues (MUST FIX Before Production)
|
|
36
|
-
|
|
37
|
-
### 1. **File Overwrite Without Confirmation** 🔴 CRITICAL
|
|
38
|
-
|
|
39
|
-
**Problem:**
|
|
40
|
-
```bash
|
|
41
|
-
$ vf add charts --force
|
|
42
|
-
# Silently overwrites ALL files - user modifications LOST!
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**Current Behavior:**
|
|
46
|
-
- No warning about existing files
|
|
47
|
-
- No confirmation prompt
|
|
48
|
-
- No backup created
|
|
49
|
-
- User modifications destroyed
|
|
50
|
-
|
|
51
|
-
**What Users See:**
|
|
52
|
-
```
|
|
53
|
-
muhammadzafar~$ vf add charts --dry-run
|
|
54
|
-
ℹ [DRY RUN] No changes will be made
|
|
55
|
-
ℹ Fetching charts for native...
|
|
56
|
-
ℹ Downloading recipe...
|
|
57
|
-
ℹ Installing charts v1.0.0...
|
|
58
|
-
ℹ Copying apps/native/src/app/charts → apps/native/src/app/(root)/(protected)/charts
|
|
59
|
-
ℹ Copying apps/native/src/features/charts → apps/native/src/features/charts
|
|
60
|
-
ℹ Adding navigation link...
|
|
61
|
-
✓ Navigation link added
|
|
62
|
-
✓ charts installed successfully!
|
|
63
|
-
ℹ Files added: 17
|
|
64
|
-
⚠ This was a dry run. Run without --dry-run to apply changes.
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Issue:** Dry-run shows files will be added, but doesn't warn if files ALREADY EXIST and will be overwritten!
|
|
68
|
-
|
|
69
|
-
**Solution Needed:**
|
|
70
|
-
```bash
|
|
71
|
-
$ vf add charts --force
|
|
72
|
-
⚠ Warning: The following files will be OVERWRITTEN:
|
|
73
|
-
• apps/native/src/app/(root)/(protected)/charts/index.tsx (modified)
|
|
74
|
-
• apps/native/src/features/charts/chart-card.tsx (modified)
|
|
75
|
-
|
|
76
|
-
⚠ Your changes will be LOST. Make sure you have committed to Git!
|
|
77
|
-
|
|
78
|
-
Continue? (y/N): _
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
### 2. **No Package Dependency Management** 🔴 CRITICAL
|
|
84
|
-
|
|
85
|
-
**Problem:**
|
|
86
|
-
Features require npm packages, but CLI doesn't handle them.
|
|
87
|
-
|
|
88
|
-
**Example:**
|
|
89
|
-
```bash
|
|
90
|
-
$ vf add charts
|
|
91
|
-
✓ charts installed successfully!
|
|
92
|
-
# User runs app
|
|
93
|
-
# ERROR: Cannot find module 'react-native-chart-kit'
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**What Should Happen:**
|
|
97
|
-
```bash
|
|
98
|
-
$ vf add charts
|
|
99
|
-
✓ charts installed successfully!
|
|
100
|
-
ℹ Files added: 17
|
|
101
|
-
|
|
102
|
-
⚠ This feature requires the following packages:
|
|
103
|
-
• react-native-chart-kit@^6.12.0
|
|
104
|
-
• react-native-svg@^13.9.0
|
|
105
|
-
|
|
106
|
-
📦 Install them with:
|
|
107
|
-
npm install react-native-chart-kit@^6.12.0 react-native-svg@^13.9.0
|
|
108
|
-
|
|
109
|
-
OR
|
|
110
|
-
|
|
111
|
-
yarn add react-native-chart-kit@^6.12.0 react-native-svg@^13.9.0
|
|
112
|
-
|
|
113
|
-
Would you like to install them now? (Y/n): _
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**Solution:** Add `dependencies` field to recipe.json
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
### 3. **No Modification Detection** 🟡 HIGH PRIORITY
|
|
121
|
-
|
|
122
|
-
**Problem:**
|
|
123
|
-
```bash
|
|
124
|
-
$ vf remove charts
|
|
125
|
-
# Deletes ALL files, even if user modified them
|
|
126
|
-
# No warning, no backup
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Solution:**
|
|
130
|
-
Track file hashes in journal, warn on removal if modified.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
### 4. **Remove mini-native Demo** 🟢 LOW PRIORITY
|
|
135
|
-
|
|
136
|
-
**Problem:**
|
|
137
|
-
Test/demo feature shouldn't be in production.
|
|
138
|
-
|
|
139
|
-
**Solution:**
|
|
140
|
-
Remove all mini-native references and test recipe.
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## 🔧 Required Enhancements
|
|
145
|
-
|
|
146
|
-
### Enhancement 1: Interactive Confirmation for Overwrites
|
|
147
|
-
|
|
148
|
-
**Implementation:**
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
// src/core/fsx.ts
|
|
152
|
-
export async function copyTree(
|
|
153
|
-
src: string,
|
|
154
|
-
dest: string,
|
|
155
|
-
options?: {
|
|
156
|
-
dryRun?: boolean;
|
|
157
|
-
force?: boolean;
|
|
158
|
-
interactive?: boolean; // NEW
|
|
159
|
-
}
|
|
160
|
-
): Promise<{ files: string[]; conflicts: string[] }> {
|
|
161
|
-
const copied: string[] = [];
|
|
162
|
-
const conflicts: string[] = [];
|
|
163
|
-
|
|
164
|
-
async function copyRecursive(srcPath: string, destPath: string) {
|
|
165
|
-
const stats = await stat(srcPath);
|
|
166
|
-
|
|
167
|
-
if (stats.isDirectory()) {
|
|
168
|
-
if (!options?.dryRun) {
|
|
169
|
-
await ensureDir(destPath);
|
|
170
|
-
}
|
|
171
|
-
const entries = await readdir(srcPath);
|
|
172
|
-
for (const entry of entries) {
|
|
173
|
-
await copyRecursive(join(srcPath, entry), join(destPath, entry));
|
|
174
|
-
}
|
|
175
|
-
} else {
|
|
176
|
-
const destExists = await exists(destPath);
|
|
177
|
-
|
|
178
|
-
if (destExists) {
|
|
179
|
-
conflicts.push(destPath);
|
|
180
|
-
|
|
181
|
-
if (!options?.force && !options?.interactive) {
|
|
182
|
-
throw new Error(`File exists: ${destPath}. Use --force to overwrite.`);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (options?.interactive && !options?.dryRun) {
|
|
186
|
-
// Prompt user for this specific file
|
|
187
|
-
const answer = await promptUser(
|
|
188
|
-
`Overwrite ${destPath}? (y/N): `
|
|
189
|
-
);
|
|
190
|
-
if (answer.toLowerCase() !== 'y') {
|
|
191
|
-
log.info(`Skipped: ${destPath}`);
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (!options?.dryRun) {
|
|
198
|
-
await ensureDir(dirname(destPath));
|
|
199
|
-
await copyFile(srcPath, destPath);
|
|
200
|
-
}
|
|
201
|
-
copied.push(destPath);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
await copyRecursive(src, dest);
|
|
206
|
-
return { files: copied, conflicts };
|
|
207
|
-
}
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**Usage:**
|
|
211
|
-
```typescript
|
|
212
|
-
// src/commands/add.ts
|
|
213
|
-
const result = await copyTree(srcPath, destPath, {
|
|
214
|
-
dryRun: options.dryRun,
|
|
215
|
-
force: options.force,
|
|
216
|
-
interactive: !options.force && !options.dryRun, // NEW
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
if (result.conflicts.length > 0 && options.dryRun) {
|
|
220
|
-
log.warn(`⚠ ${result.conflicts.length} files will be overwritten:`);
|
|
221
|
-
result.conflicts.forEach(f => log.plain(` • ${f}`));
|
|
222
|
-
log.warn('Make sure you have committed your changes to Git!');
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
### Enhancement 2: Package Dependency Management
|
|
229
|
-
|
|
230
|
-
**Recipe Format Update:**
|
|
231
|
-
|
|
232
|
-
```json
|
|
233
|
-
{
|
|
234
|
-
"name": "charts",
|
|
235
|
-
"version": "1.0.0",
|
|
236
|
-
"description": "Beautiful data visualization",
|
|
237
|
-
"target": "native",
|
|
238
|
-
"copy": [...],
|
|
239
|
-
"nav": {...},
|
|
240
|
-
"dependencies": {
|
|
241
|
-
"npm": {
|
|
242
|
-
"react-native-chart-kit": "^6.12.0",
|
|
243
|
-
"react-native-svg": "^13.9.0"
|
|
244
|
-
},
|
|
245
|
-
"expo": {
|
|
246
|
-
"expo-linear-gradient": "~12.1.2"
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
"postInstall": {
|
|
250
|
-
"message": "Run 'npx pod-install' if you're on iOS",
|
|
251
|
-
"commands": [
|
|
252
|
-
"npx pod-install"
|
|
253
|
-
]
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Implementation:**
|
|
259
|
-
|
|
260
|
-
```typescript
|
|
261
|
-
// src/commands/add.ts
|
|
262
|
-
|
|
263
|
-
// After copying files
|
|
264
|
-
if (manifest.dependencies) {
|
|
265
|
-
log.info('');
|
|
266
|
-
log.warn('⚠ This feature requires additional packages:');
|
|
267
|
-
|
|
268
|
-
const npmDeps = manifest.dependencies.npm || {};
|
|
269
|
-
const expoDeps = manifest.dependencies.expo || {};
|
|
270
|
-
|
|
271
|
-
if (Object.keys(npmDeps).length > 0) {
|
|
272
|
-
log.plain('');
|
|
273
|
-
log.plain(' NPM packages:');
|
|
274
|
-
Object.entries(npmDeps).forEach(([pkg, version]) => {
|
|
275
|
-
log.plain(` • ${pkg}@${version}`);
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (Object.keys(expoDeps).length > 0) {
|
|
280
|
-
log.plain('');
|
|
281
|
-
log.plain(' Expo packages:');
|
|
282
|
-
Object.entries(expoDeps).forEach(([pkg, version]) => {
|
|
283
|
-
log.plain(` • ${pkg}@${version}`);
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
log.plain('');
|
|
288
|
-
log.info('📦 Install with:');
|
|
289
|
-
|
|
290
|
-
// Generate install commands
|
|
291
|
-
const npmPackages = Object.entries(npmDeps)
|
|
292
|
-
.map(([pkg, version]) => `${pkg}@${version}`)
|
|
293
|
-
.join(' ');
|
|
294
|
-
|
|
295
|
-
if (npmPackages) {
|
|
296
|
-
log.plain(` npm install ${npmPackages}`);
|
|
297
|
-
log.plain(` OR`);
|
|
298
|
-
log.plain(` yarn add ${npmPackages}`);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Ask if user wants to install now
|
|
302
|
-
if (!options.dryRun && !options.skipInstall) {
|
|
303
|
-
const answer = await promptUser('\nInstall packages now? (Y/n): ');
|
|
304
|
-
if (answer.toLowerCase() !== 'n') {
|
|
305
|
-
log.info('Installing packages...');
|
|
306
|
-
await installPackages(npmDeps, expoDeps);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
// Post-install instructions
|
|
311
|
-
if (manifest.postInstall) {
|
|
312
|
-
log.plain('');
|
|
313
|
-
log.info('📝 Post-install steps:');
|
|
314
|
-
log.plain(` ${manifest.postInstall.message}`);
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
### Enhancement 3: Modification Detection
|
|
322
|
-
|
|
323
|
-
**Journal Format Update:**
|
|
324
|
-
|
|
325
|
-
```json
|
|
326
|
-
{
|
|
327
|
-
"entries": [
|
|
328
|
-
{
|
|
329
|
-
"feature": "charts",
|
|
330
|
-
"target": "native",
|
|
331
|
-
"files": [
|
|
332
|
-
{
|
|
333
|
-
"path": "/abs/path/to/file.tsx",
|
|
334
|
-
"hash": "sha256-hash-of-original-content"
|
|
335
|
-
}
|
|
336
|
-
],
|
|
337
|
-
"insertedNav": true,
|
|
338
|
-
"ts": 1762912823535
|
|
339
|
-
}
|
|
340
|
-
]
|
|
341
|
-
}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
**Implementation:**
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
// src/commands/remove.ts
|
|
348
|
-
|
|
349
|
-
// Before deleting files
|
|
350
|
-
const modifiedFiles: string[] = [];
|
|
351
|
-
|
|
352
|
-
for (const fileEntry of entry.files) {
|
|
353
|
-
const currentHash = await hashFile(fileEntry.path);
|
|
354
|
-
if (currentHash !== fileEntry.hash) {
|
|
355
|
-
modifiedFiles.push(fileEntry.path);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (modifiedFiles.length > 0) {
|
|
360
|
-
log.warn('⚠ The following files were modified by you:');
|
|
361
|
-
modifiedFiles.forEach(f => log.plain(` • ${f}`));
|
|
362
|
-
log.warn('');
|
|
363
|
-
log.warn('These changes will be LOST if you continue!');
|
|
364
|
-
log.info('Make sure you have committed to Git.');
|
|
365
|
-
log.plain('');
|
|
366
|
-
|
|
367
|
-
const answer = await promptUser('Continue with removal? (y/N): ');
|
|
368
|
-
if (answer.toLowerCase() !== 'y') {
|
|
369
|
-
log.info('Removal cancelled');
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
---
|
|
376
|
-
|
|
377
|
-
## 🎯 Features That Should Be CLI-Managed
|
|
378
|
-
|
|
379
|
-
### ✅ Good Candidates for CLI
|
|
380
|
-
|
|
381
|
-
These can be fully automated:
|
|
382
|
-
|
|
383
|
-
1. **UI Components**
|
|
384
|
-
- Charts, graphs, data visualization
|
|
385
|
-
- Form components
|
|
386
|
-
- Card layouts
|
|
387
|
-
- Modal dialogs
|
|
388
|
-
- Bottom sheets
|
|
389
|
-
|
|
390
|
-
2. **Standalone Features**
|
|
391
|
-
- Image picker/camera
|
|
392
|
-
- QR code scanner
|
|
393
|
-
- PDF viewer
|
|
394
|
-
- Audio/video player
|
|
395
|
-
- Maps integration
|
|
396
|
-
|
|
397
|
-
3. **Self-Contained Screens**
|
|
398
|
-
- Profile screen
|
|
399
|
-
- Settings screen
|
|
400
|
-
- About screen
|
|
401
|
-
- Help/FAQ screen
|
|
402
|
-
|
|
403
|
-
4. **Utilities**
|
|
404
|
-
- Date/time formatters
|
|
405
|
-
- Currency formatters
|
|
406
|
-
- Validation helpers
|
|
407
|
-
- API clients (typed)
|
|
408
|
-
|
|
409
|
-
---
|
|
410
|
-
|
|
411
|
-
### ⚠️ Partial CLI Support (Needs Manual Steps)
|
|
412
|
-
|
|
413
|
-
These need user intervention:
|
|
414
|
-
|
|
415
|
-
1. **Sentry** 🔴
|
|
416
|
-
- CLI can: Install files, add provider
|
|
417
|
-
- User must: Add DSN to .env, configure release tracking
|
|
418
|
-
|
|
419
|
-
```json
|
|
420
|
-
{
|
|
421
|
-
"name": "sentry",
|
|
422
|
-
"manualSteps": [
|
|
423
|
-
{
|
|
424
|
-
"step": 1,
|
|
425
|
-
"title": "Add Sentry DSN to .env",
|
|
426
|
-
"description": "Add SENTRY_DSN=your-dsn-here to .env file",
|
|
427
|
-
"file": ".env",
|
|
428
|
-
"example": "SENTRY_DSN=https://xxx@xxx.ingest.sentry.io/xxx"
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
"step": 2,
|
|
432
|
-
"title": "Configure Sentry in app config",
|
|
433
|
-
"description": "Update app.json with Sentry project info",
|
|
434
|
-
"file": "app.json"
|
|
435
|
-
}
|
|
436
|
-
]
|
|
437
|
-
}
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
2. **PostHog** 🔴
|
|
441
|
-
- CLI can: Install files, add provider
|
|
442
|
-
- User must: Add API key to .env
|
|
443
|
-
|
|
444
|
-
3. **RevenueCat** 🔴
|
|
445
|
-
- CLI can: Install files, add provider
|
|
446
|
-
- User must: Add API keys, configure products
|
|
447
|
-
|
|
448
|
-
4. **Firebase** 🔴
|
|
449
|
-
- CLI can: Install files
|
|
450
|
-
- User must: Download google-services.json, add to project
|
|
451
|
-
|
|
452
|
-
5. **Supabase** 🔴
|
|
453
|
-
- CLI can: Install client, types
|
|
454
|
-
- User must: Add URL and anon key to .env
|
|
455
|
-
|
|
456
|
-
---
|
|
457
|
-
|
|
458
|
-
### ❌ Should NOT Be CLI-Managed
|
|
459
|
-
|
|
460
|
-
These are too complex or require deep customization:
|
|
461
|
-
|
|
462
|
-
1. **Authentication System**
|
|
463
|
-
- Too many variations (email, social, phone)
|
|
464
|
-
- Requires backend integration
|
|
465
|
-
- User-specific flows
|
|
466
|
-
|
|
467
|
-
2. **Payment Processing**
|
|
468
|
-
- Requires merchant accounts
|
|
469
|
-
- Legal compliance varies
|
|
470
|
-
- Too many providers
|
|
471
|
-
|
|
472
|
-
3. **Custom Business Logic**
|
|
473
|
-
- User-specific requirements
|
|
474
|
-
- Can't be templated
|
|
475
|
-
|
|
476
|
-
---
|
|
477
|
-
|
|
478
|
-
## 📋 Recipe Format for Services with Manual Steps
|
|
479
|
-
|
|
480
|
-
```json
|
|
481
|
-
{
|
|
482
|
-
"name": "sentry",
|
|
483
|
-
"version": "1.0.0",
|
|
484
|
-
"description": "Error tracking with Sentry",
|
|
485
|
-
"target": "native",
|
|
486
|
-
"copy": [...],
|
|
487
|
-
"dependencies": {
|
|
488
|
-
"npm": {
|
|
489
|
-
"@sentry/react-native": "^5.15.0"
|
|
490
|
-
}
|
|
491
|
-
},
|
|
492
|
-
"env": {
|
|
493
|
-
"required": [
|
|
494
|
-
{
|
|
495
|
-
"key": "SENTRY_DSN",
|
|
496
|
-
"description": "Your Sentry DSN from sentry.io",
|
|
497
|
-
"example": "https://xxx@xxx.ingest.sentry.io/xxx",
|
|
498
|
-
"link": "https://sentry.io/settings/projects/"
|
|
499
|
-
}
|
|
500
|
-
]
|
|
501
|
-
},
|
|
502
|
-
"manualSteps": [
|
|
503
|
-
{
|
|
504
|
-
"step": 1,
|
|
505
|
-
"title": "Create Sentry Project",
|
|
506
|
-
"description": "Go to sentry.io and create a new React Native project",
|
|
507
|
-
"link": "https://sentry.io/signup/"
|
|
508
|
-
},
|
|
509
|
-
{
|
|
510
|
-
"step": 2,
|
|
511
|
-
"title": "Add DSN to .env",
|
|
512
|
-
"description": "Copy your DSN and add it to .env file",
|
|
513
|
-
"file": ".env",
|
|
514
|
-
"action": "add",
|
|
515
|
-
"content": "SENTRY_DSN=your-dsn-here"
|
|
516
|
-
},
|
|
517
|
-
{
|
|
518
|
-
"step": 3,
|
|
519
|
-
"title": "Test Error Tracking",
|
|
520
|
-
"description": "Trigger a test error to verify Sentry is working",
|
|
521
|
-
"command": "npm run test:sentry"
|
|
522
|
-
}
|
|
523
|
-
],
|
|
524
|
-
"postInstall": {
|
|
525
|
-
"message": "Sentry installed! Complete the manual steps above to finish setup.",
|
|
526
|
-
"checklist": true
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
```
|
|
530
|
-
|
|
531
|
-
**CLI Output:**
|
|
532
|
-
|
|
533
|
-
```bash
|
|
534
|
-
$ vf add sentry
|
|
535
|
-
|
|
536
|
-
✓ sentry installed successfully!
|
|
537
|
-
ℹ Files added: 8
|
|
538
|
-
|
|
539
|
-
📦 Installing packages...
|
|
540
|
-
✓ @sentry/react-native@^5.15.0 installed
|
|
541
|
-
|
|
542
|
-
⚠ MANUAL STEPS REQUIRED:
|
|
543
|
-
|
|
544
|
-
This feature requires some manual configuration:
|
|
545
|
-
|
|
546
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
547
|
-
│ Step 1: Create Sentry Project │
|
|
548
|
-
│ │
|
|
549
|
-
│ Go to sentry.io and create a new React Native project │
|
|
550
|
-
│ 🔗 https://sentry.io/signup/ │
|
|
551
|
-
└─────────────────────────────────────────────────────────────┘
|
|
552
|
-
|
|
553
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
554
|
-
│ Step 2: Add DSN to .env │
|
|
555
|
-
│ │
|
|
556
|
-
│ Copy your DSN and add it to .env file: │
|
|
557
|
-
│ SENTRY_DSN=your-dsn-here │
|
|
558
|
-
│ │
|
|
559
|
-
│ 📝 File: .env │
|
|
560
|
-
└─────────────────────────────────────────────────────────────┘
|
|
561
|
-
|
|
562
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
563
|
-
│ Step 3: Test Error Tracking │
|
|
564
|
-
│ │
|
|
565
|
-
│ Trigger a test error to verify Sentry is working: │
|
|
566
|
-
│ $ npm run test:sentry │
|
|
567
|
-
└─────────────────────────────────────────────────────────────┘
|
|
568
|
-
|
|
569
|
-
✓ Installation complete!
|
|
570
|
-
⚠ Don't forget to complete the manual steps above.
|
|
571
|
-
|
|
572
|
-
💡 Tip: Run 'vf checklist sentry' to see these steps again.
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
---
|
|
576
|
-
|
|
577
|
-
## 🎯 New CLI Commands Needed
|
|
578
|
-
|
|
579
|
-
### 1. `vf checklist <feature>`
|
|
580
|
-
Show manual steps for a feature
|
|
581
|
-
|
|
582
|
-
```bash
|
|
583
|
-
$ vf checklist sentry
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
### 2. `vf update <feature>`
|
|
587
|
-
Update a feature to latest version
|
|
588
|
-
|
|
589
|
-
```bash
|
|
590
|
-
$ vf update charts
|
|
591
|
-
```
|
|
592
|
-
|
|
593
|
-
### 3. `vf status`
|
|
594
|
-
Show installed features and their status
|
|
595
|
-
|
|
596
|
-
```bash
|
|
597
|
-
$ vf status
|
|
598
|
-
|
|
599
|
-
Installed features:
|
|
600
|
-
✓ charts (v1.0.0) - Up to date
|
|
601
|
-
⚠ sentry (v1.2.0) - Update available (v1.3.0)
|
|
602
|
-
✓ chatbot (v2.0.0) - Up to date
|
|
603
|
-
|
|
604
|
-
Manual steps pending:
|
|
605
|
-
⚠ sentry - 2 of 3 steps completed
|
|
606
|
-
```
|
|
607
|
-
|
|
608
|
-
### 4. `vf install-deps <feature>`
|
|
609
|
-
Install only the dependencies for a feature
|
|
610
|
-
|
|
611
|
-
```bash
|
|
612
|
-
$ vf install-deps charts
|
|
613
|
-
```
|
|
614
|
-
|
|
615
|
-
---
|
|
616
|
-
|
|
617
|
-
## 🚦 Production Readiness Checklist
|
|
618
|
-
|
|
619
|
-
### Before Launch
|
|
620
|
-
|
|
621
|
-
- [ ] **Add interactive confirmation for overwrites**
|
|
622
|
-
- [ ] **Add package dependency management**
|
|
623
|
-
- [ ] **Add modification detection**
|
|
624
|
-
- [ ] **Remove mini-native demo**
|
|
625
|
-
- [ ] **Add `vf checklist` command**
|
|
626
|
-
- [ ] **Add `vf status` command**
|
|
627
|
-
- [ ] **Add `vf update` command**
|
|
628
|
-
- [ ] **Test with real features (charts, sentry, posthog)**
|
|
629
|
-
- [ ] **Write user documentation**
|
|
630
|
-
- [ ] **Add telemetry (optional, with opt-out)**
|
|
631
|
-
|
|
632
|
-
### Nice to Have
|
|
633
|
-
|
|
634
|
-
- [ ] Backup before deletion
|
|
635
|
-
- [ ] Rollback command
|
|
636
|
-
- [ ] Feature templates (create your own recipes)
|
|
637
|
-
- [ ] Recipe validation tool
|
|
638
|
-
- [ ] Auto-update CLI
|
|
639
|
-
|
|
640
|
-
---
|
|
641
|
-
|
|
642
|
-
## 💡 Recommendations
|
|
643
|
-
|
|
644
|
-
### For Simple Features (UI Components)
|
|
645
|
-
✅ **Fully automate** - No manual steps needed
|
|
646
|
-
|
|
647
|
-
### For Service Integrations (Sentry, PostHog, etc.)
|
|
648
|
-
⚠️ **Partial automation** - CLI installs code, user adds credentials
|
|
649
|
-
|
|
650
|
-
### For Complex Systems (Auth, Payments)
|
|
651
|
-
❌ **Don't automate** - Too complex, provide documentation instead
|
|
652
|
-
|
|
653
|
-
---
|
|
654
|
-
|
|
655
|
-
## 🎯 Priority Order
|
|
656
|
-
|
|
657
|
-
1. **🔴 CRITICAL:** Interactive confirmation for overwrites
|
|
658
|
-
2. **🔴 CRITICAL:** Package dependency management
|
|
659
|
-
3. **🟡 HIGH:** Modification detection
|
|
660
|
-
4. **🟡 HIGH:** Manual steps support in recipes
|
|
661
|
-
5. **🟢 MEDIUM:** `vf checklist` command
|
|
662
|
-
6. **🟢 MEDIUM:** `vf status` command
|
|
663
|
-
7. **🟢 LOW:** Remove mini-native
|
|
664
|
-
8. **🟢 LOW:** `vf update` command
|
|
665
|
-
|
|
666
|
-
---
|
|
667
|
-
|
|
668
|
-
## Final Answer: Is It Production Ready?
|
|
669
|
-
|
|
670
|
-
### Current State: **70% Ready**
|
|
671
|
-
|
|
672
|
-
**Can ship now with:**
|
|
673
|
-
- Clear documentation about limitations
|
|
674
|
-
- Warning users to use Git
|
|
675
|
-
- Only simple features (UI components)
|
|
676
|
-
|
|
677
|
-
**Should NOT ship until:**
|
|
678
|
-
- Interactive confirmation added
|
|
679
|
-
- Package management added
|
|
680
|
-
- At least basic modification detection
|
|
681
|
-
|
|
682
|
-
**Timeline:**
|
|
683
|
-
- 2-3 days of work to make it production-ready
|
|
684
|
-
- 1 week to add all nice-to-have features
|