wlmaker 1.9.1 → 1.9.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.
Files changed (2) hide show
  1. package/README.md +2 -832
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,833 +1,3 @@
1
- # Guía de Uso de wlmaker
1
+ # wlmaker
2
2
 
3
- > **Para nuevos desarrolladores.** Aprendé a usar `wlmaker` para generar código Flutter/Dart
4
- > en monorepos Melos con Clean Architecture, BLoC, Freezed y Widgetbook.
5
-
6
- ---
7
-
8
- ## 1. ¿Qué es wlmaker?
9
-
10
- **wlmaker** (alias: `wl`) es una CLI que **scaffoldea código Flutter/Dart** desde la terminal.
11
- Está pensada para equipos que trabajan con:
12
-
13
- - **Monorepos Melos** — múltiples paquetes y apps en un solo repo
14
- - **Clean Architecture** — separación en capas `data`, `domain`, `presentation`
15
- - **BLoC + Freezed** — manejo de estado con sealed classes
16
- - **Atomic Design** — sistema de diseño con átomos, moléculas, organismos y templates
17
- - **Widgetbook** — catálogo de componentes visuales
18
- - **BFF (Backend For Frontend)** — integración con Retrofit + DI automática
19
-
20
- En lugar de crear archivos a mano, wlmaker te hace las preguntas justas y genera todo el
21
- scaffold con barrels, imports y registros de dependencias actualizados automáticamente.
22
-
23
- ---
24
-
25
- ## 2. Instalación y Primeros Pasos
26
-
27
- ### Requisitos previos
28
-
29
- | Requisito | Versión mínima |
30
- |-----------|---------------|
31
- | Node.js | 18+ |
32
- | pnpm | Última estable |
33
- | Flutter SDK | 3.x |
34
- | Un monorepo Melos | root `pubspec.yaml` con `workspace:` / `melos:` (Melos 8) o legacy `melos.yaml` |
35
-
36
- ### Instalación
37
-
38
- ```bash
39
- pnpm add -g wlmaker
40
- ```
41
-
42
- Verificá que funcione:
43
-
44
- ```bash
45
- wlmaker --version # → 1.7.0
46
- wl --version # alias más corto
47
- ```
48
-
49
- ### Primer comando
50
-
51
- Ejecutá `wlmaker` sin argumentos dentro de tu monorepo:
52
-
53
- ```bash
54
- cd tu-monorepo/
55
- wlmaker
56
- ```
57
-
58
- Te va a recibir un menú interactivo con todas las opciones disponibles:
59
-
60
- ```
61
- ┌ wlmaker ┐
62
- │ │
63
- ◇ What do you want to do?
64
- │ ● Vault NEW — sync encrypted STG/PROD…
65
- │ ○ App
66
- │ ○ BLoC
67
- │ ○ Widget
68
- │ ○ Widgetbook Use-Case
69
- │ ○ Page
70
- │ ○ Endpoint
71
- │ ○ Package
72
- │ ○ Env Var
73
- │ ○ Collaborative
74
- │ ○ Docs
75
- └ ┘
76
- ```
77
-
78
- ---
79
-
80
- ## 3. Modos de Uso
81
-
82
- wlmaker tiene **dos modos** de uso:
83
-
84
- ### Modo interactivo
85
-
86
- Ejecutás `wlmaker` sin argumentos (o `wlmaker <comando>` sin los argumentos requeridos) y
87
- la CLI te guía paso a paso con preguntas, validación y selección de opciones.
88
-
89
- **Ideal para:** cuando estás explorando, no recordás las opciones exactas, o preferís
90
- que te lleve de la mano.
91
-
92
- ### Modo directo
93
-
94
- Pasás todos los argumentos en una sola línea. Útil para scripts, automatización, o cuando
95
- ya sabés exactamente qué querés.
96
-
97
- ```bash
98
- wlmaker bloc user_login --no-build-runner
99
- wlmaker widget toggle -t atom
100
- wlmaker docs architecture
101
- ```
102
-
103
- **Ideal para:** CI/CD, scripts del Makefile, power users.
104
-
105
- ---
106
-
107
- ## 4. Guías Paso a Paso (Recetas)
108
-
109
- Cada receta explica **cuándo usarla**, cómo ejecutarla en **modo directo** e **interactivo**,
110
- y la estructura de archivos que vas a obtener.
111
-
112
- ---
113
-
114
- ### 4.1 Crear un BLoC
115
-
116
- **Cuándo usarlo:** cuando necesitás manejar el estado de una pantalla o feature con
117
- BLoC + Freezed (sealed classes).
118
-
119
- #### Modo directo
120
-
121
- ```bash
122
- wlmaker bloc user_login
123
- ```
124
-
125
- Opciones disponibles:
126
-
127
- | Opción | Descripción |
128
- |--------|-------------|
129
- | `-d, --dir <path>` | Directorio donde crear el BLoC (default: cwd) |
130
- | `--no-build-runner` | No ejecutar `build_runner` después de generar |
131
-
132
- #### Modo interactivo
133
-
134
- ```bash
135
- wlmaker bloc
136
- # → Seleccioná el proyecto
137
- # → Ingresá el nombre en snake_case
138
- # → Confirmá si querés correr build_runner
139
- ```
140
-
141
- #### Resultado
142
-
143
- ```
144
- lib/features/<feature>/
145
- ├── bloc.dart # ← actualizado: agrega export
146
- └── user_login/
147
- ├── user_login_bloc.dart # Bloc + Event + State (partes)
148
- ├── user_login_event.dart # Evento sealed con Freezed
149
- └── user_login_state.dart # Estado sealed con Freezed
150
- ```
151
-
152
- **Ejemplo:** `wlmaker bloc cart_checkout` genera `CartCheckoutBloc`, `CartCheckoutEvent`,
153
- y `CartCheckoutState`.
154
-
155
- ---
156
-
157
- ### 4.2 Crear un Widget del Design System
158
-
159
- **Cuándo usarlo:** cuando necesitás crear un componente visual siguiendo Atomic Design
160
- (átomo, molécula, organismo, template).
161
-
162
- #### Tiers disponibles
163
-
164
- | Tier | Carpeta | Ejemplos |
165
- |------|---------|---------|
166
- | `atom` | `atoms/` | botón, input, ícono, texto |
167
- | `molecule` | `molecules/` | search bar, card header |
168
- | `organism` | `organisms/` | product card, checkout form |
169
- | `template` | `templates/` | page layout, scaffold |
170
-
171
- #### Modo directo
172
-
173
- ```bash
174
- wlmaker widget toggle -t atom
175
- wlmaker widget search_bar -t molecule -p subdirectory-parts
176
- wlmaker widget product_card -t organism -p subdirectory-show
177
- ```
178
-
179
- #### Modo desde JSON
180
-
181
- También podés generar un widget completo desde un archivo JSON con el árbol de componentes:
182
-
183
- ```bash
184
- # Desde archivo
185
- wlmaker widget --file docs/examples/molecule-product-card.json
186
-
187
- # Desde JSON inline
188
- wlmaker widget --json '{"componentName":"WlCard","tier":"molecule","mode":"component",...}'
189
- ```
190
-
191
- El JSON define propiedades, variantes, tokens, y el árbol completo de widgets (Container, Text, Icon, ComponentRef). Ver [`docs/JSON_SCHEMA.md`](docs/JSON_SCHEMA.md) para la documentación completa del formato.
192
-
193
- **Modos disponibles:**
194
- - `"mode": "component"` — genera el widget completo
195
- - `"mode": "skeleton"` — genera solo el skeleton y lo vincula al componente existente (inyecta `part`, `isLoading`, y `if (isLoading) return WlXxxSkeleton()`)
196
-
197
- **Widgetbook automático:** al generar un componente desde JSON, también se crea el use-case de Widgetbook con knobs interactivos para cada propiedad.
198
-
199
- **Ejemplos:** ver `docs/examples/` con JSONs de prueba para atom, molecule, organism, template y skeleton.
200
-
201
- #### Patrones por tier
202
-
203
- | Tier | Patrones disponibles |
204
- |------|---------------------|
205
- | `atom` | `single-public` (default), `single-factory` |
206
- | `molecule` | `single` (default), `subdirectory-parts`, `subdirectory-widgets` |
207
- | `organism` | `subdirectory-show` (default), `single` |
208
- | `template` | `simple` (default) |
209
-
210
- #### Modo interactivo
211
-
212
- ```bash
213
- wlmaker widget
214
- # → Ingresá el nombre
215
- # → Seleccioná el tier
216
- # → Elegí el patrón
217
- ```
218
-
219
- #### Resultado
220
-
221
- Se genera el widget en `packages/design_system/lib/wl_design_system/<tier>/<widget>/`
222
- y **automáticamente** se crea su use-case de Widgetbook.
223
-
224
- ---
225
-
226
- ### 4.3 Crear un Use-Case de Widgetbook
227
-
228
- **Cuándo usarlo:** cuando ya tenés un widget y querés agregarle un showcase en Widgetbook
229
- para que diseño/testers puedan verlo en aislamiento.
230
-
231
- #### Modo directo
232
-
233
- ```bash
234
- wlmaker usecase toggle -t atom
235
- ```
236
-
237
- #### Opciones
238
-
239
- | Opción | Descripción |
240
- |--------|-------------|
241
- | `-t, --tier` | Tier del widget (requerido) |
242
- | `-d, --dir` | Raíz del proyecto (default: cwd) |
243
- | `--no-build-runner` | No ejecutar build_runner |
244
-
245
- #### Resultado
246
-
247
- Se genera el use-case en `apps/widgetbook/lib/usecases/<tier>/` y se actualiza el barrel
248
- de Widgetbook automáticamente.
249
-
250
- ---
251
-
252
- ### 4.4 Crear una Página (GoRoute + View)
253
-
254
- **Cuándo usarlo:** cuando necesitás crear una pantalla nueva con navegación tipo GoRouter.
255
-
256
- #### Modo directo
257
-
258
- ```bash
259
- wlmaker page profile -p /ruta/a/pages/
260
- ```
261
-
262
- #### Opciones
263
-
264
- | Opción | Descripción |
265
- |--------|-------------|
266
- | `-p, --path` | Ruta absoluta al directorio `pages/` del feature |
267
-
268
- #### Modo interactivo
269
-
270
- ```bash
271
- wlmaker page
272
- # → Ingresá el nombre (o dejalo vacío para elegir del menú)
273
- # → Seleccioná o ingresá la ruta al directorio pages/
274
- ```
275
-
276
- #### Resultado
277
-
278
- ```
279
- lib/features/<feature>/presentation/pages/
280
- ├── pages.dart # ← actualizado: agrega export
281
- └── profile/
282
- ├── profile_page.dart # GoRoute + page builder
283
- └── profile_view.dart # Widget de la vista
284
- ```
285
-
286
- ---
287
-
288
- ### 4.5 Crear un Endpoint BFF
289
-
290
- **Cuándo usarlo:** cuando necesitás integrar un nuevo endpoint del Backend For Frontend
291
- con toda la stack de Clean Architecture.
292
-
293
- #### Modo interactivo (único disponible)
294
-
295
- ```bash
296
- wlmaker endpoint
297
- ```
298
-
299
- El flujo te va a preguntar:
300
-
301
- 1. **Proyecto** — detecta automáticamente el paquete de feature
302
- 2. **Método HTTP** — `GET`, `POST`, `PUT`, `DELETE`, `PATCH`
303
- 3. **Path del endpoint** — ej. `/api/v1/users/{userId}`
304
- 4. **Nombre del caso de uso** — en snake_case, ej. `get_user_profile`
305
- 5. **Archivo BFF API** — lo detecta automáticamente por dominio
306
- 6. **Target de DI** — `app_base`, `app_base_loyalty`, o `none`
307
- 7. **@lazySingleton** — si las dependencias se registran como lazy
308
-
309
- #### Resultado
310
-
311
- ```
312
- lib/
313
- ├── data/
314
- │ ├── datasources/
315
- │ │ └── <domain>_rest_datasource.dart # ← método inyectado
316
- │ ├── models/
317
- │ │ └── <feature>/
318
- │ │ ├── <feature>.dart # ← barrel actualizado
319
- │ │ ├── get_user_profile_model.dart
320
- │ │ └── get_user_profile_request_model.dart # (si es POST/PUT/PATCH)
321
- │ └── repositories/
322
- │ └── <domain>_repository_data.dart # ← implementación inyectada
323
- ├── domain/
324
- │ ├── entities/
325
- │ │ └── <feature>/
326
- │ │ ├── <feature>.dart # ← barrel actualizado
327
- │ │ └── get_user_profile_entity.dart
328
- │ ├── repositories/
329
- │ │ └── <domain>_repository.dart # ← interfaz inyectada
330
- │ └── usecases/
331
- │ └── <feature>/
332
- │ ├── <feature>.dart # ← barrel actualizado
333
- │ └── get_user_profile_usecase.dart
334
- ```
335
-
336
- Además, si elegiste un target de DI, se registran los módulos automáticamente:
337
- - `DataSourceModule` ← datasource
338
- - `RepositoriesModule` ← repository impl
339
- - `UseCasesModule` ← use case
340
-
341
- ---
342
-
343
- ### 4.6 Crear un Paquete
344
-
345
- **Cuándo usarlo:** cuando necesitás crear un paquete nuevo dentro del monorepo Melos.
346
-
347
- #### Modo interactivo
348
-
349
- ```bash
350
- wlmaker package
351
- ```
352
-
353
- #### Resultado
354
-
355
- ```
356
- packages/<nombre>/
357
- ├── lib/
358
- │ ├── <nombre>.dart # barrel principal
359
- │ └── src/
360
- │ └── <nombre>.dart # implementación base
361
- ├── test/
362
- ├── pubspec.yaml # configurado con referencias del workspace
363
- ├── analysis_options.yaml
364
- ├── Makefile
365
- └── .gitignore
366
- ```
367
-
368
- Además se actualizan:
369
- - `.vscode/<monorepo>.code-workspace` — agrega la referencia al paquete
370
- - `.helix/config` — si existe
371
-
372
- ---
373
-
374
- ### 4.7 Agregar Variable de Entorno
375
-
376
- **Cuándo usarlo:** cuando necesitás agregar una variable de entorno (API key, URL, flag)
377
- a través de toda la stack del monorepo.
378
-
379
- #### Modo interactivo
380
-
381
- ```bash
382
- wlmaker env-var
383
- ```
384
-
385
- #### Resultado
386
-
387
- La variable se inyecta en **6 capas**:
388
-
389
- 1. Archivos JSON de entorno por app (dev, qa, prod)
390
- 2. `AppEnvironment` — getter abstracto
391
- 3. `AppBuildEnvironment` — implementación concreta
392
- 4. `VendorsModule` — defaults de RemoteConfig
393
- 5. `AppConfig` — entidad
394
- 6. `AppConfigModel` — modelo
395
-
396
- ---
397
-
398
- ### 4.8 Crear una App
399
-
400
- **Cuándo usarlo:** cuando necesitás crear una nueva aplicación Flutter en el monorepo
401
- (ej. app de Colombia, app de Chile, etc.).
402
-
403
- #### Modo interactivo
404
-
405
- ```bash
406
- wlmaker app
407
- ```
408
-
409
- El flujo te permite:
410
- - Crear un **App Type** (tipo de mercado con locale, países soportados: CO, AR, CL, PE, EC, UY, BR, US)
411
- - Crear una **App** completa con:
412
- - `pubspec.yaml` configurado
413
- - `flavorizr` (flavors: dev, qa, prod)
414
- - Assets (PNGs, Lottie JSONs)
415
- - Tema del design system
416
- - Configs de Android (Kotlin + Gradle)
417
- - Entitlements de iOS
418
- - Registro en Widgetbook
419
- - GitHub Actions workflows
420
-
421
- ---
422
-
423
- ### 4.9 Crear un Feature Colaborativo
424
-
425
- **Cuándo usarlo:** cuando necesitás crear una feature completa que sigue el patrón
426
- colaborativo del equipo (estructura predefinida con Clean Architecture, DI, barrels).
427
-
428
- #### Modo directo
429
-
430
- ```bash
431
- wlmaker collaborative feature feature_orders
432
- ```
433
-
434
- #### Modo interactivo
435
-
436
- ```bash
437
- wlmaker collaborative
438
- # → Elegí "feature"
439
- # → Ingresá el nombre en snake_case
440
- ```
441
-
442
- #### Resultado
443
-
444
- ```
445
- packages/collaborative/<feature>/
446
- ├── lib/
447
- │ ├── data/
448
- │ │ ├── api/bff/
449
- │ │ ├── datasources/
450
- │ │ ├── models/
451
- │ │ └── repositories/
452
- │ ├── domain/
453
- │ │ ├── entities/
454
- │ │ ├── repositories/
455
- │ │ └── usecases/
456
- │ ├── presentation/
457
- │ │ ├── bloc/
458
- │ │ └── pages/
459
- │ └── di/ # Módulos de inyección
460
- ├── pubspec.yaml
461
- └── .gitignore
462
- ```
463
-
464
- ---
465
-
466
- ### 4.10 Agregar Página a Feature Colaborativo
467
-
468
- ```bash
469
- wlmaker collaborative page order_detail -f packages/collaborative/feature_orders
470
- ```
471
-
472
- Agrega `order_detail_page.dart` + `order_detail_view.dart` y actualiza barrels.
473
-
474
- ---
475
-
476
- ### 4.11 Agregar BLoC a Feature Colaborativo
477
-
478
- ```bash
479
- wlmaker collaborative bloc order_form -f packages/collaborative/feature_orders
480
- ```
481
-
482
- Agrega `order_form_bloc.dart`, `order_form_event.dart`, `order_form_state.dart` y
483
- actualiza el barrel del feature.
484
-
485
- ---
486
-
487
- ### 4.12 Agregar Endpoint a Feature Colaborativo
488
-
489
- ```bash
490
- wlmaker collaborative endpoint
491
- # → Flujo interactivo guiado, similar a 4.5 pero dentro del feature colaborativo
492
- ```
493
-
494
- ---
495
-
496
- ### 4.13 Scaffold de Personal Information (por país)
497
-
498
- **Cuándo usarlo:** cuando necesitás crear el formulario de datos personales para un nuevo
499
- mercado (país). Cada mercado puede tener distintos campos, validaciones, y modos de documento.
500
-
501
- #### Modo interactivo (único disponible)
502
-
503
- ```bash
504
- wlmaker
505
- # → Elegí "Personal Information"
506
- ```
507
-
508
- El flujo te pregunta:
509
-
510
- | Paso | Qué define |
511
- |------|-----------|
512
- | AppType | Tipo de app/mercado (CO, AR, BR, etc.) |
513
- | Market code | Código de 2 letras para la carpeta (ej. `co`, `ar`) |
514
- | Market name | Nombre en PascalCase (ej. `Colombia`) |
515
- | Campos | name, surname, email, document, gender, birthDate, issueDate, phone, loyaltyId |
516
- | Modo documento | `selector` (tipo + número) o `custom` (input dedicado) |
517
- | Formato fecha | `dd/MM/yyyy`, `MM/dd`, `MM/dd/yyyy`, `yyyy-MM-dd` |
518
- | Phone preset | `default-full`, `brazil-full`, `local-only`, `custom` |
519
- | Editabilidad | Campos editables después de guardar, bloqueados, siempre editables |
520
- | Opciones booleanas | Skip email, account deletion, block fields, document card, info alert, info text, delete buttons por plataforma |
521
-
522
- #### Resultado
523
-
524
- ```
525
- packages/personal_information/lib/countries/<code>/
526
- ├── pi_config_<pais>.dart # Configuración específica del mercado
527
- ├── pi_field_validation_<pais>.dart
528
- ├── personal_information_form_<pais>.dart
529
- ├── personal_information_body_<pais>.dart
530
- ├── inputs/ # Widgets de input específicos
531
- ├── widgets/ # Widgets compuestos
532
- └── barrels actualizados
533
- ```
534
-
535
- ---
536
-
537
- ### 4.14 Vault — Compartir Variables de Entorno Cifradas
538
-
539
- > **Guía para el día a día:** [`docs/VAULT.md`](docs/VAULT.md) — onboarding, cuándo hacer apply/capture y FAQ (español neutro).
540
-
541
- **Cuándo usarlo:** cuando necesitás distribuir valores reales de `development.env.json`
542
- (STG) y `production.env.json` (PROD) entre el equipo sin mandarlos por Slack ni 1Password,
543
- y sin perder el rastro de quién tiene acceso. Vault guarda cada valor cifrado dentro del
544
- repo (`.wlmaker.vault.json`) y solo lo materializa en texto plano en tu máquina cuando vos
545
- lo pedís explícitamente con Apply.
546
-
547
- Vault **complementa** a `wlmaker env-var` (4.7), no lo reemplaza: primero declarás la
548
- variable con `env-var` (eso la agrega a `example.env.json`, la plantilla committeada), y
549
- recién después la capturás en el Vault con el valor real. `example.env.json` sigue siendo
550
- el allowlist — Capture rechaza cualquier clave que no esté ahí, porque los nombres viajan
551
- en texto plano dentro del ciphertext y en v1 todo el equipo aprobado puede descifrar STG y
552
- PROD.
553
-
554
- #### Identidad local (una sola vez por persona)
555
-
556
- Cada persona tiene un par de llaves X25519 en `~/.wlmaker/identity`, cifrado en disco con
557
- una passphrase que vos elegís (scrypt + AES-256-GCM). Nadie más puede usar tu identidad sin
558
- esa passphrase, y no existe una "llave maestra": perder el archivo *y* la passphrase te deja
559
- sin acceso hasta que alguien te vuelva a aprobar.
560
-
561
- #### Modo interactivo
562
-
563
- ```bash
564
- wlmaker
565
- # → Vault (primera opción del menú)
566
- # o: wlmaker vault
567
- ```
568
-
569
- El submenú de Vault ofrece:
570
-
571
- | Acción | Qué hace |
572
- |--------|----------|
573
- | Status | Apps capturadas, cantidad de recipients/pendientes, tu estado de acceso |
574
- | Init | Crea el vault (una sola vez por monorepo) con vos como primer recipient |
575
- | Capture | Sella los valores locales de un app en el vault (respeta el allowlist de `example.env.json`) |
576
- | Apply | Descifra y escribe los valores del vault en `development.env.json` / `production.env.json` locales |
577
- | Diff | Compara tus archivos locales contra el vault sin mostrar valores descifrados |
578
- | Request Access | Pide unirte al keyring compartido (no necesita tener acceso previo) |
579
- | Approve | Aprueba una solicitud pendiente y le da acceso a STG + PROD juntos |
580
- | Who | Lista recipients y solicitudes pendientes (sin exponer llaves) |
581
- | Identity | Muestra tu fingerprint y clave pública (para compartir al pedir acceso) |
582
- | Revoke | Saca a un recipient y rota la data key compartida, invalidando su copia anterior |
583
-
584
- #### Modo directo
585
-
586
- ```bash
587
- wlmaker vault status
588
- wlmaker vault init
589
- wlmaker vault capture --app co_jumbo
590
- wlmaker vault apply --app co_jumbo --env production
591
- wlmaker vault diff --app co_jumbo
592
- wlmaker vault who
593
- wlmaker vault identity
594
- wlmaker vault revoke
595
- ```
596
-
597
- | Opción | Aplica a | Descripción |
598
- |--------|----------|-------------|
599
- | `--app <name>` | `capture`, `apply`, `diff` | App a targetear (si se omite, te lo pregunta) |
600
- | `--env <development\|production>` | `capture`, `apply`, `diff` | Limita a un solo entorno (default: ambos) |
601
- | `--force` | `capture` | Sella claves no declaradas en `example.env.json` sin la confirmación tipeada |
602
-
603
- Si corrés `wlmaker vault` sin una acción, se abre el mismo submenú interactivo.
604
- (`wlmaker app vault` sigue funcionando como alias.)
605
-
606
- #### Qué se commitea y qué no
607
-
608
- | Archivo | Se commitea | Contenido |
609
- |---------|-------------|-----------|
610
- | `.wlmaker.vault.json` (raíz del monorepo) | **Sí** | Ciphertext AES-256-GCM por valor, nombres de variable en texto plano, recipients y su llave pública |
611
- | `apps/<app>/env/example.env.json` | **Sí** | Plantilla — nombres de variables permitidas, sin valores reales |
612
- | `apps/<app>/env/development.env.json` / `production.env.json` | **No** (gitignored) | Valores reales en texto plano, escritos solo por Apply |
613
- | `~/.wlmaker/identity` | **No** — vive fuera del repo | Tu llave privada X25519, cifrada con tu passphrase |
614
-
615
- Antes de escribir un archivo, Apply verifica que el `.gitignore` de `apps/<app>/env/` lo
616
- cubra (`*.json` + `!example.env.json`); si no puede probarlo, aborta sin escribir nada.
617
-
618
- ---
619
-
620
- ## 5. Herramientas de Documentación
621
-
622
- ### 5.1 Servir Documentación (Docusaurus)
623
-
624
- ```bash
625
- wlmaker docs serve
626
- ```
627
-
628
- Busca el directorio `book/` en el monorepo, instala dependencias npm si es necesario,
629
- y levanta el servidor de desarrollo de Docusaurus.
630
-
631
- ```bash
632
- wlmaker docs serve -d /ruta/al/monorepo
633
- ```
634
-
635
- ### 5.2 Listar Comandos del Proyecto
636
-
637
- ```bash
638
- wlmaker docs commands
639
- ```
640
-
641
- Escanea los `Makefile` (raíz y book) y los scripts Melos (`melos.yaml` legacy o `melos.scripts` en el `pubspec.yaml` raíz) para extraer todos los comandos
642
- disponibles y los muestra agrupados por fuente:
643
-
644
- ```
645
- Found 24 command(s)
646
-
647
- Makefile
648
- ├── gen → dart run build_runner build --delete-conflicting-outputs
649
- ├── format → dart format lib test
650
- ├── test → flutter test
651
- └── ...
652
-
653
- Melos
654
- ├── analyze → melos run analyze
655
- ├── gen:all → melos run gen:all
656
- └── ...
657
- ```
658
-
659
- ### 5.3 Ver Arquitectura del Monorepo
660
-
661
- ```bash
662
- wlmaker docs architecture
663
- ```
664
-
665
- Muestra un árbol del monorepo con apps, paquetes, sus dependencias clave, sistema de
666
- diseño y documentación:
667
-
668
- ```
669
- dc-wl-groceries-app (/Users/...)
670
-
671
- ├── apps/
672
- │ ├── app_co
673
- │ ├── app_ar
674
- │ └── widgetbook
675
-
676
- ├── packages/
677
- │ ├── app_base [flutter_bloc, retrofit, go_router]
678
- │ ├── core [freezed, json_serializable]
679
- │ ├── design_system [flutter_bloc, widgetbook]
680
- │ │ └── features/
681
- │ │ ├── home [flutter_bloc, freezed]
682
- │ │ ├── cart [flutter_bloc, freezed, injectable]
683
- │ │ └── ...
684
-
685
- ├── design_system (atoms, molecules, organisms, templates)
686
- ├── book/ (Docusaurus)
687
- └── pubspec.yaml (workspace: + melos: — Melos 8) / melos.yaml (legacy)
688
- ```
689
-
690
- ---
691
-
692
- ## 6. Consejos y Mejores Prácticas
693
-
694
- ### Dónde ejecutar cada comando
695
-
696
- | Comando | Dónde ejecutarlo |
697
- |---------|-----------------|
698
- | `bloc`, `widget`, `usecase`, `page` | En el paquete del feature (ej. `packages/features/cart/`) |
699
- | `endpoint` | En el paquete del feature |
700
- | `package`, `app`, `env-var` | Raíz del monorepo (donde está el `pubspec` con `workspace:` / `melos.yaml`) |
701
- | `collaborative` | Raíz del monorepo |
702
- | `personal-information` | Raíz del monorepo (necesita `packages/personal_information/`) |
703
- | `docs` | Raíz del monorepo |
704
-
705
- ### Barrels automáticos
706
-
707
- **No edites los barrels a mano.** wlmaker actualiza automáticamente:
708
- - `bloc.dart` en features
709
- - Barriles de tier del design system
710
- - `datasources.dart`, `entities.dart`, `models.dart`, `usecases.dart`
711
- - Barriles internos de cada dominio
712
-
713
- Si ves una exportación duplicada, wlmaker la detecta y la omite.
714
-
715
- ### Cuándo usar `--no-build-runner`
716
-
717
- Usá `--no-build-runner` cuando:
718
- - Estás generando varios BLoCs/widgets en lote y querés correr `build_runner` una sola vez al final
719
- - Ya sabés que build_runner va a fallar (ej. faltan dependencias)
720
- - Estás en CI y build_runner se ejecuta en otro paso
721
-
722
- ### Resolución automática de proyectos
723
-
724
- Cuando ejecutás un comando que necesita un proyecto Flutter, wlmaker busca en este orden:
725
-
726
- 1. **Directorio actual** — ¿tiene `pubspec.yaml` con `freezed` o `flutter_bloc`?
727
- 2. **Monorepo Melos** — ¿estamos dentro de un monorepo? Escanea `packages/` y `packages/features/`
728
- 3. **~/Development** — busca proyectos Flutter hasta 2 niveles de profundidad
729
-
730
- Si hay múltiples proyectos, te muestra un selector interactivo.
731
-
732
- ---
733
-
734
- ## 7. Preguntas Frecuentes
735
-
736
- ### "No encuentra mi proyecto"
737
-
738
- wlmaker busca `pubspec.yaml` que contenga `freezed` o `flutter_bloc` en sus dependencias.
739
-
740
- **Solución:** asegurate de que tu `pubspec.yaml` tenga al menos uno de estos paquetes.
741
-
742
- ### "Not inside a monorepo"
743
-
744
- Varios comandos (`package`, `app`, `collaborative`, `personal-information`, `docs`)
745
- requieren estar dentro de un monorepo Melos.
746
-
747
- **Solución:** ejecutalos desde la raíz del monorepo (donde el `pubspec.yaml` tiene
748
- `workspace:` / `melos:`, o existe un `melos.yaml` legacy) o desde cualquier
749
- subdirectorio — wlmaker busca hacia arriba.
750
-
751
- ### "El build_runner falla"
752
-
753
- Si `dart run build_runner build` falla después de generar un BLoC, puede ser por:
754
- - Dependencias faltantes en el `pubspec.yaml`
755
- - Código Dart con errores de sintaxis
756
- - Conflicto con archivos generados anteriores
757
-
758
- **Soluciones:**
759
- 1. Usá `--no-build-runner` y corré build_runner manualmente después
760
- 2. Ejecutá `dart run build_runner clean` antes de reintentar
761
- 3. Revisá que `build_runner`, `freezed`, y `json_serializable` estén en `dev_dependencies`
762
-
763
- ### "packages/personal_information not found"
764
-
765
- El comando de Personal Information necesita que exista el paquete `packages/personal_information`
766
- en tu monorepo.
767
-
768
- **Solución:** primero creá el paquete base con `wlmaker package` o asegurate de que el
769
- paquete exista en el monorepo.
770
-
771
- ### "No AppTypes found"
772
-
773
- El scaffold de Personal Information requiere al menos un AppType definido en
774
- `packages/localization/lib/enum/app_type.dart`.
775
-
776
- **Solución:** ejecutá `wlmaker app` primero y creá un App Type.
777
-
778
- ---
779
-
780
- ## 8. Referencia Rápida de Comandos
781
-
782
- ### Comandos principales
783
-
784
- | Comando | Argumento | Opciones principales | Descripción |
785
- |---------|-----------|---------------------|-------------|
786
- | `wlmaker` | — | — | Modo interactivo (menú) |
787
- | `wlmaker bloc` | `[name]` | `-d`, `--no-build-runner` | Crear BLoC con Freezed |
788
- | `wlmaker widget` | `<name>` | `-t` (tier), `-p` (pattern), `-j` (json), `-f` (file) | Crear widget del design system |
789
- | `wlmaker usecase` | `<name>` | `-t` (tier), `--no-build-runner` | Crear use-case de Widgetbook |
790
- | `wlmaker page` | `[name]` | `-p` (pages path) | Crear página GoRoute + View |
791
- | `wlmaker endpoint` | — | — | Stack completa de endpoint BFF |
792
- | `wlmaker package` | — | — | Crear paquete en el monorepo |
793
- | `wlmaker env-var` | — | — | Agregar variable de entorno |
794
- | `wlmaker vault` | `[status\|init\|capture\|apply\|diff\|request-access\|approve\|who\|identity\|revoke]` | `--app`, `--env`, `--force` | Vault: sincronizar env cifrados entre el equipo |
795
- | `wlmaker app` | — | — | Crear y gestionar apps |
796
-
797
- ### Comandos colaborativos
798
-
799
- | Comando | Argumento | Opciones | Descripción |
800
- |---------|-----------|----------|-------------|
801
- | `wlmaker collaborative` | — | — | Menú interactivo colaborativo |
802
- | `wlmaker collaborative feature` | `[name]` | — | Crear feature colaborativa completa |
803
- | `wlmaker collaborative page` | `[name]` | `-f` (feature path) | Agregar página a feature |
804
- | `wlmaker collaborative bloc` | `[name]` | `-f` (feature path) | Agregar BLoC a feature |
805
- | `wlmaker collaborative endpoint` | — | — | Agregar endpoint a feature |
806
-
807
- ### Comandos de documentación
808
-
809
- | Comando | Opciones | Descripción |
810
- |---------|----------|-------------|
811
- | `wlmaker docs serve` | `-d` (project root) | Servir Docusaurus |
812
- | `wlmaker docs commands` | `-d` (project root) | Listar Makefile + Melos scripts |
813
- | `wlmaker docs architecture` | `-d` (project root) | Mostrar árbol del monorepo |
814
-
815
- ### Flags comunes
816
-
817
- | Flag | Aplica a | Descripción |
818
- |------|----------|-------------|
819
- | `-d, --dir <path>` | `bloc`, `widget`, `usecase` | Directorio del proyecto |
820
- | `--no-build-runner` | `bloc`, `usecase` | No ejecutar build_runner |
821
- | `-t, --tier <tier>` | `widget`, `usecase` | Tier: atom, molecule, organism, template |
822
- | `-p, --pattern <pattern>` | `widget` | Patrón del widget |
823
- | `-p, --path <path>` | `page` | Ruta al directorio pages/ |
824
- | `-f, --feature <path>` | `collaborative page`, `collaborative bloc` | Ruta al paquete del feature |
825
- | `-j, --json <json>` | `widget` | JSON string con el árbol del componente |
826
- | `-f, --file <path>` | `widget` | Ruta a archivo JSON con el árbol del componente |
827
-
828
- ---
829
-
830
- ## ¡Eso es todo!
831
-
832
- Si tenés dudas, revisá el [README](../README.md) o abrí un issue en
833
- [github.com/MatiasZL/wlmaker-cli](https://github.com/MatiasZL/wlmaker-cli).
3
+ La documentación oficial está disponible en [wlmaker-docs]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wlmaker",
3
- "version": "1.9.1",
3
+ "version": "1.9.2",
4
4
  "description": "Create Flutter BLoCs with Freezed sealed classes from the terminal",
5
5
  "keywords": [
6
6
  "flutter",