kasy-cli 1.32.0 → 1.35.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 (169) hide show
  1. package/README.md +1 -1
  2. package/bin/kasy.js +66 -2
  3. package/docs/cli-reference.md +7 -7
  4. package/lib/commands/apple-web.js +222 -0
  5. package/lib/commands/configure.js +3 -91
  6. package/lib/commands/doctor.js +20 -0
  7. package/lib/commands/facebook.js +189 -0
  8. package/lib/commands/new.js +61 -11
  9. package/lib/commands/release-version.js +234 -0
  10. package/lib/commands/update.js +27 -0
  11. package/lib/scaffold/CHANGELOG.json +27 -0
  12. package/lib/scaffold/backends/api/patch/lib/features/authentication/api/authentication_api.dart +24 -0
  13. package/lib/scaffold/backends/api/patch/lib/features/authentication/api/authentication_api_interface.dart +15 -0
  14. package/lib/scaffold/backends/api/patch/lib/features/authentication/repositories/authentication_repository.dart +27 -0
  15. package/lib/scaffold/backends/api/patch/lib/features/subscriptions/api/entities/subscription_entity.dart +1 -0
  16. package/lib/scaffold/backends/firebase/setup-from-scratch.js +199 -21
  17. package/lib/scaffold/backends/patch-base-hashes.json +66 -0
  18. package/lib/scaffold/backends/supabase/deploy.js +92 -0
  19. package/lib/scaffold/backends/supabase/edge-functions/stripe-webhook/index.ts +2 -0
  20. package/lib/scaffold/backends/supabase/migrations/20240101000007_welcome_notification.sql +36 -23
  21. package/lib/scaffold/backends/supabase/migrations/20240101000014_subscription_trial_end.sql +6 -0
  22. package/lib/scaffold/backends/supabase/patch/lib/features/authentication/api/authentication_api.dart +92 -3
  23. package/lib/scaffold/backends/supabase/patch/lib/features/authentication/repositories/authentication_repository.dart +36 -0
  24. package/lib/scaffold/backends/supabase/patch/lib/features/subscriptions/api/entities/subscription_entity.dart +1 -0
  25. package/lib/scaffold/generate.js +53 -4
  26. package/lib/scaffold/shared/generator-utils.js +18 -6
  27. package/lib/utils/apple-web.js +147 -0
  28. package/lib/utils/facebook.js +162 -0
  29. package/lib/utils/i18n/messages-en.js +85 -0
  30. package/lib/utils/i18n/messages-es.js +85 -0
  31. package/lib/utils/i18n/messages-pt.js +85 -0
  32. package/package.json +5 -2
  33. package/templates/firebase/.firebase/hosting.YnVpbGQvd2Vi.cache +73 -0
  34. package/templates/firebase/AGENTS.md +170 -0
  35. package/templates/firebase/CLAUDE.md +16 -0
  36. package/templates/firebase/DESIGN_SYSTEM.md +269 -0
  37. package/templates/firebase/docs/auth-setup.en.md +4 -2
  38. package/templates/firebase/docs/auth-setup.es.md +4 -2
  39. package/templates/firebase/docs/auth-setup.pt.md +4 -2
  40. package/templates/firebase/firebase.json +56 -1
  41. package/templates/firebase/functions/src/authentication/triggers.ts +10 -6
  42. package/templates/firebase/functions/src/core/data/entities/subscription_entity.ts +5 -0
  43. package/templates/firebase/functions/src/core/data/entities/user_entity.ts +9 -1
  44. package/templates/firebase/functions/src/core/data/repositories/user_repository.ts +27 -0
  45. package/templates/firebase/functions/src/subscriptions/models/subscriptions.ts +3 -0
  46. package/templates/firebase/functions/src/subscriptions/stripe_functions.ts +4 -0
  47. package/templates/firebase/lib/components/components.dart +1 -0
  48. package/templates/firebase/lib/components/kasy_alert.dart +0 -1
  49. package/templates/firebase/lib/components/kasy_app_bar.dart +35 -17
  50. package/templates/firebase/lib/components/kasy_bottom_sheet.dart +0 -1
  51. package/templates/firebase/lib/components/kasy_date_picker.dart +0 -5
  52. package/templates/firebase/lib/components/kasy_dialog.dart +0 -1
  53. package/templates/firebase/lib/components/kasy_otp_verification_bottom_sheet.dart +1 -1
  54. package/templates/firebase/lib/components/kasy_screen.dart +114 -0
  55. package/templates/firebase/lib/components/kasy_sidebar.dart +189 -120
  56. package/templates/firebase/lib/components/kasy_text_area.dart +0 -1
  57. package/templates/firebase/lib/components/kasy_text_field.dart +0 -1
  58. package/templates/firebase/lib/components/kasy_text_field_otp.dart +0 -1
  59. package/templates/firebase/lib/components/kasy_toast.dart +108 -73
  60. package/templates/firebase/lib/core/app_update/app_update_repository.dart +54 -0
  61. package/templates/firebase/lib/core/app_update/app_update_status.dart +14 -0
  62. package/templates/firebase/lib/core/app_update/update_available_sheet.dart +70 -0
  63. package/templates/firebase/lib/core/bottom_menu/active_tab_notifier.dart +40 -3
  64. package/templates/firebase/lib/core/bottom_menu/bottom_menu.dart +82 -34
  65. package/templates/firebase/lib/core/bottom_menu/web_content_wrapper.dart +6 -6
  66. package/templates/firebase/lib/core/bottom_menu/web_url.dart +20 -0
  67. package/templates/firebase/lib/core/chrome/chrome_visibility.dart +22 -0
  68. package/templates/firebase/lib/core/config/features.dart +5 -0
  69. package/templates/firebase/lib/core/data/api/remote_config_api.dart +38 -1
  70. package/templates/firebase/lib/core/guards/guard.dart +16 -2
  71. package/templates/firebase/lib/core/icons/kasy_icons.dart +3 -0
  72. package/templates/firebase/lib/core/rating/widgets/rate_banner.dart +2 -5
  73. package/templates/firebase/lib/core/rating/widgets/review_popup.dart +48 -124
  74. package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +14 -0
  75. package/templates/firebase/lib/core/states/components/maybe_show_update_available.dart +32 -0
  76. package/templates/firebase/lib/core/states/logout_action.dart +5 -1
  77. package/templates/firebase/lib/core/states/user_state_notifier.dart +85 -14
  78. package/templates/firebase/lib/core/theme/responsive_text_theme.dart +69 -0
  79. package/templates/firebase/lib/core/theme/texts.dart +90 -57
  80. package/templates/firebase/lib/core/theme/type_scale.dart +77 -0
  81. package/templates/firebase/lib/core/theme/web_background_sync_web.dart +20 -6
  82. package/templates/firebase/lib/core/utils/image_bytes_loader.dart +12 -0
  83. package/templates/firebase/lib/core/utils/image_bytes_loader_io.dart +28 -0
  84. package/templates/firebase/lib/core/utils/image_bytes_loader_web.dart +56 -0
  85. package/templates/firebase/lib/core/web_screen_width.dart +15 -0
  86. package/templates/firebase/lib/core/web_screen_width_io.dart +3 -0
  87. package/templates/firebase/lib/core/web_screen_width_web.dart +10 -0
  88. package/templates/firebase/lib/core/web_viewport_scale.dart +61 -25
  89. package/templates/firebase/lib/core/widgets/focus_visibility.dart +89 -0
  90. package/templates/firebase/lib/core/widgets/update_bottom_sheet.dart +29 -126
  91. package/templates/firebase/lib/features/ai_chat/ai_chat_page.dart +11 -8
  92. package/templates/firebase/lib/features/ai_chat/ui/widgets/ai_chat_composer.dart +21 -0
  93. package/templates/firebase/lib/features/ai_chat/ui/widgets/ai_chat_conversation_view.dart +1 -2
  94. package/templates/firebase/lib/features/ai_chat/ui/widgets/ai_conversation_list.dart +2 -3
  95. package/templates/firebase/lib/features/ai_chat/ui/widgets/ai_conversation_tile.dart +1 -2
  96. package/templates/firebase/lib/features/authentication/api/auth_web_support.dart +12 -0
  97. package/templates/firebase/lib/features/authentication/api/auth_web_support_web.dart +25 -0
  98. package/templates/firebase/lib/features/authentication/api/authentication_api.dart +266 -0
  99. package/templates/firebase/lib/features/authentication/api/authentication_api_interface.dart +22 -0
  100. package/templates/firebase/lib/features/authentication/navigation/post_login_navigation.dart +32 -0
  101. package/templates/firebase/lib/features/authentication/providers/phone_auth_notifier.dart +7 -7
  102. package/templates/firebase/lib/features/authentication/providers/signin_state_provider.dart +34 -10
  103. package/templates/firebase/lib/features/authentication/providers/signup_state_provider.dart +2 -2
  104. package/templates/firebase/lib/features/authentication/repositories/authentication_repository.dart +37 -0
  105. package/templates/firebase/lib/features/authentication/repositories/exceptions/authentication_exceptions.dart +8 -0
  106. package/templates/firebase/lib/features/authentication/ui/components/otp_verification.dart +2 -2
  107. package/templates/firebase/lib/features/authentication/ui/components/phone_input.dart +2 -2
  108. package/templates/firebase/lib/features/authentication/ui/signin_page.dart +80 -15
  109. package/templates/firebase/lib/features/authentication/ui/signup_page.dart +20 -14
  110. package/templates/firebase/lib/features/authentication/ui/widgets/auth_card_scaffold.dart +2 -2
  111. package/templates/firebase/lib/features/authentication/ui/widgets/recover_password_result.dart +2 -2
  112. package/templates/firebase/lib/features/feedbacks/ui/widgets/add_feature_button.dart +0 -1
  113. package/templates/firebase/lib/features/feedbacks/ui/widgets/feature_card.dart +1 -2
  114. package/templates/firebase/lib/features/home/design_system_page.dart +134 -67
  115. package/templates/firebase/lib/features/home/home_components_page.dart +8 -1
  116. package/templates/firebase/lib/features/home/home_components_preview_page.dart +1 -3
  117. package/templates/firebase/lib/features/home/home_components_preview_registry.dart +186 -56
  118. package/templates/firebase/lib/features/home/home_page.dart +4 -0
  119. package/templates/firebase/lib/features/local_reminders/ui/reminder_page.dart +169 -208
  120. package/templates/firebase/lib/features/notifications/providers/notifications_provider.dart +10 -0
  121. package/templates/firebase/lib/features/notifications/ui/components/notification_settings_sheet.dart +2 -2
  122. package/templates/firebase/lib/features/notifications/ui/components/notification_tile.dart +21 -8
  123. package/templates/firebase/lib/features/notifications/ui/components/push_notification_switcher.dart +2 -2
  124. package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +3 -4
  125. package/templates/firebase/lib/features/notifications/ui/widgets/notification_tile.dart +84 -128
  126. package/templates/firebase/lib/features/onboarding/providers/onboarding_model.dart +11 -0
  127. package/templates/firebase/lib/features/onboarding/providers/onboarding_provider.dart +30 -3
  128. package/templates/firebase/lib/features/onboarding/ui/components/onboarding_loader.dart +13 -4
  129. package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +3 -4
  130. package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +2 -4
  131. package/templates/firebase/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +2 -1
  132. package/templates/firebase/lib/features/settings/settings_page.dart +152 -11
  133. package/templates/firebase/lib/features/settings/ui/components/admin/admin_page.dart +58 -21
  134. package/templates/firebase/lib/features/settings/ui/components/admin/admin_users_tab.dart +12 -12
  135. package/templates/firebase/lib/features/settings/ui/components/admin/send_push_notification_page.dart +1 -4
  136. package/templates/firebase/lib/features/settings/ui/components/avatar_component.dart +2 -2
  137. package/templates/firebase/lib/features/settings/ui/components/create_password_sheet.dart +141 -0
  138. package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +0 -1
  139. package/templates/firebase/lib/features/settings/ui/widgets/admin_card.dart +42 -38
  140. package/templates/firebase/lib/features/settings/ui/widgets/settings_tile.dart +17 -2
  141. package/templates/firebase/lib/features/subscriptions/api/entities/subscription_entity.dart +3 -0
  142. package/templates/firebase/lib/features/subscriptions/api/stripe_product.dart +12 -11
  143. package/templates/firebase/lib/features/subscriptions/repositories/subscription_repository.dart +25 -2
  144. package/templates/firebase/lib/features/subscriptions/ui/component/active_premium_content.dart +319 -143
  145. package/templates/firebase/lib/features/subscriptions/ui/component/paywall_minimal.dart +1 -5
  146. package/templates/firebase/lib/features/subscriptions/ui/component/paywall_row.dart +1 -5
  147. package/templates/firebase/lib/features/subscriptions/ui/component/paywall_with_switch.dart +2 -5
  148. package/templates/firebase/lib/features/subscriptions/ui/component/premium_content.dart +1 -4
  149. package/templates/firebase/lib/features/subscriptions/ui/widgets/feature_line.dart +1 -2
  150. package/templates/firebase/lib/features/subscriptions/ui/widgets/premium_banner.dart +2 -7
  151. package/templates/firebase/lib/features/subscriptions/ui/widgets/premium_feature.dart +2 -4
  152. package/templates/firebase/lib/features/subscriptions/ui/widgets/selectable_col.dart +1 -4
  153. package/templates/firebase/lib/features/subscriptions/ui/widgets/selectable_row.dart +0 -3
  154. package/templates/firebase/lib/i18n/en.i18n.json +54 -7
  155. package/templates/firebase/lib/i18n/es.i18n.json +54 -7
  156. package/templates/firebase/lib/i18n/pt.i18n.json +54 -7
  157. package/templates/firebase/lib/main.dart +11 -2
  158. package/templates/firebase/lib/router.dart +94 -13
  159. package/templates/firebase/pubspec.yaml +1 -1
  160. package/templates/firebase/test/core/data/api/fake_remote_config_api.dart +14 -0
  161. package/templates/firebase/test/core/states/user_state_notifier_test.dart +47 -3
  162. package/templates/firebase/test/core/web_viewport_scale_test.dart +68 -0
  163. package/templates/firebase/test/features/authentication/data/api/auth_api_fake.dart +15 -0
  164. package/templates/firebase/tool/design_check.dart +152 -0
  165. package/templates/firebase/web/index.html +162 -14
  166. package/templates/firebase/assets/images/review.png +0 -0
  167. package/templates/firebase/assets/images/update.png +0 -0
  168. package/templates/firebase/lib/core/guards/user_info_guard.dart +0 -61
  169. package/templates/firebase/lib/features/notifications/ui/components/notifications_header.dart +0 -32
