vibefast-cli 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/README.md +30 -95
  2. package/dist/__tests__/recipes.test.js +94 -91
  3. package/dist/__tests__/recipes.test.js.map +1 -1
  4. package/dist/commands/add.d.ts.map +1 -1
  5. package/dist/commands/add.js +301 -125
  6. package/dist/commands/add.js.map +1 -1
  7. package/dist/commands/checklist.d.ts.map +1 -1
  8. package/dist/commands/checklist.js +85 -44
  9. package/dist/commands/checklist.js.map +1 -1
  10. package/dist/commands/health.d.ts.map +1 -1
  11. package/dist/commands/health.js +13 -4
  12. package/dist/commands/health.js.map +1 -1
  13. package/dist/commands/init.d.ts.map +1 -1
  14. package/dist/commands/init.js +118 -26
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/migrate.d.ts +3 -0
  17. package/dist/commands/migrate.d.ts.map +1 -0
  18. package/dist/commands/migrate.js +202 -0
  19. package/dist/commands/migrate.js.map +1 -0
  20. package/dist/commands/remove.d.ts.map +1 -1
  21. package/dist/commands/remove.js +61 -3
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/core/auth.d.ts.map +1 -1
  24. package/dist/core/auth.js +20 -18
  25. package/dist/core/auth.js.map +1 -1
  26. package/dist/core/codemod.d.ts +33 -0
  27. package/dist/core/codemod.d.ts.map +1 -1
  28. package/dist/core/codemod.js +116 -0
  29. package/dist/core/codemod.js.map +1 -1
  30. package/dist/core/detect.d.ts.map +1 -1
  31. package/dist/core/detect.js +24 -7
  32. package/dist/core/detect.js.map +1 -1
  33. package/dist/core/journal.d.ts +1 -0
  34. package/dist/core/journal.d.ts.map +1 -1
  35. package/dist/core/journal.js.map +1 -1
  36. package/dist/core/recipes.d.ts.map +1 -1
  37. package/dist/core/recipes.js +25 -7
  38. package/dist/core/recipes.js.map +1 -1
  39. package/dist/index.js +2 -2
  40. package/dist/index.js.map +1 -1
  41. package/docs/architecture.md +50 -0
  42. package/docs/commands.md +78 -0
  43. package/docs/contributing.md +27 -0
  44. package/docs/quickstart.md +50 -0
  45. package/docs/recipes.md +57 -0
  46. package/docs/troubleshooting.md +31 -0
  47. package/package.json +2 -2
  48. package/recipes/0/apps/native/src/components/advanced-ui/timeline/demo.tsx +445 -0
  49. package/recipes/0/apps/native/src/components/advanced-ui/timeline/timeline-view.tsx +355 -0
  50. package/recipes/0/apps/native/src/components/advanced-ui/timeline/types.ts +31 -0
  51. package/recipes/0/recipe.json +18 -0
  52. package/recipes/animated-chip/apps/native/src/components/advanced-ui/chip/demo.tsx +2 -1
  53. package/recipes/animated-chip/recipe.json +5 -2
  54. package/recipes/animated-chip-native@latest.zip +0 -0
  55. package/recipes/animated-chip@latest.zip +0 -0
  56. package/recipes/animated-switch/apps/native/src/components/advanced-ui/switch/demo.tsx +1 -1
  57. package/recipes/animated-switch/recipe.json +5 -2
  58. package/recipes/animated-switch-native@latest.zip +0 -0
  59. package/recipes/animated-switch@latest.zip +0 -0
  60. package/recipes/audio-recorder/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
  61. package/recipes/audio-recorder/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -2
  62. package/recipes/audio-recorder/recipe.json +7 -2
  63. package/recipes/audio-recorder-native@latest.zip +0 -0
  64. package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/components/audio-recorder.tsx +2 -1
  65. package/recipes/audio-recorder-supabase/apps/native/src/features/audio-recorder/demo/with-recording-list-demo.tsx +2 -1
  66. package/recipes/audio-recorder-supabase/recipe.json +12 -16
  67. package/recipes/audio-recorder-supabase-native@latest.zip +0 -0
  68. package/recipes/audio-recorder-supabase@latest.zip +0 -0
  69. package/recipes/audio-recorder@latest.zip +0 -0
  70. package/recipes/charts/apps/native/src/app/charts/index.tsx +3 -0
  71. package/recipes/charts/apps/native/src/features/charts/components/bar-chart.tsx +3 -1
  72. package/recipes/charts/apps/native/src/features/charts/components/candlestick-chart.tsx +3 -1
  73. package/recipes/charts/apps/native/src/features/charts/components/column-chart.tsx +3 -1
  74. package/recipes/charts/apps/native/src/features/charts/components/doughnut-chart.tsx +3 -1
  75. package/recipes/charts/apps/native/src/features/charts/components/line-chart.tsx +3 -1
  76. package/recipes/charts/apps/native/src/features/charts/components/radar-chart.tsx +3 -1
  77. package/recipes/charts/apps/native/src/features/charts/components/stacked-bar-chart.tsx +3 -1
  78. package/recipes/charts/recipe.json +13 -4
  79. package/recipes/charts-native@latest.zip +0 -0
  80. package/recipes/charts@latest.zip +0 -0
  81. package/recipes/chatbot/apps/native/src/features/chatbot/components/chat-markdown.tsx +86 -86
  82. package/recipes/chatbot/apps/native/src/features/chatbot/components/markdown/code-block.tsx +4 -4
  83. package/recipes/chatbot/recipe.json +3 -40
  84. package/recipes/chatbot-native@latest.zip +0 -0
  85. package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/chat-markdown.tsx +4 -1
  86. package/recipes/chatbot-supabase/apps/native/src/features/chatbot/components/markdown/code-block.tsx +86 -53
  87. package/recipes/chatbot-supabase/recipe.json +3 -42
  88. package/recipes/chatbot-supabase-native@latest.zip +0 -0
  89. package/recipes/chatbot-supabase@latest.zip +0 -0
  90. package/recipes/chatbot@latest.zip +0 -0
  91. package/recipes/glowing-button/recipe.json +6 -2
  92. package/recipes/glowing-button-native@latest.zip +0 -0
  93. package/recipes/glowing-button@latest.zip +0 -0
  94. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
  95. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
  96. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
  97. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/index.tsx +50 -0
  98. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
  99. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/results.tsx +2 -0
  100. package/recipes/image-analysis/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
  101. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/analysis-options-screen.tsx +2 -2
  102. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/camera.tsx +72 -65
  103. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/image-capture-screen.tsx +65 -47
  104. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading-screen.tsx +43 -2
  105. package/recipes/image-analysis/apps/native/src/features/image-analyzer/app/loading.tsx +34 -1
  106. package/recipes/image-analysis/apps/native/src/features/image-analyzer/hooks/use-image-analysis.ts +83 -2
  107. package/recipes/image-analysis/recipe.json +11 -19
  108. package/recipes/image-analysis-native@latest.zip +0 -0
  109. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/_layout.tsx +5 -0
  110. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/analysis-options.tsx +50 -0
  111. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/camera.tsx +2 -0
  112. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/index.tsx +50 -0
  113. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/loading.tsx +50 -0
  114. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/results.tsx +2 -0
  115. package/recipes/image-analysis-supabase/apps/native/src/app/analysis/[type]/trait-details.tsx +3 -0
  116. package/recipes/image-analysis-supabase/recipe.json +10 -37
  117. package/recipes/image-analysis-supabase-native@latest.zip +0 -0
  118. package/recipes/image-analysis-supabase@latest.zip +0 -0
  119. package/recipes/image-analysis@latest.zip +0 -0
  120. package/recipes/image-analyzer/apps/native/src/app/(root)/(protected)/image-analyzer/index.tsx +2 -0
  121. package/recipes/image-generator/apps/native/src/app/image-generator/gallery.tsx +3 -0
  122. package/recipes/image-generator/apps/native/src/app/image-generator/index.tsx +3 -0
  123. package/recipes/image-generator/recipe.json +8 -18
  124. package/recipes/image-generator-native@latest.zip +0 -0
  125. package/recipes/image-generator-supabase/recipe.json +6 -35
  126. package/recipes/image-generator-supabase-native@latest.zip +0 -0
  127. package/recipes/image-generator-supabase@latest.zip +0 -0
  128. package/recipes/image-generator@latest.zip +0 -0
  129. package/recipes/ios-widget/recipe.json +18 -119
  130. package/recipes/ios-widget-native@latest.zip +0 -0
  131. package/recipes/ios-widget@latest.zip +0 -0
  132. package/recipes/number-stepper/apps/native/src/components/advanced-ui/stepper/demo.tsx +1 -1
  133. package/recipes/number-stepper/recipe.json +5 -2
  134. package/recipes/number-stepper-native@latest.zip +0 -0
  135. package/recipes/number-stepper@latest.zip +0 -0
  136. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/interactive-onboarding.tsx +11 -18
  137. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/ai-tone-step.tsx +5 -7
  138. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/currency-step.tsx +9 -7
  139. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-ai-step.tsx +8 -7
  140. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-chatbot-step.tsx +6 -5
  141. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-manual-step.tsx +4 -3
  142. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/feature-scan-step.tsx +6 -5
  143. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/main-reason-step.tsx +5 -7
  144. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/notification-step.tsx +7 -6
  145. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/overspend-step.tsx +5 -7
  146. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/personalizing-step.tsx +8 -7
  147. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/rating-step.tsx +6 -5
  148. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/reminder-step.tsx +5 -6
  149. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/safety-step.tsx +5 -4
  150. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/struggle-step.tsx +5 -7
  151. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/steps/welcome-step.tsx +7 -6
  152. package/recipes/onboarding/apps/native/src/features/onboarding/expense-tracker/components/ui/onboarding-header.tsx +4 -3
  153. package/recipes/onboarding/recipe.json +9 -6
  154. package/recipes/onboarding-native@latest.zip +0 -0
  155. package/recipes/onboarding@latest.zip +0 -0
  156. package/recipes/payments/apps/native/src/app/paywall/index.tsx +74 -0
  157. package/recipes/payments/apps/native/src/app/paywall/local.tsx +25 -0
  158. package/recipes/payments/apps/native/src/app/paywall/remote.tsx +23 -0
  159. package/recipes/payments/packages/backend/convex/payments.ts +21 -3
  160. package/recipes/payments/recipe.json +14 -34
  161. package/recipes/payments-native@latest.zip +0 -0
  162. package/recipes/payments-supabase/apps/native/src/app/paywall/index.tsx +74 -0
  163. package/recipes/payments-supabase/apps/native/src/app/paywall/local.tsx +25 -0
  164. package/recipes/payments-supabase/apps/native/src/app/paywall/remote.tsx +23 -0
  165. package/recipes/payments-supabase/recipe.json +16 -23
  166. package/recipes/payments-supabase-native@latest.zip +0 -0
  167. package/recipes/payments-supabase@latest.zip +0 -0
  168. package/recipes/payments@latest.zip +0 -0
  169. package/recipes/posthog/apps/native/src/components/analytics/navigation-tracker.tsx +14 -0
  170. package/recipes/posthog/apps/native/src/lib/hooks/use-navigation-analytics.ts +44 -0
  171. package/recipes/posthog/apps/native/src/providers/posthog-provider.tsx +51 -0
  172. package/recipes/posthog/recipe.json +60 -0
  173. package/recipes/posthog-native@latest.zip +0 -0
  174. package/recipes/progress-circle/apps/native/src/components/advanced-ui/progress-bars/progress-circle-page.tsx +1 -1
  175. package/recipes/progress-circle/recipe.json +5 -2
  176. package/recipes/progress-circle-native@latest.zip +0 -0
  177. package/recipes/progress-circle@latest.zip +0 -0
  178. package/recipes/quiz/apps/native/src/app/quiz/index.tsx +47 -0
  179. package/recipes/quiz/recipe.json +9 -6
  180. package/recipes/quiz-native@latest.zip +0 -0
  181. package/recipes/quiz@latest.zip +0 -0
  182. package/recipes/screen-kits/apps/native/src/app/screen-kits/_layout.tsx +12 -0
  183. package/recipes/screen-kits/apps/native/src/app/screen-kits/index.tsx +114 -0
  184. package/recipes/screen-kits/apps/native/src/features/screen-kits/index.ts +1 -0
  185. package/recipes/screen-kits/apps/native/src/features/screen-kits/types.ts +28 -0
  186. package/recipes/screen-kits/recipe.json +26 -0
  187. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/_layout.tsx +12 -0
  188. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/home.tsx +5 -0
  189. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/index.tsx +5 -0
  190. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-complete.tsx +5 -0
  191. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson-fail.tsx +5 -0
  192. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/lesson.tsx +5 -0
  193. package/recipes/screen-kits-duolingo/apps/native/src/app/screen-kits/duolingo/skill-tree.tsx +5 -0
  194. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/duo-button.tsx +174 -0
  195. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/skill-button.tsx +186 -0
  196. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/components/xp-header.tsx +115 -0
  197. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/constants.ts +89 -0
  198. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/index.ts +3 -0
  199. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/home-screen.tsx +225 -0
  200. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-complete-screen.tsx +485 -0
  201. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-fail-screen.tsx +105 -0
  202. package/recipes/screen-kits-duolingo/apps/native/src/features/screen-kits/duolingo/screens/lesson-screen.tsx +384 -0
  203. package/recipes/screen-kits-duolingo/recipe.json +58 -0
  204. package/recipes/screen-kits-duolingo-native@latest.zip +0 -0
  205. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/_layout.tsx +45 -0
  206. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/asset-detail.tsx +3 -0
  207. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/notifications.tsx +3 -0
  208. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/receive.tsx +3 -0
  209. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/send.tsx +3 -0
  210. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/swap.tsx +3 -0
  211. package/recipes/screen-kits-finance/apps/native/src/app/screen-kits/finance/wallet.tsx +3 -0
  212. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/ActionButtons.tsx +78 -0
  213. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/AssetRow.tsx +94 -0
  214. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/components/BalanceCard.tsx +118 -0
  215. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/constants.ts +85 -0
  216. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/asset-detail.tsx +378 -0
  217. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/notifications.tsx +210 -0
  218. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/receive-modal.tsx +317 -0
  219. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/send-modal.tsx +420 -0
  220. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/swap-modal.tsx +363 -0
  221. package/recipes/screen-kits-finance/apps/native/src/features/screen-kits/finance/screens/wallet-dashboard.tsx +281 -0
  222. package/recipes/screen-kits-finance/recipe.json +46 -0
  223. package/recipes/screen-kits-finance-native@latest.zip +0 -0
  224. package/recipes/screen-kits-fitness/apps/native/assets/sounds/timer-beep.wav +0 -0
  225. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/_layout.tsx +10 -0
  226. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/index.tsx +6 -0
  227. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/timer.tsx +3 -0
  228. package/recipes/screen-kits-fitness/apps/native/src/app/screen-kits/fitness/workout.tsx +3 -0
  229. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-components.tsx +500 -0
  230. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/timer-settings-modal.tsx +352 -0
  231. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/components/workout-card.tsx +105 -0
  232. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/constants.ts +189 -0
  233. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/hooks/use-timer.ts +307 -0
  234. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/index.ts +1 -0
  235. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/timer-screen.tsx +278 -0
  236. package/recipes/screen-kits-fitness/apps/native/src/features/screen-kits/fitness/screens/workout-dashboard.tsx +350 -0
  237. package/recipes/screen-kits-fitness/recipe.json +63 -0
  238. package/recipes/screen-kits-fitness-native@latest.zip +0 -0
  239. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/habits.tsx +1 -0
  240. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/kanban.tsx +1 -0
  241. package/recipes/screen-kits-habits/apps/native/src/app/screen-kits/productivity/routes.ts +4 -0
  242. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/AddTaskModal.tsx +246 -0
  243. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/DraggableTaskCard.tsx +92 -0
  244. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/KanbanColumn.tsx +238 -0
  245. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/TaskCard.tsx +144 -0
  246. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/components/add-habit-modal.tsx +271 -0
  247. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/constants.ts +295 -0
  248. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/kanban-utils.ts +62 -0
  249. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/habit-tracker.tsx +1160 -0
  250. package/recipes/screen-kits-habits/apps/native/src/features/screen-kits/productivity/screens/kanban-board.tsx +432 -0
  251. package/recipes/screen-kits-habits/recipe.json +52 -0
  252. package/recipes/screen-kits-habits-native@latest.zip +0 -0
  253. package/recipes/screen-kits-native@latest.zip +0 -0
  254. package/recipes/sentry/apps/native/src/providers/sentry-provider.tsx +64 -0
  255. package/recipes/sentry/recipe.json +39 -0
  256. package/recipes/sentry-native@latest.zip +0 -0
  257. package/recipes/swipe-slider/apps/native/src/components/advanced-ui/sliders/swipe-slider-page.tsx +1 -1
  258. package/recipes/swipe-slider/recipe.json +5 -2
  259. package/recipes/swipe-slider-native@latest.zip +0 -0
  260. package/recipes/swipe-slider@latest.zip +0 -0
  261. package/recipes/timeline/apps/native/src/components/advanced-ui/timeline/demo.tsx +2 -1
  262. package/recipes/timeline/recipe.json +5 -2
  263. package/recipes/timeline-native@latest.zip +0 -0
  264. package/recipes/timeline@latest.zip +0 -0
  265. package/recipes/tracker-app/apps/native/src/app/tracker-app/index.tsx +1 -0
  266. package/recipes/tracker-app/recipe.json +10 -7
  267. package/recipes/tracker-app-native@latest.zip +0 -0
  268. package/recipes/tracker-app@latest.zip +0 -0
  269. package/recipes/upload-all.sh +8 -31
  270. package/recipes/voice-bot/apps/native/src/app/voice-bot/index.tsx +56 -0
  271. package/recipes/voice-bot/recipe.json +31 -7
  272. package/recipes/voice-bot-native@latest.zip +0 -0
  273. package/recipes/voice-bot@latest.zip +0 -0
  274. package/recipes/wake-word/apps/native/src/app/{(root)/(protected)/test-wake-word.tsx → test-wake-word.tsx} +43 -4
  275. package/recipes/wake-word/recipe.json +16 -26
  276. package/recipes/wake-word-native@latest.zip +0 -0
  277. package/recipes/wake-word@latest.zip +0 -0
  278. package/scripts/create-advanced-ui-recipes.sh +46 -19
  279. package/scripts/create-recipes.mjs +471 -117
  280. package/scripts/package-recipes.mjs +76 -0
  281. package/scripts/publish-all.sh +6 -2
  282. package/CHANGELOG.md +0 -198
  283. package/docs/archive/AUTO-DETECT-DEPS.md +0 -607
  284. package/docs/archive/FINAL-PACKAGE-STRATEGY.md +0 -583
  285. package/docs/archive/FINAL-SIMPLE-PLAN.md +0 -487
  286. package/docs/archive/FINAL-STATUS.md +0 -144
  287. package/docs/archive/FLOW-DIAGRAM.md +0 -1629
  288. package/docs/archive/GOTCHAS-AND-RISKS.md +0 -801
  289. package/docs/archive/IMPLEMENTATION-PLAN.md +0 -1360
  290. package/docs/archive/PLAN.md +0 -453
  291. package/docs/archive/PRODUCTION-READINESS.md +0 -684
  292. package/docs/archive/PRODUCTION-TEST-RESULTS.md +0 -465
  293. package/docs/archive/SIMPLIFIED-PLAN.md +0 -578
  294. package/docs/archive/STATUS.md +0 -199
  295. package/docs/archive/SUCCESS.md +0 -259
  296. package/docs/archive/TEST-SUMMARY.md +0 -261
  297. package/docs/archive/TESTING-CHECKLIST.md +0 -450
  298. package/docs/archive/USER-MODIFICATIONS.md +0 -448
  299. package/docs/decisions.md +0 -55
  300. package/docs/manual-testing.md +0 -91
  301. package/docs/next-steps.md +0 -12
  302. package/recipes/README.md +0 -156
  303. package/recipes/audio-recorder-supabase/packages/backend/src/services/recordings.ts +0 -369
  304. package/recipes/chatbot/apps/native/src/api-client/chatbot.ts +0 -83
  305. package/recipes/chatbot/packages/backend/convex/agents.ts +0 -115
  306. package/recipes/chatbot/packages/backend/convex/tools/index.ts +0 -18
  307. package/recipes/chatbot/packages/backend/convex/tools/knowledgeRetrieval.ts +0 -97
  308. package/recipes/chatbot/packages/backend/convex/tools/tavilySearch.ts +0 -83
  309. package/recipes/chatbot/packages/backend/convex/tools/userProfile.ts +0 -72
  310. package/recipes/chatbot-supabase/apps/native/src/api-client/supabase/chatbot.ts +0 -515
  311. package/recipes/chatbot-supabase/packages/backend/src/services/conversations.ts +0 -243
  312. package/recipes/chatbot-supabase/packages/backend/src/services/messages.ts +0 -327
  313. package/recipes/image-analysis/apps/native/src/api-client/image-analyzer.ts +0 -62
  314. package/recipes/image-analysis-supabase/packages/backend/src/services/image-analyses.ts +0 -132
  315. package/recipes/image-generator/apps/native/src/api-client/image-generator.ts +0 -34
  316. package/recipes/payments/apps/native/src/api-client/payments.ts +0 -44
  317. package/recipes/payments-supabase/packages/backend/src/services/payments.ts +0 -201
  318. package/recipes/posthog.json +0 -47
  319. package/recipes/revenuecat.json +0 -43
  320. package/recipes/sentry.json +0 -47
  321. package/recipes/wake-word/apps/native/assets/vosk-model/README.md +0 -103
  322. package/recipes/wake-word/apps/native/scripts/download-vosk-model.mjs +0 -127
  323. /package/recipes/{audio-recorder/apps/native/src/app/(root)/(protected) → audio-recorder-supabase/apps/native/src/app}/audio-recorder/index.tsx +0 -0
  324. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/AppIntent.swift +0 -0
  325. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png +0 -0
  326. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png +0 -0
  327. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png +0 -0
  328. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png +0 -0
  329. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png +0 -0
  330. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png +0 -0
  331. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png +0 -0
  332. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png +0 -0
  333. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png +0 -0
  334. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png +0 -0
  335. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png +0 -0
  336. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png +0 -0
  337. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png +0 -0
  338. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png +0 -0
  339. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  340. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png +0 -0
  341. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/CalorieTrackerWidget.swift +0 -0
  342. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/HabitTrackerWidget.swift +0 -0
  343. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/Info.plist +0 -0
  344. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/WidgetLiveActivity.swift +0 -0
  345. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/expo-target.config.js +0 -0
  346. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/generated.entitlements +0 -0
  347. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/index.swift +0 -0
  348. /package/recipes/ios-widget/{targets → apps/native/targets}/widget/widgets.swift +0 -0
