kasy-cli 1.13.0 → 1.14.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 +122 -7
- package/lib/commands/add.js +2 -2
- package/lib/commands/codemagic.js +11 -4
- package/lib/commands/deploy.js +3 -3
- package/lib/commands/favicon.js +115 -0
- package/lib/commands/icon.js +143 -0
- package/lib/commands/ios.js +20 -5
- package/lib/commands/new.js +8 -20
- package/lib/commands/remove.js +1 -1
- package/lib/commands/reset.js +287 -0
- package/lib/commands/run.js +24 -17
- package/lib/commands/splash.js +3 -4
- package/lib/commands/update.js +1 -1
- package/lib/scaffold/backends/api/patch/README.md +1 -1
- package/lib/scaffold/backends/api/patch/android/app/src/main/AndroidManifest.xml +1 -1
- package/lib/scaffold/backends/api/patch/lib/features/notifications/api/device_api.dart +53 -0
- package/lib/scaffold/backends/api/pubspec.yaml.tpl +11 -1
- package/lib/scaffold/backends/firebase/tokens.js +2 -2
- package/lib/scaffold/backends/supabase/edge-functions/send-push-notification/index.ts +8 -2
- package/lib/scaffold/backends/supabase/migrations/20240101000011_dedupe_device_tokens.sql +34 -0
- package/lib/scaffold/backends/supabase/patch/README.md +1 -1
- package/lib/scaffold/backends/supabase/patch/android/app/src/main/AndroidManifest.xml +1 -1
- package/lib/scaffold/backends/supabase/patch/lib/features/notifications/api/device_api.dart +43 -0
- package/lib/scaffold/backends/supabase/pubspec.yaml.tpl +11 -1
- package/lib/utils/apple-release.js +85 -16
- package/lib/utils/checks.js +4 -105
- package/lib/utils/flutter-run.js +173 -0
- package/lib/utils/i18n.js +335 -0
- package/lib/utils/mobile-identity.js +35 -0
- package/lib/utils/ui.js +114 -0
- package/package.json +1 -2
- package/templates/firebase/README.en.md +1 -1
- package/templates/firebase/README.es.md +1 -1
- package/templates/firebase/README.md +1 -1
- package/templates/firebase/android/app/build.gradle.kts +10 -1
- package/templates/firebase/android/app/src/main/AndroidManifest.xml +1 -1
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MainActivity.kt +25 -1
- package/templates/firebase/android/app/src/main/kotlin/com/aicrus/firebase/kit/MyWidget.kt +160 -11
- package/templates/firebase/android/app/src/main/res/drawable/widget_add_button.xml +15 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_bg.xml +9 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_gradient_inner.xml +12 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_plan_pill_bg.xml +5 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_preview_image.xml +17 -0
- package/templates/firebase/android/app/src/main/res/drawable/widget_pro_pill_bg.xml +5 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_loading.xml +8 -0
- package/templates/firebase/android/app/src/main/res/layout/widget_preview.xml +46 -0
- package/templates/firebase/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/templates/firebase/android/app/src/main/res/xml/mywidget_info.xml +9 -3
- package/templates/firebase/assets/images/favicon.png +0 -0
- package/templates/firebase/assets/images/icon.png +0 -0
- package/templates/firebase/firestore.indexes.json +10 -0
- package/templates/firebase/functions/src/core/data/entities/user_device_entity.ts +3 -0
- package/templates/firebase/functions/src/core/data/repositories/user_device_repository.ts +17 -1
- package/templates/firebase/functions/src/index.ts +1 -0
- package/templates/firebase/functions/src/notifications/device_triggers.ts +58 -0
- package/templates/firebase/ios/HomeWidgetExtension/MyWidget.swift +116 -33
- package/templates/firebase/ios/Runner/AppDelegate.swift +17 -1
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
- package/templates/firebase/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
- package/templates/firebase/ios/Runner/Info.plist +2 -2
- package/templates/firebase/ios/Runner/es.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/ios/Runner/pt-BR.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/ios/Runner/pt.lproj/InfoPlist.strings +1 -1
- package/templates/firebase/lib/components/kasy_button.dart +8 -0
- package/templates/firebase/lib/core/bottom_menu/kasy_bottom_bar_factory.dart +18 -0
- package/templates/firebase/lib/core/home_widgets/home_widget_mywidget_service.dart +67 -19
- package/templates/firebase/lib/core/home_widgets/home_widget_service.dart +22 -8
- package/templates/firebase/lib/core/shared_preferences/shared_preferences.dart +16 -4
- package/templates/firebase/lib/core/states/components/maybeshow_component.dart +4 -8
- package/templates/firebase/lib/core/states/user_state_notifier.dart +13 -1
- package/templates/firebase/lib/features/home/home_page.dart +0 -6
- package/templates/firebase/lib/features/notifications/api/device_api.dart +57 -0
- package/templates/firebase/lib/features/notifications/providers/models/notification.dart +11 -1
- package/templates/firebase/lib/features/notifications/repositories/device_repository.dart +9 -0
- package/templates/firebase/lib/features/notifications/repositories/notifications_repository.dart +1 -4
- package/templates/firebase/lib/features/notifications/shared/att_permission.dart +28 -8
- package/templates/firebase/lib/features/notifications/ui/notifications_page.dart +16 -1
- package/templates/firebase/lib/features/notifications/ui/widgets/empty_notifications.dart +44 -11
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_bottom_sheet.dart +31 -29
- package/templates/firebase/lib/features/settings/ui/components/language_switcher.dart +21 -5
- package/templates/firebase/lib/i18n/en.i18n.json +4 -1
- package/templates/firebase/lib/i18n/es.i18n.json +4 -1
- package/templates/firebase/lib/i18n/pt.i18n.json +4 -1
- package/templates/firebase/pubspec.yaml +6 -1
- package/templates/firebase/test/features/notifications/data/device_api_fake.dart +9 -0
- package/templates/firebase/web/favicon.png +0 -0
- package/templates/firebase/web/icons/Icon-192.png +0 -0
- package/templates/firebase/web/icons/Icon-512.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-192.png +0 -0
- package/templates/firebase/web/icons/Icon-maskable-512.png +0 -0
- package/templates/firebase/web/index.html +3 -0
- package/templates/firebase/web/manifest.json +3 -3
- package/templates/firebase/assets/images/app_icon.png +0 -0
- package/templates/firebase/assets/images/onboarding/img1.jpg +0 -0
- package/templates/firebase/assets/images/onboarding/onboarding.png +0 -0
- package/templates/firebase/lib/core/states/components/maybe_ask_biometric_setup.dart +0 -88
- package/templates/firebase/lib/features/notifications/shared/notification_permission_bottom_sheet.dart +0 -144
package/lib/utils/i18n.js
CHANGED
|
@@ -284,15 +284,24 @@ const MESSAGES = {
|
|
|
284
284
|
'cli.command.ios.release.description': 'Bump build, create IPA, and upload to App Store Connect',
|
|
285
285
|
'cli.command.ios.build.description': 'Build IPA only (no upload)',
|
|
286
286
|
'cli.command.ios.clean.description': 'Clean Flutter/Xcode caches before a failed iOS build',
|
|
287
|
+
'cli.command.ios.picker.intro': 'Publish to the App Store',
|
|
288
|
+
'cli.command.ios.picker.message': 'What do you want to do?',
|
|
289
|
+
'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',
|
|
287
290
|
'cli.command.codemagic.description': 'Build the app in the cloud (no Mac needed)',
|
|
288
291
|
'cli.command.codemagic.configure.description': 'Configure Codemagic API credentials',
|
|
289
292
|
'cli.command.codemagic.release.description': 'Start a Codemagic iOS workflow build',
|
|
290
293
|
'cli.command.codemagic.status.description': 'Show Codemagic build status by ID',
|
|
294
|
+
'cli.command.codemagic.picker.intro': 'Build in the cloud with Codemagic',
|
|
295
|
+
'cli.command.codemagic.picker.message': 'What do you want to do?',
|
|
296
|
+
'cli.command.codemagic.picker.statusHint': 'Asks for the build ID',
|
|
297
|
+
'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',
|
|
291
298
|
|
|
292
299
|
'ios.configure.title': 'iOS App Store — setup',
|
|
293
300
|
'ios.configure.bundleId': 'Bundle ID',
|
|
294
301
|
'ios.configure.doc': 'Guide',
|
|
295
302
|
'ios.configure.openingLinks': 'Opening App Store Connect in your browser…',
|
|
303
|
+
'ios.configure.note.title': 'I will ask 3 things from App Store Connect',
|
|
304
|
+
'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.',
|
|
296
305
|
'ios.configure.q.apiKey': 'App Store Connect API Key ID',
|
|
297
306
|
'ios.configure.q.issuerId': 'Issuer ID (UUID)',
|
|
298
307
|
'ios.configure.q.p8Path': 'Path to downloaded AuthKey_XXXXX.p8 file',
|
|
@@ -305,14 +314,22 @@ const MESSAGES = {
|
|
|
305
314
|
'ios.configure.next': 'Next',
|
|
306
315
|
'ios.release.title': 'Building and uploading iOS release…',
|
|
307
316
|
'ios.release.success': 'iOS release uploaded',
|
|
317
|
+
'ios.release.task.building': 'Building IPA (this can take 2-5 min)…',
|
|
318
|
+
'ios.release.task.uploading': 'Uploading IPA to App Store Connect…',
|
|
319
|
+
'ios.release.task.done': 'Build + upload finished',
|
|
320
|
+
'ios.release.task.failed': 'Build failed — see output below',
|
|
308
321
|
'ios.build.title': 'Building iOS IPA…',
|
|
309
322
|
'ios.build.success': 'IPA built',
|
|
323
|
+
'ios.build.task.building': 'Building IPA (this can take 2-5 min)…',
|
|
324
|
+
'ios.build.task.done': 'IPA built at build/ios/ipa/',
|
|
325
|
+
'ios.build.task.failed': 'Build failed — see output below',
|
|
310
326
|
'ios.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
|
|
311
327
|
'ios.error.noScript': 'scripts/release-ios.sh not found. Run: kasy update ios-release',
|
|
312
328
|
'ios.error.notMac': 'iOS release requires macOS with Xcode.',
|
|
313
329
|
'ios.error.useCodemagic': 'Use cloud release instead',
|
|
314
330
|
'ios.error.notConfigured': 'Apple credentials not configured',
|
|
315
331
|
'ios.error.runConfigure': 'Run: kasy ios configure',
|
|
332
|
+
'ios.release.askConfigure': 'Want to configure Apple credentials now?',
|
|
316
333
|
'ios.error.signing': 'iOS code signing is not configured (DEVELOPMENT_TEAM missing).',
|
|
317
334
|
'ios.error.signingHint': 'Open ios/Runner.xcworkspace in Xcode → Runner → Signing & Capabilities → select your Team.',
|
|
318
335
|
'ios.error.googleUrlScheme': 'Google Sign-In iOS URL scheme is not configured.',
|
|
@@ -345,8 +362,12 @@ const MESSAGES = {
|
|
|
345
362
|
'codemagic.configure.next': 'Next',
|
|
346
363
|
'codemagic.release.title': 'Triggering Codemagic build…',
|
|
347
364
|
'codemagic.release.triggered': 'Build started',
|
|
365
|
+
'codemagic.release.spin': 'Starting build on Codemagic…',
|
|
366
|
+
'codemagic.release.spinDone': 'Build queued on Codemagic',
|
|
348
367
|
'codemagic.status.title': 'Build status',
|
|
349
368
|
'codemagic.status.usage': 'Usage: kasy codemagic status <buildId>',
|
|
369
|
+
'codemagic.status.spin': 'Fetching build status…',
|
|
370
|
+
'codemagic.status.spinDone': 'Status fetched',
|
|
350
371
|
'codemagic.error.notProject': 'Not a Flutter iOS project (pubspec.yaml + ios/ required).',
|
|
351
372
|
'codemagic.error.notConfigured': 'Codemagic not configured',
|
|
352
373
|
'codemagic.error.addCi': 'Add CI first: kasy add ci (creates codemagic.yaml)',
|
|
@@ -605,9 +626,50 @@ const MESSAGES = {
|
|
|
605
626
|
'run.launching': 'Launching Flutter app...',
|
|
606
627
|
'run.updateHint.prefix': 'Project improvements available —',
|
|
607
628
|
'run.updateHint.suffix': 'to see what\'s new',
|
|
629
|
+
'run.spinner.building': 'Starting Flutter…',
|
|
630
|
+
'run.spinner.ready': 'Flutter ready — use r (reload), R (restart), q (quit)',
|
|
631
|
+
'run.spinner.failed': 'Flutter run failed before starting',
|
|
632
|
+
'run.stage.gradleFirstTime': 'Building Android (first run takes 5-15 min while Gradle downloads deps)…',
|
|
633
|
+
'run.stage.gradle': 'Building Android…',
|
|
634
|
+
'run.stage.xcode': 'Building iOS…',
|
|
635
|
+
'run.stage.pods': 'Installing iOS pods…',
|
|
636
|
+
'run.stage.installing': 'Installing on device…',
|
|
637
|
+
'run.stage.syncing': 'Syncing files to device…',
|
|
638
|
+
'run.stage.buildSuccess': 'Build done — launching app…',
|
|
608
639
|
'run.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
|
|
609
640
|
'run.error.flutterNotFound': 'Flutter not found. Make sure Flutter is installed and on your PATH.',
|
|
610
641
|
|
|
642
|
+
// reset command
|
|
643
|
+
'cli.command.reset.description': 'Uninstall the app on a simulator/emulator/device so you can test as a fresh install',
|
|
644
|
+
'reset.title': 'Reset app on device',
|
|
645
|
+
'reset.scanning': 'Looking for running simulators, emulators and connected devices...',
|
|
646
|
+
'reset.prompt.pickDevice': 'Which one do you want to reset?',
|
|
647
|
+
'reset.resetting': 'Resetting',
|
|
648
|
+
'reset.reinstalling': 'Reinstalling the app...',
|
|
649
|
+
'reset.success.uninstalled': 'App uninstalled. All local data and permissions cleared.',
|
|
650
|
+
'reset.info.notInstalled': 'App was not installed on this device.',
|
|
651
|
+
'reset.warn.noDevices': 'No matching simulator, emulator or device is running. Start one and try again.',
|
|
652
|
+
'reset.warn.nothingSelected': 'No device selected.',
|
|
653
|
+
'reset.warn.iosUninstallFailed': 'simctl uninstall failed.',
|
|
654
|
+
'reset.warn.androidUninstallFailed': 'adb uninstall did not return success.',
|
|
655
|
+
'reset.warn.iosDeviceManual': 'iOS physical device: remove the app manually (long-press the icon → Remove App), then reinstall with kasy run.',
|
|
656
|
+
'reset.warn.iosDeviceUninstallFailed': 'devicectl uninstall failed. Make sure the device is unlocked and trusted by this Mac.',
|
|
657
|
+
'reset.warn.webIncognito': 'Web: open the app in an incognito / private window of your browser to test as a fresh visitor.',
|
|
658
|
+
'reset.warn.unknownPlatform': 'Unsupported platform',
|
|
659
|
+
'reset.error.notFlutterProject': 'No pubspec.yaml found. Run this command from inside a Flutter project.',
|
|
660
|
+
'reset.error.noIdentifier': 'Could not read bundle id or Android package name from this project.',
|
|
661
|
+
'reset.error.noBundleId': 'iOS bundle id not found for this project.',
|
|
662
|
+
'reset.error.noPackageName': 'Android applicationId not found for this project.',
|
|
663
|
+
'reset.outro.skipped': 'Done. App was not uninstalled.',
|
|
664
|
+
'reset.outro.uninstalledOnly': 'Done. Run kasy run to reinstall.',
|
|
665
|
+
'reset.outro.cancelled': 'Cancelled. App was not uninstalled.',
|
|
666
|
+
'reset.prompt.xcodeOpen': 'Xcode is open and will conflict with the install. What do you want to do?',
|
|
667
|
+
'reset.prompt.xcodeOpen.close': 'Close Xcode automatically (recommended)',
|
|
668
|
+
'reset.prompt.xcodeOpen.skip': 'Leave Xcode open and try anyway',
|
|
669
|
+
'reset.prompt.xcodeOpen.cancel': 'Cancel reset',
|
|
670
|
+
'reset.info.xcodeClosed': 'Xcode closed.',
|
|
671
|
+
'reset.prompt.reinstallNow': 'App removed. Check the device, then reinstall now?',
|
|
672
|
+
|
|
611
673
|
// doctor project checks
|
|
612
674
|
'doctor.project.title': 'Project',
|
|
613
675
|
'doctor.project.appName': 'App name',
|
|
@@ -650,9 +712,60 @@ const MESSAGES = {
|
|
|
650
712
|
'splash.error.notPng': 'One of the files is not a valid PNG.',
|
|
651
713
|
'splash.error.generateFailed': 'flutter_native_splash:create failed. Check the output above.',
|
|
652
714
|
|
|
715
|
+
// icon command
|
|
716
|
+
'cli.command.icon.description': 'Swap the app icon (iOS + Android) and regenerate native assets',
|
|
717
|
+
'icon.intro': 'App icon',
|
|
718
|
+
'icon.validating': 'Validating PNG file...',
|
|
719
|
+
'icon.validated': 'PNG looks good',
|
|
720
|
+
'icon.copying': 'Copying icon to assets/images/icon.png...',
|
|
721
|
+
'icon.copied': 'Icon copied',
|
|
722
|
+
'icon.generating': 'Regenerating native icons (Android + iOS)...',
|
|
723
|
+
'icon.generated': 'Native icons regenerated',
|
|
724
|
+
'icon.done': 'Done. Uninstall the app from the device and reinstall to see the new icon.',
|
|
725
|
+
'icon.warn.title': 'Warnings',
|
|
726
|
+
'icon.warn.notSquare': 'Icon is {w}x{h} (not square). The image will be stretched. Use a square image (1024x1024 recommended).',
|
|
727
|
+
'icon.warn.small': 'Icon is {w}x{h}. Recommended is at least 1024x1024 (App Store requires this size).',
|
|
728
|
+
'icon.warn.hasAlpha': 'Icon has transparency. iOS rejects icons with alpha channel — flutter_launcher_icons will remove it automatically (remove_alpha_ios: true).',
|
|
729
|
+
'icon.summary.title': 'Saved',
|
|
730
|
+
'icon.summary.icon': 'App icon',
|
|
731
|
+
'icon.skipGenerate.title': 'Skipped generation',
|
|
732
|
+
'icon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
|
|
733
|
+
'icon.reinstall.title': 'Important',
|
|
734
|
+
'icon.reinstall.hint': 'iOS and Android cache the old icon. Uninstall the app and reinstall to see the new one.',
|
|
735
|
+
'icon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
|
|
736
|
+
'icon.error.imageRequired': '--image is required.',
|
|
737
|
+
'icon.error.fileNotFound': 'File not found: {path}',
|
|
738
|
+
'icon.error.notPng': 'The file is not a valid PNG.',
|
|
739
|
+
'icon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
|
|
740
|
+
|
|
741
|
+
// favicon command
|
|
742
|
+
'cli.command.favicon.description': 'Swap the web favicon / PWA icon and regenerate web assets',
|
|
743
|
+
'favicon.intro': 'Web favicon',
|
|
744
|
+
'favicon.validating': 'Validating PNG file...',
|
|
745
|
+
'favicon.validated': 'PNG looks good',
|
|
746
|
+
'favicon.copying': 'Copying favicon to assets/images/favicon.png...',
|
|
747
|
+
'favicon.copied': 'Favicon copied',
|
|
748
|
+
'favicon.generating': 'Regenerating web icons (favicon + PWA sizes)...',
|
|
749
|
+
'favicon.generated': 'Web icons regenerated',
|
|
750
|
+
'favicon.done': 'Done. Run "flutter run -d chrome" to see the new favicon.',
|
|
751
|
+
'favicon.warn.title': 'Warnings',
|
|
752
|
+
'favicon.warn.notSquare': 'Favicon is {w}x{h} (not square). It will be stretched. Use a square image (512x512+ recommended).',
|
|
753
|
+
'favicon.warn.small': 'Favicon is {w}x{h}. Recommended is at least 512x512 so it stays sharp on PWA install screens.',
|
|
754
|
+
'favicon.summary.title': 'Saved',
|
|
755
|
+
'favicon.summary.favicon': 'Favicon',
|
|
756
|
+
'favicon.skipGenerate.title': 'Skipped generation',
|
|
757
|
+
'favicon.skipGenerate.hint': 'Run `dart run flutter_launcher_icons` when you are ready.',
|
|
758
|
+
'favicon.error.notKasyProject': 'pubspec.yaml not found. Run this command from inside a Flutter/Kasy project.',
|
|
759
|
+
'favicon.error.imageRequired': '--image is required.',
|
|
760
|
+
'favicon.error.fileNotFound': 'File not found: {path}',
|
|
761
|
+
'favicon.error.notPng': 'The file is not a valid PNG.',
|
|
762
|
+
'favicon.error.generateFailed': 'flutter_launcher_icons failed. Check the output above.',
|
|
763
|
+
|
|
653
764
|
// notifications command
|
|
654
765
|
'cli.command.notifications.description': 'Edit the text of local notifications and reminders',
|
|
655
766
|
'cli.command.notifications.text.description': 'Set titles and bodies shown in local notifications',
|
|
767
|
+
'cli.command.notifications.picker.intro': 'Edit notification texts',
|
|
768
|
+
'cli.command.notifications.picker.message': 'What do you want to do?',
|
|
656
769
|
'notifications.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
657
770
|
'notifications.error.noI18n': 'lib/i18n/*.i18n.json not found in this project.',
|
|
658
771
|
'notifications.error.noFeatures': 'lib/core/config/features.dart not found.',
|
|
@@ -1107,15 +1220,24 @@ const MESSAGES = {
|
|
|
1107
1220
|
'cli.command.ios.release.description': 'Incrementa build, gera IPA e envia para App Store Connect',
|
|
1108
1221
|
'cli.command.ios.build.description': 'Só gera o IPA (sem enviar)',
|
|
1109
1222
|
'cli.command.ios.clean.description': 'Limpa caches Flutter/Xcode após falha no build iOS',
|
|
1223
|
+
'cli.command.ios.picker.intro': 'Publicar na App Store',
|
|
1224
|
+
'cli.command.ios.picker.message': 'O que você quer fazer?',
|
|
1225
|
+
'cli.command.ios.help.before': 'Como publicar na App Store:\n 1) kasy ios configure → faça isso uma vez (salva as credenciais Apple)\n 2) kasy ios release → rode em cada nova versão (build + envio)\n\nUse "build" se quiser só gerar o IPA, "clean" se um build falhou.\n',
|
|
1110
1226
|
'cli.command.codemagic.description': 'Compila o app na nuvem (sem precisar de Mac)',
|
|
1111
1227
|
'cli.command.codemagic.configure.description': 'Configurar credenciais da API Codemagic',
|
|
1112
1228
|
'cli.command.codemagic.release.description': 'Iniciar build do workflow iOS no Codemagic',
|
|
1113
1229
|
'cli.command.codemagic.status.description': 'Status do build Codemagic por ID',
|
|
1230
|
+
'cli.command.codemagic.picker.intro': 'Compilar na nuvem com Codemagic',
|
|
1231
|
+
'cli.command.codemagic.picker.message': 'O que você quer fazer?',
|
|
1232
|
+
'cli.command.codemagic.picker.statusHint': 'Pergunta o ID do build',
|
|
1233
|
+
'cli.command.codemagic.help.before': 'Como compilar com Codemagic (sem precisar de Mac):\n 1) kasy codemagic configure → faça isso uma vez (salva o token da API)\n 2) kasy codemagic release → inicia um build na nuvem a cada versão\n\nUse "status <buildId>" para acompanhar o progresso de um build.\n',
|
|
1114
1234
|
|
|
1115
1235
|
'ios.configure.title': 'App Store iOS — configuração',
|
|
1116
1236
|
'ios.configure.bundleId': 'Bundle ID',
|
|
1117
1237
|
'ios.configure.doc': 'Guia',
|
|
1118
1238
|
'ios.configure.openingLinks': 'Abrindo App Store Connect no navegador…',
|
|
1239
|
+
'ios.configure.note.title': 'Vou precisar de 3 coisas do App Store Connect',
|
|
1240
|
+
'ios.configure.note.body': '1) API Key ID — em Users and Access → Keys.\n2) Issuer ID — no topo da mesma página.\n3) O arquivo .p8 (chave privada) baixado quando você criou a key.\n\nO App ID é opcional, só usa se tiver vários apps.',
|
|
1119
1241
|
'ios.configure.q.apiKey': 'Key ID da API App Store Connect',
|
|
1120
1242
|
'ios.configure.q.issuerId': 'Issuer ID (UUID)',
|
|
1121
1243
|
'ios.configure.q.p8Path': 'Caminho do arquivo AuthKey_XXXXX.p8 baixado',
|
|
@@ -1128,14 +1250,22 @@ const MESSAGES = {
|
|
|
1128
1250
|
'ios.configure.next': 'Próximo passo',
|
|
1129
1251
|
'ios.release.title': 'Gerando e enviando release iOS…',
|
|
1130
1252
|
'ios.release.success': 'Release iOS enviada',
|
|
1253
|
+
'ios.release.task.building': 'Compilando IPA (pode levar 2-5 min)…',
|
|
1254
|
+
'ios.release.task.uploading': 'Enviando IPA para o App Store Connect…',
|
|
1255
|
+
'ios.release.task.done': 'Compilação + envio concluídos',
|
|
1256
|
+
'ios.release.task.failed': 'Compilação falhou — veja a saída abaixo',
|
|
1131
1257
|
'ios.build.title': 'Gerando IPA iOS…',
|
|
1132
1258
|
'ios.build.success': 'IPA gerado',
|
|
1259
|
+
'ios.build.task.building': 'Compilando IPA (pode levar 2-5 min)…',
|
|
1260
|
+
'ios.build.task.done': 'IPA pronto em build/ios/ipa/',
|
|
1261
|
+
'ios.build.task.failed': 'Compilação falhou — veja a saída abaixo',
|
|
1133
1262
|
'ios.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
|
|
1134
1263
|
'ios.error.noScript': 'scripts/release-ios.sh não encontrado. Execute: kasy update ios-release',
|
|
1135
1264
|
'ios.error.notMac': 'Release iOS local exige macOS com Xcode.',
|
|
1136
1265
|
'ios.error.useCodemagic': 'Use release na nuvem',
|
|
1137
1266
|
'ios.error.notConfigured': 'Credenciais Apple não configuradas',
|
|
1138
1267
|
'ios.error.runConfigure': 'Execute: kasy ios configure',
|
|
1268
|
+
'ios.release.askConfigure': 'Quer configurar as credenciais Apple agora?',
|
|
1139
1269
|
'ios.error.signing': 'Assinatura iOS não configurada (DEVELOPMENT_TEAM ausente).',
|
|
1140
1270
|
'ios.error.signingHint': 'Abra ios/Runner.xcworkspace no Xcode → Runner → Signing & Capabilities → escolha seu Team.',
|
|
1141
1271
|
'ios.error.googleUrlScheme': 'URL scheme iOS do Google Sign-In não configurado.',
|
|
@@ -1168,8 +1298,12 @@ const MESSAGES = {
|
|
|
1168
1298
|
'codemagic.configure.next': 'Próximo passo',
|
|
1169
1299
|
'codemagic.release.title': 'Disparando build no Codemagic…',
|
|
1170
1300
|
'codemagic.release.triggered': 'Build iniciado',
|
|
1301
|
+
'codemagic.release.spin': 'Iniciando build no Codemagic…',
|
|
1302
|
+
'codemagic.release.spinDone': 'Build enfileirado no Codemagic',
|
|
1171
1303
|
'codemagic.status.title': 'Status do build',
|
|
1172
1304
|
'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
|
|
1305
|
+
'codemagic.status.spin': 'Consultando status do build…',
|
|
1306
|
+
'codemagic.status.spinDone': 'Status obtido',
|
|
1173
1307
|
'codemagic.error.notProject': 'Não é um projeto Flutter iOS (pubspec.yaml + ios/ obrigatórios).',
|
|
1174
1308
|
'codemagic.error.notConfigured': 'Codemagic não configurado',
|
|
1175
1309
|
'codemagic.error.addCi': 'Adicione CI primeiro: kasy add ci (cria codemagic.yaml)',
|
|
@@ -1425,9 +1559,48 @@ const MESSAGES = {
|
|
|
1425
1559
|
|
|
1426
1560
|
// run command
|
|
1427
1561
|
'cli.command.run.description': 'Roda o app no celular, simulador ou navegador',
|
|
1562
|
+
'cli.command.reset.description': 'Desinstala o app no simulador/emulador/dispositivo pra testar como primeira instalação',
|
|
1563
|
+
'reset.title': 'Resetar app no dispositivo',
|
|
1564
|
+
'reset.scanning': 'Procurando simuladores, emuladores e dispositivos conectados...',
|
|
1565
|
+
'reset.prompt.pickDevice': 'Em qual deles você quer resetar?',
|
|
1566
|
+
'reset.resetting': 'Resetando',
|
|
1567
|
+
'reset.reinstalling': 'Reinstalando o app...',
|
|
1568
|
+
'reset.success.uninstalled': 'App desinstalado. Todos os dados e permissões foram limpos.',
|
|
1569
|
+
'reset.info.notInstalled': 'O app não estava instalado neste dispositivo.',
|
|
1570
|
+
'reset.warn.noDevices': 'Nenhum simulador, emulador ou dispositivo em execução. Inicie um e tente de novo.',
|
|
1571
|
+
'reset.warn.nothingSelected': 'Nenhum dispositivo selecionado.',
|
|
1572
|
+
'reset.warn.iosUninstallFailed': 'simctl uninstall falhou.',
|
|
1573
|
+
'reset.warn.androidUninstallFailed': 'adb uninstall não retornou sucesso.',
|
|
1574
|
+
'reset.warn.iosDeviceManual': 'iPhone físico: apague o app manualmente (segure o ícone → Remover app), depois reinstale com kasy run.',
|
|
1575
|
+
'reset.warn.iosDeviceUninstallFailed': 'devicectl não conseguiu desinstalar. Verifique se o iPhone está desbloqueado e confia neste Mac.',
|
|
1576
|
+
'reset.warn.webIncognito': 'Web: abra o app em uma janela anônima/privada do navegador pra testar como visitante novo.',
|
|
1577
|
+
'reset.warn.unknownPlatform': 'Plataforma não suportada',
|
|
1578
|
+
'reset.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
|
|
1579
|
+
'reset.error.noIdentifier': 'Não consegui ler o bundle id nem o package name Android deste projeto.',
|
|
1580
|
+
'reset.error.noBundleId': 'Bundle id do iOS não encontrado.',
|
|
1581
|
+
'reset.error.noPackageName': 'applicationId do Android não encontrado.',
|
|
1582
|
+
'reset.outro.skipped': 'Pronto. O app não foi desinstalado.',
|
|
1583
|
+
'reset.outro.uninstalledOnly': 'Pronto. Rode kasy run pra reinstalar.',
|
|
1584
|
+
'reset.outro.cancelled': 'Cancelado. O app não foi desinstalado.',
|
|
1585
|
+
'reset.prompt.xcodeOpen': 'O Xcode está aberto e vai atrapalhar a instalação. O que você quer fazer?',
|
|
1586
|
+
'reset.prompt.xcodeOpen.close': 'Fechar o Xcode automaticamente (recomendado)',
|
|
1587
|
+
'reset.prompt.xcodeOpen.skip': 'Deixar o Xcode aberto e tentar mesmo assim',
|
|
1588
|
+
'reset.prompt.xcodeOpen.cancel': 'Cancelar o reset',
|
|
1589
|
+
'reset.info.xcodeClosed': 'Xcode fechado.',
|
|
1590
|
+
'reset.prompt.reinstallNow': 'App removido. Confere no dispositivo e reinstala agora?',
|
|
1428
1591
|
'run.launching': 'Iniciando app Flutter...',
|
|
1429
1592
|
'run.updateHint.prefix': 'Melhorias disponíveis para o projeto —',
|
|
1430
1593
|
'run.updateHint.suffix': 'para ver o que há de novo',
|
|
1594
|
+
'run.spinner.building': 'Iniciando Flutter…',
|
|
1595
|
+
'run.spinner.ready': 'Flutter pronto — use r (reload), R (restart), q (sair)',
|
|
1596
|
+
'run.spinner.failed': 'Flutter run falhou antes de iniciar',
|
|
1597
|
+
'run.stage.gradleFirstTime': 'Compilando Android (1ª vez leva 5-15 min — Gradle baixando dependências)…',
|
|
1598
|
+
'run.stage.gradle': 'Compilando Android…',
|
|
1599
|
+
'run.stage.xcode': 'Compilando iOS…',
|
|
1600
|
+
'run.stage.pods': 'Instalando pods iOS…',
|
|
1601
|
+
'run.stage.installing': 'Instalando no dispositivo…',
|
|
1602
|
+
'run.stage.syncing': 'Sincronizando arquivos com o dispositivo…',
|
|
1603
|
+
'run.stage.buildSuccess': 'Build pronto — abrindo o app…',
|
|
1431
1604
|
'run.error.notFlutterProject': 'Nenhum pubspec.yaml encontrado. Execute este comando dentro de um projeto Flutter.',
|
|
1432
1605
|
'run.error.flutterNotFound': 'Flutter não encontrado. Verifique se o Flutter está instalado e no PATH.',
|
|
1433
1606
|
|
|
@@ -1473,9 +1646,60 @@ const MESSAGES = {
|
|
|
1473
1646
|
'splash.error.notPng': 'Um dos arquivos não é um PNG válido.',
|
|
1474
1647
|
'splash.error.generateFailed': 'flutter_native_splash:create falhou. Veja a saída acima.',
|
|
1475
1648
|
|
|
1649
|
+
// icon command
|
|
1650
|
+
'cli.command.icon.description': 'Troca o ícone do app (iOS + Android) e regenera os assets nativos',
|
|
1651
|
+
'icon.intro': 'Ícone do app',
|
|
1652
|
+
'icon.validating': 'Validando arquivo PNG...',
|
|
1653
|
+
'icon.validated': 'PNG está bom',
|
|
1654
|
+
'icon.copying': 'Copiando ícone para assets/images/icon.png...',
|
|
1655
|
+
'icon.copied': 'Ícone copiado',
|
|
1656
|
+
'icon.generating': 'Regenerando ícones nativos (Android + iOS)...',
|
|
1657
|
+
'icon.generated': 'Ícones nativos regenerados',
|
|
1658
|
+
'icon.done': 'Pronto. Desinstale o app do dispositivo e reinstale para ver o novo ícone.',
|
|
1659
|
+
'icon.warn.title': 'Avisos',
|
|
1660
|
+
'icon.warn.notSquare': 'Ícone tem {w}x{h} (não é quadrado). A imagem vai ser esticada. Use uma imagem quadrada (1024x1024 recomendado).',
|
|
1661
|
+
'icon.warn.small': 'Ícone tem {w}x{h}. Recomendado pelo menos 1024x1024 (App Store exige esse tamanho).',
|
|
1662
|
+
'icon.warn.hasAlpha': 'Ícone tem transparência. iOS rejeita ícones com canal alpha — flutter_launcher_icons remove automaticamente (remove_alpha_ios: true).',
|
|
1663
|
+
'icon.summary.title': 'Salvo',
|
|
1664
|
+
'icon.summary.icon': 'Ícone do app',
|
|
1665
|
+
'icon.skipGenerate.title': 'Geração pulada',
|
|
1666
|
+
'icon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
|
|
1667
|
+
'icon.reinstall.title': 'Importante',
|
|
1668
|
+
'icon.reinstall.hint': 'iOS e Android cacheiam o ícone antigo. Desinstale o app e reinstale para ver o novo.',
|
|
1669
|
+
'icon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
|
|
1670
|
+
'icon.error.imageRequired': '--image é obrigatório.',
|
|
1671
|
+
'icon.error.fileNotFound': 'Arquivo não encontrado: {path}',
|
|
1672
|
+
'icon.error.notPng': 'O arquivo não é um PNG válido.',
|
|
1673
|
+
'icon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
|
|
1674
|
+
|
|
1675
|
+
// favicon command
|
|
1676
|
+
'cli.command.favicon.description': 'Troca o favicon / ícone PWA da web e regenera os assets web',
|
|
1677
|
+
'favicon.intro': 'Favicon web',
|
|
1678
|
+
'favicon.validating': 'Validando arquivo PNG...',
|
|
1679
|
+
'favicon.validated': 'PNG está bom',
|
|
1680
|
+
'favicon.copying': 'Copiando favicon para assets/images/favicon.png...',
|
|
1681
|
+
'favicon.copied': 'Favicon copiado',
|
|
1682
|
+
'favicon.generating': 'Regenerando ícones web (favicon + tamanhos PWA)...',
|
|
1683
|
+
'favicon.generated': 'Ícones web regenerados',
|
|
1684
|
+
'favicon.done': 'Pronto. Rode "flutter run -d chrome" para ver o novo favicon.',
|
|
1685
|
+
'favicon.warn.title': 'Avisos',
|
|
1686
|
+
'favicon.warn.notSquare': 'Favicon tem {w}x{h} (não é quadrado). Vai ser esticado. Use uma imagem quadrada (512x512+ recomendado).',
|
|
1687
|
+
'favicon.warn.small': 'Favicon tem {w}x{h}. Recomendado pelo menos 512x512 para ficar nítido nas telas de instalação da PWA.',
|
|
1688
|
+
'favicon.summary.title': 'Salvo',
|
|
1689
|
+
'favicon.summary.favicon': 'Favicon',
|
|
1690
|
+
'favicon.skipGenerate.title': 'Geração pulada',
|
|
1691
|
+
'favicon.skipGenerate.hint': 'Rode `dart run flutter_launcher_icons` quando quiser regenerar.',
|
|
1692
|
+
'favicon.error.notKasyProject': 'pubspec.yaml não encontrado. Rode este comando dentro de um projeto Flutter/Kasy.',
|
|
1693
|
+
'favicon.error.imageRequired': '--image é obrigatório.',
|
|
1694
|
+
'favicon.error.fileNotFound': 'Arquivo não encontrado: {path}',
|
|
1695
|
+
'favicon.error.notPng': 'O arquivo não é um PNG válido.',
|
|
1696
|
+
'favicon.error.generateFailed': 'flutter_launcher_icons falhou. Veja a saída acima.',
|
|
1697
|
+
|
|
1476
1698
|
// notifications command
|
|
1477
1699
|
'cli.command.notifications.description': 'Edita os textos das notificações locais e lembretes',
|
|
1478
1700
|
'cli.command.notifications.text.description': 'Define títulos e mensagens das notificações locais',
|
|
1701
|
+
'cli.command.notifications.picker.intro': 'Editar textos das notificações',
|
|
1702
|
+
'cli.command.notifications.picker.message': 'O que você quer fazer?',
|
|
1479
1703
|
'notifications.error.notKasyProject': 'kit_setup.json não encontrado. Execute dentro de um projeto Kasy.',
|
|
1480
1704
|
'notifications.error.noI18n': 'lib/i18n/*.i18n.json não encontrado neste projeto.',
|
|
1481
1705
|
'notifications.error.noFeatures': 'lib/core/config/features.dart não encontrado.',
|
|
@@ -1932,15 +2156,24 @@ const MESSAGES = {
|
|
|
1932
2156
|
'cli.command.ios.release.description': 'Incrementa build, genera IPA y sube a App Store Connect',
|
|
1933
2157
|
'cli.command.ios.build.description': 'Solo genera el IPA (sin subir)',
|
|
1934
2158
|
'cli.command.ios.clean.description': 'Limpia cachés Flutter/Xcode tras fallo en build iOS',
|
|
2159
|
+
'cli.command.ios.picker.intro': 'Publicar en la App Store',
|
|
2160
|
+
'cli.command.ios.picker.message': '¿Qué quieres hacer?',
|
|
2161
|
+
'cli.command.ios.help.before': 'Como publicar en la App Store:\n 1) kasy ios configure → hazlo una vez (guarda las credenciales Apple)\n 2) kasy ios release → ejecuta en cada nueva version (build + subida)\n\nUsa "build" si solo quieres generar el IPA, "clean" si un build fallo.\n',
|
|
1935
2162
|
'cli.command.codemagic.description': 'Compila la app en la nube (sin necesitar Mac)',
|
|
1936
2163
|
'cli.command.codemagic.configure.description': 'Configurar credenciales API de Codemagic',
|
|
1937
2164
|
'cli.command.codemagic.release.description': 'Iniciar build del workflow iOS en Codemagic',
|
|
1938
2165
|
'cli.command.codemagic.status.description': 'Estado del build Codemagic por ID',
|
|
2166
|
+
'cli.command.codemagic.picker.intro': 'Compilar en la nube con Codemagic',
|
|
2167
|
+
'cli.command.codemagic.picker.message': '¿Qué quieres hacer?',
|
|
2168
|
+
'cli.command.codemagic.picker.statusHint': 'Pregunta el ID del build',
|
|
2169
|
+
'cli.command.codemagic.help.before': 'Como compilar con Codemagic (sin necesitar Mac):\n 1) kasy codemagic configure → hazlo una vez (guarda el token de la API)\n 2) kasy codemagic release → inicia un build en la nube por version\n\nUsa "status <buildId>" para seguir el progreso de un build.\n',
|
|
1939
2170
|
|
|
1940
2171
|
'ios.configure.title': 'App Store iOS — configuración',
|
|
1941
2172
|
'ios.configure.bundleId': 'Bundle ID',
|
|
1942
2173
|
'ios.configure.doc': 'Guía',
|
|
1943
2174
|
'ios.configure.openingLinks': 'Abriendo App Store Connect en el navegador…',
|
|
2175
|
+
'ios.configure.note.title': 'Voy a pedir 3 cosas de App Store Connect',
|
|
2176
|
+
'ios.configure.note.body': '1) API Key ID — en Users and Access → Keys.\n2) Issuer ID — arriba de la misma pagina.\n3) El archivo .p8 (clave privada) descargado al crear la key.\n\nEl App ID es opcional, solo si tienes varias apps.',
|
|
1944
2177
|
'ios.configure.q.apiKey': 'Key ID de la API App Store Connect',
|
|
1945
2178
|
'ios.configure.q.issuerId': 'Issuer ID (UUID)',
|
|
1946
2179
|
'ios.configure.q.p8Path': 'Ruta del archivo AuthKey_XXXXX.p8 descargado',
|
|
@@ -1953,14 +2186,22 @@ const MESSAGES = {
|
|
|
1953
2186
|
'ios.configure.next': 'Siguiente paso',
|
|
1954
2187
|
'ios.release.title': 'Generando y subiendo release iOS…',
|
|
1955
2188
|
'ios.release.success': 'Release iOS subida',
|
|
2189
|
+
'ios.release.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
|
|
2190
|
+
'ios.release.task.uploading': 'Subiendo IPA a App Store Connect…',
|
|
2191
|
+
'ios.release.task.done': 'Compilacion + subida completadas',
|
|
2192
|
+
'ios.release.task.failed': 'La compilacion fallo — mira la salida debajo',
|
|
1956
2193
|
'ios.build.title': 'Generando IPA iOS…',
|
|
1957
2194
|
'ios.build.success': 'IPA generado',
|
|
2195
|
+
'ios.build.task.building': 'Compilando IPA (puede tardar 2-5 min)…',
|
|
2196
|
+
'ios.build.task.done': 'IPA listo en build/ios/ipa/',
|
|
2197
|
+
'ios.build.task.failed': 'La compilacion fallo — mira la salida debajo',
|
|
1958
2198
|
'ios.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
|
|
1959
2199
|
'ios.error.noScript': 'scripts/release-ios.sh no encontrado. Ejecute: kasy update ios-release',
|
|
1960
2200
|
'ios.error.notMac': 'Release iOS local requiere macOS con Xcode.',
|
|
1961
2201
|
'ios.error.useCodemagic': 'Use release en la nube',
|
|
1962
2202
|
'ios.error.notConfigured': 'Credenciales Apple no configuradas',
|
|
1963
2203
|
'ios.error.runConfigure': 'Ejecute: kasy ios configure',
|
|
2204
|
+
'ios.release.askConfigure': '¿Quieres configurar las credenciales Apple ahora?',
|
|
1964
2205
|
'ios.error.signing': 'Firma iOS no configurada (falta DEVELOPMENT_TEAM).',
|
|
1965
2206
|
'ios.error.signingHint': 'Abra ios/Runner.xcworkspace en Xcode → Runner → Signing & Capabilities → elija su Team.',
|
|
1966
2207
|
'ios.error.googleUrlScheme': 'URL scheme iOS de Google Sign-In no configurado.',
|
|
@@ -1993,8 +2234,12 @@ const MESSAGES = {
|
|
|
1993
2234
|
'codemagic.configure.next': 'Siguiente paso',
|
|
1994
2235
|
'codemagic.release.title': 'Disparando build en Codemagic…',
|
|
1995
2236
|
'codemagic.release.triggered': 'Build iniciado',
|
|
2237
|
+
'codemagic.release.spin': 'Iniciando build en Codemagic…',
|
|
2238
|
+
'codemagic.release.spinDone': 'Build encolado en Codemagic',
|
|
1996
2239
|
'codemagic.status.title': 'Estado del build',
|
|
1997
2240
|
'codemagic.status.usage': 'Uso: kasy codemagic status <buildId>',
|
|
2241
|
+
'codemagic.status.spin': 'Consultando estado del build…',
|
|
2242
|
+
'codemagic.status.spinDone': 'Estado obtenido',
|
|
1998
2243
|
'codemagic.error.notProject': 'No es un proyecto Flutter iOS (pubspec.yaml + ios/ requeridos).',
|
|
1999
2244
|
'codemagic.error.notConfigured': 'Codemagic no configurado',
|
|
2000
2245
|
'codemagic.error.addCi': 'Agregue CI primero: kasy add ci (crea codemagic.yaml)',
|
|
@@ -2248,9 +2493,48 @@ const MESSAGES = {
|
|
|
2248
2493
|
|
|
2249
2494
|
// run command
|
|
2250
2495
|
'cli.command.run.description': 'Corre la app en celular, simulador o navegador',
|
|
2496
|
+
'cli.command.reset.description': 'Desinstala la app en simulador/emulador/dispositivo para probar como primera instalación',
|
|
2497
|
+
'reset.title': 'Resetear app en el dispositivo',
|
|
2498
|
+
'reset.scanning': 'Buscando simuladores, emuladores y dispositivos conectados...',
|
|
2499
|
+
'reset.prompt.pickDevice': '¿En cuál quieres resetear?',
|
|
2500
|
+
'reset.resetting': 'Reseteando',
|
|
2501
|
+
'reset.reinstalling': 'Reinstalando la app...',
|
|
2502
|
+
'reset.success.uninstalled': 'App desinstalada. Todos los datos y permisos fueron eliminados.',
|
|
2503
|
+
'reset.info.notInstalled': 'La app no estaba instalada en este dispositivo.',
|
|
2504
|
+
'reset.warn.noDevices': 'Ningún simulador, emulador o dispositivo en ejecución. Inicia uno e intenta de nuevo.',
|
|
2505
|
+
'reset.warn.nothingSelected': 'Ningún dispositivo seleccionado.',
|
|
2506
|
+
'reset.warn.iosUninstallFailed': 'simctl uninstall falló.',
|
|
2507
|
+
'reset.warn.androidUninstallFailed': 'adb uninstall no devolvió éxito.',
|
|
2508
|
+
'reset.warn.iosDeviceManual': 'iPhone físico: borra la app manualmente (mantén pulsado el ícono → Eliminar app), luego reinstala con kasy run.',
|
|
2509
|
+
'reset.warn.iosDeviceUninstallFailed': 'devicectl no pudo desinstalar. Verifica que el iPhone esté desbloqueado y confíe en esta Mac.',
|
|
2510
|
+
'reset.warn.webIncognito': 'Web: abre la app en una ventana de incógnito/privada del navegador para probar como nuevo visitante.',
|
|
2511
|
+
'reset.warn.unknownPlatform': 'Plataforma no soportada',
|
|
2512
|
+
'reset.error.notFlutterProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
|
|
2513
|
+
'reset.error.noIdentifier': 'No pude leer el bundle id ni el package name de Android de este proyecto.',
|
|
2514
|
+
'reset.error.noBundleId': 'Bundle id de iOS no encontrado.',
|
|
2515
|
+
'reset.error.noPackageName': 'applicationId de Android no encontrado.',
|
|
2516
|
+
'reset.outro.skipped': 'Listo. La app no fue desinstalada.',
|
|
2517
|
+
'reset.outro.uninstalledOnly': 'Listo. Ejecuta kasy run para reinstalar.',
|
|
2518
|
+
'reset.outro.cancelled': 'Cancelado. La app no fue desinstalada.',
|
|
2519
|
+
'reset.prompt.xcodeOpen': 'Xcode está abierto y va a entrar en conflicto con la instalación. ¿Qué quieres hacer?',
|
|
2520
|
+
'reset.prompt.xcodeOpen.close': 'Cerrar Xcode automáticamente (recomendado)',
|
|
2521
|
+
'reset.prompt.xcodeOpen.skip': 'Dejar Xcode abierto e intentar igual',
|
|
2522
|
+
'reset.prompt.xcodeOpen.cancel': 'Cancelar reset',
|
|
2523
|
+
'reset.info.xcodeClosed': 'Xcode cerrado.',
|
|
2524
|
+
'reset.prompt.reinstallNow': 'App removida. Verifica en el dispositivo y reinstalar ahora?',
|
|
2251
2525
|
'run.launching': 'Iniciando app Flutter...',
|
|
2252
2526
|
'run.updateHint.prefix': 'Mejoras disponibles para el proyecto —',
|
|
2253
2527
|
'run.updateHint.suffix': 'para ver las novedades',
|
|
2528
|
+
'run.spinner.building': 'Iniciando Flutter…',
|
|
2529
|
+
'run.spinner.ready': 'Flutter listo — usa r (reload), R (restart), q (salir)',
|
|
2530
|
+
'run.spinner.failed': 'Flutter run fallo antes de iniciar',
|
|
2531
|
+
'run.stage.gradleFirstTime': 'Compilando Android (1.ª vez tarda 5-15 min — Gradle bajando dependencias)…',
|
|
2532
|
+
'run.stage.gradle': 'Compilando Android…',
|
|
2533
|
+
'run.stage.xcode': 'Compilando iOS…',
|
|
2534
|
+
'run.stage.pods': 'Instalando pods iOS…',
|
|
2535
|
+
'run.stage.installing': 'Instalando en el dispositivo…',
|
|
2536
|
+
'run.stage.syncing': 'Sincronizando archivos con el dispositivo…',
|
|
2537
|
+
'run.stage.buildSuccess': 'Build listo — abriendo la app…',
|
|
2254
2538
|
'run.error.notFlutterProject': 'No se encontro pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter.',
|
|
2255
2539
|
'run.error.flutterNotFound': 'Flutter no encontrado. Verifica que Flutter este instalado y en el PATH.',
|
|
2256
2540
|
|
|
@@ -2296,9 +2580,60 @@ const MESSAGES = {
|
|
|
2296
2580
|
'splash.error.notPng': 'Uno de los archivos no es un PNG válido.',
|
|
2297
2581
|
'splash.error.generateFailed': 'flutter_native_splash:create falló. Revisa la salida.',
|
|
2298
2582
|
|
|
2583
|
+
// icon command
|
|
2584
|
+
'cli.command.icon.description': 'Cambia el ícono del app (iOS + Android) y regenera los assets nativos',
|
|
2585
|
+
'icon.intro': 'Ícono del app',
|
|
2586
|
+
'icon.validating': 'Validando archivo PNG...',
|
|
2587
|
+
'icon.validated': 'PNG está bien',
|
|
2588
|
+
'icon.copying': 'Copiando ícono a assets/images/icon.png...',
|
|
2589
|
+
'icon.copied': 'Ícono copiado',
|
|
2590
|
+
'icon.generating': 'Regenerando íconos nativos (Android + iOS)...',
|
|
2591
|
+
'icon.generated': 'Íconos nativos regenerados',
|
|
2592
|
+
'icon.done': 'Listo. Desinstala el app del dispositivo y reinstala para ver el nuevo ícono.',
|
|
2593
|
+
'icon.warn.title': 'Avisos',
|
|
2594
|
+
'icon.warn.notSquare': 'El ícono mide {w}x{h} (no es cuadrado). La imagen se estirará. Usa una imagen cuadrada (1024x1024 recomendado).',
|
|
2595
|
+
'icon.warn.small': 'El ícono mide {w}x{h}. Lo recomendado es al menos 1024x1024 (App Store exige ese tamaño).',
|
|
2596
|
+
'icon.warn.hasAlpha': 'El ícono tiene transparencia. iOS rechaza íconos con canal alpha — flutter_launcher_icons lo elimina automáticamente (remove_alpha_ios: true).',
|
|
2597
|
+
'icon.summary.title': 'Guardado',
|
|
2598
|
+
'icon.summary.icon': 'Ícono del app',
|
|
2599
|
+
'icon.skipGenerate.title': 'Generación omitida',
|
|
2600
|
+
'icon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
|
|
2601
|
+
'icon.reinstall.title': 'Importante',
|
|
2602
|
+
'icon.reinstall.hint': 'iOS y Android cachean el ícono anterior. Desinstala el app y reinstala para ver el nuevo.',
|
|
2603
|
+
'icon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
|
|
2604
|
+
'icon.error.imageRequired': '--image es obligatorio.',
|
|
2605
|
+
'icon.error.fileNotFound': 'Archivo no encontrado: {path}',
|
|
2606
|
+
'icon.error.notPng': 'El archivo no es un PNG válido.',
|
|
2607
|
+
'icon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
|
|
2608
|
+
|
|
2609
|
+
// favicon command
|
|
2610
|
+
'cli.command.favicon.description': 'Cambia el favicon / ícono PWA de la web y regenera los assets web',
|
|
2611
|
+
'favicon.intro': 'Favicon web',
|
|
2612
|
+
'favicon.validating': 'Validando archivo PNG...',
|
|
2613
|
+
'favicon.validated': 'PNG está bien',
|
|
2614
|
+
'favicon.copying': 'Copiando favicon a assets/images/favicon.png...',
|
|
2615
|
+
'favicon.copied': 'Favicon copiado',
|
|
2616
|
+
'favicon.generating': 'Regenerando íconos web (favicon + tamaños PWA)...',
|
|
2617
|
+
'favicon.generated': 'Íconos web regenerados',
|
|
2618
|
+
'favicon.done': 'Listo. Ejecuta "flutter run -d chrome" para ver el nuevo favicon.',
|
|
2619
|
+
'favicon.warn.title': 'Avisos',
|
|
2620
|
+
'favicon.warn.notSquare': 'El favicon mide {w}x{h} (no es cuadrado). Se estirará. Usa una imagen cuadrada (512x512+ recomendado).',
|
|
2621
|
+
'favicon.warn.small': 'El favicon mide {w}x{h}. Lo recomendado es al menos 512x512 para que se vea nítido en las pantallas de instalación PWA.',
|
|
2622
|
+
'favicon.summary.title': 'Guardado',
|
|
2623
|
+
'favicon.summary.favicon': 'Favicon',
|
|
2624
|
+
'favicon.skipGenerate.title': 'Generación omitida',
|
|
2625
|
+
'favicon.skipGenerate.hint': 'Ejecuta `dart run flutter_launcher_icons` cuando estés listo.',
|
|
2626
|
+
'favicon.error.notKasyProject': 'No se encontró pubspec.yaml. Ejecuta este comando dentro de un proyecto Flutter/Kasy.',
|
|
2627
|
+
'favicon.error.imageRequired': '--image es obligatorio.',
|
|
2628
|
+
'favicon.error.fileNotFound': 'Archivo no encontrado: {path}',
|
|
2629
|
+
'favicon.error.notPng': 'El archivo no es un PNG válido.',
|
|
2630
|
+
'favicon.error.generateFailed': 'flutter_launcher_icons falló. Revisa la salida.',
|
|
2631
|
+
|
|
2299
2632
|
// notifications command
|
|
2300
2633
|
'cli.command.notifications.description': 'Edita los textos de las notificaciones locales y recordatorios',
|
|
2301
2634
|
'cli.command.notifications.text.description': 'Define titulos y mensajes de notificaciones locales',
|
|
2635
|
+
'cli.command.notifications.picker.intro': 'Editar textos de las notificaciones',
|
|
2636
|
+
'cli.command.notifications.picker.message': '¿Qué quieres hacer?',
|
|
2302
2637
|
'notifications.error.notKasyProject': 'No se encontro kit_setup.json. Ejecuta dentro de un proyecto Kasy.',
|
|
2303
2638
|
'notifications.error.noI18n': 'lib/i18n/*.i18n.json no encontrado en este proyecto.',
|
|
2304
2639
|
'notifications.error.noFeatures': 'lib/core/config/features.dart no encontrado.',
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { readBundleId } = require('./apple-release');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Reads the Android applicationId (package name) of the project.
|
|
7
|
+
* Source of truth is build.gradle(.kts) — what gets baked into the APK and
|
|
8
|
+
* what the device sees. kit_setup.json can drift when the user renames the
|
|
9
|
+
* package manually after `kasy new`, so it's only used as a fallback when
|
|
10
|
+
* the Android project hasn't been generated yet.
|
|
11
|
+
*/
|
|
12
|
+
async function readPackageName(projectDir) {
|
|
13
|
+
const candidates = [
|
|
14
|
+
path.join(projectDir, 'android', 'app', 'build.gradle.kts'),
|
|
15
|
+
path.join(projectDir, 'android', 'app', 'build.gradle'),
|
|
16
|
+
];
|
|
17
|
+
for (const file of candidates) {
|
|
18
|
+
if (!(await fs.pathExists(file))) continue;
|
|
19
|
+
const content = await fs.readFile(file, 'utf8');
|
|
20
|
+
const m = content.match(/applicationId\s*=?\s*["']([^"']+)["']/);
|
|
21
|
+
if (m) return m[1];
|
|
22
|
+
}
|
|
23
|
+
const kitSetupPath = path.join(projectDir, 'kit_setup.json');
|
|
24
|
+
if (await fs.pathExists(kitSetupPath)) {
|
|
25
|
+
try {
|
|
26
|
+
const kit = await fs.readJson(kitSetupPath);
|
|
27
|
+
if (kit.bundleId) return kit.bundleId;
|
|
28
|
+
} catch {
|
|
29
|
+
// ignore
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = { readBundleId, readPackageName };
|