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.
Files changed (857) hide show
  1. package/dist/__tests__/recipes.test.js +5 -5
  2. package/dist/__tests__/recipes.test.js.map +1 -1
  3. package/dist/commands/add.d.ts.map +1 -1
  4. package/dist/commands/add.js +136 -48
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/init.d.ts.map +1 -1
  7. package/dist/commands/init.js +106 -89
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/remove.js +1 -1
  10. package/dist/commands/remove.js.map +1 -1
  11. package/dist/core/__tests__/fsx.test.js +3 -1
  12. package/dist/core/__tests__/fsx.test.js.map +1 -1
  13. package/dist/core/__tests__/prompt.test.js +12 -12
  14. package/dist/core/__tests__/prompt.test.js.map +1 -1
  15. package/dist/core/__tests__/validate.test.js +4 -3
  16. package/dist/core/__tests__/validate.test.js.map +1 -1
  17. package/dist/core/auth.d.ts.map +1 -1
  18. package/dist/core/auth.js +8 -0
  19. package/dist/core/auth.js.map +1 -1
  20. package/dist/core/codemod.d.ts +13 -0
  21. package/dist/core/codemod.d.ts.map +1 -1
  22. package/dist/core/codemod.js +50 -0
  23. package/dist/core/codemod.js.map +1 -1
  24. package/dist/core/errors.js +1 -1
  25. package/dist/core/fsx.js +1 -1
  26. package/dist/core/fsx.js.map +1 -1
  27. package/dist/core/recipes.d.ts.map +1 -1
  28. package/dist/core/recipes.js +71 -9
  29. package/dist/core/recipes.js.map +1 -1
  30. package/package.json +1 -1
  31. package/recipes/animated-chip/recipe.json +15 -0
  32. package/recipes/animated-chip@latest.zip +0 -0
  33. package/recipes/animated-switch/recipe.json +15 -0
  34. package/recipes/animated-switch@latest.zip +0 -0
  35. package/recipes/audio-recorder@latest.zip +0 -0
  36. package/recipes/charts/apps/native/src/features/charts/components/doughnut-chart.tsx +29 -18
  37. package/recipes/charts@latest.zip +0 -0
  38. package/recipes/chatbot/apps/native/src/features/chatbot/components/message-list.tsx +1 -1
  39. package/recipes/chatbot/apps/native/src/features/chatbot/hooks/use-smart-scroll-manager.ts +6 -0
  40. package/recipes/chatbot/recipe.json +21 -5
  41. package/recipes/chatbot@latest.zip +0 -0
  42. package/recipes/glowing-button/recipe.json +1 -3
  43. package/recipes/glowing-button@latest.zip +0 -0
  44. package/recipes/image-analysis/recipe.json +36 -19
  45. package/recipes/image-analysis@latest.zip +0 -0
  46. package/recipes/image-generator/apps/native/src/features/image-generator/app/_layout.tsx +1 -0
  47. package/recipes/image-generator/apps/native/src/features/image-generator/app/gallery.tsx +1 -1
  48. package/recipes/image-generator/apps/native/src/features/image-generator/components/gallery-image.tsx +2 -3
  49. package/recipes/image-generator/recipe.json +5 -3
  50. package/recipes/image-generator@latest.zip +0 -0
  51. package/recipes/ios-widget/recipe.json +24 -0
  52. package/recipes/ios-widget@latest.zip +0 -0
  53. package/recipes/number-stepper/recipe.json +15 -0
  54. package/recipes/number-stepper@latest.zip +0 -0
  55. package/recipes/payments/recipe.json +30 -0
  56. package/recipes/payments@latest.zip +0 -0
  57. package/recipes/posthog.json +2 -1
  58. package/recipes/progress-circle/recipe.json +15 -0
  59. package/recipes/progress-circle@latest.zip +0 -0
  60. package/recipes/quiz@latest.zip +0 -0
  61. package/recipes/sentry.json +2 -1
  62. package/recipes/swipe-slider/recipe.json +15 -0
  63. package/recipes/swipe-slider@latest.zip +0 -0
  64. package/recipes/{0 → timeline}/recipe.json +3 -6
  65. package/recipes/timeline@latest.zip +0 -0
  66. package/recipes/tracker-app@latest.zip +0 -0
  67. package/recipes/upload-all.sh +13 -2
  68. package/recipes/voice-bot/recipe.json +15 -2
  69. package/recipes/voice-bot@latest.zip +0 -0
  70. package/recipes/wake-word/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +0 -2
  71. package/recipes/wake-word/recipe.json +2 -2
  72. package/recipes/wake-word@latest.zip +0 -0
  73. package/src/__tests__/recipes.test.ts +5 -5
  74. package/src/commands/add.ts +230 -54
  75. package/src/commands/init.ts +118 -102
  76. package/src/commands/remove.ts +1 -1
  77. package/src/core/__tests__/fsx.test.ts +3 -1
  78. package/src/core/__tests__/prompt.test.ts +12 -12
  79. package/src/core/__tests__/validate.test.ts +4 -3
  80. package/src/core/auth.ts +8 -0
  81. package/src/core/codemod.ts +66 -0
  82. package/src/core/errors.ts +1 -1
  83. package/src/core/fsx.ts +1 -1
  84. package/src/core/recipes.ts +73 -9
  85. package/2/.claude/agents/architect.md +0 -74
  86. package/2/.claude/agents/convex-reviewer.md +0 -267
  87. package/2/.claude/agents/debug-detective.md +0 -62
  88. package/2/.claude/agents/learner.md +0 -64
  89. package/2/.claude/agents/perf-optimizer.md +0 -71
  90. package/2/.claude/agents/security-researcher.md +0 -42
  91. package/2/.claude/agents/tech-researcher.md +0 -46
  92. package/2/.claude/agents/ux-designer.md +0 -45
  93. package/2/.claude/commands/create-app-design.md +0 -279
  94. package/2/.claude/commands/create-prd-interactive.md +0 -113
  95. package/2/.claude/commands/create-prd.md +0 -111
  96. package/2/.claude/commands/create-tech-stack.md +0 -345
  97. package/2/.claude/commands/update-app-design.md +0 -298
  98. package/2/.claude/commands/update-project-structure.md +0 -14
  99. package/2/.claude/commands/update-tech-stack.md +0 -325
  100. package/2/.claude/docs/CONVEX_FEATURES_PLAN.md +0 -249
  101. package/2/.claude/docs/app-design-document.md +0 -0
  102. package/2/.claude/docs/project-status.md +0 -25
  103. package/2/.claude/docs/project-structure.md +0 -7
  104. package/2/.claude/docs/tech-stack.md +0 -157
  105. package/2/.claude/scripts/tree.sh +0 -70
  106. package/2/.claude/settings.json +0 -30
  107. package/2/.cursor/commands/code-review-high.md +0 -190
  108. package/2/.cursorignore +0 -3
  109. package/2/.github/ISSUE_TEMPLATE.md +0 -13
  110. package/2/.github/PULL_REQUEST_TEMPLATE.md +0 -23
  111. package/2/.github/actions/eas-build/action.yml +0 -85
  112. package/2/.github/actions/setup-jdk-generate-apk/action.yml +0 -48
  113. package/2/.github/actions/setup-node-pnpm-install/action.yml +0 -29
  114. package/2/.github/scripts/expo-doctor.sh +0 -26
  115. package/2/.github/workflows/compress-images.yml +0 -48
  116. package/2/.github/workflows/e2e-android-eas-build.yml +0 -111
  117. package/2/.github/workflows/e2e-android-maestro.yml +0 -52
  118. package/2/.github/workflows/e2e-android.yml +0 -119
  119. package/2/.github/workflows/eas-build-prod.yml +0 -43
  120. package/2/.github/workflows/eas-build-qa.yml +0 -47
  121. package/2/.github/workflows/expo-doctor.yml +0 -61
  122. package/2/.github/workflows/lint-ts.yml +0 -49
  123. package/2/.github/workflows/new-app-version.yml +0 -65
  124. package/2/.github/workflows/new-github-release.yml +0 -34
  125. package/2/.github/workflows/stale.yml +0 -24
  126. package/2/.github/workflows/test.yml +0 -50
  127. package/2/.github/workflows/type-check.yml +0 -54
  128. package/2/.husky/commit-msg +0 -1
  129. package/2/.husky/common.sh +0 -8
  130. package/2/.husky/post-merge +0 -18
  131. package/2/.husky/pre-commit +0 -24
  132. package/2/.prettierignore +0 -14
  133. package/2/.prettierrc.json +0 -10
  134. package/2/.vibefast/README.md +0 -59
  135. package/2/.vibefast/config.json +0 -4
  136. package/2/.vibefast/journal.json +0 -234
  137. package/2/.vibefast/starter.json +0 -5
  138. package/2/AGENTS.md +0 -48
  139. package/2/LICENSE +0 -21
  140. package/2/README.md +0 -127
  141. package/2/apps/native/__mocks__/bottom-sheet.js +0 -6
  142. package/2/apps/native/__mocks__/expo-router.js +0 -16
  143. package/2/apps/native/__mocks__/react-native-gesture-handler.ts +0 -17
  144. package/2/apps/native/app-env.d.ts +0 -2
  145. package/2/apps/native/app.config.ts +0 -167
  146. package/2/apps/native/assets/adaptive-icon.png +0 -0
  147. package/2/apps/native/assets/favicon.png +0 -0
  148. package/2/apps/native/assets/fonts/Inter.ttf +0 -0
  149. package/2/apps/native/assets/fonts/SF-Pro-Display-Bold.otf +0 -0
  150. package/2/apps/native/assets/fonts/SF-Pro-Display-Medium.otf +0 -0
  151. package/2/apps/native/assets/fonts/SF-Pro-Display-Regular.otf +0 -0
  152. package/2/apps/native/assets/fonts/SF-Pro-Display-Semibold.otf +0 -0
  153. package/2/apps/native/assets/fonts/SpaceMono-Regular.ttf +0 -0
  154. package/2/apps/native/assets/icon.png +0 -0
  155. package/2/apps/native/assets/images/cover-image.png +0 -0
  156. package/2/apps/native/assets/lottie-animations/onboarding-1.json +0 -6504
  157. package/2/apps/native/assets/lottie-animations/onboarding-2.json +0 -1993
  158. package/2/apps/native/assets/lottie-animations/onboarding-3.json +0 -50159
  159. package/2/apps/native/assets/lottie-animations/onboarding-4.json +0 -735
  160. package/2/apps/native/assets/lottie-animations/onboarding-6.json +0 -2167
  161. package/2/apps/native/assets/splash-icon.png +0 -0
  162. package/2/apps/native/babel.config.js +0 -39
  163. package/2/apps/native/eas.json +0 -75
  164. package/2/apps/native/env.js +0 -196
  165. package/2/apps/native/global.css +0 -51
  166. package/2/apps/native/index.ts +0 -5
  167. package/2/apps/native/jest-setup.ts +0 -7
  168. package/2/apps/native/jest.config.js +0 -72
  169. package/2/apps/native/metro.config.js +0 -85
  170. package/2/apps/native/nativewind-env.d.ts +0 -1
  171. package/2/apps/native/package.json +0 -232
  172. package/2/apps/native/scripts/DRY_RUN_REPORT.md +0 -0
  173. package/2/apps/native/scripts/QUICK_START.md +0 -76
  174. package/2/apps/native/scripts/README.md +0 -187
  175. package/2/apps/native/scripts/convex-setup.js +0 -48
  176. package/2/apps/native/scripts/genrate-apk-and-install +0 -39
  177. package/2/apps/native/scripts/i18next-syntax-validation.js +0 -23
  178. package/2/apps/native/scripts/starter-setup.mjs +0 -246
  179. package/2/apps/native/src/api-client/auth.ts +0 -68
  180. package/2/apps/native/src/api-client/chatbot.ts +0 -83
  181. package/2/apps/native/src/api-client/client.ts +0 -4
  182. package/2/apps/native/src/api-client/image-generator.ts +0 -34
  183. package/2/apps/native/src/api-client/index.ts +0 -27
  184. package/2/apps/native/src/api-client/payments.ts +0 -44
  185. package/2/apps/native/src/api-client/reporting.ts +0 -29
  186. package/2/apps/native/src/api-client/shared.ts +0 -43
  187. package/2/apps/native/src/app/(root)/(protected)/(tabs)/_layout.tsx +0 -166
  188. package/2/apps/native/src/app/(root)/(protected)/(tabs)/index.tsx +0 -174
  189. package/2/apps/native/src/app/(root)/(protected)/(tabs)/profile.tsx +0 -320
  190. package/2/apps/native/src/app/(root)/(protected)/(tabs)/settings.tsx +0 -344
  191. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/_layout.tsx +0 -198
  192. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/accordion.tsx +0 -60
  193. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/advanced.tsx +0 -24
  194. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/avatar.tsx +0 -154
  195. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/badge-chips-toggle.tsx +0 -81
  196. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/buttons.tsx +0 -24
  197. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/charts.tsx +0 -3
  198. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/date-picker.tsx +0 -120
  199. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/file-picker.tsx +0 -133
  200. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/gallery-video.tsx +0 -119
  201. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/index.tsx +0 -69
  202. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/inputs-stepper.tsx +0 -78
  203. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/picker-dropdown.tsx +0 -56
  204. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/popover-bottomsheet.tsx +0 -229
  205. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/progress.tsx +0 -38
  206. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/searchbar.tsx +0 -70
  207. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/sliders.tsx +0 -93
  208. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/spinner.tsx +0 -80
  209. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/switch.tsx +0 -47
  210. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/table.tsx +0 -352
  211. package/2/apps/native/src/app/(root)/(protected)/(tabs)/style/tabs-timeline.tsx +0 -122
  212. package/2/apps/native/src/app/(root)/(protected)/_layout.tsx +0 -143
  213. package/2/apps/native/src/app/(root)/(protected)/audio-recorder/index.tsx +0 -5
  214. package/2/apps/native/src/app/(root)/(protected)/charts/index.tsx +0 -6
  215. package/2/apps/native/src/app/(root)/(protected)/chatbot/index.tsx +0 -2
  216. package/2/apps/native/src/app/(root)/(protected)/image-generator/gallery.tsx +0 -3
  217. package/2/apps/native/src/app/(root)/(protected)/image-generator/index.tsx +0 -3
  218. package/2/apps/native/src/app/(root)/(protected)/paywall/index.tsx +0 -74
  219. package/2/apps/native/src/app/(root)/(protected)/paywall/local.tsx +0 -25
  220. package/2/apps/native/src/app/(root)/(protected)/paywall/remote.tsx +0 -23
  221. package/2/apps/native/src/app/(root)/(protected)/quick-actions-demo/index.tsx +0 -32
  222. package/2/apps/native/src/app/(root)/(protected)/quiz/index.tsx +0 -47
  223. package/2/apps/native/src/app/(root)/(protected)/test-wake-word.tsx +0 -214
  224. package/2/apps/native/src/app/(root)/(protected)/tracker-app/index.tsx +0 -1
  225. package/2/apps/native/src/app/(root)/(protected)/voice-bot/index.tsx +0 -27
  226. package/2/apps/native/src/app/(root)/(public)/(auth)/_layout.tsx +0 -44
  227. package/2/apps/native/src/app/(root)/(public)/(auth)/forgot-password.tsx +0 -185
  228. package/2/apps/native/src/app/(root)/(public)/(auth)/login.tsx +0 -219
  229. package/2/apps/native/src/app/(root)/(public)/(auth)/otp-verification.tsx +0 -369
  230. package/2/apps/native/src/app/(root)/(public)/(auth)/reset-password.tsx +0 -247
  231. package/2/apps/native/src/app/(root)/(public)/(auth)/signup.tsx +0 -207
  232. package/2/apps/native/src/app/(root)/(public)/_layout.tsx +0 -60
  233. package/2/apps/native/src/app/(root)/(public)/onboarding/demo-one.tsx +0 -5
  234. package/2/apps/native/src/app/(root)/(public)/onboarding/demo-two.tsx +0 -52
  235. package/2/apps/native/src/app/(root)/(public)/onboarding/index.tsx +0 -82
  236. package/2/apps/native/src/app/(root)/_layout.tsx +0 -30
  237. package/2/apps/native/src/app/+html.tsx +0 -46
  238. package/2/apps/native/src/app/[...messing].tsx +0 -24
  239. package/2/apps/native/src/app/_layout.tsx +0 -56
  240. package/2/apps/native/src/app/tsconfig.json +0 -3
  241. package/2/apps/native/src/components/advanced-ui/buttons/glowing-button.tsx +0 -366
  242. package/2/apps/native/src/components/analytics/navigation-tracker.tsx +0 -10
  243. package/2/apps/native/src/components/demo/advanced-ui-components.tsx +0 -46
  244. package/2/apps/native/src/components/demo/buttons-demo.tsx +0 -56
  245. package/2/apps/native/src/components/demo/colors-demo.tsx +0 -52
  246. package/2/apps/native/src/components/demo/dropdown-picker-demo.tsx +0 -274
  247. package/2/apps/native/src/components/demo/inputs-demo.tsx +0 -99
  248. package/2/apps/native/src/components/demo/notification-demo.tsx +0 -434
  249. package/2/apps/native/src/components/demo/title-demo.tsx +0 -16
  250. package/2/apps/native/src/components/demo/toast-demo.tsx +0 -81
  251. package/2/apps/native/src/components/demo/typography-demo.tsx +0 -28
  252. package/2/apps/native/src/components/performance/render-performance-monitor.tsx +0 -36
  253. package/2/apps/native/src/components/ui/accordion.tsx +0 -138
  254. package/2/apps/native/src/components/ui/avatar.tsx +0 -66
  255. package/2/apps/native/src/components/ui/badge.tsx +0 -68
  256. package/2/apps/native/src/components/ui/bottom-sheet.tsx +0 -61
  257. package/2/apps/native/src/components/ui/colors.js +0 -290
  258. package/2/apps/native/src/components/ui/core/button.tsx +0 -317
  259. package/2/apps/native/src/components/ui/core/card.tsx +0 -40
  260. package/2/apps/native/src/components/ui/core/checkbox.tsx +0 -264
  261. package/2/apps/native/src/components/ui/core/feature-button.tsx +0 -162
  262. package/2/apps/native/src/components/ui/core/focus-aware-status-bar.tsx +0 -21
  263. package/2/apps/native/src/components/ui/core/image.tsx +0 -30
  264. package/2/apps/native/src/components/ui/core/inputs/floating-text-input.tsx +0 -369
  265. package/2/apps/native/src/components/ui/core/inputs/input-otp.tsx +0 -304
  266. package/2/apps/native/src/components/ui/core/inputs/input.tsx +0 -373
  267. package/2/apps/native/src/components/ui/core/list.tsx +0 -60
  268. package/2/apps/native/src/components/ui/core/navigation/animated-header.tsx +0 -87
  269. package/2/apps/native/src/components/ui/core/navigation/screen-footer.tsx +0 -67
  270. package/2/apps/native/src/components/ui/core/overlays/dropdown.tsx +0 -290
  271. package/2/apps/native/src/components/ui/core/overlays/full-screen-loading.tsx +0 -15
  272. package/2/apps/native/src/components/ui/core/overlays/modal-keyboard-aware-scroll-view.tsx +0 -46
  273. package/2/apps/native/src/components/ui/core/overlays/modal.tsx +0 -247
  274. package/2/apps/native/src/components/ui/core/pagination-dots.tsx +0 -231
  275. package/2/apps/native/src/components/ui/core/pressable.tsx +0 -48
  276. package/2/apps/native/src/components/ui/core/progress-bar.tsx +0 -47
  277. package/2/apps/native/src/components/ui/core/progress.tsx +0 -149
  278. package/2/apps/native/src/components/ui/core/select.tsx +0 -261
  279. package/2/apps/native/src/components/ui/core/spinner.tsx +0 -387
  280. package/2/apps/native/src/components/ui/core/text.tsx +0 -45
  281. package/2/apps/native/src/components/ui/core/toast.tsx +0 -190
  282. package/2/apps/native/src/components/ui/custom-switch.tsx +0 -90
  283. package/2/apps/native/src/components/ui/date-time-picker.tsx +0 -268
  284. package/2/apps/native/src/components/ui/debug.ts +0 -2
  285. package/2/apps/native/src/components/ui/extras/debug-credit-tester.tsx +0 -107
  286. package/2/apps/native/src/components/ui/extras/debug-mmkv-state.tsx +0 -53
  287. package/2/apps/native/src/components/ui/extras/handle-error.ts +0 -191
  288. package/2/apps/native/src/components/ui/extras/hello-wave.tsx +0 -70
  289. package/2/apps/native/src/components/ui/extras/icon.tsx +0 -36
  290. package/2/apps/native/src/components/ui/extras/network-connectivity-wrapper.tsx +0 -36
  291. package/2/apps/native/src/components/ui/extras/offline-indicator.tsx +0 -55
  292. package/2/apps/native/src/components/ui/extras/social-login-buttons.tsx +0 -296
  293. package/2/apps/native/src/components/ui/file-picker.tsx +0 -177
  294. package/2/apps/native/src/components/ui/gallery.tsx +0 -79
  295. package/2/apps/native/src/components/ui/icons/apple.tsx +0 -19
  296. package/2/apps/native/src/components/ui/icons/arrow-right.tsx +0 -26
  297. package/2/apps/native/src/components/ui/icons/camera.tsx +0 -26
  298. package/2/apps/native/src/components/ui/icons/caret-down.tsx +0 -20
  299. package/2/apps/native/src/components/ui/icons/chevron-up.tsx +0 -21
  300. package/2/apps/native/src/components/ui/icons/claude.tsx +0 -15
  301. package/2/apps/native/src/components/ui/icons/copy.tsx +0 -27
  302. package/2/apps/native/src/components/ui/icons/deepseek.tsx +0 -15
  303. package/2/apps/native/src/components/ui/icons/download.tsx +0 -32
  304. package/2/apps/native/src/components/ui/icons/feed.tsx +0 -12
  305. package/2/apps/native/src/components/ui/icons/gemini.tsx +0 -15
  306. package/2/apps/native/src/components/ui/icons/github.tsx +0 -30
  307. package/2/apps/native/src/components/ui/icons/google.tsx +0 -24
  308. package/2/apps/native/src/components/ui/icons/groq.tsx +0 -15
  309. package/2/apps/native/src/components/ui/icons/home.tsx +0 -19
  310. package/2/apps/native/src/components/ui/icons/index.tsx +0 -26
  311. package/2/apps/native/src/components/ui/icons/language.tsx +0 -33
  312. package/2/apps/native/src/components/ui/icons/llama.tsx +0 -15
  313. package/2/apps/native/src/components/ui/icons/microphone.tsx +0 -20
  314. package/2/apps/native/src/components/ui/icons/mistral.tsx +0 -22
  315. package/2/apps/native/src/components/ui/icons/nutrition.tsx +0 -15
  316. package/2/apps/native/src/components/ui/icons/openai.tsx +0 -15
  317. package/2/apps/native/src/components/ui/icons/perplexity.tsx +0 -22
  318. package/2/apps/native/src/components/ui/icons/qwen.tsx +0 -15
  319. package/2/apps/native/src/components/ui/icons/rate.tsx +0 -24
  320. package/2/apps/native/src/components/ui/icons/report.tsx +0 -20
  321. package/2/apps/native/src/components/ui/icons/send-horizontal.tsx +0 -26
  322. package/2/apps/native/src/components/ui/icons/settings.tsx +0 -12
  323. package/2/apps/native/src/components/ui/icons/share.tsx +0 -16
  324. package/2/apps/native/src/components/ui/icons/square.tsx +0 -9
  325. package/2/apps/native/src/components/ui/icons/style.tsx +0 -22
  326. package/2/apps/native/src/components/ui/icons/support.tsx +0 -27
  327. package/2/apps/native/src/components/ui/icons/trash2.tsx +0 -42
  328. package/2/apps/native/src/components/ui/icons/user.tsx +0 -12
  329. package/2/apps/native/src/components/ui/icons/website.tsx +0 -28
  330. package/2/apps/native/src/components/ui/icons/wifi-off.tsx +0 -17
  331. package/2/apps/native/src/components/ui/index.tsx +0 -14
  332. package/2/apps/native/src/components/ui/nav-item.tsx +0 -42
  333. package/2/apps/native/src/components/ui/patterns/index.ts +0 -16
  334. package/2/apps/native/src/components/ui/picker.tsx +0 -244
  335. package/2/apps/native/src/components/ui/popover.tsx +0 -313
  336. package/2/apps/native/src/components/ui/primitives/index.ts +0 -38
  337. package/2/apps/native/src/components/ui/radio-group.tsx +0 -47
  338. package/2/apps/native/src/components/ui/searchbar.tsx +0 -118
  339. package/2/apps/native/src/components/ui/sheet.tsx +0 -93
  340. package/2/apps/native/src/components/ui/switch.tsx +0 -37
  341. package/2/apps/native/src/components/ui/table.tsx +0 -296
  342. package/2/apps/native/src/components/ui/tabs.tsx +0 -115
  343. package/2/apps/native/src/components/ui/toggle.tsx +0 -50
  344. package/2/apps/native/src/components/ui/utils.tsx +0 -34
  345. package/2/apps/native/src/components/ui/video.tsx +0 -39
  346. package/2/apps/native/src/core/analytics/analytics-service.ts +0 -94
  347. package/2/apps/native/src/core/analytics/index.ts +0 -2
  348. package/2/apps/native/src/core/analytics/posthog-analytics-adapter.ts +0 -192
  349. package/2/apps/native/src/core/auth/auth-service.ts +0 -33
  350. package/2/apps/native/src/core/auth/index.ts +0 -1
  351. package/2/apps/native/src/core/cache/__tests__/cache-service.test.ts +0 -599
  352. package/2/apps/native/src/core/cache/cache-service.ts +0 -89
  353. package/2/apps/native/src/core/cache/index.ts +0 -45
  354. package/2/apps/native/src/core/config/config.service.ts +0 -153
  355. package/2/apps/native/src/core/config/index.ts +0 -2
  356. package/2/apps/native/src/core/config/telemetry.ts +0 -38
  357. package/2/apps/native/src/core/local-notifications/local-notification-manager.ts +0 -409
  358. package/2/apps/native/src/core/logging/custom-transports.ts +0 -126
  359. package/2/apps/native/src/core/logging/index.ts +0 -1
  360. package/2/apps/native/src/core/logging/logger.ts +0 -182
  361. package/2/apps/native/src/core/navigation/deep-link-handler.ts +0 -295
  362. package/2/apps/native/src/core/navigation/navigation-types.ts +0 -53
  363. package/2/apps/native/src/core/payments/index.ts +0 -1
  364. package/2/apps/native/src/core/payments/payment-service.ts +0 -32
  365. package/2/apps/native/src/core/quick-actions/index.ts +0 -2
  366. package/2/apps/native/src/core/quick-actions/quick-actions-adapter.ts +0 -54
  367. package/2/apps/native/src/core/quick-actions/types.ts +0 -29
  368. package/2/apps/native/src/core/storage/index.ts +0 -1
  369. package/2/apps/native/src/core/storage/mmkv.ts +0 -62
  370. package/2/apps/native/src/core/storage/notification-storage.ts +0 -312
  371. package/2/apps/native/src/core/types/common.ts +0 -0
  372. package/2/apps/native/src/core/utils/convex-http-api.ts +0 -30
  373. package/2/apps/native/src/features/audio-recorder/components/audio-player.tsx +0 -301
  374. package/2/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +0 -373
  375. package/2/apps/native/src/features/audio-recorder/components/audio-waveform.tsx +0 -270
  376. package/2/apps/native/src/features/audio-recorder/components/index.ts +0 -4
  377. package/2/apps/native/src/features/audio-recorder/components/recording-list.tsx +0 -89
  378. package/2/apps/native/src/features/audio-recorder/demo/audio-player-demo.tsx +0 -66
  379. package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-cloud.tsx +0 -68
  380. package/2/apps/native/src/features/audio-recorder/demo/audio-recorder-interview.tsx +0 -102
  381. package/2/apps/native/src/features/audio-recorder/demo/basic.tsx +0 -27
  382. package/2/apps/native/src/features/audio-recorder/demo/index.ts +0 -5
  383. package/2/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +0 -82
  384. package/2/apps/native/src/features/authentication/components/auth-watcher.tsx +0 -115
  385. package/2/apps/native/src/features/authentication/components/login-form.tsx +0 -85
  386. package/2/apps/native/src/features/authentication/services/__tests__/convex-auth.adapter.test.ts +0 -399
  387. package/2/apps/native/src/features/authentication/services/convex-auth.adapter.ts +0 -497
  388. package/2/apps/native/src/features/authentication/services/index.ts +0 -2
  389. package/2/apps/native/src/features/charts/README.md +0 -185
  390. package/2/apps/native/src/features/charts/app/preview.tsx +0 -226
  391. package/2/apps/native/src/features/charts/components/area-chart.tsx +0 -43
  392. package/2/apps/native/src/features/charts/components/bar-chart.tsx +0 -146
  393. package/2/apps/native/src/features/charts/components/candlestick-chart.tsx +0 -199
  394. package/2/apps/native/src/features/charts/components/chart-card.tsx +0 -68
  395. package/2/apps/native/src/features/charts/components/column-chart.tsx +0 -146
  396. package/2/apps/native/src/features/charts/components/doughnut-chart.tsx +0 -260
  397. package/2/apps/native/src/features/charts/components/index.ts +0 -13
  398. package/2/apps/native/src/features/charts/components/line-chart.tsx +0 -311
  399. package/2/apps/native/src/features/charts/components/radar-chart.tsx +0 -183
  400. package/2/apps/native/src/features/charts/components/radial-bar-chart.tsx +0 -191
  401. package/2/apps/native/src/features/charts/components/stacked-area-chart.tsx +0 -268
  402. package/2/apps/native/src/features/charts/components/stacked-bar-chart.tsx +0 -325
  403. package/2/apps/native/src/features/charts/data/mock-data.ts +0 -186
  404. package/2/apps/native/src/features/charts/types/index.ts +0 -69
  405. package/2/apps/native/src/features/chatbot/app/index.tsx +0 -303
  406. package/2/apps/native/src/features/chatbot/components/chat-header-buttons.tsx +0 -60
  407. package/2/apps/native/src/features/chatbot/components/chat-input-bar.tsx +0 -470
  408. package/2/apps/native/src/features/chatbot/components/chat-markdown.tsx +0 -576
  409. package/2/apps/native/src/features/chatbot/components/chat-message-bubble.tsx +0 -247
  410. package/2/apps/native/src/features/chatbot/components/chat-settings-modal.tsx +0 -162
  411. package/2/apps/native/src/features/chatbot/components/image-preview-list.tsx +0 -116
  412. package/2/apps/native/src/features/chatbot/components/markdown/code-block.tsx +0 -166
  413. package/2/apps/native/src/features/chatbot/components/markdown/index.ts +0 -11
  414. package/2/apps/native/src/features/chatbot/components/markdown/table-renderer.tsx +0 -130
  415. package/2/apps/native/src/features/chatbot/components/message-error-boundary.tsx +0 -79
  416. package/2/apps/native/src/features/chatbot/components/message-list.tsx +0 -174
  417. package/2/apps/native/src/features/chatbot/components/model-selector.tsx +0 -284
  418. package/2/apps/native/src/features/chatbot/components/report-content-modal.tsx +0 -189
  419. package/2/apps/native/src/features/chatbot/components/suggested-messages.tsx +0 -68
  420. package/2/apps/native/src/features/chatbot/constants/models.ts +0 -21
  421. package/2/apps/native/src/features/chatbot/constants/report-reasons.ts +0 -10
  422. package/2/apps/native/src/features/chatbot/hooks/use-attachment-cache.ts +0 -144
  423. package/2/apps/native/src/features/chatbot/hooks/use-chat-config.ts +0 -665
  424. package/2/apps/native/src/features/chatbot/hooks/use-chat-handlers.ts +0 -360
  425. package/2/apps/native/src/features/chatbot/hooks/use-chatbot-settings.ts +0 -90
  426. package/2/apps/native/src/features/chatbot/hooks/use-conversation.ts +0 -80
  427. package/2/apps/native/src/features/chatbot/hooks/use-image-picker.ts +0 -123
  428. package/2/apps/native/src/features/chatbot/hooks/use-keyboard-coordinator.ts +0 -162
  429. package/2/apps/native/src/features/chatbot/hooks/use-smart-scroll-manager.ts +0 -214
  430. package/2/apps/native/src/features/chatbot/models/index.ts +0 -87
  431. package/2/apps/native/src/features/chatbot/models/models.ts +0 -163
  432. package/2/apps/native/src/features/chatbot/models/providers.ts +0 -63
  433. package/2/apps/native/src/features/chatbot/models/types.ts +0 -41
  434. package/2/apps/native/src/features/chatbot/services/file-uploader.ts +0 -239
  435. package/2/apps/native/src/features/chatbot/services/message-handler-service.ts +0 -181
  436. package/2/apps/native/src/features/chatbot/types/index.ts +0 -61
  437. package/2/apps/native/src/features/chatbot/utils/chat-telemetry.ts +0 -92
  438. package/2/apps/native/src/features/image-generator/app/_layout.tsx +0 -26
  439. package/2/apps/native/src/features/image-generator/app/gallery.tsx +0 -217
  440. package/2/apps/native/src/features/image-generator/app/index.tsx +0 -237
  441. package/2/apps/native/src/features/image-generator/components/gallery-image.tsx +0 -25
  442. package/2/apps/native/src/features/image-generator/components/image-detail-modal.tsx +0 -215
  443. package/2/apps/native/src/features/image-generator/components/image-model-selector.tsx +0 -210
  444. package/2/apps/native/src/features/image-generator/components/image-placeholder.tsx +0 -26
  445. package/2/apps/native/src/features/image-generator/hooks/use-image-gallery.ts +0 -71
  446. package/2/apps/native/src/features/image-generator/hooks/use-image-generator-settings.ts +0 -152
  447. package/2/apps/native/src/features/image-generator/hooks/use-image-generator.ts +0 -93
  448. package/2/apps/native/src/features/image-generator/models/models.ts +0 -66
  449. package/2/apps/native/src/features/image-generator/services/image-gallery-service.ts +0 -98
  450. package/2/apps/native/src/features/image-generator/services/image-save-service.ts +0 -121
  451. package/2/apps/native/src/features/onboarding/analytics/index.ts +0 -9
  452. package/2/apps/native/src/features/onboarding/components/onboarding-with-analytics.tsx +0 -141
  453. package/2/apps/native/src/features/onboarding/components/onboarding.tsx +0 -173
  454. package/2/apps/native/src/features/onboarding/config/onboarding-flow-config.ts +0 -189
  455. package/2/apps/native/src/features/onboarding/demo-one/app/index.tsx +0 -43
  456. package/2/apps/native/src/features/onboarding/demo-one/data.ts +0 -32
  457. package/2/apps/native/src/features/onboarding/hooks/use-onboarding-analytics.ts +0 -323
  458. package/2/apps/native/src/features/onboarding/services/onboarding-analytics.ts +0 -432
  459. package/2/apps/native/src/features/payments/README.md +0 -200
  460. package/2/apps/native/src/features/payments/app/local-paywall.tsx +0 -194
  461. package/2/apps/native/src/features/payments/app/remote-paywall.tsx +0 -79
  462. package/2/apps/native/src/features/payments/components/payment-initializer.tsx +0 -95
  463. package/2/apps/native/src/features/payments/components/paywall-error-state.tsx +0 -60
  464. package/2/apps/native/src/features/payments/components/paywall-local-mode.tsx +0 -116
  465. package/2/apps/native/src/features/payments/components/paywall-product-card.tsx +0 -133
  466. package/2/apps/native/src/features/payments/components/paywall-remote-mode.tsx +0 -146
  467. package/2/apps/native/src/features/payments/hooks/use-entitlement.ts +0 -63
  468. package/2/apps/native/src/features/payments/index.ts +0 -8
  469. package/2/apps/native/src/features/payments/services/revenuecat-adapter.ts +0 -407
  470. package/2/apps/native/src/features/quick-actions/components/quick-actions-demo.tsx +0 -139
  471. package/2/apps/native/src/features/quick-actions/config/default-actions.ts +0 -83
  472. package/2/apps/native/src/features/quick-actions/hooks/use-quick-actions.ts +0 -45
  473. package/2/apps/native/src/features/quick-actions/index.ts +0 -4
  474. package/2/apps/native/src/features/quick-actions/utils/quick-actions-manager.ts +0 -105
  475. package/2/apps/native/src/features/quiz/components/question.tsx +0 -67
  476. package/2/apps/native/src/features/quiz/config.ts +0 -11
  477. package/2/apps/native/src/features/quiz/index.tsx +0 -133
  478. package/2/apps/native/src/features/settings/ui/debug-info.tsx +0 -75
  479. package/2/apps/native/src/features/settings/ui/dev-tools.tsx +0 -1
  480. package/2/apps/native/src/features/settings/ui/item.tsx +0 -45
  481. package/2/apps/native/src/features/settings/ui/items-container.tsx +0 -23
  482. package/2/apps/native/src/features/settings/ui/language-item.tsx +0 -52
  483. package/2/apps/native/src/features/settings/ui/notification-item.tsx +0 -59
  484. package/2/apps/native/src/features/settings/ui/theme-item.tsx +0 -45
  485. package/2/apps/native/src/features/tracker-app/app/index.tsx +0 -108
  486. package/2/apps/native/src/features/tracker-app/components/animated-number.tsx +0 -102
  487. package/2/apps/native/src/features/tracker-app/components/calorie-card.tsx +0 -66
  488. package/2/apps/native/src/features/tracker-app/components/circular-progress.tsx +0 -97
  489. package/2/apps/native/src/features/tracker-app/components/floating-add-button.tsx +0 -27
  490. package/2/apps/native/src/features/tracker-app/components/macro-card.tsx +0 -80
  491. package/2/apps/native/src/features/tracker-app/components/promo-banner.tsx +0 -98
  492. package/2/apps/native/src/features/tracker-app/components/recently-logged.tsx +0 -64
  493. package/2/apps/native/src/features/tracker-app/components/week-calendar.tsx +0 -68
  494. package/2/apps/native/src/features/vibefast-features.ts +0 -42
  495. package/2/apps/native/src/features/voice-bot/README.md +0 -185
  496. package/2/apps/native/src/features/voice-bot/components/conversation-status.tsx +0 -76
  497. package/2/apps/native/src/features/voice-bot/components/index.ts +0 -4
  498. package/2/apps/native/src/features/voice-bot/components/message-input.tsx +0 -98
  499. package/2/apps/native/src/features/voice-bot/components/voice-bot-screen.tsx +0 -173
  500. package/2/apps/native/src/features/voice-bot/components/voice-controls.tsx +0 -73
  501. package/2/apps/native/src/features/voice-bot/index.ts +0 -3
  502. package/2/apps/native/src/features/voice-bot/services/index.ts +0 -1
  503. package/2/apps/native/src/features/voice-bot/services/use-voice-bot.ts +0 -161
  504. package/2/apps/native/src/features/voice-bot/types.ts +0 -29
  505. package/2/apps/native/src/features/wake-word/components/index.ts +0 -1
  506. package/2/apps/native/src/features/wake-word/components/wake-word-indicator.tsx +0 -61
  507. package/2/apps/native/src/features/wake-word/constants.ts +0 -10
  508. package/2/apps/native/src/features/wake-word/hooks/use-wake-word.ts +0 -181
  509. package/2/apps/native/src/features/wake-word/index.ts +0 -22
  510. package/2/apps/native/src/features/wake-word/services/audio-session.ts +0 -40
  511. package/2/apps/native/src/features/wake-word/services/event-bus.ts +0 -31
  512. package/2/apps/native/src/features/wake-word/services/keywords.ts +0 -88
  513. package/2/apps/native/src/features/wake-word/services/wake-word-manager.ts +0 -249
  514. package/2/apps/native/src/features/wake-word/types.ts +0 -22
  515. package/2/apps/native/src/lib/env.js +0 -13
  516. package/2/apps/native/src/lib/hooks/index.tsx +0 -6
  517. package/2/apps/native/src/lib/hooks/use-device-identifier.tsx +0 -80
  518. package/2/apps/native/src/lib/hooks/use-gradual-animation.ts +0 -28
  519. package/2/apps/native/src/lib/hooks/use-is-first-time.tsx +0 -25
  520. package/2/apps/native/src/lib/hooks/use-navigation-analytics.ts +0 -44
  521. package/2/apps/native/src/lib/hooks/use-navigation-options.tsx +0 -87
  522. package/2/apps/native/src/lib/hooks/use-push-notifications.ts +0 -250
  523. package/2/apps/native/src/lib/hooks/use-responsive-size.tsx +0 -37
  524. package/2/apps/native/src/lib/hooks/use-selected-theme.tsx +0 -38
  525. package/2/apps/native/src/lib/hooks/use-viewport-lazy-loading.tsx +0 -124
  526. package/2/apps/native/src/lib/i18n/index.tsx +0 -30
  527. package/2/apps/native/src/lib/i18n/react-i18next.d.ts +0 -9
  528. package/2/apps/native/src/lib/i18n/resources.ts +0 -25
  529. package/2/apps/native/src/lib/i18n/types.ts +0 -23
  530. package/2/apps/native/src/lib/i18n/utils.tsx +0 -112
  531. package/2/apps/native/src/lib/index.tsx +0 -3
  532. package/2/apps/native/src/lib/state/auth-client-slice.ts +0 -34
  533. package/2/apps/native/src/lib/state/index.ts +0 -1
  534. package/2/apps/native/src/lib/storage.tsx +0 -7
  535. package/2/apps/native/src/lib/test-utils.tsx +0 -43
  536. package/2/apps/native/src/lib/use-theme-config.tsx +0 -108
  537. package/2/apps/native/src/lib/utils.ts +0 -29
  538. package/2/apps/native/src/polyfills.ts +0 -61
  539. package/2/apps/native/src/providers/convex-provider.tsx +0 -31
  540. package/2/apps/native/src/providers/index.tsx +0 -6
  541. package/2/apps/native/src/providers/notification-provider.tsx +0 -168
  542. package/2/apps/native/src/providers/posthog-provider.tsx +0 -47
  543. package/2/apps/native/src/providers/root-providers.tsx +0 -46
  544. package/2/apps/native/src/providers/sentry-provider.tsx +0 -62
  545. package/2/apps/native/src/providers/splash-screen-provider.tsx +0 -122
  546. package/2/apps/native/src/providers/theme-provider.tsx +0 -67
  547. package/2/apps/native/src/translations/ar.json +0 -394
  548. package/2/apps/native/src/translations/de.json +0 -394
  549. package/2/apps/native/src/translations/en.json +0 -394
  550. package/2/apps/native/src/translations/es.json +0 -394
  551. package/2/apps/native/src/translations/fr.json +0 -394
  552. package/2/apps/native/src/types/flash-list.d.ts +0 -3
  553. package/2/apps/native/src/types/index.ts +0 -3
  554. package/2/apps/native/src/types/react-native-reanimated.d.ts +0 -5
  555. package/2/apps/native/tailwind.config.js +0 -57
  556. package/2/apps/native/targets/widget/AppIntent.swift +0 -46
  557. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
  558. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
  559. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
  560. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
  561. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
  562. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
  563. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
  564. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
  565. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
  566. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
  567. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
  568. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
  569. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
  570. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
  571. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -122
  572. package/2/apps/native/targets/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
  573. package/2/apps/native/targets/widget/CalorieTrackerWidget.swift +0 -424
  574. package/2/apps/native/targets/widget/HabitTrackerWidget.swift +0 -305
  575. package/2/apps/native/targets/widget/Info.plist +0 -11
  576. package/2/apps/native/targets/widget/WidgetLiveActivity.swift +0 -75
  577. package/2/apps/native/targets/widget/expo-target.config.js +0 -10
  578. package/2/apps/native/targets/widget/generated.entitlements +0 -5
  579. package/2/apps/native/targets/widget/index.swift +0 -18
  580. package/2/apps/native/targets/widget/widgets.swift +0 -96
  581. package/2/apps/native/tsconfig.json +0 -88
  582. package/2/apps/native/vitest.config.mts +0 -14
  583. package/2/apps/web/README.md +0 -36
  584. package/2/apps/web/app/favicon.ico +0 -0
  585. package/2/apps/web/app/globals.css +0 -122
  586. package/2/apps/web/app/layout.tsx +0 -38
  587. package/2/apps/web/app/page.tsx +0 -35
  588. package/2/apps/web/app/users/page.tsx +0 -301
  589. package/2/apps/web/components/AdminDashboard.tsx +0 -336
  590. package/2/apps/web/components/AppleLogo.tsx +0 -15
  591. package/2/apps/web/components/GitHubLogo.tsx +0 -11
  592. package/2/apps/web/components/GoogleLogo.tsx +0 -23
  593. package/2/apps/web/components/Layout.tsx +0 -77
  594. package/2/apps/web/components/ThemeToggle.tsx +0 -23
  595. package/2/apps/web/components/UserMenu.tsx +0 -66
  596. package/2/apps/web/components/auth/CodeInput.tsx +0 -24
  597. package/2/apps/web/components/auth/ResetPasswordWithEmailCode.tsx +0 -85
  598. package/2/apps/web/components/auth/SignInFormEmailCode.tsx +0 -72
  599. package/2/apps/web/components/auth/SignInFormEmailLink.tsx +0 -81
  600. package/2/apps/web/components/auth/SignInFormPassword.tsx +0 -17
  601. package/2/apps/web/components/auth/SignInFormPasswordAndCustomField.tsx +0 -42
  602. package/2/apps/web/components/auth/SignInFormPasswordAndResetViaCode.tsx +0 -32
  603. package/2/apps/web/components/auth/SignInFormPasswordAndVerifyViaCode.tsx +0 -86
  604. package/2/apps/web/components/auth/SignInFormPhoneCode.tsx +0 -89
  605. package/2/apps/web/components/auth/SignInFormsShowcase.tsx +0 -64
  606. package/2/apps/web/components/auth/SignInMethodDivider.tsx +0 -17
  607. package/2/apps/web/components/auth/SignInWithEmailCode.tsx +0 -49
  608. package/2/apps/web/components/auth/SignInWithOAuth.tsx +0 -16
  609. package/2/apps/web/components/auth/SignInWithPassword.tsx +0 -100
  610. package/2/apps/web/components/auth/oauth/SignInWithApple.tsx +0 -27
  611. package/2/apps/web/components/auth/oauth/SignInWithGitHub.tsx +0 -27
  612. package/2/apps/web/components/auth/oauth/SignInWithGoogle.tsx +0 -27
  613. package/2/apps/web/components/ui/button.tsx +0 -60
  614. package/2/apps/web/components/ui/card.tsx +0 -92
  615. package/2/apps/web/components/ui/dialog.tsx +0 -143
  616. package/2/apps/web/components/ui/dropdown-menu.tsx +0 -257
  617. package/2/apps/web/components/ui/input-otp.tsx +0 -77
  618. package/2/apps/web/components/ui/input.tsx +0 -21
  619. package/2/apps/web/components/ui/skeleton.tsx +0 -13
  620. package/2/apps/web/components/ui/tabs.tsx +0 -66
  621. package/2/apps/web/components/ui/toast.tsx +0 -130
  622. package/2/apps/web/components/ui/toaster.tsx +0 -36
  623. package/2/apps/web/components/ui/toggle-group.tsx +0 -83
  624. package/2/apps/web/components/ui/toggle.tsx +0 -47
  625. package/2/apps/web/components/ui/use-toast.ts +0 -192
  626. package/2/apps/web/components.json +0 -22
  627. package/2/apps/web/eslint.config.mjs +0 -18
  628. package/2/apps/web/lib/convex-provider.tsx +0 -18
  629. package/2/apps/web/lib/utils.ts +0 -6
  630. package/2/apps/web/next.config.ts +0 -7
  631. package/2/apps/web/package.json +0 -46
  632. package/2/apps/web/postcss.config.mjs +0 -7
  633. package/2/apps/web/public/file.svg +0 -1
  634. package/2/apps/web/public/globe.svg +0 -1
  635. package/2/apps/web/public/next.svg +0 -1
  636. package/2/apps/web/public/vercel.svg +0 -1
  637. package/2/apps/web/public/window.svg +0 -1
  638. package/2/apps/web/tsconfig.json +0 -34
  639. package/2/bts.jsonc +0 -21
  640. package/2/commitlint.config.js +0 -1
  641. package/2/eslint.config.mjs +0 -182
  642. package/2/lint-staged.config.js +0 -16
  643. package/2/package.json +0 -64
  644. package/2/packages/backend/.env.example +0 -20
  645. package/2/packages/backend/convex/README.md +0 -90
  646. package/2/packages/backend/convex/_generated/api.d.ts +0 -2599
  647. package/2/packages/backend/convex/_generated/api.js +0 -23
  648. package/2/packages/backend/convex/_generated/dataModel.d.ts +0 -60
  649. package/2/packages/backend/convex/_generated/server.d.ts +0 -149
  650. package/2/packages/backend/convex/_generated/server.js +0 -90
  651. package/2/packages/backend/convex/agents.ts +0 -116
  652. package/2/packages/backend/convex/auth.config.ts +0 -8
  653. package/2/packages/backend/convex/auth.ts +0 -103
  654. package/2/packages/backend/convex/authCustomEmailOtpProvider.ts +0 -175
  655. package/2/packages/backend/convex/authOtp.ts +0 -144
  656. package/2/packages/backend/convex/authPasswordReset.ts +0 -367
  657. package/2/packages/backend/convex/authPasswordResetActions.ts +0 -150
  658. package/2/packages/backend/convex/chatbot/index.ts +0 -30
  659. package/2/packages/backend/convex/chatbotAgent.ts +0 -1085
  660. package/2/packages/backend/convex/chatbotHistory.ts +0 -307
  661. package/2/packages/backend/convex/convex.config.ts +0 -13
  662. package/2/packages/backend/convex/deviceGrants.ts +0 -58
  663. package/2/packages/backend/convex/grantFunctions.ts +0 -444
  664. package/2/packages/backend/convex/http.ts +0 -8
  665. package/2/packages/backend/convex/imageGeneration/index.ts +0 -12
  666. package/2/packages/backend/convex/imageGeneratorFunctions.ts +0 -290
  667. package/2/packages/backend/convex/lib/ai/analysisConfigs.ts +0 -257
  668. package/2/packages/backend/convex/lib/ai/config.ts +0 -71
  669. package/2/packages/backend/convex/lib/ai/geminiAdapter.ts +0 -43
  670. package/2/packages/backend/convex/lib/ai/openaiAdapter.ts +0 -43
  671. package/2/packages/backend/convex/lib/ai/schemas.ts +0 -79
  672. package/2/packages/backend/convex/lib/config.ts +0 -111
  673. package/2/packages/backend/convex/lib/rateLimit.ts +0 -100
  674. package/2/packages/backend/convex/lib/telemetry.ts +0 -29
  675. package/2/packages/backend/convex/paymentFunctions.ts +0 -119
  676. package/2/packages/backend/convex/payments/index.ts +0 -13
  677. package/2/packages/backend/convex/pushNotificationFunctions.ts +0 -342
  678. package/2/packages/backend/convex/ragKnowledge.ts +0 -714
  679. package/2/packages/backend/convex/rateLimit.ts +0 -13
  680. package/2/packages/backend/convex/recordingFunctions.ts +0 -98
  681. package/2/packages/backend/convex/reportFunctions.ts +0 -344
  682. package/2/packages/backend/convex/reporting/index.ts +0 -9
  683. package/2/packages/backend/convex/router.ts +0 -81
  684. package/2/packages/backend/convex/schema.ts +0 -237
  685. package/2/packages/backend/convex/shared/email.ts +0 -172
  686. package/2/packages/backend/convex/shared/files.ts +0 -96
  687. package/2/packages/backend/convex/shared/index.ts +0 -17
  688. package/2/packages/backend/convex/shared/templates/PasswordResetEmail.tsx +0 -72
  689. package/2/packages/backend/convex/shared/templates/VerificationCodeEmail.tsx +0 -65
  690. package/2/packages/backend/convex/sharedUsers.ts +0 -48
  691. package/2/packages/backend/convex/tools/index.ts +0 -18
  692. package/2/packages/backend/convex/tools/knowledgeRetrieval.ts +0 -92
  693. package/2/packages/backend/convex/tools/tavilySearch.ts +0 -83
  694. package/2/packages/backend/convex/tools/userProfile.ts +0 -72
  695. package/2/packages/backend/convex/tsconfig.json +0 -25
  696. package/2/packages/backend/convex/users.ts +0 -54
  697. package/2/packages/backend/index.ts +0 -20
  698. package/2/packages/backend/package.json +0 -32
  699. package/2/packages/ui/README.md +0 -63
  700. package/2/packages/ui/index.ts +0 -1
  701. package/2/packages/ui/package.json +0 -21
  702. package/2/packages/ui/src/components/SharedButton.tsx +0 -31
  703. package/2/packages/ui/src/components/SharedCard.tsx +0 -48
  704. package/2/packages/ui/src/components/index.ts +0 -2
  705. package/2/packages/ui/tsconfig.json +0 -10
  706. package/2/pnpm-lock.yaml +0 -23292
  707. package/2/pnpm-workspace.yaml +0 -3
  708. package/2/scripts/i18next-syntax-validation.js +0 -1
  709. package/2/tsconfig.json +0 -43
  710. package/2/turbo.json +0 -33
  711. package/2/vercel.json +0 -6
  712. package/2/vf-agent/agent-teams/team-vibefast.yaml +0 -14
  713. package/2/vf-agent/agents/analyst.md +0 -53
  714. package/2/vf-agent/agents/architect.md +0 -105
  715. package/2/vf-agent/agents/dev.md +0 -40
  716. package/2/vf-agent/agents/orchestrator.md +0 -181
  717. package/2/vf-agent/agents/pm.md +0 -48
  718. package/2/vf-agent/agents/po.md +0 -38
  719. package/2/vf-agent/agents/qa.md +0 -30
  720. package/2/vf-agent/agents/sm.md +0 -38
  721. package/2/vf-agent/agents/ux-expert.md +0 -33
  722. package/2/vf-agent/checklists/po-master-checklist.md +0 -73
  723. package/2/vf-agent/checklists/story-dod-checklist.md +0 -37
  724. package/2/vf-agent/core-config.yaml +0 -43
  725. package/2/vf-agent/data/knowledge_base/backend/convex-advanced.md +0 -43
  726. package/2/vf-agent/data/knowledge_base/backend/convex-database.md +0 -53
  727. package/2/vf-agent/data/knowledge_base/backend/convex-main.md +0 -65
  728. package/2/vf-agent/data/knowledge_base/backend/full-guidelines.md +0 -795
  729. package/2/vf-agent/data/knowledge_base/coding-standards.md +0 -253
  730. package/2/vf-agent/data/knowledge_base/frontend/full-guidelines.md +0 -254
  731. package/2/vf-agent/data/knowledge_base/frontend/image-handling.md +0 -48
  732. package/2/vf-agent/data/knowledge_base/frontend/react-native-main.md +0 -24
  733. package/2/vf-agent/data/knowledge_base/frontend/ui-and-styling.md +0 -169
  734. package/2/vf-agent/data/knowledge_base/general-principles.md +0 -26
  735. package/2/vf-agent/data/knowledge_base/master-rulebook.md +0 -42
  736. package/2/vf-agent/data/knowledge_base/starter-docs/audio-recorder-reference.md +0 -98
  737. package/2/vf-agent/data/knowledge_base/starter-docs/authentication-reference.md +0 -155
  738. package/2/vf-agent/data/knowledge_base/starter-docs/charts-reference.md +0 -149
  739. package/2/vf-agent/data/knowledge_base/starter-docs/chatbot-reference.md +0 -123
  740. package/2/vf-agent/data/knowledge_base/starter-docs/feature-reference-index.md +0 -211
  741. package/2/vf-agent/data/knowledge_base/starter-docs/features-overview.md +0 -221
  742. package/2/vf-agent/data/knowledge_base/starter-docs/image-analyzer-reference.md +0 -118
  743. package/2/vf-agent/data/knowledge_base/starter-docs/image-generator-reference.md +0 -110
  744. package/2/vf-agent/data/knowledge_base/starter-docs/index.md +0 -28
  745. package/2/vf-agent/data/knowledge_base/starter-docs/onboarding-reference.md +0 -96
  746. package/2/vf-agent/data/knowledge_base/starter-docs/payments-reference.md +0 -148
  747. package/2/vf-agent/data/knowledge_base/starter-docs/prd.md +0 -82
  748. package/2/vf-agent/data/knowledge_base/starter-docs/push-notifications-reference.md +0 -453
  749. package/2/vf-agent/data/knowledge_base/starter-docs/quick-actions-reference.md +0 -253
  750. package/2/vf-agent/data/knowledge_base/starter-docs/quiz-reference.md +0 -169
  751. package/2/vf-agent/data/knowledge_base/starter-docs/settings-reference.md +0 -146
  752. package/2/vf-agent/data/knowledge_base/starter-docs/tech-stack.md +0 -159
  753. package/2/vf-agent/data/knowledge_base/starter-docs/tracker-app-reference.md +0 -150
  754. package/2/vf-agent/data/knowledge_base/starter-docs/unified-project-structure.md +0 -98
  755. package/2/vf-agent/data/knowledge_base/testing/backend-testing.md +0 -54
  756. package/2/vf-agent/data/knowledge_base/testing/frontend-testing.md +0 -71
  757. package/2/vf-agent/data/knowledge_base/testing/testing-strategy.md +0 -31
  758. package/2/vf-agent/tasks/advanced-elicitation.md +0 -117
  759. package/2/vf-agent/tasks/brownfield-create-epic.md +0 -160
  760. package/2/vf-agent/tasks/create-deep-research-prompt.md +0 -278
  761. package/2/vf-agent/tasks/create-doc.md +0 -42
  762. package/2/vf-agent/tasks/create-story.md +0 -43
  763. package/2/vf-agent/tasks/document-project.md +0 -343
  764. package/2/vf-agent/tasks/facilitate-brainstorming-session.md +0 -136
  765. package/2/vf-agent/tasks/index-docs.md +0 -173
  766. package/2/vf-agent/tasks/kb-mode-interaction.md +0 -75
  767. package/2/vf-agent/tasks/review-story.md +0 -154
  768. package/2/vf-agent/tasks/shard-doc.md +0 -185
  769. package/2/vf-agent/tasks/troubleshoot-issue.md +0 -65
  770. package/2/vf-agent/tasks/validate-next-story.md +0 -47
  771. package/2/vf-agent/templates/brainstorming-output-tmpl.yaml +0 -156
  772. package/2/vf-agent/templates/brownfield-architecture-tmpl.yaml +0 -111
  773. package/2/vf-agent/templates/brownfield-prd-tmpl.yaml +0 -247
  774. package/2/vf-agent/templates/competitor-analysis-tmpl.yaml +0 -293
  775. package/2/vf-agent/templates/market-research-tmpl.yaml +0 -252
  776. package/2/vf-agent/templates/project-brief-tmpl.yaml +0 -221
  777. package/2/vf-agent/templates/story-tmpl.yaml +0 -143
  778. package/recipes/0/apps/native/src/components/advanced-ui/timeline/demo.tsx +0 -444
  779. package/recipes/0/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +0 -355
  780. package/recipes/0/apps/native/src/components/advanced-ui/timeline/types.ts +0 -31
  781. package/recipes/wake-word/scripts/download-vosk-model.mjs +0 -121
  782. /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/animated-chip.tsx +0 -0
  783. /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/chip.tsx +0 -0
  784. /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/demo.tsx +0 -0
  785. /package/{2 → recipes/animated-chip}/apps/native/src/components/advanced-ui/chip/types.ts +0 -0
  786. /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/animated-switch.tsx +0 -0
  787. /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/demo.tsx +0 -0
  788. /package/{2 → recipes/animated-switch}/apps/native/src/components/advanced-ui/switch/types.ts +0 -0
  789. /package/{2 → recipes/glowing-button}/apps/native/src/components/advanced-ui/buttons/demo.tsx +0 -0
  790. /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/front.jpg +0 -0
  791. /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/side.jpg +0 -0
  792. /package/{2 → recipes/image-analysis}/apps/native/assets/features/image-analyzer/threeQuarter.jpg +0 -0
  793. /package/{2 → recipes/image-analysis}/apps/native/src/api-client/image-analyzer.ts +0 -0
  794. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/_layout.tsx +0 -0
  795. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/analysis-options.tsx +0 -0
  796. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/camera.tsx +0 -0
  797. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/index.tsx +0 -0
  798. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/loading.tsx +0 -0
  799. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/results.tsx +0 -0
  800. /package/{2 → recipes/image-analysis}/apps/native/src/app/(root)/(protected)/analysis/[type]/trait-details.tsx +0 -0
  801. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +0 -0
  802. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/camera.tsx +0 -0
  803. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +0 -0
  804. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/loading-screen.tsx +0 -0
  805. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/loading.tsx +0 -0
  806. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/results.tsx +0 -0
  807. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/trait-details.tsx +0 -0
  808. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/use-analysis-data.ts +0 -0
  809. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/app/use-results-screen.ts +0 -0
  810. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-badge.tsx +0 -0
  811. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-card.tsx +0 -0
  812. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievement-unlocked-modal.tsx +0 -0
  813. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/achievements-section.tsx +0 -0
  814. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/advice-list.tsx +0 -0
  815. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/circular-progress.tsx +0 -0
  816. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/content-card.tsx +0 -0
  817. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/error-state.tsx +0 -0
  818. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/index.ts +0 -0
  819. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/loading-state.tsx +0 -0
  820. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/profile-image.tsx +0 -0
  821. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/results-header.tsx +0 -0
  822. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/score-display.tsx +0 -0
  823. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/share-options-modal.tsx +0 -0
  824. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/components/results/traits-grid.tsx +0 -0
  825. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/config/analysis-config.ts +0 -0
  826. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/config/master-analysis-config.ts +0 -0
  827. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/index.ts +0 -0
  828. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/use-analysis.ts +0 -0
  829. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +0 -0
  830. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/analysis-service.ts +0 -0
  831. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/share-service.ts +0 -0
  832. /package/{2 → recipes/image-analysis}/apps/native/src/features/image-analyzer/services/trait-details-service.ts +0 -0
  833. /package/{2 → recipes/image-analysis}/packages/backend/convex/imageAnalysis/index.ts +0 -0
  834. /package/{2 → recipes/image-analysis}/packages/backend/convex/imageAnalysisFunctions.ts +0 -0
  835. /package/{2 → recipes/image-analysis}/packages/backend/convex/lib/ai/imageAnalysisAdapter.ts +0 -0
  836. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/button/stepper-button.tsx +0 -0
  837. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/button/types.ts +0 -0
  838. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/content/stepper-content.tsx +0 -0
  839. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/content/types.ts +0 -0
  840. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/value/stepper-value.tsx +0 -0
  841. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/children/value/types.ts +0 -0
  842. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/context/stepper-context.ts +0 -0
  843. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/context/types.ts +0 -0
  844. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/demo.tsx +0 -0
  845. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/index.ts +0 -0
  846. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/stepper.tsx +0 -0
  847. /package/{2 → recipes/number-stepper}/apps/native/src/components/advanced-ui/stepper/types.ts +0 -0
  848. /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/animated-progress-bar.tsx +0 -0
  849. /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/dropdown-picker-page.tsx +0 -0
  850. /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +0 -0
  851. /package/{2 → recipes/progress-circle}/apps/native/src/components/advanced-ui/progress-bars/progress-circle.tsx +0 -0
  852. /package/{2 → recipes/swipe-slider}/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +0 -0
  853. /package/{2 → recipes/swipe-slider}/apps/native/src/components/advanced-ui/sliders/swipe-slider.tsx +0 -0
  854. /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/demo.tsx +0 -0
  855. /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +0 -0
  856. /package/{2 → recipes/timeline}/apps/native/src/components/advanced-ui/timeline/types.ts +0 -0
  857. /package/{2 → recipes/wake-word}/apps/native/scripts/download-vosk-model.mjs +0 -0
