kasy-cli 1.14.0 → 1.16.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 +18 -5
- package/lib/commands/icon.js +29 -1
- package/lib/commands/ios.js +8 -2
- package/lib/commands/reset.js +100 -2
- package/lib/commands/run.js +61 -2
- package/lib/commands/splash.js +11 -0
- package/lib/scaffold/backends/api/pubspec.yaml.tpl +4 -2
- package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +4 -2
- package/lib/utils/apple-release.js +30 -0
- package/lib/utils/checks.js +41 -2
- package/lib/utils/debug.js +75 -0
- package/lib/utils/friendly-error.js +91 -0
- package/lib/utils/i18n/messages-en.js +977 -0
- package/lib/utils/i18n/messages-es.js +975 -0
- package/lib/utils/i18n/messages-pt.js +975 -0
- package/lib/utils/i18n.js +21 -2818
- package/lib/utils/png-padding.js +252 -0
- package/package.json +8 -3
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +12 -11
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.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/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.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-mdpi/android12splash.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-xxhdpi/android12splash.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-xhdpi/android12splash.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.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/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.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/ic_launcher_background.png +0 -0
- package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png +0 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +18 -11
- package/templates/firebase/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +9 -0
- package/templates/firebase/assets/images/icon_android.png +0 -0
- package/templates/firebase/assets/images/icon_foreground_empty.png +0 -0
- package/templates/firebase/assets/images/splash_logo_dark_android12.png +0 -0
- package/templates/firebase/assets/images/splash_logo_light_android12.png +0 -0
- package/templates/firebase/lib/components/components.dart +1 -0
- package/templates/firebase/lib/components/kasy_avatar.dart +88 -57
- package/templates/firebase/lib/components/kasy_avatar_presets.dart +116 -74
- package/templates/firebase/lib/components/kasy_tabs.dart +431 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +12 -6
- package/templates/firebase/lib/features/home/home_components_page.dart +1 -1
- package/templates/firebase/lib/features/home/home_components_preview_registry.dart +316 -93
- package/templates/firebase/pubspec.yaml +4 -2
- package/templates/firebase/web/index.html +9 -0
|
@@ -0,0 +1,977 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Kasy CLI i18n messages — English.
|
|
5
|
+
*
|
|
6
|
+
* One entry per user-facing string. Keys are dotted paths describing
|
|
7
|
+
* where the string is used (cli.help.*, run.*, ios.*, etc.).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
module.exports = {
|
|
11
|
+
'cli.tagline': 'Create mobile apps without setup pain',
|
|
12
|
+
'cli.description': 'Build Flutter apps without setup pain.',
|
|
13
|
+
'cli.usage': '<command> [arguments]',
|
|
14
|
+
'cli.option.version': 'Show installed version',
|
|
15
|
+
'cli.option.lang': 'Language (en, pt, es)',
|
|
16
|
+
'cli.help.afterError': '(run with --help for usage details)',
|
|
17
|
+
'cli.help.more': 'Run "{command}" for details about a specific command.',
|
|
18
|
+
'cli.help.quickStart': 'Quick start - create a new app:',
|
|
19
|
+
'cli.help.optionDescription': 'Show help for command',
|
|
20
|
+
'cli.help.commandDescription': 'Show help for command',
|
|
21
|
+
'cli.help.inline.options': '[options]',
|
|
22
|
+
'cli.help.heading.usage': 'Usage',
|
|
23
|
+
'cli.help.heading.arguments': 'Arguments',
|
|
24
|
+
'cli.help.heading.options': 'Options',
|
|
25
|
+
'cli.help.heading.globalOptions': 'Global Options',
|
|
26
|
+
'cli.help.heading.commands': 'Commands',
|
|
27
|
+
'cli.help.group.start': 'Get started',
|
|
28
|
+
'cli.help.group.work': 'Work on your app',
|
|
29
|
+
'cli.help.group.publish': 'Publish & test',
|
|
30
|
+
'cli.help.group.maintenance': 'Kasy CLI maintenance',
|
|
31
|
+
'cli.help.group.advanced': 'Advanced',
|
|
32
|
+
'cli.help.group.other': 'Other',
|
|
33
|
+
'cli.help.tip': 'Tip: run `kasy <command> --help` for details. Use --lang pt|en|es to switch language.',
|
|
34
|
+
'cli.command.setup.description': '(advanced) Set up an existing Flutter project',
|
|
35
|
+
'cli.command.new.description': 'Create a new app (e.g.: kasy new my-app)',
|
|
36
|
+
'cli.command.new.projectName': 'project name',
|
|
37
|
+
'cli.command.new.projectNameArg': 'Project folder name',
|
|
38
|
+
'prompt.projectName.enter': "What's your project name?",
|
|
39
|
+
'prompt.projectName.required': 'Project name is required.',
|
|
40
|
+
'prompt.projectName.default': 'my_app',
|
|
41
|
+
'cli.command.setup.directoryName': 'directory',
|
|
42
|
+
'cli.command.setup.directoryArg': 'Target directory (default: current folder .)',
|
|
43
|
+
'cli.command.setup.langName': 'lang',
|
|
44
|
+
'cli.command.setup.langOption': 'Prompt language (en, pt, es)',
|
|
45
|
+
'cli.command.setup.backendOption': 'Backend adapter (firebase, supabase, api)',
|
|
46
|
+
'cli.command.setup.featuresOption': 'Comma separated optional features (web,widget,llm_chat,revenuecat,ci)',
|
|
47
|
+
'cli.command.help.paramName': 'command',
|
|
48
|
+
'cli.command.doctor.description': 'Check if your computer is ready to run Kasy',
|
|
49
|
+
'cli.command.modules.description': 'Show what comes included and what you can add',
|
|
50
|
+
'cli.command.validate.description': '(advanced) Validate backend + feature combinations',
|
|
51
|
+
'cli.command.validate.analyzeOnlyOption': 'Run flutter analyze only (skip builds)',
|
|
52
|
+
'cli.command.version.description': 'Show the installed Kasy version',
|
|
53
|
+
'cli.command.upgrade.description': 'Update the Kasy CLI to the latest version',
|
|
54
|
+
'cli.command.uninstall.description': 'Uninstall Kasy from this computer',
|
|
55
|
+
'cli.command.upgrade.running': 'Updating kasy CLI...',
|
|
56
|
+
'cli.command.upgrade.done': 'kasy updated successfully!',
|
|
57
|
+
'cli.command.uninstall.running': 'Uninstalling kasy CLI...',
|
|
58
|
+
'cli.command.uninstall.done': 'kasy uninstalled. Goodbye!',
|
|
59
|
+
'new.checks.environment': 'Environment checks',
|
|
60
|
+
'new.checks.environment.checking': 'Checking environment',
|
|
61
|
+
'new.checks.environment.done': 'Environment ready',
|
|
62
|
+
'setup.checks.backend.checking': 'Checking {backend} tools',
|
|
63
|
+
'setup.checks.backend.done': '{backend} tools ready',
|
|
64
|
+
'new.checks.firebaseForPush': 'Note: Firebase CLI is required for push notifications (Firebase Cloud Messaging / FCM) on all backends.',
|
|
65
|
+
'new.checks.requiredBlock': 'Required tools are missing. Install them to continue.',
|
|
66
|
+
'new.checks.installFirebase': 'Firebase: npm i -g firebase-tools && firebase login. FlutterFire: dart pub global activate flutterfire_cli',
|
|
67
|
+
'new.checks.installSupabase': 'Supabase: npm i -g supabase (or brew install supabase/tap/supabase) && supabase login',
|
|
68
|
+
'new.checks.installSupabase.darwin': 'Supabase: brew install supabase/tap/supabase && supabase login (or npm i -g supabase)',
|
|
69
|
+
'new.checks.installSupabase.win32': 'Supabase: npm i -g supabase && supabase login',
|
|
70
|
+
'new.checks.installSupabase.linux': 'Supabase: npm i -g supabase && supabase login',
|
|
71
|
+
'setup.checks.environment': 'Environment checks',
|
|
72
|
+
'setup.checks.prepareFirebase': 'Firebase tooling (push, remote config)',
|
|
73
|
+
'setup.checks.backend': 'Backend checks ({backend})',
|
|
74
|
+
'setup.firebase.installing': 'Installing Firebase CLI...',
|
|
75
|
+
'setup.supabase.installing': 'Installing Supabase CLI...',
|
|
76
|
+
'setup.flutterfire.installing': 'Installing FlutterFire CLI...',
|
|
77
|
+
'setup.warn.hang': 'If setup stalls, run manually: flutterfire --version',
|
|
78
|
+
'setup.warn.supabase': 'Using Supabase or custom API? Firebase still helps with push notifications and remote config.',
|
|
79
|
+
'doctor.title': 'Kasy Doctor',
|
|
80
|
+
'doctor.baseEnvironment': 'Base environment',
|
|
81
|
+
'doctor.optionalBackend': 'Optional backend tooling',
|
|
82
|
+
'doctor.requiredMissing': 'Missing required dependencies. Fix the errors above and rerun doctor.',
|
|
83
|
+
'doctor.requiredPassed': '✓ Required environment checks passed.',
|
|
84
|
+
'modules.backends': 'Available backends:',
|
|
85
|
+
'modules.featuresBase': 'Always included:',
|
|
86
|
+
'modules.features': 'Optional features:',
|
|
87
|
+
'modules.tag.firebaseOnly': 'Firebase only',
|
|
88
|
+
'modules.tag.requiresDb': 'requires Firebase or Supabase',
|
|
89
|
+
'modules.tag.enhances': 'enables {target}',
|
|
90
|
+
'modules.hint.subscriptionNoRc': 'Tip: Subscriptions screen is included but inactive. Run `kasy add revenuecat` to enable real payments.',
|
|
91
|
+
'modules.feature.base.authentication.description': 'Sign up, login and account management',
|
|
92
|
+
'modules.feature.base.home.description': 'Main app screen after login',
|
|
93
|
+
'modules.feature.base.settings.description': 'Theme, language, account and preferences',
|
|
94
|
+
'modules.feature.base.notifications.description': 'Push notifications via Firebase Cloud Messaging (works with any backend)',
|
|
95
|
+
'modules.feature.base.subscription.description': 'Premium subscription screen and data model (add RevenueCat to enable real payments)',
|
|
96
|
+
'modules.backend.firebase.description': 'Firebase backend adapter',
|
|
97
|
+
'modules.backend.supabase.description': 'Supabase backend adapter',
|
|
98
|
+
'modules.backend.api.description': 'REST/GraphQL API backend adapter',
|
|
99
|
+
'modules.feature.sentry.description': 'Sentry error tracking and crash reporting',
|
|
100
|
+
'modules.feature.analytics.description': 'Analytics event tracking (Firebase Analytics)',
|
|
101
|
+
'modules.feature.facebook.description': 'Facebook Login and Meta Ads event tracking (always bundled together)',
|
|
102
|
+
'modules.feature.revenuecat.description': 'Enables real in-app payments on the Subscriptions screen',
|
|
103
|
+
'modules.feature.onboarding.description': 'Welcome flow shown on first launch',
|
|
104
|
+
'modules.feature.web.description': 'Web/PWA support',
|
|
105
|
+
'modules.feature.widget.description': 'iOS/Android home screen widget integration',
|
|
106
|
+
'modules.feature.llm_chat.description': 'AI chat screen with OpenAI or Gemini',
|
|
107
|
+
'modules.feature.feedback.description': 'In-app feature requests and voting',
|
|
108
|
+
'modules.feature.local_notifications.description': 'Local reminders scheduled by the user (no server required)',
|
|
109
|
+
'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publish to stores)',
|
|
110
|
+
'checks.checking': 'Checking {name}...',
|
|
111
|
+
'checks.found': '{name} found',
|
|
112
|
+
'checks.foundWithVersion': '{name} ready ({version})',
|
|
113
|
+
'checks.missing': '{name} missing',
|
|
114
|
+
'checks.notFound': '{name} not found',
|
|
115
|
+
'checks.notFound.short': 'not found',
|
|
116
|
+
'checks.runHint': 'Run',
|
|
117
|
+
'checks.stillMissing': 'still not detected',
|
|
118
|
+
'checks.flutter.warn': 'Flutter SDK not found. Install Flutter to build and run apps: https://docs.flutter.dev/get-started/install',
|
|
119
|
+
'checks.install.failed': 'auto-install failed — run the command manually',
|
|
120
|
+
'checks.waitPrompt.gcloud.install': 'After installing gcloud, press Enter to check again',
|
|
121
|
+
'checks.waitPrompt.gcloud.auth': 'After running gcloud auth login, press Enter to check again',
|
|
122
|
+
'error.hint.notFlutterProject': 'You\'re not inside a Flutter project. Try `kasy new` to create one, or cd into an existing one.',
|
|
123
|
+
'error.hint.flutterMissing': 'Flutter is not installed or not on your PATH. Run `kasy doctor` to diagnose.',
|
|
124
|
+
'error.hint.permission': 'A file or folder is read-only. Check the parent directory permissions or try again from your home folder.',
|
|
125
|
+
'error.hint.noSpace': 'Disk is full. Free up space (Flutter/Xcode builds need 5-15 GB) and try again.',
|
|
126
|
+
'error.hint.network': 'Network problem — check your internet connection and try again.',
|
|
127
|
+
'error.hint.firebaseLogin': 'You are not logged into Firebase. Run: firebase login',
|
|
128
|
+
'error.hint.supabaseLogin': 'You are not logged into Supabase. Run: supabase login',
|
|
129
|
+
'error.hint.gcloudAuth': 'You need to authenticate with gcloud. Run: gcloud auth login',
|
|
130
|
+
'error.hint.flutterRunFailed': 'Flutter could not run the app. Run again with --verbose to see the full Flutter output.',
|
|
131
|
+
'checks.diagnostic.xcodeLicense': '{name} is installed, but Xcode needs the license accepted. Run: sudo xcodebuild -license',
|
|
132
|
+
'checks.diagnostic.xcodeCli': '{name} is installed, but Xcode Command Line Tools are missing. Run: xcode-select --install',
|
|
133
|
+
'banner.title': 'Kasy CLI · Flutter SaaS Generator',
|
|
134
|
+
'welcome.firstRun': 'Welcome to Kasy CLI!',
|
|
135
|
+
'welcome.chooseLanguage': 'First, choose your language:',
|
|
136
|
+
'prompt.language.select': 'Choose your language',
|
|
137
|
+
'prompt.cancelled': 'Command cancelled by user.',
|
|
138
|
+
'license.required': '🔑 License key required to use Kasy CLI',
|
|
139
|
+
'license.checking': 'Validating license key...',
|
|
140
|
+
'license.saved': '✅ License validated successfully',
|
|
141
|
+
'license.invalid': 'Invalid license key. Check your key or contact support at kasy.dev.',
|
|
142
|
+
'license.expired': '❌ Your license has expired. Renew at kasy.dev.',
|
|
143
|
+
'license.inactive': '❌ Your license has been deactivated. Contact support at kasy.dev.',
|
|
144
|
+
'license.offlineWarning': '⚠️ Could not reach license server — continuing offline.',
|
|
145
|
+
'license.subscriptionExpired': '❌ Your subscription has expired. Updates require an active plan. Renew at kasy.dev.\n Your existing projects still work — only updates are locked.',
|
|
146
|
+
'prompt.license.enter': '👉 Enter your license key (XXXX-XXXX-XXXX-XXXX)',
|
|
147
|
+
'prompt.license.invalid': 'Invalid format. Use XXXX-XXXX-XXXX-XXXX.',
|
|
148
|
+
'prompt.appName.enter': 'Enter the name of your app',
|
|
149
|
+
'prompt.appName.required': 'App name is required.',
|
|
150
|
+
'prompt.bundleId.enter': 'Enter the bundle ID (com.company.app)',
|
|
151
|
+
'prompt.bundleId.required': 'Bundle ID is required.',
|
|
152
|
+
'prompt.bundleId.invalid': 'Bundle ID must look like com.company.app.',
|
|
153
|
+
'prompt.backend.select': 'Select backend provider',
|
|
154
|
+
'prompt.features.select': 'Select optional features to include',
|
|
155
|
+
'prompt.features.instructions': 'Space to toggle, enter to confirm',
|
|
156
|
+
'prompt.multiselect.instructions': '\nInstructions:\n ↑/↓: Highlight option\n ←/→/[space]: Toggle selection\n a: Toggle all\n enter/return: Complete answer',
|
|
157
|
+
'prompt.multiselect.warnDisabled': 'Use ↓ to go to a selectable option, then Space to select, Enter to confirm',
|
|
158
|
+
'prompt.firebase.projectId.enter': 'Enter Firebase Project ID',
|
|
159
|
+
'prompt.firebase.projectId.required': 'Firebase Project ID is required.',
|
|
160
|
+
'prompt.supabase.url.enter': 'Enter Supabase URL',
|
|
161
|
+
'prompt.supabase.url.required': 'Supabase URL is required.',
|
|
162
|
+
'prompt.supabase.anonKey.enter': 'Enter Supabase anon key',
|
|
163
|
+
'prompt.supabase.anonKey.required': 'Supabase anon key is required.',
|
|
164
|
+
'new.supabase.q.create': 'Create new Supabase project or use existing?',
|
|
165
|
+
'new.supabase.q.create.create': '✨ Create new project (recommended for beginners)',
|
|
166
|
+
'new.supabase.q.create.existing': '📂 Use existing project',
|
|
167
|
+
'new.firebase.q.setupMode': 'How do you want to set up Firebase?',
|
|
168
|
+
'new.firebase.q.setupMode.push': 'Firebase project for push notifications (FCM):',
|
|
169
|
+
'new.firebase.q.setupMode.push.explain': 'Push notifications (FCM) require a Firebase project, even when your main backend is Supabase or API REST.',
|
|
170
|
+
'new.firebase.q.setupMode.create': '✨ Create from scratch (recommended for beginners)',
|
|
171
|
+
'new.firebase.q.setupMode.existing': '📂 Use existing project',
|
|
172
|
+
'new.firebase.q.region': 'Where are most of your app users located?',
|
|
173
|
+
'new.firebase.q.region.brazil': '🇧🇷 Brazil (São Paulo) — southamerica-east1',
|
|
174
|
+
'new.firebase.q.region.us': '🇺🇸 United States — us-central1',
|
|
175
|
+
'new.firebase.q.region.europe': '🇪🇺 Europe — europe-west1',
|
|
176
|
+
'new.firebase.q.region.global': '🌍 Global / Not sure — us-central1',
|
|
177
|
+
'new.firebase.create.prereq': 'You need: gcloud CLI (cloud.google.com/sdk) + gcloud auth login. Blaze plan required for deploy.',
|
|
178
|
+
'new.firebase.create.creating': 'Creating Firebase project…',
|
|
179
|
+
'new.firebase.create.includeWeb': 'Include Web app in Firebase? (for web platform)',
|
|
180
|
+
'new.firebase.create.nowDo': 'Now activate authentication (before running the app):',
|
|
181
|
+
'new.firebase.create.activateEmail': 'Enable Email/Password: Firebase Console → Authentication → Sign-in method',
|
|
182
|
+
'new.firebase.create.activateGoogle': 'Enable Google: same page, click Google → Enable',
|
|
183
|
+
'new.firebase.create.beforeContinue.title': 'Before continuing, enable in Firebase Console:',
|
|
184
|
+
'new.firebase.create.beforeContinue.step1': '1. Authentication → Sign-in method → Google (Email/Password and Anonymous were enabled automatically)',
|
|
185
|
+
'new.firebase.create.beforeContinue.step1.noAuth': '1. Authentication → Sign-in method → enable Email/Password, Anonymous and Google',
|
|
186
|
+
'new.firebase.create.beforeContinue.ready': 'I have enabled Google Sign-In. Continue?',
|
|
187
|
+
'new.firebase.create.beforeContinue.ready.noAuth': 'I have enabled Email/Password, Anonymous and Google Sign-In. Continue?',
|
|
188
|
+
'new.firebase.create.beforeContinue.secretManagerAuto': '(Secret Manager and Storage were enabled automatically)',
|
|
189
|
+
'new.firebase.create.sha1Skipped': 'SHA-1 not added',
|
|
190
|
+
'new.firebase.create.sha1ManualInstruction': 'Add SHA-1 manually: Firebase Console → Project settings → Your apps → Android → Add fingerprint',
|
|
191
|
+
'new.firebase.create.sha1ParseError': 'Could not parse SHA1 from keytool output',
|
|
192
|
+
'new.firebase.create.sha1ErrorDetail': 'Reason',
|
|
193
|
+
'new.firebase.create.useExistingHint': 'Project may have been created. Try "Use existing project" with ID: {id}',
|
|
194
|
+
'new.firebase.create.usingProjectId': 'Using project ID: {id} (continuing with existing project)',
|
|
195
|
+
'new.firebase.create.waitPropagate': 'Waiting for project propagation (20s)…',
|
|
196
|
+
'new.firebase.create.success': 'Firebase project created successfully.',
|
|
197
|
+
'new.firebase.create.failed': 'Could not create project',
|
|
198
|
+
'new.firebase.create.gcloudRequired': 'gcloud CLI is required for "create from scratch". Without it, the full Firebase flow cannot run.',
|
|
199
|
+
'new.firebase.create.installTitle': 'To install gcloud CLI, run:',
|
|
200
|
+
'new.firebase.create.installCommand': 'Command',
|
|
201
|
+
'new.firebase.create.installAfter': 'Then log in',
|
|
202
|
+
'new.firebase.create.installUrl': 'Or download from',
|
|
203
|
+
'new.firebase.create.authCommand': 'Run: gcloud auth login',
|
|
204
|
+
'new.firebase.create.fallbackHint': 'For now, enter an existing Firebase Project ID to continue (or install gcloud and run again):',
|
|
205
|
+
'new.firebase.q.billingAccount': 'Which billing account to link to the project?',
|
|
206
|
+
'new.firebase.q.billingAccount.hint': 'Choose the account with available quota (up to 3 projects per account)',
|
|
207
|
+
'new.firebase.q.billingAccount.context': 'Limit: up to 3 projects per billing account. Choose one with available quota (remove unused projects at console.cloud.google.com/billing if needed).',
|
|
208
|
+
'new.firebase.q.billingAccount.other': 'Other — enter billing account ID manually',
|
|
209
|
+
'new.firebase.q.billingAccount.manualId': 'Billing account ID (e.g. 018A70-7D0548-0F84A8)',
|
|
210
|
+
'new.firebase.q.billingAccount.manualId.hint': 'Find it at console.cloud.google.com/billing',
|
|
211
|
+
'new.firebase.q.billingAccount.manualId.required': 'Billing account ID is required.',
|
|
212
|
+
'new.firebase.q.organization': 'In which GCP organization should the project be created?',
|
|
213
|
+
'new.firebase.q.organization.none': 'No organization (personal account / standalone project)',
|
|
214
|
+
'new.firebase.q.organization.hint': 'Organizations linked to your gcloud account',
|
|
215
|
+
'new.firebase.create.billingRetry.title': 'Link billing manually (quota exceeded or billing error):',
|
|
216
|
+
'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
|
+
'new.firebase.create.billingRetry.ready': 'Linked billing. Retry setup?',
|
|
218
|
+
'new.firebase.create.billingRetry.retrying': 'Retrying setup…',
|
|
219
|
+
'new.firebase.create.billingRetry.exit': 'Run again with "Use existing project" after linking billing.',
|
|
220
|
+
'new.firebase.create.projectQuotaExceeded': 'Project quota exceeded (limit of projects per Google account). Delete unused projects at console.cloud.google.com or enter an existing project ID below.',
|
|
221
|
+
'new.supabase.q.orgSelect': 'Which organization to create the project in?',
|
|
222
|
+
'new.supabase.orgsRequired': 'No organizations found. Run supabase login and try again.',
|
|
223
|
+
'new.supabase.q.region': 'Where are most of your app users located?',
|
|
224
|
+
'new.supabase.q.region.brazil': '🇧🇷 Brazil (São Paulo) — sa-east-1',
|
|
225
|
+
'new.supabase.q.region.us': '🇺🇸 United States (Virginia) — us-east-1',
|
|
226
|
+
'new.supabase.q.region.europe': '🇪🇺 Europe (Ireland) — eu-west-1',
|
|
227
|
+
'new.supabase.q.region.global': '🌍 Global / Not sure — us-east-1',
|
|
228
|
+
'new.supabase.q.dbPassword': 'Database password (min 6 chars)',
|
|
229
|
+
'new.supabase.q.dbPassword.required': 'Password must be at least 6 characters.',
|
|
230
|
+
'new.supabase.creating': 'Creating project on Supabase…',
|
|
231
|
+
'new.supabase.created': 'Project created successfully.',
|
|
232
|
+
'new.supabase.createFailed': 'Could not create project',
|
|
233
|
+
'new.supabase.loginHint': 'Run: supabase login. Then enter your existing project URL and key below.',
|
|
234
|
+
'new.supabase.setup': 'Linking project and deploying…',
|
|
235
|
+
'new.supabase.setupManual': 'Run manually: supabase link, supabase db push, supabase functions deploy',
|
|
236
|
+
'new.supabase.q.useExisting.orgSelect': 'Which organization is the project in?',
|
|
237
|
+
'new.supabase.q.useExisting.projectSelect': 'Which existing Supabase project do you want to use?',
|
|
238
|
+
'new.supabase.projectsRequired': 'No projects found in this organization.',
|
|
239
|
+
'new.supabase.q.dbPassword.existing': 'Database password (required to link and apply migrations)',
|
|
240
|
+
'new.supabase.existingLinked': 'Project ready to link and apply migrations.',
|
|
241
|
+
'setup.license.loaded': '✓ License key loaded from local config.',
|
|
242
|
+
'setup.license.saved': '✓ License key validated and saved.',
|
|
243
|
+
'setup.license.invalid': 'Invalid license key format. Expected XXXX-XXXX-XXXX-XXXX.',
|
|
244
|
+
'setup.error.targetNotEmpty': 'Target directory is not empty: {path}',
|
|
245
|
+
'setup.error.targetExists': 'Target directory already exists: {path}',
|
|
246
|
+
'setup.error.coreMissing': 'Core template folder not found: {path}',
|
|
247
|
+
'setup.error.requiredChecksFailed': 'Required environment checks failed. Run `kasy doctor`.',
|
|
248
|
+
'setup.error.generatingFailed': 'Project generation failed.',
|
|
249
|
+
'setup.error.conflictHint': 'Tip: Remove the project folder and run again, or use an empty directory.',
|
|
250
|
+
'setup.spinner.generating': 'Generating project files...',
|
|
251
|
+
'setup.success.created': 'Project created successfully.',
|
|
252
|
+
'setup.success.complete': '✓ Setup complete',
|
|
253
|
+
'setup.success.location': 'Location',
|
|
254
|
+
'setup.success.nextSteps': 'Next steps',
|
|
255
|
+
'setup.success.stepPubGet': 'flutter pub get',
|
|
256
|
+
'setup.success.stepRun': 'flutter run',
|
|
257
|
+
'validate.title': 'Kasy Validate',
|
|
258
|
+
'validate.success': '✓ Validation matrix passed.',
|
|
259
|
+
'validate.failed': 'Validation matrix failed.',
|
|
260
|
+
'validate.error': 'One or more validation combinations failed.',
|
|
261
|
+
'validate.projectNotFound': 'Project not found',
|
|
262
|
+
'validate.ok': 'ok',
|
|
263
|
+
'validate.fail': 'fail',
|
|
264
|
+
'validate.passed': 'passed',
|
|
265
|
+
|
|
266
|
+
// ── New Firebase flow ─────────────────────────────────────────────────
|
|
267
|
+
'cli.command.firebase.description': '🔥 Create a complete Flutter app with Firebase (recommended)',
|
|
268
|
+
'new.banner': '✨ New Flutter app',
|
|
269
|
+
'new.subtitle': 'Choose backend: Firebase, Supabase or REST API.',
|
|
270
|
+
'new.subtitle2': '🔒 Setup runs on your machine with your credentials — no third-party access needed.',
|
|
271
|
+
'new.q.backend': 'Where do you want to store your app data?',
|
|
272
|
+
'new.q.backend.firebase.desc': 'Easiest to start — auth, database and storage included',
|
|
273
|
+
'new.q.backend.supabase.desc': 'SQL database (PostgreSQL) with more control',
|
|
274
|
+
'new.q.backend.api.desc': 'You already have your own backend server',
|
|
275
|
+
|
|
276
|
+
'new.q.mode': 'How do you want to configure?',
|
|
277
|
+
'new.q.mode.quick': '⚡ Quick — minimal questions, smart defaults',
|
|
278
|
+
'new.q.mode.advanced': '🛠 Advanced — all options and credentials now',
|
|
279
|
+
|
|
280
|
+
'new.q.preset': 'Which features to include?',
|
|
281
|
+
'new.q.preset.starter': '⚡ Starter — analytics + crash reports + onboarding',
|
|
282
|
+
'new.q.preset.saas': '💰 SaaS — subscriptions + analytics + onboarding + feedback',
|
|
283
|
+
'new.q.preset.content': '📱 Content — crash reports + analytics + onboarding + AI chat',
|
|
284
|
+
'new.q.preset.full': '🚀 Full — all features',
|
|
285
|
+
'new.q.preset.custom': '⚙️ Custom — choose features one by one',
|
|
286
|
+
'new.q.preset.none': '○ None — just the core',
|
|
287
|
+
|
|
288
|
+
'new.firebase.success.deployStep': '• Deploy backend (from inside the project folder):',
|
|
289
|
+
|
|
290
|
+
'cli.command.deploy.description': 'Publish the server to Firebase or Supabase',
|
|
291
|
+
'cli.command.check.description': 'Check push notifications setup (use --fix to fix it)',
|
|
292
|
+
'deploy.q.project': 'Firebase Project ID:',
|
|
293
|
+
'deploy.q.serviceAccount': 'Path to service account JSON:',
|
|
294
|
+
'deploy.detected.project': '✓ Firebase project detected:',
|
|
295
|
+
'deploy.detected.serviceAccount': '✓ Service account detected:',
|
|
296
|
+
'deploy.error.notProject': 'No firebase.json found in this directory. Run kasy deploy from inside the project folder.',
|
|
297
|
+
|
|
298
|
+
'cli.command.ios.description': 'Publish the app to the App Store (Mac needed)',
|
|
299
|
+
'cli.command.ios.configure.description': 'Configure Apple API credentials for local IPA upload',
|
|
300
|
+
'cli.command.ios.release.description': 'Bump build, create IPA, and upload to App Store Connect',
|
|
301
|
+
'cli.command.ios.build.description': 'Build IPA only (no upload)',
|
|
302
|
+
'cli.command.ios.clean.description': 'Clean Flutter/Xcode caches before a failed iOS build',
|
|
303
|
+
'cli.command.ios.picker.intro': 'Publish to the App Store',
|
|
304
|
+
'cli.command.ios.picker.message': 'What do you want to do?',
|
|
305
|
+
'cli.command.ios.help.before': 'How to publish to the App Store:\n 1) kasy ios configure → do this once (saves Apple credentials)\n 2) kasy ios release → run for each new version (build + upload)\n\nUse "build" to only generate the IPA, "clean" if a build fails.\n',
|
|
306
|
+
'cli.command.codemagic.description': 'Build the app in the cloud (no Mac needed)',
|
|
307
|
+
'cli.command.codemagic.configure.description': 'Configure Codemagic API credentials',
|
|
308
|
+
'cli.command.codemagic.release.description': 'Start a Codemagic iOS workflow build',
|
|
309
|
+
'cli.command.codemagic.status.description': 'Show Codemagic build status by ID',
|
|
310
|
+
'cli.command.codemagic.picker.intro': 'Build in the cloud with Codemagic',
|
|
311
|
+
'cli.command.codemagic.picker.message': 'What do you want to do?',
|
|
312
|
+
'cli.command.codemagic.picker.statusHint': 'Asks for the build ID',
|
|
313
|
+
'cli.command.codemagic.help.before': 'How to build with Codemagic (no Mac needed):\n 1) kasy codemagic configure → do this once (saves API token)\n 2) kasy codemagic release → starts a cloud build for each version\n\nUse "status <buildId>" to check the progress of a running build.\n',
|
|
314
|
+
|
|
315
|
+
'ios.configure.title': 'iOS App Store — setup',
|
|
316
|
+
'ios.configure.bundleId': 'Bundle ID',
|
|
317
|
+
'ios.configure.doc': 'Guide',
|
|
318
|
+
'ios.configure.openingLinks': 'Opening App Store Connect in your browser…',
|
|
319
|
+
'ios.configure.note.title': 'I will ask 3 things from App Store Connect',
|
|
320
|
+
'ios.configure.note.body': '1) API Key ID — under Users and Access → Keys.\n2) Issuer ID — at the top of the same page.\n3) The .p8 private key file you downloaded when creating the key.\n\nThe App ID is optional and only needed if you have multiple apps.',
|
|
321
|
+
'ios.configure.q.apiKey': 'App Store Connect API Key ID',
|
|
322
|
+
'ios.configure.q.issuerId': 'Issuer ID (UUID)',
|
|
323
|
+
'ios.configure.q.p8Path': 'Path to downloaded AuthKey_XXXXX.p8 file',
|
|
324
|
+
'ios.configure.q.appId': 'App Store Connect App ID (optional)',
|
|
325
|
+
'ios.configure.q.required': 'Required',
|
|
326
|
+
'ios.configure.q.p8NotFound': 'File not found',
|
|
327
|
+
'ios.configure.cancelled': 'Setup cancelled',
|
|
328
|
+
'ios.configure.success': 'Apple credentials saved',
|
|
329
|
+
'ios.configure.p8Installed': 'Private key installed at',
|
|
330
|
+
'ios.configure.next': 'Next',
|
|
331
|
+
'ios.release.title': 'Building and uploading iOS release…',
|
|
332
|
+
'ios.release.success': 'iOS release uploaded',
|
|
333
|
+
'ios.release.task.building': 'Building IPA (this can take 2-5 min)…',
|
|
334
|
+
'ios.release.task.uploading': 'Uploading IPA to App Store Connect…',
|
|
335
|
+
'ios.release.task.done': 'Build + upload finished',
|
|
336
|
+
'ios.release.task.failed': 'Build failed — see output below',
|
|
337
|
+
'ios.build.title': 'Building iOS IPA…',
|
|
338
|
+
'ios.build.success': 'IPA built',
|
|
339
|
+
'ios.build.task.building': 'Building IPA (this can take 2-5 min)…',
|
|
340
|
+
'ios.build.task.done': 'IPA built at build/ios/ipa/',
|
|
341
|
+
'ios.build.task.failed': 'Build failed — see output below',
|
|
342
|
+
'ios.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
|
|
343
|
+
'ios.error.noScript': 'scripts/release-ios.sh not found. Run: kasy update ios-release',
|
|
344
|
+
'ios.error.notMac': 'iOS release requires macOS with Xcode.',
|
|
345
|
+
'ios.error.useCodemagic': 'Use cloud release instead',
|
|
346
|
+
'ios.error.notConfigured': 'Apple credentials not configured',
|
|
347
|
+
'ios.error.runConfigure': 'Run: kasy ios configure',
|
|
348
|
+
'ios.release.askConfigure': 'Want to configure Apple credentials now?',
|
|
349
|
+
'ios.error.signing': 'iOS code signing is not configured (DEVELOPMENT_TEAM missing).',
|
|
350
|
+
'ios.error.signingHint': 'Open ios/Runner.xcworkspace in Xcode → Runner → Signing & Capabilities → select your Team.',
|
|
351
|
+
'ios.error.googleUrlScheme': 'Google Sign-In iOS URL scheme is not configured.',
|
|
352
|
+
'ios.error.googleUrlSchemeHint': 'Fix: run flutterfire configure, then kasy ios clean, or re-run project setup before building.',
|
|
353
|
+
'ios.warn.lowDisk': 'Low disk space ({gb} GB free; recommend at least {min} GB for Xcode builds).',
|
|
354
|
+
'ios.hints.title': 'Xcode cache may be corrupted — try:',
|
|
355
|
+
'ios.hints.closeXcode': 'Close Xcode completely',
|
|
356
|
+
'ios.hints.retry': 'Then retry',
|
|
357
|
+
'ios.hints.manual': 'Or manually',
|
|
358
|
+
'ios.hints.network.title': 'Network failure while downloading iOS dependencies',
|
|
359
|
+
'ios.hints.network.body': 'Your connection dropped while pod install was downloading libraries. This is usually temporary.',
|
|
360
|
+
'ios.hints.network.step1': 'Check that your internet is stable',
|
|
361
|
+
'ios.hints.network.step2': 'Try again',
|
|
362
|
+
'ios.hints.network.step3': 'If it keeps failing',
|
|
363
|
+
'ios.clean.title': 'Cleaning iOS build caches…',
|
|
364
|
+
'ios.clean.success': 'Caches cleaned',
|
|
365
|
+
'ios.clean.notMac': 'iOS clean is only available on macOS.',
|
|
366
|
+
'ios.clean.step.flutterClean': 'flutter clean',
|
|
367
|
+
'ios.clean.step.derivedData': 'Remove Xcode DerivedData (Runner)',
|
|
368
|
+
'ios.clean.step.buildDir': 'Remove build folders',
|
|
369
|
+
'ios.clean.step.pubGet': 'flutter pub get',
|
|
370
|
+
'ios.clean.step.pods': 'pod install',
|
|
371
|
+
|
|
372
|
+
'codemagic.configure.title': 'Codemagic — setup',
|
|
373
|
+
'codemagic.configure.doc': 'Guide',
|
|
374
|
+
'codemagic.configure.checklist': 'Complete signing + App Store Connect in the Codemagic dashboard (see guide).',
|
|
375
|
+
'codemagic.configure.openingLinks': 'Opening Codemagic in your browser…',
|
|
376
|
+
'codemagic.configure.q.token': 'Codemagic API token',
|
|
377
|
+
'codemagic.configure.q.appId': 'Codemagic App ID',
|
|
378
|
+
'codemagic.configure.q.workflowId': 'Workflow ID (from codemagic.yaml)',
|
|
379
|
+
'codemagic.configure.q.branch': 'Git branch to build',
|
|
380
|
+
'codemagic.configure.q.required': 'Required',
|
|
381
|
+
'codemagic.configure.cancelled': 'Setup cancelled',
|
|
382
|
+
'codemagic.configure.success': 'Codemagic credentials saved',
|
|
383
|
+
'codemagic.configure.next': 'Next',
|
|
384
|
+
'codemagic.release.title': 'Triggering Codemagic build…',
|
|
385
|
+
'codemagic.release.triggered': 'Build started',
|
|
386
|
+
'codemagic.release.spin': 'Starting build on Codemagic…',
|
|
387
|
+
'codemagic.release.spinDone': 'Build queued on Codemagic',
|
|
388
|
+
'codemagic.status.title': 'Build status',
|
|
389
|
+
'codemagic.status.usage': 'Usage: kasy codemagic status <buildId>',
|
|
390
|
+
'codemagic.status.spin': 'Fetching build status…',
|
|
391
|
+
'codemagic.status.spinDone': 'Status fetched',
|
|
392
|
+
'codemagic.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
|
|
393
|
+
'codemagic.error.notConfigured': 'Codemagic not configured',
|
|
394
|
+
'codemagic.error.addCi': 'Add CI first: kasy add ci (creates codemagic.yaml)',
|
|
395
|
+
'codemagic.error.runConfigure': 'Run: kasy codemagic configure',
|
|
396
|
+
'codemagic.error.googleUrlScheme': 'Codemagic build blocked: Google Sign-In iOS URL scheme is not configured.',
|
|
397
|
+
|
|
398
|
+
'doctor.ios.title': 'iOS release',
|
|
399
|
+
'doctor.ios.appleOk': 'Apple credentials configured',
|
|
400
|
+
'doctor.ios.appleMissing': 'Apple credentials missing — kasy ios configure',
|
|
401
|
+
'doctor.ios.p8Ok': 'API key file found',
|
|
402
|
+
'doctor.ios.p8Missing': 'AuthKey .p8 missing — kasy ios configure',
|
|
403
|
+
'doctor.ios.codemagicOk': 'Codemagic credentials configured',
|
|
404
|
+
'doctor.ios.codemagicMissing': 'Codemagic optional — kasy codemagic configure',
|
|
405
|
+
'doctor.ios.notMac': 'Local iOS release requires macOS',
|
|
406
|
+
'doctor.ios.doc': 'Documentation',
|
|
407
|
+
'doctor.ios.signingOk': 'Xcode signing (Development Team) configured',
|
|
408
|
+
'doctor.ios.signingMissing': 'Xcode signing not set — open Runner in Xcode and choose your Team',
|
|
409
|
+
'doctor.ios.googleUrlSchemeOk': 'Google Sign-In iOS URL scheme configured',
|
|
410
|
+
'doctor.ios.googleUrlSchemeMissing': 'Google Sign-In iOS URL scheme mismatch',
|
|
411
|
+
'doctor.ios.googleUrlSchemeSkipped': 'Google Sign-In iOS URL scheme check skipped (GoogleService-Info.plist not found)',
|
|
412
|
+
'doctor.ios.appleSignInEntitlementOk': 'Apple Sign-In entitlement configured',
|
|
413
|
+
'doctor.ios.appleSignInEntitlementMissing': 'Apple Sign-In entitlement missing — add Sign In with Apple capability in Xcode',
|
|
414
|
+
'doctor.ios.facebookOk': 'Facebook credentials configured (iOS)',
|
|
415
|
+
'doctor.ios.facebookPlaceholders': 'Facebook credentials are still placeholders — update FacebookAppID and FacebookClientToken in Info.plist',
|
|
416
|
+
'doctor.ios.facebookSkipped': 'Facebook credential check skipped (no FacebookAppID in Info.plist)',
|
|
417
|
+
'doctor.android.facebookOk': 'Facebook credentials configured (Android)',
|
|
418
|
+
'doctor.android.facebookPlaceholders': 'Facebook credentials are still placeholders — update facebook_app_id and facebook_client_token in android/app/src/main/res/values/strings.xml',
|
|
419
|
+
|
|
420
|
+
'doctor.revenuecat.title': 'RevenueCat',
|
|
421
|
+
'doctor.revenuecat.keysOk': 'API keys configured (iOS + Android)',
|
|
422
|
+
'doctor.revenuecat.keysEmpty': 'API keys not configured — set RC_IOS_API_KEY and RC_ANDROID_API_KEY in Makefile and .vscode/launch.json',
|
|
423
|
+
'doctor.revenuecat.keysTest': 'Using Test Store keys (test_) — replace with appl_ and goog_ for production',
|
|
424
|
+
'doctor.revenuecat.webhookUrlSupabase': 'Webhook URL (paste in RevenueCat → Integrations → Webhooks)',
|
|
425
|
+
'doctor.revenuecat.webhookUrlFirebase': 'Webhook URL: Firebase Console → Functions → subscriptionsOnRcPremiumUpdate',
|
|
426
|
+
|
|
427
|
+
'update.iosRelease.success': 'iOS release files updated',
|
|
428
|
+
'add.iosRelease.success': 'iOS release files added',
|
|
429
|
+
'add.iosRelease.already': 'iOS release files already present',
|
|
430
|
+
|
|
431
|
+
'new.api.q.baseUrl': 'What is your API base URL?',
|
|
432
|
+
'new.api.q.baseUrl.hint': 'https://api.example.com',
|
|
433
|
+
'new.firebase.banner': '🔥 New Flutter app — Firebase',
|
|
434
|
+
'new.firebase.subtitle': 'Full project: auth, Firestore, notifications, social login and more.',
|
|
435
|
+
'new.prereq.title': 'Before we start, make sure you have:',
|
|
436
|
+
'new.firebase.prereq.title': 'Before we start, make sure you have:',
|
|
437
|
+
'new.firebase.prereq.create.1': '1. gcloud CLI (cloud.google.com/sdk) + gcloud auth login',
|
|
438
|
+
'new.firebase.prereq.create.2': '2. Blaze plan (credit card — required for Cloud Functions)',
|
|
439
|
+
'new.firebase.prereq.create.billingLimit': '3. Limit: up to 3 projects per billing account. Remove unused projects or request quota increase if you\'ve reached this limit.',
|
|
440
|
+
'new.firebase.prereq.create.projectQuota': '4. Project quota: Google account has a limit (e.g. 10–30 projects). Delete unused projects at console.cloud.google.com if needed.',
|
|
441
|
+
'new.firebase.prereq.create.note': ' Project and APIs will be created automatically.',
|
|
442
|
+
'new.firebase.prereq.create.pushNote': ' Firebase project for FCM + Remote Config will be created automatically (no service account needed).',
|
|
443
|
+
'new.firebase.create.creatingPush': 'Creating Firebase project for push notifications…',
|
|
444
|
+
'new.firebase.create.successPush': 'Firebase project created for FCM + Remote Config.',
|
|
445
|
+
'new.firebase.prereq.1': '1. Firebase CLI installed (npm i -g firebase-tools) + firebase login',
|
|
446
|
+
'new.firebase.prereq.2': '2. Firebase project created at console.firebase.google.com',
|
|
447
|
+
'new.firebase.prereq.3': '3. Blaze plan activated (credit card — required for Cloud Functions)',
|
|
448
|
+
'new.firebase.prereq.4': '4. gcloud CLI installed + gcloud auth login (used to enable APIs automatically)',
|
|
449
|
+
'new.firebase.prereq.5': '5. Before deploy: enable Secret Manager API + Firebase Storage (see PREREQUISITES.md or links after generation)',
|
|
450
|
+
'new.firebase.prereq.doc': ' Full checklist: PREREQUISITES.md',
|
|
451
|
+
|
|
452
|
+
'new.firebase.q.appName': "What is the name of your app?",
|
|
453
|
+
'new.firebase.q.appName.hint': 'e.g.: My Amazing App',
|
|
454
|
+
'new.firebase.q.appName.required': 'App name is required.',
|
|
455
|
+
|
|
456
|
+
'new.firebase.q.bundleId': 'What is the unique identifier (Bundle ID) of your app?',
|
|
457
|
+
'new.firebase.q.bundleId.hint': 'It works like an address for your app, e.g.: com.mycompany.myapp',
|
|
458
|
+
'new.firebase.q.bundleId.invalid': 'Invalid format. Use: com.company.app',
|
|
459
|
+
'new.firebase.q.bundleId.required': 'Bundle ID is required.',
|
|
460
|
+
|
|
461
|
+
'new.firebase.q.projectId': 'What is your Firebase Project ID?',
|
|
462
|
+
'new.firebase.q.projectId.hint': 'Find it in the Firebase Console → your project → Settings',
|
|
463
|
+
'new.firebase.q.projectId.required': 'Firebase Project ID is required.',
|
|
464
|
+
|
|
465
|
+
'new.firebase.q.modules': 'Which optional features do you want to include?',
|
|
466
|
+
'new.firebase.q.modules.hint': 'Space to select, Enter to confirm',
|
|
467
|
+
'new.modules.header.common': '── Common (all backends) ──',
|
|
468
|
+
'new.modules.header.features': '── Screens & features ──',
|
|
469
|
+
'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
|
|
470
|
+
'new.modules.header.ci': '── CI/CD ──',
|
|
471
|
+
'new.modules.header.monetization': '── Monetization ──',
|
|
472
|
+
'new.firebase.module.revenuecat': '💰 RevenueCat (enables Subscriptions)',
|
|
473
|
+
'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
|
|
474
|
+
'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
|
|
475
|
+
'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
|
|
476
|
+
'new.firebase.module.web': '🌐 Web Support (PWA, Firebase only)',
|
|
477
|
+
'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
|
|
478
|
+
'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
|
|
479
|
+
'new.firebase.module.local_notifications': '🔔 Local Reminders (no server)',
|
|
480
|
+
'new.firebase.module.feedback': '💬 Feature Requests (requires Firebase or Supabase)',
|
|
481
|
+
'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
|
|
482
|
+
'new.firebase.module.onboarding': '👋 Onboarding (welcome flow)',
|
|
483
|
+
|
|
484
|
+
'new.firebase.q.secrets.configureNow': 'Configure server secrets now? (RevenueCat webhook, Meta Ads)',
|
|
485
|
+
'new.firebase.q.secrets.configureNow.hint': 'If not now, see the README for commands to add them later',
|
|
486
|
+
'new.firebase.q.secrets.later': '• Server secrets not configured — they will be set up during `kasy deploy`.',
|
|
487
|
+
'new.firebase.q.revenuecat.webhookKey': 'Webhook secret key (a random value was suggested — press Enter to accept or type your own)',
|
|
488
|
+
'new.firebase.q.revenuecat.webhookKey.hint': 'Save this value. In RevenueCat dashboard, paste as: Bearer <this-value>',
|
|
489
|
+
'new.firebase.q.revenuecat.metaToken': 'Meta Access Token (for Ads Conversions API, optional)',
|
|
490
|
+
'new.firebase.q.revenuecat.metaDataset': 'Meta Dataset ID / Pixel ID (optional)',
|
|
491
|
+
'new.firebase.q.revenuecat.android': 'RevenueCat API key for Android',
|
|
492
|
+
'new.firebase.q.revenuecat.ios': 'RevenueCat API key for iOS',
|
|
493
|
+
'new.firebase.q.paywall': 'Which paywall style?',
|
|
494
|
+
'new.firebase.q.paywall.hint': 'Layout of the subscription screen — you can change it later in RevenueCat',
|
|
495
|
+
'new.firebase.q.revenuecat.web': 'Enable subscriptions on web (RevenueCat Web Billing)?',
|
|
496
|
+
'new.firebase.q.revenuecat.web.hint': 'Requires Web Billing setup in RevenueCat dashboard + Stripe. Leave unchecked if not needed.',
|
|
497
|
+
'new.firebase.q.revenuecat.webKey': 'RevenueCat Web Billing API key (rcb_xxx or rcb_sb_xxx, optional — configure later)',
|
|
498
|
+
'new.firebase.success.revenuecatWeb': '• RevenueCat Web: add RC_WEB_API_KEY (launch.json) for web subscriptions',
|
|
499
|
+
'new.firebase.q.sentry.dsn': 'Sentry DSN (leave blank to configure later)',
|
|
500
|
+
'new.firebase.q.sentry.dsn.invalid': 'Invalid DSN. Expected format: https://key@host/project-id',
|
|
501
|
+
'new.firebase.q.mixpanel.token': 'Mixpanel Token (leave blank to configure later)',
|
|
502
|
+
'new.firebase.q.facebook.appId': 'Facebook App ID',
|
|
503
|
+
'new.firebase.q.facebook.appId.required': 'Facebook App ID is required.',
|
|
504
|
+
'new.firebase.q.facebook.appId.invalid': 'Facebook App ID must be numeric (e.g. 1234567890).',
|
|
505
|
+
'new.firebase.q.facebook.token': 'Facebook App Token',
|
|
506
|
+
'new.firebase.q.facebook.token.required': 'Facebook App Token is required.',
|
|
507
|
+
'new.firebase.q.revenuecat.android.required': 'RevenueCat Android key is required.',
|
|
508
|
+
'new.firebase.q.revenuecat.ios.required': 'RevenueCat iOS key is required.',
|
|
509
|
+
'new.firebase.q.revenuecat.metaDataset.invalid': 'Pixel ID must be numeric (e.g. 1234567890).',
|
|
510
|
+
'new.firebase.q.revenuecat.webKey.invalid': 'Web Billing key must start with rcb_ (e.g. rcb_sb_xxx or rcb_xxx).',
|
|
511
|
+
|
|
512
|
+
'new.firebase.confirm.title': 'Configuration summary:',
|
|
513
|
+
'new.firebase.confirm.app': 'App',
|
|
514
|
+
'new.firebase.confirm.bundleId': 'Bundle ID',
|
|
515
|
+
'new.firebase.confirm.project': 'Firebase',
|
|
516
|
+
'new.firebase.confirm.modules': 'Features',
|
|
517
|
+
'new.firebase.confirm.none': 'none',
|
|
518
|
+
'new.firebase.confirm.proceed': 'Create project now?',
|
|
519
|
+
|
|
520
|
+
'new.firebase.step.copying': 'Setting up your project...',
|
|
521
|
+
'new.firebase.step.pubGet': 'Installing Flutter packages...',
|
|
522
|
+
'new.firebase.step.buildRunner': 'Generating code (Riverpod/Freezed)...',
|
|
523
|
+
'new.firebase.step.flutterfire': 'Configuring Firebase (flutterfire)...',
|
|
524
|
+
'new.firebase.step.deploy': 'Deploying Cloud Functions + Firestore rules...',
|
|
525
|
+
'new.firebase.step.done': 'Done!',
|
|
526
|
+
|
|
527
|
+
'new.firebase.success.title': '🎉 Your app is ready!',
|
|
528
|
+
'new.firebase.success.open': 'Open the project:',
|
|
529
|
+
'new.firebase.success.run': 'Run the app:',
|
|
530
|
+
'new.firebase.success.runMake': 'Or use make: make run | make run-ios | make run-android',
|
|
531
|
+
'new.firebase.success.deviceSetup': 'Before running on device:',
|
|
532
|
+
'new.firebase.success.deviceSetup.ios': 'iOS: connect iPhone via cable → trust computer → Xcode → Window → Devices → pair',
|
|
533
|
+
'new.firebase.success.deviceSetup.android': 'Android: Settings → Developer options → enable USB debugging',
|
|
534
|
+
'new.firebase.success.hotReload': "Hot reload: press 'r' in terminal while app runs. Changes appear instantly.",
|
|
535
|
+
'new.firebase.success.oneLiner': 'Or copy-paste to enter and run:',
|
|
536
|
+
'new.firebase.success.configure': 'Configure when ready:',
|
|
537
|
+
'new.firebase.success.alreadyDone': 'Already configured by CLI:',
|
|
538
|
+
'new.firebase.success.manualNeeded': 'Configure manually (if needed):',
|
|
539
|
+
'new.firebase.success.apn': '• APN Key (iOS push): Firebase Console → Project Settings → Cloud Messaging',
|
|
540
|
+
'new.firebase.success.social': '• Enable social login in Firebase Console → Authentication (Google and Apple are already in the code; just activate them there)',
|
|
541
|
+
'new.firebase.success.googleSignIn': '• Google Sign-In: 1) Enable in Firebase Console → Auth → Sign-in method → Google. 2) CLI auto-fills kGoogleWebClientId (google_auth_options.dart) from google-services.json for native (Android/iOS). Web uses signInWithPopup.',
|
|
542
|
+
'new.firebase.success.sentry': '• Sentry: For production error reports. Get DSN at sentry.io. Already in launch.json for dev. For release: --dart-define=SENTRY_DSN=xxx',
|
|
543
|
+
'new.firebase.success.mixpanel': '• Mixpanel: For production analytics. Already in launch.json for dev. For release: --dart-define=MIXPANEL_TOKEN=xxx',
|
|
544
|
+
'new.firebase.success.web': '• Web (add-on): Android & iOS work as usual. To test on browser: "flutter run -d chrome" or "flutter run -d web-server --web-port=5000". To build: "flutter build web". Push notifications are mobile-only and disabled on web automatically.',
|
|
545
|
+
|
|
546
|
+
'new.firebase.q.deploy': 'Deploy Cloud Functions + Firestore rules now?',
|
|
547
|
+
'new.firebase.q.deploy.hint': 'Requires Blaze plan and firebase-tools installed globally',
|
|
548
|
+
'new.firebase.deployFailed.hint': 'If deploy failed: create Firestore and Storage in Console first:',
|
|
549
|
+
'new.firebase.deployFailed.firestore': '• Firestore: create database (Create database → Native mode)',
|
|
550
|
+
'new.firebase.deployFailed.storage': '• Storage: click Get Started',
|
|
551
|
+
'new.firebase.deployFailed.orGcloud': 'Or create Firestore via CLI:',
|
|
552
|
+
'new.firebase.success.deployLater': '• Deploy backend when ready (from inside the project folder):',
|
|
553
|
+
'new.firebase.success.beforeDeploy': 'Before firebase deploy, enable (click to open):',
|
|
554
|
+
'new.firebase.success.secretManager': '• Secret Manager API',
|
|
555
|
+
'new.firebase.success.firestore': '• Firestore (create database if missing)',
|
|
556
|
+
'new.firebase.success.storage': '• Firebase Storage (Get Started)',
|
|
557
|
+
'new.firebase.success.auth': '• Firebase Authentication (Email/Password)',
|
|
558
|
+
'new.firebase.success.security': '🔒 .gitignore excludes .env and other secrets. Cloud Functions use server-side secrets.',
|
|
559
|
+
|
|
560
|
+
'new.firebase.interactive.title': '⚠️ Cloud Configuration Required',
|
|
561
|
+
'new.firebase.interactive.desc': 'For security and billing reasons, Firebase requires manual activation of these services:',
|
|
562
|
+
'new.firebase.interactive.step1': '1. Create Firestore Database (Native mode): ',
|
|
563
|
+
'new.firebase.interactive.step2': '2. Upgrade to Blaze Plan (Pay-as-you-go): ',
|
|
564
|
+
'new.firebase.interactive.step3': '3. Enable Authentication (Email/Password): ',
|
|
565
|
+
|
|
566
|
+
'new.firebase.interactive.prompt1': 'Did you create the Firestore Database and enabled Authentication?',
|
|
567
|
+
'new.firebase.interactive.prompt2': 'Did you upgrade to the Blaze Plan? (Required for Cloud Functions)',
|
|
568
|
+
'new.firebase.interactive.googleAuthNote': '* Enable Google Sign-In manually (Email/Password and Anonymous are already enabled): ',
|
|
569
|
+
'new.firebase.interactive.billingNeeded': 'Blaze plan not yet active. Activate it at the link above, then wait.',
|
|
570
|
+
'new.firebase.interactive.billingWaiting': 'Checking Blaze status...',
|
|
571
|
+
'new.firebase.interactive.billingTimeout': 'Blaze plan not confirmed after timeout. Deploy skipped — run manually when ready.',
|
|
572
|
+
'new.firebase.interactive.authWarn': 'Could not enable Email/Password and Anonymous auth automatically. Enable manually:',
|
|
573
|
+
'new.firebase.existing.apisFailed': 'Could not activate APIs:',
|
|
574
|
+
'new.firebase.existing.googleSignInManual': 'Google Sign-In: enable manually in Authentication → Sign-in method → Google',
|
|
575
|
+
|
|
576
|
+
'new.firebase.interactive.ready': 'Ready to deploy Push Notifications + Security Rules now?',
|
|
577
|
+
'new.firebase.interactive.deploying': 'Deploying Cloud Functions + Firestore/Storage rules...',
|
|
578
|
+
'new.firebase.interactive.errorTitle': 'Deploy failed.',
|
|
579
|
+
'new.firebase.interactive.errorHint': 'Make sure Firestore is created and the Blaze plan is active with a credit card.',
|
|
580
|
+
'new.firebase.interactive.laterHint': 'You can deploy later inside the project folder using: ',
|
|
581
|
+
'new.firebase.interactive.skipped': 'Deploy skipped. You can deploy later manually.',
|
|
582
|
+
|
|
583
|
+
'new.firebase.warn.flutterfire': '⚠️ FlutterFire could not generate firebase_options_dev.dart automatically.',
|
|
584
|
+
'new.firebase.warn.flutterfire.manual': 'Run manually in the project folder:',
|
|
585
|
+
|
|
586
|
+
'new.firebase.error.templateMissing': 'Firebase template not found at: {path}. Make sure the Firebase/ folder exists.',
|
|
587
|
+
'new.firebase.error.dirNotEmpty': 'Directory "{path}" already exists and is not empty.',
|
|
588
|
+
'new.firebase.error.aborted': 'Setup aborted.',
|
|
589
|
+
|
|
590
|
+
'new.supabase.prereq.1': '1. Supabase account at supabase.com',
|
|
591
|
+
'new.supabase.prereq.2': '2. Supabase CLI + Firebase CLI installed (both required)',
|
|
592
|
+
'new.supabase.prereq.3': '3. supabase login + firebase login (Firebase needed for push notifications)',
|
|
593
|
+
'new.supabase.prereq.login': ' If creating manually: have your project URL and anon key ready',
|
|
594
|
+
'new.supabase.loginRequired': '⚠️ You must be logged in to create a project. Run supabase login first.',
|
|
595
|
+
'new.supabase.loginCommand': ' supabase login',
|
|
596
|
+
'new.supabase.success.done.db': '• Database: tables, RLS policies',
|
|
597
|
+
'new.supabase.success.done.storage': '• Storage: bucket kasy with policies',
|
|
598
|
+
'new.supabase.success.done.webhook': '• Edge Function revenuecat-webhook',
|
|
599
|
+
'new.supabase.success.done.secrets': '• Edge Function secrets (if provided)',
|
|
600
|
+
'new.supabase.success.done.launch': '• launch.json with Sentry, Mixpanel, RevenueCat',
|
|
601
|
+
'new.supabase.success.auth': '• Auth: Email already enabled. Enable Google, Apple, Facebook at: {authUrl}',
|
|
602
|
+
'new.supabase.success.storage': '• Storage: Bucket kasy created with policies (ready to use)',
|
|
603
|
+
'new.supabase.success.fcm': '• Push (FCM): Must configure in Firebase Console (Blaze plan). App is ready for Supabase + FCM. URL: {fcmUrl}',
|
|
604
|
+
'new.supabase.success.deployLater': '• Deploy backend when ready (from inside the project folder):',
|
|
605
|
+
|
|
606
|
+
'new.api.prereq.1': '1. Your REST API running and reachable',
|
|
607
|
+
'new.api.prereq.2': '2. API base URL (e.g. https://api.yourapp.com)',
|
|
608
|
+
'new.api.prereq.3': '3. Firebase CLI required for push notifications (FCM)',
|
|
609
|
+
'new.api.success.backendUrl': '• Point BACKEND_URL to your running API (launch.json)',
|
|
610
|
+
'new.api.success.fcm': '• Firebase is required for push notifications (FCM) — configure APNs key in Firebase console',
|
|
611
|
+
'new.api.success.auth': '• Implement the social auth endpoints (Google, Apple) on your backend',
|
|
612
|
+
|
|
613
|
+
'new.outdated.hint': "projects created now won't include the latest improvements.",
|
|
614
|
+
'new.outdated.upgradeNow': 'Upgrade to the latest version before creating? (requires active subscription)',
|
|
615
|
+
'new.outdated.upgraded': 'kasy updated! Run kasy new again.',
|
|
616
|
+
'new.success.title': 'Project created successfully!',
|
|
617
|
+
'new.success.nextSteps': 'Next steps:',
|
|
618
|
+
'new.success.step.cd': 'Go to your project folder:',
|
|
619
|
+
'new.success.step.deploy': 'Deploy your backend to Firebase:',
|
|
620
|
+
'new.success.step.run': 'Run your app (with your configured keys):',
|
|
621
|
+
'new.success.step.run.vscode': '(or F5 in VS Code)',
|
|
622
|
+
'new.success.step.console': 'Open your backend console:',
|
|
623
|
+
'new.fcm.generating': 'Generating push notifications key (Firebase Service Account)…',
|
|
624
|
+
'new.sha1.registering': 'Registering SHA-1 for Google Sign-In (Android)…',
|
|
625
|
+
'new.sha1.failed': 'SHA-1 not added automatically: {error}',
|
|
626
|
+
'new.sha1.manual': 'Add it manually so Google Sign-In works on Android:',
|
|
627
|
+
'new.sha1.skipped.apiFailed': 'SHA-1 not added automatically. Reason: {error}',
|
|
628
|
+
'new.sha1.skipped.other': 'SHA-1 not added: {reason}',
|
|
629
|
+
'new.sha1.addManually': 'Add manually: Firebase Console → Project settings → Your apps → Android → Add fingerprint',
|
|
630
|
+
'new.sha1.added': '✓ SHA-1 added (Google Sign-In)',
|
|
631
|
+
'new.firestore.created': '✓ Firestore created automatically',
|
|
632
|
+
'new.firestore.notCreated.error': '⚠ Firestore not created. Reason: {error}',
|
|
633
|
+
'new.firestore.notCreated': '⚠ Firestore not created automatically',
|
|
634
|
+
'new.storage.created': '✓ Firebase Storage created automatically',
|
|
635
|
+
'new.storage.notCreated.error': '⚠ Storage not created. Reason: {error}',
|
|
636
|
+
'new.storage.notCreated': '⚠ Storage not created automatically',
|
|
637
|
+
'new.activateManually': 'Activate manually in the console:',
|
|
638
|
+
'new.fcm.serverConfig': 'Configure on your server: FIREBASE_SERVICE_ACCOUNT_JSON="$(cat .kasy/fcm-service-account.json)"',
|
|
639
|
+
'new.apns.warning': '⚠ iOS Push: configure the APNs Key in Firebase Console',
|
|
640
|
+
'new.apns.step1': '1. Apple Developer Portal → Keys → create APNs Key (.p8)',
|
|
641
|
+
'new.apns.step2': '2. Firebase Console → Cloud Messaging → iOS app → upload APNs Key',
|
|
642
|
+
'new.firebase.create.estimatedTime': '(usually 3–5 min — do not close the terminal)',
|
|
643
|
+
'new.internet.warning': '📶 Make sure you have a stable internet connection — this step requires network access.',
|
|
644
|
+
|
|
645
|
+
// run command
|
|
646
|
+
'cli.command.run.description': 'Run your app on phone, simulator, or browser',
|
|
647
|
+
'run.launching': 'Launching Flutter app...',
|
|
648
|
+
'run.prompt.pickDevice': 'Multiple devices detected. Which one do you want to run on?',
|
|
649
|
+
'run.warn.nothingSelected': 'No device selected.',
|
|
650
|
+
'run.updateHint.prefix': 'Project improvements available —',
|
|
651
|
+
'run.updateHint.suffix': 'to see what\'s new',
|
|
652
|
+
'run.spinner.building': 'Starting Flutter…',
|
|
653
|
+
'run.spinner.ready': 'Flutter ready — use r (reload), R (restart), q (quit)',
|
|
654
|
+
'run.spinner.failed': 'Flutter run failed before starting',
|
|
655
|
+
'run.stage.gradleFirstTime': 'Building Android (first run takes 5-15 min while Gradle downloads deps)…',
|
|
656
|
+
'run.stage.gradle': 'Building Android…',
|
|
657
|
+
'run.stage.xcode': 'Building iOS…',
|
|
658
|
+
'run.stage.pods': 'Installing iOS pods…',
|
|
659
|
+
'run.stage.installing': 'Installing on device…',
|
|
660
|
+
'run.stage.syncing': 'Syncing files to device…',
|
|
661
|
+
'run.stage.buildSuccess': 'Build done — launching app…',
|
|
662
|
+
'run.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
|
|
663
|
+
'run.error.flutterNotFound': 'Flutter not found. Make sure Flutter is installed and on your PATH.',
|
|
664
|
+
|
|
665
|
+
// reset command
|
|
666
|
+
'cli.command.reset.description': 'Uninstall the app on a simulator/emulator/device so you can test as a fresh install',
|
|
667
|
+
'reset.title': 'Reset app on device',
|
|
668
|
+
'reset.scanning': 'Looking for running simulators, emulators and connected devices...',
|
|
669
|
+
'reset.prompt.pickDevice': 'Which one do you want to reset?',
|
|
670
|
+
'reset.resetting': 'Resetting',
|
|
671
|
+
'reset.reinstalling': 'Reinstalling the app...',
|
|
672
|
+
'reset.success.uninstalled': 'App uninstalled. All local data and permissions cleared.',
|
|
673
|
+
'reset.info.notInstalled': 'App was not installed on this device.',
|
|
674
|
+
'reset.warn.noDevices': 'No matching simulator, emulator or device is running. Start one and try again.',
|
|
675
|
+
'reset.warn.nothingSelected': 'No device selected.',
|
|
676
|
+
'reset.warn.iosUninstallFailed': 'simctl uninstall failed.',
|
|
677
|
+
'reset.warn.androidUninstallFailed': 'adb uninstall did not return success.',
|
|
678
|
+
'reset.warn.iosDeviceManual': 'iOS physical device: remove the app manually (long-press the icon → Remove App), then reinstall with kasy run.',
|
|
679
|
+
'reset.warn.iosDeviceUninstallFailed': 'devicectl uninstall failed. Make sure the device is unlocked and trusted by this Mac.',
|
|
680
|
+
'reset.warn.webIncognito': 'Web: open the app in an incognito / private window of your browser to test as a fresh visitor.',
|
|
681
|
+
'reset.warn.unknownPlatform': 'Unsupported platform',
|
|
682
|
+
'reset.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
|
|
683
|
+
'reset.error.noIdentifier': 'Could not read bundle id or Android package name from this project.',
|
|
684
|
+
'reset.error.noBundleId': 'iOS bundle id not found for this project.',
|
|
685
|
+
'reset.error.noPackageName': 'Android applicationId not found for this project.',
|
|
686
|
+
'reset.outro.skipped': 'Done. App was not uninstalled.',
|
|
687
|
+
'reset.outro.uninstalledOnly': 'Done. Run kasy run to reinstall.',
|
|
688
|
+
'reset.outro.cancelled': 'Cancelled. App was not uninstalled.',
|
|
689
|
+
'reset.prompt.xcodeOpen': 'Xcode is open and will conflict with the install. What do you want to do?',
|
|
690
|
+
'reset.prompt.xcodeOpen.close': 'Close Xcode automatically (recommended)',
|
|
691
|
+
'reset.prompt.xcodeOpen.skip': 'Leave Xcode open and try anyway',
|
|
692
|
+
'reset.prompt.xcodeOpen.cancel': 'Cancel reset',
|
|
693
|
+
'reset.info.xcodeClosed': 'Xcode closed.',
|
|
694
|
+
'reset.prompt.reinstallNow': 'App removed. Check the device, then reinstall now?',
|
|
695
|
+
'reset.prompt.clearLauncherCache': 'Also clear the launcher cache ({pkg})? Fixes gray widget previews.',
|
|
696
|
+
'reset.success.launcherCleared': 'Launcher cache cleared ({pkg}). Home screen kept intact.',
|
|
697
|
+
'reset.warn.launcherCacheFailed': 'Could not clear the launcher cache.',
|
|
698
|
+
'reset.warn.launcherNotDetected': 'Default launcher not detected — skipping cache cleanup.',
|
|
699
|
+
|
|
700
|
+
// doctor project checks
|
|
701
|
+
'doctor.project.title': 'Project',
|
|
702
|
+
'doctor.project.appName': 'App name',
|
|
703
|
+
'doctor.project.backend': 'Backend',
|
|
704
|
+
'doctor.project.bundleId': 'Bundle ID',
|
|
705
|
+
'doctor.project.pubGet': 'Dependencies installed (pubspec.lock present)',
|
|
706
|
+
'doctor.project.pubGetMissing': 'Run flutter pub get — pubspec.lock not found',
|
|
707
|
+
'doctor.project.modules': 'Active features',
|
|
708
|
+
'doctor.project.noModules': 'No optional features active',
|
|
709
|
+
|
|
710
|
+
// add command
|
|
711
|
+
'cli.command.add.description': 'Add a new feature to your app (e.g.: kasy add ai_chat)',
|
|
712
|
+
|
|
713
|
+
// docs command
|
|
714
|
+
'cli.command.docs.description': 'Open the full documentation',
|
|
715
|
+
|
|
716
|
+
// splash command
|
|
717
|
+
'cli.command.splash.description': 'Swap splash screen logos (light/dark) and regenerate native assets',
|
|
718
|
+
'splash.intro': 'Splash screen',
|
|
719
|
+
'splash.validating': 'Validating PNG files...',
|
|
720
|
+
'splash.validated': 'PNG files look good',
|
|
721
|
+
'splash.copying': 'Copying logos to assets/images/...',
|
|
722
|
+
'splash.copied': 'Logos copied',
|
|
723
|
+
'splash.android12Generating': 'Generating padded variants for Android 12+...',
|
|
724
|
+
'splash.android12Generated': 'Android 12+ variants generated',
|
|
725
|
+
'splash.generating': 'Regenerating native splash (Android, iOS, Web)...',
|
|
726
|
+
'splash.generated': 'Native splash regenerated',
|
|
727
|
+
'splash.done': 'Done. Run "flutter run" to see the new splash.',
|
|
728
|
+
'splash.warn.title': 'Warnings',
|
|
729
|
+
'splash.warn.noAlphaLight': '{path} has no alpha channel. The logo will show with a solid background instead of being transparent.',
|
|
730
|
+
'splash.warn.noAlphaDark': '{path} has no alpha channel. The logo will show with a solid background instead of being transparent.',
|
|
731
|
+
'splash.warn.smallLight': 'Light logo is {w}x{h}. Recommended is at least 768x768 to avoid blurry edges.',
|
|
732
|
+
'splash.warn.smallDark': 'Dark logo is {w}x{h}. Recommended is at least 768x768 to avoid blurry edges.',
|
|
733
|
+
'splash.summary.title': 'Saved',
|
|
734
|
+
'splash.summary.light': 'Light mode',
|
|
735
|
+
'splash.summary.dark': 'Dark mode',
|
|
736
|
+
'splash.skipGenerate.title': 'Skipped generation',
|
|
737
|
+
'splash.skipGenerate.hint': 'Run `dart run flutter_native_splash:create` when you are ready.',
|
|
738
|
+
'splash.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
|
|
739
|
+
'splash.error.bothRequired': '--light and --dark are both required.',
|
|
740
|
+
'splash.error.fileNotFound': 'File not found: {path}',
|
|
741
|
+
'splash.error.notPng': 'One of the files is not a valid PNG.',
|
|
742
|
+
'splash.error.generateFailed': 'flutter_native_splash:create failed. Check the output above.',
|
|
743
|
+
|
|
744
|
+
// icon command
|
|
745
|
+
'cli.command.icon.description': 'Swap the app icon (iOS + Android) and regenerate native assets',
|
|
746
|
+
'icon.intro': 'App icon',
|
|
747
|
+
'icon.validating': 'Validating PNG file...',
|
|
748
|
+
'icon.validated': 'PNG looks good',
|
|
749
|
+
'icon.copying': 'Copying icon to assets/images/icon.png...',
|
|
750
|
+
'icon.copied': 'Icon copied',
|
|
751
|
+
'icon.adaptive.generating': 'Generating Android adaptive variant (fills the launcher circle)...',
|
|
752
|
+
'icon.adaptive.generated': 'Android adaptive icon generated',
|
|
753
|
+
'icon.adaptive.failed': 'Failed to generate Android adaptive icon',
|
|
754
|
+
'icon.adaptive.fallbackTitle': 'Android background',
|
|
755
|
+
'icon.adaptive.fallbackColor': 'Could not sample a background color from the PNG (transparent). Used white. Edit icon_android.png if you want a different color.',
|
|
756
|
+
'icon.generating': 'Regenerating native icons (Android + iOS)...',
|
|
757
|
+
'icon.generated': 'Native icons regenerated',
|
|
758
|
+
'icon.done': 'Done. Uninstall the app from the device and reinstall to see the new icon.',
|
|
759
|
+
'icon.warn.title': 'Warnings',
|
|
760
|
+
'icon.warn.notSquare': 'Icon is {w}x{h} (not square). The image will be stretched. Use a square image (1024x1024 recommended).',
|
|
761
|
+
'icon.warn.small': 'Icon is {w}x{h}. Recommended is at least 1024x1024 (App Store requires this size).',
|
|
762
|
+
'icon.warn.hasAlpha': 'Icon has transparency. iOS rejects icons with alpha channel — flutter_launcher_icons will remove it automatically (remove_alpha_ios: true).',
|
|
763
|
+
'icon.summary.title': 'Saved',
|
|
764
|
+
'icon.summary.icon': 'App icon',
|
|
765
|
+
'icon.skipGenerate.title': 'Skipped generation',
|
|
766
|
+
'icon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
|
|
767
|
+
'icon.reinstall.title': 'Important',
|
|
768
|
+
'icon.reinstall.hint': 'iOS and Android cache the old icon. Uninstall the app and reinstall to see the new one.',
|
|
769
|
+
'icon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
|
|
770
|
+
'icon.error.imageRequired': '--image is required.',
|
|
771
|
+
'icon.error.fileNotFound': 'File not found: {path}',
|
|
772
|
+
'icon.error.notPng': 'The file is not a valid PNG.',
|
|
773
|
+
'icon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
|
|
774
|
+
|
|
775
|
+
// favicon command
|
|
776
|
+
'cli.command.favicon.description': 'Swap the web favicon / PWA icon and regenerate web assets',
|
|
777
|
+
'favicon.intro': 'Web favicon',
|
|
778
|
+
'favicon.validating': 'Validating PNG file...',
|
|
779
|
+
'favicon.validated': 'PNG looks good',
|
|
780
|
+
'favicon.copying': 'Copying favicon to assets/images/favicon.png...',
|
|
781
|
+
'favicon.copied': 'Favicon copied',
|
|
782
|
+
'favicon.generating': 'Regenerating web icons (favicon + PWA sizes)...',
|
|
783
|
+
'favicon.generated': 'Web icons regenerated',
|
|
784
|
+
'favicon.done': 'Done. Run "flutter run -d chrome" to see the new favicon.',
|
|
785
|
+
'favicon.warn.title': 'Warnings',
|
|
786
|
+
'favicon.warn.notSquare': 'Favicon is {w}x{h} (not square). It will be stretched. Use a square image (512x512+ recommended).',
|
|
787
|
+
'favicon.warn.small': 'Favicon is {w}x{h}. Recommended is at least 512x512 so it stays sharp on PWA install screens.',
|
|
788
|
+
'favicon.summary.title': 'Saved',
|
|
789
|
+
'favicon.summary.favicon': 'Favicon',
|
|
790
|
+
'favicon.skipGenerate.title': 'Skipped generation',
|
|
791
|
+
'favicon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
|
|
792
|
+
'favicon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
|
|
793
|
+
'favicon.error.imageRequired': '--image is required.',
|
|
794
|
+
'favicon.error.fileNotFound': 'File not found: {path}',
|
|
795
|
+
'favicon.error.notPng': 'The file is not a valid PNG.',
|
|
796
|
+
'favicon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
|
|
797
|
+
|
|
798
|
+
// notifications command
|
|
799
|
+
'cli.command.notifications.description': 'Edit the text of local notifications and reminders',
|
|
800
|
+
'cli.command.notifications.text.description': 'Set titles and bodies shown in local notifications',
|
|
801
|
+
'cli.command.notifications.picker.intro': 'Edit notification texts',
|
|
802
|
+
'cli.command.notifications.picker.message': 'What do you want to do?',
|
|
803
|
+
'notifications.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
804
|
+
'notifications.error.noI18n': 'lib/i18n/*.i18n.json not found in this project.',
|
|
805
|
+
'notifications.error.noFeatures': 'lib/core/config/features.dart not found.',
|
|
806
|
+
'notifications.error.notEnabled': 'Local notifications are disabled. Run: kasy add local_notifications',
|
|
807
|
+
'notifications.error.cancelled': 'Cancelled.',
|
|
808
|
+
'notifications.prompt.intro': 'Local notification texts',
|
|
809
|
+
'notifications.prompt.hint': 'Home demo = instant test from Features. Reminder = scheduled alert from Settings.',
|
|
810
|
+
'notifications.prompt.demoTitle': 'Home demo — notification title',
|
|
811
|
+
'notifications.prompt.demoBody': 'Home demo — description / body',
|
|
812
|
+
'notifications.prompt.reminderTitle': 'Scheduled reminder — title',
|
|
813
|
+
'notifications.prompt.reminderBody': 'Scheduled reminder — body',
|
|
814
|
+
'notifications.prompt.required': 'Required.',
|
|
815
|
+
'notifications.writing': 'Updating lib/i18n/*.i18n.json...',
|
|
816
|
+
'notifications.written': 'Updated: {langs}',
|
|
817
|
+
'notifications.slang': 'Running dart run slang...',
|
|
818
|
+
'notifications.slangDone': 'Translations regenerated',
|
|
819
|
+
'notifications.slangFailed': 'dart run slang failed — run it manually in the project',
|
|
820
|
+
'notifications.done': 'Local notification copy updated.',
|
|
821
|
+
'notifications.summary.demo': 'Home → Features (demo):',
|
|
822
|
+
'notifications.summary.reminder': 'Settings → Reminders (scheduled):',
|
|
823
|
+
|
|
824
|
+
'add.list.title': 'Project features',
|
|
825
|
+
'add.error.noModule': 'Provide a feature name or use --list to see available features.',
|
|
826
|
+
'add.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
827
|
+
'add.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
|
|
828
|
+
'add.alreadyActive': 'Feature "{module}" is already active in this project.',
|
|
829
|
+
'add.applying': 'Adding feature: {module}',
|
|
830
|
+
'add.applyingPatch': 'Applying feature changes...',
|
|
831
|
+
'add.patchApplied': 'Patch applied',
|
|
832
|
+
'add.patchFailed': 'Patch failed — check the output above',
|
|
833
|
+
'add.pubGet': 'Installing Flutter packages (flutter pub get)...',
|
|
834
|
+
'add.pubGetDone': 'Dependencies updated',
|
|
835
|
+
'add.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
|
|
836
|
+
'add.buildRunner': 'Generating code (Riverpod/Freezed)...',
|
|
837
|
+
'add.buildRunnerDone': 'Code generation complete',
|
|
838
|
+
'add.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
|
|
839
|
+
'add.success': 'Feature "{module}" added successfully.',
|
|
840
|
+
'add.cancelled': 'Cancelled.',
|
|
841
|
+
'add.prompt.sentryDsn': 'Sentry DSN (leave blank to configure later):',
|
|
842
|
+
'add.prompt.mixpanelToken': 'Mixpanel Token (leave blank to configure later):',
|
|
843
|
+
'add.prompt.rcAndroidKey': 'RevenueCat Android API key (leave blank to configure later):',
|
|
844
|
+
'add.prompt.rcIosKey': 'RevenueCat iOS API key (leave blank to configure later):',
|
|
845
|
+
'add.note.facebook': 'Add your Facebook App ID and token in .vscode/launch.json (FB_APP_ID, FB_TOKEN).',
|
|
846
|
+
'new.q.llm_chat.configureNow': 'Configure the LLM Chat agent now?',
|
|
847
|
+
'new.q.llm_chat.configureNow.hint': 'You can skip and run "kasy add llm_chat" later',
|
|
848
|
+
'add.llm_chat.reconfigure': 'Feature already active — reconfiguring credentials only.',
|
|
849
|
+
'add.prompt.llmProvider': 'LLM provider:',
|
|
850
|
+
'add.prompt.llmSystemPrompt': 'Agent system prompt (leave blank for none):\n Example: "You are a support assistant for the Fitsync app. Only answer about workouts."\n >',
|
|
851
|
+
'add.prompt.llmApiKey': 'API key (OpenAI or Gemini) — stored as server secret, never in the app (leave blank to set later):',
|
|
852
|
+
'add.prompt.llmEndpoint': 'Your LLM endpoint URL (leave blank to configure later):',
|
|
853
|
+
'add.llm_chat.settingSecret': 'Storing API key as server secret...',
|
|
854
|
+
'add.llm_chat.secretSet': 'API key stored as secret',
|
|
855
|
+
'add.llm_chat.secretFailed': 'Could not set secret automatically — set it manually (see instructions below)',
|
|
856
|
+
'add.llm_chat.skipSecret': 'API key skipped — set it later via the server CLI before deploying',
|
|
857
|
+
'add.llm_chat.deploying': 'Deploying LLM function to server...',
|
|
858
|
+
'add.llm_chat.deployed': 'LLM function deployed successfully',
|
|
859
|
+
'add.llm_chat.deployFailed': 'Auto-deploy failed — deploy manually (see instructions below)',
|
|
860
|
+
'add.llm_chat.nextSteps.firebase': '\n Next steps:\n 1. The LLM_CHAT_ENDPOINT in .vscode/launch.json has been pre-filled.\n 2. Run the app: kasy run\n',
|
|
861
|
+
'add.llm_chat.nextSteps.firebase.deployFailed': '\n Next steps:\n 1. Deploy manually: firebase deploy --only functions:llmChat\n 2. The LLM_CHAT_ENDPOINT in .vscode/launch.json has been pre-filled.\n 3. Run the app: kasy run\n',
|
|
862
|
+
'add.llm_chat.nextSteps.supabase': '\n Next steps:\n 1. The LLM_CHAT_ENDPOINT in .vscode/launch.json has been pre-filled.\n 2. Run the app: kasy run\n',
|
|
863
|
+
'add.llm_chat.nextSteps.supabase.deployFailed': '\n Next steps:\n 1. Deploy manually: supabase functions deploy llm-chat --no-verify-jwt\n 2. The LLM_CHAT_ENDPOINT in .vscode/launch.json has been pre-filled.\n 3. Run the app: kasy run\n',
|
|
864
|
+
'add.llm_chat.nextSteps.api': '\n Next steps:\n 1. Create an endpoint on your server that accepts {message, history} and calls your LLM.\n 2. Update LLM_CHAT_ENDPOINT in .vscode/launch.json with your endpoint URL.\n 3. Run the app: kasy run\n',
|
|
865
|
+
'cli.command.remove.description': 'Remove a feature you no longer use (e.g.: kasy remove sentry)',
|
|
866
|
+
'remove.error.noModule': 'Provide a feature name. Usage: kasy remove <feature>',
|
|
867
|
+
'remove.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
868
|
+
'remove.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
|
|
869
|
+
'remove.error.notActive': 'Feature "{module}" is not active in this project.',
|
|
870
|
+
'remove.confirm': 'Remove feature "{module}"? This will delete files and dependencies.',
|
|
871
|
+
'remove.cancelled': 'Cancelled.',
|
|
872
|
+
'remove.removing': 'Removing feature: {module}',
|
|
873
|
+
'remove.pubGet': 'Installing Flutter packages (flutter pub get)...',
|
|
874
|
+
'remove.pubGetDone': 'Dependencies updated',
|
|
875
|
+
'remove.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
|
|
876
|
+
'remove.buildRunner': 'Generating code (Riverpod/Freezed)...',
|
|
877
|
+
'remove.buildRunnerDone': 'Code generation complete',
|
|
878
|
+
'remove.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
|
|
879
|
+
'remove.success': 'Feature "{module}" removed successfully.',
|
|
880
|
+
'remove.warn.ci': 'CI files removed. If you had custom workflow files, restore them from git.',
|
|
881
|
+
'remove.warn.sentry.shared': 'sentry_flutter kept — still required by active features (revenuecat/facebook).',
|
|
882
|
+
'cli.command.update.description': 'Update parts of your app to the latest (e.g.: kasy update components)',
|
|
883
|
+
'cli.command.update.targetArg': 'Target to update (e.g. revenuecat, sentry, components)',
|
|
884
|
+
'update.error.noProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
885
|
+
'update.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
|
|
886
|
+
'update.error.unknownTarget': 'Unknown update target: {module}\nAvailable: {list}',
|
|
887
|
+
'update.error.notActive': 'Feature "{module}" is not active in this project.',
|
|
888
|
+
'update.alreadyUpToDate': 'Project is already up to date (v{version}).',
|
|
889
|
+
'update.status': 'Project: v{from} → CLI: v{to}',
|
|
890
|
+
'update.noVersion': 'Project was generated without version tracking. All features can be updated.',
|
|
891
|
+
'update.changesTitle': 'Updates available:',
|
|
892
|
+
'update.reapplyTitle': 'No new changes — can re-apply if needed:',
|
|
893
|
+
'update.howToUpdate': 'To update a feature:',
|
|
894
|
+
'update.howToUpdateComponents': 'To update base components:',
|
|
895
|
+
'update.warn.commit': 'This will overwrite files from feature "{module}". Make sure you have committed your changes first.',
|
|
896
|
+
'update.warn.commitComponents': 'This will overwrite base component files. Make sure you have committed your changes first.',
|
|
897
|
+
'update.confirm': 'Overwrite feature "{module}" files with the latest version?',
|
|
898
|
+
'update.confirmComponents': 'Overwrite base component files with the latest version?',
|
|
899
|
+
'update.confirmCore': 'Overwrite core files (animations, widgets, theme, dev tools) with the latest version?',
|
|
900
|
+
'update.cancelled': 'Cancelled.',
|
|
901
|
+
'update.applying': 'Applying update for feature: {module}',
|
|
902
|
+
'update.applyingComponents': 'Applying update for base components...',
|
|
903
|
+
'update.applyingCore': 'Applying update for core files...',
|
|
904
|
+
'update.applied': 'Feature {module} updated',
|
|
905
|
+
'update.appliedComponents': '{count} base component files updated',
|
|
906
|
+
'update.appliedCore': '{count} core files updated',
|
|
907
|
+
'update.applyFailed': 'Failed to apply update for feature {module}',
|
|
908
|
+
'update.applyComponentsFailed': 'Failed to apply update for base components',
|
|
909
|
+
'update.noPatch': 'Feature "{module}" has no files to update (configuration-only feature).',
|
|
910
|
+
'update.noComponentFiles': 'No base component files were found to update.',
|
|
911
|
+
'update.pubGet': 'Installing Flutter packages (flutter pub get)...',
|
|
912
|
+
'update.pubGetDone': 'Dependencies updated',
|
|
913
|
+
'update.pubGetFailed': 'Failed to install Flutter packages — run `flutter pub get` manually',
|
|
914
|
+
'update.buildRunner': 'Generating code (Riverpod/Freezed)...',
|
|
915
|
+
'update.buildRunnerDone': 'Code generation complete',
|
|
916
|
+
'update.buildRunnerFailed': 'Code generation failed — run `dart run build_runner build` manually',
|
|
917
|
+
'update.success': 'Feature "{module}" updated successfully.',
|
|
918
|
+
'update.componentsSuccess': 'Base components updated successfully.',
|
|
919
|
+
'update.coreSuccess': 'Core files updated successfully.',
|
|
920
|
+
'check.intro': 'Kasy Check — Push Notifications',
|
|
921
|
+
'check.firebase.detected': 'Firebase backend',
|
|
922
|
+
'check.firebase.adcInfo': 'Firebase uses Application Default Credentials — no extra setup needed.',
|
|
923
|
+
'check.apns.warn': 'iOS push requires APNs Key (cannot be verified via CLI)',
|
|
924
|
+
'check.apns.where': 'Firebase Console → Cloud Messaging → iOS app → APNs Authentication Key',
|
|
925
|
+
'check.done': 'Done',
|
|
926
|
+
'check.notKasy': 'This directory does not look like a Kasy project.',
|
|
927
|
+
'check.aborted': 'Aborted',
|
|
928
|
+
'check.supabase.notLinked': 'Supabase project not linked',
|
|
929
|
+
'check.supabase.notLinkedHint': 'run: supabase link --project-ref YOUR_REF',
|
|
930
|
+
'check.supabase.linked': 'Project linked',
|
|
931
|
+
'check.spin.secrets': 'Checking secrets…',
|
|
932
|
+
'check.spin.secretsDone': 'Secrets checked',
|
|
933
|
+
'check.secrets.listFailed': 'Could not list secrets',
|
|
934
|
+
'check.secrets.checkLogin': 'verify: supabase login',
|
|
935
|
+
'check.fbProjId.ok': 'FIREBASE_PROJECT_ID configured',
|
|
936
|
+
'check.fbProjId.missing': 'FIREBASE_PROJECT_ID missing',
|
|
937
|
+
'check.fbProjId.fixHint': 'Fix: supabase secrets set FIREBASE_PROJECT_ID="{id}"',
|
|
938
|
+
'check.fbProjId.fixed': 'FIREBASE_PROJECT_ID → set automatically',
|
|
939
|
+
'check.fbProjId.fixFailed': 'FIREBASE_PROJECT_ID → failed to set',
|
|
940
|
+
'check.fbSak.ok': 'FIREBASE_SERVICE_ACCOUNT_JSON configured',
|
|
941
|
+
'check.fbSak.missing': 'FIREBASE_SERVICE_ACCOUNT_JSON missing',
|
|
942
|
+
'check.fbSak.spin': 'Generating and setting FCM key…',
|
|
943
|
+
'check.fbSak.spinDone': 'FCM key generated',
|
|
944
|
+
'check.fbSak.fixed': 'FIREBASE_SERVICE_ACCOUNT_JSON → set automatically',
|
|
945
|
+
'check.fbSak.fixFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → failed to set',
|
|
946
|
+
'check.fbSak.genFailed': 'FIREBASE_SERVICE_ACCOUNT_JSON → could not generate key',
|
|
947
|
+
'check.fbSak.manual': "Manual: Firebase Console → Settings → Service accounts → Generate key\nThen: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat key.json)'",
|
|
948
|
+
'check.fbSak.hint': "Auto-fix: kasy check --fix\nOr manually: Firebase Console → Settings → Service accounts → Generate key\nThen: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='$(cat key.json)'",
|
|
949
|
+
'check.fn.spin': 'Checking edge functions…',
|
|
950
|
+
'check.fn.spinDone': 'Edge functions checked',
|
|
951
|
+
'check.fn.listFailed': 'Could not list edge functions',
|
|
952
|
+
'check.fn.deployed': 'Edge function send-push-notification deployed',
|
|
953
|
+
'check.fn.missing': 'Edge function send-push-notification not deployed',
|
|
954
|
+
'check.fn.deploySpin': 'Deploying send-push-notification…',
|
|
955
|
+
'check.fn.deployDone': 'send-push-notification → deployed automatically',
|
|
956
|
+
'check.fn.deployFailed': 'send-push-notification → deploy failed',
|
|
957
|
+
'check.fn.hint': 'Auto-fix: kasy check --fix\nOr manually: supabase functions deploy send-push-notification',
|
|
958
|
+
'deploy.firebase.intro': 'Deploy — Firebase',
|
|
959
|
+
'deploy.firebase.spin': 'Deploying Firebase...',
|
|
960
|
+
'deploy.firebase.spinDone': 'Firebase deploy completed',
|
|
961
|
+
'deploy.apns.title': 'iOS push: configure the APNs Key in Firebase Console',
|
|
962
|
+
'deploy.apns.step1': '1. Apple Developer Portal → Keys → create APNs Key (.p8)',
|
|
963
|
+
'deploy.apns.step2': '2. Firebase Console → Cloud Messaging → iOS app → upload APNs Key',
|
|
964
|
+
'deploy.supabase.intro': 'Deploy — Supabase',
|
|
965
|
+
'deploy.supabase.notLinked': 'Supabase project not linked in this directory.',
|
|
966
|
+
'deploy.supabase.linkHint': 'Run: supabase link --project-ref YOUR_PROJECT_REF',
|
|
967
|
+
'deploy.supabase.projectRef': 'Project ref: {ref}',
|
|
968
|
+
'deploy.supabase.sakAlready': 'FIREBASE_SERVICE_ACCOUNT_JSON already configured',
|
|
969
|
+
'deploy.supabase.sakSpin': 'Generating FCM key (Service Account)…',
|
|
970
|
+
'deploy.supabase.sakSpinDone': 'FCM key generated',
|
|
971
|
+
'deploy.supabase.sakManual': "Configure manually: supabase secrets set FIREBASE_SERVICE_ACCOUNT_JSON='...'",
|
|
972
|
+
'deploy.supabase.sakNoGS': 'google-services.json not found — configure manually',
|
|
973
|
+
'deploy.supabase.fnSpin': 'Deploying edge functions…',
|
|
974
|
+
'deploy.supabase.fnSpinDone': 'Edge functions processed',
|
|
975
|
+
'deploy.supabase.fnNone': 'edge functions (none found)',
|
|
976
|
+
'deploy.outro': 'Deploy completed',
|
|
977
|
+
};
|