kasy-cli 1.12.1 → 1.13.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.
Files changed (138) hide show
  1. package/bin/kasy.js +21 -0
  2. package/lib/commands/splash.js +220 -0
  3. package/lib/scaffold/CHANGELOG.json +9 -0
  4. package/lib/scaffold/backends/api/patch/lib/main.dart +29 -10
  5. package/lib/scaffold/backends/supabase/patch/lib/main.dart +29 -10
  6. package/lib/scaffold/features/README.md +15 -139
  7. package/lib/scaffold/shared/generator-utils.js +16 -15
  8. package/lib/utils/i18n.js +78 -0
  9. package/package.json +2 -2
  10. package/templates/firebase/android/app/src/main/res/drawable-hdpi/android12splash.png +0 -0
  11. package/templates/firebase/android/app/src/main/res/drawable-hdpi/splash.png +0 -0
  12. package/templates/firebase/android/app/src/main/res/drawable-mdpi/android12splash.png +0 -0
  13. package/templates/firebase/android/app/src/main/res/drawable-mdpi/splash.png +0 -0
  14. package/templates/firebase/android/app/src/main/res/drawable-night/background.png +0 -0
  15. package/templates/firebase/android/app/src/main/res/drawable-night/launch_background.xml +9 -0
  16. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/android12splash.png +0 -0
  17. package/templates/firebase/android/app/src/main/res/drawable-night-hdpi/splash.png +0 -0
  18. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/android12splash.png +0 -0
  19. package/templates/firebase/android/app/src/main/res/drawable-night-mdpi/splash.png +0 -0
  20. package/templates/firebase/android/app/src/main/res/drawable-night-v21/background.png +0 -0
  21. package/templates/firebase/android/app/src/main/res/drawable-night-v21/launch_background.xml +9 -0
  22. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/android12splash.png +0 -0
  23. package/templates/firebase/android/app/src/main/res/drawable-night-xhdpi/splash.png +0 -0
  24. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png +0 -0
  25. package/templates/firebase/android/app/src/main/res/drawable-night-xxhdpi/splash.png +0 -0
  26. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png +0 -0
  27. package/templates/firebase/android/app/src/main/res/drawable-night-xxxhdpi/splash.png +0 -0
  28. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/android12splash.png +0 -0
  29. package/templates/firebase/android/app/src/main/res/drawable-xhdpi/splash.png +0 -0
  30. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/android12splash.png +0 -0
  31. package/templates/firebase/android/app/src/main/res/drawable-xxhdpi/splash.png +0 -0
  32. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/android12splash.png +0 -0
  33. package/templates/firebase/android/app/src/main/res/drawable-xxxhdpi/splash.png +0 -0
  34. package/templates/firebase/android/app/src/main/res/values-night-v31/styles.xml +2 -1
  35. package/templates/firebase/android/app/src/main/res/values-v31/styles.xml +1 -0
  36. package/templates/firebase/assets/images/splash_logo_dark.png +0 -0
  37. package/templates/firebase/assets/images/splash_logo_light.png +0 -0
  38. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +9 -8
  39. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png +0 -0
  40. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +33 -0
  41. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
  42. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
  43. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
  44. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png +0 -0
  45. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png +0 -0
  46. package/templates/firebase/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png +0 -0
  47. package/templates/firebase/ios/Runner/Base.lproj/LaunchScreen.storyboard +1 -1
  48. package/templates/firebase/lib/core/theme/providers/theme_provider.dart +48 -24
  49. package/templates/firebase/lib/features/onboarding/ui/components/onboarding_features.dart +4 -0
  50. package/templates/firebase/lib/features/onboarding/ui/onboarding_page.dart +1 -0
  51. package/templates/firebase/lib/features/onboarding/ui/widgets/onboarding_feature.dart +13 -0
  52. package/templates/firebase/lib/features/settings/settings_page.dart +158 -18
  53. package/templates/firebase/lib/i18n/en.i18n.json +6 -2
  54. package/templates/firebase/lib/i18n/es.i18n.json +6 -2
  55. package/templates/firebase/lib/i18n/pt.i18n.json +6 -2
  56. package/templates/firebase/lib/main.dart +29 -10
  57. package/templates/firebase/pubspec.yaml +4 -5
  58. package/templates/firebase/test/core/data/repositories/user_repository_test.dart +1 -1
  59. package/templates/firebase/web/index.html +47 -39
  60. package/templates/firebase/web/splash/img/dark-1x.png +0 -0
  61. package/templates/firebase/web/splash/img/dark-2x.png +0 -0
  62. package/templates/firebase/web/splash/img/dark-3x.png +0 -0
  63. package/templates/firebase/web/splash/img/dark-4x.png +0 -0
  64. package/templates/firebase/web/splash/img/light-1x.png +0 -0
  65. package/templates/firebase/web/splash/img/light-2x.png +0 -0
  66. package/templates/firebase/web/splash/img/light-3x.png +0 -0
  67. package/templates/firebase/web/splash/img/light-4x.png +0 -0
  68. package/lib/scaffold/features/analytics/lib/core/data/api/analytics_api.dart +0 -124
  69. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.es.md +0 -35
  70. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.md +0 -35
  71. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/BUG.pt.md +0 -35
  72. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.es.md +0 -12
  73. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.md +0 -12
  74. package/lib/scaffold/features/ci/.github/ISSUE_TEMPLATE/feature_request.pt.md +0 -12
  75. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.es.md +0 -17
  76. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  77. package/lib/scaffold/features/ci/.github/PULL_REQUEST_TEMPLATE.pt.md +0 -17
  78. package/lib/scaffold/features/ci/.github/dependabot.yml +0 -16
  79. package/lib/scaffold/features/ci/.github/workflows/app.yml +0 -20
  80. package/lib/scaffold/features/ci/.gitlab/templates/deploy.yaml +0 -14
  81. package/lib/scaffold/features/ci/.gitlab/templates/dropbox.yaml +0 -19
  82. package/lib/scaffold/features/ci/.gitlab/templates/flutter.yaml +0 -163
  83. package/lib/scaffold/features/ci/.gitlab/templates/mailgun.yaml +0 -28
  84. package/lib/scaffold/features/ci/.gitlab-ci.yml +0 -37
  85. package/lib/scaffold/features/ci/codemagic.yaml +0 -157
  86. package/lib/scaffold/features/facebook/lib/core/data/api/tracking_api.dart +0 -111
  87. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_request_entity.dart +0 -27
  88. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/entities/feature_vote_entity.dart +0 -27
  89. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_request_api.dart +0 -50
  90. package/lib/scaffold/features/feedback/lib/features/feedbacks/api/feature_vote_api.dart +0 -79
  91. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feature_requests.dart +0 -48
  92. package/lib/scaffold/features/feedback/lib/features/feedbacks/models/feedback_state.dart +0 -42
  93. package/lib/scaffold/features/feedback/lib/features/feedbacks/providers/feedback_page_notifier.dart +0 -147
  94. package/lib/scaffold/features/feedback/lib/features/feedbacks/repositories/feature_request_repository.dart +0 -95
  95. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/component/add_feature_form.dart +0 -199
  96. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/feedback_page.dart +0 -175
  97. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/add_feature_button.dart +0 -76
  98. package/lib/scaffold/features/feedback/lib/features/feedbacks/ui/widgets/feature_card.dart +0 -279
  99. package/lib/scaffold/features/ios-release/.kasy/apple.env.example +0 -8
  100. package/lib/scaffold/features/ios-release/.kasy/codemagic.env.example +0 -7
  101. package/lib/scaffold/features/ios-release/docs/codemagic-release.en.md +0 -50
  102. package/lib/scaffold/features/ios-release/docs/codemagic-release.es.md +0 -50
  103. package/lib/scaffold/features/ios-release/docs/codemagic-release.pt.md +0 -50
  104. package/lib/scaffold/features/ios-release/docs/ios-release.en.md +0 -41
  105. package/lib/scaffold/features/ios-release/docs/ios-release.es.md +0 -41
  106. package/lib/scaffold/features/ios-release/docs/ios-release.pt.md +0 -41
  107. package/lib/scaffold/features/ios-release/scripts/bump-ios-version.js +0 -38
  108. package/lib/scaffold/features/ios-release/scripts/release-ios.sh +0 -137
  109. package/lib/scaffold/features/llm_chat/lib/features/llm_chat/llm_chat_page.dart +0 -301
  110. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/providers/reminder_notifier.dart +0 -81
  111. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/repositories/reminder_preferences.dart +0 -76
  112. package/lib/scaffold/features/local_notifications/lib/features/local_reminder/ui/reminder_page.dart +0 -282
  113. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/entities/user_info_entity.dart +0 -24
  114. package/lib/scaffold/features/onboarding/lib/features/onboarding/api/user_infos_api.dart +0 -71
  115. package/lib/scaffold/features/onboarding/lib/features/onboarding/models/user_info.dart +0 -92
  116. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_model.dart +0 -15
  117. package/lib/scaffold/features/onboarding/lib/features/onboarding/providers/onboarding_provider.dart +0 -78
  118. package/lib/scaffold/features/onboarding/lib/features/onboarding/repositories/user_infos_repository.dart +0 -29
  119. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/animations/page_transitions.dart +0 -30
  120. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_att_setup.dart +0 -66
  121. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_features.dart +0 -72
  122. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_loader.dart +0 -92
  123. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_notifications_setup.dart +0 -73
  124. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/components/onboarding_questions.dart +0 -89
  125. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/onboarding_page.dart +0 -94
  126. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_background.dart +0 -80
  127. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_feature.dart +0 -139
  128. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_illustration_scaffold.dart +0 -110
  129. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_progress.dart +0 -84
  130. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_radio_question.dart +0 -173
  131. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_reassurance.dart +0 -45
  132. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/onboarding_sticky_footer.dart +0 -77
  133. package/lib/scaffold/features/onboarding/lib/features/onboarding/ui/widgets/selectable_row_tile.dart +0 -392
  134. package/lib/scaffold/features/revenuecat/lib/core/data/api/tracking_api.dart +0 -116
  135. package/lib/scaffold/features/revenuecat/lib/core/data/models/subscription.dart +0 -322
  136. package/lib/scaffold/features/revenuecat/lib/core/home_widgets/home_widget_background_task.dart +0 -41
  137. package/lib/scaffold/features/revenuecat/lib/core/states/user_state_notifier.dart +0 -305
  138. package/templates/firebase/assets/images/splashscreen.png +0 -0