@@ -5,8 +5,23 @@ import { validateSignature, validateTarget } from '../core/validate.js';
5
5
  import { getToken, getDeviceInfo } from '../core/auth.js';
6
6
  import { fetchRecipe, downloadZip } from '../core/http.js';
7
7
  import { addEntry, getEntry, FileEntry } from '../core/journal.js';
8
- import { copyTree, readFileContent } from '../core/fsx.js';
9
- import { insertNavLinkNative, insertNavLinkWeb } from '../core/codemod.js';
8
+ import { copyTree, readFileContent, exists } from '../core/fsx.js';
9
+ import { addEnvVars, hasEnvKey, type EnvVar as CoreEnvVar } from '../core/env.js';
10
+ import {
11
+ insertEnvSnippets,
12
+ insertNavLinkNative,
13
+ insertNavLinkWeb,
14
+ ENV_BUILD_TIME_ENV_END,
15
+ ENV_BUILD_TIME_ENV_START,
16
+ ENV_BUILD_TIME_SCHEMA_END,
17
+ ENV_BUILD_TIME_SCHEMA_START,
18
+ ENV_CLIENT_ENV_END,
19
+ ENV_CLIENT_ENV_START,
20
+ ENV_CLIENT_SCHEMA_END,
21
+ ENV_CLIENT_SCHEMA_START,
22
+ ENV_CONSTANTS_END,
23
+ ENV_CONSTANTS_START,
24
+ } from '../core/codemod.js';
10
25
  import { join, resolve } from 'path';
