kasy-cli 1.13.0 → 1.15.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 (157) hide show
  1. package/bin/kasy.js +140 -12
  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 +28 -7
  8. package/lib/commands/new.js +8 -20
  9. package/lib/commands/remove.js +1 -1
  10. package/lib/commands/reset.js +385 -0
  11. package/lib/commands/run.js +24 -17
  12. package/lib/commands/splash.js +14 -4
  13. package/lib/commands/update.js +1 -1
  14. package/lib/scaffold/backends/api/patch/README.md +1 -1
  15. package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +1 -1
  16. package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +53 -0
  17. package/lib/scaffold/backends/api/pubspec.yaml.tpl +11 -1
  18. package/lib/scaffold/backends/firebase/tokens.js +2 -2
  19. package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +8 -2
  20. package/lib/scaffold/backends/supabase/migrations/20240101000011_dedupe_device_tokens.sql +34 -0
  21. package/lib/scaffold/backends/supabase/patch/README.md +1 -1
  22. package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +1 -1
  23. package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +43 -0
  24. package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +11 -1
  25. package/lib/utils/apple-release.js +115 -16
  26. package/lib/utils/checks.js +45 -107
  27. package/lib/utils/debug.js +75 -0
  28. package/lib/utils/flutter-run.js +173 -0
  29. package/lib/utils/friendly-error.js +91 -0
  30. package/lib/utils/i18n/messages-en.js +970 -0
  31. package/lib/utils/i18n/messages-es.js +968 -0
  32. package/lib/utils/i18n/messages-pt.js +968 -0
  33. package/lib/utils/i18n.js +21 -2483
  34. package/lib/utils/mobile-identity.js +35 -0
  35. package/lib/utils/png-padding.js +120 -0
  36. package/lib/utils/ui.js +114 -0
  37. package/package.json +8 -4
  38. package/templates/firebase/README.en.md +1 -1
  39. package/templates/firebase/README.es.md +1 -1
  40. package/templates/firebase/README.md +1 -1
  41. package/templates/firebase/android/app/build.gradle.kts +10 -1
  42. package/templates/firebase/android/app/src/main/AndroidManifest.xml +1 -1
  43. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +25 -1
  44. package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +161 -11
  45. package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +15 -0
  46. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +9 -0
  47. package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +12 -0
  48. package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +5 -0
  49. package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +17 -0
  50. package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +5 -0
  51. package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
  52. package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png +0 -0
  53. package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png +0 -0
  54. package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
  55. package/templates/firebase/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png +0 -0
  56. package/templates/firebase/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png +0 -0
  57. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.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-xhdpi/android12splash.png +0 -0
  60. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
  61. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
  62. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
  63. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png +0 -0
  64. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png +0 -0
  65. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
  66. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png +0 -0
  67. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png +0 -0
  68. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
  69. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png +0 -0
  70. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png +0 -0
  71. package/templates/firebase/android/app/src/main/res/layout/widget_loading.xml +8 -0
  72. package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +53 -0
  73. package/templates/firebase/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +9 -0
  74. package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  75. package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  76. package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  77. package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  78. package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  79. package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +9 -3
  80. package/templates/firebase/assets/images/favicon.png +0 -0
  81. package/templates/firebase/assets/images/icon.png +0 -0
  82. package/templates/firebase/assets/images/icon_android.png +0 -0
  83. package/templates/firebase/assets/images/icon_foreground_empty.png +0 -0
  84. package/templates/firebase/assets/images/splash_logo_dark_android12.png +0 -0
  85. package/templates/firebase/assets/images/splash_logo_light_android12.png +0 -0
  86. package/templates/firebase/firestore.indexes.json +10 -0
  87. package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +3 -0
  88. package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +17 -1
  89. package/templates/firebase/functions/src/index.ts +1 -0
  90. package/templates/firebase/functions/src/notifications/device_triggers.ts +58 -0
  91. package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +116 -33
  92. package/templates/firebase/ios/Runner/AppDelegate.swift +17 -1
  93. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
  94. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  95. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  96. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  97. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  98. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  99. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  100. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  101. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  102. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  103. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
  104. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
  105. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
  106. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
  107. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  108. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  109. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
  110. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
  111. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  112. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  113. package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  114. package/templates/firebase/ios/Runner/Info.plist +2 -2
  115. package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +1 -1
  116. package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +1 -1
  117. package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +1 -1
  118. package/templates/firebase/lib/components/components.dart +1 -0
  119. package/templates/firebase/lib/components/kasy_avatar.dart +88 -57
  120. package/templates/firebase/lib/components/kasy_avatar_presets.dart +116 -74
  121. package/templates/firebase/lib/components/kasy_button.dart +8 -0
  122. package/templates/firebase/lib/components/kasy_tabs.dart +431 -0
  123. package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +18 -0
  124. package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +73 -19
  125. package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +22 -8
  126. package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +16 -4
  127. package/templates/firebase/lib/core/states/components/maybeshow_component.dart +4 -8
  128. package/templates/firebase/lib/core/states/user_state_notifier.dart +13 -1
  129. package/templates/firebase/lib/features/home/home_components_page.dart +1 -1
  130. package/templates/firebase/lib/features/home/home_components_preview_registry.dart +316 -93
  131. package/templates/firebase/lib/features/home/home_page.dart +0 -6
  132. package/templates/firebase/lib/features/notifications/api/device_api.dart +57 -0
  133. package/templates/firebase/lib/features/notifications/providers/models/notification.dart +11 -1
  134. package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +9 -0
  135. package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +1 -4
  136. package/templates/firebase/lib/features/notifications/shared/att_permission.dart +28 -8
  137. package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +16 -1
  138. package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +44 -11
  139. package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +31 -29
  140. package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +21 -5
  141. package/templates/firebase/lib/i18n/en.i18n.json +4 -1
  142. package/templates/firebase/lib/i18n/es.i18n.json +4 -1
  143. package/templates/firebase/lib/i18n/pt.i18n.json +4 -1
  144. package/templates/firebase/pubspec.yaml +10 -3
  145. package/templates/firebase/test/features/notifications/data/device_api_fake.dart +9 -0
  146. package/templates/firebase/web/favicon.png +0 -0
  147. package/templates/firebase/web/icons/Icon-192.png +0 -0
  148. package/templates/firebase/web/icons/Icon-512.png +0 -0
  149. package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
  150. package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
  151. package/templates/firebase/web/index.html +9 -0
  152. package/templates/firebase/web/manifest.json +3 -3
  153. package/templates/firebase/assets/images/app_icon.png +0 -0
  154. package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
  155. package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
  156. package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +0 -88
  157. package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +0 -144
