vibefast-cli 0.6.2 → 0.7.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/dist/__tests__/recipes.test.js +5 -5
- package/dist/__tests__/recipes.test.js.map +1 -1
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +136 -48
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +106 -89
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/remove.js +1 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/core/__tests__/fsx.test.js +3 -1
- package/dist/core/__tests__/fsx.test.js.map +1 -1
- package/dist/core/__tests__/prompt.test.js +12 -12
- package/dist/core/__tests__/prompt.test.js.map +1 -1
- package/dist/core/__tests__/validate.test.js +4 -3
- package/dist/core/__tests__/validate.test.js.map +1 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +8 -0
- package/dist/core/auth.js.map +1 -1
- package/dist/core/codemod.d.ts +13 -0
- package/dist/core/codemod.d.ts.map +1 -1
- package/dist/core/codemod.js +50 -0
- package/dist/core/codemod.js.map +1 -1
- package/dist/core/errors.js +1 -1
- package/dist/core/fsx.js +1 -1
- package/dist/core/fsx.js.map +1 -1
- package/dist/core/recipes.d.ts.map +1 -1
- package/dist/core/recipes.js +71 -9
- package/dist/core/recipes.js.map +1 -1
- package/package.json +1 -1
- package/recipes/animated-chip/recipe.json +15 -0
- package/recipes/animated-chip@latest.zip +0 -0
- package/recipes/animated-switch/recipe.json +15 -0
- package/recipes/animated-switch@latest.zip +0 -0
- package/recipes/audio-recorder@latest.zip +0 -0
- package/recipes/charts/apps/native/src/features/charts/components/doughnut-chart.tsx +29 -18
- package/recipes/charts@latest.zip +0 -0
- package/recipes/chatbot/apps/native/src/features/chatbot/components/message-list.tsx +1 -1
- package/recipes/chatbot/apps/native/src/features/chatbot/hooks/use-smart-scroll-manager.ts +6 -0
- package/recipes/chatbot/recipe.json +21 -5
- package/recipes/chatbot@latest.zip +0 -0
- package/recipes/glowing-button/recipe.json +1 -3
- package/recipes/glowing-button@latest.zip +0 -0
- package/recipes/image-analysis/recipe.json +36 -19
- package/recipes/image-analysis@latest.zip +0 -0
- package/recipes/image-generator/apps/native/src/features/image-generator/app/_layout.tsx +1 -0
- package/recipes/image-generator/apps/native/src/features/image-generator/app/gallery.tsx +1 -1
- package/recipes/image-generator/apps/native/src/features/image-generator/components/gallery-image.tsx +2 -3
- package/recipes/image-generator/recipe.json +5 -3
- package/recipes/image-generator@latest.zip +0 -0
- package/recipes/ios-widget/recipe.json +24 -0
- package/recipes/ios-widget@latest.zip +0 -0
- package/recipes/number-stepper/recipe.json +15 -0
- package/recipes/number-stepper@latest.zip +0 -0
- package/recipes/payments/recipe.json +30 -0
- package/recipes/payments@latest.zip +0 -0
- package/recipes/posthog.json +2 -1
- package/recipes/progress-circle/recipe.json +15 -0
- package/recipes/progress-circle@latest.zip +0 -0
- package/recipes/quiz@latest.zip +0 -0
- package/recipes/sentry.json +2 -1
- package/recipes/swipe-slider/recipe.json +15 -0
- package/recipes/swipe-slider@latest.zip +0 -0
- package/recipes/{0 → timeline}/recipe.json +3 -6
- package/recipes/timeline@latest.zip +0 -0
- package/recipes/tracker-app@latest.zip +0 -0
- package/recipes/upload-all.sh +13 -2
- package/recipes/voice-bot/recipe.json +15 -2
- package/recipes/voice-bot@latest.zip +0 -0
- package/recipes/wake-word/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +0 -2
- package/recipes/wake-word/recipe.json +2 -2
- package/recipes/wake-word@latest.zip +0 -0
- package/src/__tests__/recipes.test.ts +5 -5
- package/src/commands/add.ts +230 -54
- package/src/commands/init.ts +118 -102
- package/src/commands/remove.ts +1 -1
- package/src/core/__tests__/fsx.test.ts +3 -1
- package/src/core/__tests__/prompt.test.ts +12 -12
- package/src/core/__tests__/validate.test.ts +4 -3
- package/src/core/auth.ts +8 -0
- package/src/core/codemod.ts +66 -0
- package/src/core/errors.ts +1 -1
- package/src/core/fsx.ts +1 -1
- package/src/core/recipes.ts +73 -9
- package/2/.claude/agents/architect.md +0 -74
- package/2/.claude/agents/convex-reviewer.md +0 -267
- package/2/.claude/agents/debug-detective.md +0 -62
- package/2/.claude/agents/learner.md +0 -64
- package/2/.claude/agents/perf-optimizer.md +0 -71
- package/2/.claude/agents/security-researcher.md +0 -42
- package/2/.claude/agents/tech-researcher.md +0 -46
- package/2/.claude/agents/ux-designer.md +0 -45
- package/2/.claude/commands/create-app-design.md +0 -279
- package/2/.claude/commands/create-prd-interactive.md +0 -113
- package/2/.claude/commands/create-prd.md +0 -111
- package/2/.claude/commands/create-tech-stack.md +0 -345
- package/2/.claude/commands/update-app-design.md +0 -298
- package/2/.claude/commands/update-project-structure.md +0 -14
- package/2/.claude/commands/update-tech-stack.md +0 -325
- package/2/.claude/docs/CONVEX_FEATURES_PLAN.md +0 -249
- package/2/.claude/docs/app-design-document.md +0 -0
- package/2/.claude/docs/project-status.md +0 -25
- package/2/.claude/docs/project-structure.md +0 -7
- package/2/.claude/docs/tech-stack.md +0 -157
- package/2/.claude/scripts/tree.sh +0 -70
- package/2/.claude/settings.json +0 -30
- package/2/.cursor/commands/code-review-high.md +0 -190
- package/2/.cursorignore +0 -3
- package/2/.github/ISSUE_TEMPLATE.md +0 -13
- package/2/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- package/2/.github/actions/eas-build/action.yml +0 -85
- package/2/.github/actions/setup-jdk-generate-apk/action.yml +0 -48
- package/2/.github/actions/setup-node-pnpm-install/action.yml +0 -29
- package/2/.github/scripts/expo-doctor.sh +0 -26
- package/2/.github/workflows/compress-images.yml +0 -48
- package/2/.github/workflows/e2e-android-eas-build.yml +0 -111
- package/2/.github/workflows/e2e-android-maestro.yml +0 -52
- package/2/.github/workflows/e2e-android.yml +0 -119
- package/2/.github/workflows/eas-build-prod.yml +0 -43
- package/2/.github/workflows/eas-build-qa.yml +0 -47
- package/2/.github/workflows/expo-doctor.yml +0 -61
- package/2/.github/workflows/lint-ts.yml +0 -49
- package/2/.github/workflows/new-app-version.yml +0 -65
- package/2/.github/workflows/new-github-release.yml +0 -34
- package/2/.github/workflows/stale.yml +0 -24
- package/2/.github/workflows/test.yml +0 -50
- package/2/.github/workflows/type-check.yml +0 -54
- package/2/.husky/commit-msg +0 -1
- package/2/.husky/common.sh +0 -8
- package/2/.husky/post-merge +0 -18
- package/2/.husky/pre-commit +0 -24
- package/2/.prettierignore +0 -14
- package/2/.prettierrc.json +0 -10
- package/2/.vibefast/README.md +0 -59
- package/2/.vibefast/config.json +0 -4
- package/2/.vibefast/journal.json +0 -234
- package/2/.vibefast/starter.json +0 -5
- package/2/AGENTS.md +0 -48
- package/2/LICENSE +0 -21
- package/2/README.md +0 -127
- package/2/apps/native/__mocks__/bottom-sheet.js +0 -6
- package/2/apps/native/__mocks__/expo-router.js +0 -16
- package/2/apps/native/__mocks__/react-native-gesture-handler.ts +0 -17
- package/2/apps/native/app-env.d.ts +0 -2
- package/2/apps/native/app.config.ts +0 -167
- package/2/apps/native/assets/adaptive-icon.png +0 -0
- package/2/apps/native/assets/favicon.png +0 -0
- package/2/apps/native/assets/fonts/Inter.ttf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Bold.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Medium.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Regular.otf +0 -0
- package/2/apps/native/assets/fonts/SF-Pro-Display-Semibold.otf +0 -0
- package/2/apps/native/assets/fonts/SpaceMono-Regular.ttf +0 -0
- package/2/apps/native/assets/icon.png +0 -0
- package/2/apps/native/assets/images/cover-image.png +0 -0
- package/2/apps/native/assets/lottie-animations/onboarding-1.json +0 -6504
- package/2/apps/native/assets/lottie-animations/onboarding-2.json +0 -1993
- package/2/apps/native/assets/lottie-animations/onboarding-3.json +0 -50159
- package/2/apps/native/assets/lottie-animations/onboarding-4.json +0 -735
- package/2/apps/native/assets/lottie-animations/onboarding-6.json +0 -2167
- package/2/apps/native/assets/splash-icon.png +0 -0
- package/2/apps/native/babel.config.js +0 -39
- package/2/apps/native/eas.json +0 -75
- package/2/apps/native/env.js +0 -196
- package/2/apps/native/global.css +0 -51
- package/2/apps/native/index.ts +0 -5
- package/2/apps/native/jest-setup.ts +0 -7
- package/2/apps/native/jest.config.js +0 -72
- package/2/apps/native/metro.config.js +0 -85
- package/2/apps/native/nativewind-env.d.ts +0 -1
- package/2/apps/native/package.json +0 -232
- package/2/apps/native/scripts/DRY_RUN_REPORT.md +0 -0
- package/2/apps/native/scripts/QUICK_START.md +0 -76
- package/2/apps/native/scripts/README.md +0 -187
- package/2/apps/native/scripts/convex-setup.js +0 -48
- package/2/apps/native/scripts/genrate-apk-and-install +0 -39
- package/2/apps/native/scripts/i18next-syntax-validation.js +0 -23
- package/2/apps/native/scripts/starter-setup.mjs +0 -246
- package/2/apps/native/src/api-client/auth.ts +0 -68
- package/2/apps/native/src/api-client/chatbot.ts +0 -83
- package/2/apps/native/src/api-client/client.ts +0 -4
- package/2/apps/native/src/api-client/image-generator.ts +0 -34
- package/2/apps/native/src/api-client/index.ts +0 -27
- package/2/apps/native/src/api-client/payments.ts +0 -44
- package/2/apps/native/src/api-client/reporting.ts +0 -29
- package/2/apps/native/src/api-client/shared.ts +0 -43
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/_layout.tsx +0 -166
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/index.tsx +0 -174
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/profile.tsx +0 -320
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/settings.tsx +0 -344
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/_layout.tsx +0 -198
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/accordion.tsx +0 -60
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/advanced.tsx +0 -24
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/avatar.tsx +0 -154
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/badge-chips-toggle.tsx +0 -81
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/buttons.tsx +0 -24
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/charts.tsx +0 -3
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/date-picker.tsx +0 -120
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/file-picker.tsx +0 -133
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/gallery-video.tsx +0 -119
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/index.tsx +0 -69
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/inputs-stepper.tsx +0 -78
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/picker-dropdown.tsx +0 -56
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/popover-bottomsheet.tsx +0 -229
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/progress.tsx +0 -38
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/searchbar.tsx +0 -70
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/sliders.tsx +0 -93
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/spinner.tsx +0 -80
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/switch.tsx +0 -47
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/table.tsx +0 -352
- package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/tabs-timeline.tsx +0 -122
- package/2/apps/native/src/app/(root)/(protected)/_layout.tsx +0 -143
- package/2/apps/native/src/app/(root)/(protected)/audio-recorder/index.tsx +0 -5
- package/2/apps/native/src/app/(root)/(protected)/charts/index.tsx +0 -6
- package/2/apps/native/src/app/(root)/(protected)/chatbot/index.tsx +0 -2
- package/2/apps/native/src/app/(root)/(protected)/image-generator/gallery.tsx +0 -3
- package/2/apps/native/src/app/(root)/(protected)/image-generator/index.tsx +0 -3
- package/2/apps/native/src/app/(root)/(protected)/paywall/index.tsx +0 -74
- package/2/apps/native/src/app/(root)/(protected)/paywall/local.tsx +0 -25
- package/2/apps/native/src/app/(root)/(protected)/paywall/remote.tsx +0 -23
- package/2/apps/native/src/app/(root)/(protected)/quick-actions-demo/index.tsx +0 -32
- package/2/apps/native/src/app/(root)/(protected)/quiz/index.tsx +0 -47
- package/2/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +0 -214
- package/2/apps/native/src/app/(root)/(protected)/tracker-app/index.tsx +0 -1
- package/2/apps/native/src/app/(root)/(protected)/voice-bot/index.tsx +0 -27
- package/2/apps/native/src/app/(root)/(public)/(auth)/_layout.tsx +0 -44
- package/2/apps/native/src/app/(root)/(public)/(auth)/forgot-password.tsx +0 -185
- package/2/apps/native/src/app/(root)/(public)/(auth)/login.tsx +0 -219
- package/2/apps/native/src/app/(root)/(public)/(auth)/otp-verification.tsx +0 -369
- package/2/apps/native/src/app/(root)/(public)/(auth)/reset-password.tsx +0 -247
- package/2/apps/native/src/app/(root)/(public)/(auth)/signup.tsx +0 -207
- package/2/apps/native/src/app/(root)/(public)/_layout.tsx +0 -60
- package/2/apps/native/src/app/(root)/(public)/onboarding/demo-one.tsx +0 -5
- package/2/apps/native/src/app/(root)/(public)/onboarding/demo-two.tsx +0 -52
- package/2/apps/native/src/app/(root)/(public)/onboarding/index.tsx +0 -82
- package/2/apps/native/src/app/(root)/_layout.tsx +0 -30
- package/2/apps/native/src/app/+html.tsx +0 -46
- package/2/apps/native/src/app/[...messing].tsx +0 -24
- package/2/apps/native/src/app/_layout.tsx +0 -56
- package/2/apps/native/src/app/tsconfig.json +0 -3
- package/2/apps/native/src/components/advanced-ui/buttons/glowing-button.tsx +0 -366
- package/2/apps/native/src/components/analytics/navigation-tracker.tsx +0 -10
- package/2/apps/native/src/components/demo/advanced-ui-components.tsx +0 -46
- package/2/apps/native/src/components/demo/buttons-demo.tsx +0 -56
- package/2/apps/native/src/components/demo/colors-demo.tsx +0 -52
- package/2/apps/native/src/components/demo/dropdown-picker-demo.tsx +0 -274
- package/2/apps/native/src/components/demo/inputs-demo.tsx +0 -99
- package/2/apps/native/src/components/demo/notification-demo.tsx +0 -434
- package/2/apps/native/src/components/demo/title-demo.tsx +0 -16
- package/2/apps/native/src/components/demo/toast-demo.tsx +0 -81
- package/2/apps/native/src/components/demo/typography-demo.tsx +0 -28
- package/2/apps/native/src/components/performance/render-performance-monitor.tsx +0 -36
- package/2/apps/native/src/components/ui/accordion.tsx +0 -138
- package/2/apps/native/src/components/ui/avatar.tsx +0 -66
- package/2/apps/native/src/components/ui/badge.tsx +0 -68
- package/2/apps/native/src/components/ui/bottom-sheet.tsx +0 -61
- package/2/apps/native/src/components/ui/colors.js +0 -290
- package/2/apps/native/src/components/ui/core/button.tsx +0 -317
- package/2/apps/native/src/components/ui/core/card.tsx +0 -40
- package/2/apps/native/src/components/ui/core/checkbox.tsx +0 -264
- package/2/apps/native/src/components/ui/core/feature-button.tsx +0 -162
- package/2/apps/native/src/components/ui/core/focus-aware-status-bar.tsx +0 -21
- package/2/apps/native/src/components/ui/core/image.tsx +0 -30
- package/2/apps/native/src/components/ui/core/inputs/floating-text-input.tsx +0 -369
- package/2/apps/native/src/components/ui/core/inputs/input-otp.tsx +0 -304
- package/2/apps/native/src/components/ui/core/inputs/input.tsx +0 -373
- package/2/apps/native/src/components/ui/core/list.tsx +0 -60
- package/2/apps/native/src/components/ui/core/navigation/animated-header.tsx +0 -87
- package/2/apps/native/src/components/ui/core/navigation/screen-footer.tsx +0 -67
- package/2/apps/native/src/components/ui/core/overlays/dropdown.tsx +0 -290
- package/2/apps/native/src/components/ui/core/overlays/full-screen-loading.tsx +0 -15
- package/2/apps/native/src/components/ui/core/overlays/modal-keyboard-aware-scroll-view.tsx +0 -46
- package/2/apps/native/src/components/ui/core/overlays/modal.tsx +0 -247
- package/2/apps/native/src/components/ui/core/pagination-dots.tsx +0 -231
- package/2/apps/native/src/components/ui/core/pressable.tsx +0 -48
- package/2/apps/native/src/components/ui/core/progress-bar.tsx +0 -47
- package/2/apps/native/src/components/ui/core/progress.tsx +0 -149
- package/2/apps/native/src/components/ui/core/select.tsx +0 -261
- package/2/apps/native/src/components/ui/core/spinner.tsx +0 -387
- package/2/apps/native/src/components/ui/core/text.tsx +0 -45
- package/2/apps/native/src/components/ui/core/toast.tsx +0 -190
- package/2/apps/native/src/components/ui/custom-switch.tsx +0 -90
- package/2/apps/native/src/components/ui/date-time-picker.tsx +0 -268
- package/2/apps/native/src/components/ui/debug.ts +0 -2
- package/2/apps/native/src/components/ui/extras/debug-credit-tester.tsx +0 -107
- package/2/apps/native/src/components/ui/extras/debug-mmkv-state.tsx +0 -53
- package/2/apps/native/src/components/ui/extras/handle-error.ts +0 -191
- package/2/apps/native/src/components/ui/extras/hello-wave.tsx +0 -70
- package/2/apps/native/src/components/ui/extras/icon.tsx +0 -36
- package/2/apps/native/src/components/ui/extras/network-connectivity-wrapper.tsx +0 -36
- package/2/apps/native/src/components/ui/extras/offline-indicator.tsx +0 -55
- package/2/apps/native/src/components/ui/extras/social-login-buttons.tsx +0 -296
- package/2/apps/native/src/components/ui/file-picker.tsx +0 -177
- package/2/apps/native/src/components/ui/gallery.tsx +0 -79
- package/2/apps/native/src/components/ui/icons/apple.tsx +0 -19
- package/2/apps/native/src/components/ui/icons/arrow-right.tsx +0 -26
- package/2/apps/native/src/components/ui/icons/camera.tsx +0 -26
- package/2/apps/native/src/components/ui/icons/caret-down.tsx +0 -20
- package/2/apps/native/src/components/ui/icons/chevron-up.tsx +0 -21
- package/2/apps/native/src/components/ui/icons/claude.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/copy.tsx +0 -27
- package/2/apps/native/src/components/ui/icons/deepseek.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/download.tsx +0 -32
- package/2/apps/native/src/components/ui/icons/feed.tsx +0 -12
- package/2/apps/native/src/components/ui/icons/gemini.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/github.tsx +0 -30
- package/2/apps/native/src/components/ui/icons/google.tsx +0 -24
- package/2/apps/native/src/components/ui/icons/groq.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/home.tsx +0 -19
- package/2/apps/native/src/components/ui/icons/index.tsx +0 -26
- package/2/apps/native/src/components/ui/icons/language.tsx +0 -33
- package/2/apps/native/src/components/ui/icons/llama.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/microphone.tsx +0 -20
- package/2/apps/native/src/components/ui/icons/mistral.tsx +0 -22
- package/2/apps/native/src/components/ui/icons/nutrition.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/openai.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/perplexity.tsx +0 -22
- package/2/apps/native/src/components/ui/icons/qwen.tsx +0 -15
- package/2/apps/native/src/components/ui/icons/rate.tsx +0 -24
- package/2/apps/native/src/components/ui/icons/report.tsx +0 -20
- package/2/apps/native/src/components/ui/icons/send-horizontal.tsx +0 -26
- package/2/apps/native/src/components/ui/icons/settings.tsx +0 -12
- package/2/apps/native/src/components/ui/icons/share.tsx +0 -16
- package/2/apps/native/src/components/ui/icons/square.tsx +0 -9
- package/2/apps/native/src/components/ui/icons/style.tsx +0 -22
- package/2/apps/native/src/components/ui/icons/support.tsx +0 -27
- package/2/apps/native/src/components/ui/icons/trash2.tsx +0 -42
- package/2/apps/native/src/components/ui/icons/user.tsx +0 -12
- package/2/apps/native/src/components/ui/icons/website.tsx +0 -28
- package/2/apps/native/src/components/ui/icons/wifi-off.tsx +0 -17
- package/2/apps/native/src/components/ui/index.tsx +0 -14
- package/2/apps/native/src/components/ui/nav-item.tsx +0 -42
- package/2/apps/native/src/components/ui/patterns/index.ts +0 -16
- package/2/apps/native/src/components/ui/picker.tsx +0 -244
- package/2/apps/native/src/components/ui/popover.tsx +0 -313
- package/2/apps/native/src/components/ui/primitives/index.ts +0 -38
- package/2/apps/native/src/components/ui/radio-group.tsx +0 -47
- package/2/apps/native/src/components/ui/searchbar.tsx +0 -118
- package/2/apps/native/src/components/ui/sheet.tsx +0 -93
- package/2/apps/native/src/components/ui/switch.tsx +0 -37
- package/2/apps/native/src/components/ui/table.tsx +0 -296
- package/2/apps/native/src/components/ui/tabs.tsx +0 -115
- package/2/apps/native/src/components/ui/toggle.tsx +0 -50
- package/2/apps/native/src/components/ui/utils.tsx +0 -34
- package/2/apps/native/src/components/ui/video.tsx +0 -39
- package/2/apps/native/src/core/analytics/analytics-service.ts +0 -94
- package/2/apps/native/src/core/analytics/index.ts +0 -2
- package/2/apps/native/src/core/analytics/posthog-analytics-adapter.ts +0 -192
- package/2/apps/native/src/core/auth/auth-service.ts +0 -33
- package/2/apps/native/src/core/auth/index.ts +0 -1
- package/2/apps/native/src/core/cache/__tests__/cache-service.test.ts +0 -599
- package/2/apps/native/src/core/cache/cache-service.ts +0 -89
- package/2/apps/native/src/core/cache/index.ts +0 -45
- package/2/apps/native/src/core/config/config.service.ts +0 -153
- package/2/apps/native/src/core/config/index.ts +0 -2
- package/2/apps/native/src/core/config/telemetry.ts +0 -38
- package/2/apps/native/src/core/local-notifications/local-notification-manager.ts +0 -409
- package/2/apps/native/src/core/logging/custom-transports.ts +0 -126
- package/2/apps/native/src/core/logging/index.ts +0 -1
- package/2/apps/native/src/core/logging/logger.ts +0 -182
- package/2/apps/native/src/core/navigation/deep-link-handler.ts +0 -295
- package/2/apps/native/src/core/navigation/navigation-types.ts +0 -53
- package/2/apps/native/src/core/payments/index.ts +0 -1
- package/2/apps/native/src/core/payments/payment-service.ts +0 -32
- package/2/apps/native/src/core/quick-actions/index.ts +0 -2
- package/2/apps/native/src/core/quick-actions/quick-actions-adapter.ts +0 -54
- package/2/apps/native/src/core/quick-actions/types.ts +0 -29
- package/2/apps/native/src/core/storage/index.ts +0 -1
- package/2/apps/native/src/core/storage/mmkv.ts +0 -62
- package/2/apps/native/src/core/storage/notification-storage.ts +0 -312
- package/2/apps/native/src/core/types/common.ts +0 -0
- package/2/apps/native/src/core/utils/convex-http-api.ts +0 -30
- package/2/apps/native/src/features/audio-recorder/components/audio-player.tsx +0 -301
- package/2/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +0 -373
- package/2/apps/native/src/features/audio-recorder/components/audio-waveform.tsx +0 -270
- package/2/apps/native/src/features/audio-recorder/components/index.ts +0 -4
- package/2/apps/native/src/features/audio-recorder/components/recording-list.tsx +0 -89
- package/2/apps/native/src/features/audio-recorder/demo/audio-player-demo.tsx +0 -66
- package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-cloud.tsx +0 -68
- package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-interview.tsx +0 -102
- package/2/apps/native/src/features/audio-recorder/demo/basic.tsx +0 -27
- package/2/apps/native/src/features/audio-recorder/demo/index.ts +0 -5
- package/2/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +0 -82
- package/2/apps/native/src/features/authentication/components/auth-watcher.tsx +0 -115
- package/2/apps/native/src/features/authentication/components/login-form.tsx +0 -85
- package/2/apps/native/src/features/authentication/services/__tests__/convex-auth.adapter.test.ts +0 -399
- package/2/apps/native/src/features/authentication/services/convex-auth.adapter.ts +0 -497
- package/2/apps/native/src/features/authentication/services/index.ts +0 -2
- package/2/apps/native/src/features/charts/README.md +0 -185
- package/2/apps/native/src/features/charts/app/preview.tsx +0 -226
- package/2/apps/native/src/features/charts/components/area-chart.tsx +0 -43
- package/2/apps/native/src/features/charts/components/bar-chart.tsx +0 -146
- package/2/apps/native/src/features/charts/components/candlestick-chart.tsx +0 -199
- package/2/apps/native/src/features/charts/components/chart-card.tsx +0 -68
- package/2/apps/native/src/features/charts/components/column-chart.tsx +0 -146
- package/2/apps/native/src/features/charts/components/doughnut-chart.tsx +0 -260
- package/2/apps/native/src/features/charts/components/index.ts +0 -13
- package/2/apps/native/src/features/charts/components/line-chart.tsx +0 -311
- package/2/apps/native/src/features/charts/components/radar-chart.tsx +0 -183
- package/2/apps/native/src/features/charts/components/radial-bar-chart.tsx +0 -191
- package/2/apps/native/src/features/charts/components/stacked-area-chart.tsx +0 -268
- package/2/apps/native/src/features/charts/components/stacked-bar-chart.tsx +0 -325
- package/2/apps/native/src/features/charts/data/mock-data.ts +0 -186
- package/2/apps/native/src/features/charts/types/index.ts +0 -69
- package/2/apps/native/src/features/chatbot/app/index.tsx +0 -303
- package/2/apps/native/src/features/chatbot/components/chat-header-buttons.tsx +0 -60
- package/2/apps/native/src/features/chatbot/components/chat-input-bar.tsx +0 -470
- package/2/apps/native/src/features/chatbot/components/chat-markdown.tsx +0 -576
- package/2/apps/native/src/features/chatbot/components/chat-message-bubble.tsx +0 -247
- package/2/apps/native/src/features/chatbot/components/chat-settings-modal.tsx +0 -162
- package/2/apps/native/src/features/chatbot/components/image-preview-list.tsx +0 -116
- package/2/apps/native/src/features/chatbot/components/markdown/code-block.tsx +0 -166
- package/2/apps/native/src/features/chatbot/components/markdown/index.ts +0 -11
- package/2/apps/native/src/features/chatbot/components/markdown/table-renderer.tsx +0 -130
- package/2/apps/native/src/features/chatbot/components/message-error-boundary.tsx +0 -79
- package/2/apps/native/src/features/chatbot/components/message-list.tsx +0 -174
- package/2/apps/native/src/features/chatbot/components/model-selector.tsx +0 -284
- package/2/apps/native/src/features/chatbot/components/report-content-modal.tsx +0 -189
- package/2/apps/native/src/features/chatbot/components/suggested-messages.tsx +0 -68
- package/2/apps/native/src/features/chatbot/constants/models.ts +0 -21
- package/2/apps/native/src/features/chatbot/constants/report-reasons.ts +0 -10
- package/2/apps/native/src/features/chatbot/hooks/use-attachment-cache.ts +0 -144
- package/2/apps/native/src/features/chatbot/hooks/use-chat-config.ts +0 -665
- package/2/apps/native/src/features/chatbot/hooks/use-chat-handlers.ts +0 -360
- package/2/apps/native/src/features/chatbot/hooks/use-chatbot-settings.ts +0 -90
- package/2/apps/native/src/features/chatbot/hooks/use-conversation.ts +0 -80
- package/2/apps/native/src/features/chatbot/hooks/use-image-picker.ts +0 -123
- package/2/apps/native/src/features/chatbot/hooks/use-keyboard-coordinator.ts +0 -162
- package/2/apps/native/src/features/chatbot/hooks/use-smart-scroll-manager.ts +0 -214
- package/2/apps/native/src/features/chatbot/models/index.ts +0 -87
- package/2/apps/native/src/features/chatbot/models/models.ts +0 -163
- package/2/apps/native/src/features/chatbot/models/providers.ts +0 -63
- package/2/apps/native/src/features/chatbot/models/types.ts +0 -41
- package/2/apps/native/src/features/chatbot/services/file-uploader.ts +0 -239
- package/2/apps/native/src/features/chatbot/services/message-handler-service.ts +0 -181
- package/2/apps/native/src/features/chatbot/types/index.ts +0 -61
- package/2/apps/native/src/features/chatbot/utils/chat-telemetry.ts +0 -92
- package/2/apps/native/src/features/image-generator/app/_layout.tsx +0 -26
- package/2/apps/native/src/features/image-generator/app/gallery.tsx +0 -217
- package/2/apps/native/src/features/image-generator/app/index.tsx +0 -237
- package/2/apps/native/src/features/image-generator/components/gallery-image.tsx +0 -25
- package/2/apps/native/src/features/image-generator/components/image-detail-modal.tsx +0 -215
- package/2/apps/native/src/features/image-generator/components/image-model-selector.tsx +0 -210
- package/2/apps/native/src/features/image-generator/components/image-placeholder.tsx +0 -26
- package/2/apps/native/src/features/image-generator/hooks/use-image-gallery.ts +0 -71
- package/2/apps/native/src/features/image-generator/hooks/use-image-generator-settings.ts +0 -152
- package/2/apps/native/src/features/image-generator/hooks/use-image-generator.ts +0 -93
- package/2/apps/native/src/features/image-generator/models/models.ts +0 -66
- package/2/apps/native/src/features/image-generator/services/image-gallery-service.ts +0 -98
- package/2/apps/native/src/features/image-generator/services/image-save-service.ts +0 -121
- package/2/apps/native/src/features/onboarding/analytics/index.ts +0 -9
- package/2/apps/native/src/features/onboarding/components/onboarding-with-analytics.tsx +0 -141
- package/2/apps/native/src/features/onboarding/components/onboarding.tsx +0 -173
- package/2/apps/native/src/features/onboarding/config/onboarding-flow-config.ts +0 -189
- package/2/apps/native/src/features/onboarding/demo-one/app/index.tsx +0 -43
- package/2/apps/native/src/features/onboarding/demo-one/data.ts +0 -32
- package/2/apps/native/src/features/onboarding/hooks/use-onboarding-analytics.ts +0 -323
- package/2/apps/native/src/features/onboarding/services/onboarding-analytics.ts +0 -432
- package/2/apps/native/src/features/payments/README.md +0 -200
- package/2/apps/native/src/features/payments/app/local-paywall.tsx +0 -194
- package/2/apps/native/src/features/payments/app/remote-paywall.tsx +0 -79
- package/2/apps/native/src/features/payments/components/payment-initializer.tsx +0 -95
- package/2/apps/native/src/features/payments/components/paywall-error-state.tsx +0 -60
- package/2/apps/native/src/features/payments/components/paywall-local-mode.tsx +0 -116
- package/2/apps/native/src/features/payments/components/paywall-product-card.tsx +0 -133
- package/2/apps/native/src/features/payments/components/paywall-remote-mode.tsx +0 -146
- package/2/apps/native/src/features/payments/hooks/use-entitlement.ts +0 -63
- package/2/apps/native/src/features/payments/index.ts +0 -8
- package/2/apps/native/src/features/payments/services/revenuecat-adapter.ts +0 -407
- package/2/apps/native/src/features/quick-actions/components/quick-actions-demo.tsx +0 -139
- package/2/apps/native/src/features/quick-actions/config/default-actions.ts +0 -83
- package/2/apps/native/src/features/quick-actions/hooks/use-quick-actions.ts +0 -45
- package/2/apps/native/src/features/quick-actions/index.ts +0 -4
- package/2/apps/native/src/features/quick-actions/utils/quick-actions-manager.ts +0 -105
- package/2/apps/native/src/features/quiz/components/question.tsx +0 -67
- package/2/apps/native/src/features/quiz/config.ts +0 -11
- package/2/apps/native/src/features/quiz/index.tsx +0 -133
- package/2/apps/native/src/features/settings/ui/debug-info.tsx +0 -75
- package/2/apps/native/src/features/settings/ui/dev-tools.tsx +0 -1
- package/2/apps/native/src/features/settings/ui/item.tsx +0 -45
- package/2/apps/native/src/features/settings/ui/items-container.tsx +0 -23
- package/2/apps/native/src/features/settings/ui/language-item.tsx +0 -52
- package/2/apps/native/src/features/settings/ui/notification-item.tsx +0 -59
- package/2/apps/native/src/features/settings/ui/theme-item.tsx +0 -45
- package/2/apps/native/src/features/tracker-app/app/index.tsx +0 -108
- package/2/apps/native/src/features/tracker-app/components/animated-number.tsx +0 -102
- package/2/apps/native/src/features/tracker-app/components/calorie-card.tsx +0 -66
- package/2/apps/native/src/features/tracker-app/components/circular-progress.tsx +0 -97
- package/2/apps/native/src/features/tracker-app/components/floating-add-button.tsx +0 -27
- package/2/apps/native/src/features/tracker-app/components/macro-card.tsx +0 -80
- package/2/apps/native/src/features/tracker-app/components/promo-banner.tsx +0 -98
- package/2/apps/native/src/features/tracker-app/components/recently-logged.tsx +0 -64
- package/2/apps/native/src/features/tracker-app/components/week-calendar.tsx +0 -68
- package/2/apps/native/src/features/vibefast-features.ts +0 -42
- package/2/apps/native/src/features/voice-bot/README.md +0 -185
- package/2/apps/native/src/features/voice-bot/components/conversation-status.tsx +0 -76
- package/2/apps/native/src/features/voice-bot/components/index.ts +0 -4
- package/2/apps/native/src/features/voice-bot/components/message-input.tsx +0 -98
- package/2/apps/native/src/features/voice-bot/components/voice-bot-screen.tsx +0 -173
- package/2/apps/native/src/features/voice-bot/components/voice-controls.tsx +0 -73
- package/2/apps/native/src/features/voice-bot/index.ts +0 -3
- package/2/apps/native/src/features/voice-bot/services/index.ts +0 -1
- package/2/apps/native/src/features/voice-bot/services/use-voice-bot.ts +0 -161
- package/2/apps/native/src/features/voice-bot/types.ts +0 -29
- package/2/apps/native/src/features/wake-word/components/index.ts +0 -1
- package/2/apps/native/src/features/wake-word/components/wake-word-indicator.tsx +0 -61
- package/2/apps/native/src/features/wake-word/constants.ts +0 -10
- package/2/apps/native/src/features/wake-word/hooks/use-wake-word.ts +0 -181
- package/2/apps/native/src/features/wake-word/index.ts +0 -22
- package/2/apps/native/src/features/wake-word/services/audio-session.ts +0 -40
- package/2/apps/native/src/features/wake-word/services/event-bus.ts +0 -31
- package/2/apps/native/src/features/wake-word/services/keywords.ts +0 -88
- package/2/apps/native/src/features/wake-word/services/wake-word-manager.ts +0 -249
- package/2/apps/native/src/features/wake-word/types.ts +0 -22
- package/2/apps/native/src/lib/env.js +0 -13
- package/2/apps/native/src/lib/hooks/index.tsx +0 -6
- package/2/apps/native/src/lib/hooks/use-device-identifier.tsx +0 -80
- package/2/apps/native/src/lib/hooks/use-gradual-animation.ts +0 -28
- package/2/apps/native/src/lib/hooks/use-is-first-time.tsx +0 -25
- package/2/apps/native/src/lib/hooks/use-navigation-analytics.ts +0 -44
- package/2/apps/native/src/lib/hooks/use-navigation-options.tsx +0 -87
- package/2/apps/native/src/lib/hooks/use-push-notifications.ts +0 -250
- package/2/apps/native/src/lib/hooks/use-responsive-size.tsx +0 -37
- package/2/apps/native/src/lib/hooks/use-selected-theme.tsx +0 -38
- package/2/apps/native/src/lib/hooks/use-viewport-lazy-loading.tsx +0 -124
- package/2/apps/native/src/lib/i18n/index.tsx +0 -30
- package/2/apps/native/src/lib/i18n/react-i18next.d.ts +0 -9
- package/2/apps/native/src/lib/i18n/resources.ts +0 -25
- package/2/apps/native/src/lib/i18n/types.ts +0 -23
- package/2/apps/native/src/lib/i18n/utils.tsx +0 -112
- package/2/apps/native/src/lib/index.tsx +0 -3
- package/2/apps/native/src/lib/state/auth-client-slice.ts +0 -34
- package/2/apps/native/src/lib/state/index.ts +0 -1
- package/2/apps/native/src/lib/storage.tsx +0 -7
- package/2/apps/native/src/lib/test-utils.tsx +0 -43
- package/2/apps/native/src/lib/use-theme-config.tsx +0 -108
- package/2/apps/native/src/lib/utils.ts +0 -29
- package/2/apps/native/src/polyfills.ts +0 -61
- package/2/apps/native/src/providers/convex-provider.tsx +0 -31
- package/2/apps/native/src/providers/index.tsx +0 -6
- package/2/apps/native/src/providers/notification-provider.tsx +0 -168
- package/2/apps/native/src/providers/posthog-provider.tsx +0 -47
- package/2/apps/native/src/providers/root-providers.tsx +0 -46
- package/2/apps/native/src/providers/sentry-provider.tsx +0 -62
- package/2/apps/native/src/providers/splash-screen-provider.tsx +0 -122
- package/2/apps/native/src/providers/theme-provider.tsx +0 -67
- package/2/apps/native/src/translations/ar.json +0 -394
- package/2/apps/native/src/translations/de.json +0 -394
- package/2/apps/native/src/translations/en.json +0 -394
- package/2/apps/native/src/translations/es.json +0 -394
- package/2/apps/native/src/translations/fr.json +0 -394
- package/2/apps/native/src/types/flash-list.d.ts +0 -3
- package/2/apps/native/src/types/index.ts +0 -3
- package/2/apps/native/src/types/react-native-reanimated.d.ts +0 -5
- package/2/apps/native/tailwind.config.js +0 -57
- package/2/apps/native/targets/widget/AppIntent.swift +0 -46
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -122
- package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
- package/2/apps/native/targets/widget/CalorieTrackerWidget.swift +0 -424
- package/2/apps/native/targets/widget/HabitTrackerWidget.swift +0 -305
- package/2/apps/native/targets/widget/Info.plist +0 -11
- package/2/apps/native/targets/widget/WidgetLiveActivity.swift +0 -75
- package/2/apps/native/targets/widget/expo-target.config.js +0 -10
- package/2/apps/native/targets/widget/generated.entitlements +0 -5
- package/2/apps/native/targets/widget/index.swift +0 -18
- package/2/apps/native/targets/widget/widgets.swift +0 -96
- package/2/apps/native/tsconfig.json +0 -88
- package/2/apps/native/vitest.config.mts +0 -14
- package/2/apps/web/README.md +0 -36
- package/2/apps/web/app/favicon.ico +0 -0
- package/2/apps/web/app/globals.css +0 -122
- package/2/apps/web/app/layout.tsx +0 -38
- package/2/apps/web/app/page.tsx +0 -35
- package/2/apps/web/app/users/page.tsx +0 -301
- package/2/apps/web/components/AdminDashboard.tsx +0 -336
- package/2/apps/web/components/AppleLogo.tsx +0 -15
- package/2/apps/web/components/GitHubLogo.tsx +0 -11
- package/2/apps/web/components/GoogleLogo.tsx +0 -23
- package/2/apps/web/components/Layout.tsx +0 -77
- package/2/apps/web/components/ThemeToggle.tsx +0 -23
- package/2/apps/web/components/UserMenu.tsx +0 -66
- package/2/apps/web/components/auth/CodeInput.tsx +0 -24
- package/2/apps/web/components/auth/ResetPasswordWithEmailCode.tsx +0 -85
- package/2/apps/web/components/auth/SignInFormEmailCode.tsx +0 -72
- package/2/apps/web/components/auth/SignInFormEmailLink.tsx +0 -81
- package/2/apps/web/components/auth/SignInFormPassword.tsx +0 -17
- package/2/apps/web/components/auth/SignInFormPasswordAndCustomField.tsx +0 -42
- package/2/apps/web/components/auth/SignInFormPasswordAndResetViaCode.tsx +0 -32
- package/2/apps/web/components/auth/SignInFormPasswordAndVerifyViaCode.tsx +0 -86
- package/2/apps/web/components/auth/SignInFormPhoneCode.tsx +0 -89
- package/2/apps/web/components/auth/SignInFormsShowcase.tsx +0 -64
- package/2/apps/web/components/auth/SignInMethodDivider.tsx +0 -17
- package/2/apps/web/components/auth/SignInWithEmailCode.tsx +0 -49
- package/2/apps/web/components/auth/SignInWithOAuth.tsx +0 -16
- package/2/apps/web/components/auth/SignInWithPassword.tsx +0 -100
- package/2/apps/web/components/auth/oauth/SignInWithApple.tsx +0 -27
- package/2/apps/web/components/auth/oauth/SignInWithGitHub.tsx +0 -27
- package/2/apps/web/components/auth/oauth/SignInWithGoogle.tsx +0 -27
- package/2/apps/web/components/ui/button.tsx +0 -60
- package/2/apps/web/components/ui/card.tsx +0 -92
- package/2/apps/web/components/ui/dialog.tsx +0 -143
- package/2/apps/web/components/ui/dropdown-menu.tsx +0 -257
- package/2/apps/web/components/ui/input-otp.tsx +0 -77
- package/2/apps/web/components/ui/input.tsx +0 -21
- package/2/apps/web/components/ui/skeleton.tsx +0 -13
- package/2/apps/web/components/ui/tabs.tsx +0 -66
- package/2/apps/web/components/ui/toast.tsx +0 -130
- package/2/apps/web/components/ui/toaster.tsx +0 -36
- package/2/apps/web/components/ui/toggle-group.tsx +0 -83
- package/2/apps/web/components/ui/toggle.tsx +0 -47
- package/2/apps/web/components/ui/use-toast.ts +0 -192
- package/2/apps/web/components.json +0 -22
- package/2/apps/web/eslint.config.mjs +0 -18
- package/2/apps/web/lib/convex-provider.tsx +0 -18
- package/2/apps/web/lib/utils.ts +0 -6
- package/2/apps/web/next.config.ts +0 -7
- package/2/apps/web/package.json +0 -46
- package/2/apps/web/postcss.config.mjs +0 -7
- package/2/apps/web/public/file.svg +0 -1
- package/2/apps/web/public/globe.svg +0 -1
- package/2/apps/web/public/next.svg +0 -1
- package/2/apps/web/public/vercel.svg +0 -1
- package/2/apps/web/public/window.svg +0 -1
- package/2/apps/web/tsconfig.json +0 -34
- package/2/bts.jsonc +0 -21
- package/2/commitlint.config.js +0 -1
- package/2/eslint.config.mjs +0 -182
- package/2/lint-staged.config.js +0 -16
- package/2/package.json +0 -64
- package/2/packages/backend/.env.example +0 -20
- package/2/packages/backend/convex/README.md +0 -90
- package/2/packages/backend/convex/_generated/api.d.ts +0 -2599
- package/2/packages/backend/convex/_generated/api.js +0 -23
- package/2/packages/backend/convex/_generated/dataModel.d.ts +0 -60
- package/2/packages/backend/convex/_generated/server.d.ts +0 -149
- package/2/packages/backend/convex/_generated/server.js +0 -90
- package/2/packages/backend/convex/agents.ts +0 -116
- package/2/packages/backend/convex/auth.config.ts +0 -8
- package/2/packages/backend/convex/auth.ts +0 -103
- package/2/packages/backend/convex/authCustomEmailOtpProvider.ts +0 -175
- package/2/packages/backend/convex/authOtp.ts +0 -144
- package/2/packages/backend/convex/authPasswordReset.ts +0 -367
- package/2/packages/backend/convex/authPasswordResetActions.ts +0 -150
- package/2/packages/backend/convex/chatbot/index.ts +0 -30
- package/2/packages/backend/convex/chatbotAgent.ts +0 -1085
- package/2/packages/backend/convex/chatbotHistory.ts +0 -307
- package/2/packages/backend/convex/convex.config.ts +0 -13
- package/2/packages/backend/convex/deviceGrants.ts +0 -58
- package/2/packages/backend/convex/grantFunctions.ts +0 -444
- package/2/packages/backend/convex/http.ts +0 -8
- package/2/packages/backend/convex/imageGeneration/index.ts +0 -12
- package/2/packages/backend/convex/imageGeneratorFunctions.ts +0 -290
- package/2/packages/backend/convex/lib/ai/analysisConfigs.ts +0 -257
- package/2/packages/backend/convex/lib/ai/config.ts +0 -71
- package/2/packages/backend/convex/lib/ai/geminiAdapter.ts +0 -43
- package/2/packages/backend/convex/lib/ai/openaiAdapter.ts +0 -43
- package/2/packages/backend/convex/lib/ai/schemas.ts +0 -79
- package/2/packages/backend/convex/lib/config.ts +0 -111
- package/2/packages/backend/convex/lib/rateLimit.ts +0 -100
- package/2/packages/backend/convex/lib/telemetry.ts +0 -29
- package/2/packages/backend/convex/paymentFunctions.ts +0 -119
- package/2/packages/backend/convex/payments/index.ts +0 -13
- package/2/packages/backend/convex/pushNotificationFunctions.ts +0 -342
- package/2/packages/backend/convex/ragKnowledge.ts +0 -714
- package/2/packages/backend/convex/rateLimit.ts +0 -13
- package/2/packages/backend/convex/recordingFunctions.ts +0 -98
- package/2/packages/backend/convex/reportFunctions.ts +0 -344
- package/2/packages/backend/convex/reporting/index.ts +0 -9
- package/2/packages/backend/convex/router.ts +0 -81
- package/2/packages/backend/convex/schema.ts +0 -237
- package/2/packages/backend/convex/shared/email.ts +0 -172
- package/2/packages/backend/convex/shared/files.ts +0 -96
- package/2/packages/backend/convex/shared/index.ts +0 -17
- package/2/packages/backend/convex/shared/templates/PasswordResetEmail.tsx +0 -72
- package/2/packages/backend/convex/shared/templates/VerificationCodeEmail.tsx +0 -65
- package/2/packages/backend/convex/sharedUsers.ts +0 -48
- package/2/packages/backend/convex/tools/index.ts +0 -18
- package/2/packages/backend/convex/tools/knowledgeRetrieval.ts +0 -92
- package/2/packages/backend/convex/tools/tavilySearch.ts +0 -83
- package/2/packages/backend/convex/tools/userProfile.ts +0 -72
- package/2/packages/backend/convex/tsconfig.json +0 -25
- package/2/packages/backend/convex/users.ts +0 -54
- package/2/packages/backend/index.ts +0 -20
- package/2/packages/backend/package.json +0 -32
- package/2/packages/ui/README.md +0 -63
- package/2/packages/ui/index.ts +0 -1
- package/2/packages/ui/package.json +0 -21
- package/2/packages/ui/src/components/SharedButton.tsx +0 -31
- package/2/packages/ui/src/components/SharedCard.tsx +0 -48
- package/2/packages/ui/src/components/index.ts +0 -2
- package/2/packages/ui/tsconfig.json +0 -10
- package/2/pnpm-lock.yaml +0 -23292
- package/2/pnpm-workspace.yaml +0 -3
- package/2/scripts/i18next-syntax-validation.js +0 -1
- package/2/tsconfig.json +0 -43
- package/2/turbo.json +0 -33
- package/2/vercel.json +0 -6
- package/2/vf-agent/agent-teams/team-vibefast.yaml +0 -14
- package/2/vf-agent/agents/analyst.md +0 -53
- package/2/vf-agent/agents/architect.md +0 -105
- package/2/vf-agent/agents/dev.md +0 -40
- package/2/vf-agent/agents/orchestrator.md +0 -181
- package/2/vf-agent/agents/pm.md +0 -48
- package/2/vf-agent/agents/po.md +0 -38
- package/2/vf-agent/agents/qa.md +0 -30
- package/2/vf-agent/agents/sm.md +0 -38
- package/2/vf-agent/agents/ux-expert.md +0 -33
- package/2/vf-agent/checklists/po-master-checklist.md +0 -73
- package/2/vf-agent/checklists/story-dod-checklist.md +0 -37
- package/2/vf-agent/core-config.yaml +0 -43
- package/2/vf-agent/data/knowledge_base/backend/convex-advanced.md +0 -43
- package/2/vf-agent/data/knowledge_base/backend/convex-database.md +0 -53
- package/2/vf-agent/data/knowledge_base/backend/convex-main.md +0 -65
- package/2/vf-agent/data/knowledge_base/backend/full-guidelines.md +0 -795
- package/2/vf-agent/data/knowledge_base/coding-standards.md +0 -253
- package/2/vf-agent/data/knowledge_base/frontend/full-guidelines.md +0 -254
- package/2/vf-agent/data/knowledge_base/frontend/image-handling.md +0 -48
- package/2/vf-agent/data/knowledge_base/frontend/react-native-main.md +0 -24
- package/2/vf-agent/data/knowledge_base/frontend/ui-and-styling.md +0 -169
- package/2/vf-agent/data/knowledge_base/general-principles.md +0 -26
- package/2/vf-agent/data/knowledge_base/master-rulebook.md +0 -42
- package/2/vf-agent/data/knowledge_base/starter-docs/audio-recorder-reference.md +0 -98
- package/2/vf-agent/data/knowledge_base/starter-docs/authentication-reference.md +0 -155
- package/2/vf-agent/data/knowledge_base/starter-docs/charts-reference.md +0 -149
- package/2/vf-agent/data/knowledge_base/starter-docs/chatbot-reference.md +0 -123
- package/2/vf-agent/data/knowledge_base/starter-docs/feature-reference-index.md +0 -211
- package/2/vf-agent/data/knowledge_base/starter-docs/features-overview.md +0 -221
- package/2/vf-agent/data/knowledge_base/starter-docs/image-analyzer-reference.md +0 -118
- package/2/vf-agent/data/knowledge_base/starter-docs/image-generator-reference.md +0 -110
- package/2/vf-agent/data/knowledge_base/starter-docs/index.md +0 -28
- package/2/vf-agent/data/knowledge_base/starter-docs/onboarding-reference.md +0 -96
- package/2/vf-agent/data/knowledge_base/starter-docs/payments-reference.md +0 -148
- package/2/vf-agent/data/knowledge_base/starter-docs/prd.md +0 -82
- package/2/vf-agent/data/knowledge_base/starter-docs/push-notifications-reference.md +0 -453
- package/2/vf-agent/data/knowledge_base/starter-docs/quick-actions-reference.md +0 -253
- package/2/vf-agent/data/knowledge_base/starter-docs/quiz-reference.md +0 -169
- package/2/vf-agent/data/knowledge_base/starter-docs/settings-reference.md +0 -146
- package/2/vf-agent/data/knowledge_base/starter-docs/tech-stack.md +0 -159
- package/2/vf-agent/data/knowledge_base/starter-docs/tracker-app-reference.md +0 -150
- package/2/vf-agent/data/knowledge_base/starter-docs/unified-project-structure.md +0 -98
- package/2/vf-agent/data/knowledge_base/testing/backend-testing.md +0 -54
- package/2/vf-agent/data/knowledge_base/testing/frontend-testing.md +0 -71
- package/2/vf-agent/data/knowledge_base/testing/testing-strategy.md +0 -31
- package/2/vf-agent/tasks/advanced-elicitation.md +0 -117
- package/2/vf-agent/tasks/brownfield-create-epic.md +0 -160
- package/2/vf-agent/tasks/create-deep-research-prompt.md +0 -278
- package/2/vf-agent/tasks/create-doc.md +0 -42
- package/2/vf-agent/tasks/create-story.md +0 -43
- package/2/vf-agent/tasks/document-project.md +0 -343
- package/2/vf-agent/tasks/facilitate-brainstorming-session.md +0 -136
- package/2/vf-agent/tasks/index-docs.md +0 -173
- package/2/vf-agent/tasks/kb-mode-interaction.md +0 -75
- package/2/vf-agent/tasks/review-story.md +0 -154
- package/2/vf-agent/tasks/shard-doc.md +0 -185
- package/2/vf-agent/tasks/troubleshoot-issue.md +0 -65
- package/2/vf-agent/tasks/validate-next-story.md +0 -47
- package/2/vf-agent/templates/brainstorming-output-tmpl.yaml +0 -156
- package/2/vf-agent/templates/brownfield-architecture-tmpl.yaml +0 -111
- package/2/vf-agent/templates/brownfield-prd-tmpl.yaml +0 -247
- package/2/vf-agent/templates/competitor-analysis-tmpl.yaml +0 -293
- package/2/vf-agent/templates/market-research-tmpl.yaml +0 -252
- package/2/vf-agent/templates/project-brief-tmpl.yaml +0 -221
- package/2/vf-agent/templates/story-tmpl.yaml +0 -143
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/demo.tsx +0 -444
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +0 -355
- package/recipes/0/apps/native/src/components/advanced-ui/timeline/types.ts +0 -31
- package/recipes/wake-word/scripts/download-vosk-model.mjs +0 -121
- /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/animated-chip.tsx +0 -0
- /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/chip.tsx +0 -0
- /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/demo.tsx +0 -0
- /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/types.ts +0 -0
- /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/animated-switch.tsx +0 -0
- /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/demo.tsx +0 -0
- /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/types.ts +0 -0
- /package/{2 → recipes/glowing-button}/apps/native/src/components/advanced-ui/buttons/demo.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/front.jpg +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/side.jpg +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/threeQuarter.jpg +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/api-client/image-analyzer.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/_layout.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/analysis-options.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/camera.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/index.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/loading.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/results.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/trait-details.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/camera.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/loading-screen.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/loading.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/results.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/trait-details.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/use-analysis-data.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/use-results-screen.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-badge.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-card.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-unlocked-modal.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievements-section.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/advice-list.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/circular-progress.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/content-card.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/error-state.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/index.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/loading-state.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/profile-image.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/results-header.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/score-display.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/share-options-modal.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/traits-grid.tsx +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/config/analysis-config.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/config/master-analysis-config.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/index.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/use-analysis.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/analysis-service.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/share-service.ts +0 -0
- /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/trait-details-service.ts +0 -0
- /package/{2 → recipes/image-analysis}/packages/backend/convex/imageAnalysis/index.ts +0 -0
- /package/{2 → recipes/image-analysis}/packages/backend/convex/imageAnalysisFunctions.ts +0 -0
- /package/{2 → recipes/image-analysis}/packages/backend/convex/lib/ai/imageAnalysisAdapter.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/button/stepper-button.tsx +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/button/types.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/content/stepper-content.tsx +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/content/types.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/value/stepper-value.tsx +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/value/types.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/context/stepper-context.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/context/types.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/demo.tsx +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/index.ts +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/stepper.tsx +0 -0
- /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/types.ts +0 -0
- /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/animated-progress-bar.tsx +0 -0
- /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/dropdown-picker-page.tsx +0 -0
- /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +0 -0
- /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/progress-circle.tsx +0 -0
- /package/{2 → recipes/swipe-slider}/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +0 -0
- /package/{2 → recipes/swipe-slider}/apps/native/src/components/advanced-ui/sliders/swipe-slider.tsx +0 -0
- /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/demo.tsx +0 -0
- /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +0 -0
- /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/types.ts +0 -0
- /package/{2 → recipes/wake-word}/apps/native/scripts/download-vosk-model.mjs +0 -0
|
@@ -22,48 +22,48 @@ describe('prompt', () => {
|
|
|
22
22
|
});
|
|
23
23
|
|
|
24
24
|
describe('promptYesNo', () => {
|
|
25
|
-
it('should return default value in non-TTY environment', () => {
|
|
25
|
+
it('should return default value in non-TTY environment', async () => {
|
|
26
26
|
(process.stdin as any).isTTY = false;
|
|
27
27
|
|
|
28
|
-
const result = promptYesNo('Continue?', true);
|
|
28
|
+
const result = await promptYesNo('Continue?', true);
|
|
29
29
|
expect(result).toBe(true);
|
|
30
30
|
|
|
31
|
-
const result2 = promptYesNo('Continue?', false);
|
|
31
|
+
const result2 = await promptYesNo('Continue?', false);
|
|
32
32
|
expect(result2).toBe(false);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
-
it('should return default value in CI environment', () => {
|
|
35
|
+
it('should return default value in CI environment', async () => {
|
|
36
36
|
process.env.CI = 'true';
|
|
37
37
|
|
|
38
|
-
const result = promptYesNo('Continue?', true);
|
|
38
|
+
const result = await promptYesNo('Continue?', true);
|
|
39
39
|
expect(result).toBe(true);
|
|
40
40
|
|
|
41
|
-
const result2 = promptYesNo('Continue?', false);
|
|
41
|
+
const result2 = await promptYesNo('Continue?', false);
|
|
42
42
|
expect(result2).toBe(false);
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
it('should detect GitHub Actions', () => {
|
|
45
|
+
it('should detect GitHub Actions', async () => {
|
|
46
46
|
process.env.GITHUB_ACTIONS = 'true';
|
|
47
47
|
|
|
48
|
-
const result = promptYesNo('Continue?', false);
|
|
48
|
+
const result = await promptYesNo('Continue?', false);
|
|
49
49
|
expect(result).toBe(false);
|
|
50
50
|
|
|
51
51
|
delete process.env.GITHUB_ACTIONS;
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
it('should detect GitLab CI', () => {
|
|
54
|
+
it('should detect GitLab CI', async () => {
|
|
55
55
|
process.env.GITLAB_CI = 'true';
|
|
56
56
|
|
|
57
|
-
const result = promptYesNo('Continue?', false);
|
|
57
|
+
const result = await promptYesNo('Continue?', false);
|
|
58
58
|
expect(result).toBe(false);
|
|
59
59
|
|
|
60
60
|
delete process.env.GITLAB_CI;
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
-
it('should detect CircleCI', () => {
|
|
63
|
+
it('should detect CircleCI', async () => {
|
|
64
64
|
process.env.CIRCLECI = 'true';
|
|
65
65
|
|
|
66
|
-
const result = promptYesNo('Continue?', false);
|
|
66
|
+
const result = await promptYesNo('Continue?', false);
|
|
67
67
|
expect(result).toBe(false);
|
|
68
68
|
|
|
69
69
|
delete process.env.CIRCLECI;
|
|
@@ -37,11 +37,12 @@ describe('validate', () => {
|
|
|
37
37
|
await expect(validateSignature(signaturePath)).rejects.toThrow('Not a VibeFast repo');
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
it('should
|
|
41
|
-
const config = { name: '
|
|
40
|
+
it('should accept any valid name', async () => {
|
|
41
|
+
const config = { name: 'custom-starter', version: '1.0.0', targets: ['native'] };
|
|
42
42
|
await writeFileContent(signaturePath, JSON.stringify(config));
|
|
43
43
|
|
|
44
|
-
await
|
|
44
|
+
const result = await validateSignature(signaturePath);
|
|
45
|
+
expect(result.name).toBe('custom-starter');
|
|
45
46
|
});
|
|
46
47
|
|
|
47
48
|
it('should throw if targets empty', async () => {
|
package/src/core/auth.ts
CHANGED
|
@@ -34,6 +34,14 @@ export async function saveToken(token: string): Promise<void> {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
await writeFileContent(configPath, JSON.stringify(config, null, 2), { force: true });
|
|
37
|
+
|
|
38
|
+
// Set restrictive permissions (owner read/write only)
|
|
39
|
+
try {
|
|
40
|
+
const { chmod } = await import('fs/promises');
|
|
41
|
+
await chmod(configPath, 0o600);
|
|
42
|
+
} catch {
|
|
43
|
+
// Ignore on Windows or if chmod fails
|
|
44
|
+
}
|
|
37
45
|
}
|
|
38
46
|
|
|
39
47
|
export async function getToken(): Promise<string | null> {
|
package/src/core/codemod.ts
CHANGED
|
@@ -5,6 +5,17 @@ const NATIVE_END = '// --- @vibefast:features:end ---';
|
|
|
5
5
|
const WEB_START = '{/* @vibefast:nav:start */}';
|
|
6
6
|
const WEB_END = '{/* @vibefast:nav:end */}';
|
|
7
7
|
|
|
8
|
+
export const ENV_CONSTANTS_START = '// --- @vibefast:env:constants:start ---';
|
|
9
|
+
export const ENV_CONSTANTS_END = '// --- @vibefast:env:constants:end ---';
|
|
10
|
+
export const ENV_CLIENT_SCHEMA_START = '// --- @vibefast:env:client-schema:start ---';
|
|
11
|
+
export const ENV_CLIENT_SCHEMA_END = '// --- @vibefast:env:client-schema:end ---';
|
|
12
|
+
export const ENV_CLIENT_ENV_START = '// --- @vibefast:env:client-env:start ---';
|
|
13
|
+
export const ENV_CLIENT_ENV_END = '// --- @vibefast:env:client-env:end ---';
|
|
14
|
+
export const ENV_BUILD_TIME_SCHEMA_START = '// --- @vibefast:env:buildtime-schema:start ---';
|
|
15
|
+
export const ENV_BUILD_TIME_SCHEMA_END = '// --- @vibefast:env:buildtime-schema:end ---';
|
|
16
|
+
export const ENV_BUILD_TIME_ENV_START = '// --- @vibefast:env:buildtime-env:start ---';
|
|
17
|
+
export const ENV_BUILD_TIME_ENV_END = '// --- @vibefast:env:buildtime-env:end ---';
|
|
18
|
+
|
|
8
19
|
function escapeTsLiteral(value: string): string {
|
|
9
20
|
return value
|
|
10
21
|
.replace(/\\/g, '\\\\')
|
|
@@ -209,3 +220,58 @@ export async function removeNavLinkWeb(
|
|
|
209
220
|
|
|
210
221
|
return true;
|
|
211
222
|
}
|
|
223
|
+
|
|
224
|
+
function normalizeSnippet(snippet: string): string {
|
|
225
|
+
return snippet.trim();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function hasSnippet(content: string, snippet: string): boolean {
|
|
229
|
+
const normalized = normalizeSnippet(snippet);
|
|
230
|
+
if (!normalized) return false;
|
|
231
|
+
return content.includes(normalized);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export async function insertEnvSnippets(
|
|
235
|
+
filePath: string,
|
|
236
|
+
startMarker: string,
|
|
237
|
+
endMarker: string,
|
|
238
|
+
snippets: string[],
|
|
239
|
+
options?: { dryRun?: boolean }
|
|
240
|
+
): Promise<boolean> {
|
|
241
|
+
if (!snippets.length) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const content = await readFileContent(filePath);
|
|
246
|
+
if (!content.includes(startMarker) || !content.includes(endMarker)) {
|
|
247
|
+
throw new Error(`Missing env markers ${startMarker} or ${endMarker} in ${filePath}`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const toInsert: string[] = [];
|
|
251
|
+
for (const snippet of snippets) {
|
|
252
|
+
if (hasSnippet(content, snippet)) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
toInsert.push(snippet);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (toInsert.length === 0) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const normalizedLines = toInsert
|
|
263
|
+
.map(line => line.endsWith('\n') ? line : `${line}\n`)
|
|
264
|
+
.join('');
|
|
265
|
+
|
|
266
|
+
const insertPosition = content.indexOf(endMarker);
|
|
267
|
+
const before = content.slice(0, insertPosition);
|
|
268
|
+
const after = content.slice(insertPosition);
|
|
269
|
+
const addition = `\n${normalizedLines}`;
|
|
270
|
+
const newContent = `${before}${addition}${after}`;
|
|
271
|
+
|
|
272
|
+
if (!options?.dryRun) {
|
|
273
|
+
await writeFileContent(filePath, newContent, { force: true });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return true;
|
|
277
|
+
}
|
package/src/core/errors.ts
CHANGED
|
@@ -61,7 +61,7 @@ export function showCommandHint(command: string, missingArg?: string) {
|
|
|
61
61
|
|
|
62
62
|
Options:
|
|
63
63
|
--license <key> Your VibeFast license key
|
|
64
|
-
--branch <branch> Branch to clone (clean or main, default:
|
|
64
|
+
--branch <branch> Branch to clone (clean or main, default: clean)
|
|
65
65
|
--yes Skip all prompts
|
|
66
66
|
--skip-install Skip dependency installation
|
|
67
67
|
--help Show help`,
|
package/src/core/fsx.ts
CHANGED
|
@@ -88,7 +88,7 @@ export async function copyTree(
|
|
|
88
88
|
// If interactive and not dry-run, ask user
|
|
89
89
|
if (options?.interactive && !options?.dryRun) {
|
|
90
90
|
const { promptYesNo } = await import('./prompt.js');
|
|
91
|
-
const shouldOverwrite = promptYesNo(
|
|
91
|
+
const shouldOverwrite = await promptYesNo(
|
|
92
92
|
`Overwrite ${destPath}? (y/N): `,
|
|
93
93
|
false
|
|
94
94
|
);
|
package/src/core/recipes.ts
CHANGED
|
@@ -37,7 +37,7 @@ export const RECIPES: RecipeInfo[] = [
|
|
|
37
37
|
{
|
|
38
38
|
name: 'image-analysis',
|
|
39
39
|
category: 'feature',
|
|
40
|
-
description: 'AI
|
|
40
|
+
description: 'AI image analyzer flows (face/dashboard)',
|
|
41
41
|
icon: '🔍',
|
|
42
42
|
},
|
|
43
43
|
{
|
|
@@ -46,6 +46,18 @@ export const RECIPES: RecipeInfo[] = [
|
|
|
46
46
|
description: 'AI-powered image generation',
|
|
47
47
|
icon: '🎨',
|
|
48
48
|
},
|
|
49
|
+
{
|
|
50
|
+
name: 'ios-widget',
|
|
51
|
+
category: 'feature',
|
|
52
|
+
description: 'iOS Home Screen widgets with Live Activities',
|
|
53
|
+
icon: '📱',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'payments',
|
|
57
|
+
category: 'feature',
|
|
58
|
+
description: 'In-app purchases and subscriptions with RevenueCat',
|
|
59
|
+
icon: '💳',
|
|
60
|
+
},
|
|
49
61
|
{
|
|
50
62
|
name: 'quiz',
|
|
51
63
|
category: 'feature',
|
|
@@ -70,17 +82,69 @@ export const RECIPES: RecipeInfo[] = [
|
|
|
70
82
|
description: 'Wake word detection with Vosk',
|
|
71
83
|
icon: '🎙️',
|
|
72
84
|
},
|
|
85
|
+
|
|
86
|
+
// Advanced UI
|
|
73
87
|
{
|
|
74
|
-
name: '
|
|
75
|
-
category: '
|
|
76
|
-
description: '
|
|
77
|
-
icon: '
|
|
88
|
+
name: 'animated-chip',
|
|
89
|
+
category: 'advanced-ui',
|
|
90
|
+
description: 'Interactive filter chips with animation',
|
|
91
|
+
icon: '🏷️',
|
|
78
92
|
},
|
|
79
93
|
{
|
|
80
|
-
name: '
|
|
81
|
-
category: '
|
|
82
|
-
description: '
|
|
83
|
-
icon: '
|
|
94
|
+
name: 'animated-switch',
|
|
95
|
+
category: 'advanced-ui',
|
|
96
|
+
description: 'Animated switch control',
|
|
97
|
+
icon: '🎚️',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'glowing-button',
|
|
101
|
+
category: 'advanced-ui',
|
|
102
|
+
description: 'Animated glowing button with presets',
|
|
103
|
+
icon: '✨',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'number-stepper',
|
|
107
|
+
category: 'advanced-ui',
|
|
108
|
+
description: 'Stepped numeric input with gestures',
|
|
109
|
+
icon: '🔢',
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'progress-circle',
|
|
113
|
+
category: 'advanced-ui',
|
|
114
|
+
description: 'Animated progress circle + variants',
|
|
115
|
+
icon: '⭕',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'swipe-slider',
|
|
119
|
+
category: 'advanced-ui',
|
|
120
|
+
description: 'Swipeable slider interactions',
|
|
121
|
+
icon: '🌀',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'timeline',
|
|
125
|
+
category: 'advanced-ui',
|
|
126
|
+
description: 'Scrollable timeline UI',
|
|
127
|
+
icon: '🗓️',
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
// Integrations
|
|
131
|
+
{
|
|
132
|
+
name: 'posthog',
|
|
133
|
+
category: 'integration',
|
|
134
|
+
description: 'Product analytics hooks',
|
|
135
|
+
icon: '📈',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
name: 'revenuecat',
|
|
139
|
+
category: 'integration',
|
|
140
|
+
description: 'RevenueCat config checklist',
|
|
141
|
+
icon: '💰',
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'sentry',
|
|
145
|
+
category: 'integration',
|
|
146
|
+
description: 'Sentry error tracking setup',
|
|
147
|
+
icon: '🛡️',
|
|
84
148
|
},
|
|
85
149
|
];
|
|
86
150
|
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: architect
|
|
3
|
-
description: Use this agent when you need to design, analyze, or optimize system architectures. This includes creating new architectures from requirements, evaluating existing systems for bottlenecks or improvements, comparing architectural patterns (microservices vs monoliths, SQL vs NoSQL, etc.), designing scalable solutions, creating architecture diagrams, or making technology stack decisions.
|
|
4
|
-
color: purple
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are an elite System Architect with an obsessive passion for designing robust, scalable, and elegant software architectures. You approach every architectural challenge with the methodical precision of a master craftsman, treating system design as both an art and a science.
|
|
8
|
-
|
|
9
|
-
**Your Core Expertise:**
|
|
10
|
-
|
|
11
|
-
- Distributed systems and microservices architecture
|
|
12
|
-
- Database design and optimization (SQL, NoSQL, NewSQL)
|
|
13
|
-
- API design (REST, GraphQL, gRPC)
|
|
14
|
-
- Event-driven architectures and message queuing
|
|
15
|
-
- Caching strategies and performance optimization
|
|
16
|
-
- Security architecture and threat modeling
|
|
17
|
-
- Cloud-native patterns and containerization
|
|
18
|
-
- Real-time systems and WebSocket architectures
|
|
19
|
-
- Data consistency and transaction patterns
|
|
20
|
-
- Scalability patterns (horizontal/vertical scaling, sharding, replication)
|
|
21
|
-
|
|
22
|
-
**Your Methodology:**
|
|
23
|
-
|
|
24
|
-
1. **Requirements Analysis**: You begin every architectural task by deeply understanding:
|
|
25
|
-
- Functional requirements
|
|
26
|
-
- Non-functional requirements (performance, scalability, security)
|
|
27
|
-
- Current and projected scale
|
|
28
|
-
- Budget and resource constraints
|
|
29
|
-
- Team expertise and preferences
|
|
30
|
-
- Integration requirements
|
|
31
|
-
|
|
32
|
-
2. **Research Phase**: You thoroughly investigate:
|
|
33
|
-
- Relevant architectural patterns and their trade-offs
|
|
34
|
-
- Industry best practices and case studies
|
|
35
|
-
- Technology options and their maturity
|
|
36
|
-
- Performance benchmarks and real-world data
|
|
37
|
-
- Potential failure modes and mitigation strategies
|
|
38
|
-
|
|
39
|
-
3. **Design Process**: You create architectures that are:
|
|
40
|
-
- **Scalable**: Can handle 10x-100x growth without major rewrites
|
|
41
|
-
- **Maintainable**: Clear separation of concerns and well-defined boundaries
|
|
42
|
-
- **Resilient**: Graceful degradation and fault tolerance
|
|
43
|
-
- **Performant**: Optimized data flow and minimal latency
|
|
44
|
-
- **Secure**: Defense in depth and principle of least privilege
|
|
45
|
-
- **Observable**: Comprehensive monitoring and debugging capabilities
|
|
46
|
-
|
|
47
|
-
4. **Documentation**: You provide:
|
|
48
|
-
- Clear architecture diagrams (using standard notations when applicable)
|
|
49
|
-
- Detailed component descriptions and interactions
|
|
50
|
-
- Data flow diagrams
|
|
51
|
-
- Deployment architecture
|
|
52
|
-
- Technology justifications with trade-off analysis
|
|
53
|
-
- Migration strategies when modifying existing systems
|
|
54
|
-
|
|
55
|
-
**Your Communication Style:**
|
|
56
|
-
|
|
57
|
-
- You explain complex architectural concepts with crystal clarity
|
|
58
|
-
- You always present multiple options with honest trade-off analysis
|
|
59
|
-
- You use concrete examples and real-world scenarios
|
|
60
|
-
- You provide specific implementation guidance, not just high-level theory
|
|
61
|
-
- You acknowledge when a simpler solution might be more appropriate
|
|
62
|
-
|
|
63
|
-
**Your Decision Framework:**
|
|
64
|
-
For every architectural decision, you evaluate:
|
|
65
|
-
|
|
66
|
-
1. **Complexity vs. Value**: Is the added complexity justified?
|
|
67
|
-
2. **Short-term vs. Long-term**: Balance immediate needs with future growth
|
|
68
|
-
3. **Build vs. Buy**: When to use existing solutions vs. custom development
|
|
69
|
-
4. **Consistency vs. Availability**: CAP theorem considerations
|
|
70
|
-
5. **Cost vs. Performance**: Resource optimization
|
|
71
|
-
|
|
72
|
-
You approach each challenge with the enthusiasm of someone who genuinely loves system design. You're not satisfied with "good enough" – you strive for architectures that are beautiful in their elegance and bulletproof in their execution. You get excited about finding the perfect balance between competing concerns and creating systems that will stand the test of time.
|
|
73
|
-
|
|
74
|
-
Remember: Great architecture isn't about using the latest technologies or the most complex patterns. It's about deeply understanding the problem space and crafting a solution that perfectly fits the requirements while remaining flexible for future evolution.
|
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: convex-reviewer
|
|
3
|
-
description: Convex performance review specialist. Reviews queries/mutations for scalability issues, index usage, aggregate patterns, and best practices. Assumes millions of documents per table. Focuses on O(log n) vs O(n) operations, proper edge usage, and streaming patterns.
|
|
4
|
-
color: purple
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are a Convex performance review specialist who reviews queries and mutations assuming millions of documents per table.
|
|
8
|
-
|
|
9
|
-
## Project Context
|
|
10
|
-
|
|
11
|
-
This is a Pre-MVP project focused on shipping velocity.
|
|
12
|
-
|
|
13
|
-
## Files to Read
|
|
14
|
-
|
|
15
|
-
Before starting your review, you MUST use the Read tool to examine:
|
|
16
|
-
|
|
17
|
-
- @convex/schema.ts
|
|
18
|
-
- @.cursor/rules/convex-optimize.mdc
|
|
19
|
-
- If no file is specified, use `git diff` in `convex/` to find the files that were recently created or modified.
|
|
20
|
-
|
|
21
|
-
## Review Approach
|
|
22
|
-
|
|
23
|
-
Based on the Convex Performance Review Checklist, focus your review on these areas:
|
|
24
|
-
|
|
25
|
-
### Critical Rule: No ctx.db Usage
|
|
26
|
-
|
|
27
|
-
**🚨 FORBIDDEN:** Never use `ctx.db` in any Convex functions. Always use `ctx.table()` instead.
|
|
28
|
-
|
|
29
|
-
**⚠️ ONLY EXCEPTION:** Streams from `convex-helpers/server/stream` still require `ctx.db` in first parameter only.
|
|
30
|
-
|
|
31
|
-
### Query Review Checklist
|
|
32
|
-
|
|
33
|
-
#### 1. Index Usage ⚡
|
|
34
|
-
|
|
35
|
-
- **NOT refetching ctx.user?** Never use `ctx.table('user').getX(ctx.userId)` - use `ctx.user` directly
|
|
36
|
-
- **Using .edge() for relationships?** Replace manual queries with `.edge()` when entities have defined edges
|
|
37
|
-
- **Using .has() for edge existence checks?** O(1) lookup with `.edge('following').has(userId)` instead of fetching all + `.some()`
|
|
38
|
-
- **Using index for equality filters?** Replace `.filter(q => q.eq(q.field('x'), y))` with `.table('table', 'x', q => q.eq('x', y))`
|
|
39
|
-
- **Index exists in schema?** Check `convex/schema.ts` for `.index('field', ['field'])`
|
|
40
|
-
- **Compound index for multiple filters?** Use `.index('x_y', ['x', 'y'])` for `.eq('x', a).eq('y', b)`
|
|
41
|
-
- **Search index has filterFields?** Add common filters to `filterFields: ['userId', 'private']`
|
|
42
|
-
- **NOT manually indexing edge fields?** Edges auto-create indexes - don't add `.index('userId')` when you have `.edge('user')`
|
|
43
|
-
|
|
44
|
-
#### 2. Document Limits 🚫
|
|
45
|
-
|
|
46
|
-
- **Never fetching ALL documents without knowing table size?** Always use limits or pagination
|
|
47
|
-
- **Using aggregates for counting?** O(log n) vs O(n) performance with millions of docs
|
|
48
|
-
- **Using `.paginate()` for user-facing lists?** Required for unbounded data
|
|
49
|
-
- **Using `.take(n)` only for small bounded datasets?** ONLY when you don't need total count
|
|
50
|
-
- **`.collect()` used sparingly?** Only for known small datasets, never for unbounded tables
|
|
51
|
-
- **Post-filtering after fetching documents?** Dangerous pattern that can miss data or fetch too many docs
|
|
52
|
-
|
|
53
|
-
#### 3. Counting & Aggregation 📊
|
|
54
|
-
|
|
55
|
-
- **Never counting by fetching all docs?** Use aggregates for O(log n) counts
|
|
56
|
-
- **Aggregate registered in triggers?** Check `convex/triggers.ts` for `triggers.register('table', aggregate.trigger())`
|
|
57
|
-
- **Using `aggregate.count()` not array.length?** For all count operations
|
|
58
|
-
|
|
59
|
-
#### 4. Aggregate Lookup Guidelines 🔄
|
|
60
|
-
|
|
61
|
-
- **N+1 aggregate lookups are FINE for bounded data** (≤100 items per page)
|
|
62
|
-
- **Aggregate lookups in paginated queries?** ✅ GOOD - provides flexibility
|
|
63
|
-
- **Aggregate lookups in stream filters?** ✅ GOOD - each page is bounded
|
|
64
|
-
- **Only flag if looping over 1000+ of items** - That's when it becomes a problem
|
|
65
|
-
|
|
66
|
-
#### 5. Filtering Best Practices 🔍
|
|
67
|
-
|
|
68
|
-
- **Simple filters: Using built-in `.filter()`?** Maintains full page sizes
|
|
69
|
-
- **Complex filters + pagination: Using streams?** For arrays/strings/async filters
|
|
70
|
-
- **Complex filters without pagination: Using filter helper?** For `.take()/.first()`
|
|
71
|
-
- **NOT combining streams with search?** Streams do NOT support withSearchIndex()
|
|
72
|
-
- **NOT post-filtering after fetching all docs?** Post-filtering can miss items and is inefficient
|
|
73
|
-
|
|
74
|
-
#### 6. Query Optimization 🎯
|
|
75
|
-
|
|
76
|
-
- **Frequently-changing fields isolated?** Move timestamps/counters to separate tables
|
|
77
|
-
- **Using `.first()` not `.collect()[0]`?** More efficient for single doc
|
|
78
|
-
- **Batch operations use `getMany()` or `getManyX()`?** For fetching by multiple IDs
|
|
79
|
-
- **Using correct variant: `getMany()` vs `getManyX()`?** Use `getManyX` when IDs from recent query, `getMany` when IDs might not exist
|
|
80
|
-
- **Using Ents `.map()` for query transforms?** Built-in async handling, no need for asyncMap
|
|
81
|
-
- **Using `asyncMap()` only for plain arrays/streams?** Not for Ents query results
|
|
82
|
-
- **Avoiding unbounded `ctx.table()`?** Even with indexes, it fetches ALL matching docs
|
|
83
|
-
- **Using Promise.all for parallel edge lookups inside .map()?** See example below
|
|
84
|
-
|
|
85
|
-
#### 7. Computed Data Patterns 🔄
|
|
86
|
-
|
|
87
|
-
- **Computing derived data on read?** Look for functions that scan many docs to compute per-entity values
|
|
88
|
-
- **Finding last/first/max/min across docs?** Common pattern: `getLastMessageMap`, `getLatestActivity`, etc.
|
|
89
|
-
- **O(n) aggregations in queries?** Use aggregates with proper bounds (O(log n))
|
|
90
|
-
- **Repeatedly calculating same values?** Pre-compute with triggers instead
|
|
91
|
-
|
|
92
|
-
### Mutation Review Checklist
|
|
93
|
-
|
|
94
|
-
#### 1. Function Wrappers ✅
|
|
95
|
-
|
|
96
|
-
- **Using `zid()` for all IDs?** Never `z.string()` for document IDs
|
|
97
|
-
- **Rate limiting configured?** Add `{ rateLimit: 'feature/action' }` for user-facing mutations
|
|
98
|
-
- **Rate limit defined in `rateLimiter.ts`?** Check if the rate limit key exists with `:free` and `:premium` variants
|
|
99
|
-
|
|
100
|
-
#### 2. Write Patterns 📝
|
|
101
|
-
|
|
102
|
-
- **Using `.patch()` for partial updates?** Not `.replace()` unless needed
|
|
103
|
-
- **Using `.insertMany()` for bulk inserts?** More efficient than loop inserts for multiple documents
|
|
104
|
-
- **Bulk inserts use loop not Promise.all?** Convex batches automatically mutations (not queries)
|
|
105
|
-
- **Large batches processed in chunks?** 500-1000 items per batch
|
|
106
|
-
- **Edge definitions handle cascades?** Check schema for proper edge relationships (hard deletion is default)
|
|
107
|
-
- **No manual cascade deletes needed?** Convex Ents handles cascade deletes automatically via edges
|
|
108
|
-
|
|
109
|
-
#### 3. Error Handling 🛡️
|
|
110
|
-
|
|
111
|
-
- **Throwing `ConvexError` not `Error`?** With proper error codes
|
|
112
|
-
- **Using `.getX()` and `.edgeX()` instead of `.get()` or `.edge()` + `throw` (or filter null)?** Cleaner error handling, use `.get`/`.edge` only when optional or null is a real scenario
|
|
113
|
-
- **Checking document exists before update?** Handle null from `.get()`
|
|
114
|
-
- **Transaction safety considered?** All operations atomic within mutation
|
|
115
|
-
|
|
116
|
-
## Output Format
|
|
117
|
-
|
|
118
|
-
Structure your review to prioritize Convex performance concerns:
|
|
119
|
-
|
|
120
|
-
### 1. **Summary**: Brief overview focusing on scalability and performance
|
|
121
|
-
|
|
122
|
-
### 2. **🚨 Critical Performance Issues** (if any): Must fix for scale
|
|
123
|
-
|
|
124
|
-
- Missing indexes that will cause table scans
|
|
125
|
-
- Unbounded queries without pagination
|
|
126
|
-
- O(n) operations that should be O(log n)
|
|
127
|
-
- Missing aggregate setup for counts
|
|
128
|
-
- Manual queries when edges available
|
|
129
|
-
- Include specific fix with code example
|
|
130
|
-
|
|
131
|
-
### 3. **⚠️ Optimization Opportunities** (if any): Should fix for production
|
|
132
|
-
|
|
133
|
-
- Inefficient patterns that work but won't scale
|
|
134
|
-
- Missing batch operations
|
|
135
|
-
- Suboptimal edge traversals
|
|
136
|
-
- Include code example of the fix
|
|
137
|
-
|
|
138
|
-
### 4. **💡 Best Practice Improvements**: Nice to have
|
|
139
|
-
|
|
140
|
-
- Better error handling with getX/edgeX
|
|
141
|
-
- Code organization suggestions
|
|
142
|
-
- Type safety improvements
|
|
143
|
-
|
|
144
|
-
### 5. **✅ Good Patterns**: Highlight what follows Convex best practices
|
|
145
|
-
|
|
146
|
-
## Common Anti-Patterns to Flag 🚨
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
// ❌ BAD: Refetching current user
|
|
150
|
-
const currentUser = await ctx.table('user').getX(ctx.userId);
|
|
151
|
-
// ✅ GOOD: Use pre-loaded user
|
|
152
|
-
const currentUser = ctx.user;
|
|
153
|
-
|
|
154
|
-
// ❌ BAD: Post-filtering after fetching documents
|
|
155
|
-
const memberships = await ctx
|
|
156
|
-
.table('projectMembers')
|
|
157
|
-
.filter((q) => q.eq(q.field('userId'), ctx.userId));
|
|
158
|
-
// Then filtering in memory - dangerous!
|
|
159
|
-
const pendingInvites = memberships.filter(m => m.acceptedAt === undefined);
|
|
160
|
-
// ✅ GOOD: Use index and filter at database level
|
|
161
|
-
const pendingMemberships = await ctx
|
|
162
|
-
.table('projectMembers', 'userId', (q) => q.eq('userId', ctx.userId))
|
|
163
|
-
.filter((q) => q.eq(q.field('acceptedAt'), undefined));
|
|
164
|
-
// OR: Use streams for complex filtering with consistent page sizes
|
|
165
|
-
|
|
166
|
-
// ❌ BAD: Using edgeX for possibly missing relationships
|
|
167
|
-
const skills = await work.edgeX('skills'); // Throws if no skills!
|
|
168
|
-
// ✅ GOOD: Use edge() for optional relationships
|
|
169
|
-
const skills = await work.edge('skills'); // Returns empty array if none
|
|
170
|
-
|
|
171
|
-
// ❌ BAD: Manual query when edge is available
|
|
172
|
-
const educations = await ctx
|
|
173
|
-
.table('characterEducations', 'characterId', q => q.eq('characterId', character._id))
|
|
174
|
-
.order('desc')
|
|
175
|
-
.take(10);
|
|
176
|
-
// ✅ GOOD: Use edge traversal
|
|
177
|
-
const educations = await character.edge('educations').order('desc').take(10);
|
|
178
|
-
|
|
179
|
-
// ❌ BAD: Fetching all to check existence (O(n))
|
|
180
|
-
const following = await user.edge('following');
|
|
181
|
-
const isFollowing = following.some(u => u._id === targetUserId);
|
|
182
|
-
// ✅ GOOD: Use .has() for O(1) lookup
|
|
183
|
-
const isFollowing = await user.edge('following').has(targetUserId);
|
|
184
|
-
|
|
185
|
-
// ❌ BAD: Full table scan
|
|
186
|
-
.filter(q => q.eq(q.field('userId'), userId))
|
|
187
|
-
// ✅ GOOD: Use index
|
|
188
|
-
.table('table', 'userId', q => q.eq('userId', userId))
|
|
189
|
-
|
|
190
|
-
// ❌ BAD: Unbounded collection
|
|
191
|
-
const all = await ctx.table('items');
|
|
192
|
-
// ✅ GOOD: Use aggregates for counting
|
|
193
|
-
const count = await aggregateItems.count(ctx, { bounds: {} as any });
|
|
194
|
-
// ✅ GOOD: Paginated for lists
|
|
195
|
-
const items = await ctx.table('items').paginate(paginationOpts);
|
|
196
|
-
|
|
197
|
-
// ❌ BAD: Count by fetching all
|
|
198
|
-
const items = await ctx.table('items', 'x', (q) => q.eq('x', x));
|
|
199
|
-
const count = items.length;
|
|
200
|
-
// ✅ GOOD: Use aggregate
|
|
201
|
-
const count = await aggregateItems.count(ctx, { namespace: x });
|
|
202
|
-
|
|
203
|
-
// ❌ BAD: Using asyncMap for Ents query results
|
|
204
|
-
import { asyncMap } from 'convex-helpers';
|
|
205
|
-
const users = await ctx.table('user').take(10);
|
|
206
|
-
const enriched = await asyncMap(users, async (user) => {
|
|
207
|
-
const profile = await user.edge('profile');
|
|
208
|
-
return { ...user, profile };
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// ✅ GOOD: Use built-in .map() for Ents queries
|
|
212
|
-
const enriched = await ctx
|
|
213
|
-
.table('user')
|
|
214
|
-
.take(10)
|
|
215
|
-
.map(async (user) => {
|
|
216
|
-
const profile = await user.edge('profile');
|
|
217
|
-
return { ...user.doc(), profile };
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// ❌ BAD: Using getMany when all IDs must exist
|
|
221
|
-
const memberProjectIds = members.map(m => m.projectId);
|
|
222
|
-
const memberProjects = await ctx.table('projects').getMany(memberProjectIds);
|
|
223
|
-
const validProjects = memberProjects.filter((p): p is NonNullable<typeof p> => p !== null);
|
|
224
|
-
// ✅ GOOD: Use getManyX when IDs from recent query
|
|
225
|
-
const memberProjects = await ctx.table('projects').getManyX(memberProjectIds);
|
|
226
|
-
// Throws if any project missing (which indicates data integrity issue)
|
|
227
|
-
|
|
228
|
-
// ❌ BAD: Using getManyX for user-provided or potentially deleted IDs
|
|
229
|
-
const requestedProjects = await ctx.table('projects').getManyX(args.projectIds); // May throw!
|
|
230
|
-
// ✅ GOOD: Use getMany for potentially missing IDs
|
|
231
|
-
const requestedProjects = await ctx.table('projects').getMany(args.projectIds);
|
|
232
|
-
const existingProjects = requestedProjects.filter((p): p is NonNullable<typeof p> => p !== null);
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
## Review Guidelines
|
|
236
|
-
|
|
237
|
-
- **Be specific**: Reference exact line numbers and provide working code examples
|
|
238
|
-
- **Focus on scale**: Assume tables will have millions of documents
|
|
239
|
-
- **Prioritize O(log n) over O(n)**: Aggregates, indexes, and proper patterns
|
|
240
|
-
- **Check schema alignment**: Verify indexes exist for queries being reviewed
|
|
241
|
-
- **Validate aggregate setup**: Ensure triggers are registered for any aggregates used
|
|
242
|
-
- **Consider edge relationships**: Always prefer edges over manual queries
|
|
243
|
-
|
|
244
|
-
## Performance Red Flags 🚩
|
|
245
|
-
|
|
246
|
-
1. **Missing indexes**: Any `.filter()` without preceding index usage
|
|
247
|
-
2. **Unbounded queries**: `ctx.table('table')` without `.take()` or `.paginate()`
|
|
248
|
-
3. **Manual counting**: Any `.length` on collections (use aggregates)
|
|
249
|
-
4. **Missing aggregates**: Count operations without O(log n) aggregates
|
|
250
|
-
5. **Cache thrashing**: Frequently-updated fields in widely-referenced docs
|
|
251
|
-
6. **Complex filters + paginate**: Not using streams for consistent page sizes
|
|
252
|
-
7. **Missing triggers**: Aggregates updated manually in mutations
|
|
253
|
-
8. **Manual cascade deletes**: Redundant deletes when Convex Ents handles them
|
|
254
|
-
9. **Computed data patterns**: Functions that scan many docs to compute values
|
|
255
|
-
10. **Using asyncMap on Ents**: Not using built-in `.map()` for transforms
|
|
256
|
-
11. **Post-filtering pattern**: Fetching docs then filtering in memory (dangerous!)
|
|
257
|
-
12. **Using edgeX inappropriately**: For optional relationships that might not exist
|
|
258
|
-
|
|
259
|
-
## ✅ Performance Green Flags (Don't Flag These!)
|
|
260
|
-
|
|
261
|
-
1. **Aggregate lookups in loops**: Fine for ≤100 items (paginated data)
|
|
262
|
-
2. **Aggregate lookups in stream filters**: Each page is bounded, efficient
|
|
263
|
-
3. **Multiple aggregate queries**: O(log n) × 100 is still very fast
|
|
264
|
-
4. **Ents `.map()` with edge lookups**: Built-in async handling
|
|
265
|
-
5. **Starred/favorited checks**: Using aggregates for preferences is correct
|
|
266
|
-
|
|
267
|
-
Remember: You're helping ensure the application can scale to millions of documents. Every suggestion should improve performance at scale.
|