@@ -336,6 +336,25 @@ module.exports = {
336
336
  'new.firebase.success.deployStep': '• Deploy backend (from inside the project folder):',
337
337
 
338
338
  'cli.command.deploy.description': 'Publish the server to Firebase or Supabase',
339
+ 'cli.command.releaseVersion.description': 'Announce a new app version to existing users (Firebase Remote Config)',
340
+ 'releaseVersion.intro': 'Announce version → Firebase Remote Config',
341
+ 'releaseVersion.notKasy': 'Not a Kasy project (kit_setup.json not found).',
342
+ 'releaseVersion.noFirebase': 'This command needs a Firebase project (firebase.json not found). Run it inside a project with the Firebase backend.',
343
+ 'releaseVersion.noProject': 'Could not detect the Firebase project. Pass --project <id>.',
344
+ 'releaseVersion.current': 'Installed version (pubspec): {version}',
345
+ 'releaseVersion.detectedProject': 'Firebase project: {id}',
346
+ 'releaseVersion.qVersion': 'Which version is now live in the stores?',
347
+ 'releaseVersion.qForced': 'Force this update? (blocks the app until the user updates)',
348
+ 'releaseVersion.forcedHint': 'Only force when an old version is truly broken — a wrong value locks every user out.',
349
+ 'releaseVersion.summaryOptional': 'Optional update → app_latest_version = {version}',
350
+ 'releaseVersion.summaryForced': 'FORCED update → app_min_version = {version} (+ app_latest_version)',
351
+ 'releaseVersion.qConfirm': 'Publish this to Firebase Remote Config?',
352
+ 'releaseVersion.fetching': 'Reading current Remote Config…',
353
+ 'releaseVersion.deploying': 'Publishing to Remote Config…',
354
+ 'releaseVersion.done': 'Done — {version} is live in Remote Config.',
355
+ 'releaseVersion.failed': 'Failed to update Remote Config (is the Firebase CLI installed and are you logged in? try: firebase login).',
356
+ 'releaseVersion.badVersion': 'Enter a valid SemVer like 1.4.0',
357
+ 'releaseVersion.aborted': 'Aborted.',
339
358
  'cli.command.configure.description': 'Configure optional keys (RevenueCat, Sentry, Mixpanel...) — skippable, picks up where you left off',
340
359
  'configure.title': 'App credential setup',
341
360
  'configure.notKasyProject': 'This folder is not a Kasy project (no pubspec.yaml). Cd into the project and run again.',
@@ -372,6 +391,60 @@ module.exports = {
372
391
  'configure.settingSecrets': 'Setting {count} Firebase Secret(s)…',
373
392
  'configure.savedSecrets': '{count} Firebase Secret(s) set',
374
393
  'configure.secretFailed': 'Could not set secret {key}. Run manually: firebase functions:secrets:set {key}',
394
+ 'cli.command.appleWeb.description': 'Configure Sign in with Apple on the WEB (Firebase or Supabase) using the credentials you created on Apple',
395
+ 'appleWeb.title': 'Apple Sign-In on Web',
396
+ 'appleWeb.notKasyProject': 'This folder does not look like a Kasy project (no kit_setup.json). Enter the project folder and run again.',
397
+ 'appleWeb.missingProjectId': 'Could not find the project ID in kit_setup.json. Generate the project with the CLI before configuring Apple web.',
398
+ 'appleWeb.required': 'Required',
399
+ 'appleWeb.useSaved': 'Use your saved Apple credentials ({id})?',
400
+ 'appleWeb.serviceIdPrompt': 'Apple Service ID (the OAuth client_id):',
401
+ 'appleWeb.teamIdPrompt': 'Apple Team ID:',
402
+ 'appleWeb.keyIdPrompt': 'Key ID of the .p8 key:',
403
+ 'appleWeb.p8Prompt': 'Path to the .p8 file (Sign In with Apple):',
404
+ 'appleWeb.p8ReadError': 'Could not read the .p8 file at that path.',
405
+ 'appleWeb.incomplete': 'Missing data to configure (Service ID, Team ID, Key ID and .p8). Try again.',
406
+ 'appleWeb.configuringFirebase': 'Configuring Apple web on Firebase…',
407
+ 'appleWeb.configuringSupabase': 'Signing the secret and configuring Apple web on Supabase…',
408
+ 'appleWeb.firebaseOk': 'Apple web configured on Firebase (it re-signs the secret itself, never expires).',
409
+ 'appleWeb.supabaseOk': 'Apple web configured on Supabase.',
410
+ 'appleWeb.failed': 'Could not configure Apple web.',
411
+ 'appleWeb.flagUpdated': 'Apple button on web enabled (withAppleWebSignin = true).',
412
+ 'appleWeb.flagMissing': 'Backend configured, but withAppleWebSignin was not found in features.dart to enable the button.',
413
+ 'appleWeb.returnUrlNote': 'Make sure your Service ID Return URL on Apple is exactly:',
414
+ 'appleWeb.manualTitle': 'Manual step on Apple',
415
+ 'appleWeb.expiresNote': 'The Supabase secret expires in ~6 months. Run `kasy apple-web` again to renew (it reuses the saved .p8).',
416
+ 'appleWeb.backendApi': 'API REST backend: auth lives on your server. Set up Sign in with Apple JS on your backend (Service ID + secret). The CLI has nowhere to store it.',
417
+ 'appleWeb.apiDone': 'API backend: nothing to automate here. See the steps above.',
418
+ 'appleWeb.allDone': 'Done! Apple Sign-In on the web is configured.',
419
+ 'appleWeb.notFirebase': 'Apple Sign-In on the web is currently supported only on the Firebase backend (signInWithPopup). On Supabase it is roadmap (native iOS is already set up by `kasy new`); on the API backend auth lives on your server.',
420
+ 'appleWeb.notFirebaseDone': 'Nothing to configure here for Apple web on this backend.',
421
+ 'cli.command.facebook.description': 'Configure Facebook Login (Firebase/Supabase + native files) and guide the manual Meta steps',
422
+ 'facebook.title': 'Facebook Login',
423
+ 'facebook.notKasyProject': 'This folder does not look like a Kasy project (no kit_setup.json). Enter the project folder and run again.',
424
+ 'facebook.metaTitle': 'Manual step on Meta',
425
+ 'facebook.metaIntro': 'Create an app on Meta for Developers (Consumer) and grab: App ID, Client Token (Settings → Advanced) and App Secret (Settings → Basic). Add the Facebook Login product.',
426
+ 'facebook.metaOpenLabel': 'Open the Meta dashboard to create/open your app:',
427
+ 'facebook.metaOpenConfirm': 'Open the Meta dashboard now?',
428
+ 'facebook.useSaved': 'Use your saved Facebook credentials ({id})?',
429
+ 'facebook.required': 'Required',
430
+ 'facebook.appIdPrompt': 'Meta App ID:',
431
+ 'facebook.clientTokenPrompt': 'Meta Client Token:',
432
+ 'facebook.appSecretPrompt': 'Meta App Secret (for the backend provider):',
433
+ 'facebook.incomplete': 'App ID is missing. Try again.',
434
+ 'facebook.nativeOk': 'App ID and Client Token written to Info.plist and strings.xml.',
435
+ 'facebook.nativeMissing': 'Could not find Info.plist/strings.xml to write (run after the native platforms are generated).',
436
+ 'facebook.configuringFirebase': 'Enabling the Facebook provider on Firebase…',
437
+ 'facebook.configuringSupabase': 'Enabling the Facebook provider on Supabase…',
438
+ 'facebook.firebaseOk': 'Facebook provider enabled on Firebase.',
439
+ 'facebook.supabaseOk': 'Facebook provider enabled on Supabase.',
440
+ 'facebook.backendFailed': 'Could not enable the Facebook provider on the backend.',
441
+ 'facebook.backendApi': 'API REST backend: auth lives on your server. Set up Facebook Login on your backend (App ID + App Secret).',
442
+ 'facebook.missingProjectId': 'Could not find the project ID in kit_setup.json. Skipped the backend part (native files were written).',
443
+ 'facebook.noSecret': 'Without an App Secret I skipped the backend part. Run `kasy facebook` with the App Secret to enable the provider.',
444
+ 'facebook.redirectNote': 'On Meta (Facebook Login → Settings), add this Valid OAuth Redirect URI:',
445
+ 'facebook.flagUpdated': 'Facebook button on web enabled (withFacebookWebSignin = true).',
446
+ 'facebook.webRoadmap': 'Facebook Login on web for Supabase is not wired yet (roadmap). Native (iOS/Android) already works.',
447
+ 'facebook.allDone': 'Done! Facebook Login is configured.',
375
448
  'cli.command.check.description': 'Check push notifications setup (use --fix to fix it)',
376
449
  'deploy.q.project': 'Firebase Project ID:',
377
450
  'deploy.q.serviceAccount': 'Path to service account JSON:',
@@ -506,6 +579,8 @@ module.exports = {
506
579
  'doctor.ios.googleUrlSchemeSkipped': 'Google Sign-In iOS URL scheme check skipped (GoogleService-Info.plist not found)',
507
580
  'doctor.ios.appleSignInEntitlementOk': 'Apple Sign-In entitlement configured',
508
581
  'doctor.ios.appleSignInEntitlementMissing': 'Apple Sign-In entitlement missing — add Sign In with Apple capability in Xcode',
582
+ 'doctor.appleWeb.ok': 'Apple Sign-In on web configured',
583
+ 'doctor.appleWeb.pending': 'Apple Sign-In on web not configured (run `kasy apple-web`). iOS already works.',
509
584
  'doctor.ios.facebookOk': 'Facebook credentials configured (iOS)',
510
585
  'doctor.ios.facebookPlaceholders': 'Facebook credentials are still placeholders — update FacebookAppID and FacebookClientToken in Info.plist',
511
586
  'doctor.ios.facebookSkipped': 'Facebook credential check skipped (no FacebookAppID in Info.plist)',
@@ -741,6 +816,12 @@ module.exports = {
741
816
  'new.success.bundleId': 'App identifier (bundle ID)',
742
817
  'new.success.bundleId.hint': "Your app's unique identifier on Android, iOS and Firebase (push).",
743
818
  'new.success.api.serverContracts': 'API backend: you must implement the server contracts (delete account, AI chat and push). See patch/README.md',
819
+ 'new.appleWeb.autoConfigured': 'Apple Sign-In on web configured automatically (reused your saved credentials).',
820
+ 'new.success.appleWeb.configured': 'Apple Sign-In on web: configured',
821
+ 'new.success.appleWeb.pending': 'Apple Sign-In on web: not configured yet (run `kasy apple-web`). iOS already works.',
822
+ 'new.facebook.autoConfigured': 'Facebook Login configured automatically (reused your saved credentials).',
823
+ 'new.success.facebook.configured': 'Facebook Login: configured',
824
+ 'new.success.facebook.pending': 'Facebook Login: not configured yet (run `kasy facebook`).',
744
825
  'new.success.nextSteps': 'Next steps:',
745
826
  'new.success.step.cd': 'Go to your project folder:',
746
827
  'new.success.step.deploy': 'Push the server to Firebase (DB + functions):',
@@ -1072,6 +1153,10 @@ module.exports = {
1072
1153
  'update.success': 'Feature "{module}" updated successfully.',
1073
1154
  'update.componentsSuccess': 'Base components updated successfully.',
1074
1155
  'update.coreSuccess': 'Core files updated successfully.',
1156
+ 'update.mergeHint.title': 'Merge your changes with what is new',
1157
+ 'update.mergeHint.body': '{count} file(s) changed. Check with `git diff`. If you had customized any, just merge yours with the new version.',
1158
+ 'update.mergeHint.aiPrompt': 'With AI: paste into your assistant → "I ran kasy update; merge my changes from the previous commit with the new kit version in these files, keeping both."',
1159
+ 'update.mergeHint.seeAgents': 'Step by step in the project AGENTS.md.',
1075
1160
  'check.intro': 'Kasy Check — Push Notifications',
1076
1161
  'check.firebase.detected': 'Firebase backend',
1077
1162
  'check.firebase.adcInfo': 'Firebase uses Application Default Credentials — no extra setup needed.',
@@ -338,6 +338,25 @@ module.exports = {
338
338
  'new.firebase.success.deployStep': '• Desplegar backend (desde dentro de la carpeta del proyecto):',
339
339
 
340
340
  'cli.command.deploy.description': 'Publica el servidor en Firebase o Supabase',
341
+ 'cli.command.releaseVersion.description': 'Avisa a los usuarios actuales sobre una nueva versión de la app (Firebase Remote Config)',
342
+ 'releaseVersion.intro': 'Anunciar versión → Firebase Remote Config',
343
+ 'releaseVersion.notKasy': 'No es un proyecto Kasy (kit_setup.json no encontrado).',
344
+ 'releaseVersion.noFirebase': 'Este comando necesita un proyecto Firebase (firebase.json no encontrado). Ejecútalo dentro de un proyecto con backend Firebase.',
345
+ 'releaseVersion.noProject': 'No se pudo detectar el proyecto Firebase. Usa --project <id>.',
346
+ 'releaseVersion.current': 'Versión instalada (pubspec): {version}',
347
+ 'releaseVersion.detectedProject': 'Proyecto Firebase: {id}',
348
+ 'releaseVersion.qVersion': '¿Qué versión está publicada ya en las tiendas?',
349
+ 'releaseVersion.qForced': '¿Forzar esta actualización? (bloquea la app hasta que el usuario actualice)',
350
+ 'releaseVersion.forcedHint': 'Solo fuerza cuando una versión antigua esté realmente rota — un valor incorrecto bloquea a todos los usuarios.',
351
+ 'releaseVersion.summaryOptional': 'Actualización opcional → app_latest_version = {version}',
352
+ 'releaseVersion.summaryForced': 'Actualización OBLIGATORIA → app_min_version = {version} (+ app_latest_version)',
353
+ 'releaseVersion.qConfirm': '¿Publicar esto en Firebase Remote Config?',
354
+ 'releaseVersion.fetching': 'Leyendo el Remote Config actual…',
355
+ 'releaseVersion.deploying': 'Publicando en Remote Config…',
356
+ 'releaseVersion.done': 'Listo — {version} está activo en Remote Config.',
357
+ 'releaseVersion.failed': 'No se pudo actualizar Remote Config (¿está instalado el Firebase CLI y has iniciado sesión? prueba: firebase login).',
358
+ 'releaseVersion.badVersion': 'Ingresa un SemVer válido, como 1.4.0',
359
+ 'releaseVersion.aborted': 'Cancelado.',
341
360
  'cli.command.configure.description': 'Configura claves opcionales (RevenueCat, Sentry, Mixpanel...) — puede omitir, recuerda lo que falta',
342
361
  'configure.title': 'Configuración de claves del app',
343
362
  'configure.notKasyProject': 'Esta carpeta no es un proyecto Kasy (no se encontró pubspec.yaml). Entra en la carpeta del proyecto y ejecuta de nuevo.',
@@ -374,6 +393,60 @@ module.exports = {
374
393
  'configure.settingSecrets': 'Guardando {count} Firebase Secret(s)…',
375
394
  'configure.savedSecrets': '{count} Firebase Secret(s) guardado(s)',
376
395
  'configure.secretFailed': 'No pude guardar el secret {key}. Ejecuta manualmente: firebase functions:secrets:set {key}',
396
+ 'cli.command.appleWeb.description': 'Configura el inicio de sesión con Apple en la WEB (Firebase o Supabase) con las credenciales que creaste en Apple',
397
+ 'appleWeb.title': 'Inicio de sesión con Apple en la Web',
398
+ 'appleWeb.notKasyProject': 'Esta carpeta no parece un proyecto Kasy (no encontré kit_setup.json). Entra a la carpeta del proyecto y vuelve a ejecutar.',
399
+ 'appleWeb.missingProjectId': 'No encontré el ID del proyecto en kit_setup.json. Genera el proyecto con la CLI antes de configurar Apple web.',
400
+ 'appleWeb.required': 'Campo obligatorio',
401
+ 'appleWeb.useSaved': '¿Usar las credenciales de Apple guardadas ({id})?',
402
+ 'appleWeb.serviceIdPrompt': 'Apple Service ID (el client_id de OAuth):',
403
+ 'appleWeb.teamIdPrompt': 'Apple Team ID:',
404
+ 'appleWeb.keyIdPrompt': 'Key ID de la clave .p8:',
405
+ 'appleWeb.p8Prompt': 'Ruta del archivo .p8 (Sign In with Apple):',
406
+ 'appleWeb.p8ReadError': 'No pude leer el archivo .p8 en esa ruta.',
407
+ 'appleWeb.incomplete': 'Faltan datos para configurar (Service ID, Team ID, Key ID y .p8). Inténtalo de nuevo.',
408
+ 'appleWeb.configuringFirebase': 'Configurando Apple web en Firebase…',
409
+ 'appleWeb.configuringSupabase': 'Firmando el secret y configurando Apple web en Supabase…',
410
+ 'appleWeb.firebaseOk': 'Apple web configurado en Firebase (vuelve a firmar el secret solo, no expira).',
411
+ 'appleWeb.supabaseOk': 'Apple web configurado en Supabase.',
412
+ 'appleWeb.failed': 'No pude configurar Apple web.',
413
+ 'appleWeb.flagUpdated': 'Botón de Apple en la web activado (withAppleWebSignin = true).',
414
+ 'appleWeb.flagMissing': 'Configuré el backend, pero no encontré withAppleWebSignin en features.dart para activar el botón.',
415
+ 'appleWeb.returnUrlNote': 'Verifica que el Return URL de tu Service ID en Apple sea exactamente:',
416
+ 'appleWeb.manualTitle': 'Paso manual en Apple',
417
+ 'appleWeb.expiresNote': 'El secret de Supabase expira en ~6 meses. Ejecuta `kasy apple-web` de nuevo para renovar (reutiliza la .p8 guardada).',
418
+ 'appleWeb.backendApi': 'Backend API REST: la autenticación vive en tu servidor. Configura Sign in with Apple JS en tu backend (Service ID + secret). La CLI no tiene dónde guardarlo.',
419
+ 'appleWeb.apiDone': 'Backend API: nada que automatizar aquí. Mira los pasos de arriba.',
420
+ 'appleWeb.allDone': '¡Listo! El inicio de sesión con Apple en la web está configurado.',
421
+ 'appleWeb.notFirebase': 'El inicio de sesión con Apple en la web hoy solo se admite en el backend Firebase (signInWithPopup). En Supabase es roadmap (iOS nativo ya está configurado por `kasy new`); en el backend API la autenticación vive en tu servidor.',
422
+ 'appleWeb.notFirebaseDone': 'Nada que configurar aquí para Apple web en este backend.',
423
+ 'cli.command.facebook.description': 'Configura el inicio de sesión con Facebook (Firebase/Supabase + archivos nativos) y guía los pasos manuales en Meta',
424
+ 'facebook.title': 'Inicio de sesión con Facebook',
425
+ 'facebook.notKasyProject': 'Esta carpeta no parece un proyecto Kasy (no encontré kit_setup.json). Entra a la carpeta del proyecto y vuelve a ejecutar.',
426
+ 'facebook.metaTitle': 'Paso manual en Meta',
427
+ 'facebook.metaIntro': 'Crea una app en Meta for Developers (Consumer) y obtén: App ID, Client Token (Settings → Advanced) y App Secret (Settings → Basic). Agrega el producto Facebook Login.',
428
+ 'facebook.metaOpenLabel': 'Abre el panel de Meta para crear/abrir tu app:',
429
+ 'facebook.metaOpenConfirm': '¿Abrir el panel de Meta ahora?',
430
+ 'facebook.useSaved': '¿Usar las credenciales de Facebook guardadas ({id})?',
431
+ 'facebook.required': 'Campo obligatorio',
432
+ 'facebook.appIdPrompt': 'Meta App ID:',
433
+ 'facebook.clientTokenPrompt': 'Meta Client Token:',
434
+ 'facebook.appSecretPrompt': 'Meta App Secret (para el proveedor del backend):',
435
+ 'facebook.incomplete': 'Falta el App ID. Inténtalo de nuevo.',
436
+ 'facebook.nativeOk': 'App ID y Client Token escritos en Info.plist y strings.xml.',
437
+ 'facebook.nativeMissing': 'No encontré Info.plist/strings.xml para escribir (ejecuta después de generar las plataformas nativas).',
438
+ 'facebook.configuringFirebase': 'Habilitando el proveedor de Facebook en Firebase…',
439
+ 'facebook.configuringSupabase': 'Habilitando el proveedor de Facebook en Supabase…',
440
+ 'facebook.firebaseOk': 'Proveedor de Facebook habilitado en Firebase.',
441
+ 'facebook.supabaseOk': 'Proveedor de Facebook habilitado en Supabase.',
442
+ 'facebook.backendFailed': 'No pude habilitar el proveedor de Facebook en el backend.',
443
+ 'facebook.backendApi': 'Backend API REST: la autenticación vive en tu servidor. Configura Facebook Login en tu backend (App ID + App Secret).',
444
+ 'facebook.missingProjectId': 'No encontré el ID del proyecto en kit_setup.json. Omití la parte del backend (los archivos nativos se escribieron).',
445
+ 'facebook.noSecret': 'Sin App Secret omití la parte del backend. Ejecuta `kasy facebook` con el App Secret para habilitar el proveedor.',
446
+ 'facebook.redirectNote': 'En Meta (Facebook Login → Settings), agrega este Valid OAuth Redirect URI:',
447
+ 'facebook.flagUpdated': 'Botón de Facebook en la web activado (withFacebookWebSignin = true).',
448
+ 'facebook.webRoadmap': 'El inicio de sesión con Facebook en la web para Supabase aún no viene activado (roadmap). El nativo (iOS/Android) ya funciona.',
449
+ 'facebook.allDone': '¡Listo! El inicio de sesión con Facebook está configurado.',
377
450
  'cli.command.check.description': 'Verifica si las notificaciones push están configuradas (usa --fix para arreglar)',
378
451
  'deploy.q.project': 'Firebase Project ID:',
379
452
  'deploy.q.serviceAccount': 'Ruta al service account JSON:',
@@ -508,6 +581,8 @@ module.exports = {
508
581
  'doctor.ios.googleUrlSchemeSkipped': 'Check del URL scheme iOS de Google Sign-In omitido (GoogleService-Info.plist ausente)',
509
582
  'doctor.ios.appleSignInEntitlementOk': 'Entitlement de Apple Sign-In configurado',
510
583
  'doctor.ios.appleSignInEntitlementMissing': 'Entitlement de Apple Sign-In ausente — agrega la capability Sign In with Apple en Xcode',
584
+ 'doctor.appleWeb.ok': 'Inicio de sesión con Apple en la web configurado',
585
+ 'doctor.appleWeb.pending': 'Inicio de sesión con Apple en la web no configurado (ejecuta `kasy apple-web`). iOS ya funciona.',
511
586
  'doctor.ios.facebookOk': 'Credenciales de Facebook configuradas (iOS)',
512
587
  'doctor.ios.facebookPlaceholders': 'Credenciales de Facebook son aún placeholders — actualiza FacebookAppID y FacebookClientToken en Info.plist',
513
588
  'doctor.ios.facebookSkipped': 'Check de credenciales de Facebook omitido (FacebookAppID ausente en Info.plist)',
@@ -741,6 +816,12 @@ module.exports = {
741
816
  'new.success.bundleId': 'Identificador de la app (bundle ID)',
742
817
  'new.success.bundleId.hint': 'Identificador único de tu app en Android, iOS y Firebase (push).',
743
818
  'new.success.api.serverContracts': 'Backend API: debes implementar los contratos del servidor (eliminar cuenta, IA chat y push). Consulta patch/README.md',
819
+ 'new.appleWeb.autoConfigured': 'Inicio de sesión con Apple en la web configurado automáticamente (se reutilizaron tus credenciales guardadas).',
820
+ 'new.success.appleWeb.configured': 'Inicio de sesión con Apple en la web: configurado',
821
+ 'new.success.appleWeb.pending': 'Inicio de sesión con Apple en la web: falta configurar (ejecuta `kasy apple-web`). iOS ya funciona.',
822
+ 'new.facebook.autoConfigured': 'Inicio de sesión con Facebook configurado automáticamente (se reutilizaron tus credenciales guardadas).',
823
+ 'new.success.facebook.configured': 'Inicio de sesión con Facebook: configurado',
824
+ 'new.success.facebook.pending': 'Inicio de sesión con Facebook: falta configurar (ejecuta `kasy facebook`).',
744
825
  'new.success.nextSteps': 'Próximos pasos:',
745
826
  'new.success.step.cd': 'Ve a la carpeta del proyecto:',
746
827
  'new.success.step.deploy': 'Sube el servidor a Firebase (DB + funciones):',
@@ -1070,6 +1151,10 @@ module.exports = {
1070
1151
  'update.success': 'Feature "{module}" actualizada exitosamente.',
1071
1152
  'update.componentsSuccess': 'Componentes base actualizados exitosamente.',
1072
1153
  'update.coreSuccess': 'Archivos de core actualizados exitosamente.',
1154
+ 'update.mergeHint.title': 'Combina tus cambios con lo nuevo',
1155
+ 'update.mergeHint.body': '{count} archivo(s) cambiaron. Revisa con `git diff`. Si habías personalizado alguno, solo combina el tuyo con la versión nueva.',
1156
+ 'update.mergeHint.aiPrompt': 'Con IA: pega en tu asistente → "Ejecuté kasy update; combina mis cambios del commit anterior con la versión nueva del kit en estos archivos, manteniendo ambos."',
1157
+ 'update.mergeHint.seeAgents': 'Paso a paso en el AGENTS.md del proyecto.',
1073
1158
  'check.intro': 'Kasy Check — Notificaciones Push',
1074
1159
  'check.firebase.detected': 'Backend Firebase',
1075
1160
  'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — no requiere configuración extra.',
@@ -336,6 +336,25 @@ module.exports = {
336
336
  'new.firebase.success.deployStep': '• Deploy do backend (de dentro da pasta do projeto):',
337
337
 
338
338
  'cli.command.deploy.description': 'Publica o servidor no Firebase ou Supabase',
339
+ 'cli.command.releaseVersion.description': 'Avisa os usuários atuais sobre uma nova versão do app (Firebase Remote Config)',
340
+ 'releaseVersion.intro': 'Anunciar versão → Firebase Remote Config',
341
+ 'releaseVersion.notKasy': 'Não é um projeto Kasy (kit_setup.json não encontrado).',
342
+ 'releaseVersion.noFirebase': 'Este comando precisa de um projeto Firebase (firebase.json não encontrado). Rode dentro de um projeto com backend Firebase.',
343
+ 'releaseVersion.noProject': 'Não foi possível detectar o projeto Firebase. Passe --project <id>.',
344
+ 'releaseVersion.current': 'Versão instalada (pubspec): {version}',
345
+ 'releaseVersion.detectedProject': 'Projeto Firebase: {id}',
346
+ 'releaseVersion.qVersion': 'Qual versão já está publicada nas lojas?',
347
+ 'releaseVersion.qForced': 'Forçar esta atualização? (bloqueia o app até o usuário atualizar)',
348
+ 'releaseVersion.forcedHint': 'Só force quando uma versão antiga estiver realmente quebrada — um valor errado trava todos os usuários.',
349
+ 'releaseVersion.summaryOptional': 'Atualização opcional → app_latest_version = {version}',
350
+ 'releaseVersion.summaryForced': 'Atualização OBRIGATÓRIA → app_min_version = {version} (+ app_latest_version)',
351
+ 'releaseVersion.qConfirm': 'Publicar isto no Firebase Remote Config?',
352
+ 'releaseVersion.fetching': 'Lendo o Remote Config atual…',
353
+ 'releaseVersion.deploying': 'Publicando no Remote Config…',
354
+ 'releaseVersion.done': 'Pronto — {version} está no ar no Remote Config.',
355
+ 'releaseVersion.failed': 'Falha ao atualizar o Remote Config (o Firebase CLI está instalado e você fez login? tente: firebase login).',
356
+ 'releaseVersion.badVersion': 'Informe um SemVer válido, tipo 1.4.0',
357
+ 'releaseVersion.aborted': 'Cancelado.',
339
358
  'cli.command.configure.description': 'Configura chaves opcionais (RevenueCat, Sentry, Mixpanel...) — pode pular, lembra do que falta',
340
359
  'configure.title': 'Configuração de chaves do app',
341
360
  'configure.notKasyProject': 'Esta pasta não parece um projeto Kasy (não encontrei pubspec.yaml). Entre na pasta do projeto e rode novamente.',
@@ -372,6 +391,60 @@ module.exports = {
372
391
  'configure.settingSecrets': 'Gravando {count} Firebase Secret(s)…',
373
392
  'configure.savedSecrets': '{count} Firebase Secret(s) gravado(s)',
374
393
  'configure.secretFailed': 'Não consegui gravar o secret {key}. Rode manualmente: firebase functions:secrets:set {key}',
394
+ 'cli.command.appleWeb.description': 'Configura o login com Apple na WEB (Firebase ou Supabase) com as credenciais que você criou na Apple',
395
+ 'appleWeb.title': 'Login com Apple na Web',
396
+ 'appleWeb.notKasyProject': 'Esta pasta não parece um projeto Kasy (não achei kit_setup.json). Entre na pasta do projeto e rode de novo.',
397
+ 'appleWeb.missingProjectId': 'Não encontrei o ID do projeto no kit_setup.json. Gere o projeto pela CLI antes de configurar o Apple web.',
398
+ 'appleWeb.required': 'Campo obrigatório',
399
+ 'appleWeb.useSaved': 'Usar as credenciais Apple salvas ({id})?',
400
+ 'appleWeb.serviceIdPrompt': 'Apple Service ID (o client_id do OAuth):',
401
+ 'appleWeb.teamIdPrompt': 'Apple Team ID:',
402
+ 'appleWeb.keyIdPrompt': 'Key ID da chave .p8:',
403
+ 'appleWeb.p8Prompt': 'Caminho do arquivo .p8 (Sign In with Apple):',
404
+ 'appleWeb.p8ReadError': 'Não consegui ler o arquivo .p8 nesse caminho.',
405
+ 'appleWeb.incomplete': 'Faltam dados pra configurar (Service ID, Team ID, Key ID e .p8). Tente de novo.',
406
+ 'appleWeb.configuringFirebase': 'Configurando Apple web no Firebase…',
407
+ 'appleWeb.configuringSupabase': 'Assinando o secret e configurando Apple web no Supabase…',
408
+ 'appleWeb.firebaseOk': 'Apple web configurado no Firebase (ele re-assina o secret sozinho, não expira).',
409
+ 'appleWeb.supabaseOk': 'Apple web configurado no Supabase.',
410
+ 'appleWeb.failed': 'Não consegui configurar o Apple web.',
411
+ 'appleWeb.flagUpdated': 'Botão Apple na web ligado (withAppleWebSignin = true).',
412
+ 'appleWeb.flagMissing': 'Configurei o backend, mas não achei withAppleWebSignin em features.dart pra ligar o botão.',
413
+ 'appleWeb.returnUrlNote': 'Confira que o Return URL do seu Service ID na Apple é exatamente:',
414
+ 'appleWeb.manualTitle': 'Passo manual na Apple',
415
+ 'appleWeb.expiresNote': 'O secret do Supabase expira em ~6 meses. Rode `kasy apple-web` de novo pra renovar (ele reaproveita a .p8 salva).',
416
+ 'appleWeb.backendApi': 'Backend API REST: a autenticação é do seu servidor. Configure o Sign in with Apple JS no seu backend (Service ID + secret). A CLI não tem onde gravar.',
417
+ 'appleWeb.apiDone': 'Backend API: nada pra automatizar aqui. Veja os passos acima.',
418
+ 'appleWeb.allDone': 'Pronto! O login com Apple na web está configurado.',
419
+ 'appleWeb.notFirebase': 'Login com Apple na web hoje é suportado só no backend Firebase (signInWithPopup). No Supabase é roadmap (o iOS nativo já está configurado pelo `kasy new`); no backend API a auth é do seu servidor.',
420
+ 'appleWeb.notFirebaseDone': 'Nada a configurar aqui pra Apple web neste backend.',
421
+ 'cli.command.facebook.description': 'Configura o login com Facebook (Firebase/Supabase + arquivos nativos) e guia os passos manuais na Meta',
422
+ 'facebook.title': 'Login com Facebook',
423
+ 'facebook.notKasyProject': 'Esta pasta não parece um projeto Kasy (não achei kit_setup.json). Entre na pasta do projeto e rode de novo.',
424
+ 'facebook.metaTitle': 'Passo manual na Meta',
425
+ 'facebook.metaIntro': 'Crie um app no Meta for Developers (Consumer) e pegue: App ID, Client Token (Settings → Advanced) e App Secret (Settings → Basic). Ative o produto Facebook Login.',
426
+ 'facebook.metaOpenLabel': 'Abra o painel da Meta pra criar/abrir seu app:',
427
+ 'facebook.metaOpenConfirm': 'Abrir o painel da Meta agora?',
428
+ 'facebook.useSaved': 'Usar as credenciais do Facebook salvas ({id})?',
429
+ 'facebook.required': 'Campo obrigatório',
430
+ 'facebook.appIdPrompt': 'Meta App ID:',
431
+ 'facebook.clientTokenPrompt': 'Meta Client Token:',
432
+ 'facebook.appSecretPrompt': 'Meta App Secret (pro provedor do backend):',
433
+ 'facebook.incomplete': 'Faltou o App ID. Tente de novo.',
434
+ 'facebook.nativeOk': 'App ID e Client Token gravados no Info.plist e strings.xml.',
435
+ 'facebook.nativeMissing': 'Não achei Info.plist/strings.xml pra gravar (rode depois de gerar as plataformas nativas).',
436
+ 'facebook.configuringFirebase': 'Habilitando o provedor Facebook no Firebase…',
437
+ 'facebook.configuringSupabase': 'Habilitando o provedor Facebook no Supabase…',
438
+ 'facebook.firebaseOk': 'Provedor Facebook habilitado no Firebase.',
439
+ 'facebook.supabaseOk': 'Provedor Facebook habilitado no Supabase.',
440
+ 'facebook.backendFailed': 'Não consegui habilitar o provedor Facebook no backend.',
441
+ 'facebook.backendApi': 'Backend API REST: a autenticação é do seu servidor. Configure o Facebook Login no seu backend (App ID + App Secret).',
442
+ 'facebook.missingProjectId': 'Não encontrei o ID do projeto no kit_setup.json. Pulei a parte do backend (os arquivos nativos foram gravados).',
443
+ 'facebook.noSecret': 'Sem App Secret, pulei a parte do backend. Rode `kasy facebook` com o App Secret pra habilitar o provedor.',
444
+ 'facebook.redirectNote': 'Na Meta (Facebook Login → Settings), adicione este Valid OAuth Redirect URI:',
445
+ 'facebook.flagUpdated': 'Botão Facebook na web ligado (withFacebookWebSignin = true).',
446
+ 'facebook.webRoadmap': 'Login Facebook na web no Supabase ainda não vem ligado (roadmap). O nativo (iOS/Android) já funciona.',
447
+ 'facebook.allDone': 'Pronto! O Facebook Login está configurado.',
375
448
  'cli.command.check.description': 'Confere se as notificações push estão configuradas (use --fix para corrigir)',
376
449
  'deploy.q.project': 'Firebase Project ID:',
377
450
  'deploy.q.serviceAccount': 'Caminho para o service account JSON:',
@@ -506,6 +579,8 @@ module.exports = {
506
579
  'doctor.ios.googleUrlSchemeSkipped': 'Check do URL scheme iOS do Google Sign-In ignorado (GoogleService-Info.plist ausente)',
507
580
  'doctor.ios.appleSignInEntitlementOk': 'Entitlement do Apple Sign-In configurado',
508
581
  'doctor.ios.appleSignInEntitlementMissing': 'Entitlement do Apple Sign-In ausente — adicione a capability Sign In with Apple no Xcode',
582
+ 'doctor.appleWeb.ok': 'Login com Apple na web configurado',
583
+ 'doctor.appleWeb.pending': 'Login com Apple na web não configurado (rode `kasy apple-web`). O iOS já funciona.',
509
584
  'doctor.ios.facebookOk': 'Credenciais do Facebook configuradas (iOS)',
510
585
  'doctor.ios.facebookPlaceholders': 'Credenciais do Facebook ainda são placeholders — atualize FacebookAppID e FacebookClientToken no Info.plist',
511
586
  'doctor.ios.facebookSkipped': 'Check das credenciais do Facebook ignorado (FacebookAppID ausente no Info.plist)',
@@ -741,6 +816,12 @@ module.exports = {
741
816
  'new.success.bundleId': 'Identificador do app (bundle ID)',
742
817
  'new.success.bundleId.hint': 'Identificador único do seu app no Android, iOS e Firebase (push).',
743
818
  'new.success.api.serverContracts': 'Backend API: você precisa implementar os contratos do servidor (excluir conta, IA chat e push). Veja patch/README.md',
819
+ 'new.appleWeb.autoConfigured': 'Login com Apple na web configurado automaticamente (credenciais salvas reaproveitadas).',
820
+ 'new.success.appleWeb.configured': 'Login com Apple na web: configurado',
821
+ 'new.success.appleWeb.pending': 'Login com Apple na web: falta configurar (rode `kasy apple-web`). O iOS já funciona.',
822
+ 'new.facebook.autoConfigured': 'Login com Facebook configurado automaticamente (credenciais salvas reaproveitadas).',
823
+ 'new.success.facebook.configured': 'Login com Facebook: configurado',
824
+ 'new.success.facebook.pending': 'Login com Facebook: falta configurar (rode `kasy facebook`).',
744
825
  'new.success.nextSteps': 'Próximos passos:',
745
826
  'new.success.step.cd': 'Entre na pasta do projeto:',
746
827
  'new.success.step.deploy': 'Suba o servidor pro Firebase (banco + funções):',
@@ -1070,6 +1151,10 @@ module.exports = {
1070
1151
  'update.success': 'Feature "{module}" atualizada com sucesso.',
1071
1152
  'update.componentsSuccess': 'Componentes base atualizados com sucesso.',
1072
1153
  'update.coreSuccess': 'Arquivos de core atualizados com sucesso.',
1154
+ 'update.mergeHint.title': 'Juntar suas mudanças com o que veio novo',
1155
+ 'update.mergeHint.body': '{count} arquivo(s) mudaram. Veja com `git diff`. Se você tinha customizado algum, é só juntar o seu com o novo.',
1156
+ 'update.mergeHint.aiPrompt': 'Com IA: cole no seu assistente → "Rodei kasy update; junte minhas mudanças do commit anterior com a versão nova do kit nestes arquivos, mantendo as duas coisas."',
1157
+ 'update.mergeHint.seeAgents': 'Passo a passo no AGENTS.md do projeto.',
1073
1158
  'check.intro': 'Kasy Check — Notificações Push',
1074
1159
  'check.firebase.detected': 'Backend Firebase',
1075
1160
  'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — nenhuma configuração extra necessária.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasy-cli",
3
- "version": "1.32.0",
3
+ "version": "1.35.0",
4
4
  "description": "CLI for scaffolding production-ready Flutter SaaS apps with Firebase, Supabase, or API REST backends.",
5
5
  "bin": {
6
6
  "kasy": "./bin/kasy.js"
@@ -31,14 +31,17 @@
31
31
  "access": "public"
32
32
  },
33
33
  "scripts": {
34
- "prepack": "node scripts/check-feature-patches.js && node scripts/bundle-template.js && node test/generated-matches-kit.test.js && node test/supabase-verify-jwt.test.js && node test/supabase-cors.test.js && node test/supabase-google-web.test.js && node test/backend-pubspec-local-reminders.test.js && node test/stripe-webhook-orphan-guard.test.js && node test/facebook-strip.test.js && node test/path-provider-pin.test.js && node test/features-flags-parity.test.js",
34
+ "prepack": "node scripts/check-feature-patches.js && node scripts/check-backend-patches.js && node scripts/bundle-template.js && node test/generated-matches-kit.test.js && node test/supabase-verify-jwt.test.js && node test/supabase-cors.test.js && node test/supabase-google-web.test.js && node test/backend-pubspec-local-reminders.test.js && node test/stripe-webhook-orphan-guard.test.js && node test/facebook-strip.test.js && node test/path-provider-pin.test.js && node test/features-flags-parity.test.js && node test/apple-web.test.js && node test/facebook.test.js",
35
35
  "start": "node ./bin/kasy.js",
36
36
  "setup": "node ./bin/kasy.js setup",
37
37
  "doctor": "node ./bin/kasy.js doctor",
38
38
  "features": "node ./bin/kasy.js features",
39
39
  "validate": "node ./bin/kasy.js validate --analyze-only",
40
+ "validate:backends": "node ./scripts/bundle-template.js && node ./scripts/validate-backends.js",
40
41
  "extract:patch": "node ./scripts/extract_patch.js",
41
42
  "check:firebase": "node ./scripts/check-firebase-template.js",
43
+ "patch:check": "node ./scripts/check-backend-patches.js",
44
+ "patch:bless": "node ./scripts/check-backend-patches.js --bless",
42
45
  "test": "for f in test/*.test.js; do node \"$f\" || exit 1; done",
43
46
  "test:google-ios": "node ./test/google-ios-url-scheme.test.js",
44
47
  "test:apple-release": "node ./test/apple-release.test.js",
@@ -0,0 +1,73 @@
1
+ stripe_success.html,1781195415353,677b2fb430839866f32a33a751aae85b4c4819123be820f3f5b2f689b8eed00e
2
+ manifest.json,1779810782774,1b929ac7267ff738d05646106a0fac3591082b6f365051928a62518af30b3fd5
3
+ local_notifications.js,1772398909034,0b44b177c4b8a705ad1b0e3d7532537aad7b230e9472f93c820742b7548797b8
4
+ flutter.js,1777393608000,b42e549a02f5c1428b0ad85dbdc663d400a6d2db10cb8aefcc0fddd592fd6ceb
5
+ firebase-messaging-sw.js,1772484605561,dba3c939f7c240e62f63d06408d5f70e45f1168d00df98726e6a7a20cbd3b0df
6
+ favicon.png,1779810782545,c967afd3c3d4dd165ef2e5cf3f203c3982dfff6a95881859ed163d9c38d75512
7
+ splash/img/light-4x.png,1780546027751,abf0e55345e532a4645fe14b01c2948b07c78df50cc6da23648837dfb6271c74
8
+ splash/img/light-3x.png,1780546027699,5f02c94032cb7053807ce89603b109f14ea2740eaa3145dc76c924cbe1d534a9
9
+ splash/img/light-2x.png,1780546027647,3c073b9da154ac8be530f8beefa3579246f223acd819e856a2db000fdabcb67e
10
+ splash/img/light-1x.png,1780546027614,928ead755ab10de4d559c3c6751839dd6adf1412271ef8a508707b0938b4baf5
11
+ splash/img/dark-4x.png,1780546027952,d5353a84fd44ec4a28127ceb9d6d04305f99252d92bacfeeebeade4f2ab59bc0
12
+ splash/img/dark-3x.png,1780546027901,c37e7f4f1e37b59291a681179c97211a9d62d60a2ee802dd192879855edf6dec
13
+ splash/img/dark-2x.png,1780546027846,6ca64e1d4aa1afd8916b3b33eaa4d3e4cbe50c79902d3b813e839d1eb0d8897e
14
+ splash/img/dark-1x.png,1780546027812,8a280f0b5c87f512ebaf60bea59396d136fdcfc1710c9ea311cd10b5f6370191
15
+ icons/Icon-maskable-512.png,1779810782770,5b32f8a7281ac65928b1076db0bc02aee0d4afc2dbb6372eecbdf37a89be33cc
16
+ icons/Icon-maskable-192.png,1779810782685,eb719472f72ffb7c1a294a8f3edb6ec952ad6df0be612e3e8148f9052617d58d
17
+ icons/Icon-512.png,1779810782665,5b32f8a7281ac65928b1076db0bc02aee0d4afc2dbb6372eecbdf37a89be33cc
18
+ icons/Icon-192.png,1779810782567,eb719472f72ffb7c1a294a8f3edb6ec952ad6df0be612e3e8148f9052617d58d
19
+ canvaskit/wimp.wasm,1777394172000,f73f248dfff66551884ce69d2a3088df2410fba13e3fafa2ef8ef98829241f14
20
+ canvaskit/wimp.js.symbols,1777394172000,d503a0521fcb00d9dec064dabaccb9ead8b10d311f9f36141fb5b7997b201846
21
+ canvaskit/wimp.js,1777394172000,63f0487b1033146fc2ed7b394420b036c99cf198b857dfd3cea92227f84a2310
22
+ canvaskit/skwasm_heavy.wasm,1777394228000,c02f715939724f1c936cef6b5d787489451b1a1a24dadf86f667d71f0e21cc09
23
+ canvaskit/skwasm_heavy.js.symbols,1777394228000,625fb4cc0f491b80d66e20251521bc90dd7ad83ad06b242e9762916aaaccada6
24
+ canvaskit/skwasm_heavy.js,1777394228000,1a694c23c937503283d38d24f75d03e432093e0cc9488c38910b482751263fad
25
+ canvaskit/skwasm.wasm,1777394126000,0e0c782588b556af14cad090d959344b705131d299fa76ebfddf97180853b1ab
26
+ canvaskit/skwasm.js.symbols,1777394126000,320b80390e4e3234f1c216c90a01028f17fd39220817c7837d8126133366f313
27
+ canvaskit/skwasm.js,1777394126000,40f0e36b14ede08584d4f4cbfbcaf55642e04f81498364e975b55cec7b95ba20
28
+ canvaskit/canvaskit.wasm,1777393746000,4b911a495801f229a19e536df7e52a9943a549bf4c213583f081ea2a3d3c12b2
29
+ canvaskit/canvaskit.js.symbols,1777393746000,52d20fad5abef4f488c2b92aec7181e65997b8a22de54cc976b4bd4555401723
30
+ canvaskit/canvaskit.js,1777393746000,df5aa63d90b0491908ad19d64fd18f29db1dc416548f6c73179d962eaae694e7
31
+ canvaskit/chromium/canvaskit.wasm,1777393830000,44d29356b9e2c903751a8aa583716275e165d1fb56eea46963c95c7c43f7ca34
32
+ canvaskit/chromium/canvaskit.js.symbols,1777393830000,60722421e56edacbeb674cc3ef0f6152969067e74b51a960c80cd36e75b75a54
33
+ canvaskit/chromium/canvaskit.js,1777393830000,10ea3badcf26e29aba851699c03e09bc35fea65cdc440a035bac263d6d02d665
34
+ assets/packages/mixpanel_flutter/assets/mixpanel.js,1779806094332,1915455df317dd1a9f42c6f3ea5bbe3ee357614f89d994f157a2e821f37956c3
35
+ assets/packages/lucide_icons_flutter/assets/lucide.ttf,1779806149220,bfca5b519d438d7194550cbc60a4e7c10f53a36ac96d48c7e17503a45b6b7b0b
36
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w600.ttf,1779806149210,cf2218879264e413687602c192e43b86000404ff85e2bca933d9a67020299ed4
37
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w500.ttf,1779806149217,587ce31612aa88e6c019210a18625531557eda111f5f8e838a298277efc9e308
38
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w400.ttf,1779806149212,644f7ccdf1b74bdb898210c4171327a25d7476690c7ade2d3082dd473bc24fe1
39
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w300.ttf,1779806149214,5dd834d2d84e5a1524e027fa21d87c6e8aaaf6421f201be2ec61e57c0b7bce72
40
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w200.ttf,1779806149208,d929819511975bf5030c0f359e8c16d21ad14b20ac24d5f2ff238462114b1d9b
41
+ assets/packages/lucide_icons_flutter/assets/build_font/LucideVariable-w100.ttf,1779806149216,1e9e6ea39a38b874c40242d02533adac9dd3d09c8119dae55458e65c6c3c16e6
42
+ assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1779806141382,010d647b6cab4e1a9b4398957353f43589903ce8dc760d05d894944b664e29bd
43
+ assets/fonts/MaterialIcons-Regular.otf,1662569016000,3a631b0761788d7cf2a71e8732a5b31288d6e7aa996c671c70d53a251bbd3848
44
+ assets/assets/images/splash_logo_light_android12.png,1779867497377,da2caee4f16230230dbb04d84913f0a9df2eae6bcb8f9d1ce83ed556cee6d094
45
+ assets/assets/images/splash_logo_light.png,1779867497286,643a1f45d6ef9458c4c0eed9f4889cc2adbdf1db616913215be66673a05a0066
46
+ assets/assets/images/splash_logo_dark_android12.png,1779867497464,b237d9f9035d419525a10b32889c30d44c706d62990b30bdc6bef911fe9352d6
47
+ assets/assets/images/splash_logo_dark.png,1779867497287,18090e40687efaa4bc7c70128bebf88e6a9952562f1fcfb255331305ff7cffa7
48
+ assets/assets/images/premium-switch-header.png,1781104464333,890c0bcac58363b6db88829af7c7e6134174c9fdbe61f39b6c72e28042e54483
49
+ assets/assets/images/premium-bg.jpg,1781104464331,4c48000d91087f9828e628e6336cb9791cb2c57bdcafdf78e5edbf9d568ab262
50
+ assets/assets/images/logo_wordmark_light.png,1780606594616,f4d559a7ae85706dfc0cafeabf1c03380fa0ce5339a471c8f50fcfd4f59e6dd2
51
+ assets/assets/images/logo_wordmark_dark.png,1780606594628,9b7ec728eb6b0f7798339065b2e311bf37cb57140ea068da8496e066773276cd
52
+ assets/assets/images/icon_foreground_empty.png,1779810762471,cdf875b39e231f303c6eff2baba9972404f1ea12757836b75f41611b58a122ec
53
+ assets/assets/images/icon_android.png,1779810762467,db0f6c9ff904d4571ab40d46110096370c41e3fa16496baa0fda71861ee47800
54
+ assets/assets/images/icon.png,1779745964920,194820ecc4eed7bac14b5605916d87093b4571a28f3ca24863ac09c783343488
55
+ assets/assets/images/favicon.png,1779745964922,194820ecc4eed7bac14b5605916d87093b4571a28f3ca24863ac09c783343488
56
+ assets/assets/images/empty_notifications.jpg,1772398653078,cbb7d57f7cf305cf33ee8cbd15544eb1020670a1a8100f1328b49ca61d76fb7e
57
+ assets/assets/icons/google_play_games.png,1772398653083,533c1d87d7be8690ab173ef42aa92ee8bac3b6e6859c0f97fe30daff2c843501
58
+ assets/assets/icons/google.png,1772398653083,f423e7e7be1e06008d45617d07f095f04da7fdcab9a56523f9e0633828e464e0
59
+ assets/assets/icons/facebook.png,1772398653083,79ac67e449c1db63319d43329ca91f682b4e0bc6a0883b0dfb2a849e13ae6eb6
60
+ assets/assets/icons/apple.png,1772398653083,2a737d8801ca81452b2978bb2e1ac72136acf1a4c338f2de2f77b65e9f6de1fa
61
+ version.json,1781382132245,b028f2bf7b54dc78541295a1ddf03306ac20a052662bde5b6b1aefe80d613249
62
+ index.html,1781382083192,bb8142eb84e9e44049957c3edf86006e1ae5f194c397a8326ce505b68fdf58f4
63
+ flutter_service_worker.js,1781382132717,baeeaf9f4b8e6f40d3b0549429ceb70ca01f120db6a7ef2f60d5809233dc2205
64
+ assets/FontManifest.json,1781382132345,4d84ab517c27984d36f9a3c8be6f2a72788c0c3985c1d5874297fef0a53407ca
65
+ assets/AssetManifest.bin.json,1781382132345,50a11b51c3fc4cbed1b5ec3a4f466c6a6b75c481d08d4782c8191f99bdbdba9c
66
+ assets/AssetManifest.bin,1781382132345,78bccb08a36307a400711a1d7e6868bd5f89a24e63439fb5b6747660323e4475
67
+ assets/shaders/stretch_effect.frag,1781382132431,1a7d4ac2be40cf0a459dfb390ef08bcd740f37913ffdee8de3c2ea836a18410e
68
+ assets/shaders/ink_sparkle.frag,1781382132431,1c8e222328206d1e06754f76fb53947aad38d62180aafad5298a3c6f510b173d
69
+ flutter_bootstrap.js,1781382083178,9a838d82fafadf6910ccbc6cdf4df03972abfe7749620e382c8ced856120bd8d
70
+ main.dart.js_3.part.js,1781382118356,80b75e3c9ff59756ea8a58318c7886e7a74787b7ed07fad6f7f4b4347d5bdbab
71
+ main.dart.js_1.part.js,1781382118351,a6dfa901d3a791b48e70499f583405215d20a4fe2491acd8d670fe0eac71cdaf
72
+ assets/NOTICES,1781382132345,a18efc42c5ed99b56481537d0f229ddd3add671c548a893aaf8766f30c854158
73
+ main.dart.js,1781382118819,5e7b0cab78a6e7cd653637824e33318f75554c9b5cce4b1ab26299da255247e1