kasy-cli 1.9.2 → 1.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/utils/i18n.js CHANGED
@@ -59,7 +59,7 @@ const MESSAGES = {
59
59
  'new.checks.environment.done': 'Environment ready',
60
60
  'setup.checks.backend.checking': 'Checking {backend} tools',
61
61
  'setup.checks.backend.done': '{backend} tools ready',
62
- 'new.checks.firebaseForPush': 'Note: Firebase CLI is required for push notifications (FCM) on all backends.',
62
+ 'new.checks.firebaseForPush': 'Note: Firebase CLI is required for push notifications (Firebase Cloud Messaging / FCM) on all backends.',
63
63
  'new.checks.requiredBlock': 'Required tools are missing. Install them to continue.',
64
64
  'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
65
65
  'new.checks.installSupabase': 'Supabase: npm i -g supabase (or brew install supabase/tap/supabase) && supabase login',
@@ -578,7 +578,7 @@ const MESSAGES = {
578
578
  'new.success.step.run': 'Run your app (with your configured keys):',
579
579
  'new.success.step.run.vscode': '(or F5 in VS Code)',
580
580
  'new.success.step.console': 'Open your backend console:',
581
- 'new.fcm.generating': 'Generating FCM Service Account key…',
581
+ 'new.fcm.generating': 'Generating push notifications key (Firebase Service Account)…',
582
582
  'new.sha1.registering': 'Registering SHA-1 for Google Sign-In (Android)…',
583
583
  'new.sha1.failed': 'SHA-1 not added automatically: {error}',
584
584
  'new.sha1.manual': 'Add it manually so Google Sign-In works on Android:',
@@ -654,15 +654,15 @@ const MESSAGES = {
654
654
  'add.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
655
655
  'add.alreadyActive': 'Feature "{module}" is already active in this project.',
656
656
  'add.applying': 'Adding feature: {module}',
657
- 'add.applyingPatch': 'Applying patch files...',
657
+ 'add.applyingPatch': 'Applying feature changes...',
658
658
  'add.patchApplied': 'Patch applied',
659
659
  'add.patchFailed': 'Patch failed — check the output above',
660
- 'add.pubGet': 'Running flutter pub get...',
660
+ 'add.pubGet': 'Installing Flutter packages (flutter pub get)...',
661
661
  'add.pubGetDone': 'Dependencies updated',
662
- 'add.pubGetFailed': 'flutter pub get failed — run it manually',
663
- 'add.buildRunner': 'Running build_runner...',
662
+ 'add.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
663
+ 'add.buildRunner': 'Generating code (Riverpod/Freezed)...',
664
664
  'add.buildRunnerDone': 'Code generation complete',
665
- 'add.buildRunnerFailed': 'build_runner failed — run it manually',
665
+ 'add.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
666
666
  'add.success': 'Feature "{module}" added successfully.',
667
667
  'add.cancelled': 'Cancelled.',
668
668
  'add.prompt.sentryDsn': 'Sentry DSN (leave blank to configure later):',
@@ -697,12 +697,12 @@ const MESSAGES = {
697
697
  'remove.confirm': 'Remove feature "{module}"? This will delete files and dependencies.',
698
698
  'remove.cancelled': 'Cancelled.',
699
699
  'remove.removing': 'Removing feature: {module}',
700
- 'remove.pubGet': 'Running flutter pub get...',
700
+ 'remove.pubGet': 'Installing Flutter packages (flutter pub get)...',
701
701
  'remove.pubGetDone': 'Dependencies updated',
702
- 'remove.pubGetFailed': 'flutter pub get failed — run it manually',
703
- 'remove.buildRunner': 'Running build_runner...',
702
+ 'remove.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
703
+ 'remove.buildRunner': 'Generating code (Riverpod/Freezed)...',
704
704
  'remove.buildRunnerDone': 'Code generation complete',
705
- 'remove.buildRunnerFailed': 'build_runner failed — run it manually',
705
+ 'remove.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
706
706
  'remove.success': 'Feature "{module}" removed successfully.',
707
707
  'remove.warn.ci': 'CI files removed. If you had custom workflow files, restore them from git.',
708
708
  'remove.warn.sentry.shared': 'sentry_flutter kept — still required by active features (revenuecat/facebook).',
@@ -735,15 +735,72 @@ const MESSAGES = {
735
735
  'update.applyComponentsFailed': 'Failed to apply update for base components',
736
736
  'update.noPatch': 'Feature "{module}" has no files to update (configuration-only feature).',
737
737
  'update.noComponentFiles': 'No base component files were found to update.',
738
- 'update.pubGet': 'Running flutter pub get...',
738
+ 'update.pubGet': 'Installing Flutter packages (flutter pub get)...',
739
739
  'update.pubGetDone': 'Dependencies updated',
740
- 'update.pubGetFailed': 'flutter pub get failed — run it manually',
741
- 'update.buildRunner': 'Running build_runner...',
740
+ 'update.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
741
+ 'update.buildRunner': 'Generating code (Riverpod/Freezed)...',
742
742
  'update.buildRunnerDone': 'Code generation complete',
743
- 'update.buildRunnerFailed': 'build_runner failed — run it manually',
743
+ 'update.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
744
744
  'update.success': 'Feature "{module}" updated successfully.',
745
745
  'update.componentsSuccess': 'Base components updated successfully.',
746
746
  'update.coreSuccess': 'Core files updated successfully.',
747
+ 'check.intro': 'Kasy Check — Push Notifications',
748
+ 'check.firebase.detected': 'Firebase backend',
749
+ 'check.firebase.adcInfo': 'Firebase uses Application Default Credentials — no extra setup needed.',
750
+ 'check.apns.warn': 'iOS push requires APNs Key (cannot be verified via CLI)',
751
+ 'check.apns.where': 'Firebase Console → Cloud Messaging → iOS app → APNs Authentication Key',
752
+ 'check.done': 'Done',
753
+ 'check.notKasy': 'This directory does not look like a Kasy project.',
754
+ 'check.aborted': 'Aborted',
755
+ 'check.supabase.notLinked': 'Supabase project not linked',
756
+ 'check.supabase.notLinkedHint': 'run: supabase link --project-ref YOUR_REF',
757
+ 'check.supabase.linked': 'Project linked',
758
+ 'check.spin.secrets': 'Checking secrets…',
759
+ 'check.spin.secretsDone': 'Secrets checked',
760
+ 'check.secrets.listFailed': 'Could not list secrets',
761
+ 'check.secrets.checkLogin': 'verify: supabase login',
762
+ 'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configured',
763
+ 'check.fbProjId.missing': 'FIREBASE_PROJECT_ID missing',
764
+ 'check.fbProjId.fixHint': 'Fix: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
765
+ 'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → set automatically',
766
+ 'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → failed to set',
767
+ 'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configured',
768
+ 'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON missing',
769
+ 'check.fbSak.spin': 'Generating and setting FCM key…',
770
+ 'check.fbSak.spinDone': 'FCM key generated',
771
+ 'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → set automatically',
772
+ 'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → failed to set',
773
+ 'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → could not generate key',
774
+ 'check.fbSak.manual': "Manual: Firebase Console → Settings → Service accounts → Generate key\nThen: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat key.json)'",
775
+ 'check.fbSak.hint': "Auto-fix: kasy check --fix\nOr manually: Firebase Console → Settings → Service accounts → Generate key\nThen: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat key.json)'",
776
+ 'check.fn.spin': 'Checking edge functions…',
777
+ 'check.fn.spinDone': 'Edge functions checked',
778
+ 'check.fn.listFailed': 'Could not list edge functions',
779
+ 'check.fn.deployed': 'Edge function send-push-notification deployed',
780
+ 'check.fn.missing': 'Edge function send-push-notification not deployed',
781
+ 'check.fn.deploySpin': 'Deploying send-push-notification…',
782
+ 'check.fn.deployDone': 'send-push-notification → deployed automatically',
783
+ 'check.fn.deployFailed': 'send-push-notification → deploy failed',
784
+ 'check.fn.hint': 'Auto-fix: kasy check --fix\nOr manually: supabase functions deploy send-push-notification',
785
+ 'deploy.firebase.intro': 'Deploy — Firebase',
786
+ 'deploy.firebase.spin': 'Deploying Firebase...',
787
+ 'deploy.firebase.spinDone': 'Firebase deploy completed',
788
+ 'deploy.apns.title': 'iOS push: configure the APNs Key in Firebase Console',
789
+ 'deploy.apns.step1': '1. Apple Developer Portal → Keys → create APNs Key (.p8)',
790
+ 'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → iOS app → upload APNs Key',
791
+ 'deploy.supabase.intro': 'Deploy — Supabase',
792
+ 'deploy.supabase.notLinked': 'Supabase project not linked in this directory.',
793
+ 'deploy.supabase.linkHint': 'Run: supabase link --project-ref YOUR_PROJECT_REF',
794
+ 'deploy.supabase.projectRef': 'Project ref: {ref}',
795
+ 'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON already configured',
796
+ 'deploy.supabase.sakSpin': 'Generating FCM key (Service Account)…',
797
+ 'deploy.supabase.sakSpinDone': 'FCM key generated',
798
+ 'deploy.supabase.sakManual': "Configure manually: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
799
+ 'deploy.supabase.sakNoGS': 'google-services.json not found — configure manually',
800
+ 'deploy.supabase.fnSpin': 'Deploying edge functions…',
801
+ 'deploy.supabase.fnSpinDone': 'Edge functions processed',
802
+ 'deploy.supabase.fnNone': 'edge functions (none found)',
803
+ 'deploy.outro': 'Deploy completed',
747
804
  },
748
805
  pt: {
749
806
  'cli.tagline': 'Crie apps móveis sem dor de configuração',
@@ -793,22 +850,22 @@ const MESSAGES = {
793
850
  'cli.command.upgrade.running': 'Atualizando a CLI kasy...',
794
851
  'cli.command.upgrade.done': 'kasy atualizado com sucesso!',
795
852
  'cli.command.uninstall.running': 'Desinstalando a CLI kasy...',
796
- 'cli.command.uninstall.done': 'kasy desinstalado. Ate mais!',
797
- 'new.checks.environment': 'Verificacoes de ambiente',
853
+ 'cli.command.uninstall.done': 'kasy desinstalado. Até mais!',
854
+ 'new.checks.environment': 'Verificações de ambiente',
798
855
  'new.checks.environment.checking': 'Verificando ambiente',
799
856
  'new.checks.environment.done': 'Ambiente pronto',
800
857
  'setup.checks.backend.checking': 'Verificando ferramentas {backend}',
801
858
  'setup.checks.backend.done': 'Ferramentas {backend} prontas',
802
- 'new.checks.firebaseForPush': 'Atencao: Firebase CLI e obrigatorio para notificacoes push (FCM) em todos os backends.',
803
- 'new.checks.requiredBlock': 'Ferramentas obrigatorias nao encontradas. Instale-as para continuar.',
859
+ 'new.checks.firebaseForPush': 'Atenção: Firebase CLI é obrigatório para notificações push (Firebase Cloud Messaging / FCM) em todos os backends.',
860
+ 'new.checks.requiredBlock': 'Ferramentas obrigatórias não encontradas. Instale-as para continuar.',
804
861
  'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
805
862
  'new.checks.installSupabase': 'Supabase: npm i -g supabase (ou brew install supabase/tap/supabase) && supabase login',
806
863
  'new.checks.installSupabase.darwin': 'Supabase: brew install supabase/tap/supabase && supabase login (ou npm i -g supabase)',
807
864
  'new.checks.installSupabase.win32': 'Supabase: npm i -g supabase && supabase login',
808
865
  'new.checks.installSupabase.linux': 'Supabase: npm i -g supabase && supabase login',
809
- 'setup.checks.environment': 'Verificacoes de ambiente',
866
+ 'setup.checks.environment': 'Verificações de ambiente',
810
867
  'setup.checks.prepareFirebase': 'Ferramentas Firebase (push, remote config)',
811
- 'setup.checks.backend': 'Verificacoes de backend ({backend})',
868
+ 'setup.checks.backend': 'Verificações de backend ({backend})',
812
869
  'setup.firebase.installing': 'Instalando Firebase CLI...',
813
870
  'setup.supabase.installing': 'Instalando Supabase CLI...',
814
871
  'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
@@ -817,19 +874,19 @@ const MESSAGES = {
817
874
  'doctor.title': 'Kasy Doctor',
818
875
  'doctor.baseEnvironment': 'Ambiente base',
819
876
  'doctor.optionalBackend': 'Ferramentas opcionais de backend',
820
- 'doctor.requiredMissing': 'Dependencias obrigatorias ausentes. Corrija os erros acima e execute o doctor novamente.',
821
- 'doctor.requiredPassed': '✓ Verificacoes obrigatorias de ambiente aprovadas.',
822
- 'modules.backends': 'Backends disponiveis:',
823
- 'modules.featuresBase': 'Sempre incluido:',
877
+ 'doctor.requiredMissing': 'Dependencias obrigatórias ausentes. Corrija os erros acima e execute o doctor novamente.',
878
+ 'doctor.requiredPassed': '✓ Verificações obrigatórias de ambiente aprovadas.',
879
+ 'modules.backends': 'Backends disponíveis:',
880
+ 'modules.featuresBase': 'Sempre incluído:',
824
881
  'modules.features': 'Features opcionais:',
825
882
  'modules.tag.firebaseOnly': 'somente Firebase',
826
883
  'modules.tag.requiresDb': 'requer Firebase ou Supabase',
827
884
  'modules.tag.enhances': 'ativa {target}',
828
- 'modules.hint.subscriptionNoRc': 'Dica: a tela de Subscriptions esta inclusa mas inativa. Rode `kasy add revenuecat` para habilitar pagamentos reais.',
885
+ 'modules.hint.subscriptionNoRc': 'Dica: a tela de Subscriptions está inclusa mas inativa. Rode `kasy add revenuecat` para habilitar pagamentos reais.',
829
886
  'modules.feature.base.authentication.description': 'Cadastro, login e gerenciamento de conta',
830
887
  'modules.feature.base.home.description': 'Tela principal do app apos o login',
831
888
  'modules.feature.base.settings.description': 'Tema, idioma, conta e preferencias',
832
- 'modules.feature.base.notifications.description': 'Notificacoes push via Firebase Cloud Messaging (funciona com qualquer backend)',
889
+ 'modules.feature.base.notifications.description': 'Notificações push via Firebase Cloud Messaging (funciona com qualquer backend)',
833
890
  'modules.feature.base.subscription.description': 'Tela e modelo de assinatura premium (adicione RevenueCat para habilitar pagamentos reais)',
834
891
  'modules.backend.firebase.description': 'Adapter de backend Firebase',
835
892
  'modules.backend.supabase.description': 'Adapter de backend Supabase',
@@ -844,16 +901,16 @@ const MESSAGES = {
844
901
  'modules.feature.llm_chat.description': 'Tela de chat com IA usando OpenAI ou Gemini',
845
902
  'modules.feature.feedback.description': 'Pedidos e votacao de features dentro do app',
846
903
  'modules.feature.local_notifications.description': 'Lembretes locais agendados pelo usuario (sem servidor)',
847
- 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (testes + build) + Codemagic (publicacao nas lojas)',
904
+ 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (testes + build) + Codemagic (publicação nas lojas)',
848
905
  'checks.checking': 'Verificando {name}...',
849
906
  'checks.found': '{name} encontrado',
850
907
  'checks.foundWithVersion': '{name} pronto ({version})',
851
908
  'checks.missing': '{name} ausente',
852
- 'checks.notFound': '{name} nao encontrado',
853
- 'checks.flutter.warn': 'Flutter SDK nao encontrado. Instale o Flutter para compilar e executar apps: https://docs.flutter.dev/get-started/install',
854
- 'checks.install.failed': 'instalacao automatica falhou — execute o comando manualmente',
855
- 'checks.diagnostic.xcodeLicense': '{name} esta instalado, mas o Xcode precisa que a licenca seja aceita. Execute: sudo xcodebuild -license',
856
- 'checks.diagnostic.xcodeCli': '{name} esta instalado, mas faltam as Command Line Tools do Xcode. Execute: xcode-select --install',
909
+ 'checks.notFound': '{name} não encontrado',
910
+ 'checks.flutter.warn': 'Flutter SDK não encontrado. Instale o Flutter para compilar e executar apps: https://docs.flutter.dev/get-started/install',
911
+ 'checks.install.failed': 'instalação automática falhou — execute o comando manualmente',
912
+ 'checks.diagnostic.xcodeLicense': '{name} está instalado, mas o Xcode precisa que a licenca seja aceita. Execute: sudo xcodebuild -license',
913
+ 'checks.diagnostic.xcodeCli': '{name} está instalado, mas faltam as Command Line Tools do Xcode. Execute: xcode-select --install',
857
914
  'banner.title': 'Kasy CLI · Gerador Flutter SaaS',
858
915
  'welcome.firstRun': 'Bem-vindo ao Kasy CLI!',
859
916
  'welcome.chooseLanguage': 'Primeiro, escolha seu idioma:',
@@ -866,25 +923,25 @@ const MESSAGES = {
866
923
  'license.expired': '❌ Sua assinatura expirou. Renove em kasy.dev.',
867
924
  'license.inactive': '❌ Sua chave foi desativada. Entre em contato em kasy.dev.',
868
925
  'license.offlineWarning': '⚠️ Servidor fora do ar — continuando no modo offline.',
869
- 'license.subscriptionExpired': '❌ Sua assinatura expirou. Atualizacoes exigem plano ativo. Renove em kasy.dev.\n Seus projetos continuam funcionando — apenas atualizacoes estao bloqueadas.',
926
+ '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.',
870
927
  'prompt.license.enter': '👉 Digite sua chave de ativação (XXXX-XXXX-XXXX-XXXX)',
871
928
  'prompt.license.invalid': 'Formato inválido. Use XXXX-XXXX-XXXX-XXXX.',
872
929
  'prompt.appName.enter': 'Digite o nome do seu app',
873
- 'prompt.appName.required': 'O nome do app e obrigatorio.',
930
+ 'prompt.appName.required': 'O nome do app é obrigatório.',
874
931
  'prompt.bundleId.enter': 'Digite o bundle ID (com.company.app)',
875
- 'prompt.bundleId.required': 'O bundle ID e obrigatorio.',
932
+ 'prompt.bundleId.required': 'O bundle ID é obrigatório.',
876
933
  'prompt.bundleId.invalid': 'O bundle ID deve seguir o formato com.company.app.',
877
934
  'prompt.backend.select': 'Escolha o provedor de backend',
878
935
  'prompt.features.select': 'Escolha as features opcionais para incluir',
879
936
  'prompt.features.instructions': 'Espaco para marcar, enter para confirmar',
880
- 'prompt.multiselect.instructions': '\nInstrucoes:\n ↑/↓: Destacar opcao\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
881
- 'prompt.multiselect.warnDisabled': 'Use ↓ para ir a uma opcao selecionavel, Space para marcar, Enter para confirmar',
937
+ 'prompt.multiselect.instructions': '\nInstrucoes:\n ↑/↓: Destacar opção\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
938
+ 'prompt.multiselect.warnDisabled': 'Use ↓ para ir a uma opção selecionavel, Space para marcar, Enter para confirmar',
882
939
  'prompt.firebase.projectId.enter': 'Digite o Firebase Project ID',
883
- 'prompt.firebase.projectId.required': 'Firebase Project ID e obrigatorio.',
940
+ 'prompt.firebase.projectId.required': 'Firebase Project ID é obrigatório.',
884
941
  'prompt.supabase.url.enter': 'Digite a URL do Supabase',
885
- 'prompt.supabase.url.required': 'A URL do Supabase e obrigatoria.',
942
+ 'prompt.supabase.url.required': 'A URL do Supabase é obrigatória.',
886
943
  'prompt.supabase.anonKey.enter': 'Digite a chave anon do Supabase',
887
- 'prompt.supabase.anonKey.required': 'A chave anon do Supabase e obrigatoria.',
944
+ 'prompt.supabase.anonKey.required': 'A chave anon do Supabase é obrigatória.',
888
945
  'new.supabase.q.create': 'Criar novo projeto Supabase ou usar existente?',
889
946
  'new.supabase.q.create.create': '✨ Criar novo projeto (recomendado para iniciantes)',
890
947
  'new.supabase.q.create.existing': '📂 Usar projeto existente',
@@ -898,28 +955,28 @@ const MESSAGES = {
898
955
  'new.firebase.q.region.us': '🇺🇸 Estados Unidos — us-central1',
899
956
  'new.firebase.q.region.europe': '🇪🇺 Europa — europe-west1',
900
957
  'new.firebase.q.region.global': '🌍 Global / Não sei — us-central1',
901
- 'new.firebase.create.prereq': 'Voce precisa: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Plano Blaze necessario para deploy.',
958
+ 'new.firebase.create.prereq': 'Você precisa: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Plano Blaze necessário para deploy.',
902
959
  'new.firebase.create.creating': 'Criando projeto Firebase…',
903
960
  'new.firebase.create.includeWeb': 'Incluir app Web no Firebase? (para plataforma web)',
904
961
  'new.firebase.create.nowDo': 'Agora ative a autenticação (antes de rodar o app):',
905
962
  'new.firebase.create.activateEmail': 'Ative Email/Senha: Firebase Console → Authentication → Sign-in method',
906
963
  'new.firebase.create.activateGoogle': 'Ative Google: mesma página, clique em Google → Ativar',
907
964
  'new.firebase.create.beforeContinue.title': 'Antes de continuar, ative no Firebase Console:',
908
- 'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Senha e Anonimo ja foram ativados automaticamente)',
909
- 'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → ative Email/Senha, Anonimo e Google',
965
+ 'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Senha e Anônimo foram ativados automaticamente)',
966
+ 'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → ative Email/Senha, Anônimo e Google',
910
967
  'new.firebase.create.beforeContinue.ready': 'Ativei o Google Sign-In. Continuar?',
911
- 'new.firebase.create.beforeContinue.ready.noAuth': 'Ativei Email/Senha, Anonimo e Google Sign-In. Continuar?',
968
+ 'new.firebase.create.beforeContinue.ready.noAuth': 'Ativei Email/Senha, Anônimo e Google Sign-In. Continuar?',
912
969
  'new.firebase.create.beforeContinue.secretManagerAuto': '(Secret Manager e Storage já foram ativados automaticamente)',
913
970
  'new.firebase.create.sha1Skipped': 'SHA-1 não adicionado',
914
971
  'new.firebase.create.sha1ManualInstruction': 'Adicione o SHA-1 manualmente: Firebase Console → Configurações do projeto → Seus apps → Android → Adicionar impressão digital',
915
- 'new.firebase.create.sha1ParseError': 'Nao foi possivel extrair o SHA-1 da saida do keytool',
972
+ 'new.firebase.create.sha1ParseError': 'Não foi possível extrair o SHA-1 da saída do keytool',
916
973
  'new.firebase.create.sha1ErrorDetail': 'Motivo',
917
974
  'new.firebase.create.useExistingHint': 'O projeto pode ter sido criado. Tente "Usar projeto existente" com ID: {id}',
918
975
  'new.firebase.create.usingProjectId': 'Usando project ID: {id} (continuando com projeto existente)',
919
976
  'new.firebase.create.waitPropagate': 'Aguardando propagação do projeto (20s)…',
920
977
  'new.firebase.create.success': 'Projeto Firebase criado com sucesso.',
921
- 'new.firebase.create.failed': 'Nao foi possivel criar o projeto',
922
- 'new.firebase.create.gcloudRequired': 'gcloud CLI e obrigatorio para "criar do zero". Sem ele, o fluxo completo do Firebase nao pode rodar.',
978
+ 'new.firebase.create.failed': 'Não foi possível criar o projeto',
979
+ 'new.firebase.create.gcloudRequired': 'gcloud CLI é obrigatório para "criar do zero". Sem ele, o fluxo completo do Firebase não pode rodar.',
923
980
  'new.firebase.create.installTitle': 'Para instalar o gcloud CLI, execute:',
924
981
  'new.firebase.create.installCommand': 'Comando',
925
982
  'new.firebase.create.installAfter': 'Depois faca login',
@@ -953,7 +1010,7 @@ const MESSAGES = {
953
1010
  'new.supabase.q.dbPassword.required': 'A senha deve ter pelo menos 6 caracteres.',
954
1011
  'new.supabase.creating': 'Criando projeto no Supabase…',
955
1012
  'new.supabase.created': 'Projeto criado com sucesso.',
956
- 'new.supabase.createFailed': 'Nao foi possivel criar o projeto',
1013
+ 'new.supabase.createFailed': 'Não foi possível criar o projeto',
957
1014
  'new.supabase.loginHint': 'Execute: supabase login. Depois informe a URL e chave do seu projeto existente.',
958
1015
  'new.supabase.setup': 'Vinculando projeto e publicando…',
959
1016
  'new.supabase.setupManual': 'Execute manualmente: supabase link, supabase db push, supabase functions deploy',
@@ -962,13 +1019,13 @@ const MESSAGES = {
962
1019
  'new.supabase.projectsRequired': 'Nenhum projeto encontrado nesta organização.',
963
1020
  'new.supabase.q.dbPassword.existing': 'Senha do banco do projeto (necessária para vincular e aplicar migrations)',
964
1021
  'new.supabase.existingLinked': 'Projeto pronto para vincular e aplicar migrations.',
965
- 'setup.license.loaded': '✓ Chave de licenca carregada da configuracao local.',
1022
+ 'setup.license.loaded': '✓ Chave de licenca carregada da configuração local.',
966
1023
  'setup.license.saved': '✓ Chave de licenca validada e salva.',
967
- 'setup.license.invalid': 'Formato de licenca invalido. Esperado XXXX-XXXX-XXXX-XXXX.',
968
- 'setup.error.targetNotEmpty': 'O diretorio de destino nao esta vazio: {path}',
969
- 'setup.error.targetExists': 'O diretorio de destino ja existe: {path}',
970
- 'setup.error.coreMissing': 'Pasta do core template nao encontrada: {path}',
971
- 'setup.error.requiredChecksFailed': 'Falha nas verificacoes obrigatorias. Execute `kasy doctor`.',
1024
+ 'setup.license.invalid': 'Formato de licenca inválido. Esperado XXXX-XXXX-XXXX-XXXX.',
1025
+ 'setup.error.targetNotEmpty': 'O diretório de destino não está vazio: {path}',
1026
+ 'setup.error.targetExists': 'O diretório de destino existe: {path}',
1027
+ 'setup.error.coreMissing': 'Pasta do core template não encontrada: {path}',
1028
+ 'setup.error.requiredChecksFailed': 'Falha nas verificações obrigatórias. Execute `kasy doctor`.',
972
1029
  'setup.error.generatingFailed': 'Falha ao gerar o projeto.',
973
1030
  'setup.error.conflictHint': 'Dica: Remova a pasta do projeto e execute novamente, ou use um diretório vazio.',
974
1031
  'setup.spinner.generating': 'Gerando arquivos do projeto...',
@@ -982,7 +1039,7 @@ const MESSAGES = {
982
1039
  'validate.success': '✓ Matriz de validacao aprovada.',
983
1040
  'validate.failed': 'Matriz de validacao falhou.',
984
1041
  'validate.error': 'Uma ou mais combinacoes de validacao falharam.',
985
- 'validate.projectNotFound': 'Projeto nao encontrado',
1042
+ 'validate.projectNotFound': 'Projeto não encontrado',
986
1043
  'validate.ok': 'ok',
987
1044
  'validate.fail': 'falhou',
988
1045
  'validate.passed': 'aprovado',
@@ -992,19 +1049,19 @@ const MESSAGES = {
992
1049
  'new.banner': '✨ Novo app Flutter',
993
1050
  'new.subtitle': 'Escolha o backend: Firebase, Supabase ou API REST.',
994
1051
  'new.subtitle2': '🔒 O setup roda na sua máquina com suas credenciais — sem acesso de terceiros.',
995
- 'new.q.backend': 'Onde voce quer salvar os dados do seu app?',
996
- 'new.q.backend.firebase.desc': 'Mais facil de comecar — auth, banco e armazenamento prontos',
1052
+ 'new.q.backend': 'Onde você quer salvar os dados do seu app?',
1053
+ 'new.q.backend.firebase.desc': 'Mais fácil de começar — auth, banco e armazenamento prontos',
997
1054
  'new.q.backend.supabase.desc': 'Banco SQL (PostgreSQL) com mais controle',
998
- 'new.q.backend.api.desc': 'Voce ja tem seu proprio servidor',
1055
+ 'new.q.backend.api.desc': 'Você tem seu próprio servidor',
999
1056
 
1000
1057
  'new.q.mode': 'Como quer configurar?',
1001
- 'new.q.mode.quick': '⚡ Rapido — poucas perguntas, padroes inteligentes',
1002
- 'new.q.mode.advanced': '🛠 Avancado — todas as opcoes e credenciais agora',
1058
+ 'new.q.mode.quick': '⚡ Rapido — poucas perguntas, padrões inteligentes',
1059
+ 'new.q.mode.advanced': '🛠 Avançado — todas as opções e credenciais agora',
1003
1060
 
1004
1061
  'new.q.preset': 'Quais features incluir?',
1005
1062
  'new.q.preset.starter': '⚡ Starter — analytics + erros + onboarding',
1006
1063
  'new.q.preset.saas': '💰 SaaS — assinaturas + analytics + onboarding + feedback',
1007
- 'new.q.preset.content': '📱 Conteudo — crash reports + analytics + onboarding + AI chat',
1064
+ 'new.q.preset.content': '📱 Conteúdo — crash reports + analytics + onboarding + AI chat',
1008
1065
  'new.q.preset.full': '🚀 Completo — todas as features',
1009
1066
  'new.q.preset.custom': '⚙️ Personalizar — escolha feature a feature',
1010
1067
  'new.q.preset.none': '○ Nenhum — so o core',
@@ -1129,9 +1186,9 @@ const MESSAGES = {
1129
1186
  'new.api.q.baseUrl': 'Qual e a URL base da sua API?',
1130
1187
  'new.api.q.baseUrl.hint': 'https://api.example.com',
1131
1188
  'new.firebase.banner': '🔥 Novo app Flutter — Firebase',
1132
- 'new.firebase.subtitle': 'Projeto completo: auth, Firestore, notificacoes, login social e muito mais.',
1133
- 'new.prereq.title': 'Antes de comecar, certifique-se de que voce tem:',
1134
- 'new.firebase.prereq.title': 'Antes de comecar, certifique-se de que voce tem:',
1189
+ 'new.firebase.subtitle': 'Projeto completo: auth, Firestore, notificações, login social e muito mais.',
1190
+ 'new.prereq.title': 'Antes de começar, certifique-se de que você tem:',
1191
+ 'new.firebase.prereq.title': 'Antes de começar, certifique-se de que você tem:',
1135
1192
  'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
1136
1193
  'new.firebase.prereq.create.2': '2. Plano Blaze (cartão de crédito — necessário para Cloud Functions)',
1137
1194
  '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.',
@@ -1142,25 +1199,25 @@ const MESSAGES = {
1142
1199
  'new.firebase.create.successPush': 'Projeto Firebase criado para FCM + Remote Config.',
1143
1200
  'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
1144
1201
  'new.firebase.prereq.2': '2. Projeto Firebase criado em console.firebase.google.com',
1145
- 'new.firebase.prereq.3': '3. Plano Blaze ativado (cartao de credito — necessario para Cloud Functions)',
1202
+ 'new.firebase.prereq.3': '3. Plano Blaze ativado (cartao de credito — necessário para Cloud Functions)',
1146
1203
  'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (usado para ativar APIs automaticamente)',
1147
1204
  'new.firebase.prereq.5': '5. Antes do deploy: ative Secret Manager API e Firebase Storage (ver PREREQUISITES.md ou links apos gerar)',
1148
1205
  'new.firebase.prereq.doc': ' Checklist completo: PREREQUISITES.md',
1149
1206
 
1150
1207
  'new.firebase.q.appName': 'Qual e o nome do seu app?',
1151
1208
  'new.firebase.q.appName.hint': 'ex: Meu App Incrivel',
1152
- 'new.firebase.q.appName.required': 'O nome do app e obrigatorio.',
1209
+ 'new.firebase.q.appName.required': 'O nome do app é obrigatório.',
1153
1210
 
1154
- 'new.firebase.q.bundleId': 'Qual e o identificador unico (Bundle ID) do seu app?',
1155
- 'new.firebase.q.bundleId.hint': 'Funciona como um endereco para o seu app, ex: com.minhaempresa.meuapp',
1156
- 'new.firebase.q.bundleId.invalid': 'Formato invalido. Use: com.empresa.app',
1157
- 'new.firebase.q.bundleId.required': 'O Bundle ID e obrigatorio.',
1211
+ 'new.firebase.q.bundleId': 'Qual e o identificador único (Bundle ID) do seu app?',
1212
+ 'new.firebase.q.bundleId.hint': 'Funciona como um endereço para o seu app, ex: com.minhaempresa.meuapp',
1213
+ 'new.firebase.q.bundleId.invalid': 'Formato inválido. Use: com.empresa.app',
1214
+ 'new.firebase.q.bundleId.required': 'O Bundle ID é obrigatório.',
1158
1215
 
1159
1216
  'new.firebase.q.projectId': 'Qual e o ID do seu projeto Firebase?',
1160
- 'new.firebase.q.projectId.hint': 'Encontre no Firebase Console → seu projeto → Configuracoes',
1161
- 'new.firebase.q.projectId.required': 'O Firebase Project ID e obrigatorio.',
1217
+ 'new.firebase.q.projectId.hint': 'Encontre no Firebase Console → seu projeto → Configurações',
1218
+ 'new.firebase.q.projectId.required': 'O Firebase Project ID é obrigatório.',
1162
1219
 
1163
- 'new.firebase.q.modules': 'Quais features opcionais voce quer incluir?',
1220
+ 'new.firebase.q.modules': 'Quais features opcionais você quer incluir?',
1164
1221
  'new.firebase.q.modules.hint': 'Espaco para selecionar, Enter para confirmar',
1165
1222
  'new.modules.header.common': '── Comuns (todos os backends) ──',
1166
1223
  'new.modules.header.features': '── Telas e features ──',
@@ -1180,8 +1237,8 @@ const MESSAGES = {
1180
1237
  'new.firebase.module.onboarding': '👋 Onboarding (fluxo de boas-vindas)',
1181
1238
 
1182
1239
  'new.firebase.q.secrets.configureNow': 'Configurar as secrets do servidor agora? (webhook RevenueCat, Meta Ads)',
1183
- 'new.firebase.q.secrets.configureNow.hint': 'Se nao agora, veja o README para os comandos de configuracao depois',
1184
- 'new.firebase.q.secrets.later': '• Secrets do servidor nao configuradas — serao configuradas durante `kasy deploy`.',
1240
+ 'new.firebase.q.secrets.configureNow.hint': 'Se não agora, veja o README para os comandos de configuração depois',
1241
+ 'new.firebase.q.secrets.later': '• Secrets do servidor não configuradas — serão configuradas durante `kasy deploy`.',
1185
1242
  'new.firebase.q.revenuecat.webhookKey': 'Chave secreta do webhook (um valor aleatorio foi sugerido — pressione Enter para aceitar ou digite o seu)',
1186
1243
  'new.firebase.q.revenuecat.webhookKey.hint': 'Salve esse valor. No painel RevenueCat, cole como: Bearer <esse-valor>',
1187
1244
  'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
@@ -1191,11 +1248,11 @@ const MESSAGES = {
1191
1248
  'new.firebase.q.paywall': 'Qual estilo de paywall?',
1192
1249
  'new.firebase.q.paywall.hint': 'Layout da tela de assinaturas — pode alterar depois no RevenueCat',
1193
1250
  'new.firebase.q.revenuecat.web': 'Habilitar assinaturas na web (RevenueCat Web Billing)?',
1194
- 'new.firebase.q.revenuecat.web.hint': 'Requer Web Billing no dashboard RevenueCat + Stripe. Deixe desmarcado se nao precisar.',
1251
+ 'new.firebase.q.revenuecat.web.hint': 'Requer Web Billing no dashboard RevenueCat + Stripe. Deixe desmarcado se não precisar.',
1195
1252
  'new.firebase.q.revenuecat.webKey': 'Chave API RevenueCat Web Billing (rcb_xxx ou rcb_sb_xxx, opcional — configure depois)',
1196
1253
  'new.firebase.success.revenuecatWeb': '• RevenueCat Web: adicione RC_WEB_API_KEY (launch.json) para assinaturas na web',
1197
1254
  'new.firebase.q.sentry.dsn': 'DSN do Sentry (deixe em branco para configurar depois)',
1198
- 'new.firebase.q.sentry.dsn.invalid': 'DSN invalido. Formato esperado: https://chave@host/project-id',
1255
+ 'new.firebase.q.sentry.dsn.invalid': 'DSN inválido. Formato esperado: https://chave@host/project-id',
1199
1256
  'new.firebase.q.mixpanel.token': 'Token do Mixpanel (deixe em branco para configurar depois)',
1200
1257
  'new.firebase.q.facebook.appId': 'App ID do Facebook',
1201
1258
  'new.firebase.q.facebook.appId.required': 'App ID do Facebook é obrigatório.',
@@ -1205,9 +1262,9 @@ const MESSAGES = {
1205
1262
  'new.firebase.q.revenuecat.android.required': 'Chave Android do RevenueCat é obrigatória.',
1206
1263
  'new.firebase.q.revenuecat.ios.required': 'Chave iOS do RevenueCat é obrigatória.',
1207
1264
  'new.firebase.q.revenuecat.metaDataset.invalid': 'Pixel ID deve ser numerico (ex: 1234567890).',
1208
- 'new.firebase.q.revenuecat.webKey.invalid': 'Chave Web Billing deve comecar com rcb_ (ex: rcb_sb_xxx ou rcb_xxx).',
1265
+ 'new.firebase.q.revenuecat.webKey.invalid': 'Chave Web Billing deve começar com rcb_ (ex: rcb_sb_xxx ou rcb_xxx).',
1209
1266
 
1210
- 'new.firebase.confirm.title': 'Resumo da configuracao:',
1267
+ 'new.firebase.confirm.title': 'Resumo da configuração:',
1211
1268
  'new.firebase.confirm.app': 'App',
1212
1269
  'new.firebase.confirm.bundleId': 'Bundle ID',
1213
1270
  'new.firebase.confirm.project': 'Firebase',
@@ -1217,12 +1274,12 @@ const MESSAGES = {
1217
1274
 
1218
1275
  'new.firebase.step.copying': 'Criando seu projeto...',
1219
1276
  'new.firebase.step.pubGet': 'Instalando pacotes Flutter...',
1220
- 'new.firebase.step.buildRunner': 'Gerando codigo (Riverpod/Freezed)...',
1277
+ 'new.firebase.step.buildRunner': 'Gerando código (Riverpod/Freezed)...',
1221
1278
  'new.firebase.step.flutterfire': 'Configurando Firebase (flutterfire)...',
1222
1279
  'new.firebase.step.deploy': 'Fazendo deploy das Cloud Functions + regras do Firestore...',
1223
1280
  'new.firebase.step.done': 'Pronto!',
1224
1281
 
1225
- 'new.firebase.success.title': '🎉 Seu app esta pronto!',
1282
+ 'new.firebase.success.title': '🎉 Seu app está pronto!',
1226
1283
  'new.firebase.success.open': 'Abra o projeto:',
1227
1284
  'new.firebase.success.run': 'Rode o app:',
1228
1285
  'new.firebase.success.runMake': 'Ou use make: make run | make run-ios | make run-android',
@@ -1232,14 +1289,14 @@ const MESSAGES = {
1232
1289
  'new.firebase.success.hotReload': "Hot reload: pressione 'r' no terminal enquanto o app roda. Mudanças aparecem na hora.",
1233
1290
  'new.firebase.success.oneLiner': 'Ou copie e cole para entrar e executar:',
1234
1291
  'new.firebase.success.configure': 'Configure quando quiser:',
1235
- 'new.firebase.success.alreadyDone': 'Ja configurado pela CLI:',
1236
- 'new.firebase.success.manualNeeded': 'Configure manualmente (se necessario):',
1292
+ 'new.firebase.success.alreadyDone': ' configurado pela CLI:',
1293
+ 'new.firebase.success.manualNeeded': 'Configure manualmente (se necessário):',
1237
1294
  'new.firebase.success.apn': '• Chave APN (push iOS): Firebase Console → Config. do Projeto → Cloud Messaging',
1238
- 'new.firebase.success.social': '• Ative o login social no Firebase Console → Authentication (Google e Apple ja estao no codigo; so ative la)',
1295
+ 'new.firebase.success.social': '• Ative o login social no Firebase Console → Authentication (Google e Apple estão no código; so ative la)',
1239
1296
  '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.',
1240
- 'new.firebase.success.sentry': '• Sentry: Para relatorios de erro em producao. Pegue o DSN em sentry.io. Ja no launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
1241
- 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics em producao. Ja no launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
1242
- '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". Notificacoes push sao exclusivas de mobile e desativadas automaticamente na web.',
1297
+ 'new.firebase.success.sentry': '• Sentry: Para relatórios de erro em produção. Pegue o DSN em sentry.io. no launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
1298
+ 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics em produção. no launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
1299
+ '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.',
1243
1300
 
1244
1301
  'new.firebase.q.deploy': 'Fazer deploy das Cloud Functions + regras do Firestore agora?',
1245
1302
  'new.firebase.q.deploy.hint': 'Requer plano Blaze e firebase-tools instalado globalmente',
@@ -1251,7 +1308,7 @@ const MESSAGES = {
1251
1308
  'new.firebase.success.beforeDeploy': 'Antes do firebase deploy, ative (clique para abrir):',
1252
1309
  'new.firebase.success.secretManager': '• Secret Manager API',
1253
1310
  'new.firebase.success.firestore': '• Firestore (crie o banco se não existir)',
1254
- 'new.firebase.success.storage': '• Firebase Storage (Comecar)',
1311
+ 'new.firebase.success.storage': '• Firebase Storage (Começar)',
1255
1312
  'new.firebase.success.auth': '• Firebase Authentication (Email/Senha)',
1256
1313
  'new.firebase.success.security': '🔒 .gitignore exclui .env e outros segredos. Cloud Functions usam secrets no servidor.',
1257
1314
 
@@ -1261,14 +1318,14 @@ const MESSAGES = {
1261
1318
  'new.firebase.interactive.step2': '2. Faça upgrade para o plano Blaze (Pay-as-you-go): ',
1262
1319
  'new.firebase.interactive.step3': '3. Confirme que habilitou Auth (Email/Senha): ',
1263
1320
 
1264
- 'new.firebase.interactive.prompt1': 'Voce ja criou o banco Firestore e habilitou a Autenticacao no link acima?',
1265
- 'new.firebase.interactive.prompt2': 'Voce ja fez o upgrade pro Plano Blaze? (Obrigatorio para deploy de funcoes)',
1266
- 'new.firebase.interactive.googleAuthNote': '* Ative o Google Sign-In manualmente (Email/Senha e Anonimo ja foram ativados): ',
1267
- 'new.firebase.interactive.billingNeeded': 'Plano Blaze ainda nao ativo. Ative no link acima e aguarde a deteccao automatica.',
1321
+ 'new.firebase.interactive.prompt1': 'Você criou o banco Firestore e habilitou a Autenticação no link acima?',
1322
+ 'new.firebase.interactive.prompt2': 'Você fez o upgrade pro Plano Blaze? (Obrigatório para deploy de funções)',
1323
+ 'new.firebase.interactive.googleAuthNote': '* Ative o Google Sign-In manualmente (Email/Senha e Anônimo foram ativados): ',
1324
+ 'new.firebase.interactive.billingNeeded': 'Plano Blaze ainda não ativo. Ative no link acima e aguarde a detecção automática.',
1268
1325
  'new.firebase.interactive.billingWaiting': 'Verificando status do Blaze...',
1269
- 'new.firebase.interactive.billingTimeout': 'Plano Blaze nao confirmado apos o tempo limite. Deploy ignorado — rode manualmente quando estiver pronto.',
1270
- 'new.firebase.interactive.authWarn': 'Nao foi possivel ativar Email/Senha e Anonimo automaticamente. Ative manualmente:',
1271
- 'new.firebase.existing.apisFailed': 'Nao foi possivel ativar APIs:',
1326
+ 'new.firebase.interactive.billingTimeout': 'Plano Blaze não confirmado apos o tempo limite. Deploy ignorado — rode manualmente quando estiver pronto.',
1327
+ 'new.firebase.interactive.authWarn': 'Não foi possível ativar Email/Senha e Anônimo automaticamente. Ative manualmente:',
1328
+ 'new.firebase.existing.apisFailed': 'Não foi possível ativar APIs:',
1272
1329
  'new.firebase.existing.googleSignInManual': 'Google Sign-In: ative manualmente em Authentication → Sign-in method → Google',
1273
1330
 
1274
1331
  'new.firebase.interactive.ready': 'Pronto para publicar Push Notifications + Regras agora?',
@@ -1278,34 +1335,34 @@ const MESSAGES = {
1278
1335
  'new.firebase.interactive.laterHint': 'Você pode publicar depois abrindo o terminal na pasta do projeto e rodando: ',
1279
1336
  'new.firebase.interactive.skipped': 'Deploy de Funções ignorado. Você pode publicar depois quando quiser.',
1280
1337
 
1281
- 'new.firebase.warn.flutterfire': '⚠️ FlutterFire nao conseguiu gerar firebase_options_dev.dart automaticamente.',
1338
+ 'new.firebase.warn.flutterfire': '⚠️ FlutterFire não conseguiu gerar firebase_options_dev.dart automaticamente.',
1282
1339
  'new.firebase.warn.flutterfire.manual': 'Execute manualmente na pasta do projeto:',
1283
1340
 
1284
- 'new.firebase.error.templateMissing': 'Template Firebase nao encontrado em: {path}. Certifique-se de que a pasta Firebase/ existe.',
1285
- 'new.firebase.error.dirNotEmpty': 'O diretorio "{path}" ja existe e nao esta vazio.',
1341
+ 'new.firebase.error.templateMissing': 'Template Firebase não encontrado em: {path}. Certifique-se de que a pasta Firebase/ existe.',
1342
+ 'new.firebase.error.dirNotEmpty': 'O diretório "{path}" existe e não está vazio.',
1286
1343
  'new.firebase.error.aborted': 'Setup cancelado.',
1287
1344
 
1288
1345
  'new.supabase.prereq.1': '1. Conta Supabase em supabase.com',
1289
- 'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI instalados (ambos obrigatorios)',
1290
- 'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase necessario para push)',
1346
+ 'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI instalados (ambos obrigatórios)',
1347
+ 'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase necessário para push)',
1291
1348
  'new.supabase.prereq.login': ' Se criar manualmente: tenha URL e anon key do projeto prontos',
1292
- 'new.supabase.loginRequired': '⚠️ Voce precisa estar logado para criar projeto. Execute supabase login primeiro.',
1349
+ 'new.supabase.loginRequired': '⚠️ Você precisa estar logado para criar projeto. Execute supabase login primeiro.',
1293
1350
  'new.supabase.loginCommand': ' supabase login',
1294
1351
  'new.supabase.success.done.db': '• Banco: tabelas, politicas RLS',
1295
1352
  'new.supabase.success.done.storage': '• Storage: bucket kasy com politicas',
1296
1353
  'new.supabase.success.done.webhook': '• Edge Function revenuecat-webhook',
1297
1354
  'new.supabase.success.done.secrets': '• Secrets da Edge Function (se informados)',
1298
1355
  'new.supabase.success.done.launch': '• launch.json com Sentry, Mixpanel, RevenueCat',
1299
- 'new.supabase.success.auth': '• Auth: Email ja vem ativado. Ative Google, Apple e Facebook em: {authUrl}',
1300
- 'new.supabase.success.storage': '• Storage: Bucket kasy criado com politicas (ja pronto)',
1301
- 'new.supabase.success.fcm': '• Push (FCM): Configure no Firebase Console (plano Blaze). App ja pronto para Supabase + FCM. URL: {fcmUrl}',
1356
+ 'new.supabase.success.auth': '• Auth: Email vem ativado. Ative Google, Apple e Facebook em: {authUrl}',
1357
+ 'new.supabase.success.storage': '• Storage: Bucket kasy criado com politicas ( pronto)',
1358
+ 'new.supabase.success.fcm': '• Push (FCM): Configure no Firebase Console (plano Blaze). App pronto para Supabase + FCM. URL: {fcmUrl}',
1302
1359
  'new.supabase.success.deployLater': '• Deploy do backend quando estiver pronto (de dentro da pasta do projeto):',
1303
1360
 
1304
1361
  'new.api.prereq.1': '1. Sua API REST rodando e acessivel',
1305
1362
  'new.api.prereq.2': '2. URL base da API (ex: https://api.yourapp.com)',
1306
- 'new.api.prereq.3': '3. Firebase CLI obrigatorio para notificacoes push (FCM)',
1363
+ 'new.api.prereq.3': '3. Firebase CLI obrigatório para notificações push (FCM)',
1307
1364
  'new.api.success.backendUrl': '• Aponte o BACKEND_URL para sua API (launch.json)',
1308
- 'new.api.success.fcm': '• Firebase e necessario para notificacoes push (FCM) — configure a chave APNs no console do Firebase',
1365
+ 'new.api.success.fcm': '• Firebase e necessário para notificações push (FCM) — configure a chave APNs no console do Firebase',
1309
1366
  'new.api.success.auth': '• Implemente os endpoints de auth social (Google, Apple) no seu backend',
1310
1367
 
1311
1368
  'new.outdated.hint': 'projetos criados agora não terão as últimas melhorias.',
@@ -1320,25 +1377,25 @@ const MESSAGES = {
1320
1377
  'new.success.step.console': 'Abra o console do backend:',
1321
1378
  'new.fcm.generating': 'Gerando chave de Service Account FCM…',
1322
1379
  'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
1323
- 'new.sha1.failed': 'SHA-1 nao adicionado automaticamente: {error}',
1380
+ 'new.sha1.failed': 'SHA-1 não adicionado automaticamente: {error}',
1324
1381
  'new.sha1.manual': 'Adicione manualmente para o Google Sign-In funcionar no Android:',
1325
- 'new.sha1.skipped.apiFailed': 'SHA-1 nao adicionado automaticamente. Motivo: {error}',
1326
- 'new.sha1.skipped.other': 'SHA-1 nao adicionado: {reason}',
1327
- 'new.sha1.addManually': 'Adicione manualmente: Firebase Console → Configuracoes do projeto → Seus apps → Android → Adicionar impressao digital',
1382
+ 'new.sha1.skipped.apiFailed': 'SHA-1 não adicionado automaticamente. Motivo: {error}',
1383
+ 'new.sha1.skipped.other': 'SHA-1 não adicionado: {reason}',
1384
+ 'new.sha1.addManually': 'Adicione manualmente: Firebase Console → Configurações do projeto → Seus apps → Android → Adicionar impressão digital',
1328
1385
  'new.sha1.added': '✓ SHA-1 adicionado (Google Sign-In)',
1329
1386
  'new.firestore.created': '✓ Firestore criado automaticamente',
1330
- 'new.firestore.notCreated.error': '⚠ Firestore nao criado. Motivo: {error}',
1331
- 'new.firestore.notCreated': '⚠ Firestore nao criado automaticamente',
1387
+ 'new.firestore.notCreated.error': '⚠ Firestore não criado. Motivo: {error}',
1388
+ 'new.firestore.notCreated': '⚠ Firestore não criado automaticamente',
1332
1389
  'new.storage.created': '✓ Firebase Storage criado automaticamente',
1333
- 'new.storage.notCreated.error': '⚠ Storage nao criado. Motivo: {error}',
1334
- 'new.storage.notCreated': '⚠ Storage nao criado automaticamente',
1390
+ 'new.storage.notCreated.error': '⚠ Storage não criado. Motivo: {error}',
1391
+ 'new.storage.notCreated': '⚠ Storage não criado automaticamente',
1335
1392
  'new.activateManually': 'Ative manualmente no console:',
1336
1393
  'new.fcm.serverConfig': 'Configure no servidor: FIREBASE_SERVICE_ACCOUNT_JSON="$(cat .kasy/fcm-service-account.json)"',
1337
1394
  'new.apns.warning': '⚠ Push iOS: configure a APNs Key no Firebase Console',
1338
1395
  'new.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
1339
1396
  'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → fazer upload da APNs Key',
1340
- 'new.firebase.create.estimatedTime': '(geralmente 3-5 min — nao feche o terminal)',
1341
- 'new.internet.warning': '📶 Verifique se voce esta com uma internet estavel — esta etapa precisa de conexao.',
1397
+ 'new.firebase.create.estimatedTime': '(geralmente 3-5 min — não feche o terminal)',
1398
+ 'new.internet.warning': '📶 Verifique se você está com uma internet estável — esta etapa precisa de conexão.',
1342
1399
 
1343
1400
  // run command
1344
1401
  'cli.command.run.description': 'Roda o app no celular, simulador ou navegador',
@@ -1346,7 +1403,7 @@ const MESSAGES = {
1346
1403
  'run.updateHint.prefix': 'Melhorias disponíveis para o projeto —',
1347
1404
  'run.updateHint.suffix': 'para ver o que há de novo',
1348
1405
  'run.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
1349
- 'run.error.flutterNotFound': 'Flutter nao encontrado. Verifique se o Flutter esta instalado e no PATH.',
1406
+ 'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
1350
1407
 
1351
1408
  // doctor project checks
1352
1409
  'doctor.project.title': 'Projeto',
@@ -1354,7 +1411,7 @@ const MESSAGES = {
1354
1411
  'doctor.project.backend': 'Backend',
1355
1412
  'doctor.project.bundleId': 'Bundle ID',
1356
1413
  'doctor.project.pubGet': 'Dependencias instaladas (pubspec.lock presente)',
1357
- 'doctor.project.pubGetMissing': 'Execute flutter pub get — pubspec.lock nao encontrado',
1414
+ 'doctor.project.pubGetMissing': 'Execute flutter pub get — pubspec.lock não encontrado',
1358
1415
  'doctor.project.modules': 'Features ativas',
1359
1416
  'doctor.project.noModules': 'Nenhuma feature opcional ativa',
1360
1417
 
@@ -1366,43 +1423,43 @@ const MESSAGES = {
1366
1423
 
1367
1424
  // notifications command
1368
1425
  'cli.command.notifications.description': 'Edita os textos das notificações locais e lembretes',
1369
- 'cli.command.notifications.text.description': 'Define titulos e mensagens das notificacoes locais',
1370
- 'notifications.error.notKasyProject': 'kit_setup.json nao encontrado. Execute dentro de um projeto Kasy.',
1371
- 'notifications.error.noI18n': 'lib/i18n/*.i18n.json nao encontrado neste projeto.',
1372
- 'notifications.error.noFeatures': 'lib/core/config/features.dart nao encontrado.',
1373
- 'notifications.error.notEnabled': 'Notificacoes locais desativadas. Execute: kasy add local_notifications',
1426
+ 'cli.command.notifications.text.description': 'Define títulos e mensagens das notificações locais',
1427
+ 'notifications.error.notKasyProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
1428
+ 'notifications.error.noI18n': 'lib/i18n/*.i18n.json não encontrado neste projeto.',
1429
+ 'notifications.error.noFeatures': 'lib/core/config/features.dart não encontrado.',
1430
+ 'notifications.error.notEnabled': 'Notificações locais desativadas. Execute: kasy add local_notifications',
1374
1431
  'notifications.error.cancelled': 'Cancelado.',
1375
- 'notifications.prompt.intro': 'Textos de notificacao local',
1376
- 'notifications.prompt.hint': 'Demo Home = teste instantaneo em Features. Lembrete = alerta agendado em Configuracoes.',
1377
- 'notifications.prompt.demoTitle': 'Demo Home — titulo da notificacao',
1378
- 'notifications.prompt.demoBody': 'Demo Home — descricao / corpo',
1379
- 'notifications.prompt.reminderTitle': 'Lembrete agendado — titulo',
1432
+ 'notifications.prompt.intro': 'Textos de notificação local',
1433
+ 'notifications.prompt.hint': 'Demo Home = teste instantâneo em Features. Lembrete = alerta agendado em Configurações.',
1434
+ 'notifications.prompt.demoTitle': 'Demo Home — título da notificação',
1435
+ 'notifications.prompt.demoBody': 'Demo Home — descrição / corpo',
1436
+ 'notifications.prompt.reminderTitle': 'Lembrete agendado — título',
1380
1437
  'notifications.prompt.reminderBody': 'Lembrete agendado — corpo',
1381
- 'notifications.prompt.required': 'Obrigatorio.',
1438
+ 'notifications.prompt.required': 'Obrigatório.',
1382
1439
  'notifications.writing': 'Atualizando lib/i18n/*.i18n.json...',
1383
1440
  'notifications.written': 'Atualizado: {langs}',
1384
1441
  'notifications.slang': 'Executando dart run slang...',
1385
1442
  'notifications.slangDone': 'Traducoes regeneradas',
1386
1443
  'notifications.slangFailed': 'dart run slang falhou — execute manualmente no projeto',
1387
- 'notifications.done': 'Textos de notificacao local atualizados.',
1444
+ 'notifications.done': 'Textos de notificação local atualizados.',
1388
1445
  'notifications.summary.demo': 'Home → Features (demo):',
1389
- 'notifications.summary.reminder': 'Configuracoes → Lembretes (agendado):',
1446
+ 'notifications.summary.reminder': 'Configurações → Lembretes (agendado):',
1390
1447
 
1391
1448
  'add.list.title': 'Features do projeto',
1392
- 'add.error.noModule': 'Informe o nome da feature ou use --list para ver as disponiveis.',
1393
- 'add.error.notKasyProject': 'kit_setup.json nao encontrado. Execute este comando dentro de um projeto Kasy.',
1449
+ 'add.error.noModule': 'Informe o nome da feature ou use --list para ver as disponíveis.',
1450
+ 'add.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
1394
1451
  'add.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
1395
- 'add.alreadyActive': 'A feature "{module}" ja esta ativa neste projeto.',
1452
+ 'add.alreadyActive': 'A feature "{module}" está ativa neste projeto.',
1396
1453
  'add.applying': 'Adicionando feature: {module}',
1397
- 'add.applyingPatch': 'Aplicando arquivos de patch...',
1454
+ 'add.applyingPatch': 'Aplicando mudanças da feature...',
1398
1455
  'add.patchApplied': 'Patch aplicado',
1399
- 'add.patchFailed': 'Patch falhou — verifique a saida acima',
1400
- 'add.pubGet': 'Executando flutter pub get...',
1456
+ 'add.patchFailed': 'Patch falhou — verifique a saída acima',
1457
+ 'add.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
1401
1458
  'add.pubGetDone': 'Dependencias atualizadas',
1402
- 'add.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1403
- 'add.buildRunner': 'Executando build_runner...',
1404
- 'add.buildRunnerDone': 'Geracao de codigo concluida',
1405
- 'add.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1459
+ 'add.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
1460
+ 'add.buildRunner': 'Gerando código (Riverpod/Freezed)...',
1461
+ 'add.buildRunnerDone': 'Geração de código concluída',
1462
+ 'add.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
1406
1463
  'add.success': 'Feature "{module}" adicionada com sucesso.',
1407
1464
  'add.cancelled': 'Cancelado.',
1408
1465
  'add.prompt.sentryDsn': 'Sentry DSN (deixe em branco para configurar depois):',
@@ -1412,78 +1469,135 @@ const MESSAGES = {
1412
1469
  'add.note.facebook': 'Adicione seu Facebook App ID e token no .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
1413
1470
  'new.q.llm_chat.configureNow': 'Configurar o agente de Chat LLM agora?',
1414
1471
  'new.q.llm_chat.configureNow.hint': 'Pode pular e executar "kasy add llm_chat" depois',
1415
- 'add.llm_chat.reconfigure': 'Feature ja ativa — reconfigurando apenas as credenciais.',
1472
+ 'add.llm_chat.reconfigure': 'Feature ativa — reconfigurando apenas as credenciais.',
1416
1473
  'add.prompt.llmProvider': 'Provedor de LLM:',
1417
- 'add.prompt.llmSystemPrompt': 'Instrucao do agente — system prompt (deixe em branco para nenhuma):\n Exemplo: "Voce e um assistente de suporte do app Fitsync. Responda apenas sobre treinos."\n >',
1474
+ '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 >',
1418
1475
  'add.prompt.llmApiKey': 'Chave de API (OpenAI ou Gemini) — fica no servidor, nunca no app (deixe em branco para configurar depois):',
1419
1476
  'add.prompt.llmEndpoint': 'URL do seu endpoint LLM (deixe em branco para configurar depois):',
1420
1477
  'add.llm_chat.settingSecret': 'Salvando chave de API como secret no servidor...',
1421
1478
  'add.llm_chat.secretSet': 'Chave de API salva como secret',
1422
- 'add.llm_chat.secretFailed': 'Nao foi possivel salvar o secret automaticamente — configure manualmente (veja instrucoes abaixo)',
1479
+ 'add.llm_chat.secretFailed': 'Não foi possível salvar o secret automaticamente — configure manualmente (veja instruções abaixo)',
1423
1480
  'add.llm_chat.skipSecret': 'Chave de API ignorada — configure antes do deploy via CLI do servidor',
1424
- 'add.llm_chat.deploying': 'Fazendo deploy da funcao LLM no servidor...',
1425
- 'add.llm_chat.deployed': 'Funcao LLM deployada com sucesso',
1426
- 'add.llm_chat.deployFailed': 'Deploy automatico falhou — faca o deploy manualmente (veja instrucoes abaixo)',
1427
- 'add.llm_chat.nextSteps.firebase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json ja foi preenchido.\n 2. Rode o app: kasy run\n',
1428
- '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 ja foi preenchido.\n 3. Rode o app: kasy run\n',
1429
- 'add.llm_chat.nextSteps.supabase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json ja foi preenchido.\n 2. Rode o app: kasy run\n',
1430
- '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 ja foi preenchido.\n 3. Rode o app: kasy run\n',
1481
+ 'add.llm_chat.deploying': 'Fazendo deploy da função LLM no servidor...',
1482
+ 'add.llm_chat.deployed': 'Função LLM deployada com sucesso',
1483
+ 'add.llm_chat.deployFailed': 'Deploy automático falhou — faca o deploy manualmente (veja instruções abaixo)',
1484
+ 'add.llm_chat.nextSteps.firebase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json foi preenchido.\n 2. Rode o app: kasy run\n',
1485
+ '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 foi preenchido.\n 3. Rode o app: kasy run\n',
1486
+ 'add.llm_chat.nextSteps.supabase': '\n Proximos passos:\n 1. O LLM_CHAT_ENDPOINT no .vscode/launch.json foi preenchido.\n 2. Rode o app: kasy run\n',
1487
+ '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 foi preenchido.\n 3. Rode o app: kasy run\n',
1431
1488
  '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',
1432
1489
  'cli.command.remove.description': 'Remove algo que você não usa mais (ex: kasy remove sentry)',
1433
1490
  'remove.error.noModule': 'Informe o nome da feature. Uso: kasy remove <feature>',
1434
- 'remove.error.notKasyProject': 'kit_setup.json nao encontrado. Execute este comando dentro de um projeto Kasy.',
1491
+ 'remove.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
1435
1492
  'remove.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
1436
- 'remove.error.notActive': 'A feature "{module}" nao esta ativa neste projeto.',
1437
- 'remove.confirm': 'Remover a feature "{module}"? Isso vai deletar arquivos e dependencias.',
1493
+ 'remove.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
1494
+ 'remove.confirm': 'Remover a feature "{module}"? Isso vai deletar arquivos e dependências.',
1438
1495
  'remove.cancelled': 'Cancelado.',
1439
1496
  'remove.removing': 'Removendo feature: {module}',
1440
- 'remove.pubGet': 'Executando flutter pub get...',
1497
+ 'remove.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
1441
1498
  'remove.pubGetDone': 'Dependencias atualizadas',
1442
- 'remove.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1443
- 'remove.buildRunner': 'Executando build_runner...',
1444
- 'remove.buildRunnerDone': 'Geracao de codigo concluida',
1445
- 'remove.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1499
+ 'remove.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
1500
+ 'remove.buildRunner': 'Gerando código (Riverpod/Freezed)...',
1501
+ 'remove.buildRunnerDone': 'Geração de código concluída',
1502
+ 'remove.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
1446
1503
  'remove.success': 'Feature "{module}" removida com sucesso.',
1447
1504
  'remove.warn.ci': 'Arquivos de CI removidos. Se tinha workflows customizados, restaure-os pelo git.',
1448
- 'remove.warn.sentry.shared': 'sentry_flutter mantido — ainda necessario para features ativas (revenuecat/facebook).',
1505
+ 'remove.warn.sentry.shared': 'sentry_flutter mantido — ainda necessário para features ativas (revenuecat/facebook).',
1449
1506
  'cli.command.update.description': 'Atualiza partes do app para a última versão (ex: kasy update components)',
1450
1507
  'cli.command.update.targetArg': 'Alvo para atualizar (ex.: revenuecat, sentry, components)',
1451
- 'update.error.noProject': 'kit_setup.json nao encontrado. Execute dentro de um projeto Kasy.',
1452
- 'update.error.unknownModule': 'Modulo desconhecido: {module}\nDisponiveis: {list}',
1453
- 'update.error.unknownTarget': 'Alvo de atualizacao desconhecido: {module}\nDisponiveis: {list}',
1454
- 'update.error.notActive': 'A feature "{module}" nao esta ativa neste projeto.',
1455
- 'update.alreadyUpToDate': 'Projeto ja esta atualizado (v{version}).',
1508
+ 'update.error.noProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
1509
+ 'update.error.unknownModule': 'Feature desconhecida: {module}\nDisponíveis: {list}',
1510
+ 'update.error.unknownTarget': 'Alvo de atualização desconhecido: {module}\nDisponiveis: {list}',
1511
+ 'update.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
1512
+ 'update.alreadyUpToDate': 'Projeto está atualizado (v{version}).',
1456
1513
  'update.status': 'Projeto: v{from} → CLI: v{to}',
1457
- 'update.noVersion': 'Projeto foi gerado sem rastreamento de versao. Todas as features podem ser atualizadas.',
1458
- 'update.changesTitle': 'Atualizacoes disponiveis:',
1514
+ 'update.noVersion': 'Projeto foi gerado sem rastreamento de versão. Todas as features podem ser atualizadas.',
1515
+ 'update.changesTitle': 'Atualizações disponíveis:',
1459
1516
  'update.reapplyTitle': 'Sem mudancas novas — pode reaplicar se precisar:',
1460
1517
  'update.howToUpdate': 'Para atualizar uma feature:',
1461
1518
  'update.howToUpdateComponents': 'Para atualizar componentes base:',
1462
1519
  'update.warn.commit': 'Isso vai sobrescrever os arquivos da feature "{module}". Faca commit de tudo antes de continuar.',
1463
1520
  'update.warn.commitComponents': 'Isso vai sobrescrever arquivos dos componentes base. Faca commit de tudo antes de continuar.',
1464
- 'update.confirm': 'Sobrescrever arquivos da feature "{module}" com a versao mais recente?',
1465
- 'update.confirmComponents': 'Sobrescrever arquivos dos componentes base com a versao mais recente?',
1466
- 'update.confirmCore': 'Sobrescrever arquivos do core (animacoes, widgets, tema, ferramentas de dev) com a versao mais recente?',
1521
+ 'update.confirm': 'Sobrescrever arquivos da feature "{module}" com a versão mais recente?',
1522
+ 'update.confirmComponents': 'Sobrescrever arquivos dos componentes base com a versão mais recente?',
1523
+ 'update.confirmCore': 'Sobrescrever arquivos do core (animacoes, widgets, tema, ferramentas de dev) com a versão mais recente?',
1467
1524
  'update.cancelled': 'Cancelado.',
1468
- 'update.applying': 'Aplicando atualizacao da feature: {module}',
1469
- 'update.applyingComponents': 'Aplicando atualizacao dos componentes base...',
1470
- 'update.applyingCore': 'Aplicando atualizacao dos arquivos de core...',
1525
+ 'update.applying': 'Aplicando atualização da feature: {module}',
1526
+ 'update.applyingComponents': 'Aplicando atualização dos componentes base...',
1527
+ 'update.applyingCore': 'Aplicando atualização dos arquivos de core...',
1471
1528
  'update.applied': 'Feature {module} atualizada',
1472
1529
  'update.appliedComponents': '{count} arquivos de componentes base atualizados',
1473
1530
  'update.appliedCore': '{count} arquivos de core atualizados',
1474
- 'update.applyFailed': 'Falha ao aplicar atualizacao da feature {module}',
1475
- 'update.applyComponentsFailed': 'Falha ao aplicar atualizacao dos componentes base',
1476
- 'update.noPatch': 'Feature "{module}" nao tem arquivos para atualizar (feature so de configuracao).',
1531
+ 'update.applyFailed': 'Falha ao aplicar atualização da feature {module}',
1532
+ 'update.applyComponentsFailed': 'Falha ao aplicar atualização dos componentes base',
1533
+ 'update.noPatch': 'Feature "{module}" não tem arquivos para atualizar (feature so de configuração).',
1477
1534
  'update.noComponentFiles': 'Nenhum arquivo de componente base foi encontrado para atualizar.',
1478
- 'update.pubGet': 'Executando flutter pub get...',
1535
+ 'update.pubGet': 'Instalando pacotes do Flutter (flutter pub get)...',
1479
1536
  'update.pubGetDone': 'Dependencias atualizadas',
1480
- 'update.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1481
- 'update.buildRunner': 'Executando build_runner...',
1482
- 'update.buildRunnerDone': 'Geracao de codigo concluida',
1483
- 'update.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1537
+ 'update.pubGetFailed': 'Falha ao instalar pacotes do Flutter — execute `flutter pub get` manualmente',
1538
+ 'update.buildRunner': 'Gerando código (Riverpod/Freezed)...',
1539
+ 'update.buildRunnerDone': 'Geração de código concluída',
1540
+ 'update.buildRunnerFailed': 'Geração de código falhou — execute `dart run build_runner build` manualmente',
1484
1541
  'update.success': 'Feature "{module}" atualizada com sucesso.',
1485
1542
  'update.componentsSuccess': 'Componentes base atualizados com sucesso.',
1486
1543
  'update.coreSuccess': 'Arquivos de core atualizados com sucesso.',
1544
+ 'check.intro': 'Kasy Check — Notificações Push',
1545
+ 'check.firebase.detected': 'Backend Firebase',
1546
+ 'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — nenhuma configuração extra necessária.',
1547
+ 'check.apns.warn': 'Push iOS requer APNs Key (não verificável via CLI)',
1548
+ 'check.apns.where': 'Firebase Console → Cloud Messaging → app iOS → Chave de autenticação APNs',
1549
+ 'check.done': 'Pronto',
1550
+ 'check.notKasy': 'Esse diretório não parece ser um projeto Kasy.',
1551
+ 'check.aborted': 'Cancelado',
1552
+ 'check.supabase.notLinked': 'Projeto Supabase não vinculado',
1553
+ 'check.supabase.notLinkedHint': 'execute: supabase link --project-ref SEU_REF',
1554
+ 'check.supabase.linked': 'Projeto vinculado',
1555
+ 'check.spin.secrets': 'Verificando secrets…',
1556
+ 'check.spin.secretsDone': 'Secrets verificados',
1557
+ 'check.secrets.listFailed': 'Não foi possível listar secrets',
1558
+ 'check.secrets.checkLogin': 'verifique: supabase login',
1559
+ 'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configurado',
1560
+ 'check.fbProjId.missing': 'FIREBASE_PROJECT_ID ausente',
1561
+ 'check.fbProjId.fixHint': 'Corrija: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
1562
+ 'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → configurado automaticamente',
1563
+ 'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → falhou ao configurar',
1564
+ 'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configurado',
1565
+ 'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON ausente',
1566
+ 'check.fbSak.spin': 'Gerando e configurando chave FCM…',
1567
+ 'check.fbSak.spinDone': 'Chave FCM gerada',
1568
+ 'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → configurado automaticamente',
1569
+ 'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → falhou ao configurar',
1570
+ 'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → não foi possível gerar chave',
1571
+ '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)'",
1572
+ '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)'",
1573
+ 'check.fn.spin': 'Verificando edge functions…',
1574
+ 'check.fn.spinDone': 'Edge functions verificadas',
1575
+ 'check.fn.listFailed': 'Não foi possível listar edge functions',
1576
+ 'check.fn.deployed': 'Edge function send-push-notification deployada',
1577
+ 'check.fn.missing': 'Edge function send-push-notification não deployada',
1578
+ 'check.fn.deploySpin': 'Publicando send-push-notification…',
1579
+ 'check.fn.deployDone': 'send-push-notification → deployada automaticamente',
1580
+ 'check.fn.deployFailed': 'send-push-notification → falhou no deploy',
1581
+ 'check.fn.hint': 'Corrija automaticamente: kasy check --fix\nOu manualmente: supabase functions deploy send-push-notification',
1582
+ 'deploy.firebase.intro': 'Deploy — Firebase',
1583
+ 'deploy.firebase.spin': 'Publicando no Firebase...',
1584
+ 'deploy.firebase.spinDone': 'Deploy do Firebase concluído',
1585
+ 'deploy.apns.title': 'Push iOS: configure a APNs Key no Firebase Console',
1586
+ 'deploy.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
1587
+ 'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → upload da APNs Key',
1588
+ 'deploy.supabase.intro': 'Deploy — Supabase',
1589
+ 'deploy.supabase.notLinked': 'Projeto Supabase não está vinculado neste diretório.',
1590
+ 'deploy.supabase.linkHint': 'Execute: supabase link --project-ref SEU_PROJECT_REF',
1591
+ 'deploy.supabase.projectRef': 'Project ref: {ref}',
1592
+ 'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON já configurado',
1593
+ 'deploy.supabase.sakSpin': 'Gerando chave FCM (Service Account)…',
1594
+ 'deploy.supabase.sakSpinDone': 'Chave FCM gerada',
1595
+ 'deploy.supabase.sakManual': "Configure manualmente: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
1596
+ 'deploy.supabase.sakNoGS': 'google-services.json não encontrado — configure manualmente',
1597
+ 'deploy.supabase.fnSpin': 'Publicando edge functions…',
1598
+ 'deploy.supabase.fnSpinDone': 'Edge functions processadas',
1599
+ 'deploy.supabase.fnNone': 'edge functions (nenhuma encontrada)',
1600
+ 'deploy.outro': 'Deploy concluído',
1487
1601
  },
1488
1602
  es: {
1489
1603
  'cli.tagline': 'Crea apps móviles sin dolor de configuración',
@@ -1539,7 +1653,7 @@ const MESSAGES = {
1539
1653
  'new.checks.environment.done': 'Entorno listo',
1540
1654
  'setup.checks.backend.checking': 'Verificando herramientas {backend}',
1541
1655
  'setup.checks.backend.done': 'Herramientas {backend} listas',
1542
- 'new.checks.firebaseForPush': 'Nota: Firebase CLI es obligatorio para notificaciones push (FCM) en todos los backends.',
1656
+ 'new.checks.firebaseForPush': 'Nota: Firebase CLI es obligatorio para notificaciones push (Firebase Cloud Messaging / FCM) en todos los backends.',
1543
1657
  'new.checks.requiredBlock': 'Faltan herramientas obligatorias. Instalalas para continuar.',
1544
1658
  'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
1545
1659
  'new.checks.installSupabase': 'Supabase: npm i -g supabase (o brew install supabase/tap/supabase) && supabase login',
@@ -1552,7 +1666,7 @@ const MESSAGES = {
1552
1666
  'setup.firebase.installing': 'Instalando Firebase CLI...',
1553
1667
  'setup.supabase.installing': 'Instalando Supabase CLI...',
1554
1668
  'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
1555
- 'setup.warn.hang': 'Si se cuelga, ejecuta manualmente: flutterfire --version',
1669
+ 'setup.warn.hang': 'Si se cuelga, ejecuta manualmente: flutterfire --versión',
1556
1670
  'setup.warn.supabase': '¿Usas Supabase o API propia? Firebase sigue siendo útil para push y remote config.',
1557
1671
  'doctor.title': 'Kasy Doctor',
1558
1672
  'doctor.baseEnvironment': 'Entorno base',
@@ -1565,9 +1679,9 @@ const MESSAGES = {
1565
1679
  'modules.tag.firebaseOnly': 'solo Firebase',
1566
1680
  'modules.tag.requiresDb': 'requiere Firebase o Supabase',
1567
1681
  'modules.tag.enhances': 'activa {target}',
1568
- 'modules.hint.subscriptionNoRc': 'Tip: la pantalla de Subscriptions esta incluida pero inactiva. Ejecuta `kasy add revenuecat` para habilitar pagos reales.',
1569
- 'modules.feature.base.authentication.description': 'Registro, inicio de sesion y gestion de cuenta',
1570
- 'modules.feature.base.home.description': 'Pantalla principal de la app despues del login',
1682
+ 'modules.hint.subscriptionNoRc': 'Tip: la pantalla de Subscriptions está incluida pero inactiva. Ejecuta `kasy add revenuecat` para habilitar pagos reales.',
1683
+ 'modules.feature.base.authentication.description': 'Registro, inicio de sesión y gestión de cuenta',
1684
+ 'modules.feature.base.home.description': 'Pantalla principal de la app después del login',
1571
1685
  'modules.feature.base.settings.description': 'Tema, idioma, cuenta y preferencias',
1572
1686
  'modules.feature.base.notifications.description': 'Notificaciones push via Firebase Cloud Messaging (funciona con cualquier backend)',
1573
1687
  'modules.feature.base.subscription.description': 'Pantalla y modelo de suscripcion premium (anade RevenueCat para habilitar pagos reales)',
@@ -1584,10 +1698,10 @@ const MESSAGES = {
1584
1698
  'modules.feature.llm_chat.description': 'Pantalla de chat con IA usando OpenAI o Gemini',
1585
1699
  'modules.feature.feedback.description': 'Solicitudes y votacion de features dentro de la app',
1586
1700
  'modules.feature.local_notifications.description': 'Recordatorios locales programados por el usuario (sin servidor)',
1587
- 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publicacion en tiendas)',
1701
+ 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publicación en tiendas)',
1588
1702
  'checks.checking': 'Verificando {name}...',
1589
1703
  'checks.found': '{name} encontrado',
1590
- 'checks.foundWithVersion': '{name} listo ({version})',
1704
+ 'checks.foundWithVersion': '{name} listo ({versión})',
1591
1705
  'checks.missing': '{name} ausente',
1592
1706
  'checks.notFound': '{name} no encontrado',
1593
1707
  'checks.flutter.warn': 'Flutter SDK no encontrado. Instala Flutter para compilar y ejecutar apps: https://docs.flutter.dev/get-started/install',
@@ -1617,8 +1731,8 @@ const MESSAGES = {
1617
1731
  'prompt.backend.select': 'Elige el proveedor de backend',
1618
1732
  'prompt.features.select': 'Elige las features opcionales a incluir',
1619
1733
  'prompt.features.instructions': 'Espacio para marcar, enter para confirmar',
1620
- 'prompt.multiselect.instructions': '\nInstrucciones:\n ↑/↓: Resaltar opcion\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
1621
- 'prompt.multiselect.warnDisabled': 'Usa ↓ para ir a una opcion seleccionable, Space para marcar, Enter para confirmar',
1734
+ 'prompt.multiselect.instructions': '\nInstrucciones:\n ↑/↓: Resaltar opción\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
1735
+ 'prompt.multiselect.warnDisabled': 'Usa ↓ para ir a una opción seleccionable, Space para marcar, Enter para confirmar',
1622
1736
  'prompt.firebase.projectId.enter': 'Ingresa el Firebase Project ID',
1623
1737
  'prompt.firebase.projectId.required': 'Firebase Project ID es obligatorio.',
1624
1738
  'prompt.supabase.url.enter': 'Ingresa la URL de Supabase',
@@ -1704,10 +1818,10 @@ const MESSAGES = {
1704
1818
  'new.supabase.projectsRequired': 'No se encontraron proyectos en esta organización.',
1705
1819
  'new.supabase.q.dbPassword.existing': 'Contraseña del banco del proyecto (necesaria para vincular y aplicar migraciones)',
1706
1820
  'new.supabase.existingLinked': 'Proyecto listo para vincular y aplicar migraciones.',
1707
- 'setup.license.loaded': '✓ Clave de licencia cargada desde la configuracion local.',
1821
+ 'setup.license.loaded': '✓ Clave de licencia cargada desde la configuración local.',
1708
1822
  'setup.license.saved': '✓ Clave de licencia validada y guardada.',
1709
- 'setup.license.invalid': 'Formato de licencia invalido. Se espera XXXX-XXXX-XXXX-XXXX.',
1710
- 'setup.error.targetNotEmpty': 'El directorio de destino no esta vacio: {path}',
1823
+ 'setup.license.invalid': 'Formato de licencia inválido. Se espera XXXX-XXXX-XXXX-XXXX.',
1824
+ 'setup.error.targetNotEmpty': 'El directorio de destino no está vacío: {path}',
1711
1825
  'setup.error.targetExists': 'El directorio de destino ya existe: {path}',
1712
1826
  'setup.error.coreMissing': 'No se encontro la carpeta del core template: {path}',
1713
1827
  'setup.error.requiredChecksFailed': 'Fallo en verificaciones obligatorias. Ejecuta `kasy doctor`.',
@@ -1721,9 +1835,9 @@ const MESSAGES = {
1721
1835
  'setup.success.stepPubGet': 'flutter pub get',
1722
1836
  'setup.success.stepRun': 'flutter run',
1723
1837
  'validate.title': 'Kasy Validate',
1724
- 'validate.success': '✓ Matriz de validacion aprobada.',
1725
- 'validate.failed': 'La matriz de validacion fallo.',
1726
- 'validate.error': 'Una o mas combinaciones de validacion fallaron.',
1838
+ 'validate.success': '✓ Matriz de validación aprobada.',
1839
+ 'validate.failed': 'La matriz de validación fallo.',
1840
+ 'validate.error': 'Una o más combinaciones de validación fallaron.',
1727
1841
  'validate.projectNotFound': 'Proyecto no encontrado',
1728
1842
  'validate.ok': 'ok',
1729
1843
  'validate.fail': 'fallo',
@@ -1735,12 +1849,12 @@ const MESSAGES = {
1735
1849
  'new.subtitle': 'Elige el backend: Firebase, Supabase o API REST.',
1736
1850
  'new.subtitle2': '🔒 El setup corre en tu máquina con tus credenciales — sin acceso de terceros.',
1737
1851
  'new.q.backend': '¿Donde quieres guardar los datos de tu app?',
1738
- 'new.q.backend.firebase.desc': 'El mas facil para empezar — auth, base de datos y storage listos',
1739
- 'new.q.backend.supabase.desc': 'Base de datos SQL (PostgreSQL) con mas control',
1852
+ 'new.q.backend.firebase.desc': 'El más fácil para empezar — auth, base de datos y storage listos',
1853
+ 'new.q.backend.supabase.desc': 'Base de datos SQL (PostgreSQL) con más control',
1740
1854
  'new.q.backend.api.desc': 'Ya tienes tu propio servidor',
1741
1855
 
1742
1856
  'new.q.mode': '¿Como quieres configurar?',
1743
- 'new.q.mode.quick': '⚡ Rapido — pocas preguntas, valores inteligentes',
1857
+ 'new.q.mode.quick': '⚡ Rápido — pocas preguntas, valores inteligentes',
1744
1858
  'new.q.mode.advanced': '🛠 Avanzado — todas las opciones y credenciales ahora',
1745
1859
 
1746
1860
  'new.q.preset': '¿Qué features incluir?',
@@ -1872,8 +1986,8 @@ const MESSAGES = {
1872
1986
  'new.api.q.baseUrl.hint': 'https://api.example.com',
1873
1987
  'new.firebase.banner': '🔥 Nuevo app Flutter — Firebase',
1874
1988
  'new.firebase.subtitle': 'Proyecto completo: auth, Firestore, notificaciones, login social y más.',
1875
- 'new.prereq.title': 'Antes de empezar, asegurate de tener:',
1876
- 'new.firebase.prereq.title': 'Antes de empezar, asegurate de tener:',
1989
+ 'new.prereq.title': 'Antes de empezar, asegúrate de tener:',
1990
+ 'new.firebase.prereq.title': 'Antes de empezar, asegúrate de tener:',
1877
1991
  'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
1878
1992
  'new.firebase.prereq.create.2': '2. Plan Blaze (tarjeta de crédito — requerido para Cloud Functions)',
1879
1993
  'new.firebase.prereq.create.billingLimit': '3. Límite: hasta 3 proyectos por cuenta de facturación. Elimina proyectos no usados o solicita aumento de cuota si ya alcanzaste el límite.',
@@ -1882,7 +1996,7 @@ const MESSAGES = {
1882
1996
  'new.firebase.prereq.create.pushNote': ' Proyecto Firebase para FCM + Remote Config se creará automáticamente (sin cuenta de servicio).',
1883
1997
  'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
1884
1998
  'new.firebase.prereq.2': '2. Proyecto Firebase creado en console.firebase.google.com',
1885
- 'new.firebase.prereq.3': '3. Plan Blaze activado (tarjeta de credito — requerido para Cloud Functions)',
1999
+ 'new.firebase.prereq.3': '3. Plan Blaze activado (tarjeta de crédito — requerido para Cloud Functions)',
1886
2000
  'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (para activar APIs automáticamente)',
1887
2001
  'new.firebase.prereq.5': '5. Antes del deploy: activa Secret Manager API y Firebase Storage (ver PREREQUISITES.md o enlaces tras generar)',
1888
2002
  'new.firebase.prereq.doc': ' Lista completa: PREREQUISITES.md',
@@ -1929,7 +2043,7 @@ const MESSAGES = {
1929
2043
  'new.firebase.q.revenuecat.android': 'Clave API RevenueCat para Android',
1930
2044
  'new.firebase.q.revenuecat.ios': 'Clave API RevenueCat para iOS',
1931
2045
  'new.firebase.q.paywall': '¿Qué estilo de paywall?',
1932
- 'new.firebase.q.paywall.hint': 'Layout de la pantalla de suscripciones — puedes cambiarlo despues en RevenueCat',
2046
+ 'new.firebase.q.paywall.hint': 'Layout de la pantalla de suscripciones — puedes cambiarlo después en RevenueCat',
1933
2047
  'new.firebase.q.revenuecat.web': '¿Habilitar suscripciones en web (RevenueCat Web Billing)?',
1934
2048
  'new.firebase.q.revenuecat.web.hint': 'Requiere Web Billing en dashboard RevenueCat + Stripe. Deja desmarcado si no necesitas.',
1935
2049
  'new.firebase.q.revenuecat.webKey': 'Clave API RevenueCat Web Billing (rcb_xxx o rcb_sb_xxx, opcional — configurar después)',
@@ -1977,8 +2091,8 @@ const MESSAGES = {
1977
2091
  'new.firebase.success.apn': '• Clave APN (push iOS): Firebase Console → Config. del Proyecto → Cloud Messaging',
1978
2092
  'new.firebase.success.social': '• Activa login social en Firebase Console → Authentication (Google y Apple ya están en el código; solo actívalos allí)',
1979
2093
  'new.firebase.success.googleSignIn': '• Login con Gmail: 1) Activa en Firebase Console → Auth → Sign-in method → Google. 2) El CLI rellena kGoogleWebClientId (google_auth_options.dart) desde google-services.json para Android/iOS. Web usa signInWithPopup.',
1980
- 'new.firebase.success.sentry': '• Sentry: Para reportes de error en produccion. Obtén DSN en sentry.io. Ya en launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
1981
- 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics en produccion. Ya en launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
2094
+ 'new.firebase.success.sentry': '• Sentry: Para reportes de error en producción. Obtén DSN en sentry.io. Ya en launch.json para dev. Para release: --dart-define=SENTRY_DSN=xxx',
2095
+ 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics en producción. Ya en launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
1982
2096
  'new.firebase.success.web': '• Web (adicional): Android e iOS funcionan con normalidad. Para probar en browser: "flutter run -d chrome" o "flutter run -d web-server --web-port=5000". Para publicar: "flutter build web". Las notificaciones push son exclusivas de mobile y se desactivan automaticamente en web.',
1983
2097
 
1984
2098
  'new.firebase.q.deploy': '¿Hacer deploy de Cloud Functions + reglas de Firestore ahora?',
@@ -2001,10 +2115,10 @@ const MESSAGES = {
2001
2115
  'new.firebase.interactive.step2': '2. Sube al plan Blaze (Pay-as-you-go): ',
2002
2116
  'new.firebase.interactive.step3': '3. Habilita Auth (Email y Contraseña): ',
2003
2117
 
2004
- 'new.firebase.interactive.prompt1': '¿Ya creaste Firestore y habilitaste Autenticacion en el enlace arriba?',
2118
+ 'new.firebase.interactive.prompt1': '¿Ya creaste Firestore y habilitaste Autenticación en el enlace arriba?',
2005
2119
  'new.firebase.interactive.prompt2': '¿Hiciste el upgrade al Plan Blaze? (Requerido para Cloud Functions)',
2006
- 'new.firebase.interactive.googleAuthNote': '* Activa Google Sign-In manualmente (Email/Contraseña y Anonimo ya fueron activados): ',
2007
- 'new.firebase.interactive.billingNeeded': 'Plan Blaze aun no activo. Actívalo en el enlace de arriba y espera la detección automática.',
2120
+ 'new.firebase.interactive.googleAuthNote': '* Activa Google Sign-In manualmente (Email/Contraseña y Anônimo ya fueron activados): ',
2121
+ 'new.firebase.interactive.billingNeeded': 'Plan Blaze aún no activo. Actívalo en el enlace de arriba y espera la detección automática.',
2008
2122
  'new.firebase.interactive.billingWaiting': 'Verificando estado del Blaze...',
2009
2123
  'new.firebase.interactive.billingTimeout': 'Plan Blaze no confirmado tras el tiempo límite. Despliegue omitido — ejecuta manualmente cuando estés listo.',
2010
2124
  'new.firebase.interactive.authWarn': 'No se pudo activar Email/Contraseña y Anónimo automáticamente. Actívalos manualmente:',
@@ -2016,12 +2130,12 @@ const MESSAGES = {
2016
2130
  'new.firebase.interactive.errorTitle': 'Ocurrio un error en el despliegue.',
2017
2131
  'new.firebase.interactive.errorHint': 'Revisa haber creado Firestore y activado el plan Blaze con tarjeta.',
2018
2132
  'new.firebase.interactive.laterHint': 'Puedes publicar luego desde la carpeta de tu proyecto corriendo: ',
2019
- 'new.firebase.interactive.skipped': 'Despliegue omitido. Puedes publicar mas tarde.',
2133
+ 'new.firebase.interactive.skipped': 'Despliegue omitido. Puedes publicar más tarde.',
2020
2134
 
2021
2135
  'new.firebase.warn.flutterfire': '⚠️ FlutterFire no pudo generar firebase_options_dev.dart automáticamente.',
2022
2136
  'new.firebase.warn.flutterfire.manual': 'Ejecuta manualmente en la carpeta del proyecto:',
2023
2137
 
2024
- 'new.firebase.error.templateMissing': 'Plantilla Firebase no encontrada en: {path}. Asegurate de que la carpeta Firebase/ existe.',
2138
+ 'new.firebase.error.templateMissing': 'Plantilla Firebase no encontrada en: {path}. Asegúrate de que la carpeta Firebase/ existe.',
2025
2139
  'new.firebase.error.dirNotEmpty': 'El directorio "{path}" ya existe y no está vacío.',
2026
2140
  'new.firebase.error.aborted': 'Setup cancelado.',
2027
2141
 
@@ -2078,7 +2192,7 @@ const MESSAGES = {
2078
2192
  'new.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
2079
2193
  'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir la APNs Key',
2080
2194
  'new.firebase.create.estimatedTime': '(generalmente 3-5 min — no cierres la terminal)',
2081
- 'new.internet.warning': '📶 Asegurate de tener una conexion a internet estable — este paso requiere red.',
2195
+ 'new.internet.warning': '📶 Asegúrate de tener una conexión a internet estable — este paso requiere red.',
2082
2196
 
2083
2197
  // run command
2084
2198
  'cli.command.run.description': 'Corre la app en celular, simulador o navegador',
@@ -2112,10 +2226,10 @@ const MESSAGES = {
2112
2226
  'notifications.error.noFeatures': 'lib/core/config/features.dart no encontrado.',
2113
2227
  'notifications.error.notEnabled': 'Notificaciones locales desactivadas. Ejecuta: kasy add local_notifications',
2114
2228
  'notifications.error.cancelled': 'Cancelado.',
2115
- 'notifications.prompt.intro': 'Textos de notificacion local',
2229
+ 'notifications.prompt.intro': 'Textos de notificación local',
2116
2230
  'notifications.prompt.hint': 'Demo Home = prueba instantanea en Features. Recordatorio = alerta programada en Ajustes.',
2117
- 'notifications.prompt.demoTitle': 'Demo Home — titulo de la notificacion',
2118
- 'notifications.prompt.demoBody': 'Demo Home — descripcion / cuerpo',
2231
+ 'notifications.prompt.demoTitle': 'Demo Home — titulo de la notificación',
2232
+ 'notifications.prompt.demoBody': 'Demo Home — descripción / cuerpo',
2119
2233
  'notifications.prompt.reminderTitle': 'Recordatorio programado — titulo',
2120
2234
  'notifications.prompt.reminderBody': 'Recordatorio programado — cuerpo',
2121
2235
  'notifications.prompt.required': 'Obligatorio.',
@@ -2124,7 +2238,7 @@ const MESSAGES = {
2124
2238
  'notifications.slang': 'Ejecutando dart run slang...',
2125
2239
  'notifications.slangDone': 'Traducciones regeneradas',
2126
2240
  'notifications.slangFailed': 'dart run slang fallo — ejecuta manualmente en el proyecto',
2127
- 'notifications.done': 'Textos de notificacion local actualizados.',
2241
+ 'notifications.done': 'Textos de notificación local actualizados.',
2128
2242
  'notifications.summary.demo': 'Home → Features (demo):',
2129
2243
  'notifications.summary.reminder': 'Ajustes → Recordatorios (programado):',
2130
2244
 
@@ -2134,36 +2248,36 @@ const MESSAGES = {
2134
2248
  'add.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
2135
2249
  'add.alreadyActive': 'La feature "{module}" ya está activa en este proyecto.',
2136
2250
  'add.applying': 'Agregando feature: {module}',
2137
- 'add.applyingPatch': 'Aplicando archivos de patch...',
2251
+ 'add.applyingPatch': 'Aplicando cambios de la feature...',
2138
2252
  'add.patchApplied': 'Patch aplicado',
2139
2253
  'add.patchFailed': 'Patch fallo — revisa la salida anterior',
2140
- 'add.pubGet': 'Ejecutando flutter pub get...',
2254
+ 'add.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
2141
2255
  'add.pubGetDone': 'Dependencias actualizadas',
2142
- 'add.pubGetFailed': 'flutter pub get falloejecutalo manualmente',
2143
- 'add.buildRunner': 'Ejecutando build_runner...',
2144
- 'add.buildRunnerDone': 'Generacion de codigo completada',
2145
- 'add.buildRunnerFailed': 'build_runner falloejecutalo manualmente',
2256
+ 'add.pubGetFailed': 'Falló al instalar paquetes de Flutter ejecuta `flutter pub get` manualmente',
2257
+ 'add.buildRunner': 'Generando código (Riverpod/Freezed)...',
2258
+ 'add.buildRunnerDone': 'Generación de código completada',
2259
+ 'add.buildRunnerFailed': 'Generación de código falló ejecuta `dart run build_runner build` manualmente',
2146
2260
  'add.success': 'Feature "{module}" agregada exitosamente.',
2147
2261
  'add.cancelled': 'Cancelado.',
2148
- 'add.prompt.sentryDsn': 'Sentry DSN (deja en blanco para configurar despues):',
2149
- 'add.prompt.mixpanelToken': 'Mixpanel Token (deja en blanco para configurar despues):',
2150
- 'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deja en blanco para configurar despues):',
2151
- 'add.prompt.rcIosKey': 'RevenueCat iOS API key (deja en blanco para configurar despues):',
2262
+ 'add.prompt.sentryDsn': 'Sentry DSN (deja en blanco para configurar después):',
2263
+ 'add.prompt.mixpanelToken': 'Mixpanel Token (deja en blanco para configurar después):',
2264
+ 'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deja en blanco para configurar después):',
2265
+ 'add.prompt.rcIosKey': 'RevenueCat iOS API key (deja en blanco para configurar después):',
2152
2266
  'add.note.facebook': 'Agrega tu Facebook App ID y token en .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
2153
2267
  'new.q.llm_chat.configureNow': 'Configurar el agente de Chat LLM ahora?',
2154
- 'new.q.llm_chat.configureNow.hint': 'Puedes omitir y ejecutar "kasy add llm_chat" despues',
2268
+ 'new.q.llm_chat.configureNow.hint': 'Puedes omitir y ejecutar "kasy add llm_chat" después',
2155
2269
  'add.llm_chat.reconfigure': 'Feature ya activa — reconfigurando solo las credenciales.',
2156
2270
  'add.prompt.llmProvider': 'Proveedor de LLM:',
2157
2271
  'add.prompt.llmSystemPrompt': 'Instruccion del agente — system prompt (deja en blanco para ninguna):\n Ejemplo: "Eres un asistente de soporte del app Fitsync. Solo responde sobre entrenamientos."\n >',
2158
- 'add.prompt.llmApiKey': 'Clave de API (OpenAI o Gemini) — se guarda en el servidor, nunca en el app (deja en blanco para configurar despues):',
2159
- 'add.prompt.llmEndpoint': 'URL de tu endpoint LLM (deja en blanco para configurar despues):',
2272
+ 'add.prompt.llmApiKey': 'Clave de API (OpenAI o Gemini) — se guarda en el servidor, nunca en el app (deja en blanco para configurar después):',
2273
+ 'add.prompt.llmEndpoint': 'URL de tu endpoint LLM (deja en blanco para configurar después):',
2160
2274
  'add.llm_chat.settingSecret': 'Guardando clave de API como secret en el servidor...',
2161
2275
  'add.llm_chat.secretSet': 'Clave de API guardada como secret',
2162
2276
  'add.llm_chat.secretFailed': 'No se pudo guardar el secret automaticamente — configuralo manualmente (ver instrucciones abajo)',
2163
2277
  'add.llm_chat.skipSecret': 'Clave de API omitida — configura antes del deploy via CLI del servidor',
2164
2278
  'add.llm_chat.deploying': 'Desplegando funcion LLM en el servidor...',
2165
2279
  'add.llm_chat.deployed': 'Funcion LLM desplegada con exito',
2166
- 'add.llm_chat.deployFailed': 'Deploy automatico fallo — despliega manualmente (ver instrucciones abajo)',
2280
+ 'add.llm_chat.deployFailed': 'Deploy automático fallo — despliega manualmente (ver instrucciones abajo)',
2167
2281
  'add.llm_chat.nextSteps.firebase': '\n Proximos pasos:\n 1. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 2. Corre el app: kasy run\n',
2168
2282
  'add.llm_chat.nextSteps.firebase.deployFailed': '\n Proximos pasos:\n 1. Deploy manual: firebase deploy --only functions:llmChat\n 2. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 3. Corre el app: kasy run\n',
2169
2283
  'add.llm_chat.nextSteps.supabase': '\n Proximos pasos:\n 1. El LLM_CHAT_ENDPOINT en .vscode/launch.json ya fue pre-llenado.\n 2. Corre el app: kasy run\n',
@@ -2172,58 +2286,115 @@ const MESSAGES = {
2172
2286
  'cli.command.remove.description': 'Elimina algo que ya no usas (ej: kasy remove sentry)',
2173
2287
  'remove.error.noModule': 'Ingresa el nombre de la feature. Uso: kasy remove <feature>',
2174
2288
  'remove.error.notKasyProject': 'kit_setup.json no encontrado. Ejecuta este comando dentro de un proyecto Kasy.',
2175
- 'remove.error.unknownModule': 'Modulo desconocido: {module}\nDisponibles: {list}',
2289
+ 'remove.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
2176
2290
  'remove.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
2177
2291
  'remove.confirm': 'Eliminar la feature "{module}"? Esto borrara archivos y dependencias.',
2178
2292
  'remove.cancelled': 'Cancelado.',
2179
2293
  'remove.removing': 'Eliminando feature: {module}',
2180
- 'remove.pubGet': 'Ejecutando flutter pub get...',
2294
+ 'remove.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
2181
2295
  'remove.pubGetDone': 'Dependencias actualizadas',
2182
- 'remove.pubGetFailed': 'flutter pub get falloejecutalo manualmente',
2183
- 'remove.buildRunner': 'Ejecutando build_runner...',
2184
- 'remove.buildRunnerDone': 'Generacion de codigo completada',
2185
- 'remove.buildRunnerFailed': 'build_runner falloejecutalo manualmente',
2296
+ 'remove.pubGetFailed': 'Falló al instalar paquetes de Flutter ejecuta `flutter pub get` manualmente',
2297
+ 'remove.buildRunner': 'Generando código (Riverpod/Freezed)...',
2298
+ 'remove.buildRunnerDone': 'Generación de código completada',
2299
+ 'remove.buildRunnerFailed': 'Generación de código falló ejecuta `dart run build_runner build` manualmente',
2186
2300
  'remove.success': 'Feature "{module}" eliminada exitosamente.',
2187
2301
  'remove.warn.ci': 'Archivos de CI eliminados. Si tenias workflows personalizados, restauralos desde git.',
2188
2302
  'remove.warn.sentry.shared': 'sentry_flutter conservado — todavia requerido por features activas (revenuecat/facebook).',
2189
2303
  'cli.command.update.description': 'Actualiza partes de tu app a la última versión (ej: kasy update components)',
2190
2304
  'cli.command.update.targetArg': 'Objetivo a actualizar (ej.: revenuecat, sentry, components)',
2191
2305
  'update.error.noProject': 'kit_setup.json no encontrado. Ejecuta dentro de un proyecto Kasy.',
2192
- 'update.error.unknownModule': 'Modulo desconocido: {module}\nDisponibles: {list}',
2193
- 'update.error.unknownTarget': 'Objetivo de actualizacion desconocido: {module}\nDisponibles: {list}',
2306
+ 'update.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
2307
+ 'update.error.unknownTarget': 'Objetivo de actualización desconocido: {module}\nDisponibles: {list}',
2194
2308
  'update.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
2195
- 'update.alreadyUpToDate': 'El proyecto ya esta actualizado (v{version}).',
2309
+ 'update.alreadyUpToDate': 'El proyecto ya está actualizado (v{versión}).',
2196
2310
  'update.status': 'Proyecto: v{from} → CLI: v{to}',
2197
- 'update.noVersion': 'El proyecto fue generado sin seguimiento de version. Todas las features pueden actualizarse.',
2311
+ 'update.noVersion': 'El proyecto fue generado sin seguimiento de versión. Todas las features pueden actualizarse.',
2198
2312
  'update.changesTitle': 'Actualizaciones disponibles:',
2199
2313
  'update.reapplyTitle': 'Sin cambios nuevos — puedes reaplicar si es necesario:',
2200
2314
  'update.howToUpdate': 'Para actualizar una feature:',
2201
2315
  'update.howToUpdateComponents': 'Para actualizar componentes base:',
2202
- 'update.warn.commit': 'Esto sobreescribira los archivos de la feature "{module}". Asegurate de haber hecho commit antes.',
2203
- 'update.warn.commitComponents': 'Esto sobreescribira archivos de los componentes base. Asegurate de haber hecho commit antes.',
2204
- 'update.confirm': 'Sobreescribir archivos de la feature "{module}" con la version mas reciente?',
2205
- 'update.confirmComponents': 'Sobreescribir archivos de los componentes base con la version mas reciente?',
2206
- 'update.confirmCore': 'Sobreescribir archivos de core (animaciones, widgets, tema, herramientas dev) con la version mas reciente?',
2316
+ 'update.warn.commit': 'Esto sobrescribirá los archivos de la feature "{module}". Asegúrate de haber hecho commit antes.',
2317
+ 'update.warn.commitComponents': 'Esto sobrescribirá archivos de los componentes base. Asegúrate de haber hecho commit antes.',
2318
+ 'update.confirm': 'Sobrescribir archivos de la feature "{module}" con la versión más reciente?',
2319
+ 'update.confirmComponents': 'Sobrescribir archivos de los componentes base con la versión más reciente?',
2320
+ 'update.confirmCore': 'Sobrescribir archivos de core (animaciones, widgets, tema, herramientas dev) con la versión más reciente?',
2207
2321
  'update.cancelled': 'Cancelado.',
2208
- 'update.applying': 'Aplicando actualizacion de la feature: {module}',
2209
- 'update.applyingComponents': 'Aplicando actualizacion de componentes base...',
2210
- 'update.applyingCore': 'Aplicando actualizacion de archivos de core...',
2322
+ 'update.applying': 'Aplicando actualización de la feature: {module}',
2323
+ 'update.applyingComponents': 'Aplicando actualización de componentes base...',
2324
+ 'update.applyingCore': 'Aplicando actualización de archivos de core...',
2211
2325
  'update.applied': 'Feature {module} actualizada',
2212
2326
  'update.appliedComponents': '{count} archivos de componentes base actualizados',
2213
2327
  'update.appliedCore': '{count} archivos de core actualizados',
2214
- 'update.applyFailed': 'Error al aplicar actualizacion de la feature {module}',
2215
- 'update.applyComponentsFailed': 'Error al aplicar actualizacion de componentes base',
2216
- 'update.noPatch': 'La feature "{module}" no tiene archivos para actualizar (feature solo de configuracion).',
2328
+ 'update.applyFailed': 'Error al aplicar actualización de la feature {module}',
2329
+ 'update.applyComponentsFailed': 'Error al aplicar actualización de componentes base',
2330
+ 'update.noPatch': 'La feature "{module}" no tiene archivos para actualizar (feature solo de configuración).',
2217
2331
  'update.noComponentFiles': 'No se encontraron archivos de componentes base para actualizar.',
2218
- 'update.pubGet': 'Ejecutando flutter pub get...',
2332
+ 'update.pubGet': 'Instalando paquetes de Flutter (flutter pub get)...',
2219
2333
  'update.pubGetDone': 'Dependencias actualizadas',
2220
- 'update.pubGetFailed': 'flutter pub get falloejecutalo manualmente',
2221
- 'update.buildRunner': 'Ejecutando build_runner...',
2222
- 'update.buildRunnerDone': 'Generacion de codigo completada',
2223
- 'update.buildRunnerFailed': 'build_runner falloejecutalo manualmente',
2334
+ 'update.pubGetFailed': 'Falló al instalar paquetes de Flutter ejecuta `flutter pub get` manualmente',
2335
+ 'update.buildRunner': 'Generando código (Riverpod/Freezed)...',
2336
+ 'update.buildRunnerDone': 'Generación de código completada',
2337
+ 'update.buildRunnerFailed': 'Generación de código falló ejecuta `dart run build_runner build` manualmente',
2224
2338
  'update.success': 'Feature "{module}" actualizada exitosamente.',
2225
2339
  'update.componentsSuccess': 'Componentes base actualizados exitosamente.',
2226
2340
  'update.coreSuccess': 'Archivos de core actualizados exitosamente.',
2341
+ 'check.intro': 'Kasy Check — Notificaciones Push',
2342
+ 'check.firebase.detected': 'Backend Firebase',
2343
+ 'check.firebase.adcInfo': 'Firebase usa Application Default Credentials — no requiere configuración extra.',
2344
+ 'check.apns.warn': 'Push iOS requiere APNs Key (no verificable via CLI)',
2345
+ 'check.apns.where': 'Firebase Console → Cloud Messaging → app iOS → Clave de autenticación APNs',
2346
+ 'check.done': 'Listo',
2347
+ 'check.notKasy': 'Este directorio no parece ser un proyecto Kasy.',
2348
+ 'check.aborted': 'Cancelado',
2349
+ 'check.supabase.notLinked': 'Proyecto Supabase no vinculado',
2350
+ 'check.supabase.notLinkedHint': 'ejecuta: supabase link --project-ref TU_REF',
2351
+ 'check.supabase.linked': 'Proyecto vinculado',
2352
+ 'check.spin.secrets': 'Verificando secrets…',
2353
+ 'check.spin.secretsDone': 'Secrets verificados',
2354
+ 'check.secrets.listFailed': 'No se pudo listar los secrets',
2355
+ 'check.secrets.checkLogin': 'verifica: supabase login',
2356
+ 'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configurado',
2357
+ 'check.fbProjId.missing': 'FIREBASE_PROJECT_ID ausente',
2358
+ 'check.fbProjId.fixHint': 'Corrige: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
2359
+ 'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → configurado automáticamente',
2360
+ 'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → falló al configurar',
2361
+ 'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configurado',
2362
+ 'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON ausente',
2363
+ 'check.fbSak.spin': 'Generando y configurando clave FCM…',
2364
+ 'check.fbSak.spinDone': 'Clave FCM generada',
2365
+ 'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → configurado automáticamente',
2366
+ 'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → falló al configurar',
2367
+ 'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → no se pudo generar la clave',
2368
+ 'check.fbSak.manual': "Manual: Firebase Console → Configuración → Cuentas de servicio → Generar clave\nLuego: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat clave.json)'",
2369
+ 'check.fbSak.hint': "Corrige automáticamente: kasy check --fix\nO manualmente: Firebase Console → Configuración → Cuentas de servicio → Generar clave\nLuego: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat clave.json)'",
2370
+ 'check.fn.spin': 'Verificando edge functions…',
2371
+ 'check.fn.spinDone': 'Edge functions verificadas',
2372
+ 'check.fn.listFailed': 'No se pudo listar edge functions',
2373
+ 'check.fn.deployed': 'Edge function send-push-notification publicada',
2374
+ 'check.fn.missing': 'Edge function send-push-notification no publicada',
2375
+ 'check.fn.deploySpin': 'Publicando send-push-notification…',
2376
+ 'check.fn.deployDone': 'send-push-notification → publicada automáticamente',
2377
+ 'check.fn.deployFailed': 'send-push-notification → falló el deploy',
2378
+ 'check.fn.hint': 'Corrige automáticamente: kasy check --fix\nO manualmente: supabase functions deploy send-push-notification',
2379
+ 'deploy.firebase.intro': 'Deploy — Firebase',
2380
+ 'deploy.firebase.spin': 'Publicando en Firebase...',
2381
+ 'deploy.firebase.spinDone': 'Deploy de Firebase completado',
2382
+ 'deploy.apns.title': 'Push iOS: configura la APNs Key en Firebase Console',
2383
+ 'deploy.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
2384
+ 'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir APNs Key',
2385
+ 'deploy.supabase.intro': 'Deploy — Supabase',
2386
+ 'deploy.supabase.notLinked': 'Proyecto Supabase no vinculado en este directorio.',
2387
+ 'deploy.supabase.linkHint': 'Ejecuta: supabase link --project-ref TU_PROJECT_REF',
2388
+ 'deploy.supabase.projectRef': 'Project ref: {ref}',
2389
+ 'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON ya configurado',
2390
+ 'deploy.supabase.sakSpin': 'Generando clave FCM (Service Account)…',
2391
+ 'deploy.supabase.sakSpinDone': 'Clave FCM generada',
2392
+ 'deploy.supabase.sakManual': "Configura manualmente: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
2393
+ 'deploy.supabase.sakNoGS': 'google-services.json no encontrado — configura manualmente',
2394
+ 'deploy.supabase.fnSpin': 'Publicando edge functions…',
2395
+ 'deploy.supabase.fnSpinDone': 'Edge functions procesadas',
2396
+ 'deploy.supabase.fnNone': 'edge functions (ninguna encontrada)',
2397
+ 'deploy.outro': 'Deploy completado',
2227
2398
  }
2228
2399
  };
2229
2400