vibefast-cli 1.3.0 → 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 +8 -9
- package/dist/__tests__/recipes.test.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +271 -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 -33
- 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 -69
- 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 -70
- 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 -62
- 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 -44
- 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
package/docs/archive/PLAN.md
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
# VibeFast CLI — A–Z Plan (Public CLI + Token Auth)
|
|
2
|
-
|
|
3
|
-
Monorepo: **apps/native (Expo SDK 54)** + **apps/web (Next.js)**. CLI installs shadcn-style feature code into either target.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Phase 0 — Decisions & Ground Rules
|
|
8
|
-
|
|
9
|
-
**Goal:** Freeze choices so the build stays simple and predictable.
|
|
10
|
-
|
|
11
|
-
**Decide:**
|
|
12
|
-
|
|
13
|
-
- **CLI package:** `vibefast-cli` (binary alias: `vf`).
|
|
14
|
-
- **Auth:** fixed opaque **token** per customer; **2 device slots** by default.
|
|
15
|
-
- **Delivery:** Cloudflare **Worker** validates token/seat → issues short‑lived **signed URL** to recipe **zip** in **R2/KV**.
|
|
16
|
-
- **Repo signature:** require `.vibefast/starter.json` with `{ "name": "vibefast", "version": "1.0.0", "targets": ["native","web"] }`.
|
|
17
|
-
- **Markers:**
|
|
18
|
-
|
|
19
|
-
- Native: `apps/native/src/app/(root)/(tabs)/index.tsx`
|
|
20
|
-
|
|
21
|
-
```tsx
|
|
22
|
-
// --- @vibefast:navigation:start ---
|
|
23
|
-
{
|
|
24
|
-
/* CLI will inject feature links here */
|
|
25
|
-
}
|
|
26
|
-
// --- @vibefast:navigation:end ---
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
- Web: `apps/web/app/page.tsx`
|
|
30
|
-
|
|
31
|
-
```tsx
|
|
32
|
-
{
|
|
33
|
-
/* @vibefast:nav:start */
|
|
34
|
-
}
|
|
35
|
-
{
|
|
36
|
-
/* CLI will inject feature cards here */
|
|
37
|
-
}
|
|
38
|
-
{
|
|
39
|
-
/* @vibefast:nav:end */
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
- **Journal:** `.vibefast/journal.json` (tracks files & nav inserts).
|
|
44
|
-
- **Default target:** `native` (override with `--target web`).
|
|
45
|
-
- **Rate limits:** 500/day, 30/min per token (tune later).
|
|
46
|
-
|
|
47
|
-
**Deliverable:** `/docs/decisions.md` summarizing the above.
|
|
48
|
-
|
|
49
|
-
**Accept:** Decisions doc exists; everyone agrees.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Phase 1 — Prepare VibeFast (one-time repo changes)
|
|
54
|
-
|
|
55
|
-
**Goal:** Make the monorepo detectable and codemods deterministic.
|
|
56
|
-
|
|
57
|
-
**Tasks:**
|
|
58
|
-
|
|
59
|
-
1. Add `.vibefast/starter.json` with the JSON above.
|
|
60
|
-
2. Add nav **markers** in the two files above (native + web).
|
|
61
|
-
3. Ensure TS path alias `@/` resolves correctly for both apps (or use relative imports in templates).
|
|
62
|
-
|
|
63
|
-
**Checklist:**
|
|
64
|
-
|
|
65
|
-
- [ ] Signature file present & valid JSON
|
|
66
|
-
- [ ] Markers present once in each target
|
|
67
|
-
- [ ] Both apps build
|
|
68
|
-
|
|
69
|
-
**Accept:** `grep` finds markers; both apps compile.
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Phase 2 — Create the CLI (public npm package)
|
|
74
|
-
|
|
75
|
-
**Goal:** Scaffold a clean TypeScript CLI.
|
|
76
|
-
|
|
77
|
-
**Folder structure:**
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
/vibefast-cli
|
|
81
|
-
package.json
|
|
82
|
-
tsconfig.json
|
|
83
|
-
src/
|
|
84
|
-
index.ts # command router
|
|
85
|
-
commands/
|
|
86
|
-
add.ts
|
|
87
|
-
remove.ts
|
|
88
|
-
list.ts
|
|
89
|
-
doctor.ts
|
|
90
|
-
login.ts
|
|
91
|
-
devices.ts
|
|
92
|
-
logout.ts
|
|
93
|
-
core/
|
|
94
|
-
log.ts
|
|
95
|
-
paths.ts
|
|
96
|
-
fsx.ts
|
|
97
|
-
journal.ts
|
|
98
|
-
validate.ts
|
|
99
|
-
codemod.ts
|
|
100
|
-
http.ts
|
|
101
|
-
auth.ts
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
**package.json:**
|
|
105
|
-
|
|
106
|
-
- name: `vibefast-cli`
|
|
107
|
-
- bin: `{ "vf": "dist/index.js" }`
|
|
108
|
-
- scripts: `build (tsc)`, `dev (tsx src/index.ts)`
|
|
109
|
-
- deps: `commander`, `picocolors`
|
|
110
|
-
- optional: `keytar` (secure token storage) — fallback to `~/.vibefast/config.json`
|
|
111
|
-
|
|
112
|
-
**Checklist:**
|
|
113
|
-
|
|
114
|
-
- [ ] `vf --help` runs locally
|
|
115
|
-
- [ ] Commands load without throwing
|
|
116
|
-
|
|
117
|
-
**Accept:** CLI starts and shows help.
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Phase 3 — Implement Core Utilities
|
|
122
|
-
|
|
123
|
-
**Goal:** Reusable helpers with tests.
|
|
124
|
-
|
|
125
|
-
- `log.ts` — success/info/warn/error with nice colors
|
|
126
|
-
- `paths.ts` — CWD, signature, journal, nav file paths for each target
|
|
127
|
-
- `fsx.ts` — `ensureDir`, `writeFile(force)`, `copyTree(dry,force)`, `exists`, `readFile`
|
|
128
|
-
- `journal.ts` — `{ feature, target, files[], insertedNav, ts }` CRUD at `.vibefast/journal.json`
|
|
129
|
-
- `validate.ts` — assert signature name `vibefast`; parse targets; semver gate if needed
|
|
130
|
-
- `codemod.ts` — `insertNavLinkNative`, `removeNavLinkNative`, `insertNavLinkWeb`, `removeNavLinkWeb` (string markers; idempotent via href check)
|
|
131
|
-
- `http.ts` — POST JSON to Worker; download signed zips to temp; unzip
|
|
132
|
-
- `auth.ts` — save/read token (keytar or file); generate stable `device_id` (username|hostname|os + persisted uuid)
|
|
133
|
-
|
|
134
|
-
**Checklist:**
|
|
135
|
-
|
|
136
|
-
- [ ] Unit tests for happy paths & basic errors
|
|
137
|
-
- [ ] `device_id` stable across runs
|
|
138
|
-
|
|
139
|
-
**Accept:** Tests pass locally.
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## Phase 4 — Recipe Format & First Recipes (mini-native, mini-web)
|
|
144
|
-
|
|
145
|
-
**Goal:** Define manifests and ship two demo zips.
|
|
146
|
-
|
|
147
|
-
### mini-native `recipe.json`
|
|
148
|
-
|
|
149
|
-
```json
|
|
150
|
-
{
|
|
151
|
-
"name": "mini-native",
|
|
152
|
-
"version": "0.1.0",
|
|
153
|
-
"description": "Demo feature (Expo)",
|
|
154
|
-
"copy": [
|
|
155
|
-
{
|
|
156
|
-
"from": "apps/native/src/app/(root)/(tabs)/mini",
|
|
157
|
-
"to": "apps/native/src/app/(root)/(tabs)/mini"
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"from": "apps/native/src/components/mini",
|
|
161
|
-
"to": "apps/native/src/components/mini"
|
|
162
|
-
},
|
|
163
|
-
{ "from": "apps/native/src/lib/mini", "to": "apps/native/src/lib/mini" }
|
|
164
|
-
],
|
|
165
|
-
"nav": { "href": "/(root)/(tabs)/mini", "label": "Mini" },
|
|
166
|
-
"target": "native"
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
**Templates:**
|
|
171
|
-
|
|
172
|
-
- `apps/native/src/app/(root)/(tabs)/mini/index.tsx`
|
|
173
|
-
- `apps/native/src/components/mini/MiniCard.tsx`
|
|
174
|
-
- `apps/native/src/lib/mini/useMini.ts`
|
|
175
|
-
|
|
176
|
-
### mini-web `recipe.json`
|
|
177
|
-
|
|
178
|
-
```json
|
|
179
|
-
{
|
|
180
|
-
"name": "mini-web",
|
|
181
|
-
"version": "0.1.0",
|
|
182
|
-
"description": "Demo feature (Next.js)",
|
|
183
|
-
"copy": [
|
|
184
|
-
{ "from": "apps/web/app/mini", "to": "apps/web/app/mini" },
|
|
185
|
-
{ "from": "apps/web/components/mini", "to": "apps/web/components/mini" },
|
|
186
|
-
{ "from": "apps/web/lib/mini", "to": "apps/web/lib/mini" }
|
|
187
|
-
],
|
|
188
|
-
"nav": { "href": "/mini", "label": "Mini" },
|
|
189
|
-
"target": "web"
|
|
190
|
-
}
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
**Packaging:** Zip each recipe folder → `mini-native@0.1.0.zip`, `mini-web@0.1.0.zip`. Upload to R2 (or KV).
|
|
194
|
-
|
|
195
|
-
**Checklist:**
|
|
196
|
-
|
|
197
|
-
- [ ] Zips contain manifest + templates
|
|
198
|
-
- [ ] Destinations match VibeFast paths
|
|
199
|
-
|
|
200
|
-
**Accept:** Manual unzip matches tree.
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Phase 5 — Cloudflare Worker Gateway (Auth + Signed URL)
|
|
205
|
-
|
|
206
|
-
**Goal:** Token validation, seat control, rate limit, signed URL issuance.
|
|
207
|
-
|
|
208
|
-
**POST /api/recipe/fetch**
|
|
209
|
-
|
|
210
|
-
- Request body:
|
|
211
|
-
|
|
212
|
-
```json
|
|
213
|
-
{
|
|
214
|
-
"token": "OPAQ_32CHARS",
|
|
215
|
-
"device": {
|
|
216
|
-
"id": "abc123…",
|
|
217
|
-
"os": "darwin",
|
|
218
|
-
"arch": "arm64",
|
|
219
|
-
"version": "1.0.0"
|
|
220
|
-
},
|
|
221
|
-
"feature": "mini-native",
|
|
222
|
-
"target": "native",
|
|
223
|
-
"starter": { "name": "vibefast", "version": "1.0.0" }
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
- Response:
|
|
228
|
-
|
|
229
|
-
```json
|
|
230
|
-
{
|
|
231
|
-
"ok": true,
|
|
232
|
-
"signedUrl": "https://…/mini-native@0.1.0.zip?...",
|
|
233
|
-
"expiresIn": 180,
|
|
234
|
-
"watermark": "…"
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
**Storage:**
|
|
239
|
-
|
|
240
|
-
- KV: `lic:<sha256(token)>` → `{ status, max_devices, devices[], rate }`
|
|
241
|
-
- R2: recipe zips per feature@version
|
|
242
|
-
|
|
243
|
-
**Checklist:**
|
|
244
|
-
|
|
245
|
-
- [ ] Worker deployed; KV & R2 bound
|
|
246
|
-
- [ ] Seeded token returns a signed URL
|
|
247
|
-
|
|
248
|
-
**Accept:** Invalid token → 403; seat limit → 403; valid → 200.
|
|
249
|
-
|
|
250
|
-
---
|
|
251
|
-
|
|
252
|
-
## Phase 6 — Auth & Device Commands (CLI)
|
|
253
|
-
|
|
254
|
-
**Goal:** Token storage + seat management.
|
|
255
|
-
|
|
256
|
-
- `vf login --token <TOKEN>` — store token (keytar or `~/.vibefast/config.json`)
|
|
257
|
-
- `vf devices` — list activations from Worker
|
|
258
|
-
- `vf devices --deactivate <id>` — free a slot
|
|
259
|
-
- `vf logout` — clear local token
|
|
260
|
-
|
|
261
|
-
**Checklist:**
|
|
262
|
-
|
|
263
|
-
- [ ] Token saved & retrieved
|
|
264
|
-
- [ ] Device list/deactivate works
|
|
265
|
-
|
|
266
|
-
**Accept:** Bad token errors are friendly.
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Phase 7 — doctor / list / add / remove (Core Flow)
|
|
271
|
-
|
|
272
|
-
**Goal:** End-to-end installation experience for each target.
|
|
273
|
-
|
|
274
|
-
**doctor**
|
|
275
|
-
|
|
276
|
-
- Verify `.vibefast/starter.json` name `vibefast`
|
|
277
|
-
- Detect monorepo; default `native`, allow `--target web`
|
|
278
|
-
|
|
279
|
-
**list**
|
|
280
|
-
|
|
281
|
-
- Get catalog from Worker; group by `native` / `web`
|
|
282
|
-
|
|
283
|
-
**add <feature> [--target native|web] [--dry-run] [--force]**
|
|
284
|
-
|
|
285
|
-
- Validate signature
|
|
286
|
-
- Fetch signed URL → download to temp → unzip
|
|
287
|
-
- Read `recipe.json`; copy files (respect `--dry-run`/`--force`)
|
|
288
|
-
- Insert nav link (native or web variant)
|
|
289
|
-
- Record journal
|
|
290
|
-
- Print next steps
|
|
291
|
-
|
|
292
|
-
**remove <feature> [--target native|web] [--dry-run]**
|
|
293
|
-
|
|
294
|
-
- Read journal; delete files; remove nav link; update journal
|
|
295
|
-
|
|
296
|
-
**Checklist:**
|
|
297
|
-
|
|
298
|
-
- [ ] Re‑add is no‑op unless `--force`
|
|
299
|
-
- [ ] Remove leaves repo clean
|
|
300
|
-
|
|
301
|
-
**Accept:** E2E on fresh clone: `vf doctor` → `vf add mini-native` → app shows link → `vf remove mini-native` cleans up.
|
|
302
|
-
|
|
303
|
-
---
|
|
304
|
-
|
|
305
|
-
## Phase 8 — Watermarking & Anti‑Sharing
|
|
306
|
-
|
|
307
|
-
**Goal:** Trace leaks and deter casual sharing.
|
|
308
|
-
|
|
309
|
-
- Worker returns `watermark` (token hash suffix + device suffix)
|
|
310
|
-
- CLI injects `// vibefast license: <watermark>` at top of each copied file
|
|
311
|
-
- Handle `429` with friendly cooldown message
|
|
312
|
-
|
|
313
|
-
**Accept:** Files contain watermark; rate limit enforced.
|
|
314
|
-
|
|
315
|
-
---
|
|
316
|
-
|
|
317
|
-
## Phase 9 — Testing (Unit + E2E)
|
|
318
|
-
|
|
319
|
-
**Goal:** Confidence before publish.
|
|
320
|
-
|
|
321
|
-
**Unit:** fsx, codemod (with/without markers), journal, auth.deviceId
|
|
322
|
-
|
|
323
|
-
**E2E (CI):**
|
|
324
|
-
|
|
325
|
-
1. Clone VibeFast fixture
|
|
326
|
-
2. `vf doctor` ✓
|
|
327
|
-
3. `vf add mini-native` → files + nav + journal ✓; re‑run is no‑op ✓
|
|
328
|
-
4. `vf remove mini-native` → clean ✓
|
|
329
|
-
5. invalid token → blocked ✓
|
|
330
|
-
6. seat limit → friendly error ✓
|
|
331
|
-
|
|
332
|
-
**Accept:** Tests pass; snapshot diff clean.
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## Phase 10 — Packaging & Release
|
|
337
|
-
|
|
338
|
-
**Goal:** Publish the public CLI; recipes remain private.
|
|
339
|
-
|
|
340
|
-
- `package.json`: `"bin": { "vf": "dist/index.js" }`
|
|
341
|
-
- `npm run build` (tsc)
|
|
342
|
-
- Publish to npm (public)
|
|
343
|
-
- README usage:
|
|
344
|
-
|
|
345
|
-
```bash
|
|
346
|
-
npx vibefast-cli login --token <YOUR_TOKEN>
|
|
347
|
-
vf doctor
|
|
348
|
-
vf list
|
|
349
|
-
vf add mini-native
|
|
350
|
-
vf add mini-web --target web
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
**Accept:** Fresh machine + fresh VibeFast clone → full flow works.
|
|
354
|
-
|
|
355
|
-
---
|
|
356
|
-
|
|
357
|
-
## Phase 11 — Add Real Recipes (charts, chatbot, voice, images)
|
|
358
|
-
|
|
359
|
-
**Goal:** Expand library using same manifest pattern.
|
|
360
|
-
|
|
361
|
-
For each feature:
|
|
362
|
-
|
|
363
|
-
- Place templates under app‑specific folders (`apps/native/...` or `apps/web/...`)
|
|
364
|
-
- Include `recipe.json` with `target`, `copy[]`, `nav`, optional `env/config` notes
|
|
365
|
-
- Zip & upload; update catalog
|
|
366
|
-
- E2E test install/remove
|
|
367
|
-
|
|
368
|
-
**Accept:** Templates compile; route reachable; removal clean.
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## Phase 12 — Nice‑to‑Haves (Post‑MVP)
|
|
373
|
-
|
|
374
|
-
- `vf diff` — preview changes before apply
|
|
375
|
-
- `vf update <feature>` — migration runner between versions
|
|
376
|
-
- `vf doctor --fix` — auto‑add missing markers
|
|
377
|
-
- Config mutations (marker blocks in `app.config.ts` if needed)
|
|
378
|
-
- Optional telemetry (opt‑in)
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
## Phase 13 — Security & Ops
|
|
383
|
-
|
|
384
|
-
- **Revoke:** set `status=revoked` → 403 immediately
|
|
385
|
-
- **Rotate:** issue new token; optionally migrate active devices
|
|
386
|
-
- **Anomalies:** auto‑lock if unusual device churn; notify
|
|
387
|
-
- **Backups:** nightly KV export to R2; version recipe zips
|
|
388
|
-
- **Monitoring:** token counts, error rates, p95 latency
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Phase 14 — Junior Dev Daily Checklist
|
|
393
|
-
|
|
394
|
-
- Pull latest; `npm run build`
|
|
395
|
-
- Run unit tests; run E2E on fixture
|
|
396
|
-
- Manual sanity: `doctor`, `add`, `remove`
|
|
397
|
-
- Verify Worker with staging token
|
|
398
|
-
- Update docs if CLI surface changes
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## Acceptance Criteria Summary (MVP)
|
|
403
|
-
|
|
404
|
-
- Public CLI on npm; `vf` works
|
|
405
|
-
- `login`, `devices`, `logout`, `doctor`, `list`, `add`, `remove` implemented
|
|
406
|
-
- Token + 2‑device enforcement works
|
|
407
|
-
- Signed URL delivery working
|
|
408
|
-
- Idempotent add/remove; watermark injected
|
|
409
|
-
- Unit + E2E tests green in CI
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## Appendix — Data Shapes
|
|
414
|
-
|
|
415
|
-
**CLI → Worker `recipe.fetch`**
|
|
416
|
-
|
|
417
|
-
```json
|
|
418
|
-
{
|
|
419
|
-
"token": "OPAQ_32CHARS",
|
|
420
|
-
"device": {
|
|
421
|
-
"id": "abc123…",
|
|
422
|
-
"os": "darwin",
|
|
423
|
-
"arch": "arm64",
|
|
424
|
-
"version": "1.0.0"
|
|
425
|
-
},
|
|
426
|
-
"feature": "mini-native",
|
|
427
|
-
"target": "native",
|
|
428
|
-
"starter": { "name": "vibefast", "version": "1.0.0" }
|
|
429
|
-
}
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
**Worker response**
|
|
433
|
-
|
|
434
|
-
```json
|
|
435
|
-
{
|
|
436
|
-
"ok": true,
|
|
437
|
-
"signedUrl": "https://…/mini-native@0.1.0.zip?...",
|
|
438
|
-
"expiresIn": 180,
|
|
439
|
-
"watermark": "…"
|
|
440
|
-
}
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
**Journal entry**
|
|
444
|
-
|
|
445
|
-
```json
|
|
446
|
-
{
|
|
447
|
-
"feature": "mini-native",
|
|
448
|
-
"target": "native",
|
|
449
|
-
"files": ["/abs/apps/native/src/app/(root)/(tabs)/mini/index.tsx"],
|
|
450
|
-
"insertedNav": true,
|
|
451
|
-
"ts": 1731300000000
|
|
452
|
-
}
|
|
453
|
-
```
|