@@ -1,279 +0,0 @@
1
- import 'dart:math';
2
-
3
- import 'package:flutter/material.dart';
4
- import 'package:flutter/services.dart';
5
- import 'package:kasy_kit/core/theme/theme.dart';
6
- import 'package:kasy_kit/core/widgets/debouncer.dart';
7
-
8
- class FeatureCard extends StatefulWidget {
9
- final String title;
10
- final String description;
11
- final int votes;
12
- final VoidCallback onVote;
13
- final bool disabled;
14
- final bool voted;
15
-
16
- const FeatureCard({
17
- super.key,
18
- required this.title,
19
- required this.description,
20
- required this.votes,
21
- required this.onVote,
22
- this.disabled = false,
23
- required this.voted,
24
- });
25
-
26
- @override
27
- State<FeatureCard> createState() => _FeatureCardState();
28
- }
29
-
30
- class _FeatureCardState extends State<FeatureCard> {
31
- @override
32
- Widget build(BuildContext context) {
33
- return Container(
34
- padding: const EdgeInsets.all(KasySpacing.lg),
35
- decoration: BoxDecoration(
36
- color: context.colors.surface,
37
- borderRadius: KasyRadius.smBorderRadius,
38
- border: Border.all(
39
- color: context.colors.outline,
40
- ),
41
- boxShadow: [
42
- BoxShadow(
43
- color: context.colors.primary.withValues(alpha: 0.05),
44
- blurRadius: 8,
45
- offset: const Offset(0, 4),
46
- ),
47
- BoxShadow(
48
- color: context.colors.onBackground.withValues(alpha: 0.03),
49
- blurRadius: 8,
50
- offset: const Offset(0, 4),
51
- spreadRadius: 2,
52
- ),
53
- ],
54
- ),
55
- child: Row(
56
- children: [
57
- Expanded(
58
- child: Column(
59
- crossAxisAlignment: CrossAxisAlignment.start,
60
- children: [
61
- Text(
62
- widget.title,
63
- style: context.textTheme.bodyLarge?.copyWith(
64
- fontWeight: FontWeight.bold,
65
- ),
66
- ),
67
- const SizedBox(height: KasySpacing.xs),
68
- Text(
69
- widget.description,
70
- style: context.textTheme.bodyMedium?.copyWith(
71
- fontWeight: FontWeight.w400,
72
- color: context.colors.muted,
73
- ),
74
- ),
75
- ],
76
- ),
77
- ),
78
- const SizedBox(width: KasySpacing.md),
79
- switch (widget.voted) {
80
- false => VoteCard.blank(
81
- context: context,
82
- id: widget.title,
83
- votes: widget.votes,
84
- onVote: widget.onVote,
85
- disabled: widget.disabled,
86
- ),
87
- true => VoteCard.voted(
88
- context: context,
89
- id: widget.title,
90
- votes: widget.votes,
91
- onVote: widget.onVote,
92
- disabled: widget.disabled,
93
- ),
94
- }
95
- ],
96
- ),
97
- );
98
- }
99
- }
100
-
101
- class VoteCard extends StatefulWidget {
102
- final int votes;
103
- final VoidCallback onVote;
104
- final Color borderColor;
105
- final Color bgColor;
106
- final Color textColor;
107
- final bool isBold;
108
- final bool disabled;
109
- final String id;
110
-
111
- const VoteCard({
112
- super.key,
113
- required this.votes,
114
- required this.onVote,
115
- required this.bgColor,
116
- required this.textColor,
117
- required this.isBold,
118
- required this.borderColor,
119
- required this.disabled,
120
- required this.id,
121
- });
122
-
123
- factory VoteCard.blank({
124
- required BuildContext context,
125
- required VoidCallback onVote,
126
- required int votes,
127
- required bool disabled,
128
- required String id,
129
- }) =>
130
- VoteCard(
131
- id: id,
132
- onVote: onVote,
133
- votes: votes,
134
- bgColor: context.colors.primary,
135
- textColor: context.colors.onPrimary,
136
- borderColor: context.colors.primary,
137
- isBold: false,
138
- disabled: disabled,
139
- );
140
-
141
- factory VoteCard.voted({
142
- required BuildContext context,
143
- required VoidCallback onVote,
144
- required int votes,
145
- required bool disabled,
146
- required String id,
147
- }) =>
148
- VoteCard(
149
- id: id,
150
- onVote: onVote,
151
- votes: votes,
152
- bgColor: context.colors.primary.withValues(alpha: .1),
153
- textColor: context.colors.onBackground,
154
- borderColor: context.colors.outline,
155
- isBold: true,
156
- disabled: disabled,
157
- );
158
-
159
- @override
160
- State<VoteCard> createState() => _VoteCardState();
161
- }
162
-
163
- class _VoteCardState extends State<VoteCard>
164
- with SingleTickerProviderStateMixin {
165
- // ignore: use_late_for_private_fields_and_variables
166
- AnimationController? _controller;
167
- // ignore: use_late_for_private_fields_and_variables
168
- Animation<double>? _animation;
169
-
170
- final debouncer = Debouncer(delay: const Duration(milliseconds: 250));
171
- bool _goingUp = true;
172
-
173
- @override
174
- void initState() {
175
- super.initState();
176
- _controller = AnimationController(
177
- duration: const Duration(milliseconds: 250),
178
- vsync: this,
179
- );
180
- _animation = Tween<double>(begin: 1, end: 1.2).animate(
181
- CurvedAnimation(parent: _controller!, curve: Curves.easeInOut),
182
- );
183
- }
184
-
185
- @override
186
- void didUpdateWidget(VoteCard oldWidget) {
187
- super.didUpdateWidget(oldWidget);
188
- if (widget.votes != oldWidget.votes) {
189
- _goingUp = widget.votes > oldWidget.votes;
190
- }
191
- }
192
-
193
- @override
194
- void dispose() {
195
- _controller?.dispose();
196
- super.dispose();
197
- }
198
-
199
- @override
200
- Widget build(BuildContext context) {
201
- return AnimatedBuilder(
202
- animation: _animation!,
203
- builder: (context, child) {
204
- return Transform.scale(scale: _animation!.value, child: child);
205
- },
206
- child: Material(
207
- color: Colors.transparent,
208
- child: InkWell(
209
- onTap: () {
210
- if (widget.disabled) return;
211
- HapticFeedback.selectionClick();
212
- SystemSound.play(SystemSoundType.click);
213
- widget.onVote();
214
- _controller!.forward().then((_) => _controller!.reverse());
215
- },
216
- child: Ink(
217
- width: 48,
218
- height: 64,
219
- decoration: BoxDecoration(
220
- color: widget.bgColor,
221
- borderRadius: KasyRadius.smBorderRadius,
222
- border: Border.all(color: widget.borderColor),
223
- ),
224
- padding: const EdgeInsets.all(KasySpacing.sm),
225
- child: Column(
226
- mainAxisAlignment: MainAxisAlignment.center,
227
- children: [
228
- Transform.rotate(
229
- angle: pi / 2,
230
- child: Icon(
231
- Icons.arrow_back_ios,
232
- size: 16,
233
- color: widget.textColor,
234
- ),
235
- ),
236
- ClipRect(
237
- child: AnimatedSwitcher(
238
- duration: const Duration(milliseconds: 250),
239
- transitionBuilder: (child, animation) {
240
- final isIncoming = (child.key as ValueKey?)?.value ==
241
- 'votes-${widget.id}-${widget.votes}';
242
- final beginOffset = isIncoming
243
- ? (_goingUp
244
- ? const Offset(0, 1)
245
- : const Offset(0, -1))
246
- : (_goingUp
247
- ? const Offset(0, -1)
248
- : const Offset(0, 1));
249
- return SlideTransition(
250
- position: Tween<Offset>(
251
- begin: beginOffset,
252
- end: Offset.zero,
253
- ).animate(CurvedAnimation(
254
- parent: animation,
255
- curve: Curves.easeOut,
256
- )),
257
- child:
258
- FadeTransition(opacity: animation, child: child),
259
- );
260
- },
261
- child: Text(
262
- key: ValueKey('votes-${widget.id}-${widget.votes}'),
263
- widget.votes.toString(),
264
- style: context.textTheme.bodyLarge?.copyWith(
265
- fontWeight:
266
- widget.isBold ? FontWeight.bold : FontWeight.w400,
267
- color: widget.textColor,
268
- ),
269
- ),
270
- ),
271
- ),
272
- ],
273
- ),
274
- ),
275
- ),
276
- ),
277
- );
278
- }
279
- }
@@ -1,8 +0,0 @@
1
- # App Store Connect API — copy to apple.env and fill in (never commit apple.env)
2
- # Run: kasy ios configure
3
-
4
- APP_STORE_API_KEY=
5
- APP_STORE_ISSUER_ID=
6
-
7
- # Optional: numeric App Store Connect app ID (for reference / future sync)
8
- # APP_STORE_APP_ID=
@@ -1,7 +0,0 @@
1
- # Codemagic API — copy to codemagic.env and fill in (never commit codemagic.env)
2
- # Run: kasy codemagic configure
3
-
4
- CODEMAGIC_API_TOKEN=
5
- CODEMAGIC_APP_ID=
6
- CODEMAGIC_WORKFLOW_ID=ios-workflow
7
- CODEMAGIC_BRANCH=main
@@ -1,50 +0,0 @@
1
- # Publish iOS with Codemagic (no Mac)
2
-
3
- ## Prerequisites
4
-
5
- - [Codemagic](https://codemagic.io) account
6
- - Git repository connected to Codemagic
7
- - Apple Developer account + app in App Store Connect
8
-
9
- ## 1. Add CI to the project (if missing)
10
-
11
- ```bash
12
- kasy add ci
13
- ```
14
-
15
- Creates `codemagic.yaml` at the project root.
16
-
17
- ## 2. Configure in the Codemagic dashboard
18
-
19
- 1. Open [codemagic.io/apps](https://codemagic.io/apps) and add your repository.
20
- 2. **Code signing (iOS):** set up App Store distribution certificate and profile.
21
- 3. **Integrations → App Store Connect:** link your Apple account.
22
- 4. **Environment variables:** add to your variable group (e.g. `appstore_credentials`):
23
- - `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
24
- 5. In `codemagic.yaml`, set `APP_ID` (numeric App Store Connect app ID from the app URL).
25
-
26
- ## 3. Configure from the terminal
27
-
28
- ```bash
29
- kasy codemagic configure
30
- ```
31
-
32
- Enter **API token** (Settings → Codemagic API), **App ID**, and **Workflow ID** (default `ios-workflow`).
33
-
34
- ## 4. Trigger a build
35
-
36
- ```bash
37
- kasy codemagic release
38
- ```
39
-
40
- The cloud build runs and may upload to TestFlight per `codemagic.yaml`.
41
-
42
- ## Build status
43
-
44
- ```bash
45
- kasy codemagic status <buildId>
46
- ```
47
-
48
- ## Local Mac
49
-
50
- If you have a Mac: [ios-release.md](./ios-release.md) and `kasy ios release`.
@@ -1,50 +0,0 @@
1
- # Publicar iOS con Codemagic (sin Mac)
2
-
3
- ## Requisitos
4
-
5
- - Cuenta [Codemagic](https://codemagic.io)
6
- - Repositorio Git conectado a Codemagic
7
- - Cuenta Apple Developer + app en App Store Connect
8
-
9
- ## 1. Agregar CI al proyecto (si falta)
10
-
11
- ```bash
12
- kasy add ci
13
- ```
14
-
15
- Crea `codemagic.yaml` en la raíz del proyecto.
16
-
17
- ## 2. Configurar en el panel Codemagic
18
-
19
- 1. Abre [codemagic.io/apps](https://codemagic.io/apps) y agrega el repositorio.
20
- 2. **Code signing (iOS):** certificado y perfil de distribución App Store.
21
- 3. **Integrations → App Store Connect:** vincula la cuenta Apple.
22
- 4. **Environment variables:** en el grupo del app (ej. `appstore_credentials`):
23
- - `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
24
- 5. En `codemagic.yaml`, completa `APP_ID` (ID numérico del app en App Store Connect).
25
-
26
- ## 3. Configurar en la terminal
27
-
28
- ```bash
29
- kasy codemagic configure
30
- ```
31
-
32
- Indica **API token** (Settings → Codemagic API), **App ID** y **Workflow ID** (`ios-workflow` por defecto).
33
-
34
- ## 4. Disparar build
35
-
36
- ```bash
37
- kasy codemagic release
38
- ```
39
-
40
- El build en la nube puede subir a TestFlight según `codemagic.yaml`.
41
-
42
- ## Estado del build
43
-
44
- ```bash
45
- kasy codemagic status <buildId>
46
- ```
47
-
48
- ## Mac local
49
-
50
- Si tienes Mac: [ios-release.md](./ios-release.md) y `kasy ios release`.
@@ -1,50 +0,0 @@
1
- # Publicar iOS com Codemagic (sem Mac)
2
-
3
- ## Pré-requisitos
4
-
5
- - Conta [Codemagic](https://codemagic.io)
6
- - Repositório Git conectado ao Codemagic
7
- - Conta Apple Developer + app no App Store Connect
8
-
9
- ## 1. Adicionar CI ao projeto (se ainda não tiver)
10
-
11
- ```bash
12
- kasy add ci
13
- ```
14
-
15
- Isso cria `codemagic.yaml` na raiz do projeto.
16
-
17
- ## 2. Configurar no painel Codemagic
18
-
19
- 1. Abra [codemagic.io/apps](https://codemagic.io/apps) e adicione o repositório.
20
- 2. **Code signing (iOS):** configure certificado e perfil de distribuição App Store.
21
- 3. **Integrations → App Store Connect:** conecte a conta Apple (recomendado).
22
- 4. **Environment variables:** adicione no grupo do app (ex.: `appstore_credentials`):
23
- - `BACKEND_URL`, `SENTRY_DSN`, `RC_IOS_API_KEY`, `RC_ANDROID_API_KEY`, `MIXPANEL_TOKEN`
24
- 5. No `codemagic.yaml`, preencha `APP_ID` (ID numérico do app no App Store Connect — aparece na URL do app).
25
-
26
- ## 3. Configurar no terminal
27
-
28
- ```bash
29
- kasy codemagic configure
30
- ```
31
-
32
- Informe o **API token** (Settings → Codemagic API), **App ID** e **Workflow ID** (`ios-workflow` por padrão).
33
-
34
- ## 4. Disparar build
35
-
36
- ```bash
37
- kasy codemagic release
38
- ```
39
-
40
- O build roda na nuvem e, conforme o `codemagic.yaml`, pode enviar para TestFlight automaticamente.
41
-
42
- ## Status do build
43
-
44
- ```bash
45
- kasy codemagic status <buildId>
46
- ```
47
-
48
- ## Mac local
49
-
50
- Se tiver Mac: [ios-release.md](./ios-release.md) e `kasy ios release`.
@@ -1,41 +0,0 @@
1
- # Publish to iOS (App Store)
2
-
3
- ## Prerequisites
4
-
5
- - Paid [Apple Developer](https://developer.apple.com) account
6
- - App created in [App Store Connect](https://appstoreconnect.apple.com) with the same **Bundle ID** as your project
7
- - Mac with Xcode and Flutter installed
8
-
9
- ## One-time setup
10
-
11
- ```bash
12
- kasy ios configure
13
- ```
14
-
15
- Opens Apple links, collects the API key (`.p8`), and writes `.kasy/apple.env` (gitignored).
16
-
17
- ## Ship a new build
18
-
19
- ```bash
20
- kasy ios release
21
- ```
22
-
23
- Bumps the build number in `pubspec.yaml`, builds the IPA, and uploads to App Store Connect (no Transporter).
24
-
25
- Shortcut: `make release-ios`
26
-
27
- ### Options
28
-
29
- - `kasy ios build` — IPA only, no upload
30
- - `kasy ios release --no-bump` — skip build number bump
31
- - `kasy ios release --version-name 1.0.1` — change marketing version
32
-
33
- ## No Mac?
34
-
35
- Use cloud builds: [codemagic-release.md](./codemagic-release.md) and `kasy codemagic configure` / `kasy codemagic release`.
36
-
37
- ## Check environment
38
-
39
- ```bash
40
- kasy doctor
41
- ```
@@ -1,41 +0,0 @@
1
- # Publicar en iOS (App Store)
2
-
3
- ## Requisitos
4
-
5
- - Cuenta de pago [Apple Developer](https://developer.apple.com)
6
- - App creada en [App Store Connect](https://appstoreconnect.apple.com) con el mismo **Bundle ID** del proyecto
7
- - Mac con Xcode y Flutter instalados
8
-
9
- ## Configuración única
10
-
11
- ```bash
12
- kasy ios configure
13
- ```
14
-
15
- Abre los enlaces de Apple, pide la clave API (`.p8`) y guarda `.kasy/apple.env` (no se sube a Git).
16
-
17
- ## Enviar nueva versión
18
-
19
- ```bash
20
- kasy ios release
21
- ```
22
-
23
- Incrementa el build en `pubspec.yaml`, genera el IPA y lo sube a App Store Connect (sin Transporter).
24
-
25
- Atajo: `make release-ios`
26
-
27
- ### Opciones
28
-
29
- - `kasy ios build` — solo IPA, sin subir
30
- - `kasy ios release --no-bump` — no incrementar build
31
- - `kasy ios release --version-name 1.0.1` — cambiar versión visible
32
-
33
- ## ¿Sin Mac?
34
-
35
- Build en la nube: [codemagic-release.md](./codemagic-release.md) y `kasy codemagic configure` / `kasy codemagic release`.
36
-
37
- ## Verificar entorno
38
-
39
- ```bash
40
- kasy doctor
41
- ```
@@ -1,41 +0,0 @@
1
- # Publicar no iOS (App Store)
2
-
3
- ## Pré-requisitos
4
-
5
- - Conta [Apple Developer](https://developer.apple.com) (paga)
6
- - App criado no [App Store Connect](https://appstoreconnect.apple.com) com o mesmo **Bundle ID** do projeto
7
- - Mac com Xcode e Flutter instalados
8
-
9
- ## Configuração única
10
-
11
- ```bash
12
- kasy ios configure
13
- ```
14
-
15
- O comando abre os links da Apple, pede a chave API (`.p8`) e grava `.kasy/apple.env` (não vai para o Git).
16
-
17
- ## Enviar nova versão
18
-
19
- ```bash
20
- kasy ios release
21
- ```
22
-
23
- Isso incrementa o build no `pubspec.yaml`, gera o IPA e envia para a App Store Connect (sem Transporter).
24
-
25
- Atalho: `make release-ios`
26
-
27
- ### Opções
28
-
29
- - `kasy ios build` — só gera o IPA, sem enviar
30
- - `kasy ios release --no-bump` — não incrementa o build
31
- - `kasy ios release --version-name 1.0.1` — altera a versão visível
32
-
33
- ## Sem Mac?
34
-
35
- Use build na nuvem: [codemagic-release.md](./codemagic-release.md) e `kasy codemagic configure` / `kasy codemagic release`.
36
-
37
- ## Verificar ambiente
38
-
39
- ```bash
40
- kasy doctor
41
- ```
@@ -1,38 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- const fs = require('node:fs');
5
- const path = require('node:path');
6
-
7
- const root = path.resolve(__dirname, '..');
8
- const pubspecPath = path.join(root, 'pubspec.yaml');
9
-
10
- function parseArgs() {
11
- const args = process.argv.slice(2);
12
- let versionName = null;
13
- for (let i = 0; i < args.length; i += 1) {
14
- if (args[i] === '--version-name' && args[i + 1]) {
15
- versionName = args[i + 1];
16
- i += 1;
17
- }
18
- }
19
- return { versionName };
20
- }
21
-
22
- function bumpPubspecVersion(content, versionNameOverride) {
23
- const match = content.match(/^version:\s*(\d+\.\d+\.\d+)\+(\d+)\s*$/m);
24
- if (!match) {
25
- throw new Error('Invalid version line in pubspec.yaml (expected format: 1.0.0+1)');
26
- }
27
- const name = versionNameOverride || match[1];
28
- const build = parseInt(match[2], 10) + 1;
29
- const next = `version: ${name}+${build}`;
30
- const updated = content.replace(/^version:\s*.*/m, next);
31
- return { updated, label: `${name}+${build}` };
32
- }
33
-
34
- const { versionName } = parseArgs();
35
- const content = fs.readFileSync(pubspecPath, 'utf8');
36
- const { updated, label } = bumpPubspecVersion(content, versionName);
37
- fs.writeFileSync(pubspecPath, updated);
38
- console.log(label);