kasy-cli 1.5.3 → 1.7.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 +7 -4
- package/docs/cli-reference.md +4 -6
- package/lib/commands/add.js +128 -102
- package/lib/commands/check.js +55 -38
- package/lib/commands/codemagic.js +61 -58
- package/lib/commands/deploy.js +49 -45
- package/lib/commands/docs.js +19 -18
- package/lib/commands/doctor.js +46 -44
- package/lib/commands/features.js +42 -20
- package/lib/commands/ios.js +69 -69
- package/lib/commands/new.js +529 -771
- package/lib/commands/notifications.js +59 -59
- package/lib/commands/remove.js +28 -27
- package/lib/commands/run.js +3 -1
- package/lib/commands/update.js +104 -96
- package/lib/commands/validate.js +24 -19
- package/lib/scaffold/catalog.js +45 -11
- package/lib/scaffold/features/README.md +1 -2
- package/lib/scaffold/shared/generator-utils.js +1 -1
- package/lib/utils/apple-release.js +23 -11
- package/lib/utils/brand.js +72 -0
- package/lib/utils/checks.js +20 -9
- package/lib/utils/i18n.js +102 -78
- package/lib/utils/prompts.js +29 -177
- package/lib/utils/ui.js +92 -0
- package/lib/utils/updates.js +9 -8
- package/package.json +2 -1
- package/templates/firebase/lib/features/home/home_page.dart +0 -19
- package/templates/firebase/lib/features/settings/ui/components/admin/admin_routes.dart +0 -1
- package/templates/firebase/lib/router.dart +0 -9
- package/templates/firebase/lib/features/dev/keyboard_test_page.dart +0 -93
|
@@ -4,6 +4,7 @@ const path = require('node:path');
|
|
|
4
4
|
const fs = require('fs-extra');
|
|
5
5
|
const os = require('node:os');
|
|
6
6
|
const kleur = require('kleur');
|
|
7
|
+
const ui = require('./ui');
|
|
7
8
|
const { exec } = require('node:child_process');
|
|
8
9
|
const { promisify } = require('node:util');
|
|
9
10
|
|
|
@@ -202,17 +203,21 @@ function isXcodeCacheBuildError(output) {
|
|
|
202
203
|
|
|
203
204
|
function printBuildFailureHints(t, projectDir) {
|
|
204
205
|
const name = path.basename(projectDir);
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
206
|
+
const cleanArg = projectDir !== process.cwd() ? ` ${projectDir}` : '';
|
|
207
|
+
const lines = [
|
|
208
|
+
`1. ${t('ios.hints.closeXcode')}`,
|
|
209
|
+
`2. ${kleur.cyan(`kasy ios clean${cleanArg}`)}`,
|
|
210
|
+
`3. ${t('ios.hints.retry')}: ${kleur.cyan('kasy ios release')}`,
|
|
211
|
+
];
|
|
209
212
|
if (name) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
213
|
+
lines.push('');
|
|
214
|
+
lines.push(kleur.dim(`${t('ios.hints.manual')}:`));
|
|
215
|
+
lines.push(kleur.dim(` cd ${projectDir}`));
|
|
216
|
+
lines.push(kleur.dim(' flutter clean && flutter pub get'));
|
|
217
|
+
lines.push(kleur.dim(' rm -rf ~/Library/Developer/Xcode/DerivedData/Runner-*'));
|
|
218
|
+
lines.push(kleur.dim(' cd ios && pod install'));
|
|
215
219
|
}
|
|
220
|
+
ui.note(lines.join('\n'), t('ios.hints.title'));
|
|
216
221
|
}
|
|
217
222
|
|
|
218
223
|
async function runIosClean(projectDir, t) {
|
|
@@ -224,10 +229,17 @@ async function runIosClean(projectDir, t) {
|
|
|
224
229
|
{ label: t('ios.clean.step.pods'), cmd: 'cd ios && pod install' },
|
|
225
230
|
];
|
|
226
231
|
|
|
232
|
+
const stepper = ui.makeStepper();
|
|
227
233
|
for (const step of steps) {
|
|
228
|
-
|
|
229
|
-
|
|
234
|
+
stepper.next(step.label);
|
|
235
|
+
try {
|
|
236
|
+
await execAsync(step.cmd, { cwd: projectDir, maxBuffer: 50 * 1024 * 1024, shell: '/bin/bash' });
|
|
237
|
+
} catch (err) {
|
|
238
|
+
stepper.fail(`${step.label}: ${err.message}`);
|
|
239
|
+
throw err;
|
|
240
|
+
}
|
|
230
241
|
}
|
|
242
|
+
stepper.succeed();
|
|
231
243
|
}
|
|
232
244
|
|
|
233
245
|
async function runReleaseScript(projectDir, args, t) {
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kasy brand kit for the terminal.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes logo, banner, headers, and boxed messages so every
|
|
5
|
+
* command projects a consistent identity. Two header sizes:
|
|
6
|
+
* - printBanner(): full ASCII logo + gradient + tagline (kasy new, kasy add)
|
|
7
|
+
* - printCompactHeader(): one-line ✦ KASY + tagline (kasy doctor, upgrade, run)
|
|
8
|
+
*
|
|
9
|
+
* Box helpers wrap `boxen` so commands stop drawing ─── lines by hand.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const kleur = require('kleur');
|
|
13
|
+
const gradient = require('gradient-string');
|
|
14
|
+
const boxenPackage = require('boxen');
|
|
15
|
+
const boxen = boxenPackage.default || boxenPackage;
|
|
16
|
+
|
|
17
|
+
// Kept around for accents and boxes; the wordmark itself is now plain white.
|
|
18
|
+
const BRAND_GRADIENT = ['#a78bfa', '#60a5fa'];
|
|
19
|
+
const brandGradient = gradient(BRAND_GRADIENT);
|
|
20
|
+
|
|
21
|
+
const DOMAIN_SUFFIX = kleur.gray('.dev');
|
|
22
|
+
|
|
23
|
+
function printBanner(_tr) {
|
|
24
|
+
const bar = kleur.gray('─────────────────────────────────────────────────');
|
|
25
|
+
const logo = [
|
|
26
|
+
kleur.white(' ╦╔═ ╔═╗ ╔═╗ ╦ ╦'),
|
|
27
|
+
kleur.white(' ╠╩╗ ╠═╣ ╚═╗ ╚╦╝'),
|
|
28
|
+
`${kleur.white(' ╩ ╩ ╩ ╩ ╚═╝ ╩ ')} ${DOMAIN_SUFFIX}`,
|
|
29
|
+
].join('\n');
|
|
30
|
+
|
|
31
|
+
console.log(`\n${bar}\n`);
|
|
32
|
+
console.log(logo);
|
|
33
|
+
console.log(`\n${bar}\n`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function printCompactHeader(_tr) {
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(` ${kleur.white('✦ KASY')}${DOMAIN_SUFFIX}`);
|
|
39
|
+
console.log('');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function successBox(title, body, { padding = 1, marginTop = 1, marginBottom = 1 } = {}) {
|
|
43
|
+
return boxen(
|
|
44
|
+
`${brandGradient(`✦ ${title}`)}\n\n${body}`,
|
|
45
|
+
{
|
|
46
|
+
padding,
|
|
47
|
+
margin: { top: marginTop, bottom: marginBottom, left: 1, right: 1 },
|
|
48
|
+
borderStyle: 'round',
|
|
49
|
+
borderColor: 'cyan',
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function infoBox(title, body, { padding = 1, marginTop = 1, marginBottom = 1 } = {}) {
|
|
55
|
+
return boxen(
|
|
56
|
+
`${kleur.bold(title)}\n\n${body}`,
|
|
57
|
+
{
|
|
58
|
+
padding,
|
|
59
|
+
margin: { top: marginTop, bottom: marginBottom, left: 1, right: 1 },
|
|
60
|
+
borderStyle: 'round',
|
|
61
|
+
borderColor: 'gray',
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
module.exports = {
|
|
67
|
+
brandGradient,
|
|
68
|
+
printBanner,
|
|
69
|
+
printCompactHeader,
|
|
70
|
+
successBox,
|
|
71
|
+
infoBox,
|
|
72
|
+
};
|
package/lib/utils/checks.js
CHANGED
|
@@ -3,6 +3,7 @@ const { promisify } = require('node:util');
|
|
|
3
3
|
const readline = require('node:readline');
|
|
4
4
|
const kleur = require('kleur');
|
|
5
5
|
const oraPackage = require('ora');
|
|
6
|
+
const ui = require('./ui');
|
|
6
7
|
const { createTranslator, detectDefaultLanguage } = require('./i18n');
|
|
7
8
|
|
|
8
9
|
const execAsync = promisify(exec);
|
|
@@ -290,7 +291,8 @@ async function runChecks(checks, title, options = {}) {
|
|
|
290
291
|
|
|
291
292
|
// Compact mode: single spinner, show failures only
|
|
292
293
|
const { spinnerLabel = title, doneLabel = title } = options;
|
|
293
|
-
|
|
294
|
+
const spinner = ui.spinner();
|
|
295
|
+
spinner.start(spinnerLabel);
|
|
294
296
|
|
|
295
297
|
const results = [];
|
|
296
298
|
for (const check of checks) {
|
|
@@ -298,26 +300,35 @@ async function runChecks(checks, title, options = {}) {
|
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
const failures = results.filter((r) => !r.ok);
|
|
303
|
+
const requiredFailures = failures.filter((r) => r.required);
|
|
301
304
|
|
|
302
305
|
if (failures.length === 0) {
|
|
303
|
-
|
|
306
|
+
spinner.stop(doneLabel);
|
|
304
307
|
return results;
|
|
305
308
|
}
|
|
306
309
|
|
|
310
|
+
// Close the spinner reflecting what actually happened: red ▲ if a required
|
|
311
|
+
// check failed, default green ✦ if only optional checks failed (warnings).
|
|
312
|
+
if (requiredFailures.length > 0) {
|
|
313
|
+
spinner.error(doneLabel);
|
|
314
|
+
} else {
|
|
315
|
+
spinner.stop(doneLabel);
|
|
316
|
+
}
|
|
317
|
+
|
|
307
318
|
for (const result of failures) {
|
|
308
|
-
const hint = result.failHint ? `\n
|
|
319
|
+
const hint = result.failHint ? `\n${kleur.dim(`→ ${result.failHint}`)}` : '';
|
|
309
320
|
if (result.required) {
|
|
310
321
|
const detail = result.autoInstallFailed ? ` — ${t('checks.install.failed')}` : '';
|
|
311
|
-
const diagSuffix = result.diagnosis ? `\n
|
|
312
|
-
|
|
322
|
+
const diagSuffix = result.diagnosis ? `\n${kleur.dim(`→ ${t(`checks.diagnostic.${result.diagnosis}`, { name: result.name })}`)}` : '';
|
|
323
|
+
ui.log.error(`${t('checks.missing', { name: result.name })}${detail}${diagSuffix}${hint}`);
|
|
313
324
|
} else if (result.diagnosis) {
|
|
314
|
-
|
|
325
|
+
ui.log.warn(t(`checks.diagnostic.${result.diagnosis}`, { name: result.name }));
|
|
315
326
|
} else if (result.warnMessage) {
|
|
316
|
-
|
|
327
|
+
ui.log.warn(`${result.warnMessage}${hint}`);
|
|
317
328
|
} else if (result.warnMessageKey) {
|
|
318
|
-
|
|
329
|
+
ui.log.warn(`${t(result.warnMessageKey)}${hint}`);
|
|
319
330
|
} else {
|
|
320
|
-
|
|
331
|
+
ui.log.warn(`${t('checks.notFound', { name: result.name })}${hint}`);
|
|
321
332
|
}
|
|
322
333
|
}
|
|
323
334
|
|
package/lib/utils/i18n.js
CHANGED
|
@@ -34,7 +34,7 @@ const MESSAGES = {
|
|
|
34
34
|
'cli.command.setup.langName': 'lang',
|
|
35
35
|
'cli.command.setup.langOption': 'Prompt language (en, pt, es)',
|
|
36
36
|
'cli.command.setup.backendOption': 'Backend adapter (firebase, supabase, api)',
|
|
37
|
-
'cli.command.setup.featuresOption': 'Comma separated optional features (web,widget,
|
|
37
|
+
'cli.command.setup.featuresOption': 'Comma separated optional features (web,widget,llm_chat,revenuecat,ci)',
|
|
38
38
|
'cli.command.help.paramName': 'command',
|
|
39
39
|
'cli.command.doctor.description': '🩺 Check environment and dependencies',
|
|
40
40
|
'cli.command.modules.description': '🧩 List available backend and features',
|
|
@@ -73,22 +73,31 @@ const MESSAGES = {
|
|
|
73
73
|
'doctor.requiredMissing': 'Missing required dependencies. Fix the errors above and rerun doctor.',
|
|
74
74
|
'doctor.requiredPassed': '✓ Required environment checks passed.',
|
|
75
75
|
'modules.backends': 'Available backends:',
|
|
76
|
-
'modules.
|
|
76
|
+
'modules.featuresBase': 'Always included:',
|
|
77
|
+
'modules.features': 'Optional features:',
|
|
78
|
+
'modules.tag.firebaseOnly': 'Firebase only',
|
|
79
|
+
'modules.tag.requiresDb': 'requires Firebase or Supabase',
|
|
80
|
+
'modules.tag.enhances': 'enables {target}',
|
|
81
|
+
'modules.hint.subscriptionNoRc': 'Tip: Subscriptions screen is included but inactive. Run `kasy add revenuecat` to enable real payments.',
|
|
82
|
+
'modules.feature.base.authentication.description': 'Sign up, login and account management',
|
|
83
|
+
'modules.feature.base.home.description': 'Main app screen after login',
|
|
84
|
+
'modules.feature.base.settings.description': 'Theme, language, account and preferences',
|
|
85
|
+
'modules.feature.base.notifications.description': 'Push notifications via Firebase Cloud Messaging (works with any backend)',
|
|
86
|
+
'modules.feature.base.subscription.description': 'Premium subscription screen and data model (add RevenueCat to enable real payments)',
|
|
77
87
|
'modules.backend.firebase.description': 'Firebase backend adapter',
|
|
78
88
|
'modules.backend.supabase.description': 'Supabase backend adapter',
|
|
79
89
|
'modules.backend.api.description': 'REST/GraphQL API backend adapter',
|
|
80
90
|
'modules.feature.sentry.description': 'Sentry error tracking and crash reporting',
|
|
81
91
|
'modules.feature.analytics.description': 'Analytics event tracking (Firebase Analytics)',
|
|
82
|
-
'modules.feature.facebook.description': 'Facebook Login
|
|
83
|
-
'modules.feature.revenuecat.description': '
|
|
84
|
-
'modules.feature.onboarding.description': '
|
|
85
|
-
'modules.feature.web.description': 'Web
|
|
86
|
-
'modules.feature.widget.description': 'iOS/Android home widget integration',
|
|
87
|
-
'modules.feature.
|
|
88
|
-
'modules.feature.
|
|
89
|
-
'modules.feature.
|
|
90
|
-
'modules.feature.
|
|
91
|
-
'modules.feature.ci.description': 'CI: GitHub/GitLab (tests + build) + Codemagic (publish to stores)',
|
|
92
|
+
'modules.feature.facebook.description': 'Facebook Login and Meta Ads event tracking (always bundled together)',
|
|
93
|
+
'modules.feature.revenuecat.description': 'Enables real in-app payments on the Subscriptions screen',
|
|
94
|
+
'modules.feature.onboarding.description': 'Welcome flow shown on first launch',
|
|
95
|
+
'modules.feature.web.description': 'Web/PWA support',
|
|
96
|
+
'modules.feature.widget.description': 'iOS/Android home screen widget integration',
|
|
97
|
+
'modules.feature.llm_chat.description': 'AI chat screen with OpenAI or Gemini',
|
|
98
|
+
'modules.feature.feedback.description': 'In-app feature requests and voting',
|
|
99
|
+
'modules.feature.local_notifications.description': 'Local reminders scheduled by the user (no server required)',
|
|
100
|
+
'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publish to stores)',
|
|
92
101
|
'checks.checking': 'Checking {name}...',
|
|
93
102
|
'checks.found': '{name} found',
|
|
94
103
|
'checks.foundWithVersion': '{name} ready ({version})',
|
|
@@ -248,7 +257,7 @@ const MESSAGES = {
|
|
|
248
257
|
'new.q.preset': 'Which features to include?',
|
|
249
258
|
'new.q.preset.starter': '⚡ Starter — analytics + crash reports + onboarding',
|
|
250
259
|
'new.q.preset.saas': '💰 SaaS — subscriptions + analytics + onboarding + feedback',
|
|
251
|
-
'new.q.preset.content': '📱 Content —
|
|
260
|
+
'new.q.preset.content': '📱 Content — crash reports + analytics + onboarding + AI chat',
|
|
252
261
|
'new.q.preset.full': '🚀 Full — all features',
|
|
253
262
|
'new.q.preset.custom': '⚙️ Custom — choose features one by one',
|
|
254
263
|
'new.q.preset.none': '○ None — just the core',
|
|
@@ -411,18 +420,17 @@ const MESSAGES = {
|
|
|
411
420
|
'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
|
|
412
421
|
'new.modules.header.ci': '── CI/CD ──',
|
|
413
422
|
'new.modules.header.monetization': '── Monetization ──',
|
|
414
|
-
'new.firebase.module.revenuecat': '💰
|
|
415
|
-
'new.firebase.module.sentry': '🚨 Crash
|
|
423
|
+
'new.firebase.module.revenuecat': '💰 RevenueCat (enables Subscriptions)',
|
|
424
|
+
'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
|
|
416
425
|
'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
|
|
417
|
-
'new.firebase.module.facebook': '👤 Facebook
|
|
418
|
-
'new.firebase.module.web': '🌐 Web (
|
|
419
|
-
'new.firebase.module.widget': '📱 Home
|
|
420
|
-
'new.firebase.module.
|
|
421
|
-
'new.firebase.module.
|
|
422
|
-
'new.firebase.module.
|
|
423
|
-
'new.firebase.module.
|
|
424
|
-
'new.firebase.module.
|
|
425
|
-
'new.firebase.module.onboarding': '👋 Onboarding (welcome screens, profile questions)',
|
|
426
|
+
'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
|
|
427
|
+
'new.firebase.module.web': '🌐 Web Support (PWA, Firebase only)',
|
|
428
|
+
'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
|
|
429
|
+
'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
|
|
430
|
+
'new.firebase.module.local_notifications': '🔔 Local Reminders (no server)',
|
|
431
|
+
'new.firebase.module.feedback': '💬 Feature Requests (requires Firebase or Supabase)',
|
|
432
|
+
'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
|
|
433
|
+
'new.firebase.module.onboarding': '👋 Onboarding (welcome flow)',
|
|
426
434
|
|
|
427
435
|
'new.firebase.q.secrets.configureNow': 'Configure server secrets now? (RevenueCat webhook, Meta Ads)',
|
|
428
436
|
'new.firebase.q.secrets.configureNow.hint': 'If not now, see the README for commands to add them later',
|
|
@@ -633,7 +641,7 @@ const MESSAGES = {
|
|
|
633
641
|
'notifications.summary.demo': 'Home → Features (demo):',
|
|
634
642
|
'notifications.summary.reminder': 'Settings → Reminders (scheduled):',
|
|
635
643
|
|
|
636
|
-
'add.list.title': '
|
|
644
|
+
'add.list.title': 'Project features',
|
|
637
645
|
'add.error.noModule': 'Provide a feature name or use --list to see available features.',
|
|
638
646
|
'add.error.notKasyProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
639
647
|
'add.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
|
|
@@ -692,7 +700,7 @@ const MESSAGES = {
|
|
|
692
700
|
'remove.warn.ci': 'CI files removed. If you had custom workflow files, restore them from git.',
|
|
693
701
|
'remove.warn.sentry.shared': 'sentry_flutter kept — still required by active features (revenuecat/facebook).',
|
|
694
702
|
'cli.command.update.description': '⬆️ Update features/components in an existing project',
|
|
695
|
-
'cli.command.update.targetArg': 'Target to update (e.g.
|
|
703
|
+
'cli.command.update.targetArg': 'Target to update (e.g. revenuecat, sentry, components)',
|
|
696
704
|
'update.error.noProject': 'No kit_setup.json found. Run this command from inside a Kasy project.',
|
|
697
705
|
'update.error.unknownModule': 'Unknown feature: {module}\nAvailable: {list}',
|
|
698
706
|
'update.error.unknownTarget': 'Unknown update target: {module}\nAvailable: {list}',
|
|
@@ -759,7 +767,7 @@ const MESSAGES = {
|
|
|
759
767
|
'cli.command.setup.langName': 'idioma',
|
|
760
768
|
'cli.command.setup.langOption': 'Idioma dos prompts (en, pt, es)',
|
|
761
769
|
'cli.command.setup.backendOption': 'Adapter de backend (firebase, supabase, api)',
|
|
762
|
-
'cli.command.setup.featuresOption': 'Features opcionais separadas por virgula (web,widget,
|
|
770
|
+
'cli.command.setup.featuresOption': 'Features opcionais separadas por virgula (web,widget,llm_chat,revenuecat,ci)',
|
|
763
771
|
'cli.command.help.paramName': 'comando',
|
|
764
772
|
'cli.command.doctor.description': '🩺 Verifica ambiente e dependencias',
|
|
765
773
|
'cli.command.modules.description': '🧩 Lista backends e features disponiveis',
|
|
@@ -798,22 +806,31 @@ const MESSAGES = {
|
|
|
798
806
|
'doctor.requiredMissing': 'Dependencias obrigatorias ausentes. Corrija os erros acima e execute o doctor novamente.',
|
|
799
807
|
'doctor.requiredPassed': '✓ Verificacoes obrigatorias de ambiente aprovadas.',
|
|
800
808
|
'modules.backends': 'Backends disponiveis:',
|
|
801
|
-
'modules.
|
|
809
|
+
'modules.featuresBase': 'Sempre incluido:',
|
|
810
|
+
'modules.features': 'Features opcionais:',
|
|
811
|
+
'modules.tag.firebaseOnly': 'somente Firebase',
|
|
812
|
+
'modules.tag.requiresDb': 'requer Firebase ou Supabase',
|
|
813
|
+
'modules.tag.enhances': 'ativa {target}',
|
|
814
|
+
'modules.hint.subscriptionNoRc': 'Dica: a tela de Subscriptions esta inclusa mas inativa. Rode `kasy add revenuecat` para habilitar pagamentos reais.',
|
|
815
|
+
'modules.feature.base.authentication.description': 'Cadastro, login e gerenciamento de conta',
|
|
816
|
+
'modules.feature.base.home.description': 'Tela principal do app apos o login',
|
|
817
|
+
'modules.feature.base.settings.description': 'Tema, idioma, conta e preferencias',
|
|
818
|
+
'modules.feature.base.notifications.description': 'Notificacoes push via Firebase Cloud Messaging (funciona com qualquer backend)',
|
|
819
|
+
'modules.feature.base.subscription.description': 'Tela e modelo de assinatura premium (adicione RevenueCat para habilitar pagamentos reais)',
|
|
802
820
|
'modules.backend.firebase.description': 'Adapter de backend Firebase',
|
|
803
821
|
'modules.backend.supabase.description': 'Adapter de backend Supabase',
|
|
804
822
|
'modules.backend.api.description': 'Adapter de backend API REST/GraphQL',
|
|
805
823
|
'modules.feature.sentry.description': 'Rastreamento de erros e crashes com Sentry',
|
|
806
824
|
'modules.feature.analytics.description': 'Rastreamento de eventos de analytics (Firebase Analytics)',
|
|
807
|
-
'modules.feature.facebook.description': '
|
|
808
|
-
'modules.feature.revenuecat.description': '
|
|
809
|
-
'modules.feature.onboarding.description': '
|
|
810
|
-
'modules.feature.web.description': '
|
|
811
|
-
'modules.feature.widget.description': '
|
|
812
|
-
'modules.feature.
|
|
813
|
-
'modules.feature.
|
|
814
|
-
'modules.feature.
|
|
815
|
-
'modules.feature.
|
|
816
|
-
'modules.feature.ci.description': 'CI: GitHub/GitLab (testes + build) + Codemagic (publicacao nas lojas)',
|
|
825
|
+
'modules.feature.facebook.description': 'Login do Facebook e rastreamento de eventos Meta Ads (vem sempre junto)',
|
|
826
|
+
'modules.feature.revenuecat.description': 'Habilita pagamentos reais na tela de Subscriptions',
|
|
827
|
+
'modules.feature.onboarding.description': 'Fluxo de boas-vindas mostrado no primeiro acesso',
|
|
828
|
+
'modules.feature.web.description': 'Suporte Web/PWA',
|
|
829
|
+
'modules.feature.widget.description': 'Widget de tela inicial iOS/Android',
|
|
830
|
+
'modules.feature.llm_chat.description': 'Tela de chat com IA usando OpenAI ou Gemini',
|
|
831
|
+
'modules.feature.feedback.description': 'Pedidos e votacao de features dentro do app',
|
|
832
|
+
'modules.feature.local_notifications.description': 'Lembretes locais agendados pelo usuario (sem servidor)',
|
|
833
|
+
'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (testes + build) + Codemagic (publicacao nas lojas)',
|
|
817
834
|
'checks.checking': 'Verificando {name}...',
|
|
818
835
|
'checks.found': '{name} encontrado',
|
|
819
836
|
'checks.foundWithVersion': '{name} pronto ({version})',
|
|
@@ -973,7 +990,7 @@ const MESSAGES = {
|
|
|
973
990
|
'new.q.preset': 'Quais features incluir?',
|
|
974
991
|
'new.q.preset.starter': '⚡ Starter — analytics + erros + onboarding',
|
|
975
992
|
'new.q.preset.saas': '💰 SaaS — assinaturas + analytics + onboarding + feedback',
|
|
976
|
-
'new.q.preset.content': '📱 Conteudo — analytics + onboarding +
|
|
993
|
+
'new.q.preset.content': '📱 Conteudo — crash reports + analytics + onboarding + AI chat',
|
|
977
994
|
'new.q.preset.full': '🚀 Completo — todas as features',
|
|
978
995
|
'new.q.preset.custom': '⚙️ Personalizar — escolha feature a feature',
|
|
979
996
|
'new.q.preset.none': '○ Nenhum — so o core',
|
|
@@ -1136,18 +1153,17 @@ const MESSAGES = {
|
|
|
1136
1153
|
'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
|
|
1137
1154
|
'new.modules.header.ci': '── CI/CD ──',
|
|
1138
1155
|
'new.modules.header.monetization': '── Monetizacao ──',
|
|
1139
|
-
'new.firebase.module.revenuecat': '💰
|
|
1140
|
-
'new.firebase.module.sentry': '🚨
|
|
1156
|
+
'new.firebase.module.revenuecat': '💰 RevenueCat (ativa Subscriptions)',
|
|
1157
|
+
'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
|
|
1141
1158
|
'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
|
|
1142
|
-
'new.firebase.module.facebook': '👤
|
|
1143
|
-
'new.firebase.module.web': '🌐 Web (
|
|
1144
|
-
'new.firebase.module.widget': '📱 Widget
|
|
1145
|
-
'new.firebase.module.
|
|
1146
|
-
'new.firebase.module.
|
|
1147
|
-
'new.firebase.module.
|
|
1148
|
-
'new.firebase.module.
|
|
1149
|
-
'new.firebase.module.
|
|
1150
|
-
'new.firebase.module.onboarding': '👋 Onboarding (telas de boas-vindas, perguntas de perfil)',
|
|
1159
|
+
'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
|
|
1160
|
+
'new.firebase.module.web': '🌐 Web Support (PWA, somente Firebase)',
|
|
1161
|
+
'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
|
|
1162
|
+
'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
|
|
1163
|
+
'new.firebase.module.local_notifications': '🔔 Local Reminders (sem servidor)',
|
|
1164
|
+
'new.firebase.module.feedback': '💬 Feature Requests (requer Firebase ou Supabase)',
|
|
1165
|
+
'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
|
|
1166
|
+
'new.firebase.module.onboarding': '👋 Onboarding (fluxo de boas-vindas)',
|
|
1151
1167
|
|
|
1152
1168
|
'new.firebase.q.secrets.configureNow': 'Configurar as secrets do servidor agora? (webhook RevenueCat, Meta Ads)',
|
|
1153
1169
|
'new.firebase.q.secrets.configureNow.hint': 'Se nao agora, veja o README para os comandos de configuracao depois',
|
|
@@ -1358,7 +1374,7 @@ const MESSAGES = {
|
|
|
1358
1374
|
'notifications.summary.demo': 'Home → Features (demo):',
|
|
1359
1375
|
'notifications.summary.reminder': 'Configuracoes → Lembretes (agendado):',
|
|
1360
1376
|
|
|
1361
|
-
'add.list.title': 'Features
|
|
1377
|
+
'add.list.title': 'Features do projeto',
|
|
1362
1378
|
'add.error.noModule': 'Informe o nome da feature ou use --list para ver as disponiveis.',
|
|
1363
1379
|
'add.error.notKasyProject': 'kit_setup.json nao encontrado. Execute este comando dentro de um projeto Kasy.',
|
|
1364
1380
|
'add.error.unknownModule': 'Feature desconhecida: {module}\nDisponiveis: {list}',
|
|
@@ -1417,7 +1433,7 @@ const MESSAGES = {
|
|
|
1417
1433
|
'remove.warn.ci': 'Arquivos de CI removidos. Se tinha workflows customizados, restaure-os pelo git.',
|
|
1418
1434
|
'remove.warn.sentry.shared': 'sentry_flutter mantido — ainda necessario para features ativas (revenuecat/facebook).',
|
|
1419
1435
|
'cli.command.update.description': '⬆️ Atualiza features/componentes em um projeto existente',
|
|
1420
|
-
'cli.command.update.targetArg': 'Alvo para atualizar (ex.:
|
|
1436
|
+
'cli.command.update.targetArg': 'Alvo para atualizar (ex.: revenuecat, sentry, components)',
|
|
1421
1437
|
'update.error.noProject': 'kit_setup.json nao encontrado. Execute dentro de um projeto Kasy.',
|
|
1422
1438
|
'update.error.unknownModule': 'Modulo desconhecido: {module}\nDisponiveis: {list}',
|
|
1423
1439
|
'update.error.unknownTarget': 'Alvo de atualizacao desconhecido: {module}\nDisponiveis: {list}',
|
|
@@ -1484,7 +1500,7 @@ const MESSAGES = {
|
|
|
1484
1500
|
'cli.command.setup.langName': 'idioma',
|
|
1485
1501
|
'cli.command.setup.langOption': 'Idioma de prompts (en, pt, es)',
|
|
1486
1502
|
'cli.command.setup.backendOption': 'Adapter de backend (firebase, supabase, api)',
|
|
1487
|
-
'cli.command.setup.featuresOption': 'Features opcionales separadas por coma (web,widget,
|
|
1503
|
+
'cli.command.setup.featuresOption': 'Features opcionales separadas por coma (web,widget,llm_chat,revenuecat,ci)',
|
|
1488
1504
|
'cli.command.help.paramName': 'comando',
|
|
1489
1505
|
'cli.command.doctor.description': '🩺 Verifica entorno y dependencias',
|
|
1490
1506
|
'cli.command.modules.description': '🧩 Lista backends y features disponibles',
|
|
@@ -1523,22 +1539,31 @@ const MESSAGES = {
|
|
|
1523
1539
|
'doctor.requiredMissing': 'Faltan dependencias obligatorias. Corrige los errores anteriores y ejecuta doctor nuevamente.',
|
|
1524
1540
|
'doctor.requiredPassed': '✓ Verificaciones obligatorias de entorno aprobadas.',
|
|
1525
1541
|
'modules.backends': 'Backends disponibles:',
|
|
1526
|
-
'modules.
|
|
1542
|
+
'modules.featuresBase': 'Siempre incluido:',
|
|
1543
|
+
'modules.features': 'Features opcionales:',
|
|
1544
|
+
'modules.tag.firebaseOnly': 'solo Firebase',
|
|
1545
|
+
'modules.tag.requiresDb': 'requiere Firebase o Supabase',
|
|
1546
|
+
'modules.tag.enhances': 'activa {target}',
|
|
1547
|
+
'modules.hint.subscriptionNoRc': 'Tip: la pantalla de Subscriptions esta incluida pero inactiva. Ejecuta `kasy add revenuecat` para habilitar pagos reales.',
|
|
1548
|
+
'modules.feature.base.authentication.description': 'Registro, inicio de sesion y gestion de cuenta',
|
|
1549
|
+
'modules.feature.base.home.description': 'Pantalla principal de la app despues del login',
|
|
1550
|
+
'modules.feature.base.settings.description': 'Tema, idioma, cuenta y preferencias',
|
|
1551
|
+
'modules.feature.base.notifications.description': 'Notificaciones push via Firebase Cloud Messaging (funciona con cualquier backend)',
|
|
1552
|
+
'modules.feature.base.subscription.description': 'Pantalla y modelo de suscripcion premium (anade RevenueCat para habilitar pagos reales)',
|
|
1527
1553
|
'modules.backend.firebase.description': 'Adapter de backend Firebase',
|
|
1528
1554
|
'modules.backend.supabase.description': 'Adapter de backend Supabase',
|
|
1529
1555
|
'modules.backend.api.description': 'Adapter de backend API REST/GraphQL',
|
|
1530
1556
|
'modules.feature.sentry.description': 'Seguimiento de errores y crashes con Sentry',
|
|
1531
1557
|
'modules.feature.analytics.description': 'Seguimiento de eventos de analytics (Firebase Analytics)',
|
|
1532
|
-
'modules.feature.facebook.description': '
|
|
1533
|
-
'modules.feature.revenuecat.description': '
|
|
1534
|
-
'modules.feature.onboarding.description': '
|
|
1535
|
-
'modules.feature.web.description': '
|
|
1536
|
-
'modules.feature.widget.description': '
|
|
1537
|
-
'modules.feature.
|
|
1538
|
-
'modules.feature.
|
|
1539
|
-
'modules.feature.
|
|
1540
|
-
'modules.feature.
|
|
1541
|
-
'modules.feature.ci.description': 'CI: GitHub/GitLab (tests + build) + Codemagic (publicacion en tiendas)',
|
|
1558
|
+
'modules.feature.facebook.description': 'Login de Facebook y seguimiento de eventos Meta Ads (siempre juntos)',
|
|
1559
|
+
'modules.feature.revenuecat.description': 'Habilita pagos reales en la pantalla de Subscriptions',
|
|
1560
|
+
'modules.feature.onboarding.description': 'Flujo de bienvenida mostrado en el primer acceso',
|
|
1561
|
+
'modules.feature.web.description': 'Soporte Web/PWA',
|
|
1562
|
+
'modules.feature.widget.description': 'Widget de pantalla inicial iOS/Android',
|
|
1563
|
+
'modules.feature.llm_chat.description': 'Pantalla de chat con IA usando OpenAI o Gemini',
|
|
1564
|
+
'modules.feature.feedback.description': 'Solicitudes y votacion de features dentro de la app',
|
|
1565
|
+
'modules.feature.local_notifications.description': 'Recordatorios locales programados por el usuario (sin servidor)',
|
|
1566
|
+
'modules.feature.ci.description': 'CI/CD: GitHub/GitLab (tests + build) + Codemagic (publicacion en tiendas)',
|
|
1542
1567
|
'checks.checking': 'Verificando {name}...',
|
|
1543
1568
|
'checks.found': '{name} encontrado',
|
|
1544
1569
|
'checks.foundWithVersion': '{name} listo ({version})',
|
|
@@ -1700,7 +1725,7 @@ const MESSAGES = {
|
|
|
1700
1725
|
'new.q.preset': '¿Qué features incluir?',
|
|
1701
1726
|
'new.q.preset.starter': '⚡ Starter — analytics + errores + onboarding',
|
|
1702
1727
|
'new.q.preset.saas': '💰 SaaS — suscripciones + analytics + onboarding + feedback',
|
|
1703
|
-
'new.q.preset.content': '📱 Contenido — analytics + onboarding +
|
|
1728
|
+
'new.q.preset.content': '📱 Contenido — crash reports + analytics + onboarding + AI chat',
|
|
1704
1729
|
'new.q.preset.full': '🚀 Completo — todas las features',
|
|
1705
1730
|
'new.q.preset.custom': '⚙️ Personalizar — elige feature a feature',
|
|
1706
1731
|
'new.q.preset.none': '○ Ninguno — solo el core',
|
|
@@ -1861,18 +1886,17 @@ const MESSAGES = {
|
|
|
1861
1886
|
'new.modules.header.feedback': '── Feedback (Firebase + Supabase) ──',
|
|
1862
1887
|
'new.modules.header.ci': '── CI/CD ──',
|
|
1863
1888
|
'new.modules.header.monetization': '── Monetizacion ──',
|
|
1864
|
-
'new.firebase.module.revenuecat': '💰
|
|
1865
|
-
'new.firebase.module.sentry': '🚨
|
|
1889
|
+
'new.firebase.module.revenuecat': '💰 RevenueCat (activa Subscriptions)',
|
|
1890
|
+
'new.firebase.module.sentry': '🚨 Crash Reports (Sentry)',
|
|
1866
1891
|
'new.firebase.module.analytics': '📊 Analytics (Mixpanel)',
|
|
1867
|
-
'new.firebase.module.facebook': '👤
|
|
1868
|
-
'new.firebase.module.web': '🌐 Web (
|
|
1869
|
-
'new.firebase.module.widget': '📱 Widget
|
|
1870
|
-
'new.firebase.module.
|
|
1871
|
-
'new.firebase.module.
|
|
1872
|
-
'new.firebase.module.
|
|
1873
|
-
'new.firebase.module.
|
|
1874
|
-
'new.firebase.module.
|
|
1875
|
-
'new.firebase.module.onboarding': '👋 Onboarding (pantallas de bienvenida, preguntas de perfil)',
|
|
1892
|
+
'new.firebase.module.facebook': '👤 Facebook (Login + Ads)',
|
|
1893
|
+
'new.firebase.module.web': '🌐 Web Support (PWA, solo Firebase)',
|
|
1894
|
+
'new.firebase.module.widget': '📱 Home Widget (iOS/Android)',
|
|
1895
|
+
'new.firebase.module.llm_chat': '🤖 AI Chat (OpenAI/Gemini)',
|
|
1896
|
+
'new.firebase.module.local_notifications': '🔔 Local Reminders (sin servidor)',
|
|
1897
|
+
'new.firebase.module.feedback': '💬 Feature Requests (requiere Firebase o Supabase)',
|
|
1898
|
+
'new.firebase.module.ci': '⚙️ CI/CD (GitHub + Codemagic)',
|
|
1899
|
+
'new.firebase.module.onboarding': '👋 Onboarding (flujo de bienvenida)',
|
|
1876
1900
|
|
|
1877
1901
|
'new.firebase.q.secrets.configureNow': '¿Configurar los secrets del servidor ahora? (webhook RevenueCat, Meta Ads)',
|
|
1878
1902
|
'new.firebase.q.secrets.configureNow.hint': 'Si no ahora, vea el README para los comandos de configuración después',
|
|
@@ -2083,7 +2107,7 @@ const MESSAGES = {
|
|
|
2083
2107
|
'notifications.summary.demo': 'Home → Features (demo):',
|
|
2084
2108
|
'notifications.summary.reminder': 'Ajustes → Recordatorios (programado):',
|
|
2085
2109
|
|
|
2086
|
-
'add.list.title': 'Features
|
|
2110
|
+
'add.list.title': 'Features del proyecto',
|
|
2087
2111
|
'add.error.noModule': 'Indica el nombre de la feature o usa --list para ver las disponibles.',
|
|
2088
2112
|
'add.error.notKasyProject': 'kit_setup.json no encontrado. Ejecuta este comando dentro de un proyecto Kasy.',
|
|
2089
2113
|
'add.error.unknownModule': 'Feature desconocida: {module}\nDisponibles: {list}',
|
|
@@ -2142,7 +2166,7 @@ const MESSAGES = {
|
|
|
2142
2166
|
'remove.warn.ci': 'Archivos de CI eliminados. Si tenias workflows personalizados, restauralos desde git.',
|
|
2143
2167
|
'remove.warn.sentry.shared': 'sentry_flutter conservado — todavia requerido por features activas (revenuecat/facebook).',
|
|
2144
2168
|
'cli.command.update.description': '⬆️ Actualiza features/componentes en un proyecto existente',
|
|
2145
|
-
'cli.command.update.targetArg': 'Objetivo a actualizar (ej.:
|
|
2169
|
+
'cli.command.update.targetArg': 'Objetivo a actualizar (ej.: revenuecat, sentry, components)',
|
|
2146
2170
|
'update.error.noProject': 'kit_setup.json no encontrado. Ejecuta dentro de un proyecto Kasy.',
|
|
2147
2171
|
'update.error.unknownModule': 'Modulo desconocido: {module}\nDisponibles: {list}',
|
|
2148
2172
|
'update.error.unknownTarget': 'Objetivo de actualizacion desconocido: {module}\nDisponibles: {list}',
|