@@ -1,450 +0,0 @@
1
- # 🧪 VibeFast CLI - Complete Testing Checklist
2
-
3
- ## ⚠️ Current Test Status
4
-
5
- ### ✅ What's Been Tested
6
- - [x] CLI builds successfully
7
- - [x] Worker deploys to Cloudflare
8
- - [x] Token authentication works
9
- - [x] Recipe download from R2 works
10
- - [x] File copying works (17 files)
11
- - [x] Watermarking works
12
- - [x] Journal tracking works
13
- - [x] Feature installation works
14
- - [x] File deletion works
15
-
16
- ### ⚠️ What Needs Testing
17
- - [ ] Navigation injection (Option 3 - in progress)
18
- - [ ] Navigation removal
19
- - [ ] All edge cases below
20
-
21
- ---
22
-
23
- ## 📋 Complete Test Matrix
24
-
25
- ### 1. Authentication Tests
26
-
27
- #### ✅ Login Command
28
- - [x] `vf login --token VALID_TOKEN` → Success
29
- - [ ] `vf login --token INVALID_TOKEN` → Error message
30
- - [ ] `vf login --token ""` → Error message
31
- - [ ] `vf login` (no token) → Error message
32
- - [ ] Token persists across CLI runs
33
- - [ ] Token stored securely in `~/.vibefast/config.json`
34
-
35
- #### ✅ Logout Command
36
- - [x] `vf logout` → Clears token
37
- - [ ] `vf logout` when not logged in → Graceful message
38
- - [ ] Commands fail after logout
39
-
40
- #### Device Management
41
- - [ ] `vf devices` → Lists active devices
42
- - [ ] `vf devices` with no devices → Shows empty list
43
- - [ ] `vf devices --deactivate <id>` → Removes device
44
- - [ ] `vf devices --deactivate INVALID_ID` → Error message
45
- - [ ] Device ID stable across runs
46
- - [ ] Device ID unique per machine
47
-
48
- ---
49
-
50
- ### 2. Setup Validation Tests
51
-
52
- #### Doctor Command
53
- - [x] `vf doctor` in VibeFast repo → All checks pass
54
- - [ ] `vf doctor` in non-VibeFast repo → Error
55
- - [ ] `vf doctor` without `.vibefast/starter.json` → Error
56
- - [ ] `vf doctor` with invalid starter.json → Error
57
- - [ ] `vf doctor` without login → Shows not logged in
58
- - [ ] `vf doctor` with missing nav markers → Warning
59
-
60
- #### Repository Validation
61
- - [ ] Detects missing signature file
62
- - [ ] Validates signature name is "vibefast"
63
- - [ ] Validates targets array exists
64
- - [ ] Validates targets array not empty
65
-
66
- ---
67
-
68
- ### 3. Recipe Listing Tests
69
-
70
- #### List Command
71
- - [x] `vf list` → Shows all recipes
72
- - [ ] `vf list` without login → Error
73
- - [ ] `vf list` with invalid token → Error
74
- - [ ] `vf list` groups by native/web
75
- - [ ] `vf list` shows descriptions
76
- - [ ] `vf list` when no recipes → Shows empty message
77
-
78
- ---
79
-
80
- ### 4. Feature Installation Tests
81
-
82
- #### Basic Installation
83
- - [x] `vf add charts` → Installs successfully
84
- - [x] Files copied to correct locations (17 files)
85
- - [x] Watermark added to files
86
- - [x] Journal updated
87
- - [ ] Navigation added correctly
88
- - [ ] Re-running `vf add charts` → "Already installed" message
89
-
90
- #### Installation with Options
91
- - [ ] `vf add charts --dry-run` → Shows what would happen, no changes
92
- - [ ] `vf add charts --force` → Overwrites existing files
93
- - [ ] `vf add charts --target native` → Installs for native
94
- - [ ] `vf add charts --target web` → Installs for web
95
- - [ ] `vf add charts --target invalid` → Error message
96
-
97
- #### Edge Cases
98
- - [ ] Install when not logged in → Error
99
- - [ ] Install invalid feature → Error from worker
100
- - [ ] Install when device limit reached → Error
101
- - [ ] Install when rate limited → Error with retry message
102
- - [ ] Install with network error → Graceful error
103
- - [ ] Install when disk full → Error
104
- - [ ] Install when no write permissions → Error
105
- - [ ] Install feature that's already installed → Idempotent (no-op)
106
-
107
- #### Multiple Installations
108
- - [ ] Install charts, then chatbot → Both work
109
- - [ ] Install 5 features in a row → All tracked in journal
110
- - [ ] Install, remove, reinstall → Works correctly
111
-
112
- ---
113
-
114
- ### 5. Feature Removal Tests
115
-
116
- #### Basic Removal
117
- - [x] `vf remove charts` → Removes successfully
118
- - [x] Files deleted (17 files)
119
- - [ ] Navigation removed correctly
120
- - [x] Journal updated
121
- - [ ] Re-running `vf remove charts` → "Not installed" message
122
-
123
- #### Removal with Options
124
- - [ ] `vf remove charts --dry-run` → Shows what would happen
125
- - [ ] `vf remove charts --target native` → Removes from native
126
- - [ ] `vf remove charts --target web` → Removes from web
127
-
128
- #### Edge Cases
129
- - [ ] Remove feature that's not installed → Graceful message
130
- - [ ] Remove when files manually deleted → Handles gracefully
131
- - [ ] Remove when journal corrupted → Error or recovery
132
- - [ ] Remove when no write permissions → Error
133
-
134
- ---
135
-
136
- ### 6. Worker/Backend Tests
137
-
138
- #### Token Validation
139
- - [x] Valid token → Accepted
140
- - [ ] Invalid token → 403 error
141
- - [ ] Revoked token → 403 error
142
- - [ ] Expired token (if implemented) → 403 error
143
-
144
- #### Device Slot Management
145
- - [ ] First device → Registered automatically
146
- - [ ] Second device → Registered automatically
147
- - [ ] Third device → Rejected (limit reached)
148
- - [ ] Deactivate device → Slot freed
149
- - [ ] Same device multiple requests → Not counted twice
150
-
151
- #### Rate Limiting
152
- - [ ] 30 requests in 1 minute → All succeed
153
- - [ ] 31st request in 1 minute → 429 error
154
- - [ ] Wait 1 minute → Rate limit resets
155
- - [ ] 500 requests in 1 day → All succeed
156
- - [ ] 501st request in 1 day → 429 error
157
-
158
- #### Recipe Delivery
159
- - [x] Valid recipe request → Returns base64 zip
160
- - [ ] Invalid recipe name → 404 error
161
- - [ ] Recipe not in R2 → 404 error
162
- - [ ] Corrupted zip in R2 → Error
163
- - [ ] Large recipe (>10MB) → Works
164
- - [ ] Recipe with special characters → Works
165
-
166
- ---
167
-
168
- ### 7. File System Tests
169
-
170
- #### File Operations
171
- - [x] Copy files to new location → Success
172
- - [ ] Copy files to existing location without --force → Error
173
- - [ ] Copy files to existing location with --force → Overwrites
174
- - [ ] Copy preserves file permissions → Verified
175
- - [ ] Copy handles symlinks → Verified
176
- - [ ] Copy handles large files (>100MB) → Success
177
-
178
- #### Directory Operations
179
- - [ ] Create nested directories → Success
180
- - [ ] Handle existing directories → No error
181
- - [ ] Clean up temp files after install → Verified
182
- - [ ] Clean up temp files after error → Verified
183
-
184
- #### Watermarking
185
- - [x] Watermark added to .ts files → Verified
186
- - [x] Watermark added to .tsx files → Verified
187
- - [ ] Watermark added to .js files → Verified
188
- - [ ] Watermark added to .jsx files → Verified
189
- - [ ] Watermark NOT added to .json files → Verified
190
- - [ ] Watermark NOT added to .md files → Verified
191
- - [ ] Watermark format correct → `// vibefast license: hash-device`
192
-
193
- ---
194
-
195
- ### 8. Navigation Injection Tests
196
-
197
- #### Native (Option 3 - vibefast-features.ts)
198
- - [ ] First feature added → Array created correctly
199
- - [ ] Second feature added → Appended to array
200
- - [ ] Feature object has all required fields
201
- - [ ] Feature object syntax valid TypeScript
202
- - [ ] Import statement works in index.tsx
203
- - [ ] Features render in app
204
-
205
- #### Web
206
- - [ ] Feature card added to page.tsx
207
- - [ ] Multiple features added correctly
208
- - [ ] Syntax valid React/JSX
209
-
210
- #### Removal
211
- - [ ] Remove feature → Removed from array
212
- - [ ] Remove last feature → Array becomes empty
213
- - [ ] Remove middle feature → Array stays valid
214
- - [ ] Remove when manually edited → Handles gracefully
215
-
216
- ---
217
-
218
- ### 9. Journal Tests
219
-
220
- #### Journal Creation
221
- - [ ] First install → Creates `.vibefast/journal.json`
222
- - [ ] Journal has correct structure
223
- - [ ] Journal is valid JSON
224
-
225
- #### Journal Updates
226
- - [x] Install feature → Entry added
227
- - [x] Remove feature → Entry removed
228
- - [ ] Install multiple features → Multiple entries
229
- - [ ] Reinstall feature → Entry updated, not duplicated
230
-
231
- #### Journal Edge Cases
232
- - [ ] Corrupted journal → Recovers or errors gracefully
233
- - [ ] Missing journal → Creates new one
234
- - [ ] Journal with unknown fields → Ignores them
235
- - [ ] Very large journal (100+ entries) → Still works
236
-
237
- ---
238
-
239
- ### 10. Error Handling Tests
240
-
241
- #### Network Errors
242
- - [ ] Worker unreachable → Clear error message
243
- - [ ] Timeout during download → Retry or error
244
- - [ ] Partial download → Error and cleanup
245
- - [ ] DNS failure → Clear error message
246
-
247
- #### File System Errors
248
- - [ ] No write permission → Clear error message
249
- - [ ] Disk full → Clear error message
250
- - [ ] File locked by another process → Error
251
- - [ ] Path too long → Error
252
-
253
- #### Data Errors
254
- - [ ] Corrupted zip file → Error message
255
- - [ ] Invalid recipe.json → Error message
256
- - [ ] Missing recipe.json → Error message
257
- - [ ] Invalid JSON in recipe → Error message
258
-
259
- #### User Errors
260
- - [ ] Typo in feature name → Helpful suggestion
261
- - [ ] Wrong target specified → Clear error
262
- - [ ] Command in wrong directory → Clear error
263
- - [ ] Missing required arguments → Help message
264
-
265
- ---
266
-
267
- ### 11. Cross-Platform Tests
268
-
269
- #### macOS (Your Current Platform)
270
- - [x] All commands work
271
- - [x] File paths correct
272
- - [x] Device ID generation works
273
-
274
- #### Linux
275
- - [ ] All commands work
276
- - [ ] File paths correct
277
- - [ ] Device ID generation works
278
- - [ ] Permissions handled correctly
279
-
280
- #### Windows
281
- - [ ] All commands work
282
- - [ ] File paths correct (backslashes)
283
- - [ ] Device ID generation works
284
- - [ ] Line endings handled correctly (CRLF)
285
-
286
- ---
287
-
288
- ### 12. Security Tests
289
-
290
- #### Token Security
291
- - [ ] Token not logged to console
292
- - [ ] Token not in error messages
293
- - [ ] Token file has correct permissions (600)
294
- - [ ] Token transmitted over HTTPS only
295
-
296
- #### Watermark Security
297
- - [ ] Watermark can't be easily removed
298
- - [ ] Watermark doesn't break code
299
- - [ ] Watermark traceable to customer
300
-
301
- #### Input Validation
302
- - [ ] SQL injection attempts → Rejected
303
- - [ ] Path traversal attempts → Rejected
304
- - [ ] Command injection attempts → Rejected
305
- - [ ] XSS attempts → Rejected
306
-
307
- ---
308
-
309
- ### 13. Performance Tests
310
-
311
- #### Speed
312
- - [ ] `vf doctor` completes in <1s
313
- - [ ] `vf list` completes in <2s
314
- - [ ] `vf add` small feature (<10 files) in <5s
315
- - [ ] `vf add` large feature (100+ files) in <30s
316
- - [ ] `vf remove` completes in <3s
317
-
318
- #### Resource Usage
319
- - [ ] CLI uses <100MB RAM
320
- - [ ] Temp files cleaned up
321
- - [ ] No memory leaks on repeated use
322
-
323
- ---
324
-
325
- ### 14. Concurrent Usage Tests
326
-
327
- #### Multiple CLI Instances
328
- - [ ] Two `vf add` commands simultaneously → Both work or one waits
329
- - [ ] `vf add` and `vf remove` simultaneously → Handled safely
330
- - [ ] Multiple users on same machine → Separate configs
331
-
332
- ---
333
-
334
- ### 15. Upgrade/Migration Tests
335
-
336
- #### CLI Updates
337
- - [ ] Update CLI version → Old config still works
338
- - [ ] Update CLI version → Old journal still works
339
- - [ ] Breaking change → Migration guide provided
340
-
341
- #### Recipe Updates
342
- - [ ] Install v1.0, update to v1.1 → Works
343
- - [ ] Recipe format changes → Backward compatible
344
-
345
- ---
346
-
347
- ### 16. Real-World Scenarios
348
-
349
- #### Typical Customer Journey
350
- - [ ] Buy license → Get token
351
- - [ ] Install CLI → `npm install -g vibefast-cli`
352
- - [ ] Login → `vf login --token <TOKEN>`
353
- - [ ] Check setup → `vf doctor`
354
- - [ ] Browse features → `vf list`
355
- - [ ] Install feature → `vf add charts`
356
- - [ ] Test in app → Feature works
357
- - [ ] Install another → `vf add chatbot`
358
- - [ ] Remove unused → `vf remove charts`
359
- - [ ] Everything works smoothly
360
-
361
- #### Edge Case Customer
362
- - [ ] Install on 3 machines → 3rd rejected
363
- - [ ] Deactivate old machine → Works
364
- - [ ] Install on new machine → Works
365
- - [ ] Hit rate limit → Clear message
366
- - [ ] Wait and retry → Works
367
-
368
- #### Problem Customer
369
- - [ ] Share token with friend → Both can't use simultaneously (device limit)
370
- - [ ] Try to remove watermark → Difficult/obvious
371
- - [ ] Try to bypass auth → Fails
372
- - [ ] Report bug → Logs help debug
373
-
374
- ---
375
-
376
- ## 🎯 Priority Testing Order
377
-
378
- ### P0 (Must Work - Blocking)
379
- 1. ✅ Login/logout
380
- 2. ✅ Doctor validation
381
- 3. ✅ Add feature (basic)
382
- 4. ✅ Remove feature (basic)
383
- 5. ⚠️ Navigation injection (in progress)
384
- 6. Token validation
385
- 7. Device limit enforcement
386
-
387
- ### P1 (Should Work - Important)
388
- 1. Dry-run mode
389
- 2. Force mode
390
- 3. Error messages
391
- 4. Rate limiting
392
- 5. Multiple features
393
- 6. Journal integrity
394
-
395
- ### P2 (Nice to Have - Polish)
396
- 1. Performance optimization
397
- 2. Better error messages
398
- 3. Progress indicators
399
- 4. Colored output
400
- 5. Helpful suggestions
401
-
402
- ---
403
-
404
- ## 🐛 Known Issues
405
-
406
- ### Current Bugs
407
- 1. ⚠️ Navigation removal doesn't clean vibefast-features.ts array
408
- 2. ⚠️ Need to test all edge cases above
409
-
410
- ### Workarounds
411
- 1. Manually edit vibefast-features.ts if needed
412
- 2. Use --force to reinstall
413
-
414
- ---
415
-
416
- ## ✅ Test Completion Status
417
-
418
- - **Total Tests:** ~150
419
- - **Completed:** ~15 (10%)
420
- - **In Progress:** 2
421
- - **Remaining:** ~133
422
-
423
- ---
424
-
425
- ## 🚀 Next Steps
426
-
427
- 1. Fix navigation removal bug
428
- 2. Test all P0 items
429
- 3. Test all P1 items
430
- 4. Document any issues found
431
- 5. Create automated test suite
432
- 6. Run tests on Linux/Windows
433
-
434
- ---
435
-
436
- ## 📝 Test Results Log
437
-
438
- ### 2025-01-12 - Initial Testing
439
- - ✅ Basic installation works
440
- - ✅ Watermarking works
441
- - ✅ File copying works
442
- - ⚠️ Navigation injection needs Option 3 implementation
443
- - ⚠️ Navigation removal needs fixing
444
-
445
- ### Next Test Session
446
- - [ ] Complete Option 3 implementation
447
- - [ ] Test full add/remove cycle
448
- - [ ] Test edge cases
449
- - [ ] Test on different machines
450
-