11
26
  import { ensureWithinBase } from '../core/pathGuard.js';
12
27
  import { extractZipSafe } from '../core/archive.js';
@@ -16,6 +31,22 @@ import { detectTarget } from '../core/detect.js';
16
31
  import { withSpinner } from '../core/spinner.js';
17
32
  import { showCommandHint } from '../core/errors.js';
18
33
 
34
+ interface EnvSchema {
35
+ constants?: string[];
36
+ client?: {
37
+ schema?: string[];
38
+ env?: string[];
39
+ };
40
+ buildTime?: {
41
+ schema?: string[];
42
+ env?: string[];
43
+ };
44
+ }
45
+
46
+ interface RecipeConfiguration {
47
+ env?: EnvSchema;
48
+ }
49
+
19
50
  interface RecipeManifest {
20
51
  name: string;
21
52
  version: string;
@@ -32,6 +63,9 @@ interface RecipeManifest {
32
63
  description: string;
33
64
  example: string;
34
65
  link?: string;
66
+ file?: string;
67
+ value?: string;
68
+ required?: boolean;
35
69
  }>;
36
70
  manualSteps?: Array<{
37
71
  title: string;
@@ -43,12 +77,13 @@ interface RecipeManifest {
43
77
  postInstall?: {
44
78
  message?: string;
45
79
  };
80
+ configuration?: RecipeConfiguration;
46
81
  }
47
82
 
48
83
  export const addCommand = new Command('add')
49
84
  .description('Add VibeFast features, UI components, or integrations')
50
85
  .argument('[feature]', 'Feature name to install (optional - will show interactive menu if omitted)')
51
- .option('--target <target>', 'Target platform (native or web)', 'native')
86
+ .option('--target <target>', 'Target platform (native or web)')
52
87
  .option('--dry-run', 'Preview changes without applying')
53
88
  .option('--force', 'Overwrite existing files without asking')
54
89
  .option('--yes', 'Answer yes to all prompts (for automation)')
@@ -186,8 +221,180 @@ async function installFeature(feature: string, options: any, paths: any) {
186
221
  log.error('Could not auto-detect target (native/web)');
187
222
  log.info('Please specify with --target native or --target web');
188
223
  process.exit(1);
189
- }
224
+ }
225
+ }
226
+
227
+ type EnvGroup = {
228
+ path: string;
229
+ relativePath: string;
230
+ vars: NonNullable<RecipeManifest['env']>;
231
+ };
232
+
233
+ function groupEnvVars(env: RecipeManifest['env'] | undefined, cwd: string): EnvGroup[] {
234
+ if (!env?.length) {
235
+ return [];
236
+ }
237
+
238
+ const groups = new Map<string, EnvGroup>();
239
+
240
+ for (const envVar of env) {
241
+ const relativePath = envVar.file ?? 'apps/native/.env.local';
242
+ const resolvedPath = resolve(cwd, relativePath);
243
+ const existing = groups.get(resolvedPath);
244
+
245
+ if (existing) {
246
+ existing.vars.push(envVar);
247
+ } else {
248
+ groups.set(resolvedPath, {
249
+ path: resolvedPath,
250
+ relativePath,
251
+ vars: [envVar],
252
+ });
253
+ }
254
+ }
255
+
256
+ return [...groups.values()];
257
+ }
258
+
259
+ async function ensureEnvVarsForGroups(
260
+ envGroups: EnvGroup[],
261
+ options: any,
262
+ ): Promise<Array<{ relativePath: string; added: string[] }>> {
263
+ const summary: Array<{ relativePath: string; added: string[] }> = [];
264
+
265
+ for (const group of envGroups) {
266
+ const vars: CoreEnvVar[] = group.vars.map(envVar => ({
267
+ key: envVar.key,
268
+ value: envVar.value ?? envVar.example ?? '',
269
+ comment: envVar.description?.replace(/\s+/g, ' ').trim() || undefined,
270
+ }));
271
+
272
+ const result = await addEnvVars(group.path, vars, { dryRun: options.dryRun });
273
+
274
+ if (result.added.length > 0) {
275
+ summary.push({
276
+ relativePath: group.relativePath,
277
+ added: result.added,
278
+ });
279
+ }
280
+ }
281
+
282
+ return summary;
283
+ }
284
+
285
+ async function reportEnvStatus(envGroups: EnvGroup[], options: any): Promise<string[]> {
286
+ const attention: string[] = [];
287
+
288
+ for (const group of envGroups) {
289
+ const missing: typeof group.vars = [];
290
+ const existing: string[] = [];
291
+
292
+ for (const envVar of group.vars) {
293
+ const hasKey = await hasEnvKey(group.path, envVar.key);
294
+ if (hasKey) {
295
+ existing.push(envVar.key);
296
+ } else {
297
+ missing.push(envVar);
190
298
  }
299
+ }
300
+
301
+ if (missing.length > 0) {
302
+ log.plain('');
303
+ log.warn(`⚠ REQUIRED ENVIRONMENT VARIABLES (${group.relativePath}):`);
304
+ log.plain('');
305
+
306
+ missing.forEach(envVar => {
307
+ log.plain(` ${envVar.key}`);
308
+ log.plain(` ${envVar.description}`);
309
+ log.plain(` Example: ${envVar.example}`);
310
+ if (envVar.link) {
311
+ log.plain(` Get it: ${envVar.link}`);
312
+ }
313
+ log.plain('');
314
+ attention.push(`Add ${envVar.key} to ${group.relativePath}`);
315
+ });
316
+
317
+ log.info(`Add these to ${group.relativePath}`);
318
+ log.plain('');
319
+ }
320
+
321
+ if (existing.length > 0) {
322
+ log.success(`✓ Already configured (${group.relativePath}): ${existing.join(', ')}`);
323
+ log.plain('');
324
+ }
325
+ }
326
+
327
+ return attention;
328
+ }
329
+
330
+ async function applyEnvConfiguration(paths: ReturnType<typeof getPaths>, envConfig: EnvSchema, options: any) {
331
+ const envPath = join(paths.cwd, 'apps', 'native', 'env.js');
332
+
333
+ if (!(await exists(envPath))) {
334
+ return;
335
+ }
336
+
337
+ const suffix = options.dryRun ? ' (dry run)' : '';
338
+
339
+ if (envConfig.constants?.length) {
340
+ const inserted = await insertEnvSnippets(envPath, ENV_CONSTANTS_START, ENV_CONSTANTS_END, envConfig.constants, options);
341
+ if (inserted) {
342
+ log.info(`Updated env.js constants${suffix}.`);
343
+ }
344
+ }
345
+
346
+ if (envConfig.client?.schema?.length) {
347
+ const inserted = await insertEnvSnippets(
348
+ envPath,
349
+ ENV_CLIENT_SCHEMA_START,
350
+ ENV_CLIENT_SCHEMA_END,
351
+ envConfig.client.schema,
352
+ options,
353
+ );
354
+ if (inserted) {
355
+ log.info(`Updated env.js client schema definitions${suffix}.`);
356
+ }
357
+ }
358
+
359
+ if (envConfig.client?.env?.length) {
360
+ const inserted = await insertEnvSnippets(
361
+ envPath,
362
+ ENV_CLIENT_ENV_START,
363
+ ENV_CLIENT_ENV_END,
364
+ envConfig.client.env,
365
+ options,
366
+ );
367
+ if (inserted) {
368
+ log.info(`Updated env.js client env exports${suffix}.`);
369
+ }
370
+ }
371
+
372
+ if (envConfig.buildTime?.schema?.length) {
373
+ const inserted = await insertEnvSnippets(
374
+ envPath,
375
+ ENV_BUILD_TIME_SCHEMA_START,
376
+ ENV_BUILD_TIME_SCHEMA_END,
377
+ envConfig.buildTime.schema,
378
+ options,
379
+ );
380
+ if (inserted) {
381
+ log.info(`Updated env.js build-time schema${suffix}.`);
382
+ }
383
+ }
384
+
385
+ if (envConfig.buildTime?.env?.length) {
386
+ const inserted = await insertEnvSnippets(
387
+ envPath,
388
+ ENV_BUILD_TIME_ENV_START,
389
+ ENV_BUILD_TIME_ENV_END,
390
+ envConfig.buildTime.env,
391
+ options,
392
+ );
393
+ if (inserted) {
394
+ log.info(`Updated env.js build-time exports${suffix}.`);
395
+ }
396
+ }
397
+ }
191
398
 