@@ -0,0 +1,968 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Kasy CLI i18n messages — Português.
5
+ *
6
+ * One entry per user-facing string. Keys are dotted paths describing
7
+ * where the string is used (cli.help.*, run.*, ios.*, etc.).
8
+ */
9
+
10
+ module.exports = {
11
+ 'cli.tagline': 'Crie apps móveis sem dor de configuração',
12
+ 'cli.description': 'Crie apps Flutter sem dor de configuração.',
13
+ 'cli.usage': '<comando> [argumentos]',
14
+ 'cli.option.version': 'Mostrar versão instalada',
15
+ 'cli.option.lang': 'Idioma (en, pt, es)',
16
+ 'cli.help.afterError': '(execute com --help para detalhes de uso)',
17
+ 'cli.help.more': 'Execute "{command}" para detalhes de um comando específico.',
18
+ 'cli.help.quickStart': 'Criar um novo app:',
19
+ 'cli.help.optionDescription': 'Mostrar ajuda do comando',
20
+ 'cli.help.commandDescription': 'Mostrar ajuda do comando',
21
+ 'cli.help.inline.options': '[opções]',
22
+ 'cli.help.heading.usage': 'Uso',
23
+ 'cli.help.heading.arguments': 'Argumentos',
24
+ 'cli.help.heading.options': 'Opções',
25
+ 'cli.help.heading.globalOptions': 'Opções globais',
26
+ 'cli.help.heading.commands': 'Comandos',
27
+ 'cli.help.group.start': 'Para começar',
28
+ 'cli.help.group.work': 'Trabalhar no app',
29
+ 'cli.help.group.publish': 'Publicar e testar',
30
+ 'cli.help.group.maintenance': 'Manutenção da Kasy CLI',
31
+ 'cli.help.group.advanced': 'Avançado',
32
+ 'cli.help.group.other': 'Outros',
33
+ 'cli.help.tip': 'Dica: rode `kasy <comando> --help` para detalhes. Use --lang pt|en|es para mudar o idioma.',
34
+ 'cli.command.setup.description': '(avançado) Configura um projeto Flutter existente',
35
+ 'cli.command.new.description': 'Cria um app novo (ex: kasy new meu-app)',
36
+ 'cli.command.new.projectName': 'nome do projeto',
37
+ 'cli.command.new.projectNameArg': 'Nome da pasta do projeto',
38
+ 'prompt.projectName.enter': 'Qual o nome do seu projeto?',
39
+ 'prompt.projectName.required': 'O nome do projeto é obrigatório.',
40
+ 'prompt.projectName.default': 'meu_app',
41
+ 'cli.command.setup.directoryName': 'diretório',
42
+ 'cli.command.setup.directoryArg': 'Diretório de destino (padrão: pasta atual .)',
43
+ 'cli.command.setup.langName': 'idioma',
44
+ 'cli.command.setup.langOption': 'Idioma dos prompts (en, pt, es)',
45
+ 'cli.command.setup.backendOption': 'Adapter de backend (firebase, supabase, api)',
46
+ 'cli.command.setup.featuresOption': 'Features opcionais separadas por virgula (web,widget,llm_chat,revenuecat,ci)',
47
+ 'cli.command.help.paramName': 'comando',
48
+ 'cli.command.doctor.description': 'Verifica se o seu computador está pronto para rodar a Kasy',
49
+ 'cli.command.modules.description': 'Mostra o que já vem incluso e o que você pode adicionar',
50
+ 'cli.command.validate.description': '(avançado) Valida combinações de backend e features',
51
+ 'cli.command.validate.analyzeOnlyOption': 'Executa apenas flutter analyze (sem build)',
52
+ 'cli.command.version.description': 'Mostra a versão instalada da Kasy',
53
+ 'cli.command.upgrade.description': 'Atualiza a Kasy CLI para a versão mais recente',
54
+ 'cli.command.uninstall.description': 'Desinstala a Kasy deste computador',
55
+ 'cli.command.upgrade.running': 'Atualizando a CLI kasy...',
56
+ 'cli.command.upgrade.done': 'kasy atualizado com sucesso!',
57
+ 'cli.command.uninstall.running': 'Desinstalando a CLI kasy...',
58
+ 'cli.command.uninstall.done': 'kasy desinstalado. Até mais!',
59
+ 'new.checks.environment': 'Verificações de ambiente',
60
+ 'new.checks.environment.checking': 'Verificando ambiente',
61
+ 'new.checks.environment.done': 'Ambiente pronto',
62
+ 'setup.checks.backend.checking': 'Verificando ferramentas {backend}',
63
+ 'setup.checks.backend.done': 'Ferramentas {backend} prontas',
64
+ 'new.checks.firebaseForPush': 'Atenção: Firebase CLI é obrigatório para notificações push (Firebase Cloud Messaging / FCM) em todos os backends.',
65
+ 'new.checks.requiredBlock': 'Ferramentas obrigatórias não encontradas. Instale-as para continuar.',
66
+ 'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
67
+ 'new.checks.installSupabase': 'Supabase: npm i -g supabase (ou brew install supabase/tap/supabase) && supabase login',
68
+ 'new.checks.installSupabase.darwin': 'Supabase: brew install supabase/tap/supabase && supabase login (ou npm i -g supabase)',
69
+ 'new.checks.installSupabase.win32': 'Supabase: npm i -g supabase && supabase login',
70
+ 'new.checks.installSupabase.linux': 'Supabase: npm i -g supabase && supabase login',
71
+ 'setup.checks.environment': 'Verificações de ambiente',
72
+ 'setup.checks.prepareFirebase': 'Ferramentas Firebase (push, remote config)',
73
+ 'setup.checks.backend': 'Verificações de backend ({backend})',
74
+ 'setup.firebase.installing': 'Instalando Firebase CLI...',
75
+ 'setup.supabase.installing': 'Instalando Supabase CLI...',
76
+ 'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
77
+ 'setup.warn.hang': 'Se travar, execute manualmente: flutterfire --version',
78
+ 'setup.warn.supabase': 'Usando Supabase ou API propria? O Firebase ainda ajuda com push e remote config.',
79
+ 'doctor.title': 'Kasy Doctor',
80
+ 'doctor.baseEnvironment': 'Ambiente base',
81
+ 'doctor.optionalBackend': 'Ferramentas opcionais de backend',
82
+ 'doctor.requiredMissing': 'Dependencias obrigatórias ausentes. Corrija os erros acima e execute o doctor novamente.',
83
+ 'doctor.requiredPassed': '✓ Verificações obrigatórias de ambiente aprovadas.',
84
+ 'modules.backends': 'Backends disponíveis:',
85
+ 'modules.featuresBase': 'Sempre incluído:',
86
+ 'modules.features': 'Features opcionais:',
87
+ 'modules.tag.firebaseOnly': 'somente Firebase',
88
+ 'modules.tag.requiresDb': 'requer Firebase ou Supabase',
89
+ 'modules.tag.enhances': 'ativa {target}',
90
+ 'modules.hint.subscriptionNoRc': 'Dica: a tela de Subscriptions está inclusa mas inativa. Rode `kasy add revenuecat` para habilitar pagamentos reais.',
91
+ 'modules.feature.base.authentication.description': 'Cadastro, login e gerenciamento de conta',
92
+ 'modules.feature.base.home.description': 'Tela principal do app apos o login',
93
+ 'modules.feature.base.settings.description': 'Tema, idioma, conta e preferencias',
94
+ 'modules.feature.base.notifications.description': 'Notificações push via Firebase Cloud Messaging (funciona com qualquer backend)',
95
+ 'modules.feature.base.subscription.description': 'Tela e modelo de assinatura premium (adicione RevenueCat para habilitar pagamentos reais)',
96
+ 'modules.backend.firebase.description': 'Adapter de backend Firebase',
97
+ 'modules.backend.supabase.description': 'Adapter de backend Supabase',
98
+ 'modules.backend.api.description': 'Adapter de backend API REST/GraphQL',
99
+ 'modules.feature.sentry.description': 'Rastreamento de erros e crashes com Sentry',
100
+ 'modules.feature.analytics.description': 'Rastreamento de eventos de analytics (Firebase Analytics)',
101
+ 'modules.feature.facebook.description': 'Login do Facebook e rastreamento de eventos Meta Ads (vem sempre junto)',
102
+ 'modules.feature.revenuecat.description': 'Habilita pagamentos reais na tela de Subscriptions',
103
+ 'modules.feature.onboarding.description': 'Fluxo de boas-vindas mostrado no primeiro acesso',
104
+ 'modules.feature.web.description': 'Suporte Web/PWA',
105
+ 'modules.feature.widget.description': 'Widget de tela inicial iOS/Android',
106
+ 'modules.feature.llm_chat.description': 'Tela de chat com IA usando OpenAI ou Gemini',
107
+ 'modules.feature.feedback.description': 'Pedidos e votacao de features dentro do app',
108
+ 'modules.feature.local_notifications.description': 'Lembretes locais agendados pelo usuario (sem servidor)',
109
+ 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (testes + build) + Codemagic (publicação nas lojas)',
110
+ 'checks.checking': 'Verificando {name}...',
111
+ 'checks.found': '{name} encontrado',
112
+ 'checks.foundWithVersion': '{name} pronto ({version})',
113
+ 'checks.missing': '{name} ausente',
114
+ 'checks.notFound': '{name} não encontrado',
115
+ 'checks.notFound.short': 'não encontrado',
116
+ 'checks.runHint': 'Execute',
117
+ 'checks.stillMissing': 'ainda não detectado',
118
+ 'checks.flutter.warn': 'Flutter SDK não encontrado. Instale o Flutter para compilar e executar apps: https://docs.flutter.dev/get-started/install',
119
+ 'checks.install.failed': 'instalação automática falhou — execute o comando manualmente',
120
+ 'checks.waitPrompt.gcloud.install': 'Após instalar o gcloud, pressione Enter para verificar novamente',
121
+ 'checks.waitPrompt.gcloud.auth': 'Após rodar gcloud auth login, pressione Enter para verificar novamente',
122
+ 'error.hint.notFlutterProject': 'Você não está dentro de um projeto Flutter. Use `kasy new` para criar um, ou entre na pasta de um projeto existente.',
123
+ 'error.hint.flutterMissing': 'Flutter não está instalado ou não está no PATH. Rode `kasy doctor` para diagnosticar.',
124
+ 'error.hint.permission': 'Algum arquivo/pasta está somente leitura. Verifique as permissões da pasta pai ou tente de novo a partir da sua pasta home.',
125
+ 'error.hint.noSpace': 'Disco cheio. Libere espaço (builds Flutter/Xcode precisam de 5-15 GB) e tente de novo.',
126
+ 'error.hint.network': 'Problema de rede — verifique sua conexão com a internet e tente de novo.',
127
+ 'error.hint.firebaseLogin': 'Você não está logado no Firebase. Execute: firebase login',
128
+ 'error.hint.supabaseLogin': 'Você não está logado no Supabase. Execute: supabase login',
129
+ 'error.hint.gcloudAuth': 'Você precisa autenticar com gcloud. Execute: gcloud auth login',
130
+ 'error.hint.flutterRunFailed': 'Flutter não conseguiu rodar o app. Tente de novo com --verbose para ver a saída completa.',
131
+ 'checks.diagnostic.xcodeLicense': '{name} está instalado, mas o Xcode precisa que a licenca seja aceita. Execute: sudo xcodebuild -license',
132
+ 'checks.diagnostic.xcodeCli': '{name} está instalado, mas faltam as Command Line Tools do Xcode. Execute: xcode-select --install',
133
+ 'banner.title': 'Kasy CLI · Gerador Flutter SaaS',
134
+ 'welcome.firstRun': 'Bem-vindo ao Kasy CLI!',
135
+ 'welcome.chooseLanguage': 'Primeiro, escolha seu idioma:',
136
+ 'prompt.language.select': 'Escolha seu idioma',
137
+ 'prompt.cancelled': 'Comando cancelado pelo usuario.',
138
+ 'license.required': '🔑 Chave de ativação necessária para usar o Kasy CLI',
139
+ 'license.checking': 'Validando chave de ativação...',
140
+ 'license.saved': '✅ Chave validada com sucesso',
141
+ 'license.invalid': 'Chave inválida. Verifique sua chave ou entre em contato em kasy.dev.',
142
+ 'license.expired': '❌ Sua assinatura expirou. Renove em kasy.dev.',
143
+ 'license.inactive': '❌ Sua chave foi desativada. Entre em contato em kasy.dev.',
144
+ 'license.offlineWarning': '⚠️ Servidor fora do ar — continuando no modo offline.',
145
+ 'license.subscriptionExpired': '❌ Sua assinatura expirou. Atualizações exigem plano ativo. Renove em kasy.dev.\n Seus projetos continuam funcionando — apenas atualizações estão bloqueadas.',
146
+ 'prompt.license.enter': '👉 Digite sua chave de ativação (XXXX-XXXX-XXXX-XXXX)',
147
+ 'prompt.license.invalid': 'Formato inválido. Use XXXX-XXXX-XXXX-XXXX.',
148
+ 'prompt.appName.enter': 'Digite o nome do seu app',
149
+ 'prompt.appName.required': 'O nome do app é obrigatório.',
150
+ 'prompt.bundleId.enter': 'Digite o bundle ID (com.company.app)',
151
+ 'prompt.bundleId.required': 'O bundle ID é obrigatório.',
152
+ 'prompt.bundleId.invalid': 'O bundle ID deve seguir o formato com.company.app.',
153
+ 'prompt.backend.select': 'Escolha o provedor de backend',
154
+ 'prompt.features.select': 'Escolha as features opcionais para incluir',
155
+ 'prompt.features.instructions': 'Espaco para marcar, enter para confirmar',
156
+ 'prompt.multiselect.instructions': '\nInstrucoes:\n ↑/↓: Destacar opção\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
157
+ 'prompt.multiselect.warnDisabled': 'Use ↓ para ir a uma opção selecionavel, Space para marcar, Enter para confirmar',
158
+ 'prompt.firebase.projectId.enter': 'Digite o Firebase Project ID',
159
+ 'prompt.firebase.projectId.required': 'Firebase Project ID é obrigatório.',
160
+ 'prompt.supabase.url.enter': 'Digite a URL do Supabase',
161
+ 'prompt.supabase.url.required': 'A URL do Supabase é obrigatória.',
162
+ 'prompt.supabase.anonKey.enter': 'Digite a chave anon do Supabase',
163
+ 'prompt.supabase.anonKey.required': 'A chave anon do Supabase é obrigatória.',
164
+ 'new.supabase.q.create': 'Criar novo projeto Supabase ou usar existente?',
165
+ 'new.supabase.q.create.create': '✨ Criar novo projeto (recomendado para iniciantes)',
166
+ 'new.supabase.q.create.existing': '📂 Usar projeto existente',
167
+ 'new.firebase.q.setupMode': 'Como deseja configurar o Firebase?',
168
+ 'new.firebase.q.setupMode.push': 'Projeto Firebase para notificações push (FCM):',
169
+ 'new.firebase.q.setupMode.push.explain': 'Notificações push (FCM) precisam de um projeto Firebase, mesmo quando seu backend principal é Supabase ou API REST.',
170
+ 'new.firebase.q.setupMode.create': '✨ Criar do zero (recomendado para iniciantes)',
171
+ 'new.firebase.q.setupMode.existing': '📂 Usar projeto existente',
172
+ 'new.firebase.q.region': 'Onde está a maioria dos usuários do seu app?',
173
+ 'new.firebase.q.region.brazil': '🇧🇷 Brasil (São Paulo) — southamerica-east1',
174
+ 'new.firebase.q.region.us': '🇺🇸 Estados Unidos — us-central1',
175
+ 'new.firebase.q.region.europe': '🇪🇺 Europa — europe-west1',
176
+ 'new.firebase.q.region.global': '🌍 Global / Não sei — us-central1',
177
+ 'new.firebase.create.prereq': 'Você precisa: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Plano Blaze necessário para deploy.',
178
+ 'new.firebase.create.creating': 'Criando projeto Firebase…',
179
+ 'new.firebase.create.includeWeb': 'Incluir app Web no Firebase? (para plataforma web)',
180
+ 'new.firebase.create.nowDo': 'Agora ative a autenticação (antes de rodar o app):',
181
+ 'new.firebase.create.activateEmail': 'Ative Email/Senha: Firebase Console → Authentication → Sign-in method',
182
+ 'new.firebase.create.activateGoogle': 'Ative Google: mesma página, clique em Google → Ativar',
183
+ 'new.firebase.create.beforeContinue.title': 'Antes de continuar, ative no Firebase Console:',
184
+ 'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Senha e Anônimo já foram ativados automaticamente)',
185
+ 'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → ative Email/Senha, Anônimo e Google',
186
+ 'new.firebase.create.beforeContinue.ready': 'Ativei o Google Sign-In. Continuar?',
187
+ 'new.firebase.create.beforeContinue.ready.noAuth': 'Ativei Email/Senha, Anônimo e Google Sign-In. Continuar?',
188
+ 'new.firebase.create.beforeContinue.secretManagerAuto': '(Secret Manager e Storage já foram ativados automaticamente)',
189
+ 'new.firebase.create.sha1Skipped': 'SHA-1 não adicionado',
190
+ 'new.firebase.create.sha1ManualInstruction': 'Adicione o SHA-1 manualmente: Firebase Console → Configurações do projeto → Seus apps → Android → Adicionar impressão digital',
191
+ 'new.firebase.create.sha1ParseError': 'Não foi possível extrair o SHA-1 da saída do keytool',
192
+ 'new.firebase.create.sha1ErrorDetail': 'Motivo',
193
+ 'new.firebase.create.useExistingHint': 'O projeto pode ter sido criado. Tente "Usar projeto existente" com ID: {id}',
194
+ 'new.firebase.create.usingProjectId': 'Usando project ID: {id} (continuando com projeto existente)',
195
+ 'new.firebase.create.waitPropagate': 'Aguardando propagação do projeto (20s)…',
196
+ 'new.firebase.create.success': 'Projeto Firebase criado com sucesso.',
197
+ 'new.firebase.create.failed': 'Não foi possível criar o projeto',
198
+ 'new.firebase.create.gcloudRequired': 'gcloud CLI é obrigatório para "criar do zero". Sem ele, o fluxo completo do Firebase não pode rodar.',
199
+ 'new.firebase.create.installTitle': 'Para instalar o gcloud CLI, execute:',
200
+ 'new.firebase.create.installCommand': 'Comando',
201
+ 'new.firebase.create.installAfter': 'Depois faca login',
202
+ 'new.firebase.create.installUrl': 'Ou baixe em',
203
+ 'new.firebase.create.authCommand': 'Execute: gcloud auth login',
204
+ 'new.firebase.create.fallbackHint': 'Por enquanto, informe um Firebase Project ID existente para continuar (ou instale o gcloud e execute novamente):',
205
+ 'new.firebase.q.billingAccount': 'Qual conta de faturamento vincular ao projeto?',
206
+ 'new.firebase.q.billingAccount.hint': 'Escolha a conta com cota disponível (até 3 projetos por conta)',
207
+ 'new.firebase.q.billingAccount.context': 'Limite: até 3 projetos por conta de faturamento. Escolha uma conta com cota disponível (remova projetos não usados em console.cloud.google.com/billing se necessário).',
208
+ 'new.firebase.q.billingAccount.other': 'Outra — informar ID da conta manualmente',
209
+ 'new.firebase.q.billingAccount.manualId': 'ID da conta de faturamento (ex: 018A70-7D0548-0F84A8)',
210
+ 'new.firebase.q.billingAccount.manualId.hint': 'Encontre em console.cloud.google.com/billing',
211
+ 'new.firebase.q.billingAccount.manualId.required': 'O ID da conta de faturamento é obrigatório.',
212
+ 'new.firebase.q.organization': 'Em qual organização GCP criar o projeto?',
213
+ 'new.firebase.q.organization.none': 'Sem organização (conta pessoal / projeto avulso)',
214
+ 'new.firebase.q.organization.hint': 'Organizações vinculadas à sua conta gcloud',
215
+ 'new.firebase.create.billingRetry.title': 'Vincule o faturamento manualmente (cota excedida ou erro de billing):',
216
+ 'new.firebase.create.billingRetry.hint': 'Dica: O limite é 3 projetos por conta de faturamento. Remova projetos não usados no link acima. Se acabou de remover um, espere 2–5 min para a alteração propagar e tente novamente.',
217
+ 'new.firebase.create.billingRetry.ready': 'Vinculei o faturamento. Tentar novamente?',
218
+ 'new.firebase.create.billingRetry.retrying': 'Tentando novamente…',
219
+ 'new.firebase.create.billingRetry.exit': 'Execute novamente com "Usar projeto existente" após vincular o faturamento.',
220
+ 'new.firebase.create.projectQuotaExceeded': 'Cota de projetos excedida (limite por conta Google). Exclua projetos não usados em console.cloud.google.com ou informe um projeto existente abaixo.',
221
+ 'new.supabase.q.orgSelect': 'Em qual organização criar o projeto?',
222
+ 'new.supabase.orgsRequired': 'Nenhuma organização encontrada. Execute supabase login e tente novamente.',
223
+ 'new.supabase.q.region': 'Onde está a maioria dos usuários do seu app?',
224
+ 'new.supabase.q.region.brazil': '🇧🇷 Brasil (São Paulo) — sa-east-1',
225
+ 'new.supabase.q.region.us': '🇺🇸 Estados Unidos (Virginia) — us-east-1',
226
+ 'new.supabase.q.region.europe': '🇪🇺 Europa (Irlanda) — eu-west-1',
227
+ 'new.supabase.q.region.global': '🌍 Global / Não sei — us-east-1',
228
+ 'new.supabase.q.dbPassword': 'Senha do banco (min 6 caracteres)',
229
+ 'new.supabase.q.dbPassword.required': 'A senha deve ter pelo menos 6 caracteres.',
230
+ 'new.supabase.creating': 'Criando projeto no Supabase…',
231
+ 'new.supabase.created': 'Projeto criado com sucesso.',
232
+ 'new.supabase.createFailed': 'Não foi possível criar o projeto',
233
+ 'new.supabase.loginHint': 'Execute: supabase login. Depois informe a URL e chave do seu projeto existente.',
234
+ 'new.supabase.setup': 'Vinculando projeto e publicando…',
235
+ 'new.supabase.setupManual': 'Execute manualmente: supabase link, supabase db push, supabase functions deploy',
236
+ 'new.supabase.q.useExisting.orgSelect': 'Em qual organização está o projeto?',
237
+ 'new.supabase.q.useExisting.projectSelect': 'Qual projeto Supabase existente deseja usar?',
238
+ 'new.supabase.projectsRequired': 'Nenhum projeto encontrado nesta organização.',
239
+ 'new.supabase.q.dbPassword.existing': 'Senha do banco do projeto (necessária para vincular e aplicar migrations)',
240
+ 'new.supabase.existingLinked': 'Projeto pronto para vincular e aplicar migrations.',
241
+ 'setup.license.loaded': '✓ Chave de licenca carregada da configuração local.',
242
+ 'setup.license.saved': '✓ Chave de licenca validada e salva.',
243
+ 'setup.license.invalid': 'Formato de licenca inválido. Esperado XXXX-XXXX-XXXX-XXXX.',
244
+ 'setup.error.targetNotEmpty': 'O diretório de destino não está vazio: {path}',
245
+ 'setup.error.targetExists': 'O diretório de destino já existe: {path}',
246
+ 'setup.error.coreMissing': 'Pasta do core template não encontrada: {path}',
247
+ 'setup.error.requiredChecksFailed': 'Falha nas verificações obrigatórias. Execute `kasy doctor`.',
248
+ 'setup.error.generatingFailed': 'Falha ao gerar o projeto.',
249
+ 'setup.error.conflictHint': 'Dica: Remova a pasta do projeto e execute novamente, ou use um diretório vazio.',
250
+ 'setup.spinner.generating': 'Gerando arquivos do projeto...',
251
+ 'setup.success.created': 'Projeto criado com sucesso.',
252
+ 'setup.success.complete': '✓ Setup concluido',
253
+ 'setup.success.location': 'Local',
254
+ 'setup.success.nextSteps': 'Proximos passos',
255
+ 'setup.success.stepPubGet': 'flutter pub get',
256
+ 'setup.success.stepRun': 'flutter run',
257
+ 'validate.title': 'Kasy Validate',
258
+ 'validate.success': '✓ Matriz de validacao aprovada.',
259
+ 'validate.failed': 'Matriz de validacao falhou.',
260
+ 'validate.error': 'Uma ou mais combinacoes de validacao falharam.',
261
+ 'validate.projectNotFound': 'Projeto não encontrado',
262
+ 'validate.ok': 'ok',
263
+ 'validate.fail': 'falhou',
264
+ 'validate.passed': 'aprovado',
265
+
266
+ // ── Fluxo Firebase ────────────────────────────────────────────────────
267
+ 'cli.command.firebase.description': '🔥 Criar app Flutter completo com Firebase (recomendado)',
268
+ 'new.banner': '✨ Novo app Flutter',
269
+ 'new.subtitle': 'Escolha o backend: Firebase, Supabase ou API REST.',
270
+ 'new.subtitle2': '🔒 O setup roda na sua máquina com suas credenciais — sem acesso de terceiros.',
271
+ 'new.q.backend': 'Onde você quer salvar os dados do seu app?',
272
+ 'new.q.backend.firebase.desc': 'Mais fácil de começar — auth, banco e armazenamento prontos',
273
+ 'new.q.backend.supabase.desc': 'Banco SQL (PostgreSQL) com mais controle',
274
+ 'new.q.backend.api.desc': 'Você já tem seu próprio servidor',
275
+
276
+ 'new.q.mode': 'Como quer configurar?',
277
+ 'new.q.mode.quick': '⚡ Rapido — poucas perguntas, padrões inteligentes',
278
+ 'new.q.mode.advanced': '🛠 Avançado — todas as opções e credenciais agora',
279
+
280
+ 'new.q.preset': 'Quais features incluir?',
281
+ 'new.q.preset.starter': '⚡ Starter — analytics + erros + onboarding',
282
+ 'new.q.preset.saas': '💰 SaaS — assinaturas + analytics + onboarding + feedback',
283
+ 'new.q.preset.content': '📱 Conteúdo — crash reports + analytics + onboarding + AI chat',
284
+ 'new.q.preset.full': '🚀 Completo — todas as features',
285
+ 'new.q.preset.custom': '⚙️ Personalizar — escolha feature a feature',
286
+ 'new.q.preset.none': '○ Nenhum — so o core',
287
+
288
+ 'new.firebase.success.deployStep': '• Deploy do backend (de dentro da pasta do projeto):',
289
+
290
+ 'cli.command.deploy.description': 'Publica o servidor no Firebase ou Supabase',
291
+ 'cli.command.check.description': 'Confere se as notificações push estão configuradas (use --fix para corrigir)',
292
+ 'deploy.q.project': 'Firebase Project ID:',
293
+ 'deploy.q.serviceAccount': 'Caminho para o service account JSON:',
294
+ 'deploy.detected.project': '✓ Projeto Firebase detectado:',
295
+ 'deploy.detected.serviceAccount': '✓ Service account detectado:',
296
+ 'deploy.error.notProject': 'Nenhum firebase.json encontrado. Execute kasy deploy de dentro da pasta do projeto.',
297
+
298
+ 'cli.command.ios.description': 'Publica o app na App Store (precisa de Mac)',
299
+ 'cli.command.ios.configure.description': 'Configurar credenciais Apple para envio local do IPA',
300
+ 'cli.command.ios.release.description': 'Incrementa build, gera IPA e envia para App Store Connect',
301
+ 'cli.command.ios.build.description': 'Só gera o IPA (sem enviar)',
302
+ 'cli.command.ios.clean.description': 'Limpa caches Flutter/Xcode após falha no build iOS',
303
+ 'cli.command.ios.picker.intro': 'Publicar na App Store',
304
+ 'cli.command.ios.picker.message': 'O que você quer fazer?',
305
+ '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',
306
+ 'cli.command.codemagic.description': 'Compila o app na nuvem (sem precisar de Mac)',
307
+ 'cli.command.codemagic.configure.description': 'Configurar credenciais da API Codemagic',
308
+ 'cli.command.codemagic.release.description': 'Iniciar build do workflow iOS no Codemagic',
309
+ 'cli.command.codemagic.status.description': 'Status do build Codemagic por ID',
310
+ 'cli.command.codemagic.picker.intro': 'Compilar na nuvem com Codemagic',
311
+ 'cli.command.codemagic.picker.message': 'O que você quer fazer?',
312
+ 'cli.command.codemagic.picker.statusHint': 'Pergunta o ID do build',
313
+ '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',
314
+
315
+ 'ios.configure.title': 'App Store iOS — configuração',
316
+ 'ios.configure.bundleId': 'Bundle ID',
317
+ 'ios.configure.doc': 'Guia',
318
+ 'ios.configure.openingLinks': 'Abrindo App Store Connect no navegador…',
319
+ 'ios.configure.note.title': 'Vou precisar de 3 coisas do App Store Connect',
320
+ '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.',
321
+ 'ios.configure.q.apiKey': 'Key ID da API App Store Connect',
322
+ 'ios.configure.q.issuerId': 'Issuer ID (UUID)',
323
+ 'ios.configure.q.p8Path': 'Caminho do arquivo AuthKey_XXXXX.p8 baixado',
324
+ 'ios.configure.q.appId': 'App ID no App Store Connect (opcional)',
325
+ 'ios.configure.q.required': 'Obrigatório',
326
+ 'ios.configure.q.p8NotFound': 'Arquivo não encontrado',
327
+ 'ios.configure.cancelled': 'Configuração cancelada',
328
+ 'ios.configure.success': 'Credenciais Apple salvas',
329
+ 'ios.configure.p8Installed': 'Chave instalada em',
330
+ 'ios.configure.next': 'Próximo passo',
331
+ 'ios.release.title': 'Gerando e enviando release iOS…',
332
+ 'ios.release.success': 'Release iOS enviada',
333
+ 'ios.release.task.building': 'Compilando IPA (pode levar 2-5 min)…',
334
+ 'ios.release.task.uploading': 'Enviando IPA para o App Store Connect…',
335
+ 'ios.release.task.done': 'Compilação + envio concluídos',
336
+ 'ios.release.task.failed': 'Compilação falhou — veja a saída abaixo',
337
+ 'ios.build.title': 'Gerando IPA iOS…',
338
+ 'ios.build.success': 'IPA gerado',
339
+ 'ios.build.task.building': 'Compilando IPA (pode levar 2-5 min)…',
340
+ 'ios.build.task.done': 'IPA pronto em build/ios/ipa/',
341
+ 'ios.build.task.failed': 'Compilação falhou — veja a saída abaixo',
342
+ 'ios.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
343
+ 'ios.error.noScript': 'scripts/release-ios.sh não encontrado. Execute: kasy update ios-release',
344
+ 'ios.error.notMac': 'Release iOS local exige macOS com Xcode.',
345
+ 'ios.error.useCodemagic': 'Use release na nuvem',
346
+ 'ios.error.notConfigured': 'Credenciais Apple não configuradas',
347
+ 'ios.error.runConfigure': 'Execute: kasy ios configure',
348
+ 'ios.release.askConfigure': 'Quer configurar as credenciais Apple agora?',
349
+ 'ios.error.signing': 'Assinatura iOS não configurada (DEVELOPMENT_TEAM ausente).',
350
+ 'ios.error.signingHint': 'Abra ios/Runner.xcworkspace no Xcode → Runner → Signing & Capabilities → escolha seu Team.',
351
+ 'ios.error.googleUrlScheme': 'URL scheme iOS do Google Sign-In não configurado.',
352
+ 'ios.error.googleUrlSchemeHint': 'Correção: rode flutterfire configure, depois kasy ios clean, ou gere o projeto novamente antes do build.',
353
+ 'ios.warn.lowDisk': 'Pouco espaço em disco ({gb} GB livres; recomendado pelo menos {min} GB para builds Xcode).',
354
+ 'ios.hints.title': 'Cache do Xcode pode estar corrompido — tente:',
355
+ 'ios.hints.closeXcode': 'Feche o Xcode por completo',
356
+ 'ios.hints.retry': 'Depois tente de novo',
357
+ 'ios.hints.manual': 'Ou manualmente',
358
+ 'ios.hints.network.title': 'Falha de rede ao baixar dependências do iOS',
359
+ 'ios.hints.network.body': 'Sua conexão caiu enquanto o pod install baixava bibliotecas. Costuma ser temporário.',
360
+ 'ios.hints.network.step1': 'Confirme que sua internet está estável',
361
+ 'ios.hints.network.step2': 'Tente novamente',
362
+ 'ios.hints.network.step3': 'Se persistir',
363
+ 'ios.clean.title': 'Limpando caches do build iOS…',
364
+ 'ios.clean.success': 'Caches limpos',
365
+ 'ios.clean.notMac': 'Limpeza iOS só está disponível no macOS.',
366
+ 'ios.clean.step.flutterClean': 'flutter clean',
367
+ 'ios.clean.step.derivedData': 'Remover DerivedData do Xcode (Runner)',
368
+ 'ios.clean.step.buildDir': 'Remover pastas build',
369
+ 'ios.clean.step.pubGet': 'flutter pub get',
370
+ 'ios.clean.step.pods': 'pod install',
371
+
372
+ 'codemagic.configure.title': 'Codemagic — configuração',
373
+ 'codemagic.configure.doc': 'Guia',
374
+ 'codemagic.configure.checklist': 'Conclua assinatura + App Store Connect no painel Codemagic (veja o guia).',
375
+ 'codemagic.configure.openingLinks': 'Abrindo Codemagic no navegador…',
376
+ 'codemagic.configure.q.token': 'Token da API Codemagic',
377
+ 'codemagic.configure.q.appId': 'App ID no Codemagic',
378
+ 'codemagic.configure.q.workflowId': 'Workflow ID (do codemagic.yaml)',
379
+ 'codemagic.configure.q.branch': 'Branch Git para build',
380
+ 'codemagic.configure.q.required': 'Obrigatório',
381
+ 'codemagic.configure.cancelled': 'Configuração cancelada',
382
+ 'codemagic.configure.success': 'Credenciais Codemagic salvas',
383
+ 'codemagic.configure.next': 'Próximo passo',
384
+ 'codemagic.release.title': 'Disparando build no Codemagic…',
385
+ 'codemagic.release.triggered': 'Build iniciado',
386
+ 'codemagic.release.spin': 'Iniciando build no Codemagic…',
387
+ 'codemagic.release.spinDone': 'Build enfileirado no Codemagic',
388
+ 'codemagic.status.title': 'Status do build',
389
+ 'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
390
+ 'codemagic.status.spin': 'Consultando status do build…',
391
+ 'codemagic.status.spinDone': 'Status obtido',
392
+ 'codemagic.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
393
+ 'codemagic.error.notConfigured': 'Codemagic não configurado',
394
+ 'codemagic.error.addCi': 'Adicione CI primeiro: kasy add ci (cria codemagic.yaml)',
395
+ 'codemagic.error.runConfigure': 'Execute: kasy codemagic configure',
396
+ 'codemagic.error.googleUrlScheme': 'Build Codemagic bloqueado: URL scheme iOS do Google Sign-In não configurado.',
397
+
398
+ 'doctor.ios.title': 'Release iOS',
399
+ 'doctor.ios.appleOk': 'Credenciais Apple configuradas',
400
+ 'doctor.ios.appleMissing': 'Credenciais Apple ausentes — kasy ios configure',
401
+ 'doctor.ios.p8Ok': 'Arquivo da chave API encontrado',
402
+ 'doctor.ios.p8Missing': 'AuthKey .p8 ausente — kasy ios configure',
403
+ 'doctor.ios.codemagicOk': 'Credenciais Codemagic configuradas',
404
+ 'doctor.ios.codemagicMissing': 'Codemagic opcional — kasy codemagic configure',
405
+ 'doctor.ios.notMac': 'Release iOS local exige macOS',
406
+ 'doctor.ios.doc': 'Documentação',
407
+ 'doctor.ios.signingOk': 'Assinatura Xcode (Development Team) configurada',
408
+ 'doctor.ios.signingMissing': 'Assinatura Xcode não definida — abra Runner no Xcode e escolha seu Team',
409
+ 'doctor.ios.googleUrlSchemeOk': 'URL scheme iOS do Google Sign-In configurado',
410
+ 'doctor.ios.googleUrlSchemeMissing': 'URL scheme iOS do Google Sign-In divergente',
411
+ 'doctor.ios.googleUrlSchemeSkipped': 'Check do URL scheme iOS do Google Sign-In ignorado (GoogleService-Info.plist ausente)',
412
+ 'doctor.ios.appleSignInEntitlementOk': 'Entitlement do Apple Sign-In configurado',
413
+ 'doctor.ios.appleSignInEntitlementMissing': 'Entitlement do Apple Sign-In ausente — adicione a capability Sign In with Apple no Xcode',
414
+ 'doctor.ios.facebookOk': 'Credenciais do Facebook configuradas (iOS)',
415
+ 'doctor.ios.facebookPlaceholders': 'Credenciais do Facebook ainda são placeholders — atualize FacebookAppID e FacebookClientToken no Info.plist',
416
+ 'doctor.ios.facebookSkipped': 'Check das credenciais do Facebook ignorado (FacebookAppID ausente no Info.plist)',
417
+ 'doctor.android.facebookOk': 'Credenciais do Facebook configuradas (Android)',
418
+ 'doctor.android.facebookPlaceholders': 'Credenciais do Facebook ainda são placeholders — atualize facebook_app_id e facebook_client_token em android/app/src/main/res/values/strings.xml',
419
+
420
+ 'doctor.revenuecat.title': 'RevenueCat',
421
+ 'doctor.revenuecat.keysOk': 'Chaves de API configuradas (iOS + Android)',
422
+ 'doctor.revenuecat.keysEmpty': 'Chaves de API não configuradas — defina RC_IOS_API_KEY e RC_ANDROID_API_KEY no Makefile e .vscode/launch.json',
423
+ 'doctor.revenuecat.keysTest': 'Usando chaves Test Store (test_) — substitua por appl_ e goog_ para produção',
424
+ 'doctor.revenuecat.webhookUrlSupabase': 'URL do webhook (cole no RevenueCat → Integrations → Webhooks)',
425
+ 'doctor.revenuecat.webhookUrlFirebase': 'URL do webhook: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
426
+
427
+ 'update.iosRelease.success': 'Arquivos de release iOS atualizados',
428
+ 'add.iosRelease.success': 'Arquivos de release iOS adicionados',
429
+ 'add.iosRelease.already': 'Arquivos de release iOS já existem',
430
+
431
+ 'new.api.q.baseUrl': 'Qual e a URL base da sua API?',
432
+ 'new.api.q.baseUrl.hint': 'https://api.example.com',
433
+ 'new.firebase.banner': '🔥 Novo app Flutter — Firebase',
434
+ 'new.firebase.subtitle': 'Projeto completo: auth, Firestore, notificações, login social e muito mais.',
435
+ 'new.prereq.title': 'Antes de começar, certifique-se de que você tem:',
436
+ 'new.firebase.prereq.title': 'Antes de começar, certifique-se de que você tem:',
437
+ 'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
438
+ 'new.firebase.prereq.create.2': '2. Plano Blaze (cartão de crédito — necessário para Cloud Functions)',
439
+ 'new.firebase.prereq.create.billingLimit': '3. Limite: até 3 projetos por conta de faturamento. Remova projetos não usados ou solicite aumento de cota se já atingiu o limite.',
440
+ 'new.firebase.prereq.create.projectQuota': '4. Cota de projetos: a conta Google tem limite (ex.: 10–30 projetos). Exclua projetos não usados em console.cloud.google.com se necessário.',
441
+ 'new.firebase.prereq.create.note': ' Projeto e APIs serão criados automaticamente.',
442
+ 'new.firebase.prereq.create.pushNote': ' Projeto Firebase para FCM + Remote Config será criado automaticamente (sem conta de serviço).',
443
+ 'new.firebase.create.creatingPush': 'Criando projeto Firebase para notificações push…',
444
+ 'new.firebase.create.successPush': 'Projeto Firebase criado para FCM + Remote Config.',
445
+ 'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
446
+ 'new.firebase.prereq.2': '2. Projeto Firebase criado em console.firebase.google.com',
447
+ 'new.firebase.prereq.3': '3. Plano Blaze ativado (cartao de credito — necessário para Cloud Functions)',
448
+ 'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (usado para ativar APIs automaticamente)',
449
+ 'new.firebase.prereq.5': '5. Antes do deploy: ative Secret Manager API e Firebase Storage (ver PREREQUISITES.md ou links apos gerar)',
450
+ 'new.firebase.prereq.doc': ' Checklist completo: PREREQUISITES.md',
451
+
452
+ 'new.firebase.q.appName': 'Qual e o nome do seu app?',
453
+ 'new.firebase.q.appName.hint': 'ex: Meu App Incrivel',
454
+ 'new.firebase.q.appName.required': 'O nome do app é obrigatório.',
455
+
456
+ 'new.firebase.q.bundleId': 'Qual e o identificador único (Bundle ID) do seu app?',
457
+ 'new.firebase.q.bundleId.hint': 'Funciona como um endereço para o seu app, ex: com.minhaempresa.meuapp',
458
+ 'new.firebase.q.bundleId.invalid': 'Formato inválido. Use: com.empresa.app',
459
+ 'new.firebase.q.bundleId.required': 'O Bundle ID é obrigatório.',
460
+
461
+ 'new.firebase.q.projectId': 'Qual e o ID do seu projeto Firebase?',
462
+ 'new.firebase.q.projectId.hint': 'Encontre no Firebase Console → seu projeto → Configurações',
463
+ 'new.firebase.q.projectId.required': 'O Firebase Project ID é obrigatório.',
464
+
465
+ 'new.firebase.q.modules': 'Quais features opcionais você quer incluir?',
466
+ 'new.firebase.q.modules.hint': 'Espaco para selecionar, Enter para confirmar',
467
+ 'new.modules.header.common': '── Comuns (todos os backends) ──',
468
+ 'new.modules.header.features': '── Telas e features ──',
469
+ 'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
470
+ 'new.modules.header.ci': '── CI/CD ──',
471
+ 'new.modules.header.monetization': '── Monetizacao ──',
472
+ 'new.firebase.module.revenuecat': '💰 RevenueCat (ativa Subscriptions)',
473
+ 'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
474
+ 'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
475
+ 'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
476
+ 'new.firebase.module.web': '🌐 Web Support (PWA, somente Firebase)',
477
+ 'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
478
+ 'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
479
+ 'new.firebase.module.local_notifications': '🔔 Local Reminders (sem servidor)',
480
+ 'new.firebase.module.feedback': '💬 Feature Requests (requer Firebase ou Supabase)',
481
+ 'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
482
+ 'new.firebase.module.onboarding': '👋 Onboarding (fluxo de boas-vindas)',
483
+
484
+ 'new.firebase.q.secrets.configureNow': 'Configurar as secrets do servidor agora? (webhook RevenueCat, Meta Ads)',
485
+ 'new.firebase.q.secrets.configureNow.hint': 'Se não agora, veja o README para os comandos de configuração depois',
486
+ 'new.firebase.q.secrets.later': '• Secrets do servidor não configuradas — serão configuradas durante `kasy deploy`.',
487
+ 'new.firebase.q.revenuecat.webhookKey': 'Chave secreta do webhook (um valor aleatorio foi sugerido — pressione Enter para aceitar ou digite o seu)',
488
+ 'new.firebase.q.revenuecat.webhookKey.hint': 'Salve esse valor. No painel RevenueCat, cole como: Bearer <esse-valor>',
489
+ 'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
490
+ 'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (opcional)',
491
+ 'new.firebase.q.revenuecat.android': 'Chave de API RevenueCat para Android',
492
+ 'new.firebase.q.revenuecat.ios': 'Chave de API RevenueCat para iOS',
493
+ 'new.firebase.q.paywall': 'Qual estilo de paywall?',
494
+ 'new.firebase.q.paywall.hint': 'Layout da tela de assinaturas — pode alterar depois no RevenueCat',
495
+ 'new.firebase.q.revenuecat.web': 'Habilitar assinaturas na web (RevenueCat Web Billing)?',
496
+ 'new.firebase.q.revenuecat.web.hint': 'Requer Web Billing no dashboard RevenueCat + Stripe. Deixe desmarcado se não precisar.',
497
+ 'new.firebase.q.revenuecat.webKey': 'Chave API RevenueCat Web Billing (rcb_xxx ou rcb_sb_xxx, opcional — configure depois)',
498
+ 'new.firebase.success.revenuecatWeb': '• RevenueCat Web: adicione RC_WEB_API_KEY (launch.json) para assinaturas na web',
499
+ 'new.firebase.q.sentry.dsn': 'DSN do Sentry (deixe em branco para configurar depois)',
500
+ 'new.firebase.q.sentry.dsn.invalid': 'DSN inválido. Formato esperado: https://chave@host/project-id',
501
+ 'new.firebase.q.mixpanel.token': 'Token do Mixpanel (deixe em branco para configurar depois)',
502
+ 'new.firebase.q.facebook.appId': 'App ID do Facebook',
503
+ 'new.firebase.q.facebook.appId.required': 'App ID do Facebook é obrigatório.',
504
+ 'new.firebase.q.facebook.appId.invalid': 'App ID do Facebook deve ser numerico (ex: 1234567890).',
505
+ 'new.firebase.q.facebook.token': 'Token do App Facebook',
506
+ 'new.firebase.q.facebook.token.required': 'Token do App Facebook é obrigatório.',
507
+ 'new.firebase.q.revenuecat.android.required': 'Chave Android do RevenueCat é obrigatória.',
508
+ 'new.firebase.q.revenuecat.ios.required': 'Chave iOS do RevenueCat é obrigatória.',
509
+ 'new.firebase.q.revenuecat.metaDataset.invalid': 'Pixel ID deve ser numerico (ex: 1234567890).',
510
+ 'new.firebase.q.revenuecat.webKey.invalid': 'Chave Web Billing deve começar com rcb_ (ex: rcb_sb_xxx ou rcb_xxx).',
511
+
512
+ 'new.firebase.confirm.title': 'Resumo da configuração:',
513
+ 'new.firebase.confirm.app': 'App',
514
+ 'new.firebase.confirm.bundleId': 'Bundle ID',
515
+ 'new.firebase.confirm.project': 'Firebase',
516
+ 'new.firebase.confirm.modules': 'Features',
517
+ 'new.firebase.confirm.none': 'nenhum',
518
+ 'new.firebase.confirm.proceed': 'Criar o projeto agora?',
519
+
520
+ 'new.firebase.step.copying': 'Criando seu projeto...',
521
+ 'new.firebase.step.pubGet': 'Instalando pacotes Flutter...',
522
+ 'new.firebase.step.buildRunner': 'Gerando código (Riverpod/Freezed)...',
523
+ 'new.firebase.step.flutterfire': 'Configurando Firebase (flutterfire)...',
524
+ 'new.firebase.step.deploy': 'Fazendo deploy das Cloud Functions + regras do Firestore...',
525
+ 'new.firebase.step.done': 'Pronto!',
526
+
527
+ 'new.firebase.success.title': '🎉 Seu app está pronto!',
528
+ 'new.firebase.success.open': 'Abra o projeto:',
529
+ 'new.firebase.success.run': 'Rode o app:',
530
+ 'new.firebase.success.runMake': 'Ou use make: make run | make run-ios | make run-android',
531
+ 'new.firebase.success.deviceSetup': 'Antes de rodar em dispositivo:',
532
+ 'new.firebase.success.deviceSetup.ios': 'iOS: conecte o iPhone por cabo → confie neste computador → Xcode → Window → Devices → parear',
533
+ 'new.firebase.success.deviceSetup.android': 'Android: Configurações → Opções do desenvolvedor → ativar depuração USB',
534
+ 'new.firebase.success.hotReload': "Hot reload: pressione 'r' no terminal enquanto o app roda. Mudanças aparecem na hora.",
535
+ 'new.firebase.success.oneLiner': 'Ou copie e cole para entrar e executar:',
536
+ 'new.firebase.success.configure': 'Configure quando quiser:',
537
+ 'new.firebase.success.alreadyDone': 'Já configurado pela CLI:',
538
+ 'new.firebase.success.manualNeeded': 'Configure manualmente (se necessário):',
539
+ 'new.firebase.success.apn': '• Chave APN (push iOS): Firebase Console → Config. do Projeto → Cloud Messaging',
540
+ 'new.firebase.success.social': '• Ative o login social no Firebase Console → Authentication (Google e Apple já estão no código; so ative la)',
541
+ 'new.firebase.success.googleSignIn': '• Login com Gmail: 1) Ative em Firebase Console → Auth → Sign-in method → Google. 2) O CLI preenche kGoogleWebClientId (google_auth_options.dart) do google-services.json para Android/iOS. Web usa signInWithPopup.',
542
+ 'new.firebase.success.sentry': '• Sentry: Para relatórios de erro em produção. Pegue o DSN em sentry.io. Já no launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
543
+ 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics em produção. Já no launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
544
+ 'new.firebase.success.web': '• Web (adicional): Android e iOS funcionam normalmente. Para testar no browser: "flutter run -d chrome" ou "flutter run -d web-server --web-port=5000". Para publicar: "flutter build web". Notificações push são exclusivas de mobile e desativadas automaticamente na web.',
545
+
546
+ 'new.firebase.q.deploy': 'Fazer deploy das Cloud Functions + regras do Firestore agora?',
547
+ 'new.firebase.q.deploy.hint': 'Requer plano Blaze e firebase-tools instalado globalmente',
548
+ 'new.firebase.deployFailed.hint': 'Se o deploy falhou: crie Firestore e Storage no Console primeiro:',
549
+ 'new.firebase.deployFailed.firestore': '• Firestore: crie o banco (Criar banco → Modo Nativo)',
550
+ 'new.firebase.deployFailed.storage': '• Storage: clique em Começar',
551
+ 'new.firebase.deployFailed.orGcloud': 'Ou crie o Firestore via CLI:',
552
+ 'new.firebase.success.deployLater': '• Deploy do backend quando estiver pronto (de dentro da pasta do projeto):',
553
+ 'new.firebase.success.beforeDeploy': 'Antes do firebase deploy, ative (clique para abrir):',
554
+ 'new.firebase.success.secretManager': '• Secret Manager API',
555
+ 'new.firebase.success.firestore': '• Firestore (crie o banco se não existir)',
556
+ 'new.firebase.success.storage': '• Firebase Storage (Começar)',
557
+ 'new.firebase.success.auth': '• Firebase Authentication (Email/Senha)',
558
+ 'new.firebase.success.security': '🔒 .gitignore exclui .env e outros segredos. Cloud Functions usam secrets no servidor.',
559
+
560
+ 'new.firebase.interactive.title': '⚠️ Configuração de Nuvem Requerida',
561
+ 'new.firebase.interactive.desc': 'Por motivos de segurança e faturamento, o Firebase exige aprovação manual:',
562
+ 'new.firebase.interactive.step1': '1. Crie o Banco de Dados (Firestore): ',
563
+ 'new.firebase.interactive.step2': '2. Faça upgrade para o plano Blaze (Pay-as-you-go): ',
564
+ 'new.firebase.interactive.step3': '3. Confirme que habilitou Auth (Email/Senha): ',
565
+
566
+ 'new.firebase.interactive.prompt1': 'Você já criou o banco Firestore e habilitou a Autenticação no link acima?',
567
+ 'new.firebase.interactive.prompt2': 'Você já fez o upgrade pro Plano Blaze? (Obrigatório para deploy de funções)',
568
+ 'new.firebase.interactive.googleAuthNote': '* Ative o Google Sign-In manualmente (Email/Senha e Anônimo já foram ativados): ',
569
+ 'new.firebase.interactive.billingNeeded': 'Plano Blaze ainda não ativo. Ative no link acima e aguarde a detecção automática.',
570
+ 'new.firebase.interactive.billingWaiting': 'Verificando status do Blaze...',
571
+ 'new.firebase.interactive.billingTimeout': 'Plano Blaze não confirmado apos o tempo limite. Deploy ignorado — rode manualmente quando estiver pronto.',
572
+ 'new.firebase.interactive.authWarn': 'Não foi possível ativar Email/Senha e Anônimo automaticamente. Ative manualmente:',
573
+ 'new.firebase.existing.apisFailed': 'Não foi possível ativar APIs:',
574
+ 'new.firebase.existing.googleSignInManual': 'Google Sign-In: ative manualmente em Authentication → Sign-in method → Google',
575
+
576
+ 'new.firebase.interactive.ready': 'Pronto para publicar Push Notifications + Regras agora?',
577
+ 'new.firebase.interactive.deploying': 'Fazendo deploy das Cloud Functions + Regras (Storage e Firestore)...',
578
+ 'new.firebase.interactive.errorTitle': 'Ocorreu um erro durante o deploy.',
579
+ 'new.firebase.interactive.errorHint': 'Verifique se você ativou o Firestore e vinculou um cartão de crédito para o Plano Blaze.',
580
+ 'new.firebase.interactive.laterHint': 'Você pode publicar depois abrindo o terminal na pasta do projeto e rodando: ',
581
+ 'new.firebase.interactive.skipped': 'Deploy de Funções ignorado. Você pode publicar depois quando quiser.',
582
+
583
+ 'new.firebase.warn.flutterfire': '⚠️ FlutterFire não conseguiu gerar firebase_options_dev.dart automaticamente.',
584
+ 'new.firebase.warn.flutterfire.manual': 'Execute manualmente na pasta do projeto:',
585
+
586
+ 'new.firebase.error.templateMissing': 'Template Firebase não encontrado em: {path}. Certifique-se de que a pasta Firebase/ existe.',
587
+ 'new.firebase.error.dirNotEmpty': 'O diretório "{path}" já existe e não está vazio.',
588
+ 'new.firebase.error.aborted': 'Setup cancelado.',
589
+
590
+ 'new.supabase.prereq.1': '1. Conta Supabase em supabase.com',
591
+ 'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI instalados (ambos obrigatórios)',
592
+ 'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase necessário para push)',
593
+ 'new.supabase.prereq.login': ' Se criar manualmente: tenha URL e anon key do projeto prontos',
594
+ 'new.supabase.loginRequired': '⚠️ Você precisa estar logado para criar projeto. Execute supabase login primeiro.',
595
+ 'new.supabase.loginCommand': ' supabase login',
596
+ 'new.supabase.success.done.db': '• Banco: tabelas, politicas RLS',
597
+ 'new.supabase.success.done.storage': '• Storage: bucket kasy com politicas',
598
+ 'new.supabase.success.done.webhook': '• Edge Function revenuecat-webhook',
599
+ 'new.supabase.success.done.secrets': '• Secrets da Edge Function (se informados)',
600
+ 'new.supabase.success.done.launch': '• launch.json com Sentry, Mixpanel, RevenueCat',
601
+ 'new.supabase.success.auth': '• Auth: Email já vem ativado. Ative Google, Apple e Facebook em: {authUrl}',
602
+ 'new.supabase.success.storage': '• Storage: Bucket kasy criado com politicas (já pronto)',
603
+ 'new.supabase.success.fcm': '• Push (FCM): Configure no Firebase Console (plano Blaze). App já pronto para Supabase + FCM. URL: {fcmUrl}',
604
+ 'new.supabase.success.deployLater': '• Deploy do backend quando estiver pronto (de dentro da pasta do projeto):',
605
+
606
+ 'new.api.prereq.1': '1. Sua API REST rodando e acessivel',
607
+ 'new.api.prereq.2': '2. URL base da API (ex: https://api.yourapp.com)',
608
+ 'new.api.prereq.3': '3. Firebase CLI obrigatório para notificações push (FCM)',
609
+ 'new.api.success.backendUrl': '• Aponte o BACKEND_URL para sua API (launch.json)',
610
+ 'new.api.success.fcm': '• Firebase e necessário para notificações push (FCM) — configure a chave APNs no console do Firebase',
611
+ 'new.api.success.auth': '• Implemente os endpoints de auth social (Google, Apple) no seu backend',
612
+
613
+ 'new.outdated.hint': 'projetos criados agora não terão as últimas melhorias.',
614
+ 'new.outdated.upgradeNow': 'Atualizar antes de criar? (requer assinatura ativa)',
615
+ 'new.outdated.upgraded': 'kasy atualizado! Rode kasy new novamente.',
616
+ 'new.success.title': 'Projeto criado com sucesso!',
617
+ 'new.success.nextSteps': 'Proximos passos:',
618
+ 'new.success.step.cd': 'Entre na pasta do projeto:',
619
+ 'new.success.step.deploy': 'Publique o backend no Firebase:',
620
+ 'new.success.step.run': 'Execute o app (com suas chaves configuradas):',
621
+ 'new.success.step.run.vscode': '(ou F5 no VS Code)',
622
+ 'new.success.step.console': 'Abra o console do backend:',
623
+ 'new.fcm.generating': 'Gerando chave de Service Account FCM…',
624
+ 'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
625
+ 'new.sha1.failed': 'SHA-1 não adicionado automaticamente: {error}',
626
+ 'new.sha1.manual': 'Adicione manualmente para o Google Sign-In funcionar no Android:',
627
+ 'new.sha1.skipped.apiFailed': 'SHA-1 não adicionado automaticamente. Motivo: {error}',
628
+ 'new.sha1.skipped.other': 'SHA-1 não adicionado: {reason}',
629
+ 'new.sha1.addManually': 'Adicione manualmente: Firebase Console → Configurações do projeto → Seus apps → Android → Adicionar impressão digital',
630
+ 'new.sha1.added': '✓ SHA-1 adicionado (Google Sign-In)',
631
+ 'new.firestore.created': '✓ Firestore criado automaticamente',
632
+ 'new.firestore.notCreated.error': '⚠ Firestore não criado. Motivo: {error}',
633
+ 'new.firestore.notCreated': '⚠ Firestore não criado automaticamente',
634
+ 'new.storage.created': '✓ Firebase Storage criado automaticamente',
635
+ 'new.storage.notCreated.error': '⚠ Storage não criado. Motivo: {error}',
636
+ 'new.storage.notCreated': '⚠ Storage não criado automaticamente',
637
+ 'new.activateManually': 'Ative manualmente no console:',
638
+ 'new.fcm.serverConfig': 'Configure no servidor: FIREBASE_SERVICE_ACCOUNT_JSON="$(cat .kasy/fcm-service-account.json)"',
639
+ 'new.apns.warning': '⚠ Push iOS: configure a APNs Key no Firebase Console',
640
+ 'new.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
641
+ 'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → fazer upload da APNs Key',
642
+ 'new.firebase.create.estimatedTime': '(geralmente 3-5 min — não feche o terminal)',
643
+ 'new.internet.warning': '📶 Verifique se você está com uma internet estável — esta etapa precisa de conexão.',
644
+
645
+ // run command
646
+ 'cli.command.run.description': 'Roda o app no celular, simulador ou navegador',
647
+ 'cli.command.reset.description': 'Desinstala o app no simulador/emulador/dispositivo pra testar como primeira instalação',
648
+ 'reset.title': 'Resetar app no dispositivo',
649
+ 'reset.scanning': 'Procurando simuladores, emuladores e dispositivos conectados...',
650
+ 'reset.prompt.pickDevice': 'Em qual deles você quer resetar?',
651
+ 'reset.resetting': 'Resetando',
652
+ 'reset.reinstalling': 'Reinstalando o app...',
653
+ 'reset.success.uninstalled': 'App desinstalado. Todos os dados e permissões foram limpos.',
654
+ 'reset.info.notInstalled': 'O app não estava instalado neste dispositivo.',
655
+ 'reset.warn.noDevices': 'Nenhum simulador, emulador ou dispositivo em execução. Inicie um e tente de novo.',
656
+ 'reset.warn.nothingSelected': 'Nenhum dispositivo selecionado.',
657
+ 'reset.warn.iosUninstallFailed': 'simctl uninstall falhou.',
658
+ 'reset.warn.androidUninstallFailed': 'adb uninstall não retornou sucesso.',
659
+ 'reset.warn.iosDeviceManual': 'iPhone físico: apague o app manualmente (segure o ícone → Remover app), depois reinstale com kasy run.',
660
+ 'reset.warn.iosDeviceUninstallFailed': 'devicectl não conseguiu desinstalar. Verifique se o iPhone está desbloqueado e confia neste Mac.',
661
+ 'reset.warn.webIncognito': 'Web: abra o app em uma janela anônima/privada do navegador pra testar como visitante novo.',
662
+ 'reset.warn.unknownPlatform': 'Plataforma não suportada',
663
+ 'reset.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
664
+ 'reset.error.noIdentifier': 'Não consegui ler o bundle id nem o package name Android deste projeto.',
665
+ 'reset.error.noBundleId': 'Bundle id do iOS não encontrado.',
666
+ 'reset.error.noPackageName': 'applicationId do Android não encontrado.',
667
+ 'reset.outro.skipped': 'Pronto. O app não foi desinstalado.',
668
+ 'reset.outro.uninstalledOnly': 'Pronto. Rode kasy run pra reinstalar.',
669
+ 'reset.outro.cancelled': 'Cancelado. O app não foi desinstalado.',
670
+ 'reset.prompt.xcodeOpen': 'O Xcode está aberto e vai atrapalhar a instalação. O que você quer fazer?',
671
+ 'reset.prompt.xcodeOpen.close': 'Fechar o Xcode automaticamente (recomendado)',
672
+ 'reset.prompt.xcodeOpen.skip': 'Deixar o Xcode aberto e tentar mesmo assim',
673
+ 'reset.prompt.xcodeOpen.cancel': 'Cancelar o reset',
674
+ 'reset.info.xcodeClosed': 'Xcode fechado.',
675
+ 'reset.prompt.reinstallNow': 'App removido. Confere no dispositivo e reinstala agora?',
676
+ 'reset.prompt.clearLauncherCache': 'Limpar também o cache do launcher ({pkg})? Resolve preview cinza de widgets.',
677
+ 'reset.success.launcherCleared': 'Cache do launcher limpo ({pkg}). Tela inicial mantida.',
678
+ 'reset.warn.launcherCacheFailed': 'Não foi possível limpar o cache do launcher.',
679
+ 'reset.warn.launcherNotDetected': 'Launcher padrão não detectado — pulando limpeza de cache.',
680
+ 'run.launching': 'Iniciando app Flutter...',
681
+ 'run.updateHint.prefix': 'Melhorias disponíveis para o projeto —',
682
+ 'run.updateHint.suffix': 'para ver o que há de novo',
683
+ 'run.spinner.building': 'Iniciando Flutter…',
684
+ 'run.spinner.ready': 'Flutter pronto — use r (reload), R (restart), q (sair)',
685
+ 'run.spinner.failed': 'Flutter run falhou antes de iniciar',
686
+ 'run.stage.gradleFirstTime': 'Compilando Android (1ª vez leva 5-15 min — Gradle baixando dependências)…',
687
+ 'run.stage.gradle': 'Compilando Android…',
688
+ 'run.stage.xcode': 'Compilando iOS…',
689
+ 'run.stage.pods': 'Instalando pods iOS…',
690
+ 'run.stage.installing': 'Instalando no dispositivo…',
691
+ 'run.stage.syncing': 'Sincronizando arquivos com o dispositivo…',
692
+ 'run.stage.buildSuccess': 'Build pronto — abrindo o app…',
693
+ 'run.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
694
+ 'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
695
+
696
+ // doctor project checks
697
+ 'doctor.project.title': 'Projeto',
698
+ 'doctor.project.appName': 'Nome do app',
699
+ 'doctor.project.backend': 'Backend',
700
+ 'doctor.project.bundleId': 'Bundle ID',
701
+ 'doctor.project.pubGet': 'Dependencias instaladas (pubspec.lock presente)',
702
+ 'doctor.project.pubGetMissing': 'Execute flutter pub get — pubspec.lock não encontrado',
703
+ 'doctor.project.modules': 'Features ativas',
704
+ 'doctor.project.noModules': 'Nenhuma feature opcional ativa',
705
+
706
+ // add command
707
+ 'cli.command.add.description': 'Adiciona algo novo ao app (ex: kasy add ai_chat)',
708
+
709
+ // docs command
710
+ 'cli.command.docs.description': 'Abre a documentação completa',
711
+
712
+ // splash command
713
+ 'cli.command.splash.description': 'Troca os logos da splash (claro/escuro) e regenera os assets nativos',
714
+ 'splash.intro': 'Splash screen',
715
+ 'splash.validating': 'Validando arquivos PNG...',
716
+ 'splash.validated': 'PNGs estão bons',
717
+ 'splash.copying': 'Copiando logos para assets/images/...',
718
+ 'splash.copied': 'Logos copiados',
719
+ 'splash.android12Generating': 'Gerando variantes com padding para Android 12+...',
720
+ 'splash.android12Generated': 'Variantes Android 12+ geradas',
721
+ 'splash.generating': 'Regenerando splash nativa (Android, iOS, Web)...',
722
+ 'splash.generated': 'Splash nativa regenerada',
723
+ 'splash.done': 'Pronto. Rode "flutter run" para ver a nova splash.',
724
+ 'splash.warn.title': 'Avisos',
725
+ 'splash.warn.noAlphaLight': '{path} não tem canal alpha (fundo transparente). O logo vai aparecer com fundo sólido em vez de transparente.',
726
+ 'splash.warn.noAlphaDark': '{path} não tem canal alpha (fundo transparente). O logo vai aparecer com fundo sólido em vez de transparente.',
727
+ 'splash.warn.smallLight': 'Logo claro tem {w}x{h}. Recomendado pelo menos 768x768 para evitar bordas borradas.',
728
+ 'splash.warn.smallDark': 'Logo escuro tem {w}x{h}. Recomendado pelo menos 768x768 para evitar bordas borradas.',
729
+ 'splash.summary.title': 'Salvo',
730
+ 'splash.summary.light': 'Modo claro',
731
+ 'splash.summary.dark': 'Modo escuro',
732
+ 'splash.skipGenerate.title': 'Geração pulada',
733
+ 'splash.skipGenerate.hint': 'Rode `dart run flutter_native_splash:create` quando quiser regenerar.',
734
+ 'splash.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
735
+ 'splash.error.bothRequired': '--light e --dark são obrigatórios.',
736
+ 'splash.error.fileNotFound': 'Arquivo não encontrado: {path}',
737
+ 'splash.error.notPng': 'Um dos arquivos não é um PNG válido.',
738
+ 'splash.error.generateFailed': 'flutter_native_splash:create falhou. Veja a saída acima.',
739
+
740
+ // icon command
741
+ 'cli.command.icon.description': 'Troca o ícone do app (iOS + Android) e regenera os assets nativos',
742
+ 'icon.intro': 'Ícone do app',
743
+ 'icon.validating': 'Validando arquivo PNG...',
744
+ 'icon.validated': 'PNG está bom',
745
+ 'icon.copying': 'Copiando ícone para assets/images/icon.png...',
746
+ 'icon.copied': 'Ícone copiado',
747
+ 'icon.generating': 'Regenerando ícones nativos (Android + iOS)...',
748
+ 'icon.generated': 'Ícones nativos regenerados',
749
+ 'icon.done': 'Pronto. Desinstale o app do dispositivo e reinstale para ver o novo ícone.',
750
+ 'icon.warn.title': 'Avisos',
751
+ 'icon.warn.notSquare': 'Ícone tem {w}x{h} (não é quadrado). A imagem vai ser esticada. Use uma imagem quadrada (1024x1024 recomendado).',
752
+ 'icon.warn.small': 'Ícone tem {w}x{h}. Recomendado pelo menos 1024x1024 (App Store exige esse tamanho).',
753
+ 'icon.warn.hasAlpha': 'Ícone tem transparência. iOS rejeita ícones com canal alpha — flutter_launcher_icons remove automaticamente (remove_alpha_ios: true).',
754
+ 'icon.summary.title': 'Salvo',
755
+ 'icon.summary.icon': 'Ícone do app',
756
+ 'icon.skipGenerate.title': 'Geração pulada',
757
+ 'icon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
758
+ 'icon.reinstall.title': 'Importante',
759
+ 'icon.reinstall.hint': 'iOS e Android cacheiam o ícone antigo. Desinstale o app e reinstale para ver o novo.',
760
+ 'icon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
761
+ 'icon.error.imageRequired': '--image é obrigatório.',
762
+ 'icon.error.fileNotFound': 'Arquivo não encontrado: {path}',
763
+ 'icon.error.notPng': 'O arquivo não é um PNG válido.',
764
+ 'icon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
765
+
766
+ // favicon command
767
+ 'cli.command.favicon.description': 'Troca o favicon / ícone PWA da web e regenera os assets web',
768
+ 'favicon.intro': 'Favicon web',
769
+ 'favicon.validating': 'Validando arquivo PNG...',
770
+ 'favicon.validated': 'PNG está bom',
771
+ 'favicon.copying': 'Copiando favicon para assets/images/favicon.png...',
772
+ 'favicon.copied': 'Favicon copiado',
773
+ 'favicon.generating': 'Regenerando ícones web (favicon + tamanhos PWA)...',
774
+ 'favicon.generated': 'Ícones web regenerados',
775
+ 'favicon.done': 'Pronto. Rode "flutter run -d chrome" para ver o novo favicon.',
776
+ 'favicon.warn.title': 'Avisos',
777
+ 'favicon.warn.notSquare': 'Favicon tem {w}x{h} (não é quadrado). Vai ser esticado. Use uma imagem quadrada (512x512+ recomendado).',
778
+ 'favicon.warn.small': 'Favicon tem {w}x{h}. Recomendado pelo menos 512x512 para ficar nítido nas telas de instalação da PWA.',
779
+ 'favicon.summary.title': 'Salvo',
780
+ 'favicon.summary.favicon': 'Favicon',
781
+ 'favicon.skipGenerate.title': 'Geração pulada',
782
+ 'favicon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
783
+ 'favicon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
784
+ 'favicon.error.imageRequired': '--image é obrigatório.',
785
+ 'favicon.error.fileNotFound': 'Arquivo não encontrado: {path}',
786
+ 'favicon.error.notPng': 'O arquivo não é um PNG válido.',
787
+ 'favicon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
788
+
789
+ // notifications command
790
+ 'cli.command.notifications.description': 'Edita os textos das notificações locais e lembretes',
791
+ 'cli.command.notifications.text.description': 'Define títulos e mensagens das notificações locais',
792
+ 'cli.command.notifications.picker.intro': 'Editar textos das notificações',
793
+ 'cli.command.notifications.picker.message': 'O que você quer fazer?',
794
+ 'notifications.error.notKasyProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
795
+ 'notifications.error.noI18n': 'lib/i18n/*.i18n.json não encontrado neste projeto.',
796
+ 'notifications.error.noFeatures': 'lib/core/config/features.dart não encontrado.',
797
+ 'notifications.error.notEnabled': 'Notificações locais desativadas. Execute: kasy add local_notifications',
798
+ 'notifications.error.cancelled': 'Cancelado.',
799
+ 'notifications.prompt.intro': 'Textos de notificação local',
800
+ 'notifications.prompt.hint': 'Demo Home = teste instantâneo em Features. Lembrete = alerta agendado em Configurações.',
801
+ 'notifications.prompt.demoTitle': 'Demo Home — título da notificação',
802
+ 'notifications.prompt.demoBody': 'Demo Home — descrição / corpo',
803
+ 'notifications.prompt.reminderTitle': 'Lembrete agendado — título',
804
+ 'notifications.prompt.reminderBody': 'Lembrete agendado — corpo',
805
+ 'notifications.prompt.required': 'Obrigatório.',
806
+ 'notifications.writing': 'Atualizando lib/i18n/*.i18n.json...',
807
+ 'notifications.written': 'Atualizado: {langs}',
808
+ 'notifications.slang': 'Executando dart run slang...',
809
+ 'notifications.slangDone': 'Traducoes regeneradas',
810
+ 'notifications.slangFailed': 'dart run slang falhou — execute manualmente no projeto',
811
+ 'notifications.done': 'Textos de notificação local atualizados.',
812
+ 'notifications.summary.demo': 'Home → Features (demo):',
813
+ 'notifications.summary.reminder': 'Configurações → Lembretes (agendado):',
814
+
815
+ 'add.list.title': 'Features do projeto',
816
+ 'add.error.noModule': 'Informe o nome da feature ou use --list para ver as disponíveis.',
817
+ 'add.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
818
+ 'add.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
819
+ 'add.alreadyActive': 'A feature "{module}" já está ativa neste projeto.',
820
+ 'add.applying': 'Adicionando feature: {module}',
821
+ 'add.applyingPatch': 'Aplicando mudanças da feature...',
822
+ 'add.patchApplied': 'Patch aplicado',
823
+ 'add.patchFailed': 'Patch falhou — verifique a saída acima',
824
+ 'add.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
825
+ 'add.pubGetDone': 'Dependencias atualizadas',
826
+ 'add.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
827
+ 'add.buildRunner': 'Gerando código (Riverpod/Freezed)...',
828
+ 'add.buildRunnerDone': 'Geração de código concluída',
829
+ 'add.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
830
+ 'add.success': 'Feature "{module}" adicionada com sucesso.',
831
+ 'add.cancelled': 'Cancelado.',
832
+ 'add.prompt.sentryDsn': 'Sentry DSN (deixe em branco para configurar depois):',
833
+ 'add.prompt.mixpanelToken': 'Mixpanel Token (deixe em branco para configurar depois):',
834
+ 'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deixe em branco para configurar depois):',
835
+ 'add.prompt.rcIosKey': 'RevenueCat iOS API key (deixe em branco para configurar depois):',
836
+ 'add.note.facebook': 'Adicione seu Facebook App ID e token no .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
837
+ 'new.q.llm_chat.configureNow': 'Configurar o agente de Chat LLM agora?',
838
+ 'new.q.llm_chat.configureNow.hint': 'Pode pular e executar "kasy add llm_chat" depois',
839
+ 'add.llm_chat.reconfigure': 'Feature já ativa — reconfigurando apenas as credenciais.',
840
+ 'add.prompt.llmProvider': 'Provedor de LLM:',
841
+ 'add.prompt.llmSystemPrompt': 'Instrução do agente — system prompt (deixe em branco para nenhuma):\n Exemplo: "Você e um assistente de suporte do app Fitsync. Responda apenas sobre treinos."\n >',
842
+ 'add.prompt.llmApiKey': 'Chave de API (OpenAI ou Gemini) — fica no servidor, nunca no app (deixe em branco para configurar depois):',
843
+ 'add.prompt.llmEndpoint': 'URL do seu endpoint LLM (deixe em branco para configurar depois):',
844
+ 'add.llm_chat.settingSecret': 'Salvando chave de API como secret no servidor...',
845
+ 'add.llm_chat.secretSet': 'Chave de API salva como secret',
846
+ 'add.llm_chat.secretFailed': 'Não foi possível salvar o secret automaticamente — configure manualmente (veja instruções abaixo)',
847
+ 'add.llm_chat.skipSecret': 'Chave de API ignorada — configure antes do deploy via CLI do servidor',
848
+ 'add.llm_chat.deploying': 'Fazendo deploy da função LLM no servidor...',
849
+ 'add.llm_chat.deployed': 'Função LLM deployada com sucesso',
850
+ 'add.llm_chat.deployFailed': 'Deploy automático falhou — faca o deploy manualmente (veja instruções abaixo)',
851
+ 'add.llm_chat.nextSteps.firebase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json já foi preenchido.\n 2. Rode o app: kasy run\n',
852
+ 'add.llm_chat.nextSteps.firebase.deployFailed': '\n Proximos passos:\n 1. Deploy manual: firebase deploy --only functions:llmChat\n 2. O LLM_CHAT_ENDPOINT no .vscode/launch.json já foi preenchido.\n 3. Rode o app: kasy run\n',
853
+ 'add.llm_chat.nextSteps.supabase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json já foi preenchido.\n 2. Rode o app: kasy run\n',
854
+ 'add.llm_chat.nextSteps.supabase.deployFailed': '\n Proximos passos:\n 1. Deploy manual: supabase functions deploy llm-chat --no-verify-jwt\n 2. O LLM_CHAT_ENDPOINT no .vscode/launch.json já foi preenchido.\n 3. Rode o app: kasy run\n',
855
+ 'add.llm_chat.nextSteps.api': '\n Proximos passos:\n 1. Crie um endpoint no seu servidor que aceite {message, history} e chame sua LLM.\n 2. Atualize LLM_CHAT_ENDPOINT no .vscode/launch.json com a URL do seu endpoint.\n 3. Rode o app: kasy run\n',
856
+ 'cli.command.remove.description': 'Remove algo que você não usa mais (ex: kasy remove sentry)',
857
+ 'remove.error.noModule': 'Informe o nome da feature. Uso: kasy remove <feature>',
858
+ 'remove.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
859
+ 'remove.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
860
+ 'remove.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
861
+ 'remove.confirm': 'Remover a feature "{module}"? Isso vai deletar arquivos e dependências.',
862
+ 'remove.cancelled': 'Cancelado.',
863
+ 'remove.removing': 'Removendo feature: {module}',
864
+ 'remove.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
865
+ 'remove.pubGetDone': 'Dependencias atualizadas',
866
+ 'remove.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
867
+ 'remove.buildRunner': 'Gerando código (Riverpod/Freezed)...',
868
+ 'remove.buildRunnerDone': 'Geração de código concluída',
869
+ 'remove.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
870
+ 'remove.success': 'Feature "{module}" removida com sucesso.',
871
+ 'remove.warn.ci': 'Arquivos de CI removidos. Se tinha workflows customizados, restaure-os pelo git.',
872
+ 'remove.warn.sentry.shared': 'sentry_flutter mantido — ainda necessário para features ativas (revenuecat/facebook).',
873
+ 'cli.command.update.description': 'Atualiza partes do app para a última versão (ex: kasy update components)',
874
+ 'cli.command.update.targetArg': 'Alvo para atualizar (ex.: revenuecat, sentry, components)',
875
+ 'update.error.noProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
876
+ 'update.error.unknownModule': 'Feature desconhecida: {module}\nDisponíveis: {list}',
877
+ 'update.error.unknownTarget': 'Alvo de atualização desconhecido: {module}\nDisponiveis: {list}',
878
+ 'update.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
879
+ 'update.alreadyUpToDate': 'Projeto já está atualizado (v{version}).',
880
+ 'update.status': 'Projeto: v{from} → CLI: v{to}',
881
+ 'update.noVersion': 'Projeto foi gerado sem rastreamento de versão. Todas as features podem ser atualizadas.',
882
+ 'update.changesTitle': 'Atualizações disponíveis:',
883
+ 'update.reapplyTitle': 'Sem mudancas novas — pode reaplicar se precisar:',
884
+ 'update.howToUpdate': 'Para atualizar uma feature:',
885
+ 'update.howToUpdateComponents': 'Para atualizar componentes base:',
886
+ 'update.warn.commit': 'Isso vai sobrescrever os arquivos da feature "{module}". Faca commit de tudo antes de continuar.',
887
+ 'update.warn.commitComponents': 'Isso vai sobrescrever arquivos dos componentes base. Faca commit de tudo antes de continuar.',
888
+ 'update.confirm': 'Sobrescrever arquivos da feature "{module}" com a versão mais recente?',
889
+ 'update.confirmComponents': 'Sobrescrever arquivos dos componentes base com a versão mais recente?',
890
+ 'update.confirmCore': 'Sobrescrever arquivos do core (animacoes, widgets, tema, ferramentas de dev) com a versão mais recente?',
891
+ 'update.cancelled': 'Cancelado.',
892
+ 'update.applying': 'Aplicando atualização da feature: {module}',
893
+ 'update.applyingComponents': 'Aplicando atualização dos componentes base...',
894
+ 'update.applyingCore': 'Aplicando atualização dos arquivos de core...',
895
+ 'update.applied': 'Feature {module} atualizada',
896
+ 'update.appliedComponents': '{count} arquivos de componentes base atualizados',
897
+ 'update.appliedCore': '{count} arquivos de core atualizados',
898
+ 'update.applyFailed': 'Falha ao aplicar atualização da feature {module}',
899
+ 'update.applyComponentsFailed': 'Falha ao aplicar atualização dos componentes base',
900
+ 'update.noPatch': 'Feature "{module}" não tem arquivos para atualizar (feature so de configuração).',
901
+ 'update.noComponentFiles': 'Nenhum arquivo de componente base foi encontrado para atualizar.',
902
+ 'update.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
903
+ 'update.pubGetDone': 'Dependencias atualizadas',
904
+ 'update.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
905
+ 'update.buildRunner': 'Gerando código (Riverpod/Freezed)...',
906
+ 'update.buildRunnerDone': 'Geração de código concluída',
907
+ 'update.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
908
+ 'update.success': 'Feature "{module}" atualizada com sucesso.',
909
+ 'update.componentsSuccess': 'Componentes base atualizados com sucesso.',
910
+ 'update.coreSuccess': 'Arquivos de core atualizados com sucesso.',
911
+ 'check.intro': 'Kasy Check — Notificações Push',
912
+ 'check.firebase.detected': 'Backend Firebase',
913
+ 'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — nenhuma configuração extra necessária.',
914
+ 'check.apns.warn': 'Push iOS requer APNs Key (não verificável via CLI)',
915
+ 'check.apns.where': 'Firebase Console → Cloud Messaging → app iOS → Chave de autenticação APNs',
916
+ 'check.done': 'Pronto',
917
+ 'check.notKasy': 'Esse diretório não parece ser um projeto Kasy.',
918
+ 'check.aborted': 'Cancelado',
919
+ 'check.supabase.notLinked': 'Projeto Supabase não vinculado',
920
+ 'check.supabase.notLinkedHint': 'execute: supabase link --project-ref SEU_REF',
921
+ 'check.supabase.linked': 'Projeto vinculado',
922
+ 'check.spin.secrets': 'Verificando secrets…',
923
+ 'check.spin.secretsDone': 'Secrets verificados',
924
+ 'check.secrets.listFailed': 'Não foi possível listar secrets',
925
+ 'check.secrets.checkLogin': 'verifique: supabase login',
926
+ 'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configurado',
927
+ 'check.fbProjId.missing': 'FIREBASE_PROJECT_ID ausente',
928
+ 'check.fbProjId.fixHint': 'Corrija: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
929
+ 'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → configurado automaticamente',
930
+ 'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → falhou ao configurar',
931
+ 'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configurado',
932
+ 'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON ausente',
933
+ 'check.fbSak.spin': 'Gerando e configurando chave FCM…',
934
+ 'check.fbSak.spinDone': 'Chave FCM gerada',
935
+ 'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → configurado automaticamente',
936
+ 'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → falhou ao configurar',
937
+ 'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → não foi possível gerar chave',
938
+ 'check.fbSak.manual': "Manual: Firebase Console → Configurações → Contas de serviço → Gerar chave\nDepois: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat chave.json)'",
939
+ 'check.fbSak.hint': "Corrija automaticamente: kasy check --fix\nOu manualmente: Firebase Console → Configurações → Contas de serviço → Gerar chave\nDepois: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat chave.json)'",
940
+ 'check.fn.spin': 'Verificando edge functions…',
941
+ 'check.fn.spinDone': 'Edge functions verificadas',
942
+ 'check.fn.listFailed': 'Não foi possível listar edge functions',
943
+ 'check.fn.deployed': 'Edge function send-push-notification deployada',
944
+ 'check.fn.missing': 'Edge function send-push-notification não deployada',
945
+ 'check.fn.deploySpin': 'Publicando send-push-notification…',
946
+ 'check.fn.deployDone': 'send-push-notification → deployada automaticamente',
947
+ 'check.fn.deployFailed': 'send-push-notification → falhou no deploy',
948
+ 'check.fn.hint': 'Corrija automaticamente: kasy check --fix\nOu manualmente: supabase functions deploy send-push-notification',
949
+ 'deploy.firebase.intro': 'Deploy — Firebase',
950
+ 'deploy.firebase.spin': 'Publicando no Firebase...',
951
+ 'deploy.firebase.spinDone': 'Deploy do Firebase concluído',
952
+ 'deploy.apns.title': 'Push iOS: configure a APNs Key no Firebase Console',
953
+ 'deploy.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
954
+ 'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → upload da APNs Key',
955
+ 'deploy.supabase.intro': 'Deploy — Supabase',
956
+ 'deploy.supabase.notLinked': 'Projeto Supabase não está vinculado neste diretório.',
957
+ 'deploy.supabase.linkHint': 'Execute: supabase link --project-ref SEU_PROJECT_REF',
958
+ 'deploy.supabase.projectRef': 'Project ref: {ref}',
959
+ 'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON já configurado',
960
+ 'deploy.supabase.sakSpin': 'Gerando chave FCM (Service Account)…',
961
+ 'deploy.supabase.sakSpinDone': 'Chave FCM gerada',
962
+ 'deploy.supabase.sakManual': "Configure manualmente: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
963
+ 'deploy.supabase.sakNoGS': 'google-services.json não encontrado — configure manualmente',
964
+ 'deploy.supabase.fnSpin': 'Publicando edge functions…',
965
+ 'deploy.supabase.fnSpinDone': 'Edge functions processadas',
966
+ 'deploy.supabase.fnNone': 'edge functions (nenhuma encontrada)',
967
+ 'deploy.outro': 'Deploy concluído',
968
+ };