kasy-cli 1.9.1 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/utils/i18n.js CHANGED
@@ -793,22 +793,22 @@ const MESSAGES = {
793
793
  'cli.command.upgrade.running': 'Atualizando a CLI kasy...',
794
794
  'cli.command.upgrade.done': 'kasy atualizado com sucesso!',
795
795
  'cli.command.uninstall.running': 'Desinstalando a CLI kasy...',
796
- 'cli.command.uninstall.done': 'kasy desinstalado. Ate mais!',
797
- 'new.checks.environment': 'Verificacoes de ambiente',
796
+ 'cli.command.uninstall.done': 'kasy desinstalado. Até mais!',
797
+ 'new.checks.environment': 'Verificações de ambiente',
798
798
  'new.checks.environment.checking': 'Verificando ambiente',
799
799
  'new.checks.environment.done': 'Ambiente pronto',
800
800
  'setup.checks.backend.checking': 'Verificando ferramentas {backend}',
801
801
  '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.',
802
+ 'new.checks.firebaseForPush': 'Atenção: Firebase CLI é obrigatório para notificações push (FCM) em todos os backends.',
803
+ 'new.checks.requiredBlock': 'Ferramentas obrigatórias não encontradas. Instale-as para continuar.',
804
804
  'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
805
805
  'new.checks.installSupabase': 'Supabase: npm i -g supabase (ou brew install supabase/tap/supabase) && supabase login',
806
806
  'new.checks.installSupabase.darwin': 'Supabase: brew install supabase/tap/supabase && supabase login (ou npm i -g supabase)',
807
807
  'new.checks.installSupabase.win32': 'Supabase: npm i -g supabase && supabase login',
808
808
  'new.checks.installSupabase.linux': 'Supabase: npm i -g supabase && supabase login',
809
- 'setup.checks.environment': 'Verificacoes de ambiente',
809
+ 'setup.checks.environment': 'Verificações de ambiente',
810
810
  'setup.checks.prepareFirebase': 'Ferramentas Firebase (push, remote config)',
811
- 'setup.checks.backend': 'Verificacoes de backend ({backend})',
811
+ 'setup.checks.backend': 'Verificações de backend ({backend})',
812
812
  'setup.firebase.installing': 'Instalando Firebase CLI...',
813
813
  'setup.supabase.installing': 'Instalando Supabase CLI...',
814
814
  'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
@@ -817,19 +817,19 @@ const MESSAGES = {
817
817
  'doctor.title': 'Kasy Doctor',
818
818
  'doctor.baseEnvironment': 'Ambiente base',
819
819
  '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:',
820
+ 'doctor.requiredMissing': 'Dependencias obrigatórias ausentes. Corrija os erros acima e execute o doctor novamente.',
821
+ 'doctor.requiredPassed': '✓ Verificações obrigatórias de ambiente aprovadas.',
822
+ 'modules.backends': 'Backends disponíveis:',
823
+ 'modules.featuresBase': 'Sempre incluído:',
824
824
  'modules.features': 'Features opcionais:',
825
825
  'modules.tag.firebaseOnly': 'somente Firebase',
826
826
  'modules.tag.requiresDb': 'requer Firebase ou Supabase',
827
827
  '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.',
828
+ 'modules.hint.subscriptionNoRc': 'Dica: a tela de Subscriptions está inclusa mas inativa. Rode `kasy add revenuecat` para habilitar pagamentos reais.',
829
829
  'modules.feature.base.authentication.description': 'Cadastro, login e gerenciamento de conta',
830
830
  'modules.feature.base.home.description': 'Tela principal do app apos o login',
831
831
  '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)',
832
+ 'modules.feature.base.notifications.description': 'Notificações push via Firebase Cloud Messaging (funciona com qualquer backend)',
833
833
  'modules.feature.base.subscription.description': 'Tela e modelo de assinatura premium (adicione RevenueCat para habilitar pagamentos reais)',
834
834
  'modules.backend.firebase.description': 'Adapter de backend Firebase',
835
835
  'modules.backend.supabase.description': 'Adapter de backend Supabase',
@@ -844,16 +844,16 @@ const MESSAGES = {
844
844
  'modules.feature.llm_chat.description': 'Tela de chat com IA usando OpenAI ou Gemini',
845
845
  'modules.feature.feedback.description': 'Pedidos e votacao de features dentro do app',
846
846
  '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)',
847
+ 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (testes + build) + Codemagic (publicação nas lojas)',
848
848
  'checks.checking': 'Verificando {name}...',
849
849
  'checks.found': '{name} encontrado',
850
850
  'checks.foundWithVersion': '{name} pronto ({version})',
851
851
  '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',
852
+ 'checks.notFound': '{name} não encontrado',
853
+ 'checks.flutter.warn': 'Flutter SDK não encontrado. Instale o Flutter para compilar e executar apps: https://docs.flutter.dev/get-started/install',
854
+ 'checks.install.failed': 'instalação automática falhou — execute o comando manualmente',
855
+ 'checks.diagnostic.xcodeLicense': '{name} está instalado, mas o Xcode precisa que a licenca seja aceita. Execute: sudo xcodebuild -license',
856
+ 'checks.diagnostic.xcodeCli': '{name} está instalado, mas faltam as Command Line Tools do Xcode. Execute: xcode-select --install',
857
857
  'banner.title': 'Kasy CLI · Gerador Flutter SaaS',
858
858
  'welcome.firstRun': 'Bem-vindo ao Kasy CLI!',
859
859
  'welcome.chooseLanguage': 'Primeiro, escolha seu idioma:',
@@ -866,25 +866,25 @@ const MESSAGES = {
866
866
  'license.expired': '❌ Sua assinatura expirou. Renove em kasy.dev.',
867
867
  'license.inactive': '❌ Sua chave foi desativada. Entre em contato em kasy.dev.',
868
868
  '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.',
869
+ '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
870
  'prompt.license.enter': '👉 Digite sua chave de ativação (XXXX-XXXX-XXXX-XXXX)',
871
871
  'prompt.license.invalid': 'Formato inválido. Use XXXX-XXXX-XXXX-XXXX.',
872
872
  'prompt.appName.enter': 'Digite o nome do seu app',
873
- 'prompt.appName.required': 'O nome do app e obrigatorio.',
873
+ 'prompt.appName.required': 'O nome do app é obrigatório.',
874
874
  'prompt.bundleId.enter': 'Digite o bundle ID (com.company.app)',
875
- 'prompt.bundleId.required': 'O bundle ID e obrigatorio.',
875
+ 'prompt.bundleId.required': 'O bundle ID é obrigatório.',
876
876
  'prompt.bundleId.invalid': 'O bundle ID deve seguir o formato com.company.app.',
877
877
  'prompt.backend.select': 'Escolha o provedor de backend',
878
878
  'prompt.features.select': 'Escolha as features opcionais para incluir',
879
879
  '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',
880
+ 'prompt.multiselect.instructions': '\nInstrucoes:\n ↑/↓: Destacar opção\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
881
+ 'prompt.multiselect.warnDisabled': 'Use ↓ para ir a uma opção selecionavel, Space para marcar, Enter para confirmar',
882
882
  'prompt.firebase.projectId.enter': 'Digite o Firebase Project ID',
883
- 'prompt.firebase.projectId.required': 'Firebase Project ID e obrigatorio.',
883
+ 'prompt.firebase.projectId.required': 'Firebase Project ID é obrigatório.',
884
884
  'prompt.supabase.url.enter': 'Digite a URL do Supabase',
885
- 'prompt.supabase.url.required': 'A URL do Supabase e obrigatoria.',
885
+ 'prompt.supabase.url.required': 'A URL do Supabase é obrigatória.',
886
886
  'prompt.supabase.anonKey.enter': 'Digite a chave anon do Supabase',
887
- 'prompt.supabase.anonKey.required': 'A chave anon do Supabase e obrigatoria.',
887
+ 'prompt.supabase.anonKey.required': 'A chave anon do Supabase é obrigatória.',
888
888
  'new.supabase.q.create': 'Criar novo projeto Supabase ou usar existente?',
889
889
  'new.supabase.q.create.create': '✨ Criar novo projeto (recomendado para iniciantes)',
890
890
  'new.supabase.q.create.existing': '📂 Usar projeto existente',
@@ -898,28 +898,28 @@ const MESSAGES = {
898
898
  'new.firebase.q.region.us': '🇺🇸 Estados Unidos — us-central1',
899
899
  'new.firebase.q.region.europe': '🇪🇺 Europa — europe-west1',
900
900
  '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.',
901
+ 'new.firebase.create.prereq': 'Você precisa: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Plano Blaze necessário para deploy.',
902
902
  'new.firebase.create.creating': 'Criando projeto Firebase…',
903
903
  'new.firebase.create.includeWeb': 'Incluir app Web no Firebase? (para plataforma web)',
904
904
  'new.firebase.create.nowDo': 'Agora ative a autenticação (antes de rodar o app):',
905
905
  'new.firebase.create.activateEmail': 'Ative Email/Senha: Firebase Console → Authentication → Sign-in method',
906
906
  'new.firebase.create.activateGoogle': 'Ative Google: mesma página, clique em Google → Ativar',
907
907
  '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',
908
+ 'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Senha e Anônimo foram ativados automaticamente)',
909
+ 'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → ative Email/Senha, Anônimo e Google',
910
910
  '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?',
911
+ 'new.firebase.create.beforeContinue.ready.noAuth': 'Ativei Email/Senha, Anônimo e Google Sign-In. Continuar?',
912
912
  'new.firebase.create.beforeContinue.secretManagerAuto': '(Secret Manager e Storage já foram ativados automaticamente)',
913
913
  'new.firebase.create.sha1Skipped': 'SHA-1 não adicionado',
914
914
  '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',
915
+ 'new.firebase.create.sha1ParseError': 'Não foi possível extrair o SHA-1 da saída do keytool',
916
916
  'new.firebase.create.sha1ErrorDetail': 'Motivo',
917
917
  'new.firebase.create.useExistingHint': 'O projeto pode ter sido criado. Tente "Usar projeto existente" com ID: {id}',
918
918
  'new.firebase.create.usingProjectId': 'Usando project ID: {id} (continuando com projeto existente)',
919
919
  'new.firebase.create.waitPropagate': 'Aguardando propagação do projeto (20s)…',
920
920
  '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.',
921
+ 'new.firebase.create.failed': 'Não foi possível criar o projeto',
922
+ 'new.firebase.create.gcloudRequired': 'gcloud CLI é obrigatório para "criar do zero". Sem ele, o fluxo completo do Firebase não pode rodar.',
923
923
  'new.firebase.create.installTitle': 'Para instalar o gcloud CLI, execute:',
924
924
  'new.firebase.create.installCommand': 'Comando',
925
925
  'new.firebase.create.installAfter': 'Depois faca login',
@@ -953,7 +953,7 @@ const MESSAGES = {
953
953
  'new.supabase.q.dbPassword.required': 'A senha deve ter pelo menos 6 caracteres.',
954
954
  'new.supabase.creating': 'Criando projeto no Supabase…',
955
955
  'new.supabase.created': 'Projeto criado com sucesso.',
956
- 'new.supabase.createFailed': 'Nao foi possivel criar o projeto',
956
+ 'new.supabase.createFailed': 'Não foi possível criar o projeto',
957
957
  'new.supabase.loginHint': 'Execute: supabase login. Depois informe a URL e chave do seu projeto existente.',
958
958
  'new.supabase.setup': 'Vinculando projeto e publicando…',
959
959
  'new.supabase.setupManual': 'Execute manualmente: supabase link, supabase db push, supabase functions deploy',
@@ -962,13 +962,13 @@ const MESSAGES = {
962
962
  'new.supabase.projectsRequired': 'Nenhum projeto encontrado nesta organização.',
963
963
  'new.supabase.q.dbPassword.existing': 'Senha do banco do projeto (necessária para vincular e aplicar migrations)',
964
964
  'new.supabase.existingLinked': 'Projeto pronto para vincular e aplicar migrations.',
965
- 'setup.license.loaded': '✓ Chave de licenca carregada da configuracao local.',
965
+ 'setup.license.loaded': '✓ Chave de licenca carregada da configuração local.',
966
966
  '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`.',
967
+ 'setup.license.invalid': 'Formato de licenca inválido. Esperado XXXX-XXXX-XXXX-XXXX.',
968
+ 'setup.error.targetNotEmpty': 'O diretório de destino não está vazio: {path}',
969
+ 'setup.error.targetExists': 'O diretório de destino existe: {path}',
970
+ 'setup.error.coreMissing': 'Pasta do core template não encontrada: {path}',
971
+ 'setup.error.requiredChecksFailed': 'Falha nas verificações obrigatórias. Execute `kasy doctor`.',
972
972
  'setup.error.generatingFailed': 'Falha ao gerar o projeto.',
973
973
  'setup.error.conflictHint': 'Dica: Remova a pasta do projeto e execute novamente, ou use um diretório vazio.',
974
974
  'setup.spinner.generating': 'Gerando arquivos do projeto...',
@@ -982,7 +982,7 @@ const MESSAGES = {
982
982
  'validate.success': '✓ Matriz de validacao aprovada.',
983
983
  'validate.failed': 'Matriz de validacao falhou.',
984
984
  'validate.error': 'Uma ou mais combinacoes de validacao falharam.',
985
- 'validate.projectNotFound': 'Projeto nao encontrado',
985
+ 'validate.projectNotFound': 'Projeto não encontrado',
986
986
  'validate.ok': 'ok',
987
987
  'validate.fail': 'falhou',
988
988
  'validate.passed': 'aprovado',
@@ -992,19 +992,19 @@ const MESSAGES = {
992
992
  'new.banner': '✨ Novo app Flutter',
993
993
  'new.subtitle': 'Escolha o backend: Firebase, Supabase ou API REST.',
994
994
  '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',
995
+ 'new.q.backend': 'Onde você quer salvar os dados do seu app?',
996
+ 'new.q.backend.firebase.desc': 'Mais fácil de começar — auth, banco e armazenamento prontos',
997
997
  'new.q.backend.supabase.desc': 'Banco SQL (PostgreSQL) com mais controle',
998
- 'new.q.backend.api.desc': 'Voce ja tem seu proprio servidor',
998
+ 'new.q.backend.api.desc': 'Você tem seu próprio servidor',
999
999
 
1000
1000
  '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',
1001
+ 'new.q.mode.quick': '⚡ Rapido — poucas perguntas, padrões inteligentes',
1002
+ 'new.q.mode.advanced': '🛠 Avançado — todas as opções e credenciais agora',
1003
1003
 
1004
1004
  'new.q.preset': 'Quais features incluir?',
1005
1005
  'new.q.preset.starter': '⚡ Starter — analytics + erros + onboarding',
1006
1006
  'new.q.preset.saas': '💰 SaaS — assinaturas + analytics + onboarding + feedback',
1007
- 'new.q.preset.content': '📱 Conteudo — crash reports + analytics + onboarding + AI chat',
1007
+ 'new.q.preset.content': '📱 Conteúdo — crash reports + analytics + onboarding + AI chat',
1008
1008
  'new.q.preset.full': '🚀 Completo — todas as features',
1009
1009
  'new.q.preset.custom': '⚙️ Personalizar — escolha feature a feature',
1010
1010
  'new.q.preset.none': '○ Nenhum — so o core',
@@ -1129,9 +1129,9 @@ const MESSAGES = {
1129
1129
  'new.api.q.baseUrl': 'Qual e a URL base da sua API?',
1130
1130
  'new.api.q.baseUrl.hint': 'https://api.example.com',
1131
1131
  '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:',
1132
+ 'new.firebase.subtitle': 'Projeto completo: auth, Firestore, notificações, login social e muito mais.',
1133
+ 'new.prereq.title': 'Antes de começar, certifique-se de que você tem:',
1134
+ 'new.firebase.prereq.title': 'Antes de começar, certifique-se de que você tem:',
1135
1135
  'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
1136
1136
  'new.firebase.prereq.create.2': '2. Plano Blaze (cartão de crédito — necessário para Cloud Functions)',
1137
1137
  '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 +1142,25 @@ const MESSAGES = {
1142
1142
  'new.firebase.create.successPush': 'Projeto Firebase criado para FCM + Remote Config.',
1143
1143
  'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
1144
1144
  '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)',
1145
+ 'new.firebase.prereq.3': '3. Plano Blaze ativado (cartao de credito — necessário para Cloud Functions)',
1146
1146
  'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (usado para ativar APIs automaticamente)',
1147
1147
  'new.firebase.prereq.5': '5. Antes do deploy: ative Secret Manager API e Firebase Storage (ver PREREQUISITES.md ou links apos gerar)',
1148
1148
  'new.firebase.prereq.doc': ' Checklist completo: PREREQUISITES.md',
1149
1149
 
1150
1150
  'new.firebase.q.appName': 'Qual e o nome do seu app?',
1151
1151
  'new.firebase.q.appName.hint': 'ex: Meu App Incrivel',
1152
- 'new.firebase.q.appName.required': 'O nome do app e obrigatorio.',
1152
+ 'new.firebase.q.appName.required': 'O nome do app é obrigatório.',
1153
1153
 
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.',
1154
+ 'new.firebase.q.bundleId': 'Qual e o identificador único (Bundle ID) do seu app?',
1155
+ 'new.firebase.q.bundleId.hint': 'Funciona como um endereço para o seu app, ex: com.minhaempresa.meuapp',
1156
+ 'new.firebase.q.bundleId.invalid': 'Formato inválido. Use: com.empresa.app',
1157
+ 'new.firebase.q.bundleId.required': 'O Bundle ID é obrigatório.',
1158
1158
 
1159
1159
  '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.',
1160
+ 'new.firebase.q.projectId.hint': 'Encontre no Firebase Console → seu projeto → Configurações',
1161
+ 'new.firebase.q.projectId.required': 'O Firebase Project ID é obrigatório.',
1162
1162
 
1163
- 'new.firebase.q.modules': 'Quais features opcionais voce quer incluir?',
1163
+ 'new.firebase.q.modules': 'Quais features opcionais você quer incluir?',
1164
1164
  'new.firebase.q.modules.hint': 'Espaco para selecionar, Enter para confirmar',
1165
1165
  'new.modules.header.common': '── Comuns (todos os backends) ──',
1166
1166
  'new.modules.header.features': '── Telas e features ──',
@@ -1180,8 +1180,8 @@ const MESSAGES = {
1180
1180
  'new.firebase.module.onboarding': '👋 Onboarding (fluxo de boas-vindas)',
1181
1181
 
1182
1182
  '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`.',
1183
+ 'new.firebase.q.secrets.configureNow.hint': 'Se não agora, veja o README para os comandos de configuração depois',
1184
+ 'new.firebase.q.secrets.later': '• Secrets do servidor não configuradas — serão configuradas durante `kasy deploy`.',
1185
1185
  'new.firebase.q.revenuecat.webhookKey': 'Chave secreta do webhook (um valor aleatorio foi sugerido — pressione Enter para aceitar ou digite o seu)',
1186
1186
  'new.firebase.q.revenuecat.webhookKey.hint': 'Salve esse valor. No painel RevenueCat, cole como: Bearer <esse-valor>',
1187
1187
  'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
@@ -1191,11 +1191,11 @@ const MESSAGES = {
1191
1191
  'new.firebase.q.paywall': 'Qual estilo de paywall?',
1192
1192
  'new.firebase.q.paywall.hint': 'Layout da tela de assinaturas — pode alterar depois no RevenueCat',
1193
1193
  '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.',
1194
+ 'new.firebase.q.revenuecat.web.hint': 'Requer Web Billing no dashboard RevenueCat + Stripe. Deixe desmarcado se não precisar.',
1195
1195
  'new.firebase.q.revenuecat.webKey': 'Chave API RevenueCat Web Billing (rcb_xxx ou rcb_sb_xxx, opcional — configure depois)',
1196
1196
  'new.firebase.success.revenuecatWeb': '• RevenueCat Web: adicione RC_WEB_API_KEY (launch.json) para assinaturas na web',
1197
1197
  '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',
1198
+ 'new.firebase.q.sentry.dsn.invalid': 'DSN inválido. Formato esperado: https://chave@host/project-id',
1199
1199
  'new.firebase.q.mixpanel.token': 'Token do Mixpanel (deixe em branco para configurar depois)',
1200
1200
  'new.firebase.q.facebook.appId': 'App ID do Facebook',
1201
1201
  'new.firebase.q.facebook.appId.required': 'App ID do Facebook é obrigatório.',
@@ -1205,9 +1205,9 @@ const MESSAGES = {
1205
1205
  'new.firebase.q.revenuecat.android.required': 'Chave Android do RevenueCat é obrigatória.',
1206
1206
  'new.firebase.q.revenuecat.ios.required': 'Chave iOS do RevenueCat é obrigatória.',
1207
1207
  '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).',
1208
+ 'new.firebase.q.revenuecat.webKey.invalid': 'Chave Web Billing deve começar com rcb_ (ex: rcb_sb_xxx ou rcb_xxx).',
1209
1209
 
1210
- 'new.firebase.confirm.title': 'Resumo da configuracao:',
1210
+ 'new.firebase.confirm.title': 'Resumo da configuração:',
1211
1211
  'new.firebase.confirm.app': 'App',
1212
1212
  'new.firebase.confirm.bundleId': 'Bundle ID',
1213
1213
  'new.firebase.confirm.project': 'Firebase',
@@ -1217,12 +1217,12 @@ const MESSAGES = {
1217
1217
 
1218
1218
  'new.firebase.step.copying': 'Criando seu projeto...',
1219
1219
  'new.firebase.step.pubGet': 'Instalando pacotes Flutter...',
1220
- 'new.firebase.step.buildRunner': 'Gerando codigo (Riverpod/Freezed)...',
1220
+ 'new.firebase.step.buildRunner': 'Gerando código (Riverpod/Freezed)...',
1221
1221
  'new.firebase.step.flutterfire': 'Configurando Firebase (flutterfire)...',
1222
1222
  'new.firebase.step.deploy': 'Fazendo deploy das Cloud Functions + regras do Firestore...',
1223
1223
  'new.firebase.step.done': 'Pronto!',
1224
1224
 
1225
- 'new.firebase.success.title': '🎉 Seu app esta pronto!',
1225
+ 'new.firebase.success.title': '🎉 Seu app está pronto!',
1226
1226
  'new.firebase.success.open': 'Abra o projeto:',
1227
1227
  'new.firebase.success.run': 'Rode o app:',
1228
1228
  'new.firebase.success.runMake': 'Ou use make: make run | make run-ios | make run-android',
@@ -1232,14 +1232,14 @@ const MESSAGES = {
1232
1232
  'new.firebase.success.hotReload': "Hot reload: pressione 'r' no terminal enquanto o app roda. Mudanças aparecem na hora.",
1233
1233
  'new.firebase.success.oneLiner': 'Ou copie e cole para entrar e executar:',
1234
1234
  '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):',
1235
+ 'new.firebase.success.alreadyDone': ' configurado pela CLI:',
1236
+ 'new.firebase.success.manualNeeded': 'Configure manualmente (se necessário):',
1237
1237
  '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)',
1238
+ 'new.firebase.success.social': '• Ative o login social no Firebase Console → Authentication (Google e Apple estão no código; so ative la)',
1239
1239
  '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.',
1240
+ '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',
1241
+ 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics em produção. 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". Notificações push são exclusivas de mobile e desativadas automaticamente na web.',
1243
1243
 
1244
1244
  'new.firebase.q.deploy': 'Fazer deploy das Cloud Functions + regras do Firestore agora?',
1245
1245
  'new.firebase.q.deploy.hint': 'Requer plano Blaze e firebase-tools instalado globalmente',
@@ -1251,7 +1251,7 @@ const MESSAGES = {
1251
1251
  'new.firebase.success.beforeDeploy': 'Antes do firebase deploy, ative (clique para abrir):',
1252
1252
  'new.firebase.success.secretManager': '• Secret Manager API',
1253
1253
  'new.firebase.success.firestore': '• Firestore (crie o banco se não existir)',
1254
- 'new.firebase.success.storage': '• Firebase Storage (Comecar)',
1254
+ 'new.firebase.success.storage': '• Firebase Storage (Começar)',
1255
1255
  'new.firebase.success.auth': '• Firebase Authentication (Email/Senha)',
1256
1256
  'new.firebase.success.security': '🔒 .gitignore exclui .env e outros segredos. Cloud Functions usam secrets no servidor.',
1257
1257
 
@@ -1261,14 +1261,14 @@ const MESSAGES = {
1261
1261
  'new.firebase.interactive.step2': '2. Faça upgrade para o plano Blaze (Pay-as-you-go): ',
1262
1262
  'new.firebase.interactive.step3': '3. Confirme que habilitou Auth (Email/Senha): ',
1263
1263
 
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.',
1264
+ 'new.firebase.interactive.prompt1': 'Você criou o banco Firestore e habilitou a Autenticação no link acima?',
1265
+ 'new.firebase.interactive.prompt2': 'Você fez o upgrade pro Plano Blaze? (Obrigatório para deploy de funções)',
1266
+ 'new.firebase.interactive.googleAuthNote': '* Ative o Google Sign-In manualmente (Email/Senha e Anônimo foram ativados): ',
1267
+ 'new.firebase.interactive.billingNeeded': 'Plano Blaze ainda não ativo. Ative no link acima e aguarde a detecção automática.',
1268
1268
  '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:',
1269
+ 'new.firebase.interactive.billingTimeout': 'Plano Blaze não confirmado apos o tempo limite. Deploy ignorado — rode manualmente quando estiver pronto.',
1270
+ 'new.firebase.interactive.authWarn': 'Não foi possível ativar Email/Senha e Anônimo automaticamente. Ative manualmente:',
1271
+ 'new.firebase.existing.apisFailed': 'Não foi possível ativar APIs:',
1272
1272
  'new.firebase.existing.googleSignInManual': 'Google Sign-In: ative manualmente em Authentication → Sign-in method → Google',
1273
1273
 
1274
1274
  'new.firebase.interactive.ready': 'Pronto para publicar Push Notifications + Regras agora?',
@@ -1278,34 +1278,34 @@ const MESSAGES = {
1278
1278
  'new.firebase.interactive.laterHint': 'Você pode publicar depois abrindo o terminal na pasta do projeto e rodando: ',
1279
1279
  'new.firebase.interactive.skipped': 'Deploy de Funções ignorado. Você pode publicar depois quando quiser.',
1280
1280
 
1281
- 'new.firebase.warn.flutterfire': '⚠️ FlutterFire nao conseguiu gerar firebase_options_dev.dart automaticamente.',
1281
+ 'new.firebase.warn.flutterfire': '⚠️ FlutterFire não conseguiu gerar firebase_options_dev.dart automaticamente.',
1282
1282
  'new.firebase.warn.flutterfire.manual': 'Execute manualmente na pasta do projeto:',
1283
1283
 
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.',
1284
+ 'new.firebase.error.templateMissing': 'Template Firebase não encontrado em: {path}. Certifique-se de que a pasta Firebase/ existe.',
1285
+ 'new.firebase.error.dirNotEmpty': 'O diretório "{path}" existe e não está vazio.',
1286
1286
  'new.firebase.error.aborted': 'Setup cancelado.',
1287
1287
 
1288
1288
  '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)',
1289
+ 'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI instalados (ambos obrigatórios)',
1290
+ 'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase necessário para push)',
1291
1291
  '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.',
1292
+ 'new.supabase.loginRequired': '⚠️ Você precisa estar logado para criar projeto. Execute supabase login primeiro.',
1293
1293
  'new.supabase.loginCommand': ' supabase login',
1294
1294
  'new.supabase.success.done.db': '• Banco: tabelas, politicas RLS',
1295
1295
  'new.supabase.success.done.storage': '• Storage: bucket kasy com politicas',
1296
1296
  'new.supabase.success.done.webhook': '• Edge Function revenuecat-webhook',
1297
1297
  'new.supabase.success.done.secrets': '• Secrets da Edge Function (se informados)',
1298
1298
  '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}',
1299
+ 'new.supabase.success.auth': '• Auth: Email vem ativado. Ative Google, Apple e Facebook em: {authUrl}',
1300
+ 'new.supabase.success.storage': '• Storage: Bucket kasy criado com politicas ( pronto)',
1301
+ 'new.supabase.success.fcm': '• Push (FCM): Configure no Firebase Console (plano Blaze). App pronto para Supabase + FCM. URL: {fcmUrl}',
1302
1302
  'new.supabase.success.deployLater': '• Deploy do backend quando estiver pronto (de dentro da pasta do projeto):',
1303
1303
 
1304
1304
  'new.api.prereq.1': '1. Sua API REST rodando e acessivel',
1305
1305
  '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)',
1306
+ 'new.api.prereq.3': '3. Firebase CLI obrigatório para notificações push (FCM)',
1307
1307
  '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',
1308
+ 'new.api.success.fcm': '• Firebase e necessário para notificações push (FCM) — configure a chave APNs no console do Firebase',
1309
1309
  'new.api.success.auth': '• Implemente os endpoints de auth social (Google, Apple) no seu backend',
1310
1310
 
1311
1311
  'new.outdated.hint': 'projetos criados agora não terão as últimas melhorias.',
@@ -1320,25 +1320,25 @@ const MESSAGES = {
1320
1320
  'new.success.step.console': 'Abra o console do backend:',
1321
1321
  'new.fcm.generating': 'Gerando chave de Service Account FCM…',
1322
1322
  'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
1323
- 'new.sha1.failed': 'SHA-1 nao adicionado automaticamente: {error}',
1323
+ 'new.sha1.failed': 'SHA-1 não adicionado automaticamente: {error}',
1324
1324
  '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',
1325
+ 'new.sha1.skipped.apiFailed': 'SHA-1 não adicionado automaticamente. Motivo: {error}',
1326
+ 'new.sha1.skipped.other': 'SHA-1 não adicionado: {reason}',
1327
+ 'new.sha1.addManually': 'Adicione manualmente: Firebase Console → Configurações do projeto → Seus apps → Android → Adicionar impressão digital',
1328
1328
  'new.sha1.added': '✓ SHA-1 adicionado (Google Sign-In)',
1329
1329
  'new.firestore.created': '✓ Firestore criado automaticamente',
1330
- 'new.firestore.notCreated.error': '⚠ Firestore nao criado. Motivo: {error}',
1331
- 'new.firestore.notCreated': '⚠ Firestore nao criado automaticamente',
1330
+ 'new.firestore.notCreated.error': '⚠ Firestore não criado. Motivo: {error}',
1331
+ 'new.firestore.notCreated': '⚠ Firestore não criado automaticamente',
1332
1332
  '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',
1333
+ 'new.storage.notCreated.error': '⚠ Storage não criado. Motivo: {error}',
1334
+ 'new.storage.notCreated': '⚠ Storage não criado automaticamente',
1335
1335
  'new.activateManually': 'Ative manualmente no console:',
1336
1336
  'new.fcm.serverConfig': 'Configure no servidor: FIREBASE_SERVICE_ACCOUNT_JSON="$(cat .kasy/fcm-service-account.json)"',
1337
1337
  'new.apns.warning': '⚠ Push iOS: configure a APNs Key no Firebase Console',
1338
1338
  'new.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
1339
1339
  '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.',
1340
+ 'new.firebase.create.estimatedTime': '(geralmente 3-5 min — não feche o terminal)',
1341
+ 'new.internet.warning': '📶 Verifique se você está com uma internet estável — esta etapa precisa de conexão.',
1342
1342
 
1343
1343
  // run command
1344
1344
  'cli.command.run.description': 'Roda o app no celular, simulador ou navegador',
@@ -1346,7 +1346,7 @@ const MESSAGES = {
1346
1346
  'run.updateHint.prefix': 'Melhorias disponíveis para o projeto —',
1347
1347
  'run.updateHint.suffix': 'para ver o que há de novo',
1348
1348
  '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.',
1349
+ 'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
1350
1350
 
1351
1351
  // doctor project checks
1352
1352
  'doctor.project.title': 'Projeto',
@@ -1354,7 +1354,7 @@ const MESSAGES = {
1354
1354
  'doctor.project.backend': 'Backend',
1355
1355
  'doctor.project.bundleId': 'Bundle ID',
1356
1356
  'doctor.project.pubGet': 'Dependencias instaladas (pubspec.lock presente)',
1357
- 'doctor.project.pubGetMissing': 'Execute flutter pub get — pubspec.lock nao encontrado',
1357
+ 'doctor.project.pubGetMissing': 'Execute flutter pub get — pubspec.lock não encontrado',
1358
1358
  'doctor.project.modules': 'Features ativas',
1359
1359
  'doctor.project.noModules': 'Nenhuma feature opcional ativa',
1360
1360
 
@@ -1366,42 +1366,42 @@ const MESSAGES = {
1366
1366
 
1367
1367
  // notifications command
1368
1368
  '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',
1369
+ 'cli.command.notifications.text.description': 'Define títulos e mensagens das notificações locais',
1370
+ 'notifications.error.notKasyProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
1371
+ 'notifications.error.noI18n': 'lib/i18n/*.i18n.json não encontrado neste projeto.',
1372
+ 'notifications.error.noFeatures': 'lib/core/config/features.dart não encontrado.',
1373
+ 'notifications.error.notEnabled': 'Notificações locais desativadas. Execute: kasy add local_notifications',
1374
1374
  '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',
1375
+ 'notifications.prompt.intro': 'Textos de notificação local',
1376
+ 'notifications.prompt.hint': 'Demo Home = teste instantâneo em Features. Lembrete = alerta agendado em Configurações.',
1377
+ 'notifications.prompt.demoTitle': 'Demo Home — título da notificação',
1378
+ 'notifications.prompt.demoBody': 'Demo Home — descrição / corpo',
1379
+ 'notifications.prompt.reminderTitle': 'Lembrete agendado — título',
1380
1380
  'notifications.prompt.reminderBody': 'Lembrete agendado — corpo',
1381
- 'notifications.prompt.required': 'Obrigatorio.',
1381
+ 'notifications.prompt.required': 'Obrigatório.',
1382
1382
  'notifications.writing': 'Atualizando lib/i18n/*.i18n.json...',
1383
1383
  'notifications.written': 'Atualizado: {langs}',
1384
1384
  'notifications.slang': 'Executando dart run slang...',
1385
1385
  'notifications.slangDone': 'Traducoes regeneradas',
1386
1386
  'notifications.slangFailed': 'dart run slang falhou — execute manualmente no projeto',
1387
- 'notifications.done': 'Textos de notificacao local atualizados.',
1387
+ 'notifications.done': 'Textos de notificação local atualizados.',
1388
1388
  'notifications.summary.demo': 'Home → Features (demo):',
1389
- 'notifications.summary.reminder': 'Configuracoes → Lembretes (agendado):',
1389
+ 'notifications.summary.reminder': 'Configurações → Lembretes (agendado):',
1390
1390
 
1391
1391
  '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.',
1392
+ 'add.error.noModule': 'Informe o nome da feature ou use --list para ver as disponíveis.',
1393
+ 'add.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
1394
1394
  'add.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
1395
- 'add.alreadyActive': 'A feature "{module}" ja esta ativa neste projeto.',
1395
+ 'add.alreadyActive': 'A feature "{module}" está ativa neste projeto.',
1396
1396
  'add.applying': 'Adicionando feature: {module}',
1397
1397
  'add.applyingPatch': 'Aplicando arquivos de patch...',
1398
1398
  'add.patchApplied': 'Patch aplicado',
1399
- 'add.patchFailed': 'Patch falhou — verifique a saida acima',
1399
+ 'add.patchFailed': 'Patch falhou — verifique a saída acima',
1400
1400
  'add.pubGet': 'Executando flutter pub get...',
1401
1401
  'add.pubGetDone': 'Dependencias atualizadas',
1402
1402
  'add.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1403
1403
  'add.buildRunner': 'Executando build_runner...',
1404
- 'add.buildRunnerDone': 'Geracao de codigo concluida',
1404
+ 'add.buildRunnerDone': 'Geração de código concluída',
1405
1405
  'add.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1406
1406
  'add.success': 'Feature "{module}" adicionada com sucesso.',
1407
1407
  'add.cancelled': 'Cancelado.',
@@ -1412,74 +1412,74 @@ const MESSAGES = {
1412
1412
  'add.note.facebook': 'Adicione seu Facebook App ID e token no .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
1413
1413
  'new.q.llm_chat.configureNow': 'Configurar o agente de Chat LLM agora?',
1414
1414
  '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.',
1415
+ 'add.llm_chat.reconfigure': 'Feature ativa — reconfigurando apenas as credenciais.',
1416
1416
  '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 >',
1417
+ '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
1418
  'add.prompt.llmApiKey': 'Chave de API (OpenAI ou Gemini) — fica no servidor, nunca no app (deixe em branco para configurar depois):',
1419
1419
  'add.prompt.llmEndpoint': 'URL do seu endpoint LLM (deixe em branco para configurar depois):',
1420
1420
  'add.llm_chat.settingSecret': 'Salvando chave de API como secret no servidor...',
1421
1421
  '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)',
1422
+ 'add.llm_chat.secretFailed': 'Não foi possível salvar o secret automaticamente — configure manualmente (veja instruções abaixo)',
1423
1423
  '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',
1424
+ 'add.llm_chat.deploying': 'Fazendo deploy da função LLM no servidor...',
1425
+ 'add.llm_chat.deployed': 'Função LLM deployada com sucesso',
1426
+ 'add.llm_chat.deployFailed': 'Deploy automático falhou — faca o deploy manualmente (veja instruções abaixo)',
1427
+ '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',
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 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 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 foi preenchido.\n 3. Rode o app: kasy run\n',
1431
1431
  '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
1432
  'cli.command.remove.description': 'Remove algo que você não usa mais (ex: kasy remove sentry)',
1433
1433
  '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.',
1434
+ 'remove.error.notKasyProject': 'kit_setup.json não encontrado. Execute este comando dentro de um projeto Kasy.',
1435
1435
  '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.',
1436
+ 'remove.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
1437
+ 'remove.confirm': 'Remover a feature "{module}"? Isso vai deletar arquivos e dependências.',
1438
1438
  'remove.cancelled': 'Cancelado.',
1439
1439
  'remove.removing': 'Removendo feature: {module}',
1440
1440
  'remove.pubGet': 'Executando flutter pub get...',
1441
1441
  'remove.pubGetDone': 'Dependencias atualizadas',
1442
1442
  'remove.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1443
1443
  'remove.buildRunner': 'Executando build_runner...',
1444
- 'remove.buildRunnerDone': 'Geracao de codigo concluida',
1444
+ 'remove.buildRunnerDone': 'Geração de código concluída',
1445
1445
  'remove.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1446
1446
  'remove.success': 'Feature "{module}" removida com sucesso.',
1447
1447
  '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).',
1448
+ 'remove.warn.sentry.shared': 'sentry_flutter mantido — ainda necessário para features ativas (revenuecat/facebook).',
1449
1449
  'cli.command.update.description': 'Atualiza partes do app para a última versão (ex: kasy update components)',
1450
1450
  '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}).',
1451
+ 'update.error.noProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
1452
+ 'update.error.unknownModule': 'Feature desconhecida: {module}\nDisponíveis: {list}',
1453
+ 'update.error.unknownTarget': 'Alvo de atualização desconhecido: {module}\nDisponiveis: {list}',
1454
+ 'update.error.notActive': 'A feature "{module}" não está ativa neste projeto.',
1455
+ 'update.alreadyUpToDate': 'Projeto está atualizado (v{version}).',
1456
1456
  '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:',
1457
+ 'update.noVersion': 'Projeto foi gerado sem rastreamento de versão. Todas as features podem ser atualizadas.',
1458
+ 'update.changesTitle': 'Atualizações disponíveis:',
1459
1459
  'update.reapplyTitle': 'Sem mudancas novas — pode reaplicar se precisar:',
1460
1460
  'update.howToUpdate': 'Para atualizar uma feature:',
1461
1461
  'update.howToUpdateComponents': 'Para atualizar componentes base:',
1462
1462
  'update.warn.commit': 'Isso vai sobrescrever os arquivos da feature "{module}". Faca commit de tudo antes de continuar.',
1463
1463
  '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?',
1464
+ 'update.confirm': 'Sobrescrever arquivos da feature "{module}" com a versão mais recente?',
1465
+ 'update.confirmComponents': 'Sobrescrever arquivos dos componentes base com a versão mais recente?',
1466
+ 'update.confirmCore': 'Sobrescrever arquivos do core (animacoes, widgets, tema, ferramentas de dev) com a versão mais recente?',
1467
1467
  '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...',
1468
+ 'update.applying': 'Aplicando atualização da feature: {module}',
1469
+ 'update.applyingComponents': 'Aplicando atualização dos componentes base...',
1470
+ 'update.applyingCore': 'Aplicando atualização dos arquivos de core...',
1471
1471
  'update.applied': 'Feature {module} atualizada',
1472
1472
  'update.appliedComponents': '{count} arquivos de componentes base atualizados',
1473
1473
  '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).',
1474
+ 'update.applyFailed': 'Falha ao aplicar atualização da feature {module}',
1475
+ 'update.applyComponentsFailed': 'Falha ao aplicar atualização dos componentes base',
1476
+ 'update.noPatch': 'Feature "{module}" não tem arquivos para atualizar (feature so de configuração).',
1477
1477
  'update.noComponentFiles': 'Nenhum arquivo de componente base foi encontrado para atualizar.',
1478
1478
  'update.pubGet': 'Executando flutter pub get...',
1479
1479
  'update.pubGetDone': 'Dependencias atualizadas',
1480
1480
  'update.pubGetFailed': 'flutter pub get falhou — execute manualmente',
1481
1481
  'update.buildRunner': 'Executando build_runner...',
1482
- 'update.buildRunnerDone': 'Geracao de codigo concluida',
1482
+ 'update.buildRunnerDone': 'Geração de código concluída',
1483
1483
  'update.buildRunnerFailed': 'build_runner falhou — execute manualmente',
1484
1484
  'update.success': 'Feature "{module}" atualizada com sucesso.',
1485
1485
  'update.componentsSuccess': 'Componentes base atualizados com sucesso.',
@@ -1552,7 +1552,7 @@ const MESSAGES = {
1552
1552
  'setup.firebase.installing': 'Instalando Firebase CLI...',
1553
1553
  'setup.supabase.installing': 'Instalando Supabase CLI...',
1554
1554
  'setup.flutterfire.installing': 'Instalando FlutterFire CLI...',
1555
- 'setup.warn.hang': 'Si se cuelga, ejecuta manualmente: flutterfire --version',
1555
+ 'setup.warn.hang': 'Si se cuelga, ejecuta manualmente: flutterfire --versión',
1556
1556
  'setup.warn.supabase': '¿Usas Supabase o API propia? Firebase sigue siendo útil para push y remote config.',
1557
1557
  'doctor.title': 'Kasy Doctor',
1558
1558
  'doctor.baseEnvironment': 'Entorno base',
@@ -1565,9 +1565,9 @@ const MESSAGES = {
1565
1565
  'modules.tag.firebaseOnly': 'solo Firebase',
1566
1566
  'modules.tag.requiresDb': 'requiere Firebase o Supabase',
1567
1567
  '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',
1568
+ 'modules.hint.subscriptionNoRc': 'Tip: la pantalla de Subscriptions está incluida pero inactiva. Ejecuta `kasy add revenuecat` para habilitar pagos reales.',
1569
+ 'modules.feature.base.authentication.description': 'Registro, inicio de sesión y gestión de cuenta',
1570
+ 'modules.feature.base.home.description': 'Pantalla principal de la app después del login',
1571
1571
  'modules.feature.base.settings.description': 'Tema, idioma, cuenta y preferencias',
1572
1572
  'modules.feature.base.notifications.description': 'Notificaciones push via Firebase Cloud Messaging (funciona con cualquier backend)',
1573
1573
  'modules.feature.base.subscription.description': 'Pantalla y modelo de suscripcion premium (anade RevenueCat para habilitar pagos reales)',
@@ -1584,10 +1584,10 @@ const MESSAGES = {
1584
1584
  'modules.feature.llm_chat.description': 'Pantalla de chat con IA usando OpenAI o Gemini',
1585
1585
  'modules.feature.feedback.description': 'Solicitudes y votacion de features dentro de la app',
1586
1586
  '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)',
1587
+ 'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publicación en tiendas)',
1588
1588
  'checks.checking': 'Verificando {name}...',
1589
1589
  'checks.found': '{name} encontrado',
1590
- 'checks.foundWithVersion': '{name} listo ({version})',
1590
+ 'checks.foundWithVersion': '{name} listo ({versión})',
1591
1591
  'checks.missing': '{name} ausente',
1592
1592
  'checks.notFound': '{name} no encontrado',
1593
1593
  'checks.flutter.warn': 'Flutter SDK no encontrado. Instala Flutter para compilar y ejecutar apps: https://docs.flutter.dev/get-started/install',
@@ -1617,8 +1617,8 @@ const MESSAGES = {
1617
1617
  'prompt.backend.select': 'Elige el proveedor de backend',
1618
1618
  'prompt.features.select': 'Elige las features opcionales a incluir',
1619
1619
  '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',
1620
+ 'prompt.multiselect.instructions': '\nInstrucciones:\n ↑/↓: Resaltar opción\n ←/→/[space]: Marcar/desmarcar\n a: Marcar/desmarcar todos\n enter/return: Confirmar',
1621
+ 'prompt.multiselect.warnDisabled': 'Usa ↓ para ir a una opción seleccionable, Space para marcar, Enter para confirmar',
1622
1622
  'prompt.firebase.projectId.enter': 'Ingresa el Firebase Project ID',
1623
1623
  'prompt.firebase.projectId.required': 'Firebase Project ID es obligatorio.',
1624
1624
  'prompt.supabase.url.enter': 'Ingresa la URL de Supabase',
@@ -1704,10 +1704,10 @@ const MESSAGES = {
1704
1704
  'new.supabase.projectsRequired': 'No se encontraron proyectos en esta organización.',
1705
1705
  'new.supabase.q.dbPassword.existing': 'Contraseña del banco del proyecto (necesaria para vincular y aplicar migraciones)',
1706
1706
  'new.supabase.existingLinked': 'Proyecto listo para vincular y aplicar migraciones.',
1707
- 'setup.license.loaded': '✓ Clave de licencia cargada desde la configuracion local.',
1707
+ 'setup.license.loaded': '✓ Clave de licencia cargada desde la configuración local.',
1708
1708
  '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}',
1709
+ 'setup.license.invalid': 'Formato de licencia inválido. Se espera XXXX-XXXX-XXXX-XXXX.',
1710
+ 'setup.error.targetNotEmpty': 'El directorio de destino no está vacío: {path}',
1711
1711
  'setup.error.targetExists': 'El directorio de destino ya existe: {path}',
1712
1712
  'setup.error.coreMissing': 'No se encontro la carpeta del core template: {path}',
1713
1713
  'setup.error.requiredChecksFailed': 'Fallo en verificaciones obligatorias. Ejecuta `kasy doctor`.',
@@ -1721,9 +1721,9 @@ const MESSAGES = {
1721
1721
  'setup.success.stepPubGet': 'flutter pub get',
1722
1722
  'setup.success.stepRun': 'flutter run',
1723
1723
  '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.',
1724
+ 'validate.success': '✓ Matriz de validación aprobada.',
1725
+ 'validate.failed': 'La matriz de validación fallo.',
1726
+ 'validate.error': 'Una o más combinaciones de validación fallaron.',
1727
1727
  'validate.projectNotFound': 'Proyecto no encontrado',
1728
1728
  'validate.ok': 'ok',
1729
1729
  'validate.fail': 'fallo',
@@ -1735,12 +1735,12 @@ const MESSAGES = {
1735
1735
  'new.subtitle': 'Elige el backend: Firebase, Supabase o API REST.',
1736
1736
  'new.subtitle2': '🔒 El setup corre en tu máquina con tus credenciales — sin acceso de terceros.',
1737
1737
  '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',
1738
+ 'new.q.backend.firebase.desc': 'El más fácil para empezar — auth, base de datos y storage listos',
1739
+ 'new.q.backend.supabase.desc': 'Base de datos SQL (PostgreSQL) con más control',
1740
1740
  'new.q.backend.api.desc': 'Ya tienes tu propio servidor',
1741
1741
 
1742
1742
  'new.q.mode': '¿Como quieres configurar?',
1743
- 'new.q.mode.quick': '⚡ Rapido — pocas preguntas, valores inteligentes',
1743
+ 'new.q.mode.quick': '⚡ Rápido — pocas preguntas, valores inteligentes',
1744
1744
  'new.q.mode.advanced': '🛠 Avanzado — todas las opciones y credenciales ahora',
1745
1745
 
1746
1746
  'new.q.preset': '¿Qué features incluir?',
@@ -1872,8 +1872,8 @@ const MESSAGES = {
1872
1872
  'new.api.q.baseUrl.hint': 'https://api.example.com',
1873
1873
  'new.firebase.banner': '🔥 Nuevo app Flutter — Firebase',
1874
1874
  '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:',
1875
+ 'new.prereq.title': 'Antes de empezar, asegúrate de tener:',
1876
+ 'new.firebase.prereq.title': 'Antes de empezar, asegúrate de tener:',
1877
1877
  'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
1878
1878
  'new.firebase.prereq.create.2': '2. Plan Blaze (tarjeta de crédito — requerido para Cloud Functions)',
1879
1879
  '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 +1882,7 @@ const MESSAGES = {
1882
1882
  'new.firebase.prereq.create.pushNote': ' Proyecto Firebase para FCM + Remote Config se creará automáticamente (sin cuenta de servicio).',
1883
1883
  'new.firebase.prereq.1': '1. Firebase CLI instalado (npm i -g firebase-tools) + firebase login',
1884
1884
  '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)',
1885
+ 'new.firebase.prereq.3': '3. Plan Blaze activado (tarjeta de crédito — requerido para Cloud Functions)',
1886
1886
  'new.firebase.prereq.4': '4. gcloud CLI instalado + gcloud auth login (para activar APIs automáticamente)',
1887
1887
  'new.firebase.prereq.5': '5. Antes del deploy: activa Secret Manager API y Firebase Storage (ver PREREQUISITES.md o enlaces tras generar)',
1888
1888
  'new.firebase.prereq.doc': ' Lista completa: PREREQUISITES.md',
@@ -1929,7 +1929,7 @@ const MESSAGES = {
1929
1929
  'new.firebase.q.revenuecat.android': 'Clave API RevenueCat para Android',
1930
1930
  'new.firebase.q.revenuecat.ios': 'Clave API RevenueCat para iOS',
1931
1931
  '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',
1932
+ 'new.firebase.q.paywall.hint': 'Layout de la pantalla de suscripciones — puedes cambiarlo después en RevenueCat',
1933
1933
  'new.firebase.q.revenuecat.web': '¿Habilitar suscripciones en web (RevenueCat Web Billing)?',
1934
1934
  'new.firebase.q.revenuecat.web.hint': 'Requiere Web Billing en dashboard RevenueCat + Stripe. Deja desmarcado si no necesitas.',
1935
1935
  'new.firebase.q.revenuecat.webKey': 'Clave API RevenueCat Web Billing (rcb_xxx o rcb_sb_xxx, opcional — configurar después)',
@@ -1977,8 +1977,8 @@ const MESSAGES = {
1977
1977
  'new.firebase.success.apn': '• Clave APN (push iOS): Firebase Console → Config. del Proyecto → Cloud Messaging',
1978
1978
  '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
1979
  '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',
1980
+ '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',
1981
+ 'new.firebase.success.mixpanel': '• Mixpanel: Para analytics en producción. Ya en launch.json para dev. Para release: --dart-define=MIXPANEL_TOKEN=xxx',
1982
1982
  '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
1983
 
1984
1984
  'new.firebase.q.deploy': '¿Hacer deploy de Cloud Functions + reglas de Firestore ahora?',
@@ -2001,10 +2001,10 @@ const MESSAGES = {
2001
2001
  'new.firebase.interactive.step2': '2. Sube al plan Blaze (Pay-as-you-go): ',
2002
2002
  'new.firebase.interactive.step3': '3. Habilita Auth (Email y Contraseña): ',
2003
2003
 
2004
- 'new.firebase.interactive.prompt1': '¿Ya creaste Firestore y habilitaste Autenticacion en el enlace arriba?',
2004
+ 'new.firebase.interactive.prompt1': '¿Ya creaste Firestore y habilitaste Autenticación en el enlace arriba?',
2005
2005
  '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.',
2006
+ 'new.firebase.interactive.googleAuthNote': '* Activa Google Sign-In manualmente (Email/Contraseña y Anônimo ya fueron activados): ',
2007
+ '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
2008
  'new.firebase.interactive.billingWaiting': 'Verificando estado del Blaze...',
2009
2009
  'new.firebase.interactive.billingTimeout': 'Plan Blaze no confirmado tras el tiempo límite. Despliegue omitido — ejecuta manualmente cuando estés listo.',
2010
2010
  'new.firebase.interactive.authWarn': 'No se pudo activar Email/Contraseña y Anónimo automáticamente. Actívalos manualmente:',
@@ -2016,12 +2016,12 @@ const MESSAGES = {
2016
2016
  'new.firebase.interactive.errorTitle': 'Ocurrio un error en el despliegue.',
2017
2017
  'new.firebase.interactive.errorHint': 'Revisa haber creado Firestore y activado el plan Blaze con tarjeta.',
2018
2018
  '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.',
2019
+ 'new.firebase.interactive.skipped': 'Despliegue omitido. Puedes publicar más tarde.',
2020
2020
 
2021
2021
  'new.firebase.warn.flutterfire': '⚠️ FlutterFire no pudo generar firebase_options_dev.dart automáticamente.',
2022
2022
  'new.firebase.warn.flutterfire.manual': 'Ejecuta manualmente en la carpeta del proyecto:',
2023
2023
 
2024
- 'new.firebase.error.templateMissing': 'Plantilla Firebase no encontrada en: {path}. Asegurate de que la carpeta Firebase/ existe.',
2024
+ 'new.firebase.error.templateMissing': 'Plantilla Firebase no encontrada en: {path}. Asegúrate de que la carpeta Firebase/ existe.',
2025
2025
  'new.firebase.error.dirNotEmpty': 'El directorio "{path}" ya existe y no está vacío.',
2026
2026
  'new.firebase.error.aborted': 'Setup cancelado.',
2027
2027
 
@@ -2078,7 +2078,7 @@ const MESSAGES = {
2078
2078
  'new.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
2079
2079
  'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir la APNs Key',
2080
2080
  '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.',
2081
+ 'new.internet.warning': '📶 Asegúrate de tener una conexión a internet estable — este paso requiere red.',
2082
2082
 
2083
2083
  // run command
2084
2084
  'cli.command.run.description': 'Corre la app en celular, simulador o navegador',
@@ -2112,10 +2112,10 @@ const MESSAGES = {
2112
2112
  'notifications.error.noFeatures': 'lib/core/config/features.dart no encontrado.',
2113
2113
  'notifications.error.notEnabled': 'Notificaciones locales desactivadas. Ejecuta: kasy add local_notifications',
2114
2114
  'notifications.error.cancelled': 'Cancelado.',
2115
- 'notifications.prompt.intro': 'Textos de notificacion local',
2115
+ 'notifications.prompt.intro': 'Textos de notificación local',
2116
2116
  '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',
2117
+ 'notifications.prompt.demoTitle': 'Demo Home — titulo de la notificación',
2118
+ 'notifications.prompt.demoBody': 'Demo Home — descripción / cuerpo',
2119
2119
  'notifications.prompt.reminderTitle': 'Recordatorio programado — titulo',
2120
2120
  'notifications.prompt.reminderBody': 'Recordatorio programado — cuerpo',
2121
2121
  'notifications.prompt.required': 'Obligatorio.',
@@ -2124,7 +2124,7 @@ const MESSAGES = {
2124
2124
  'notifications.slang': 'Ejecutando dart run slang...',
2125
2125
  'notifications.slangDone': 'Traducciones regeneradas',
2126
2126
  'notifications.slangFailed': 'dart run slang fallo — ejecuta manualmente en el proyecto',
2127
- 'notifications.done': 'Textos de notificacion local actualizados.',
2127
+ 'notifications.done': 'Textos de notificación local actualizados.',
2128
2128
  'notifications.summary.demo': 'Home → Features (demo):',
2129
2129
  'notifications.summary.reminder': 'Ajustes → Recordatorios (programado):',
2130
2130
 
@@ -2141,29 +2141,29 @@ const MESSAGES = {
2141
2141
  'add.pubGetDone': 'Dependencias actualizadas',
2142
2142
  'add.pubGetFailed': 'flutter pub get fallo — ejecutalo manualmente',
2143
2143
  'add.buildRunner': 'Ejecutando build_runner...',
2144
- 'add.buildRunnerDone': 'Generacion de codigo completada',
2144
+ 'add.buildRunnerDone': 'Generación de código completada',
2145
2145
  'add.buildRunnerFailed': 'build_runner fallo — ejecutalo manualmente',
2146
2146
  'add.success': 'Feature "{module}" agregada exitosamente.',
2147
2147
  '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):',
2148
+ 'add.prompt.sentryDsn': 'Sentry DSN (deja en blanco para configurar después):',
2149
+ 'add.prompt.mixpanelToken': 'Mixpanel Token (deja en blanco para configurar después):',
2150
+ 'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deja en blanco para configurar después):',
2151
+ 'add.prompt.rcIosKey': 'RevenueCat iOS API key (deja en blanco para configurar después):',
2152
2152
  'add.note.facebook': 'Agrega tu Facebook App ID y token en .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
2153
2153
  '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',
2154
+ 'new.q.llm_chat.configureNow.hint': 'Puedes omitir y ejecutar "kasy add llm_chat" después',
2155
2155
  'add.llm_chat.reconfigure': 'Feature ya activa — reconfigurando solo las credenciales.',
2156
2156
  'add.prompt.llmProvider': 'Proveedor de LLM:',
2157
2157
  '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):',
2158
+ '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):',
2159
+ 'add.prompt.llmEndpoint': 'URL de tu endpoint LLM (deja en blanco para configurar después):',
2160
2160
  'add.llm_chat.settingSecret': 'Guardando clave de API como secret en el servidor...',
2161
2161
  'add.llm_chat.secretSet': 'Clave de API guardada como secret',
2162
2162
  'add.llm_chat.secretFailed': 'No se pudo guardar el secret automaticamente — configuralo manualmente (ver instrucciones abajo)',
2163
2163
  'add.llm_chat.skipSecret': 'Clave de API omitida — configura antes del deploy via CLI del servidor',
2164
2164
  'add.llm_chat.deploying': 'Desplegando funcion LLM en el servidor...',
2165
2165
  'add.llm_chat.deployed': 'Funcion LLM desplegada con exito',
2166
- 'add.llm_chat.deployFailed': 'Deploy automatico fallo — despliega manualmente (ver instrucciones abajo)',
2166
+ 'add.llm_chat.deployFailed': 'Deploy automático fallo — despliega manualmente (ver instrucciones abajo)',
2167
2167
  '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
2168
  '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
2169
  '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,7 +2172,7 @@ const MESSAGES = {
2172
2172
  'cli.command.remove.description': 'Elimina algo que ya no usas (ej: kasy remove sentry)',
2173
2173
  'remove.error.noModule': 'Ingresa el nombre de la feature. Uso: kasy remove <feature>',
2174
2174
  '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}',
2175
+ 'remove.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
2176
2176
  'remove.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
2177
2177
  'remove.confirm': 'Eliminar la feature "{module}"? Esto borrara archivos y dependencias.',
2178
2178
  'remove.cancelled': 'Cancelado.',
@@ -2181,7 +2181,7 @@ const MESSAGES = {
2181
2181
  'remove.pubGetDone': 'Dependencias actualizadas',
2182
2182
  'remove.pubGetFailed': 'flutter pub get fallo — ejecutalo manualmente',
2183
2183
  'remove.buildRunner': 'Ejecutando build_runner...',
2184
- 'remove.buildRunnerDone': 'Generacion de codigo completada',
2184
+ 'remove.buildRunnerDone': 'Generación de código completada',
2185
2185
  'remove.buildRunnerFailed': 'build_runner fallo — ejecutalo manualmente',
2186
2186
  'remove.success': 'Feature "{module}" eliminada exitosamente.',
2187
2187
  'remove.warn.ci': 'Archivos de CI eliminados. Si tenias workflows personalizados, restauralos desde git.',
@@ -2189,37 +2189,37 @@ const MESSAGES = {
2189
2189
  'cli.command.update.description': 'Actualiza partes de tu app a la última versión (ej: kasy update components)',
2190
2190
  'cli.command.update.targetArg': 'Objetivo a actualizar (ej.: revenuecat, sentry, components)',
2191
2191
  '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}',
2192
+ 'update.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
2193
+ 'update.error.unknownTarget': 'Objetivo de actualización desconocido: {module}\nDisponibles: {list}',
2194
2194
  'update.error.notActive': 'La feature "{module}" no está activa en este proyecto.',
2195
- 'update.alreadyUpToDate': 'El proyecto ya esta actualizado (v{version}).',
2195
+ 'update.alreadyUpToDate': 'El proyecto ya está actualizado (v{versión}).',
2196
2196
  'update.status': 'Proyecto: v{from} → CLI: v{to}',
2197
- 'update.noVersion': 'El proyecto fue generado sin seguimiento de version. Todas las features pueden actualizarse.',
2197
+ 'update.noVersion': 'El proyecto fue generado sin seguimiento de versión. Todas las features pueden actualizarse.',
2198
2198
  'update.changesTitle': 'Actualizaciones disponibles:',
2199
2199
  'update.reapplyTitle': 'Sin cambios nuevos — puedes reaplicar si es necesario:',
2200
2200
  'update.howToUpdate': 'Para actualizar una feature:',
2201
2201
  '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?',
2202
+ 'update.warn.commit': 'Esto sobrescribirá los archivos de la feature "{module}". Asegúrate de haber hecho commit antes.',
2203
+ 'update.warn.commitComponents': 'Esto sobrescribirá archivos de los componentes base. Asegúrate de haber hecho commit antes.',
2204
+ 'update.confirm': 'Sobrescribir archivos de la feature "{module}" con la versión más reciente?',
2205
+ 'update.confirmComponents': 'Sobrescribir archivos de los componentes base con la versión más reciente?',
2206
+ 'update.confirmCore': 'Sobrescribir archivos de core (animaciones, widgets, tema, herramientas dev) con la versión más reciente?',
2207
2207
  '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...',
2208
+ 'update.applying': 'Aplicando actualización de la feature: {module}',
2209
+ 'update.applyingComponents': 'Aplicando actualización de componentes base...',
2210
+ 'update.applyingCore': 'Aplicando actualización de archivos de core...',
2211
2211
  'update.applied': 'Feature {module} actualizada',
2212
2212
  'update.appliedComponents': '{count} archivos de componentes base actualizados',
2213
2213
  '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).',
2214
+ 'update.applyFailed': 'Error al aplicar actualización de la feature {module}',
2215
+ 'update.applyComponentsFailed': 'Error al aplicar actualización de componentes base',
2216
+ 'update.noPatch': 'La feature "{module}" no tiene archivos para actualizar (feature solo de configuración).',
2217
2217
  'update.noComponentFiles': 'No se encontraron archivos de componentes base para actualizar.',
2218
2218
  'update.pubGet': 'Ejecutando flutter pub get...',
2219
2219
  'update.pubGetDone': 'Dependencias actualizadas',
2220
2220
  'update.pubGetFailed': 'flutter pub get fallo — ejecutalo manualmente',
2221
2221
  'update.buildRunner': 'Ejecutando build_runner...',
2222
- 'update.buildRunnerDone': 'Generacion de codigo completada',
2222
+ 'update.buildRunnerDone': 'Generación de código completada',
2223
2223
  'update.buildRunnerFailed': 'build_runner fallo — ejecutalo manualmente',
2224
2224
  'update.success': 'Feature "{module}" actualizada exitosamente.',
2225
2225
  'update.componentsSuccess': 'Componentes base actualizados exitosamente.',