with one click
nuevo-componente
// Crear componente Livewire siguiendo estándares del proyecto (SucursalAware, CajaAware, patrones).
// Crear componente Livewire siguiendo estándares del proyecto (SucursalAware, CajaAware, patrones).
| name | nuevo-componente |
| description | Crear componente Livewire siguiendo estándares del proyecto (SucursalAware, CajaAware, patrones). |
| user-invocable | true |
| argument-hint | [nombre-componente] |
Tu trabajo es crear un componente Livewire que cumpla con todos los estándares de BCN Pymes.
Preguntar al usuario:
GestionarClientes)Clientes → app/Livewire/Clientes/)SucursalAwareCajaAwareWithPagination.claude/ESTANDARES_PROYECTO.md.claude/docs/componentes-livewire.mdSegún la complejidad, leer un componente existente como referencia:
| Complejidad | Componente de referencia |
|---|---|
| Simple (listado sin modales) | app/Livewire/Bancos/ResumenCuentas.php |
| Media (CRUD con modales) | app/Livewire/Articulos/GestionarCategorias.php |
| Alta (estado complejo) | app/Livewire/Ventas/NuevaVenta.php |
| Global (sin sucursal) | app/Livewire/Articulos/GestionarGruposOpcionales.php |
Clase PHP en app/Livewire/{Modulo}/{NombreComponente}.php:
use Livewire\Attributes\Lazy; en imports#[Lazy] antes de la declaración de clase (OBLIGATORIO si es full-page)placeholder() antes de mount() con skeleton apropiado:
<x-skeleton.page-table :filterCount="N" :columns="N" /><x-skeleton.page-dashboard :statCards="N" :sections="N" /><x-skeleton.page-form :tabs="N" :fields="N" />onSucursalChanged() si tiene lógica extra al cambiar sucursalrender() con query filtrada por $this->sucursalActual() si aplicaVista Blade en resources/views/livewire/{modulo}/{nombre-componente}.blade.php:
Antes de terminar, verificar:
[ ] #[Lazy] + placeholder() con skeleton (si es full-page)
[ ] SucursalAware trait aplicado (si corresponde)
[ ] Usa sucursalActual() / sucursal_activa() en queries
[ ] Al crear registros incluye sucursal_id
[ ] Modales se cierran en handleSucursalChanged
[ ] WithPagination → resetPage() en handler
[ ] Formularios se limpian al cambiar sucursal
[ ] Validación de acceso a sucursal en operaciones sensibles
Después de crear el componente, actualizar:
docs/manual-usuario.md: Agregar sección del nuevo componente en el módulo correspondiente (acciones, filtros, modales, campos)docs/ai-knowledge-base.md: Si el componente introduce tablas/lógica nueva, agregar al modelo de datos y lógica de negocioTodo componente Livewire nuevo DEBE tener al menos un smoke test que verifique
que monta sin errores. Esto detecta: errores en mount(), sintaxis Blade
inválida, variables indefinidas en la vista, dependencias rotas.
Dónde agregarlo: en el archivo tests/Feature/Livewire/{Modulo}/Smoke{Modulo}Test.php
correspondiente a la carpeta del componente. Si NO existe, crearlo siguiendo
el patrón del proyecto (ver tests/Feature/Livewire/Articulos/SmokeArticulosTest.php
como referencia simple, o SmokeCajasTest.php para componentes CajaAware).
Template del test a agregar:
public function test_{nombre_componente}_monta(): void
{
Livewire::test(NombreComponente::class)->assertOk();
}
Setup del archivo (si lo creás nuevo):
WithTenant siempreWithSucursal si el componente es SucursalAware o si su carpeta lo requiereWithCaja si el componente es CajaAwareLivewire::withoutLazyLoading() en el setUp() (clave si el componente usa #[Lazy])Validar: php artisan test --filter=Smoke{Modulo}Test debe pasar antes
de confirmar al usuario.
auth()->user()?->hasPermissionTo('func.X'), NUNCA can() (User no usa HasRoles trait)SucursalAware: el método del trait se llama $this->sucursalActual() — NO obtenerSucursalActual() (ese es propio del componente Ventas.php y no está en el trait)[HINT] Download the complete skill directory including SKILL.md and all related files