kasy-cli 1.12.1 → 1.14.0

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 (249) hide show
  1. package/bin/kasy.js +143 -7
  2. package/lib/commands/add.js +2 -2
  3. package/lib/commands/codemagic.js +11 -4
  4. package/lib/commands/deploy.js +3 -3
  5. package/lib/commands/favicon.js +115 -0
  6. package/lib/commands/icon.js +143 -0
  7. package/lib/commands/ios.js +20 -5
  8. package/lib/commands/new.js +8 -20
  9. package/lib/commands/remove.js +1 -1
  10. package/lib/commands/reset.js +287 -0
  11. package/lib/commands/run.js +24 -17
  12. package/lib/commands/splash.js +219 -0
  13. package/lib/commands/update.js +1 -1
  14. package/lib/scaffold/CHANGELOG.json +9 -0
  15. package/lib/scaffold/backends/api/patch/README.md +1 -1
  16. package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +1 -1
  17. package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +53 -0
  18. package/lib/scaffold/backends/api/patch/lib/main.dart +29 -10
  19. package/lib/scaffold/backends/api/pubspec.yaml.tpl +11 -1
  20. package/lib/scaffold/backends/firebase/tokens.js +2 -2
  21. package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +8 -2
  22. package/lib/scaffold/backends/supabase/migrations/20240101000011_dedupe_device_tokens.sql +34 -0
  23. package/lib/scaffold/backends/supabase/patch/README.md +1 -1
  24. package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +1 -1
  25. package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +43 -0
  26. package/lib/scaffold/backends/supabase/patch/lib/main.dart +29 -10
  27. package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +11 -1
  28. package/lib/scaffold/features/README.md +15 -139
  29. package/lib/scaffold/shared/generator-utils.js +16 -15
  30. package/lib/utils/apple-release.js +85 -16
  31. package/lib/utils/checks.js +4 -105
  32. package/lib/utils/flutter-run.js +173 -0
  33. package/lib/utils/i18n.js +413 -0
  34. package/lib/utils/mobile-identity.js +35 -0
  35. package/lib/utils/ui.js +114 -0
  36. package/package.json +2 -3
  37. package/templates/firebase/README.en.md +1 -1
  38. package/templates/firebase/README.es.md +1 -1
  39. package/templates/firebase/README.md +1 -1
  40. package/templates/firebase/android/app/build.gradle.kts +10 -1
  41. package/templates/firebase/android/app/src/main/AndroidManifest.xml +1 -1
  42. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +25 -1
  43. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +160 -11
  44. package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +15 -0
  45. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +9 -0
  46. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +12 -0
  47. package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +5 -0
  48. package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +17 -0
  49. package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +5 -0
  50. package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
  51. package/templates/firebase/android/app/src/main/res/drawable-hdpi/splash.png +0 -0
  52. package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
  53. package/templates/firebase/android/app/src/main/res/drawable-mdpi/splash.png +0 -0
  54. package/templates/firebase/android/app/src/main/res/drawable-night/background.png +0 -0
  55. package/templates/firebase/android/app/src/main/res/drawable-night/launch_background.xml +9 -0
  56. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
  57. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/splash.png +0 -0
  58. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
  59. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/splash.png +0 -0
  60. package/templates/firebase/android/app/src/main/res/drawable-night-v21/background.png +0 -0
  61. package/templates/firebase/android/app/src/main/res/drawable-night-v21/launch_background.xml +9 -0
  62. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
  63. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/splash.png +0 -0
  64. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
  65. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/splash.png +0 -0
  66. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
  67. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/splash.png +0 -0
  68. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
  69. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/splash.png +0 -0
  70. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
  71. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/splash.png +0 -0
  72. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
  73. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/splash.png +0 -0
  74. package/templates/firebase/android/app/src/main/res/layout/widget_loading.xml +8 -0
  75. package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +46 -0
  76. package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  77. package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  78. package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  79. package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  80. package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  81. package/templates/firebase/android/app/src/main/res/values-night-v31/styles.xml +2 -1
  82. package/templates/firebase/android/app/src/main/res/values-v31/styles.xml +1 -0
  83. package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +9 -3
  84. package/templates/firebase/assets/images/favicon.png +0 -0
  85. package/templates/firebase/assets/images/icon.png +0 -0
  86. package/templates/firebase/assets/images/splash_logo_dark.png +0 -0
  87. package/templates/firebase/assets/images/splash_logo_light.png +0 -0
  88. package/templates/firebase/firestore.indexes.json +10 -0
  89. package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +3 -0
  90. package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +17 -1
  91. package/templates/firebase/functions/src/index.ts +1 -0
  92. package/templates/firebase/functions/src/notifications/device_triggers.ts +58 -0
  93. package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +116 -33
  94. package/templates/firebase/ios/Runner/AppDelegate.swift +17 -1
  95. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
  96. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  97. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  98. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  99. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  100. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  101. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  102. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  103. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  104. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  105. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
  106. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
  107. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
  108. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
  109. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  110. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  111. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
  112. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
  113. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  114. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  115. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  116. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +9 -8
  117. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png +0 -0
  118. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +33 -0
  119. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
  120. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
  121. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
  122. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png +0 -0
  123. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png +0 -0
  124. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png +0 -0
  125. package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +1 -1
  126. package/templates/firebase/ios/Runner/Info.plist +2 -2
  127. package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +1 -1
  128. package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +1 -1
  129. package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +1 -1
  130. package/templates/firebase/lib/components/kasy_button.dart +8 -0
  131. package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +18 -0
  132. package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +67 -19
  133. package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +22 -8
  134. package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +16 -4
  135. package/templates/firebase/lib/core/states/components/maybeshow_component.dart +4 -8
  136. package/templates/firebase/lib/core/states/user_state_notifier.dart +13 -1
  137. package/templates/firebase/lib/core/theme/providers/theme_provider.dart +48 -24
  138. package/templates/firebase/lib/features/home/home_page.dart +0 -6
  139. package/templates/firebase/lib/features/notifications/api/device_api.dart +57 -0
  140. package/templates/firebase/lib/features/notifications/providers/models/notification.dart +11 -1
  141. package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +9 -0
  142. package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +1 -4
  143. package/templates/firebase/lib/features/notifications/shared/att_permission.dart +28 -8
  144. package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +16 -1
  145. package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +44 -11
  146. package/templates/firebase/lib/features/onboarding/ui/components/onboarding_features.dart +4 -0
  147. package/templates/firebase/lib/features/onboarding/ui/onboarding_page.dart +1 -0
  148. package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_feature.dart +13 -0
  149. package/templates/firebase/lib/features/settings/settings_page.dart +158 -18
  150. package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +31 -29
  151. package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +21 -5
  152. package/templates/firebase/lib/i18n/en.i18n.json +10 -3
  153. package/templates/firebase/lib/i18n/es.i18n.json +10 -3
  154. package/templates/firebase/lib/i18n/pt.i18n.json +10 -3
  155. package/templates/firebase/lib/main.dart +29 -10
  156. package/templates/firebase/pubspec.yaml +10 -6
  157. package/templates/firebase/test/core/data/repositories/user_repository_test.dart +1 -1
  158. package/templates/firebase/test/features/notifications/data/device_api_fake.dart +9 -0
  159. package/templates/firebase/web/favicon.png +0 -0
  160. package/templates/firebase/web/icons/Icon-192.png +0 -0
  161. package/templates/firebase/web/icons/Icon-512.png +0 -0
  162. package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
  163. package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
  164. package/templates/firebase/web/index.html +50 -39
  165. package/templates/firebase/web/manifest.json +3 -3
  166. package/templates/firebase/web/splash/img/dark-1x.png +0 -0
  167. package/templates/firebase/web/splash/img/dark-2x.png +0 -0
  168. package/templates/firebase/web/splash/img/dark-3x.png +0 -0
  169. package/templates/firebase/web/splash/img/dark-4x.png +0 -0
  170. package/templates/firebase/web/splash/img/light-1x.png +0 -0
  171. package/templates/firebase/web/splash/img/light-2x.png +0 -0
  172. package/templates/firebase/web/splash/img/light-3x.png +0 -0
  173. package/templates/firebase/web/splash/img/light-4x.png +0 -0
  174. package/lib/scaffold/features/analytics/lib/core/data/api/analytics_api.dart +0 -124
  175. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.es.md +0 -35
  176. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.md +0 -35
  177. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.pt.md +0 -35
  178. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.es.md +0 -12
  179. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.md +0 -12
  180. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.pt.md +0 -12
  181. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.es.md +0 -17
  182. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  183. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.pt.md +0 -17
  184. package/lib/scaffold/features/ci/.github/dependabot.yml +0 -16
  185. package/lib/scaffold/features/ci/.github/workflows/app.yml +0 -20
  186. package/lib/scaffold/features/ci/.gitlab/templates/deploy.yaml +0 -14
  187. package/lib/scaffold/features/ci/.gitlab/templates/dropbox.yaml +0 -19
  188. package/lib/scaffold/features/ci/.gitlab/templates/flutter.yaml +0 -163
  189. package/lib/scaffold/features/ci/.gitlab/templates/mailgun.yaml +0 -28
  190. package/lib/scaffold/features/ci/.gitlab-ci.yml +0 -37
  191. package/lib/scaffold/features/ci/codemagic.yaml +0 -157
  192. package/lib/scaffold/features/facebook/lib/core/data/api/tracking_api.dart +0 -111
  193. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_request_entity.dart +0 -27
  194. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_vote_entity.dart +0 -27
  195. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_request_api.dart +0 -50
  196. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_vote_api.dart +0 -79
  197. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feature_requests.dart +0 -48
  198. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feedback_state.dart +0 -42
  199. package/lib/scaffold/features/feedback/lib/features/feedbacks/providers/feedback_page_notifier.dart +0 -147
  200. package/lib/scaffold/features/feedback/lib/features/feedbacks/repositories/feature_request_repository.dart +0 -95
  201. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/component/add_feature_form.dart +0 -199
  202. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/feedback_page.dart +0 -175
  203. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/add_feature_button.dart +0 -76
  204. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/feature_card.dart +0 -279
  205. package/lib/scaffold/features/ios-release/.kasy/apple.env.example +0 -8
  206. package/lib/scaffold/features/ios-release/.kasy/codemagic.env.example +0 -7
  207. package/lib/scaffold/features/ios-release/docs/codemagic-release.en.md +0 -50
  208. package/lib/scaffold/features/ios-release/docs/codemagic-release.es.md +0 -50
  209. package/lib/scaffold/features/ios-release/docs/codemagic-release.pt.md +0 -50
  210. package/lib/scaffold/features/ios-release/docs/ios-release.en.md +0 -41
  211. package/lib/scaffold/features/ios-release/docs/ios-release.es.md +0 -41
  212. package/lib/scaffold/features/ios-release/docs/ios-release.pt.md +0 -41
  213. package/lib/scaffold/features/ios-release/scripts/bump-ios-version.js +0 -38
  214. package/lib/scaffold/features/ios-release/scripts/release-ios.sh +0 -137
  215. package/lib/scaffold/features/llm_chat/lib/features/llm_chat/llm_chat_page.dart +0 -301
  216. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/providers/reminder_notifier.dart +0 -81
  217. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/repositories/reminder_preferences.dart +0 -76
  218. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/ui/reminder_page.dart +0 -282
  219. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/entities/user_info_entity.dart +0 -24
  220. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/user_infos_api.dart +0 -71
  221. package/lib/scaffold/features/onboarding/lib/features/onboarding/models/user_info.dart +0 -92
  222. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_model.dart +0 -15
  223. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_provider.dart +0 -78
  224. package/lib/scaffold/features/onboarding/lib/features/onboarding/repositories/user_infos_repository.dart +0 -29
  225. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/animations/page_transitions.dart +0 -30
  226. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_att_setup.dart +0 -66
  227. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_features.dart +0 -72
  228. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_loader.dart +0 -92
  229. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +0 -73
  230. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_questions.dart +0 -89
  231. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/onboarding_page.dart +0 -94
  232. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_background.dart +0 -80
  233. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_feature.dart +0 -139
  234. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +0 -110
  235. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_progress.dart +0 -84
  236. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +0 -173
  237. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +0 -45
  238. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +0 -77
  239. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +0 -392
  240. package/lib/scaffold/features/revenuecat/lib/core/data/api/tracking_api.dart +0 -116
  241. package/lib/scaffold/features/revenuecat/lib/core/data/models/subscription.dart +0 -322
  242. package/lib/scaffold/features/revenuecat/lib/core/home_widgets/home_widget_background_task.dart +0 -41
  243. package/lib/scaffold/features/revenuecat/lib/core/states/user_state_notifier.dart +0 -305
  244. package/templates/firebase/assets/images/app_icon.png +0 -0
  245. package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
  246. package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
  247. package/templates/firebase/assets/images/splashscreen.png +0 -0
  248. package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +0 -88
  249. package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +0 -144