192
399
  // Validate setup
193
400
  const config = await validateSignature(paths.signatureFile);
@@ -348,6 +555,8 @@ async function installFeature(feature: string, options: any, paths: any) {
348
555
  }
349
556
 
350
557
  log.info(`Installing ${manifest.name} v${manifest.version}...`);
558
+ const envGroups = groupEnvVars(manifest.env, paths.cwd);
559
+ let envAttention: string[] = [];
351
560
 
352
561
  // Copy files with interactive confirmation
353
562
  const copiedFiles: string[] = [];
@@ -561,6 +770,10 @@ async function installFeature(feature: string, options: any, paths: any) {
561
770
  );
562
771
  }
563
772
 
773
+ if (manifest.configuration?.env) {
774
+ await applyEnvConfiguration(paths, manifest.configuration.env, options);
775
+ }
776
+
564
777
  // Show manual steps with smart detection
565
778
  if (manifest.manualSteps && !options.dryRun) {
566
779
  const { readFileContent, exists } = await import('../core/fsx.js');
@@ -625,48 +838,21 @@ async function installFeature(feature: string, options: any, paths: any) {
625
838
  }
626
839
  }
627
840
 
628
- // Show environment variables with smart detection
629
- if (manifest.env && !options.dryRun) {
630
- const { hasEnvKey } = await import('../core/env.js');
631
- const { join } = await import('path');
632
- const envPath = join(paths.cwd, '.env');
633
-
634
- const missing: typeof manifest.env = [];
635
- const existing: string[] = [];
636
-
637
- // Check which vars already exist
638
- for (const envVar of manifest.env) {
639
- const exists = await hasEnvKey(envPath, envVar.key);
640
- if (exists) {
641
- existing.push(envVar.key);
642
- } else {
643
- missing.push(envVar);
644
- }
645
- }
646
-
647
- if (missing.length > 0) {
648
- log.plain('');
649
- log.warn('⚠ REQUIRED ENVIRONMENT VARIABLES:');
841
+ if (envGroups.length > 0) {
842
+ const additions = await ensureEnvVarsForGroups(envGroups, options);
843
+
844
+ if (additions.length > 0) {
650
845
  log.plain('');
651
-
652
- missing.forEach(envVar => {
653
- log.plain(` ${envVar.key}`);
654
- log.plain(` ${envVar.description}`);
655
- log.plain(` Example: ${envVar.example}`);
656
- if (envVar.link) {
657
- log.plain(` Get it: ${envVar.link}`);
658
- }
659
- log.plain('');
846
+ const suffix = options.dryRun ? ' (dry run)' : '';
847
+ log.info(`✅ Placeholder environment variables added${suffix}:`);
848
+ additions.forEach(({ relativePath, added }) => {
849
+ log.plain(`${relativePath}: ${added.join(', ')}`);
660
850
  });
661
-
662
- log.info('Add these to your .env file');
663
- log.plain('');
664
- }
665
-
666
- if (existing.length > 0) {
667
- log.success(`✓ Already configured: ${existing.join(', ')}`);
851
+ log.info('Update those files with your real API keys or secrets.');
668
852
  log.plain('');
669
853
  }
854
+
855
+ envAttention = await reportEnvStatus(envGroups, options);
670
856
  }
671
857
 
672
858
  // Post-install message
@@ -679,18 +865,8 @@ async function installFeature(feature: string, options: any, paths: any) {
679
865
  if (!options.dryRun) {
680
866
  const needsAttention: string[] = [];
681
867
 
682
- // Check env vars
683
- if (manifest.env) {
684
- const { hasEnvKey } = await import('../core/env.js');
685
- const { join } = await import('path');
686
- const envPath = join(paths.cwd, '.env');
687
-
688
- for (const envVar of manifest.env) {
689
- const exists = await hasEnvKey(envPath, envVar.key);
690
- if (!exists) {
691
- needsAttention.push(`Add ${envVar.key} to .env`);
692
- }
693
- }
868
+ if (envGroups.length > 0 && envAttention.length > 0) {
869
+ needsAttention.push(...envAttention);
694
870
  }
695
871
 
696
872
  // Check manual steps
@@ -21,7 +21,7 @@ interface InitOptions {
21
21
  export const initCommand = new Command('init')
22
22
  .description('Initialize a new VibeFast project')
23
23
  .option('--license <key>', 'Your VibeFast license key')
24
- .option('--branch <branch>', 'Branch to clone (clean or main)')
24
+ .option('--branch <branch>', 'Branch to clone (clean or main, default: clean)')
25
25
  .option('--yes', 'Skip all prompts and use defaults')
26
26
  .option('--skip-install', 'Skip dependency installation')
27
27
  .action(async (options: InitOptions) => {
@@ -93,8 +93,12 @@ export const initCommand = new Command('init')
93
93
  log.plain('');
94
94
  }
95
95
 
96
- // Always use clean branch for cloning
97
- const branch = 'clean';
96
+ // Validate branch option and default to clean
97
+ const branch = options.branch === 'main' ? 'main' : 'clean';
98
+ if (options.branch && options.branch !== 'clean' && options.branch !== 'main') {
99
+ log.error('Invalid branch. Use "clean" or "main".');
100
+ process.exit(1);
101
+ }
98
102
 
99
103
  // Step 1.5: Choose platforms
100
104
  let platforms: string[] = ['native', 'web'];
@@ -146,6 +150,15 @@ export const initCommand = new Command('init')
146
150
  'Project name: '
147
151
  ) || defaultName;
148
152
  }
153
+ projectName = (projectName || defaultName).trim();
154
+ if (!projectName) {
155
+ projectName = defaultName;
156
+ }
157
+
158
+ if (!/^[a-zA-Z0-9_-]+$/.test(projectName)) {
159
+ log.error('Project name must use only letters, numbers, hyphens, and underscores.');
160
+ process.exit(1);
161
+ }
149
162
 
150
163
  // Validate project name
151
164
  if (existsSync(projectName)) {
@@ -165,13 +178,13 @@ export const initCommand = new Command('init')
165
178
  const repoUrl = 'https://github.com/mzafarr/vibefast-pro.git';
166
179
 
167
180
  await withSpinner(
168
- `Cloning VibeFast monorepo (clean starter)...`,
181
+ `Cloning VibeFast monorepo (${branch} branch)...`,
169
182
  async () => {
170
183
  const git = simpleGit();
171
184
  const cloneOptions = ['--depth', '1'];
172
185
 
173
- // Always use clean branch
174
- cloneOptions.unshift('--branch', 'clean', '--single-branch');
186
+ // Use selected branch (default: clean)
187
+ cloneOptions.unshift('--branch', branch, '--single-branch');
175
188
 
176
189
  try {
177
190
  await git.clone(repoUrl, projectName, cloneOptions);
@@ -430,109 +443,112 @@ export const initCommand = new Command('init')
430
443
  log.plain('');
431
444
 
432
445
  // We need to be in the project directory for feature installation
446
+ const originalCwd = process.cwd();
433
447
  process.chdir(projectPath);
434
448
 
435
- for (const featureName of selectedFeatures) {
436
- try {
437
- log.plain('');
438
- log.plain(''.repeat(60));
439
- log.info(`Installing ${featureName}...`);
440
- log.plain('');
441
-
442
- // Import and use the add command logic
443
- const { getToken } = await import('../core/auth.js');
444
- const { fetchRecipe, downloadZip } = await import('../core/http.js');
445
- const { extractZipSafe } = await import('../core/archive.js');
446
- const { copyTree, readFileContent } = await import('../core/fsx.js');
447
- const { addEntry } = await import('../core/journal.js');
448
- const { hashFiles } = await import('../core/hash.js');
449
- const { insertNavLinkNative } = await import('../core/codemod.js');
450
- const { getDeviceInfo } = await import('../core/auth.js');
451
- const { validateSignature } = await import('../core/validate.js');
452
- const { getPaths } = await import('../core/paths.js');
453
-
454
- const paths = getPaths();
455
- const token = await getToken();
456
- const device = await getDeviceInfo();
457
- const config = await validateSignature(paths.signatureFile);
458
-
459
- // Fetch recipe
460
- const response = await fetchRecipe({
461
- token: token!,
462
- device,
463
- feature: featureName,
464
- target: 'native',
465
- starter: { name: config.name, version: config.version },
466
- });
467
-
468
- if (!response.ok || (!response.signedUrl && !response.zipData)) {
469
- log.warn(`⚠ Could not fetch ${featureName}: ${response.error || 'Unknown error'}`);
449
+ try {
450
+ for (const featureName of selectedFeatures) {
451
+ try {
452
+ log.plain('');
453
+ log.plain('━'.repeat(60));
454
+ log.info(`Installing ${featureName}...`);
455
+ log.plain('');
456
+
457
+ // Import and use the add command logic
458
+ const { getToken } = await import('../core/auth.js');
459
+ const { fetchRecipe, downloadZip } = await import('../core/http.js');
460
+ const { extractZipSafe } = await import('../core/archive.js');
461
+ const { copyTree, readFileContent } = await import('../core/fsx.js');
462
+ const { addEntry } = await import('../core/journal.js');
463
+ const { hashFiles } = await import('../core/hash.js');
464
+ const { insertNavLinkNative } = await import('../core/codemod.js');
465
+ const { getDeviceInfo } = await import('../core/auth.js');
466
+ const { validateSignature } = await import('../core/validate.js');
467
+ const { getPaths } = await import('../core/paths.js');
468
+
469
+ const paths = getPaths();
470
+ const token = await getToken();
471
+ const device = await getDeviceInfo();
472
+ const config = await validateSignature(paths.signatureFile);
473
+
474
+ // Fetch recipe
475
+ const response = await fetchRecipe({
476
+ token: token!,
477
+ device,
478
+ feature: featureName,
479
+ target: 'native',
480
+ starter: { name: config.name, version: config.version },
481
+ });
482
+
483
+ if (!response.ok || (!response.signedUrl && !response.zipData)) {
484
+ log.warn(`⚠ Could not fetch ${featureName}: ${response.error || 'Unknown error'}`);
485
+ log.info(`You can install it later with: vf add ${featureName}`);
486
+ continue;
487
+ }
488
+
489
+ // Download and extract
490
+ const zipPath = response.zipData
491
+ ? await downloadZip(response.zipData, true)
492
+ : await downloadZip(response.signedUrl!);
493
+
494
+ const extractDir = zipPath.replace('.zip', '');
495
+ await extractZipSafe(zipPath, extractDir);
496
+
497
+ // Read manifest
498
+ const manifestPath = join(extractDir, 'recipe.json');
499
+ const manifestContent = await readFileContent(manifestPath);
500
+ const manifest = JSON.parse(manifestContent);
501
+
502
+ // Copy files
503
+ const copiedFiles: string[] = [];
504
+ const { resolve: resolvePath } = await import('path');
505
+ for (const copySpec of manifest.copy) {
506
+ const srcPath = resolvePath(extractDir, copySpec.from);
507
+ const destPath = resolvePath(projectPath, copySpec.to);
508
+ const result = await copyTree(srcPath, destPath, { force: true });
509
+ copiedFiles.push(...result.files);
510
+ }
511
+
512
+ // Add navigation
513
+ let navInserted = false;
514
+ if (manifest.nav) {
515
+ navInserted = await insertNavLinkNative(paths.nativeNavFile, manifest.nav, {});
516
+ }
517
+
518
+ // Hash and journal
519
+ const fileHashes = await hashFiles(copiedFiles);
520
+ const fileEntries = Array.from(fileHashes.entries()).map(([path, hash]) => ({
521
+ path,
522
+ hash,
523
+ }));
524
+
525
+ await addEntry(paths.journalFile, {
526
+ feature: manifest.name,
527
+ target: manifest.target,
528
+ files: fileEntries,
529
+ insertedNav: navInserted,
530
+ navHref: manifest.nav?.href,
531
+ navLabel: manifest.nav?.label,
532
+ ts: Date.now(),
533
+ manifest: {
534
+ version: manifest.version,
535
+ manualSteps: manifest.manualSteps,
536
+ env: manifest.env,
537
+ },
538
+ });
539
+
540
+ log.success(`✓ ${featureName} installed successfully!`);
541
+
542
+ } catch (error: any) {
543
+ log.warn(`⚠ Failed to install ${featureName}: ${error.message}`);
470
544
  log.info(`You can install it later with: vf add ${featureName}`);
471
- continue;
472
- }
473
-
474
- // Download and extract
475
- const zipPath = response.zipData
476
- ? await downloadZip(response.zipData, true)
477
- : await downloadZip(response.signedUrl!);
478
-
479
- const extractDir = zipPath.replace('.zip', '');
480
- await extractZipSafe(zipPath, extractDir);
481
-
482
- // Read manifest
483
- const manifestPath = join(extractDir, 'recipe.json');
484
- const manifestContent = await readFileContent(manifestPath);
485
- const manifest = JSON.parse(manifestContent);
486
-
487
- // Copy files
488
- const copiedFiles: string[] = [];
489
- const { resolve: resolvePath } = await import('path');
490
- for (const copySpec of manifest.copy) {
491
- const srcPath = resolvePath(extractDir, copySpec.from);
492
- const destPath = resolvePath(projectPath, copySpec.to);
493
- const result = await copyTree(srcPath, destPath, { force: true });
494
- copiedFiles.push(...result.files);
495
- }
496
-
497
- // Add navigation
498
- let navInserted = false;
499
- if (manifest.nav) {
500
- navInserted = await insertNavLinkNative(paths.nativeNavFile, manifest.nav, {});
501
545
  }
502
-
503
- // Hash and journal
504
- const fileHashes = await hashFiles(copiedFiles);
505
- const fileEntries = Array.from(fileHashes.entries()).map(([path, hash]) => ({
506
- path,
507
- hash,
508
- }));
509
-
510
- await addEntry(paths.journalFile, {
511
- feature: manifest.name,
512
- target: manifest.target,
513
- files: fileEntries,
514
- insertedNav: navInserted,
515
- navHref: manifest.nav?.href,
516
- navLabel: manifest.nav?.label,
517
- ts: Date.now(),
518
- manifest: {
519
- version: manifest.version,
520
- manualSteps: manifest.manualSteps,
521
- env: manifest.env,
522
- },
523
- });
524
-
525
- log.success(`✓ ${featureName} installed successfully!`);
526
-
527
- } catch (error: any) {
528
- log.warn(`⚠ Failed to install ${featureName}: ${error.message}`);
529
- log.info(`You can install it later with: vf add ${featureName}`);
530
546
  }
547
+ } finally {
548
+ // Go back to original directory even if installation fails
549
+ process.chdir(originalCwd);
531
550
  }
532
551
 
533
- // Go back to original directory
534
- process.chdir('..');
535
-
536
552
  log.plain('');
537
553
  log.plain('━'.repeat(60));
538
554
  log.success(`✓ Installed ${selectedFeatures.length} feature(s)`);
@@ -123,7 +123,7 @@ export const removeCommand = new Command('remove')
123
123
  log.plain('');
124
124
 
125
125
  if (!options.yes) {
126
- const shouldContinue = promptYesNo(
126
+ const shouldContinue = await promptYesNo(
127
127
  'Continue with removal? (y/N): ',
128
128
  false
129
129
  );
@@ -15,7 +15,7 @@ describe('fsx', () => {
15
15
  destDir = join(testDir, 'dest');
16
16
 
17
17
  await mkdir(srcDir, { recursive: true });
18
- await mkdir(destDir, { recursive: true });
18
+ // Don't create destDir - let copyTree create it
19
19
  });
20
20
 
21
21
  afterEach(async () => {
@@ -45,6 +45,7 @@ describe('fsx', () => {
45
45
  const destFile = join(destDir, 'file.txt');
46
46
 
47
47
  await writeFile(srcFile, 'new content');
48
+ await mkdir(destDir, { recursive: true });
48
49
  await writeFile(destFile, 'existing content');
49
50
 
50
51
  try {
@@ -60,6 +61,7 @@ describe('fsx', () => {
60
61
  await writeFile(join(srcDir, 'file.txt'), 'new content');
61
62
 
62
63
  // Create existing destination file
64
+ await mkdir(destDir, { recursive: true });
63
65
  await writeFile(join(destDir, 'file.txt'), 'existing content');
64
66
 
65
67
  const result = await copyTree(srcDir, destDir, { force: true });