kasy-cli 1.4.1 → 1.4.2

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.
@@ -191,23 +191,11 @@ async function promptOrganizationIfNeeded(tr, onCancel) {
191
191
 
192
192
  function printBanner(tr) {
193
193
  const bar = kleur.gray('─────────────────────────────────────────────────');
194
- const logo = [
195
- ' ██╗ ██╗ █████╗ ███████╗██╗ ██╗',
196
- ' ██║ ██╔╝██╔══██╗██╔════╝╚██╗ ██╔╝',
197
- ' █████╔╝ ███████║███████╗ ╚████╔╝ ',
198
- ' ██╔═██╗ ██╔══██║╚════██║ ╚██╔╝ ',
199
- ' ██║ ██╗██║ ██║███████║ ██║ ',
200
- ' ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ╚═╝ ',
201
- ]
202
- .map((line) => gradient(['#a78bfa', '#60a5fa'])(line))
203
- .join('\n');
204
- const title = kleur.bold().white(` ${tr('new.banner')}`);
205
- console.log(`\n${bar}`);
206
- console.log(logo);
207
- console.log('');
208
- console.log(title);
209
- console.log(kleur.dim(` ${tr('new.subtitle2')}`));
210
- console.log(`${bar}\n`);
194
+ const brand = gradient(['#a78bfa', '#60a5fa'])('kasy');
195
+ console.log(`\n${bar}\n`);
196
+ console.log(` ⚡ ${kleur.bold(brand)}`);
197
+ console.log(` ${kleur.dim(tr('new.subtitle2'))}`);
198
+ console.log(`\n${bar}\n`);
211
199
  }
212
200
 
213
201
  function printPrerequisites(tr, backend, firebaseSetupMode = 'existing', checkResults = []) {
@@ -355,33 +355,46 @@ async function runUpdate(module, options = {}) {
355
355
  const fromLabel = projectVersion || '?';
356
356
  console.log(`\n${t('update.status', { from: fromLabel, to: currentVersion })}\n`);
357
357
 
358
- if (!projectVersion) {
359
- console.log(kleur.dim(` ${t('update.noVersion')}\n`));
360
- }
361
-
362
- // Changelog per module
363
- if (Object.keys(changes).length > 0) {
358
+ // Modules/components with actual changelog entries — show what improved + the command
359
+ const modulesWithChanges = Object.keys(changes);
360
+ if (modulesWithChanges.length > 0) {
364
361
  console.log(kleur.bold(t('update.changesTitle')));
365
- for (const [mod, entries] of Object.entries(changes)) {
366
- console.log(kleur.cyan(` ${mod}`));
367
- for (const { version, description } of entries) {
368
- console.log(kleur.dim(` v${version}: ${description}`));
362
+ for (const mod of modulesWithChanges) {
363
+ for (const { description } of changes[mod]) {
364
+ console.log(` ${kleur.cyan('✦')} ${kleur.bold(mod)} ${kleur.dim('→')} ${kleur.cyan(`kasy update ${mod}`)}`);
365
+ console.log(` ${kleur.dim(description)}`);
369
366
  }
370
367
  }
371
368
  console.log('');
372
369
  }
373
370
 
374
- // Instructions
375
- if (patchableModules.length > 0) {
376
- console.log(t('update.howToUpdate'));
377
- for (const m of patchableModules) {
378
- console.log(kleur.cyan(` kasy update ${m}`));
371
+ // Modules without changelog entries that can still be re-applied (advanced / recovery)
372
+ const modulesWithoutChanges = patchableModules.filter((m) => !modulesWithChanges.includes(m));
373
+ const hasComponentChanges = modulesWithChanges.includes(COMPONENTS_UPDATE_TARGET);
374
+
375
+ if (modulesWithChanges.length === 0 && !hasComponentChanges) {
376
+ // Nothing new — show everything available
377
+ if (patchableModules.length > 0) {
378
+ console.log(t('update.howToUpdate'));
379
+ for (const m of patchableModules) {
380
+ console.log(kleur.cyan(` kasy update ${m}`));
381
+ }
382
+ console.log('');
383
+ }
384
+ console.log(t('update.howToUpdateComponents'));
385
+ console.log(kleur.cyan(` kasy update ${COMPONENTS_UPDATE_TARGET}`));
386
+ console.log('');
387
+ } else if (modulesWithoutChanges.length > 0) {
388
+ // Some modules have no new changes — show as secondary info
389
+ console.log(kleur.dim(t('update.reapplyTitle')));
390
+ for (const m of modulesWithoutChanges) {
391
+ console.log(kleur.dim(` kasy update ${m}`));
392
+ }
393
+ if (!hasComponentChanges) {
394
+ console.log(kleur.dim(` kasy update ${COMPONENTS_UPDATE_TARGET}`));
379
395
  }
380
396
  console.log('');
381
397
  }
382
- console.log(t('update.howToUpdateComponents'));
383
- console.log(kleur.cyan(` kasy update ${COMPONENTS_UPDATE_TARGET}`));
384
- console.log('');
385
398
  }
386
399
 
387
400
  module.exports = { runUpdate };
package/lib/utils/i18n.js CHANGED
@@ -690,7 +690,8 @@ const MESSAGES = {
690
690
  'update.alreadyUpToDate': 'Project is already up to date (v{version}).',
691
691
  'update.status': 'Project: v{from} → CLI: v{to}',
692
692
  'update.noVersion': 'Project was generated without version tracking. All features can be updated.',
693
- 'update.changesTitle': 'Changes available for your features:',
693
+ 'update.changesTitle': 'Updates available:',
694
+ 'update.reapplyTitle': 'No new changes — can re-apply if needed:',
694
695
  'update.howToUpdate': 'To update a feature:',
695
696
  'update.howToUpdateComponents': 'To update base components:',
696
697
  'update.warn.commit': 'This will overwrite files from feature "{module}". Make sure you have committed your changes first.',
@@ -1400,7 +1401,8 @@ const MESSAGES = {
1400
1401
  'update.alreadyUpToDate': 'Projeto ja esta atualizado (v{version}).',
1401
1402
  'update.status': 'Projeto: v{from} → CLI: v{to}',
1402
1403
  'update.noVersion': 'Projeto foi gerado sem rastreamento de versao. Todas as features podem ser atualizadas.',
1403
- 'update.changesTitle': 'Mudancas disponiveis para suas features:',
1404
+ 'update.changesTitle': 'Atualizacoes disponiveis:',
1405
+ 'update.reapplyTitle': 'Sem mudancas novas — pode reaplicar se precisar:',
1404
1406
  'update.howToUpdate': 'Para atualizar uma feature:',
1405
1407
  'update.howToUpdateComponents': 'Para atualizar componentes base:',
1406
1408
  'update.warn.commit': 'Isso vai sobrescrever os arquivos da feature "{module}". Faca commit de tudo antes de continuar.',
@@ -2110,7 +2112,8 @@ const MESSAGES = {
2110
2112
  'update.alreadyUpToDate': 'El proyecto ya esta actualizado (v{version}).',
2111
2113
  'update.status': 'Proyecto: v{from} → CLI: v{to}',
2112
2114
  'update.noVersion': 'El proyecto fue generado sin seguimiento de version. Todas las features pueden actualizarse.',
2113
- 'update.changesTitle': 'Cambios disponibles para tus features:',
2115
+ 'update.changesTitle': 'Actualizaciones disponibles:',
2116
+ 'update.reapplyTitle': 'Sin cambios nuevos — puedes reaplicar si es necesario:',
2114
2117
  'update.howToUpdate': 'Para actualizar una feature:',
2115
2118
  'update.howToUpdateComponents': 'Para actualizar componentes base:',
2116
2119
  'update.warn.commit': 'Esto sobreescribira los archivos de la feature "{module}". Asegurate de haber hecho commit antes.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kasy-cli",
3
- "version": "1.4.1",
3
+ "version": "1.4.2",
4
4
  "description": "CLI for scaffolding production-ready Flutter SaaS apps with Firebase, Supabase, or API REST backends.",
5
5
  "bin": {
6
6
  "kasy": "./bin/kasy.js"