package/lib/utils/i18n.js CHANGED
@@ -284,15 +284,24 @@ const MESSAGES = {
284
284
  'cli.command.ios.release.description': 'Bump build, create IPA, and upload to App Store Connect',
285
285
  'cli.command.ios.build.description': 'Build IPA only (no upload)',
286
286
  'cli.command.ios.clean.description': 'Clean Flutter/Xcode caches before a failed iOS build',
287
+ 'cli.command.ios.picker.intro': 'Publish to the App Store',
288
+ 'cli.command.ios.picker.message': 'What do you want to do?',
289
+ 'cli.command.ios.help.before': 'How to publish to the App Store:\n 1) kasy ios configure → do this once (saves Apple credentials)\n 2) kasy ios release → run for each new version (build + upload)\n\nUse "build" to only generate the IPA, "clean" if a build fails.\n',
287
290
  'cli.command.codemagic.description': 'Build the app in the cloud (no Mac needed)',
288
291
  'cli.command.codemagic.configure.description': 'Configure Codemagic API credentials',
289
292
  'cli.command.codemagic.release.description': 'Start a Codemagic iOS workflow build',
290
293
  'cli.command.codemagic.status.description': 'Show Codemagic build status by ID',
294
+ 'cli.command.codemagic.picker.intro': 'Build in the cloud with Codemagic',
295
+ 'cli.command.codemagic.picker.message': 'What do you want to do?',
296
+ 'cli.command.codemagic.picker.statusHint': 'Asks for the build ID',
297
+ 'cli.command.codemagic.help.before': 'How to build with Codemagic (no Mac needed):\n 1) kasy codemagic configure → do this once (saves API token)\n 2) kasy codemagic release → starts a cloud build for each version\n\nUse "status <buildId>" to check the progress of a running build.\n',
291
298
 
292
299
  'ios.configure.title': 'iOS App Store — setup',
293
300
  'ios.configure.bundleId': 'Bundle ID',
294
301
  'ios.configure.doc': 'Guide',
295
302
  'ios.configure.openingLinks': 'Opening App Store Connect in your browser…',
303
+ 'ios.configure.note.title': 'I will ask 3 things from App Store Connect',
304
+ 'ios.configure.note.body': '1) API Key ID — under Users and Access → Keys.\n2) Issuer ID — at the top of the same page.\n3) The .p8 private key file you downloaded when creating the key.\n\nThe App ID is optional and only needed if you have multiple apps.',
296
305
  'ios.configure.q.apiKey': 'App Store Connect API Key ID',
297
306
  'ios.configure.q.issuerId': 'Issuer ID (UUID)',
298
307
  'ios.configure.q.p8Path': 'Path to downloaded AuthKey_XXXXX.p8 file',
@@ -305,14 +314,22 @@ const MESSAGES = {
305
314
  'ios.configure.next': 'Next',
306
315
  'ios.release.title': 'Building and uploading iOS release…',
307
316
  'ios.release.success': 'iOS release uploaded',
317
+ 'ios.release.task.building': 'Building IPA (this can take 2-5 min)…',
318
+ 'ios.release.task.uploading': 'Uploading IPA to App Store Connect…',
319
+ 'ios.release.task.done': 'Build + upload finished',
320
+ 'ios.release.task.failed': 'Build failed — see output below',
308
321
  'ios.build.title': 'Building iOS IPA…',
309
322
  'ios.build.success': 'IPA built',
323
+ 'ios.build.task.building': 'Building IPA (this can take 2-5 min)…',
324
+ 'ios.build.task.done': 'IPA built at build/ios/ipa/',
325
+ 'ios.build.task.failed': 'Build failed — see output below',
310
326
  'ios.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
311
327
  'ios.error.noScript': 'scripts/release-ios.sh not found. Run: kasy update ios-release',
312
328
  'ios.error.notMac': 'iOS release requires macOS with Xcode.',
313
329
  'ios.error.useCodemagic': 'Use cloud release instead',
314
330
  'ios.error.notConfigured': 'Apple credentials not configured',
315
331
  'ios.error.runConfigure': 'Run: kasy ios configure',
332
+ 'ios.release.askConfigure': 'Want to configure Apple credentials now?',
316
333
  'ios.error.signing': 'iOS code signing is not configured (DEVELOPMENT_TEAM missing).',
317
334
  'ios.error.signingHint': 'Open ios/Runner.xcworkspace in Xcode → Runner → Signing & Capabilities → select your Team.',
318
335
  'ios.error.googleUrlScheme': 'Google Sign-In iOS URL scheme is not configured.',
@@ -345,8 +362,12 @@ const MESSAGES = {
345
362
  'codemagic.configure.next': 'Next',
346
363
  'codemagic.release.title': 'Triggering Codemagic build…',
347
364
  'codemagic.release.triggered': 'Build started',
365
+ 'codemagic.release.spin': 'Starting build on Codemagic…',
366
+ 'codemagic.release.spinDone': 'Build queued on Codemagic',
348
367
  'codemagic.status.title': 'Build status',
349
368
  'codemagic.status.usage': 'Usage: kasy codemagic status <buildId>',
369
+ 'codemagic.status.spin': 'Fetching build status…',
370
+ 'codemagic.status.spinDone': 'Status fetched',
350
371
  'codemagic.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
351
372
  'codemagic.error.notConfigured': 'Codemagic not configured',
352
373
  'codemagic.error.addCi': 'Add CI first: kasy add ci (creates codemagic.yaml)',
@@ -605,9 +626,50 @@ const MESSAGES = {
605
626
  'run.launching': 'Launching Flutter app...',
606
627
  'run.updateHint.prefix': 'Project improvements available —',
607
628
  'run.updateHint.suffix': 'to see what\'s new',
629
+ 'run.spinner.building': 'Starting Flutter…',
630
+ 'run.spinner.ready': 'Flutter ready — use r (reload), R (restart), q (quit)',
631
+ 'run.spinner.failed': 'Flutter run failed before starting',
632
+ 'run.stage.gradleFirstTime': 'Building Android (first run takes 5-15 min while Gradle downloads deps)…',
633
+ 'run.stage.gradle': 'Building Android…',
634
+ 'run.stage.xcode': 'Building iOS…',
635
+ 'run.stage.pods': 'Installing iOS pods…',
636
+ 'run.stage.installing': 'Installing on device…',
637
+ 'run.stage.syncing': 'Syncing files to device…',
638
+ 'run.stage.buildSuccess': 'Build done — launching app…',
608
639
  'run.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
609
640
  'run.error.flutterNotFound': 'Flutter not found. Make sure Flutter is installed and on your PATH.',
610
641
 
642
+ // reset command
643
+ 'cli.command.reset.description': 'Uninstall the app on a simulator/emulator/device so you can test as a fresh install',
644
+ 'reset.title': 'Reset app on device',
645
+ 'reset.scanning': 'Looking for running simulators, emulators and connected devices...',
646
+ 'reset.prompt.pickDevice': 'Which one do you want to reset?',
647
+ 'reset.resetting': 'Resetting',
648
+ 'reset.reinstalling': 'Reinstalling the app...',
649
+ 'reset.success.uninstalled': 'App uninstalled. All local data and permissions cleared.',
650
+ 'reset.info.notInstalled': 'App was not installed on this device.',
651
+ 'reset.warn.noDevices': 'No matching simulator, emulator or device is running. Start one and try again.',
652
+ 'reset.warn.nothingSelected': 'No device selected.',
653
+ 'reset.warn.iosUninstallFailed': 'simctl uninstall failed.',
654
+ 'reset.warn.androidUninstallFailed': 'adb uninstall did not return success.',
655
+ 'reset.warn.iosDeviceManual': 'iOS physical device: remove the app manually (long-press the icon → Remove App), then reinstall with kasy run.',
656
+ 'reset.warn.iosDeviceUninstallFailed': 'devicectl uninstall failed. Make sure the device is unlocked and trusted by this Mac.',
657
+ 'reset.warn.webIncognito': 'Web: open the app in an incognito / private window of your browser to test as a fresh visitor.',
658
+ 'reset.warn.unknownPlatform': 'Unsupported platform',
659
+ 'reset.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
660
+ 'reset.error.noIdentifier': 'Could not read bundle id or Android package name from this project.',
661
+ 'reset.error.noBundleId': 'iOS bundle id not found for this project.',
662
+ 'reset.error.noPackageName': 'Android applicationId not found for this project.',
663
+ 'reset.outro.skipped': 'Done. App was not uninstalled.',
664
+ 'reset.outro.uninstalledOnly': 'Done. Run kasy run to reinstall.',
665
+ 'reset.outro.cancelled': 'Cancelled. App was not uninstalled.',
666
+ 'reset.prompt.xcodeOpen': 'Xcode is open and will conflict with the install. What do you want to do?',
667
+ 'reset.prompt.xcodeOpen.close': 'Close Xcode automatically (recommended)',
668
+ 'reset.prompt.xcodeOpen.skip': 'Leave Xcode open and try anyway',
669
+ 'reset.prompt.xcodeOpen.cancel': 'Cancel reset',
670
+ 'reset.info.xcodeClosed': 'Xcode closed.',
671
+ 'reset.prompt.reinstallNow': 'App removed. Check the device, then reinstall now?',
672
+
611
673
  // doctor project checks
612
674
  'doctor.project.title': 'Project',
613
675
  'doctor.project.appName': 'App name',
@@ -624,9 +686,86 @@ const MESSAGES = {
624
686
  // docs command
625
687
  'cli.command.docs.description': 'Open the full documentation',
626
688
 
689
+ // splash command
690
+ 'cli.command.splash.description': 'Swap splash screen logos (light/dark) and regenerate native assets',
691
+ 'splash.intro': 'Splash screen',
692
+ 'splash.validating': 'Validating PNG files...',
693
+ 'splash.validated': 'PNG files look good',
694
+ 'splash.copying': 'Copying logos to assets/images/...',
695
+ 'splash.copied': 'Logos copied',
696
+ 'splash.generating': 'Regenerating native splash (Android, iOS, Web)...',
697
+ 'splash.generated': 'Native splash regenerated',
698
+ 'splash.done': 'Done. Run "flutter run" to see the new splash.',
699
+ 'splash.warn.title': 'Warnings',
700
+ 'splash.warn.noAlphaLight': '{path} has no alpha channel. The logo will show with a solid background instead of being transparent.',
701
+ 'splash.warn.noAlphaDark': '{path} has no alpha channel. The logo will show with a solid background instead of being transparent.',
702
+ 'splash.warn.smallLight': 'Light logo is {w}x{h}. Recommended is at least 768x768 to avoid blurry edges.',
703
+ 'splash.warn.smallDark': 'Dark logo is {w}x{h}. Recommended is at least 768x768 to avoid blurry edges.',
704
+ 'splash.summary.title': 'Saved',
705
+ 'splash.summary.light': 'Light mode',
706
+ 'splash.summary.dark': 'Dark mode',
707
+ 'splash.skipGenerate.title': 'Skipped generation',
708
+ 'splash.skipGenerate.hint': 'Run `dart run flutter_native_splash:create` when you are ready.',
709
+ 'splash.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
710
+ 'splash.error.bothRequired': '--light and --dark are both required.',
711
+ 'splash.error.fileNotFound': 'File not found: {path}',
712
+ 'splash.error.notPng': 'One of the files is not a valid PNG.',
713
+ 'splash.error.generateFailed': 'flutter_native_splash:create failed. Check the output above.',
714
+
715
+ // icon command
716
+ 'cli.command.icon.description': 'Swap the app icon (iOS + Android) and regenerate native assets',
717
+ 'icon.intro': 'App icon',
718
+ 'icon.validating': 'Validating PNG file...',
719
+ 'icon.validated': 'PNG looks good',
720
+ 'icon.copying': 'Copying icon to assets/images/icon.png...',
721
+ 'icon.copied': 'Icon copied',
722
+ 'icon.generating': 'Regenerating native icons (Android + iOS)...',
723
+ 'icon.generated': 'Native icons regenerated',
724
+ 'icon.done': 'Done. Uninstall the app from the device and reinstall to see the new icon.',
725
+ 'icon.warn.title': 'Warnings',
726
+ 'icon.warn.notSquare': 'Icon is {w}x{h} (not square). The image will be stretched. Use a square image (1024x1024 recommended).',
727
+ 'icon.warn.small': 'Icon is {w}x{h}. Recommended is at least 1024x1024 (App Store requires this size).',
728
+ 'icon.warn.hasAlpha': 'Icon has transparency. iOS rejects icons with alpha channel — flutter_launcher_icons will remove it automatically (remove_alpha_ios: true).',
729
+ 'icon.summary.title': 'Saved',
730
+ 'icon.summary.icon': 'App icon',
731
+ 'icon.skipGenerate.title': 'Skipped generation',
732
+ 'icon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
733
+ 'icon.reinstall.title': 'Important',
734
+ 'icon.reinstall.hint': 'iOS and Android cache the old icon. Uninstall the app and reinstall to see the new one.',
735
+ 'icon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
736
+ 'icon.error.imageRequired': '--image is required.',
737
+ 'icon.error.fileNotFound': 'File not found: {path}',
738
+ 'icon.error.notPng': 'The file is not a valid PNG.',
739
+ 'icon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
740
+
741
+ // favicon command
742
+ 'cli.command.favicon.description': 'Swap the web favicon / PWA icon and regenerate web assets',
743
+ 'favicon.intro': 'Web favicon',
744
+ 'favicon.validating': 'Validating PNG file...',
745
+ 'favicon.validated': 'PNG looks good',
746
+ 'favicon.copying': 'Copying favicon to assets/images/favicon.png...',
747
+ 'favicon.copied': 'Favicon copied',
748
+ 'favicon.generating': 'Regenerating web icons (favicon + PWA sizes)...',
749
+ 'favicon.generated': 'Web icons regenerated',
750
+ 'favicon.done': 'Done. Run "flutter run -d chrome" to see the new favicon.',
751
+ 'favicon.warn.title': 'Warnings',
752
+ 'favicon.warn.notSquare': 'Favicon is {w}x{h} (not square). It will be stretched. Use a square image (512x512+ recommended).',
753
+ 'favicon.warn.small': 'Favicon is {w}x{h}. Recommended is at least 512x512 so it stays sharp on PWA install screens.',
754
+ 'favicon.summary.title': 'Saved',
755
+ 'favicon.summary.favicon': 'Favicon',
756
+ 'favicon.skipGenerate.title': 'Skipped generation',
757
+ 'favicon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
758
+ 'favicon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
759
+ 'favicon.error.imageRequired': '--image is required.',
760
+ 'favicon.error.fileNotFound': 'File not found: {path}',
761
+ 'favicon.error.notPng': 'The file is not a valid PNG.',
762
+ 'favicon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
763
+
627
764
  // notifications command
628
765
  'cli.command.notifications.description': 'Edit the text of local notifications and reminders',
629
766
  'cli.command.notifications.text.description': 'Set titles and bodies shown in local notifications',
767
+ 'cli.command.notifications.picker.intro': 'Edit notification texts',
768
+ 'cli.command.notifications.picker.message': 'What do you want to do?',
630
769
  'notifications.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
631
770
  'notifications.error.noI18n': 'lib/i18n/*.i18n.json not found in this project.',
632
771
  'notifications.error.noFeatures': 'lib/core/config/features.dart not found.',
@@ -1081,15 +1220,24 @@ const MESSAGES = {
1081
1220
  'cli.command.ios.release.description': 'Incrementa build, gera IPA e envia para App Store Connect',
1082
1221
  'cli.command.ios.build.description': 'Só gera o IPA (sem enviar)',
1083
1222
  'cli.command.ios.clean.description': 'Limpa caches Flutter/Xcode após falha no build iOS',
1223
+ 'cli.command.ios.picker.intro': 'Publicar na App Store',
1224
+ 'cli.command.ios.picker.message': 'O que você quer fazer?',
1225
+ 'cli.command.ios.help.before': 'Como publicar na App Store:\n 1) kasy ios configure → faça isso uma vez (salva as credenciais Apple)\n 2) kasy ios release → rode em cada nova versão (build + envio)\n\nUse "build" se quiser só gerar o IPA, "clean" se um build falhou.\n',
1084
1226
  'cli.command.codemagic.description': 'Compila o app na nuvem (sem precisar de Mac)',
1085
1227
  'cli.command.codemagic.configure.description': 'Configurar credenciais da API Codemagic',
1086
1228
  'cli.command.codemagic.release.description': 'Iniciar build do workflow iOS no Codemagic',
1087
1229
  'cli.command.codemagic.status.description': 'Status do build Codemagic por ID',
1230
+ 'cli.command.codemagic.picker.intro': 'Compilar na nuvem com Codemagic',
1231
+ 'cli.command.codemagic.picker.message': 'O que você quer fazer?',
1232
+ 'cli.command.codemagic.picker.statusHint': 'Pergunta o ID do build',
1233
+ 'cli.command.codemagic.help.before': 'Como compilar com Codemagic (sem precisar de Mac):\n 1) kasy codemagic configure → faça isso uma vez (salva o token da API)\n 2) kasy codemagic release → inicia um build na nuvem a cada versão\n\nUse "status <buildId>" para acompanhar o progresso de um build.\n',
1088
1234
 
1089
1235
  'ios.configure.title': 'App Store iOS — configuração',
1090
1236
  'ios.configure.bundleId': 'Bundle ID',
1091
1237
  'ios.configure.doc': 'Guia',
1092
1238
  'ios.configure.openingLinks': 'Abrindo App Store Connect no navegador…',
1239
+ 'ios.configure.note.title': 'Vou precisar de 3 coisas do App Store Connect',
1240
+ 'ios.configure.note.body': '1) API Key ID — em Users and Access → Keys.\n2) Issuer ID — no topo da mesma página.\n3) O arquivo .p8 (chave privada) baixado quando você criou a key.\n\nO App ID é opcional, só usa se tiver vários apps.',
1093
1241
  'ios.configure.q.apiKey': 'Key ID da API App Store Connect',
1094
1242
  'ios.configure.q.issuerId': 'Issuer ID (UUID)',
1095
1243
  'ios.configure.q.p8Path': 'Caminho do arquivo AuthKey_XXXXX.p8 baixado',
@@ -1102,14 +1250,22 @@ const MESSAGES = {
1102
1250
  'ios.configure.next': 'Próximo passo',
1103
1251
  'ios.release.title': 'Gerando e enviando release iOS…',
1104
1252
  'ios.release.success': 'Release iOS enviada',
1253
+ 'ios.release.task.building': 'Compilando IPA (pode levar 2-5 min)…',
1254
+ 'ios.release.task.uploading': 'Enviando IPA para o App Store Connect…',
1255
+ 'ios.release.task.done': 'Compilação + envio concluídos',
1256
+ 'ios.release.task.failed': 'Compilação falhou — veja a saída abaixo',
1105
1257
  'ios.build.title': 'Gerando IPA iOS…',
1106
1258
  'ios.build.success': 'IPA gerado',
1259
+ 'ios.build.task.building': 'Compilando IPA (pode levar 2-5 min)…',
1260
+ 'ios.build.task.done': 'IPA pronto em build/ios/ipa/',
1261
+ 'ios.build.task.failed': 'Compilação falhou — veja a saída abaixo',
1107
1262
  'ios.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
1108
1263
  'ios.error.noScript': 'scripts/release-ios.sh não encontrado. Execute: kasy update ios-release',
1109
1264
  'ios.error.notMac': 'Release iOS local exige macOS com Xcode.',
1110
1265
  'ios.error.useCodemagic': 'Use release na nuvem',
1111
1266
  'ios.error.notConfigured': 'Credenciais Apple não configuradas',
1112
1267
  'ios.error.runConfigure': 'Execute: kasy ios configure',
1268
+ 'ios.release.askConfigure': 'Quer configurar as credenciais Apple agora?',
1113
1269
  'ios.error.signing': 'Assinatura iOS não configurada (DEVELOPMENT_TEAM ausente).',
1114
1270
  'ios.error.signingHint': 'Abra ios/Runner.xcworkspace no Xcode → Runner → Signing & Capabilities → escolha seu Team.',
1115
1271
  'ios.error.googleUrlScheme': 'URL scheme iOS do Google Sign-In não configurado.',
@@ -1142,8 +1298,12 @@ const MESSAGES = {
1142
1298
  'codemagic.configure.next': 'Próximo passo',
1143
1299
  'codemagic.release.title': 'Disparando build no Codemagic…',
1144
1300
  'codemagic.release.triggered': 'Build iniciado',
1301
+ 'codemagic.release.spin': 'Iniciando build no Codemagic…',
1302
+ 'codemagic.release.spinDone': 'Build enfileirado no Codemagic',
1145
1303
  'codemagic.status.title': 'Status do build',
1146
1304
  'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
1305
+ 'codemagic.status.spin': 'Consultando status do build…',
1306
+ 'codemagic.status.spinDone': 'Status obtido',
1147
1307
  'codemagic.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
1148
1308
  'codemagic.error.notConfigured': 'Codemagic não configurado',
1149
1309
  'codemagic.error.addCi': 'Adicione CI primeiro: kasy add ci (cria codemagic.yaml)',
@@ -1399,9 +1559,48 @@ const MESSAGES = {
1399
1559
 
1400
1560
  // run command
1401
1561
  'cli.command.run.description': 'Roda o app no celular, simulador ou navegador',
1562
+ 'cli.command.reset.description': 'Desinstala o app no simulador/emulador/dispositivo pra testar como primeira instalação',
1563
+ 'reset.title': 'Resetar app no dispositivo',
1564
+ 'reset.scanning': 'Procurando simuladores, emuladores e dispositivos conectados...',
1565
+ 'reset.prompt.pickDevice': 'Em qual deles você quer resetar?',
1566
+ 'reset.resetting': 'Resetando',
1567
+ 'reset.reinstalling': 'Reinstalando o app...',
1568
+ 'reset.success.uninstalled': 'App desinstalado. Todos os dados e permissões foram limpos.',
1569
+ 'reset.info.notInstalled': 'O app não estava instalado neste dispositivo.',
1570
+ 'reset.warn.noDevices': 'Nenhum simulador, emulador ou dispositivo em execução. Inicie um e tente de novo.',
1571
+ 'reset.warn.nothingSelected': 'Nenhum dispositivo selecionado.',
1572
+ 'reset.warn.iosUninstallFailed': 'simctl uninstall falhou.',
1573
+ 'reset.warn.androidUninstallFailed': 'adb uninstall não retornou sucesso.',
1574
+ 'reset.warn.iosDeviceManual': 'iPhone físico: apague o app manualmente (segure o ícone → Remover app), depois reinstale com kasy run.',
1575
+ 'reset.warn.iosDeviceUninstallFailed': 'devicectl não conseguiu desinstalar. Verifique se o iPhone está desbloqueado e confia neste Mac.',
1576
+ 'reset.warn.webIncognito': 'Web: abra o app em uma janela anônima/privada do navegador pra testar como visitante novo.',
1577
+ 'reset.warn.unknownPlatform': 'Plataforma não suportada',
1578
+ 'reset.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
1579
+ 'reset.error.noIdentifier': 'Não consegui ler o bundle id nem o package name Android deste projeto.',
1580
+ 'reset.error.noBundleId': 'Bundle id do iOS não encontrado.',
1581
+ 'reset.error.noPackageName': 'applicationId do Android não encontrado.',
1582
+ 'reset.outro.skipped': 'Pronto. O app não foi desinstalado.',
1583
+ 'reset.outro.uninstalledOnly': 'Pronto. Rode kasy run pra reinstalar.',
1584
+ 'reset.outro.cancelled': 'Cancelado. O app não foi desinstalado.',
1585
+ 'reset.prompt.xcodeOpen': 'O Xcode está aberto e vai atrapalhar a instalação. O que você quer fazer?',
1586
+ 'reset.prompt.xcodeOpen.close': 'Fechar o Xcode automaticamente (recomendado)',
1587
+ 'reset.prompt.xcodeOpen.skip': 'Deixar o Xcode aberto e tentar mesmo assim',
1588
+ 'reset.prompt.xcodeOpen.cancel': 'Cancelar o reset',
1589
+ 'reset.info.xcodeClosed': 'Xcode fechado.',
1590
+ 'reset.prompt.reinstallNow': 'App removido. Confere no dispositivo e reinstala agora?',
1402
1591
  'run.launching': 'Iniciando app Flutter...',
1403
1592
  'run.updateHint.prefix': 'Melhorias disponíveis para o projeto —',
1404
1593
  'run.updateHint.suffix': 'para ver o que há de novo',
1594
+ 'run.spinner.building': 'Iniciando Flutter…',
1595
+ 'run.spinner.ready': 'Flutter pronto — use r (reload), R (restart), q (sair)',
1596
+ 'run.spinner.failed': 'Flutter run falhou antes de iniciar',
1597
+ 'run.stage.gradleFirstTime': 'Compilando Android (1ª vez leva 5-15 min — Gradle baixando dependências)…',
1598
+ 'run.stage.gradle': 'Compilando Android…',
1599
+ 'run.stage.xcode': 'Compilando iOS…',
1600
+ 'run.stage.pods': 'Instalando pods iOS…',
1601
+ 'run.stage.installing': 'Instalando no dispositivo…',
1602
+ 'run.stage.syncing': 'Sincronizando arquivos com o dispositivo…',
1603
+ 'run.stage.buildSuccess': 'Build pronto — abrindo o app…',
1405
1604
  'run.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
1406
1605
  'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
1407
1606
 
@@ -1421,9 +1620,86 @@ const MESSAGES = {
1421
1620
  // docs command
1422
1621
  'cli.command.docs.description': 'Abre a documentação completa',
1423
1622
 
1623
+ // splash command
1624
+ 'cli.command.splash.description': 'Troca os logos da splash (claro/escuro) e regenera os assets nativos',
1625
+ 'splash.intro': 'Splash screen',
1626
+ 'splash.validating': 'Validando arquivos PNG...',
1627
+ 'splash.validated': 'PNGs estão bons',
1628
+ 'splash.copying': 'Copiando logos para assets/images/...',
1629
+ 'splash.copied': 'Logos copiados',
1630
+ 'splash.generating': 'Regenerando splash nativa (Android, iOS, Web)...',
1631
+ 'splash.generated': 'Splash nativa regenerada',
1632
+ 'splash.done': 'Pronto. Rode "flutter run" para ver a nova splash.',
1633
+ 'splash.warn.title': 'Avisos',
1634
+ 'splash.warn.noAlphaLight': '{path} não tem canal alpha (fundo transparente). O logo vai aparecer com fundo sólido em vez de transparente.',
1635
+ 'splash.warn.noAlphaDark': '{path} não tem canal alpha (fundo transparente). O logo vai aparecer com fundo sólido em vez de transparente.',
1636
+ 'splash.warn.smallLight': 'Logo claro tem {w}x{h}. Recomendado pelo menos 768x768 para evitar bordas borradas.',
1637
+ 'splash.warn.smallDark': 'Logo escuro tem {w}x{h}. Recomendado pelo menos 768x768 para evitar bordas borradas.',
1638
+ 'splash.summary.title': 'Salvo',
1639
+ 'splash.summary.light': 'Modo claro',
1640
+ 'splash.summary.dark': 'Modo escuro',
1641
+ 'splash.skipGenerate.title': 'Geração pulada',
1642
+ 'splash.skipGenerate.hint': 'Rode `dart run flutter_native_splash:create` quando quiser regenerar.',
1643
+ 'splash.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
1644
+ 'splash.error.bothRequired': '--light e --dark são obrigatórios.',
1645
+ 'splash.error.fileNotFound': 'Arquivo não encontrado: {path}',
1646
+ 'splash.error.notPng': 'Um dos arquivos não é um PNG válido.',
1647
+ 'splash.error.generateFailed': 'flutter_native_splash:create falhou. Veja a saída acima.',
1648
+
1649
+ // icon command
1650
+ 'cli.command.icon.description': 'Troca o ícone do app (iOS + Android) e regenera os assets nativos',
1651
+ 'icon.intro': 'Ícone do app',
1652
+ 'icon.validating': 'Validando arquivo PNG...',
1653
+ 'icon.validated': 'PNG está bom',
1654
+ 'icon.copying': 'Copiando ícone para assets/images/icon.png...',
1655
+ 'icon.copied': 'Ícone copiado',
1656
+ 'icon.generating': 'Regenerando ícones nativos (Android + iOS)...',
1657
+ 'icon.generated': 'Ícones nativos regenerados',
1658
+ 'icon.done': 'Pronto. Desinstale o app do dispositivo e reinstale para ver o novo ícone.',
1659
+ 'icon.warn.title': 'Avisos',
1660
+ 'icon.warn.notSquare': 'Ícone tem {w}x{h} (não é quadrado). A imagem vai ser esticada. Use uma imagem quadrada (1024x1024 recomendado).',
1661
+ 'icon.warn.small': 'Ícone tem {w}x{h}. Recomendado pelo menos 1024x1024 (App Store exige esse tamanho).',
1662
+ 'icon.warn.hasAlpha': 'Ícone tem transparência. iOS rejeita ícones com canal alpha — flutter_launcher_icons remove automaticamente (remove_alpha_ios: true).',
1663
+ 'icon.summary.title': 'Salvo',
1664
+ 'icon.summary.icon': 'Ícone do app',
1665
+ 'icon.skipGenerate.title': 'Geração pulada',
1666
+ 'icon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
1667
+ 'icon.reinstall.title': 'Importante',
1668
+ 'icon.reinstall.hint': 'iOS e Android cacheiam o ícone antigo. Desinstale o app e reinstale para ver o novo.',
1669
+ 'icon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
1670
+ 'icon.error.imageRequired': '--image é obrigatório.',
1671
+ 'icon.error.fileNotFound': 'Arquivo não encontrado: {path}',
1672
+ 'icon.error.notPng': 'O arquivo não é um PNG válido.',
1673
+ 'icon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
1674
+
1675
+ // favicon command
1676
+ 'cli.command.favicon.description': 'Troca o favicon / ícone PWA da web e regenera os assets web',
1677
+ 'favicon.intro': 'Favicon web',
1678
+ 'favicon.validating': 'Validando arquivo PNG...',
1679
+ 'favicon.validated': 'PNG está bom',
1680
+ 'favicon.copying': 'Copiando favicon para assets/images/favicon.png...',
1681
+ 'favicon.copied': 'Favicon copiado',
1682
+ 'favicon.generating': 'Regenerando ícones web (favicon + tamanhos PWA)...',
1683
+ 'favicon.generated': 'Ícones web regenerados',
1684
+ 'favicon.done': 'Pronto. Rode "flutter run -d chrome" para ver o novo favicon.',
1685
+ 'favicon.warn.title': 'Avisos',
1686
+ 'favicon.warn.notSquare': 'Favicon tem {w}x{h} (não é quadrado). Vai ser esticado. Use uma imagem quadrada (512x512+ recomendado).',
1687
+ 'favicon.warn.small': 'Favicon tem {w}x{h}. Recomendado pelo menos 512x512 para ficar nítido nas telas de instalação da PWA.',
1688
+ 'favicon.summary.title': 'Salvo',
1689
+ 'favicon.summary.favicon': 'Favicon',
1690
+ 'favicon.skipGenerate.title': 'Geração pulada',
1691
+ 'favicon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
1692
+ 'favicon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
1693
+ 'favicon.error.imageRequired': '--image é obrigatório.',
1694
+ 'favicon.error.fileNotFound': 'Arquivo não encontrado: {path}',
1695
+ 'favicon.error.notPng': 'O arquivo não é um PNG válido.',
1696
+ 'favicon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
1697
+
1424
1698
  // notifications command
1425
1699
  'cli.command.notifications.description': 'Edita os textos das notificações locais e lembretes',
1426
1700
  'cli.command.notifications.text.description': 'Define títulos e mensagens das notificações locais',
1701
+ 'cli.command.notifications.picker.intro': 'Editar textos das notificações',
1702
+ 'cli.command.notifications.picker.message': 'O que você quer fazer?',
1427
1703
  'notifications.error.notKasyProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
1428
1704
  'notifications.error.noI18n': 'lib/i18n/*.i18n.json não encontrado neste projeto.',
1429
1705
  'notifications.error.noFeatures': 'lib/core/config/features.dart não encontrado.',
@@ -1880,15 +2156,24 @@ const MESSAGES = {
1880
2156
  'cli.command.ios.release.description': 'Incrementa build, genera IPA y sube a App Store Connect',
1881
2157
  'cli.command.ios.build.description': 'Solo genera el IPA (sin subir)',
1882
2158
  'cli.command.ios.clean.description': 'Limpia cachés Flutter/Xcode tras fallo en build iOS',
2159
+ 'cli.command.ios.picker.intro': 'Publicar en la App Store',
2160
+ 'cli.command.ios.picker.message': '¿Qué quieres hacer?',
2161
+ 'cli.command.ios.help.before': 'Como publicar en la App Store:\n 1) kasy ios configure → hazlo una vez (guarda las credenciales Apple)\n 2) kasy ios release → ejecuta en cada nueva version (build + subida)\n\nUsa "build" si solo quieres generar el IPA, "clean" si un build fallo.\n',
1883
2162
  'cli.command.codemagic.description': 'Compila la app en la nube (sin necesitar Mac)',
1884
2163
  'cli.command.codemagic.configure.description': 'Configurar credenciales API de Codemagic',
1885
2164
  'cli.command.codemagic.release.description': 'Iniciar build del workflow iOS en Codemagic',
1886
2165
  'cli.command.codemagic.status.description': 'Estado del build Codemagic por ID',
2166
+ 'cli.command.codemagic.picker.intro': 'Compilar en la nube con Codemagic',
2167
+ 'cli.command.codemagic.picker.message': '¿Qué quieres hacer?',
2168
+ 'cli.command.codemagic.picker.statusHint': 'Pregunta el ID del build',
2169
+ 'cli.command.codemagic.help.before': 'Como compilar con Codemagic (sin necesitar Mac):\n 1) kasy codemagic configure → hazlo una vez (guarda el token de la API)\n 2) kasy codemagic release → inicia un build en la nube por version\n\nUsa "status <buildId>" para seguir el progreso de un build.\n',
1887
2170
 
1888
2171
  'ios.configure.title': 'App Store iOS — configuración',
1889
2172
  'ios.configure.bundleId': 'Bundle ID',
1890
2173
  'ios.configure.doc': 'Guía',
1891
2174
  'ios.configure.openingLinks': 'Abriendo App Store Connect en el navegador…',
2175
+ 'ios.configure.note.title': 'Voy a pedir 3 cosas de App Store Connect',
2176
+ 'ios.configure.note.body': '1) API Key ID — en Users and Access → Keys.\n2) Issuer ID — arriba de la misma pagina.\n3) El archivo .p8 (clave privada) descargado al crear la key.\n\nEl App ID es opcional, solo si tienes varias apps.',
1892
2177
  'ios.configure.q.apiKey': 'Key ID de la API App Store Connect',
1893
2178
  'ios.configure.q.issuerId': 'Issuer ID (UUID)',
1894
2179
  'ios.configure.q.p8Path': 'Ruta del archivo AuthKey_XXXXX.p8 descargado',
@@ -1901,14 +2186,22 @@ const MESSAGES = {
1901
2186
  'ios.configure.next': 'Siguiente paso',
1902
2187
  'ios.release.title': 'Generando y subiendo release iOS…',
1903
2188
  'ios.release.success': 'Release iOS subida',
2189
+ 'ios.release.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
2190
+ 'ios.release.task.uploading': 'Subiendo IPA a App Store Connect…',
2191
+ 'ios.release.task.done': 'Compilacion + subida completadas',
2192
+ 'ios.release.task.failed': 'La compilacion fallo — mira la salida debajo',
1904
2193
  'ios.build.title': 'Generando IPA iOS…',
1905
2194
  'ios.build.success': 'IPA generado',
2195
+ 'ios.build.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
2196
+ 'ios.build.task.done': 'IPA listo en build/ios/ipa/',
2197
+ 'ios.build.task.failed': 'La compilacion fallo — mira la salida debajo',
1906
2198
  'ios.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
1907
2199
  'ios.error.noScript': 'scripts/release-ios.sh no encontrado. Ejecute: kasy update ios-release',
1908
2200
  'ios.error.notMac': 'Release iOS local requiere macOS con Xcode.',
1909
2201
  'ios.error.useCodemagic': 'Use release en la nube',
1910
2202
  'ios.error.notConfigured': 'Credenciales Apple no configuradas',
1911
2203
  'ios.error.runConfigure': 'Ejecute: kasy ios configure',
2204
+ 'ios.release.askConfigure': '¿Quieres configurar las credenciales Apple ahora?',
1912
2205
  'ios.error.signing': 'Firma iOS no configurada (falta DEVELOPMENT_TEAM).',
1913
2206
  'ios.error.signingHint': 'Abra ios/Runner.xcworkspace en Xcode → Runner → Signing & Capabilities → elija su Team.',
1914
2207
  'ios.error.googleUrlScheme': 'URL scheme iOS de Google Sign-In no configurado.',
@@ -1941,8 +2234,12 @@ const MESSAGES = {
1941
2234
  'codemagic.configure.next': 'Siguiente paso',
1942
2235
  'codemagic.release.title': 'Disparando build en Codemagic…',
1943
2236
  'codemagic.release.triggered': 'Build iniciado',
2237
+ 'codemagic.release.spin': 'Iniciando build en Codemagic…',
2238
+ 'codemagic.release.spinDone': 'Build encolado en Codemagic',
1944
2239
  'codemagic.status.title': 'Estado del build',
1945
2240
  'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
2241
+ 'codemagic.status.spin': 'Consultando estado del build…',
2242
+ 'codemagic.status.spinDone': 'Estado obtenido',
1946
2243
  'codemagic.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
1947
2244
  'codemagic.error.notConfigured': 'Codemagic no configurado',
1948
2245
  'codemagic.error.addCi': 'Agregue CI primero: kasy add ci (crea codemagic.yaml)',
@@ -2196,9 +2493,48 @@ const MESSAGES = {
2196
2493
 
2197
2494
  // run command
2198
2495
  'cli.command.run.description': 'Corre la app en celular, simulador o navegador',
2496
+ 'cli.command.reset.description': 'Desinstala la app en simulador/emulador/dispositivo para probar como primera instalación',
2497
+ 'reset.title': 'Resetear app en el dispositivo',
2498
+ 'reset.scanning': 'Buscando simuladores, emuladores y dispositivos conectados...',
2499
+ 'reset.prompt.pickDevice': '¿En cuál quieres resetear?',
2500
+ 'reset.resetting': 'Reseteando',
2501
+ 'reset.reinstalling': 'Reinstalando la app...',
2502
+ 'reset.success.uninstalled': 'App desinstalada. Todos los datos y permisos fueron eliminados.',
2503
+ 'reset.info.notInstalled': 'La app no estaba instalada en este dispositivo.',
2504
+ 'reset.warn.noDevices': 'Ningún simulador, emulador o dispositivo en ejecución. Inicia uno e intenta de nuevo.',
2505
+ 'reset.warn.nothingSelected': 'Ningún dispositivo seleccionado.',
2506
+ 'reset.warn.iosUninstallFailed': 'simctl uninstall falló.',
2507
+ 'reset.warn.androidUninstallFailed': 'adb uninstall no devolvió éxito.',
2508
+ 'reset.warn.iosDeviceManual': 'iPhone físico: borra la app manualmente (mantén pulsado el ícono → Eliminar app), luego reinstala con kasy run.',
2509
+ 'reset.warn.iosDeviceUninstallFailed': 'devicectl no pudo desinstalar. Verifica que el iPhone esté desbloqueado y confíe en esta Mac.',
2510
+ 'reset.warn.webIncognito': 'Web: abre la app en una ventana de incógnito/privada del navegador para probar como nuevo visitante.',
2511
+ 'reset.warn.unknownPlatform': 'Plataforma no soportada',
2512
+ 'reset.error.notFlutterProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
2513
+ 'reset.error.noIdentifier': 'No pude leer el bundle id ni el package name de Android de este proyecto.',
2514
+ 'reset.error.noBundleId': 'Bundle id de iOS no encontrado.',
2515
+ 'reset.error.noPackageName': 'applicationId de Android no encontrado.',
2516
+ 'reset.outro.skipped': 'Listo. La app no fue desinstalada.',
2517
+ 'reset.outro.uninstalledOnly': 'Listo. Ejecuta kasy run para reinstalar.',
2518
+ 'reset.outro.cancelled': 'Cancelado. La app no fue desinstalada.',
2519
+ 'reset.prompt.xcodeOpen': 'Xcode está abierto y va a entrar en conflicto con la instalación. ¿Qué quieres hacer?',
2520
+ 'reset.prompt.xcodeOpen.close': 'Cerrar Xcode automáticamente (recomendado)',
2521
+ 'reset.prompt.xcodeOpen.skip': 'Dejar Xcode abierto e intentar igual',
2522
+ 'reset.prompt.xcodeOpen.cancel': 'Cancelar reset',
2523
+ 'reset.info.xcodeClosed': 'Xcode cerrado.',
2524
+ 'reset.prompt.reinstallNow': 'App removida. Verifica en el dispositivo y reinstalar ahora?',
2199
2525
  'run.launching': 'Iniciando app Flutter...',
2200
2526
  'run.updateHint.prefix': 'Mejoras disponibles para el proyecto —',
2201
2527
  'run.updateHint.suffix': 'para ver las novedades',
2528
+ 'run.spinner.building': 'Iniciando Flutter…',
2529
+ 'run.spinner.ready': 'Flutter listo — usa r (reload), R (restart), q (salir)',
2530
+ 'run.spinner.failed': 'Flutter run fallo antes de iniciar',
2531
+ 'run.stage.gradleFirstTime': 'Compilando Android (1.ª vez tarda 5-15 min — Gradle bajando dependencias)…',
2532
+ 'run.stage.gradle': 'Compilando Android…',
2533
+ 'run.stage.xcode': 'Compilando iOS…',
2534
+ 'run.stage.pods': 'Instalando pods iOS…',
2535
+ 'run.stage.installing': 'Instalando en el dispositivo…',
2536
+ 'run.stage.syncing': 'Sincronizando archivos con el dispositivo…',
2537
+ 'run.stage.buildSuccess': 'Build listo — abriendo la app…',
2202
2538
  'run.error.notFlutterProject': 'No se encontro pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
2203
2539
  'run.error.flutterNotFound': 'Flutter no encontrado. Verifica que Flutter este instalado y en el PATH.',
2204
2540
 
@@ -2218,9 +2554,86 @@ const MESSAGES = {
2218
2554
  // docs command
2219
2555
  'cli.command.docs.description': 'Abre la documentación completa',
2220
2556
 
2557
+ // splash command
2558
+ 'cli.command.splash.description': 'Cambia los logos del splash (claro/oscuro) y regenera los assets nativos',
2559
+ 'splash.intro': 'Splash screen',
2560
+ 'splash.validating': 'Validando archivos PNG...',
2561
+ 'splash.validated': 'Los PNGs están bien',
2562
+ 'splash.copying': 'Copiando logos a assets/images/...',
2563
+ 'splash.copied': 'Logos copiados',
2564
+ 'splash.generating': 'Regenerando splash nativo (Android, iOS, Web)...',
2565
+ 'splash.generated': 'Splash nativo regenerado',
2566
+ 'splash.done': 'Listo. Ejecuta "flutter run" para ver el nuevo splash.',
2567
+ 'splash.warn.title': 'Avisos',
2568
+ 'splash.warn.noAlphaLight': '{path} no tiene canal alpha (fondo transparente). El logo aparecerá con fondo sólido en vez de transparente.',
2569
+ 'splash.warn.noAlphaDark': '{path} no tiene canal alpha (fondo transparente). El logo aparecerá con fondo sólido en vez de transparente.',
2570
+ 'splash.warn.smallLight': 'El logo claro mide {w}x{h}. Lo recomendado es al menos 768x768 para evitar bordes borrosos.',
2571
+ 'splash.warn.smallDark': 'El logo oscuro mide {w}x{h}. Lo recomendado es al menos 768x768 para evitar bordes borrosos.',
2572
+ 'splash.summary.title': 'Guardado',
2573
+ 'splash.summary.light': 'Modo claro',
2574
+ 'splash.summary.dark': 'Modo oscuro',
2575
+ 'splash.skipGenerate.title': 'Generación omitida',
2576
+ 'splash.skipGenerate.hint': 'Ejecuta `dart run flutter_native_splash:create` cuando estés listo.',
2577
+ 'splash.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
2578
+ 'splash.error.bothRequired': '--light y --dark son obligatorios.',
2579
+ 'splash.error.fileNotFound': 'Archivo no encontrado: {path}',
2580
+ 'splash.error.notPng': 'Uno de los archivos no es un PNG válido.',
2581
+ 'splash.error.generateFailed': 'flutter_native_splash:create falló. Revisa la salida.',
2582
+
2583
+ // icon command
2584
+ 'cli.command.icon.description': 'Cambia el ícono del app (iOS + Android) y regenera los assets nativos',
2585
+ 'icon.intro': 'Ícono del app',
2586
+ 'icon.validating': 'Validando archivo PNG...',
2587
+ 'icon.validated': 'PNG está bien',
2588
+ 'icon.copying': 'Copiando ícono a assets/images/icon.png...',
2589
+ 'icon.copied': 'Ícono copiado',
2590
+ 'icon.generating': 'Regenerando íconos nativos (Android + iOS)...',
2591
+ 'icon.generated': 'Íconos nativos regenerados',
2592
+ 'icon.done': 'Listo. Desinstala el app del dispositivo y reinstala para ver el nuevo ícono.',
2593
+ 'icon.warn.title': 'Avisos',
2594
+ 'icon.warn.notSquare': 'El ícono mide {w}x{h} (no es cuadrado). La imagen se estirará. Usa una imagen cuadrada (1024x1024 recomendado).',
2595
+ 'icon.warn.small': 'El ícono mide {w}x{h}. Lo recomendado es al menos 1024x1024 (App Store exige ese tamaño).',
2596
+ 'icon.warn.hasAlpha': 'El ícono tiene transparencia. iOS rechaza íconos con canal alpha — flutter_launcher_icons lo elimina automáticamente (remove_alpha_ios: true).',
2597
+ 'icon.summary.title': 'Guardado',
2598
+ 'icon.summary.icon': 'Ícono del app',
2599
+ 'icon.skipGenerate.title': 'Generación omitida',
2600
+ 'icon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
2601
+ 'icon.reinstall.title': 'Importante',
2602
+ 'icon.reinstall.hint': 'iOS y Android cachean el ícono anterior. Desinstala el app y reinstala para ver el nuevo.',
2603
+ 'icon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
2604
+ 'icon.error.imageRequired': '--image es obligatorio.',
2605
+ 'icon.error.fileNotFound': 'Archivo no encontrado: {path}',
2606
+ 'icon.error.notPng': 'El archivo no es un PNG válido.',
2607
+ 'icon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
2608
+
2609
+ // favicon command
2610
+ 'cli.command.favicon.description': 'Cambia el favicon / ícono PWA de la web y regenera los assets web',
2611
+ 'favicon.intro': 'Favicon web',
2612
+ 'favicon.validating': 'Validando archivo PNG...',
2613
+ 'favicon.validated': 'PNG está bien',
2614
+ 'favicon.copying': 'Copiando favicon a assets/images/favicon.png...',
2615
+ 'favicon.copied': 'Favicon copiado',
2616
+ 'favicon.generating': 'Regenerando íconos web (favicon + tamaños PWA)...',
2617
+ 'favicon.generated': 'Íconos web regenerados',
2618
+ 'favicon.done': 'Listo. Ejecuta "flutter run -d chrome" para ver el nuevo favicon.',
2619
+ 'favicon.warn.title': 'Avisos',
2620
+ 'favicon.warn.notSquare': 'El favicon mide {w}x{h} (no es cuadrado). Se estirará. Usa una imagen cuadrada (512x512+ recomendado).',
2621
+ 'favicon.warn.small': 'El favicon mide {w}x{h}. Lo recomendado es al menos 512x512 para que se vea nítido en las pantallas de instalación PWA.',
2622
+ 'favicon.summary.title': 'Guardado',
2623
+ 'favicon.summary.favicon': 'Favicon',
2624
+ 'favicon.skipGenerate.title': 'Generación omitida',
2625
+ 'favicon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
2626
+ 'favicon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
2627
+ 'favicon.error.imageRequired': '--image es obligatorio.',
2628
+ 'favicon.error.fileNotFound': 'Archivo no encontrado: {path}',
2629
+ 'favicon.error.notPng': 'El archivo no es un PNG válido.',
2630
+ 'favicon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
2631
+
2221
2632
  // notifications command
2222
2633
  'cli.command.notifications.description': 'Edita los textos de las notificaciones locales y recordatorios',
2223
2634
  'cli.command.notifications.text.description': 'Define titulos y mensajes de notificaciones locales',
2635
+ 'cli.command.notifications.picker.intro': 'Editar textos de las notificaciones',
2636
+ 'cli.command.notifications.picker.message': '¿Qué quieres hacer?',
2224
2637
  'notifications.error.notKasyProject': 'No se encontro kit_setup.json. Ejecuta dentro de un proyecto Kasy.',
2225
2638
  'notifications.error.noI18n': 'lib/i18n/*.i18n.json no encontrado en este proyecto.',
2226
2639
  'notifications.error.noFeatures': 'lib/core/config/features.dart no encontrado.',