kasy-cli 1.16.0 → 1.18.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/bin/kasy.js +16 -2
- package/lib/commands/add.js +52 -19
- package/lib/commands/configure.js +548 -0
- package/lib/commands/deploy.js +4 -4
- package/lib/commands/doctor.js +54 -6
- package/lib/commands/favicon.js +4 -4
- package/lib/commands/icon.js +5 -5
- package/lib/commands/new.js +404 -213
- package/lib/commands/remove.js +14 -3
- package/lib/commands/run.js +208 -6
- package/lib/commands/splash.js +5 -5
- package/lib/commands/update.js +9 -9
- package/lib/scaffold/CHANGELOG.json +23 -0
- package/lib/scaffold/backends/api/patch/README.md +3 -2
- package/lib/scaffold/backends/firebase/enable-auth-via-cli.js +108 -0
- package/lib/scaffold/backends/firebase/setup-from-scratch.js +44 -5
- package/lib/scaffold/backends/supabase/patch/README.md +3 -2
- package/lib/scaffold/generate.js +24 -8
- package/lib/scaffold/shared/generator-utils.js +52 -8
- package/lib/scaffold/shared/post-build.js +113 -31
- package/lib/scaffold/shared/template-strings.js +6 -0
- package/lib/utils/brand.js +16 -12
- package/lib/utils/flutter-run.js +139 -11
- package/lib/utils/i18n/messages-en.js +85 -7
- package/lib/utils/i18n/messages-es.js +85 -7
- package/lib/utils/i18n/messages-pt.js +86 -8
- package/lib/utils/ui.js +79 -4
- package/package.json +1 -1
- package/templates/firebase/README.en.md +18 -8
- package/templates/firebase/README.es.md +18 -8
- package/templates/firebase/README.md +18 -8
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +68 -45
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidgetReceiver.kt +37 -0
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/OpenAppAction.kt +26 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +2 -2
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +7 -2
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +6 -6
- package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +1 -1
- package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +2 -2
- package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +1 -1
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +3 -3
- package/templates/firebase/android/app/src/main/res/values/colors.xml +32 -0
- package/templates/firebase/assets/images/splash_logo_dark.png +0 -0
- package/templates/firebase/assets/images/splash_logo_dark_android12.png +0 -0
- package/templates/firebase/assets/images/splash_logo_light.png +0 -0
- package/templates/firebase/assets/images/splash_logo_light_android12.png +0 -0
- package/templates/firebase/docs/revenuecat-setup.es.md +28 -8
- package/templates/firebase/docs/revenuecat-setup.pt.md +28 -8
- package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +75 -29
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png +0 -0
- package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +1 -1
- package/templates/firebase/lib/components/components.dart +1 -0
- package/templates/firebase/lib/components/kasy_avatar.dart +65 -17
- package/templates/firebase/lib/components/kasy_avatar_presets.dart +121 -97
- package/templates/firebase/lib/components/kasy_button.dart +8 -8
- package/templates/firebase/lib/components/kasy_date_picker.dart +834 -0
- package/templates/firebase/lib/components/kasy_tabs.dart +145 -61
- package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +45 -53
- package/templates/firebase/lib/features/home/home_components_preview_registry.dart +565 -77
- package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +10 -5
- package/templates/firebase/lib/i18n/en.i18n.json +2 -1
- package/templates/firebase/lib/i18n/es.i18n.json +2 -1
- package/templates/firebase/lib/i18n/pt.i18n.json +2 -1
- package/templates/firebase/lib/router.dart +15 -1
- package/templates/firebase/pubspec.yaml +1 -1
- package/templates/firebase/web/index.html +9 -0
- package/templates/firebase/web/splash/img/dark-1x.png +0 -0
- package/templates/firebase/web/splash/img/dark-2x.png +0 -0
- package/templates/firebase/web/splash/img/dark-3x.png +0 -0
- package/templates/firebase/web/splash/img/dark-4x.png +0 -0
- package/templates/firebase/web/splash/img/light-1x.png +0 -0
- package/templates/firebase/web/splash/img/light-2x.png +0 -0
- package/templates/firebase/web/splash/img/light-3x.png +0 -0
- package/templates/firebase/web/splash/img/light-4x.png +0 -0
|
@@ -79,6 +79,9 @@ module.exports = {
|
|
|
79
79
|
'doctor.title': 'Kasy Doctor',
|
|
80
80
|
'doctor.baseEnvironment': 'Base environment',
|
|
81
81
|
'doctor.optionalBackend': 'Optional backend tooling',
|
|
82
|
+
'doctor.gcpBilling.title': 'Google Cloud Billing (Firebase Blaze)',
|
|
83
|
+
'doctor.gcpBilling.found': '{count} active billing account(s):',
|
|
84
|
+
'doctor.gcpBilling.missing': 'No billing account found. Create one before running `kasy new` with Firebase:',
|
|
82
85
|
'doctor.requiredMissing': 'Missing required dependencies. Fix the errors above and rerun doctor.',
|
|
83
86
|
'doctor.requiredPassed': '✓ Required environment checks passed.',
|
|
84
87
|
'modules.backends': 'Available backends:',
|
|
@@ -196,6 +199,10 @@ module.exports = {
|
|
|
196
199
|
'new.firebase.create.success': 'Firebase project created successfully.',
|
|
197
200
|
'new.firebase.create.failed': 'Could not create project',
|
|
198
201
|
'new.firebase.create.gcloudRequired': 'gcloud CLI is required for "create from scratch". Without it, the full Firebase flow cannot run.',
|
|
202
|
+
'new.firebase.billing.required': 'You do not have a billing account on Google Cloud yet. Firebase needs the Blaze plan to use Storage and Cloud Functions.',
|
|
203
|
+
'new.firebase.billing.create.steps': 'Opening the billing account creation page. Create the account (credit card required, no charges within the free quota) and come back here:',
|
|
204
|
+
'new.firebase.billing.created.ready': 'I created the billing account, ready to continue?',
|
|
205
|
+
'new.firebase.billing.stillMissing': 'No active billing account found. Finish the setup in the Console and run `kasy new` again.',
|
|
199
206
|
'new.firebase.create.installTitle': 'To install gcloud CLI, run:',
|
|
200
207
|
'new.firebase.create.installCommand': 'Command',
|
|
201
208
|
'new.firebase.create.installAfter': 'Then log in',
|
|
@@ -212,6 +219,8 @@ module.exports = {
|
|
|
212
219
|
'new.firebase.q.organization': 'In which GCP organization should the project be created?',
|
|
213
220
|
'new.firebase.q.organization.none': 'No organization (personal account / standalone project)',
|
|
214
221
|
'new.firebase.q.organization.hint': 'Organizations linked to your gcloud account',
|
|
222
|
+
'new.firebase.create.billingWait': 'Waiting for billing propagation…',
|
|
223
|
+
'new.firebase.create.billingQuotaError': 'Could not link billing (account quota reached or propagation not finished yet).',
|
|
215
224
|
'new.firebase.create.billingRetry.title': 'Link billing manually (quota exceeded or billing error):',
|
|
216
225
|
'new.firebase.create.billingRetry.hint': 'Tip: Limit is 3 projects per billing account. Remove unused projects at the link above. If you just removed one, wait 2–5 min for changes to propagate, then retry.',
|
|
217
226
|
'new.firebase.create.billingRetry.ready': 'Linked billing. Retry setup?',
|
|
@@ -233,6 +242,7 @@ module.exports = {
|
|
|
233
242
|
'new.supabase.loginHint': 'Run: supabase login. Then enter your existing project URL and key below.',
|
|
234
243
|
'new.supabase.setup': 'Linking project and deploying…',
|
|
235
244
|
'new.supabase.setupManual': 'Run manually: supabase link, supabase db push, supabase functions deploy',
|
|
245
|
+
'new.supabase.passwordSaved': 'Database password auto-generated and saved to .kasy/supabase.json (gitignored).',
|
|
236
246
|
'new.supabase.q.useExisting.orgSelect': 'Which organization is the project in?',
|
|
237
247
|
'new.supabase.q.useExisting.projectSelect': 'Which existing Supabase project do you want to use?',
|
|
238
248
|
'new.supabase.projectsRequired': 'No projects found in this organization.',
|
|
@@ -273,9 +283,9 @@ module.exports = {
|
|
|
273
283
|
'new.q.backend.supabase.desc': 'SQL database (PostgreSQL) with more control',
|
|
274
284
|
'new.q.backend.api.desc': 'You already have your own backend server',
|
|
275
285
|
|
|
276
|
-
'new.q.mode': 'How do you want to
|
|
277
|
-
'new.q.mode.quick': '⚡ Quick
|
|
278
|
-
'new.q.mode.advanced': '🛠
|
|
286
|
+
'new.q.mode': 'How do you want to create the app?',
|
|
287
|
+
'new.q.mode.quick': '⚡ Quick (recommended): everything ready, zero config',
|
|
288
|
+
'new.q.mode.advanced': '🛠 Step by step: pick every detail',
|
|
279
289
|
|
|
280
290
|
'new.q.preset': 'Which features to include?',
|
|
281
291
|
'new.q.preset.starter': '⚡ Starter — analytics + crash reports + onboarding',
|
|
@@ -288,6 +298,40 @@ module.exports = {
|
|
|
288
298
|
'new.firebase.success.deployStep': '• Deploy backend (from inside the project folder):',
|
|
289
299
|
|
|
290
300
|
'cli.command.deploy.description': 'Publish the server to Firebase or Supabase',
|
|
301
|
+
'cli.command.configure.description': 'Configure optional keys (RevenueCat, Sentry, Mixpanel...) — skippable, picks up where you left off',
|
|
302
|
+
'configure.title': 'App credential setup',
|
|
303
|
+
'configure.notKasyProject': 'This folder is not a Kasy project (no pubspec.yaml). Cd into the project and run again.',
|
|
304
|
+
'configure.alreadyFilled': 'Already configured ({count}):',
|
|
305
|
+
'configure.toFill': 'Missing ({count}):',
|
|
306
|
+
'configure.skipHint': 'Press Enter without typing to skip any key. Run `kasy configure` again when you have the credential.',
|
|
307
|
+
'configure.skipPlaceholder': '(leave empty to skip)',
|
|
308
|
+
'configure.saved': 'Saved to {path} ({count} key(s) filled)',
|
|
309
|
+
'configure.stillPending': '{count} key(s) still pending.',
|
|
310
|
+
'configure.runAgainHint': 'Run `kasy configure` again once you have the keys.',
|
|
311
|
+
'configure.allDone': 'All set! You can run the app without missing credentials.',
|
|
312
|
+
'configure.allSkipped': 'No keys filled this time. Run again when ready.',
|
|
313
|
+
'configure.outroSaved': '{count} key(s) updated in .env',
|
|
314
|
+
'configure.outroNoChange': 'No changes to .env',
|
|
315
|
+
'configure.aborted': 'Cancelled. Nothing was written.',
|
|
316
|
+
'configure.section.appStore': 'App Store',
|
|
317
|
+
'configure.section.sentry': 'Sentry (Crash Reports)',
|
|
318
|
+
'configure.section.mixpanel': 'Mixpanel (Analytics)',
|
|
319
|
+
'configure.section.revenuecat': 'RevenueCat (Subscriptions)',
|
|
320
|
+
'configure.section.facebook': 'Facebook (Login + Ads)',
|
|
321
|
+
'configure.section.llmChat': 'AI Chat (LLM)',
|
|
322
|
+
'configure.savedFacebook': 'Facebook credentials written to Info.plist and strings.xml.',
|
|
323
|
+
'configure.facebookPlistMissing': 'ios/Runner/Info.plist not found — Facebook iOS was not updated.',
|
|
324
|
+
'configure.facebookStringsMissing': 'android/.../strings.xml not found — Facebook Android was not updated.',
|
|
325
|
+
'configure.facebookNeedsAppId': 'Facebook credentials need an App ID. Run `kasy configure` again and provide the App ID.',
|
|
326
|
+
'configure.noOptionalFeatures': 'This project has no optional features that need credentials.',
|
|
327
|
+
'configure.statusSummary': '{filled} already configured, {pending} pending',
|
|
328
|
+
'configure.alreadyDone': 'all set',
|
|
329
|
+
'configure.alreadyFilledShort': 'already configured',
|
|
330
|
+
'configure.savedEnv': '{count} key(s) saved to .env',
|
|
331
|
+
'configure.savedFnEnv': '{count} key(s) saved to functions/.env',
|
|
332
|
+
'configure.settingSecrets': 'Setting {count} Firebase Secret(s)…',
|
|
333
|
+
'configure.savedSecrets': '{count} Firebase Secret(s) set',
|
|
334
|
+
'configure.secretFailed': 'Could not set secret {key}. Run manually: firebase functions:secrets:set {key}',
|
|
291
335
|
'cli.command.check.description': 'Check push notifications setup (use --fix to fix it)',
|
|
292
336
|
'deploy.q.project': 'Firebase Project ID:',
|
|
293
337
|
'deploy.q.serviceAccount': 'Path to service account JSON:',
|
|
@@ -419,8 +463,15 @@ module.exports = {
|
|
|
419
463
|
|
|
420
464
|
'doctor.revenuecat.title': 'RevenueCat',
|
|
421
465
|
'doctor.revenuecat.keysOk': 'API keys configured (iOS + Android)',
|
|
422
|
-
'doctor.revenuecat.keysEmpty': '
|
|
423
|
-
'doctor.revenuecat.
|
|
466
|
+
'doctor.revenuecat.keysEmpty': 'No keys configured — set at least RC_TEST_KEY in .env (kasy run uses it on simulator/emulator)',
|
|
467
|
+
'doctor.revenuecat.testKeyOk': 'RC_TEST_KEY configured (test_) — used on simulator/emulator',
|
|
468
|
+
'doctor.revenuecat.testKeyMissing': 'RC_TEST_KEY missing — subscription flow will not work on simulator/emulator',
|
|
469
|
+
'doctor.revenuecat.iosProdOk': 'RC_IOS_PROD_KEY configured (appl_) — used on physical iPhone',
|
|
470
|
+
'doctor.revenuecat.iosProdMissing': 'RC_IOS_PROD_KEY missing — kasy run on physical iPhone will fall back to the test key',
|
|
471
|
+
'doctor.revenuecat.androidProdOk': 'RC_ANDROID_PROD_KEY configured (goog_) — used on physical Android',
|
|
472
|
+
'doctor.revenuecat.androidProdMissing': 'RC_ANDROID_PROD_KEY missing — kasy run on physical Android will fall back to the test key',
|
|
473
|
+
'doctor.revenuecat.prefixMismatch': 'Key has wrong prefix: {key} should start with {expected}',
|
|
474
|
+
'doctor.revenuecat.keysTest': 'Only Test Store keys (test_) configured — store releases require appl_/goog_, otherwise the app crashes',
|
|
424
475
|
'doctor.revenuecat.webhookUrlSupabase': 'Webhook URL (paste in RevenueCat → Integrations → Webhooks)',
|
|
425
476
|
'doctor.revenuecat.webhookUrlFirebase': 'Webhook URL: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
|
|
426
477
|
|
|
@@ -488,6 +539,14 @@ module.exports = {
|
|
|
488
539
|
'new.firebase.q.revenuecat.webhookKey.hint': 'Save this value. In RevenueCat dashboard, paste as: Bearer <this-value>',
|
|
489
540
|
'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (for Ads Conversions API, optional)',
|
|
490
541
|
'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (optional)',
|
|
542
|
+
'new.firebase.q.revenuecat.test': 'Test Store key (test_xxx) — optional, works for both iOS+Android and runs in the simulator',
|
|
543
|
+
'new.firebase.q.revenuecat.test.invalid': 'Test Store key must start with test_ (e.g. test_xxxxxxxxxxxxxxxxxxxx).',
|
|
544
|
+
'new.firebase.q.revenuecat.iosProd': 'iOS production key (appl_xxx) — optional, used only on physical iPhone',
|
|
545
|
+
'new.firebase.q.revenuecat.iosProd.invalid': 'iOS production key must start with appl_ (e.g. appl_xxxxxxxxxxxxxxx).',
|
|
546
|
+
'new.firebase.q.revenuecat.androidProd': 'Android production key (goog_xxx) — optional, used only on physical Android',
|
|
547
|
+
'new.firebase.q.revenuecat.androidProd.invalid': 'Android production key must start with goog_ (e.g. goog_xxxxxxxxxxxxxxx).',
|
|
548
|
+
'new.firebase.q.revenuecat.atLeastOne': 'Configure at least one key (Test, iOS prod or Android prod). You can add the others later in .env.',
|
|
549
|
+
// Legacy keys — kept for projects/scripts that still reference them.
|
|
491
550
|
'new.firebase.q.revenuecat.android': 'RevenueCat API key for Android',
|
|
492
551
|
'new.firebase.q.revenuecat.ios': 'RevenueCat API key for iOS',
|
|
493
552
|
'new.firebase.q.paywall': 'Which paywall style?',
|
|
@@ -614,13 +673,20 @@ module.exports = {
|
|
|
614
673
|
'new.outdated.upgradeNow': 'Upgrade to the latest version before creating? (requires active subscription)',
|
|
615
674
|
'new.outdated.upgraded': 'kasy updated! Run kasy new again.',
|
|
616
675
|
'new.success.title': 'Project created successfully!',
|
|
676
|
+
'new.success.featuresInstalled': 'Features enabled:',
|
|
617
677
|
'new.success.nextSteps': 'Next steps:',
|
|
618
678
|
'new.success.step.cd': 'Go to your project folder:',
|
|
619
|
-
'new.success.step.deploy': '
|
|
679
|
+
'new.success.step.deploy': 'Push the server to Firebase (DB + functions):',
|
|
680
|
+
'new.success.step.configure': 'Configure optional keys when you have them (RevenueCat, Sentry, etc.):',
|
|
681
|
+
'new.success.step.docs': 'Documentation:',
|
|
620
682
|
'new.success.step.run': 'Run your app (with your configured keys):',
|
|
621
683
|
'new.success.step.run.vscode': '(or F5 in VS Code)',
|
|
622
684
|
'new.success.step.console': 'Open your backend console:',
|
|
623
685
|
'new.fcm.generating': 'Generating push notifications key (Firebase Service Account)…',
|
|
686
|
+
'new.google.enabling': 'Enabling Google Sign-In…',
|
|
687
|
+
'new.google.refreshConfigs': 'Updating google-services.json and GoogleService-Info.plist with Google Client IDs…',
|
|
688
|
+
'new.google.manualHint': 'Google Sign-In: enable manually in the Console (Google provider):',
|
|
689
|
+
'new.google.manualHint.noEmail': 'Google Sign-In: could not detect a support email (gcloud has no account). Enable manually in the Console:',
|
|
624
690
|
'new.sha1.registering': 'Registering SHA-1 for Google Sign-In (Android)…',
|
|
625
691
|
'new.sha1.failed': 'SHA-1 not added automatically: {error}',
|
|
626
692
|
'new.sha1.manual': 'Add it manually so Google Sign-In works on Android:',
|
|
@@ -639,7 +705,8 @@ module.exports = {
|
|
|
639
705
|
'new.apns.warning': '⚠ iOS Push: configure the APNs Key in Firebase Console',
|
|
640
706
|
'new.apns.step1': '1. Apple Developer Portal → Keys → create APNs Key (.p8)',
|
|
641
707
|
'new.apns.step2': '2. Firebase Console → Cloud Messaging → iOS app → upload APNs Key',
|
|
642
|
-
'new.
|
|
708
|
+
'new.apns.hint': 'iOS Push (APNs Key) is only needed once you publish for iOS. Step-by-step: https://kasy.dev/docs/apns',
|
|
709
|
+
'new.firebase.create.estimatedTime': '(3–5 min — needs stable internet, do not close the terminal)',
|
|
643
710
|
'new.internet.warning': '📶 Make sure you have a stable internet connection — this step requires network access.',
|
|
644
711
|
|
|
645
712
|
// run command
|
|
@@ -661,6 +728,13 @@ module.exports = {
|
|
|
661
728
|
'run.stage.buildSuccess': 'Build done — launching app…',
|
|
662
729
|
'run.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
|
|
663
730
|
'run.error.flutterNotFound': 'Flutter not found. Make sure Flutter is installed and on your PATH.',
|
|
731
|
+
'run.rc.usingTest': 'RevenueCat: using test key (test_) — simulator/emulator',
|
|
732
|
+
'run.rc.usingProd': 'RevenueCat: using production keys — physical device',
|
|
733
|
+
'run.rc.fallbackToTest': 'RevenueCat: production key missing ({platform}) — falling back to test_; set RC_{var} in .env to test real in-app purchases',
|
|
734
|
+
'run.rc.forcedTest': 'RevenueCat: --rc=test forced',
|
|
735
|
+
'run.rc.forcedProd': 'RevenueCat: --rc=prod forced',
|
|
736
|
+
'run.rc.forcedProdMissing': 'RevenueCat: --rc=prod requested but RC_IOS_PROD_KEY/RC_ANDROID_PROD_KEY not set in .env',
|
|
737
|
+
'run.log.savedTo': 'Full output at {path} (handy to paste into AI/assistant)',
|
|
664
738
|
|
|
665
739
|
// reset command
|
|
666
740
|
'cli.command.reset.description': 'Uninstall the app on a simulator/emulator/device so you can test as a fresh install',
|
|
@@ -840,6 +914,10 @@ module.exports = {
|
|
|
840
914
|
'add.cancelled': 'Cancelled.',
|
|
841
915
|
'add.prompt.sentryDsn': 'Sentry DSN (leave blank to configure later):',
|
|
842
916
|
'add.prompt.mixpanelToken': 'Mixpanel Token (leave blank to configure later):',
|
|
917
|
+
'add.prompt.rcTestKey': 'Test Store key (test_xxx) — optional, works for both iOS+Android and on simulator:',
|
|
918
|
+
'add.prompt.rcIosProdKey': 'iOS production key (appl_xxx) — optional, only on physical device:',
|
|
919
|
+
'add.prompt.rcAndroidProdKey': 'Android production key (goog_xxx) — optional, only on physical device:',
|
|
920
|
+
// Legacy keys — kept for compatibility with old scripts.
|
|
843
921
|
'add.prompt.rcAndroidKey': 'RevenueCat Android API key (leave blank to configure later):',
|
|
844
922
|
'add.prompt.rcIosKey': 'RevenueCat iOS API key (leave blank to configure later):',
|
|
845
923
|
'add.note.facebook': 'Add your Facebook App ID and token in .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
|
|
@@ -79,6 +79,9 @@ module.exports = {
|
|
|
79
79
|
'doctor.title': 'Kasy Doctor',
|
|
80
80
|
'doctor.baseEnvironment': 'Entorno base',
|
|
81
81
|
'doctor.optionalBackend': 'Herramientas opcionales de backend',
|
|
82
|
+
'doctor.gcpBilling.title': 'Google Cloud Billing (Firebase Blaze)',
|
|
83
|
+
'doctor.gcpBilling.found': '{count} cuenta(s) de facturación activa(s):',
|
|
84
|
+
'doctor.gcpBilling.missing': 'No se encontró ninguna cuenta de facturación. Crea una antes de ejecutar `kasy new` con Firebase:',
|
|
82
85
|
'doctor.requiredMissing': 'Faltan dependencias obligatorias. Corrige los errores anteriores y ejecuta doctor nuevamente.',
|
|
83
86
|
'doctor.requiredPassed': '✓ Verificaciones obligatorias de entorno aprobadas.',
|
|
84
87
|
'modules.backends': 'Backends disponibles:',
|
|
@@ -196,6 +199,10 @@ module.exports = {
|
|
|
196
199
|
'new.firebase.create.success': 'Proyecto Firebase creado correctamente.',
|
|
197
200
|
'new.firebase.create.failed': 'No se pudo crear el proyecto',
|
|
198
201
|
'new.firebase.create.gcloudRequired': 'gcloud CLI es obligatorio para "crear desde cero". Sin él, el flujo completo de Firebase no puede ejecutarse.',
|
|
202
|
+
'new.firebase.billing.required': 'Aún no tienes una cuenta de facturación en Google Cloud. Firebase necesita el plan Blaze para usar Storage y Cloud Functions.',
|
|
203
|
+
'new.firebase.billing.create.steps': 'Abriendo la página de creación de cuenta de facturación. Crea la cuenta (tarjeta de crédito requerida, sin cargos dentro de la cuota gratuita) y vuelve aquí:',
|
|
204
|
+
'new.firebase.billing.created.ready': 'Ya creé la cuenta de facturación, ¿puedo continuar?',
|
|
205
|
+
'new.firebase.billing.stillMissing': 'No se encontró ninguna cuenta de facturación activa. Termina la configuración en la consola y ejecuta `kasy new` nuevamente.',
|
|
199
206
|
'new.firebase.create.installTitle': 'Para instalar gcloud CLI, ejecuta:',
|
|
200
207
|
'new.firebase.create.installCommand': 'Comando',
|
|
201
208
|
'new.firebase.create.installAfter': 'Luego inicia sesión',
|
|
@@ -212,6 +219,8 @@ module.exports = {
|
|
|
212
219
|
'new.firebase.q.organization': '¿En qué organización GCP crear el proyecto?',
|
|
213
220
|
'new.firebase.q.organization.none': 'Sin organización (cuenta personal / proyecto independiente)',
|
|
214
221
|
'new.firebase.q.organization.hint': 'Organizaciones vinculadas a tu cuenta gcloud',
|
|
222
|
+
'new.firebase.create.billingWait': 'Esperando propagación de la facturación…',
|
|
223
|
+
'new.firebase.create.billingQuotaError': 'No se pudo vincular la facturación (cuota de la cuenta alcanzada o propagación aún no finalizada).',
|
|
215
224
|
'new.firebase.create.billingRetry.title': 'Vincula la facturación manualmente (cuota excedida o error de billing):',
|
|
216
225
|
'new.firebase.create.billingRetry.hint': 'Consejo: El límite es 3 proyectos por cuenta de facturación. Elimina proyectos no usados en el enlace de arriba. Si acabas de eliminar uno, espera 2–5 min a que se propague el cambio y reintenta.',
|
|
217
226
|
'new.firebase.create.billingRetry.ready': 'He vinculado la facturación. ¿Reintentar?',
|
|
@@ -235,6 +244,7 @@ module.exports = {
|
|
|
235
244
|
'new.supabase.loginHint': 'Ejecuta: supabase login. Luego ingresa la URL y clave de tu proyecto existente.',
|
|
236
245
|
'new.supabase.setup': 'Vinculando proyecto y desplegando…',
|
|
237
246
|
'new.supabase.setupManual': 'Ejecuta manualmente: supabase link, supabase db push, supabase functions deploy',
|
|
247
|
+
'new.supabase.passwordSaved': 'Contraseña de la base generada y guardada en .kasy/supabase.json (gitignored).',
|
|
238
248
|
'new.supabase.q.useExisting.orgSelect': '¿En qué organización está el proyecto?',
|
|
239
249
|
'new.supabase.q.useExisting.projectSelect': '¿Qué proyecto Supabase existente quieres usar?',
|
|
240
250
|
'new.supabase.projectsRequired': 'No se encontraron proyectos en esta organización.',
|
|
@@ -275,9 +285,9 @@ module.exports = {
|
|
|
275
285
|
'new.q.backend.supabase.desc': 'Base de datos SQL (PostgreSQL) con más control',
|
|
276
286
|
'new.q.backend.api.desc': 'Ya tienes tu propio servidor',
|
|
277
287
|
|
|
278
|
-
'new.q.mode': '¿Como quieres
|
|
279
|
-
'new.q.mode.quick': '⚡ Rápido
|
|
280
|
-
'new.q.mode.advanced': '🛠
|
|
288
|
+
'new.q.mode': '¿Como quieres crear la app?',
|
|
289
|
+
'new.q.mode.quick': '⚡ Rápido (recomendado): todo listo, cero configuración',
|
|
290
|
+
'new.q.mode.advanced': '🛠 Paso a paso: elegir cada detalle',
|
|
281
291
|
|
|
282
292
|
'new.q.preset': '¿Qué features incluir?',
|
|
283
293
|
'new.q.preset.starter': '⚡ Starter — analytics + errores + onboarding',
|
|
@@ -290,6 +300,40 @@ module.exports = {
|
|
|
290
300
|
'new.firebase.success.deployStep': '• Desplegar backend (desde dentro de la carpeta del proyecto):',
|
|
291
301
|
|
|
292
302
|
'cli.command.deploy.description': 'Publica el servidor en Firebase o Supabase',
|
|
303
|
+
'cli.command.configure.description': 'Configura claves opcionales (RevenueCat, Sentry, Mixpanel...) — puede omitir, recuerda lo que falta',
|
|
304
|
+
'configure.title': 'Configuración de claves del app',
|
|
305
|
+
'configure.notKasyProject': 'Esta carpeta no es un proyecto Kasy (no se encontró pubspec.yaml). Entra en la carpeta del proyecto y ejecuta de nuevo.',
|
|
306
|
+
'configure.alreadyFilled': 'Ya configurado ({count}):',
|
|
307
|
+
'configure.toFill': 'Falta configurar ({count}):',
|
|
308
|
+
'configure.skipHint': 'Pulsa Enter sin escribir nada para omitir cualquier clave. Ejecuta `kasy configure` de nuevo cuando tengas la credencial.',
|
|
309
|
+
'configure.skipPlaceholder': '(vacío para omitir)',
|
|
310
|
+
'configure.saved': 'Guardado en {path} ({count} clave(s) completada(s))',
|
|
311
|
+
'configure.stillPending': '{count} clave(s) todavía pendiente(s).',
|
|
312
|
+
'configure.runAgainHint': 'Ejecuta `kasy configure` de nuevo cuando tengas las claves.',
|
|
313
|
+
'configure.allDone': '¡Todo listo! Puedes ejecutar la app sin pendientes de credenciales.',
|
|
314
|
+
'configure.allSkipped': 'Ninguna clave completada ahora. Ejecuta de nuevo cuando estés listo.',
|
|
315
|
+
'configure.outroSaved': '{count} clave(s) actualizada(s) en .env',
|
|
316
|
+
'configure.outroNoChange': 'Sin cambios en .env',
|
|
317
|
+
'configure.aborted': 'Cancelado. Nada fue guardado.',
|
|
318
|
+
'configure.section.appStore': 'App Store',
|
|
319
|
+
'configure.section.sentry': 'Sentry (Crash Reports)',
|
|
320
|
+
'configure.section.mixpanel': 'Mixpanel (Analytics)',
|
|
321
|
+
'configure.section.revenuecat': 'RevenueCat (Suscripciones)',
|
|
322
|
+
'configure.section.facebook': 'Facebook (Login + Ads)',
|
|
323
|
+
'configure.section.llmChat': 'AI Chat (LLM)',
|
|
324
|
+
'configure.savedFacebook': 'Credenciales de Facebook escritas en Info.plist y strings.xml.',
|
|
325
|
+
'configure.facebookPlistMissing': 'ios/Runner/Info.plist no encontrado — Facebook iOS no fue actualizado.',
|
|
326
|
+
'configure.facebookStringsMissing': 'android/.../strings.xml no encontrado — Facebook Android no fue actualizado.',
|
|
327
|
+
'configure.facebookNeedsAppId': 'Las credenciales de Facebook requieren un App ID. Ejecuta `kasy configure` de nuevo y proporciona el App ID.',
|
|
328
|
+
'configure.noOptionalFeatures': 'Este proyecto no tiene features opcionales que requieran credenciales.',
|
|
329
|
+
'configure.statusSummary': '{filled} ya configurada(s), {pending} pendiente(s)',
|
|
330
|
+
'configure.alreadyDone': 'todo listo',
|
|
331
|
+
'configure.alreadyFilledShort': 'ya configurada',
|
|
332
|
+
'configure.savedEnv': '{count} clave(s) guardada(s) en .env',
|
|
333
|
+
'configure.savedFnEnv': '{count} clave(s) guardada(s) en functions/.env',
|
|
334
|
+
'configure.settingSecrets': 'Guardando {count} Firebase Secret(s)…',
|
|
335
|
+
'configure.savedSecrets': '{count} Firebase Secret(s) guardado(s)',
|
|
336
|
+
'configure.secretFailed': 'No pude guardar el secret {key}. Ejecuta manualmente: firebase functions:secrets:set {key}',
|
|
293
337
|
'cli.command.check.description': 'Verifica si las notificaciones push están configuradas (usa --fix para arreglar)',
|
|
294
338
|
'deploy.q.project': 'Firebase Project ID:',
|
|
295
339
|
'deploy.q.serviceAccount': 'Ruta al service account JSON:',
|
|
@@ -421,8 +465,15 @@ module.exports = {
|
|
|
421
465
|
|
|
422
466
|
'doctor.revenuecat.title': 'RevenueCat',
|
|
423
467
|
'doctor.revenuecat.keysOk': 'Claves de API configuradas (iOS + Android)',
|
|
424
|
-
'doctor.revenuecat.keysEmpty': '
|
|
425
|
-
'doctor.revenuecat.
|
|
468
|
+
'doctor.revenuecat.keysEmpty': 'Ninguna clave configurada — define al menos RC_TEST_KEY en .env (kasy run la usa en simulador/emulador)',
|
|
469
|
+
'doctor.revenuecat.testKeyOk': 'RC_TEST_KEY configurada (test_) — usada en simulador/emulador',
|
|
470
|
+
'doctor.revenuecat.testKeyMissing': 'RC_TEST_KEY ausente — el flujo de suscripción no funciona en simulador/emulador',
|
|
471
|
+
'doctor.revenuecat.iosProdOk': 'RC_IOS_PROD_KEY configurada (appl_) — usada en iPhone físico',
|
|
472
|
+
'doctor.revenuecat.iosProdMissing': 'RC_IOS_PROD_KEY ausente — kasy run en iPhone físico va a usar la clave de prueba',
|
|
473
|
+
'doctor.revenuecat.androidProdOk': 'RC_ANDROID_PROD_KEY configurada (goog_) — usada en Android físico',
|
|
474
|
+
'doctor.revenuecat.androidProdMissing': 'RC_ANDROID_PROD_KEY ausente — kasy run en Android físico va a usar la clave de prueba',
|
|
475
|
+
'doctor.revenuecat.prefixMismatch': 'Clave con prefijo incorrecto: {key} debe empezar con {expected}',
|
|
476
|
+
'doctor.revenuecat.keysTest': 'Solo claves Test Store (test_) configuradas — los releases en la tienda requieren appl_/goog_, sino el app crashea',
|
|
426
477
|
'doctor.revenuecat.webhookUrlSupabase': 'URL del webhook (pega en RevenueCat → Integrations → Webhooks)',
|
|
427
478
|
'doctor.revenuecat.webhookUrlFirebase': 'URL del webhook: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
|
|
428
479
|
|
|
@@ -488,6 +539,14 @@ module.exports = {
|
|
|
488
539
|
'new.firebase.q.revenuecat.webhookKey.hint': 'Guarda este valor. En el panel RevenueCat, pega como: Bearer <este-valor>',
|
|
489
540
|
'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
|
|
490
541
|
'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (opcional)',
|
|
542
|
+
'new.firebase.q.revenuecat.test': 'Clave Test Store (test_xxx) — opcional, sirve para iOS+Android y funciona en simulador',
|
|
543
|
+
'new.firebase.q.revenuecat.test.invalid': 'Clave Test Store debe empezar con test_ (ej: test_xxxxxxxxxxxxxxxxxxxx).',
|
|
544
|
+
'new.firebase.q.revenuecat.iosProd': 'Clave iOS de producción (appl_xxx) — opcional, se usa solo en dispositivo físico',
|
|
545
|
+
'new.firebase.q.revenuecat.iosProd.invalid': 'Clave iOS de producción debe empezar con appl_ (ej: appl_xxxxxxxxxxxxxxx).',
|
|
546
|
+
'new.firebase.q.revenuecat.androidProd': 'Clave Android de producción (goog_xxx) — opcional, se usa solo en dispositivo físico',
|
|
547
|
+
'new.firebase.q.revenuecat.androidProd.invalid': 'Clave Android de producción debe empezar con goog_ (ej: goog_xxxxxxxxxxxxxxx).',
|
|
548
|
+
'new.firebase.q.revenuecat.atLeastOne': 'Configura al menos una clave (Test, iOS prod o Android prod). Puedes agregar las demás después en .env.',
|
|
549
|
+
// Legacy keys — kept for projects/scripts that still reference them.
|
|
491
550
|
'new.firebase.q.revenuecat.android': 'Clave API RevenueCat para Android',
|
|
492
551
|
'new.firebase.q.revenuecat.ios': 'Clave API RevenueCat para iOS',
|
|
493
552
|
'new.firebase.q.paywall': '¿Qué estilo de paywall?',
|
|
@@ -614,13 +673,20 @@ module.exports = {
|
|
|
614
673
|
'new.outdated.upgradeNow': '¿Actualizar a la última versión antes de crear? (requiere suscripción activa)',
|
|
615
674
|
'new.outdated.upgraded': '¡kasy actualizado! Ejecuta kasy new nuevamente.',
|
|
616
675
|
'new.success.title': '¡Proyecto creado con exito!',
|
|
676
|
+
'new.success.featuresInstalled': 'Recursos activados:',
|
|
617
677
|
'new.success.nextSteps': 'Proximos pasos:',
|
|
618
678
|
'new.success.step.cd': 'Ve a la carpeta del proyecto:',
|
|
619
|
-
'new.success.step.deploy': '
|
|
679
|
+
'new.success.step.deploy': 'Sube el servidor a Firebase (DB + funciones):',
|
|
680
|
+
'new.success.step.configure': 'Configura claves opcionales cuando las tengas (RevenueCat, Sentry, etc.):',
|
|
681
|
+
'new.success.step.docs': 'Documentación:',
|
|
620
682
|
'new.success.step.run': 'Ejecuta el app (con tus claves configuradas):',
|
|
621
683
|
'new.success.step.run.vscode': '(o F5 en VS Code)',
|
|
622
684
|
'new.success.step.console': 'Abre la consola del backend:',
|
|
623
685
|
'new.fcm.generating': 'Generando clave de Service Account FCM…',
|
|
686
|
+
'new.google.enabling': 'Activando Inicio de sesión con Google…',
|
|
687
|
+
'new.google.refreshConfigs': 'Actualizando google-services.json y GoogleService-Info.plist con los Client IDs de Google…',
|
|
688
|
+
'new.google.manualHint': 'Inicio de sesión con Google: actívalo manualmente en la consola (proveedor Google):',
|
|
689
|
+
'new.google.manualHint.noEmail': 'Inicio de sesión con Google: no detecté un email de soporte (gcloud sin cuenta). Actívalo manualmente en la consola:',
|
|
624
690
|
'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
|
|
625
691
|
'new.sha1.failed': 'SHA-1 no añadido automaticamente: {error}',
|
|
626
692
|
'new.sha1.manual': 'Agregalo manualmente para que Google Sign-In funcione en Android:',
|
|
@@ -639,7 +705,8 @@ module.exports = {
|
|
|
639
705
|
'new.apns.warning': '⚠ Push iOS: configura la APNs Key en Firebase Console',
|
|
640
706
|
'new.apns.step1': '1. Apple Developer Portal → Keys → crear APNs Key (.p8)',
|
|
641
707
|
'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → subir la APNs Key',
|
|
642
|
-
'new.
|
|
708
|
+
'new.apns.hint': 'Push para iOS (APNs Key) solo se necesita cuando publiques para iOS. Paso a paso: https://kasy.dev/docs/apns',
|
|
709
|
+
'new.firebase.create.estimatedTime': '(3-5 min — requiere internet estable, no cierres la terminal)',
|
|
643
710
|
'new.internet.warning': '📶 Asegúrate de tener una conexión a internet estable — este paso requiere red.',
|
|
644
711
|
|
|
645
712
|
// run command
|
|
@@ -694,6 +761,13 @@ module.exports = {
|
|
|
694
761
|
'run.stage.buildSuccess': 'Build listo — abriendo la app…',
|
|
695
762
|
'run.error.notFlutterProject': 'No se encontro pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
|
|
696
763
|
'run.error.flutterNotFound': 'Flutter no encontrado. Verifica que Flutter este instalado y en el PATH.',
|
|
764
|
+
'run.rc.usingTest': 'RevenueCat: usando clave de prueba (test_) — simulador/emulador',
|
|
765
|
+
'run.rc.usingProd': 'RevenueCat: usando claves de producción — dispositivo físico',
|
|
766
|
+
'run.rc.fallbackToTest': 'RevenueCat: clave de producción ausente ({platform}) — usando test_; configura RC_{var} en .env para probar in-app purchase real',
|
|
767
|
+
'run.rc.forcedTest': 'RevenueCat: --rc=test forzado',
|
|
768
|
+
'run.rc.forcedProd': 'RevenueCat: --rc=prod forzado',
|
|
769
|
+
'run.rc.forcedProdMissing': 'RevenueCat: --rc=prod pedido pero RC_IOS_PROD_KEY/RC_ANDROID_PROD_KEY no configuradas en .env',
|
|
770
|
+
'run.log.savedTo': 'Salida completa en {path} (útil para pegar en IA/asistente)',
|
|
697
771
|
|
|
698
772
|
// doctor project checks
|
|
699
773
|
'doctor.project.title': 'Proyecto',
|
|
@@ -838,6 +912,10 @@ module.exports = {
|
|
|
838
912
|
'add.cancelled': 'Cancelado.',
|
|
839
913
|
'add.prompt.sentryDsn': 'Sentry DSN (deja en blanco para configurar después):',
|
|
840
914
|
'add.prompt.mixpanelToken': 'Mixpanel Token (deja en blanco para configurar después):',
|
|
915
|
+
'add.prompt.rcTestKey': 'Clave Test Store (test_xxx) — opcional, sirve para iOS+Android y simulador:',
|
|
916
|
+
'add.prompt.rcIosProdKey': 'Clave iOS de producción (appl_xxx) — opcional, solo en dispositivo físico:',
|
|
917
|
+
'add.prompt.rcAndroidProdKey': 'Clave Android de producción (goog_xxx) — opcional, solo en dispositivo físico:',
|
|
918
|
+
// Legacy keys — kept for compatibility with old scripts.
|
|
841
919
|
'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deja en blanco para configurar después):',
|
|
842
920
|
'add.prompt.rcIosKey': 'RevenueCat iOS API key (deja en blanco para configurar después):',
|
|
843
921
|
'add.note.facebook': 'Agrega tu Facebook App ID y token en .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
|
|
@@ -79,6 +79,9 @@ module.exports = {
|
|
|
79
79
|
'doctor.title': 'Kasy Doctor',
|
|
80
80
|
'doctor.baseEnvironment': 'Ambiente base',
|
|
81
81
|
'doctor.optionalBackend': 'Ferramentas opcionais de backend',
|
|
82
|
+
'doctor.gcpBilling.title': 'Google Cloud Billing (Firebase Blaze)',
|
|
83
|
+
'doctor.gcpBilling.found': '{count} conta(s) de faturamento ativa(s):',
|
|
84
|
+
'doctor.gcpBilling.missing': 'Nenhuma conta de faturamento encontrada. Crie uma antes de rodar `kasy new` com Firebase:',
|
|
82
85
|
'doctor.requiredMissing': 'Dependencias obrigatórias ausentes. Corrija os erros acima e execute o doctor novamente.',
|
|
83
86
|
'doctor.requiredPassed': '✓ Verificações obrigatórias de ambiente aprovadas.',
|
|
84
87
|
'modules.backends': 'Backends disponíveis:',
|
|
@@ -196,6 +199,10 @@ module.exports = {
|
|
|
196
199
|
'new.firebase.create.success': 'Projeto Firebase criado com sucesso.',
|
|
197
200
|
'new.firebase.create.failed': 'Não foi possível criar o projeto',
|
|
198
201
|
'new.firebase.create.gcloudRequired': 'gcloud CLI é obrigatório para "criar do zero". Sem ele, o fluxo completo do Firebase não pode rodar.',
|
|
202
|
+
'new.firebase.billing.required': 'Você ainda não tem uma conta de faturamento no Google Cloud. O Firebase precisa do plano Blaze para usar Storage e Cloud Functions.',
|
|
203
|
+
'new.firebase.billing.create.steps': 'Vou abrir a página de criação de conta de faturamento. Crie a conta (cartão de crédito, sem cobrança até bater a cota gratuita) e volte aqui:',
|
|
204
|
+
'new.firebase.billing.created.ready': 'Já criei a conta de faturamento, pode seguir?',
|
|
205
|
+
'new.firebase.billing.stillMissing': 'Ainda não encontrei nenhuma conta de faturamento ativa. Finalize a criação no Console e rode `kasy new` novamente.',
|
|
199
206
|
'new.firebase.create.installTitle': 'Para instalar o gcloud CLI, execute:',
|
|
200
207
|
'new.firebase.create.installCommand': 'Comando',
|
|
201
208
|
'new.firebase.create.installAfter': 'Depois faca login',
|
|
@@ -212,6 +219,8 @@ module.exports = {
|
|
|
212
219
|
'new.firebase.q.organization': 'Em qual organização GCP criar o projeto?',
|
|
213
220
|
'new.firebase.q.organization.none': 'Sem organização (conta pessoal / projeto avulso)',
|
|
214
221
|
'new.firebase.q.organization.hint': 'Organizações vinculadas à sua conta gcloud',
|
|
222
|
+
'new.firebase.create.billingWait': 'Aguardando propagação do faturamento…',
|
|
223
|
+
'new.firebase.create.billingQuotaError': 'Não foi possível vincular o faturamento (cota da conta atingida ou propagação ainda não concluída).',
|
|
215
224
|
'new.firebase.create.billingRetry.title': 'Vincule o faturamento manualmente (cota excedida ou erro de billing):',
|
|
216
225
|
'new.firebase.create.billingRetry.hint': 'Dica: O limite é 3 projetos por conta de faturamento. Remova projetos não usados no link acima. Se acabou de remover um, espere 2–5 min para a alteração propagar e tente novamente.',
|
|
217
226
|
'new.firebase.create.billingRetry.ready': 'Vinculei o faturamento. Tentar novamente?',
|
|
@@ -233,6 +242,7 @@ module.exports = {
|
|
|
233
242
|
'new.supabase.loginHint': 'Execute: supabase login. Depois informe a URL e chave do seu projeto existente.',
|
|
234
243
|
'new.supabase.setup': 'Vinculando projeto e publicando…',
|
|
235
244
|
'new.supabase.setupManual': 'Execute manualmente: supabase link, supabase db push, supabase functions deploy',
|
|
245
|
+
'new.supabase.passwordSaved': 'Senha do banco gerada automaticamente e salva em .kasy/supabase.json (gitignorado).',
|
|
236
246
|
'new.supabase.q.useExisting.orgSelect': 'Em qual organização está o projeto?',
|
|
237
247
|
'new.supabase.q.useExisting.projectSelect': 'Qual projeto Supabase existente deseja usar?',
|
|
238
248
|
'new.supabase.projectsRequired': 'Nenhum projeto encontrado nesta organização.',
|
|
@@ -273,9 +283,9 @@ module.exports = {
|
|
|
273
283
|
'new.q.backend.supabase.desc': 'Banco SQL (PostgreSQL) com mais controle',
|
|
274
284
|
'new.q.backend.api.desc': 'Você já tem seu próprio servidor',
|
|
275
285
|
|
|
276
|
-
'new.q.mode': 'Como quer
|
|
277
|
-
'new.q.mode.quick': '⚡
|
|
278
|
-
'new.q.mode.advanced': '🛠
|
|
286
|
+
'new.q.mode': 'Como quer criar o app?',
|
|
287
|
+
'new.q.mode.quick': '⚡ Rápido (recomendado): tudo pronto, zero configuração',
|
|
288
|
+
'new.q.mode.advanced': '🛠 Passo a passo: escolher cada detalhe',
|
|
279
289
|
|
|
280
290
|
'new.q.preset': 'Quais features incluir?',
|
|
281
291
|
'new.q.preset.starter': '⚡ Starter — analytics + erros + onboarding',
|
|
@@ -288,6 +298,40 @@ module.exports = {
|
|
|
288
298
|
'new.firebase.success.deployStep': '• Deploy do backend (de dentro da pasta do projeto):',
|
|
289
299
|
|
|
290
300
|
'cli.command.deploy.description': 'Publica o servidor no Firebase ou Supabase',
|
|
301
|
+
'cli.command.configure.description': 'Configura chaves opcionais (RevenueCat, Sentry, Mixpanel...) — pode pular, lembra do que falta',
|
|
302
|
+
'configure.title': 'Configuração de chaves do app',
|
|
303
|
+
'configure.notKasyProject': 'Esta pasta não parece um projeto Kasy (não encontrei pubspec.yaml). Entre na pasta do projeto e rode novamente.',
|
|
304
|
+
'configure.alreadyFilled': 'Já configurado ({count}):',
|
|
305
|
+
'configure.toFill': 'Falta configurar ({count}):',
|
|
306
|
+
'configure.skipHint': 'Pressione Enter sem digitar nada pra pular qualquer chave. Rode `kasy configure` de novo quando tiver a credencial.',
|
|
307
|
+
'configure.skipPlaceholder': '(deixe vazio pra pular)',
|
|
308
|
+
'configure.saved': 'Salvo em {path} ({count} chave(s) preenchida(s))',
|
|
309
|
+
'configure.stillPending': 'Restam {count} chave(s) pendente(s).',
|
|
310
|
+
'configure.runAgainHint': 'Rode `kasy configure` novamente quando tiver as chaves.',
|
|
311
|
+
'configure.allDone': 'Tudo configurado! Você pode rodar o app sem pendências de credenciais.',
|
|
312
|
+
'configure.allSkipped': 'Nenhuma chave preenchida agora. Rode novamente quando estiver pronto.',
|
|
313
|
+
'configure.outroSaved': '{count} chave(s) atualizada(s) no .env',
|
|
314
|
+
'configure.outroNoChange': 'Nenhuma alteração no .env',
|
|
315
|
+
'configure.aborted': 'Cancelado. Nada foi gravado.',
|
|
316
|
+
'configure.section.appStore': 'App Store',
|
|
317
|
+
'configure.section.sentry': 'Sentry (Crash Reports)',
|
|
318
|
+
'configure.section.mixpanel': 'Mixpanel (Analytics)',
|
|
319
|
+
'configure.section.revenuecat': 'RevenueCat (Assinaturas)',
|
|
320
|
+
'configure.section.facebook': 'Facebook (Login + Ads)',
|
|
321
|
+
'configure.section.llmChat': 'AI Chat (LLM)',
|
|
322
|
+
'configure.savedFacebook': 'Credenciais do Facebook gravadas em Info.plist e strings.xml.',
|
|
323
|
+
'configure.facebookPlistMissing': 'ios/Runner/Info.plist não encontrado — Facebook iOS não foi atualizado.',
|
|
324
|
+
'configure.facebookStringsMissing': 'android/.../strings.xml não encontrado — Facebook Android não foi atualizado.',
|
|
325
|
+
'configure.facebookNeedsAppId': 'Pra salvar credenciais do Facebook, precisa do App ID. Rode `kasy configure` novamente e preencha o App ID.',
|
|
326
|
+
'configure.noOptionalFeatures': 'Esse projeto não tem features opcionais que precisem de credenciais.',
|
|
327
|
+
'configure.statusSummary': '{filled} já configurada(s), {pending} pendente(s)',
|
|
328
|
+
'configure.alreadyDone': 'tudo certo',
|
|
329
|
+
'configure.alreadyFilledShort': 'já configurada',
|
|
330
|
+
'configure.savedEnv': '{count} chave(s) salva(s) no .env',
|
|
331
|
+
'configure.savedFnEnv': '{count} chave(s) salva(s) em functions/.env',
|
|
332
|
+
'configure.settingSecrets': 'Gravando {count} Firebase Secret(s)…',
|
|
333
|
+
'configure.savedSecrets': '{count} Firebase Secret(s) gravado(s)',
|
|
334
|
+
'configure.secretFailed': 'Não consegui gravar o secret {key}. Rode manualmente: firebase functions:secrets:set {key}',
|
|
291
335
|
'cli.command.check.description': 'Confere se as notificações push estão configuradas (use --fix para corrigir)',
|
|
292
336
|
'deploy.q.project': 'Firebase Project ID:',
|
|
293
337
|
'deploy.q.serviceAccount': 'Caminho para o service account JSON:',
|
|
@@ -419,8 +463,15 @@ module.exports = {
|
|
|
419
463
|
|
|
420
464
|
'doctor.revenuecat.title': 'RevenueCat',
|
|
421
465
|
'doctor.revenuecat.keysOk': 'Chaves de API configuradas (iOS + Android)',
|
|
422
|
-
'doctor.revenuecat.keysEmpty': '
|
|
423
|
-
'doctor.revenuecat.
|
|
466
|
+
'doctor.revenuecat.keysEmpty': 'Nenhuma chave configurada — defina pelo menos RC_TEST_KEY no .env (kasy run usa em simulador/emulador)',
|
|
467
|
+
'doctor.revenuecat.testKeyOk': 'RC_TEST_KEY configurada (test_) — usada em simulador/emulador',
|
|
468
|
+
'doctor.revenuecat.testKeyMissing': 'RC_TEST_KEY ausente — fluxo de assinatura não funciona em simulador/emulador',
|
|
469
|
+
'doctor.revenuecat.iosProdOk': 'RC_IOS_PROD_KEY configurada (appl_) — usada em iPhone físico',
|
|
470
|
+
'doctor.revenuecat.iosProdMissing': 'RC_IOS_PROD_KEY ausente — kasy run em iPhone físico vai usar a chave de teste',
|
|
471
|
+
'doctor.revenuecat.androidProdOk': 'RC_ANDROID_PROD_KEY configurada (goog_) — usada em Android físico',
|
|
472
|
+
'doctor.revenuecat.androidProdMissing': 'RC_ANDROID_PROD_KEY ausente — kasy run em Android físico vai usar a chave de teste',
|
|
473
|
+
'doctor.revenuecat.prefixMismatch': 'Chave com prefixo errado: {key} deveria começar com {expected}',
|
|
474
|
+
'doctor.revenuecat.keysTest': 'Apenas chaves Test Store (test_) configuradas — releases na loja exigem appl_/goog_, senão o app crasha',
|
|
424
475
|
'doctor.revenuecat.webhookUrlSupabase': 'URL do webhook (cole no RevenueCat → Integrations → Webhooks)',
|
|
425
476
|
'doctor.revenuecat.webhookUrlFirebase': 'URL do webhook: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
|
|
426
477
|
|
|
@@ -488,6 +539,14 @@ module.exports = {
|
|
|
488
539
|
'new.firebase.q.revenuecat.webhookKey.hint': 'Salve esse valor. No painel RevenueCat, cole como: Bearer <esse-valor>',
|
|
489
540
|
'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (Conversions API, opcional)',
|
|
490
541
|
'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (opcional)',
|
|
542
|
+
'new.firebase.q.revenuecat.test': 'Chave Test Store (test_xxx) — opcional, serve pra iOS+Android e funciona em simulador',
|
|
543
|
+
'new.firebase.q.revenuecat.test.invalid': 'Chave Test Store deve começar com test_ (ex: test_xxxxxxxxxxxxxxxxxxxx).',
|
|
544
|
+
'new.firebase.q.revenuecat.iosProd': 'Chave iOS de produção (appl_xxx) — opcional, usada só em dispositivo físico',
|
|
545
|
+
'new.firebase.q.revenuecat.iosProd.invalid': 'Chave iOS de produção deve começar com appl_ (ex: appl_xxxxxxxxxxxxxxx).',
|
|
546
|
+
'new.firebase.q.revenuecat.androidProd': 'Chave Android de produção (goog_xxx) — opcional, usada só em dispositivo físico',
|
|
547
|
+
'new.firebase.q.revenuecat.androidProd.invalid': 'Chave Android de produção deve começar com goog_ (ex: goog_xxxxxxxxxxxxxxx).',
|
|
548
|
+
'new.firebase.q.revenuecat.atLeastOne': 'Configure pelo menos uma chave (Test, iOS prod ou Android prod). Você pode adicionar as outras depois no .env.',
|
|
549
|
+
// Legacy keys — kept for projects/scripts that still reference them.
|
|
491
550
|
'new.firebase.q.revenuecat.android': 'Chave de API RevenueCat para Android',
|
|
492
551
|
'new.firebase.q.revenuecat.ios': 'Chave de API RevenueCat para iOS',
|
|
493
552
|
'new.firebase.q.paywall': 'Qual estilo de paywall?',
|
|
@@ -614,13 +673,20 @@ module.exports = {
|
|
|
614
673
|
'new.outdated.upgradeNow': 'Atualizar antes de criar? (requer assinatura ativa)',
|
|
615
674
|
'new.outdated.upgraded': 'kasy atualizado! Rode kasy new novamente.',
|
|
616
675
|
'new.success.title': 'Projeto criado com sucesso!',
|
|
676
|
+
'new.success.featuresInstalled': 'Recursos ativados:',
|
|
617
677
|
'new.success.nextSteps': 'Proximos passos:',
|
|
618
678
|
'new.success.step.cd': 'Entre na pasta do projeto:',
|
|
619
|
-
'new.success.step.deploy': '
|
|
620
|
-
'new.success.step.
|
|
679
|
+
'new.success.step.deploy': 'Suba o servidor pro Firebase (banco + funções):',
|
|
680
|
+
'new.success.step.configure': 'Configure chaves opcionais quando tiver (RevenueCat, Sentry, etc.):',
|
|
681
|
+
'new.success.step.run': 'Rode o app:',
|
|
621
682
|
'new.success.step.run.vscode': '(ou F5 no VS Code)',
|
|
622
683
|
'new.success.step.console': 'Abra o console do backend:',
|
|
684
|
+
'new.success.step.docs': 'Documentação:',
|
|
623
685
|
'new.fcm.generating': 'Gerando chave de Service Account FCM…',
|
|
686
|
+
'new.google.enabling': 'Ativando login com Google…',
|
|
687
|
+
'new.google.refreshConfigs': 'Atualizando google-services.json e GoogleService-Info.plist com Client IDs do Google…',
|
|
688
|
+
'new.google.manualHint': 'Login com Google: ative manualmente no Console (provedor Google):',
|
|
689
|
+
'new.google.manualHint.noEmail': 'Login com Google: não consegui detectar um e-mail de suporte (gcloud sem conta). Ative manualmente no Console:',
|
|
624
690
|
'new.sha1.registering': 'Registrando SHA-1 para Google Sign-In (Android)…',
|
|
625
691
|
'new.sha1.failed': 'SHA-1 não adicionado automaticamente: {error}',
|
|
626
692
|
'new.sha1.manual': 'Adicione manualmente para o Google Sign-In funcionar no Android:',
|
|
@@ -639,7 +705,8 @@ module.exports = {
|
|
|
639
705
|
'new.apns.warning': '⚠ Push iOS: configure a APNs Key no Firebase Console',
|
|
640
706
|
'new.apns.step1': '1. Apple Developer Portal → Keys → criar APNs Key (.p8)',
|
|
641
707
|
'new.apns.step2': '2. Firebase Console → Cloud Messaging → app iOS → fazer upload da APNs Key',
|
|
642
|
-
'new.
|
|
708
|
+
'new.apns.hint': 'Push pra iOS (APNs Key) só funciona depois que você publicar pra iOS. Passo a passo: https://kasy.dev/docs/apns',
|
|
709
|
+
'new.firebase.create.estimatedTime': '(3-5 min — precisa de internet estável, não feche o terminal)',
|
|
643
710
|
'new.internet.warning': '📶 Verifique se você está com uma internet estável — esta etapa precisa de conexão.',
|
|
644
711
|
|
|
645
712
|
// run command
|
|
@@ -694,6 +761,13 @@ module.exports = {
|
|
|
694
761
|
'run.stage.buildSuccess': 'Build pronto — abrindo o app…',
|
|
695
762
|
'run.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
|
|
696
763
|
'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
|
|
764
|
+
'run.rc.usingTest': 'RevenueCat: usando chave de teste (test_) — simulador/emulador',
|
|
765
|
+
'run.rc.usingProd': 'RevenueCat: usando chaves de produção — dispositivo físico',
|
|
766
|
+
'run.rc.fallbackToTest': 'RevenueCat: chave de produção ausente ({platform}) — caindo para test_; configure RC_{var} no .env para testar in-app purchase real',
|
|
767
|
+
'run.rc.forcedTest': 'RevenueCat: --rc=test forçado',
|
|
768
|
+
'run.rc.forcedProd': 'RevenueCat: --rc=prod forçado',
|
|
769
|
+
'run.rc.forcedProdMissing': 'RevenueCat: --rc=prod pedido mas RC_IOS_PROD_KEY/RC_ANDROID_PROD_KEY não configuradas no .env',
|
|
770
|
+
'run.log.savedTo': 'Saída completa em {path} (útil para colar em IA/assistente)',
|
|
697
771
|
|
|
698
772
|
// doctor project checks
|
|
699
773
|
'doctor.project.title': 'Projeto',
|
|
@@ -838,6 +912,10 @@ module.exports = {
|
|
|
838
912
|
'add.cancelled': 'Cancelado.',
|
|
839
913
|
'add.prompt.sentryDsn': 'Sentry DSN (deixe em branco para configurar depois):',
|
|
840
914
|
'add.prompt.mixpanelToken': 'Mixpanel Token (deixe em branco para configurar depois):',
|
|
915
|
+
'add.prompt.rcTestKey': 'Chave Test Store (test_xxx) — opcional, serve pra iOS+Android e simulador:',
|
|
916
|
+
'add.prompt.rcIosProdKey': 'Chave iOS de produção (appl_xxx) — opcional, só em dispositivo físico:',
|
|
917
|
+
'add.prompt.rcAndroidProdKey': 'Chave Android de produção (goog_xxx) — opcional, só em dispositivo físico:',
|
|
918
|
+
// Legacy keys — kept for compatibility with old scripts.
|
|
841
919
|
'add.prompt.rcAndroidKey': 'RevenueCat Android API key (deixe em branco para configurar depois):',
|
|
842
920
|
'add.prompt.rcIosKey': 'RevenueCat iOS API key (deixe em branco para configurar depois):',
|
|
843
921
|
'add.note.facebook': 'Adicione seu Facebook App ID e token no .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
|