Skip to content

Comandos ​

Todos los comandos viven en el espacio larapack: y se ejecutan con php artisan dentro de una aplicación o con php vendor/bin/builder en cualquier sitio (ver Cómo se invoca). Esta página recoge los argumentos y las opciones que tiene cada uno de verdad, sus códigos de salida y la forma de su salida JSON.

Opciones comunes ​

OpciónQué hace
--root=<ruta>Raíz del proyecto sobre el que se trabaja. Sin ella, se descubre. Una ruta que no existe es un error.
--forceRegenera los archivos que ya existen, salvo los editados a mano y los que el manifiesto no conoce. Ver Regenerar sin destruir.
--dry-runInforma de lo que haría sin escribir ningún archivo.
--format=<formato>txt, por defecto, o json: un único documento JSON en la salida estándar.

No todos los comandos las tienen:

Comando--root--force--dry-run--format
larapack:new——✓✓
larapack:schema————
larapack:validate✓——✓
larapack:import✓✓✓✓
larapack:verify✓——✓
larapack:audit———✓
larapack:skill✓✓ (sobrescribe el destino)——
larapack:full-model✓✓✓✓
larapack:remove-full-model✓———
larapack:providers, los cuatro *-service-provider y larapack:config✓✓✓✓
Los generadores de una pieza, larapack:model-view, larapack:react-view y larapack:pivot-migration✓✓✓✓

Todos los comandos ​

Contrato y comprobaciones ​

ComandoArgumentosQué hace
larapack:new<name> [directory]Crea un paquete nuevo listo para generar, probar y publicar.
larapack:schema—Imprime el JSON Schema del contrato.
larapack:validate[jsonPath]Valida un laraimport.json sin generar nada.
larapack:import[jsonPath]Genera todos los modelos y pivotes de un laraimport.json.
larapack:verify—Comprueba lo generado contra el manifiesto.
larapack:audit[path]Comprueba la línea base del ecosistema.
larapack:skill—Instala en el proyecto las instrucciones para un agente.

Un modelo entero ​

ComandoArgumentosQué hace
larapack:full-model<name>Genera todas las piezas de un modelo sin laraimport.json.
larapack:remove-full-model<name>Borra las piezas de un modelo y escribe las migraciones que eliminan sus tablas.
larapack:model-view<name>Genera el módulo Vue del modelo.
larapack:react-view<name>Genera el módulo React del modelo.

Piezas sueltas ​

Todos reciben <name>, el nombre del modelo en PascalCase, salvo larapack:pivot-migration, que recibe el nombre de la tabla.

ComandoQué genera
larapack:controllerEl controlador del modelo y, en un paquete, el Controller base.
larapack:eventsLos eventos y listeners de cada acción declarada.
larapack:excelLa vista resources/views/excel/<snake>.blade.php.
larapack:exportLa clase <Plural>Exports.
larapack:export-notificationLa notificación de exportación.
larapack:factoryLa factory.
larapack:filtersLos cinco filtros de search-surge.
larapack:migrationLa migración de creación.
larapack:modelEl modelo.
larapack:model-traitsLos cinco traits, si no existen.
larapack:observerEl observer.
larapack:policyLa política.
larapack:requestsUn request por acción declarada.
larapack:resourceEl recurso.
larapack:routeEl archivo de rutas.
larapack:testEl test de endpoints y, si faltan, tests/TestCase.php, tests/User.php y phpunit.xml.
larapack:pivot-migrationLa migración de una tabla pivote.

El proyecto ​

Ninguno recibe argumentos. Ver Proveedores y configuración.

ComandoQué genera
larapack:providersLos cuatro proveedores de una vez.
larapack:app-service-providerProviders/AppServiceProvider.php.
larapack:auth-service-providerProviders/AuthServiceProvider.php.
larapack:event-service-providerProviders/EventServiceProvider.php.
larapack:route-service-providerProviders/RouteServiceProvider.php.
larapack:configEl archivo de configuración de lo generado.

larapack:new ​

bash
php vendor/bin/builder larapack:new acme/catalogo packages/catalogo
Argumento u opciónPor defectoQué es
nameobligatorioNombre Composer, vendor/paquete, en minúsculas.
directory./<paquete>Dónde crearlo. Se crea si no existe.
--namespace=sale del nombreNamespace raíz. acme/shop-catalog da Acme\ShopCatalog. Cada parte, en PascalCase.
--description=<paquete>: paquete Laravel generado con LaraPack.Para composer.json y el README.
--license=MITLicencia de composer.json. Con MIT se escribe además LICENSE.
--dry-run—Construye el paquete en un directorio temporal, informa y lo borra.
--format=txttxt o json.

Se niega a trabajar sobre un directorio que ya tenga composer.json: ahí ya hay un proyecto, y para generar dentro de él están larapack:import y larapack:providers con --root.

Lo que crea, con las versiones del ecosystem.json del LaraPack que lo ejecuta:

ArchivoContenido
composer.jsontype: library. require: php, illuminate/support, innoboxrr/search-surge, innoboxrr/support, innoboxrr/traits, laravel/sanctum y maatwebsite/excel. require-dev: innoboxrr/larapack-generator, larastan/larastan, laravel/pint, orchestra/testbench y phpunit/phpunit. Autoload de src/ y de database/factories/, autoload-dev de tests/, y los cuatro proveedores en extra.laravel.providers.
src/Providers/{App,Auth,Event,Route}ServiceProvider.phpLos proveedores.
config/<clave>.phpLa configuración de la exportación.
tests/TestCase.php, tests/User.php, tests/Feature/PackageBootsTest.phpLa base de tests y un primer test que comprueba que los proveedores arrancan y las migraciones corren.
phpunit.xml.distLa configuración de PHPUnit.
.github/workflows/tests.yml, .github/workflows/release.ymlLos workflows del ecosistema, con el trabajo quality (Pint y Larastan).
pint.json, phpstan.neon.distPreset laravel; Larastan nivel 5 sobre src y database.
VERSION0.1.0.
README.md, CHANGELOG.md, AGENTS.md, .gitignore, .gitattributes, LICENSELos archivos del repositorio. AGENTS.md apunta a la skill.
.claude/skills/larapack/SKILL.mdLa skill instalada.

Un paquete recién creado pasa larapack:audit sin hallazgos. Los pasos siguientes están en Un paquete nuevo.

La simulación no deja nada que copiar

larapack:new --dry-run construye el paquete en un directorio temporal para decir exactamente qué crearía, y lo borra al terminar. Para ver los archivos, créalo de verdad en un directorio aparte.

larapack:schema ​

OpciónQué hace
--pathImprime sólo la ruta de schema/laraimport.schema.json.

Sin opciones imprime el esquema completo. No tiene --root ni --format: la salida ya es JSON, y siempre sale con 0.

larapack:validate ​

bash
php vendor/bin/builder larapack:validate --vue --format=json
Argumento u opciónPor defectoQué es
jsonPath<raíz>/laraimport.jsonEl archivo a validar.
--vue, --react—Añade los avisos de interfaz.
--strict—Los avisos cuentan como fallo.
--root=se descubre
--format=txttxt o json.

En texto imprime cada hallazgo, los modelos en el orden en que correrán sus migraciones y el recuento. Sale con 1 si hay errores, o avisos con --strict. Qué comprueba está en Errores y avisos.

larapack:import ​

bash
php vendor/bin/builder larapack:import --vue --react --dry-run
php vendor/bin/builder larapack:import --vue --react --force
Argumento u opciónPor defectoQué es
jsonPath<raíz>/laraimport.jsonEl contrato.
--vue, --react—Genera también el módulo de interfaz de cada modelo. No son excluyentes.
--root=, --force, --dry-run, --format=Las opciones comunes.

Lo que hace, en orden:

  1. Valida el archivo, con los avisos de interfaz si pasas --vue o --react. Con un error no escribe nada y sale con 1.
  2. Genera cada modelo, en el orden de sus dependencias, con las mismas piezas que larapack:full-model, y anota su forma declarada en el manifiesto.
  3. Genera la migración de cada pivote.
  4. Formatea con Pint lo que escribió.
  5. Informa, con los avisos de la validación en findings.

En texto escribe además su progreso, modelo a modelo. Con --format=json no escribe progreso en ninguna salida.

larapack:verify ​

OpciónPor defectoQué es
--strict—Los avisos cuentan como fallo.
--root=se descubre
--format=txttxt o json.

Lee sólo .larapack/manifest.json y los archivos. Sale con 1 si hay errores, o avisos con --strict. Las comprobaciones están en Verificar y auditar.

larapack:audit ​

bash
php vendor/bin/builder larapack:audit                     # el paquete actual
php vendor/bin/builder larapack:audit packages --all      # cada paquete de un directorio
Argumento u opciónPor defectoQué es
path.El directorio del paquete, o uno que los contiene con --all.
--all—Audita cada subdirectorio que tenga composer.json o package.json.
--strict—Los avisos cuentan como fallo.
--format=txttxt o json.

No tiene --root: la ruta es el argumento. Una ruta que no existe sale con 1. Las comprobaciones están en Verificar y auditar.

larapack:skill ​

OpciónPor defectoQué es
--path=.claude/skills/larapack/SKILL.mdDestino, relativo a la raíz; también admite una ruta absoluta.
--print—Escribe el texto en la salida estándar en lugar de instalarlo.
--source—Imprime sólo la ruta del original, dentro de LaraPack.
--force—Sobrescribe el destino aunque exista.
--root=se descubre

Sin --force no pisa un destino que ya existe, porque puede estar ampliado con reglas del proyecto: dice si está al día o si difiere del paquete, y sale con 0 en los dos casos. Tras actualizar LaraPack, reinstálala con --force. Ver Preparar el proyecto.

larapack:full-model ​

bash
php artisan larapack:full-model AuditEvent --only=policies,index,show --immutable
Argumento u opciónQué es
nameNombre del modelo, en PascalCase.
--vue, --reactGenera también su módulo de interfaz.
--metasGenera el modelo con metas, conectado como con metas: true.
--only=a,bSólo estas acciones, separadas por comas.
--except=a,bTodas las acciones menos estas.
--immutableLas filas no se modifican ni se borran.
--root=, --force, --dry-run, --format=Las opciones comunes.

Genera, en este orden: migración, controlador, eventos, vista de Excel, exportación, notificación de exportación, factory, filtros, modelo, traits, observer, política, requests, recurso, rutas y test; después, los módulos pedidos y, con --metas, el modelo y la migración de metas.

Sale con 1 si pasas --only y --except a la vez, si una acción no existe o si --immutable va con una escritura en --only.

Sin laraimport no hay columnas

Un comando suelto no lee laraimport.json: los archivos salen con sus marcadores de datos sin rellenar, así que el modelo no tiene columnas, la migración tampoco, los requests no tienen reglas y los formularios no tienen campos. Úsalo para un modelo rápido o para probar una forma; para un dominio real, declara el modelo y usa larapack:import.

larapack:remove-full-model ​

Argumento u opciónQué es
nameNombre del modelo.
--vue, --reactBorra también la carpeta del modelo en ese módulo.
--root=

Borra el controlador, los eventos, la vista de Excel, la exportación, la notificación, la factory, los filtros, el modelo y sus cinco traits, el modelo de metas, el observer, la política, los requests, el recurso, el archivo de rutas y el test. No borra la migración de creación: escribe <fecha>_drop_<tabla>_table.php y, si el modelo tenía metas, <fecha>_drop_<snake>_metas_table.php.

No tiene --format y sale siempre con 0.

Limpia el manifiesto a mano

El comando no retira el modelo de .larapack/manifest.json, así que larapack:verify informará después de sus archivos como missing-file. Borra la entrada del modelo en models del manifiesto.

larapack:pivot-migration ​

bash
php vendor/bin/builder larapack:pivot-migration post_tag

Recibe el nombre de la tabla. Crea database/migrations/<fecha>_create_<tabla>_table.php sólo si no hay ya una migración de creación de esa tabla. No entra en el manifiesto, así que --force no la regenera.

Desde larapack:import, las columnas salen de pivots. Suelto no hay laraimport: la migración trae id() y timestamps(), y las columnas las escribes tú en el marcador //EDIT//.

Proveedores y configuración ​

El importador no genera proveedores. Un paquete creado con larapack:new ya los tiene; en otro proyecto se crean una vez.

ProveedorQué hace
AppServiceProviderFusiona la configuración si existe, carga las migraciones, las vistas con el namespace del paquete y lang/ como JSON, y publica las etiquetas views y config.
AuthServiceProviderSólo gates: cada modelo declara su política con #[UsePolicy].
EventServiceProviderEnlaza cada evento de Http/Events/<Model>/Events con los listeners de Http/Events/<Model>/Listeners/<Evento>, recorriéndolos en cada arranque, sin caché.
RouteServiceProviderCarga cada routes/api/models/*.php con el middleware api, el prefijo api/<namespace>/<snake> y los nombres api.<namespace>.<snake>.. No hace nada si las rutas están cacheadas.
  • En un paquete, cada comando de proveedor lo declara además en extra.laravel.providers del composer.json, sin duplicar y nunca en una simulación. La aplicación que instala el paquete los descubre sola.
  • En una aplicación, un proveedor que ya existe se omite, y nada se añade al composer.json: registra RouteServiceProvider y EventServiceProvider en bootstrap/providers.php. Sin el de eventos, la exportación nunca avisa.

larapack:config crea config/<clave>.php con user_class, excel_view, notification_via y export_disk. En un paquete la clave es el namespace en minúsculas y sin separadores (Acme\Catalogo da acmecatalogo); en una aplicación es larapack, y el comando nunca escribe en config/app.php. Ver Exportar a Excel.

Códigos de salida ​

CódigoCuándo
0Terminó bien. En validate, verify y audit: sin errores, y sin avisos si se pasó --strict.
1Algo falló.

Qué hace salir con 1:

  • validate, verify y audit: algún error, o algún aviso con --strict.
  • import: un laraimport inválido o que no existe. No se escribe nada.
  • audit: una ruta que no existe.
  • new: un nombre o un namespace inválidos, un directorio con composer.json o un directorio que no se puede crear.
  • full-model: --only junto a --except, una acción desconocida o --immutable con una escritura en --only.
  • Cualquier comando con --root: una raíz que no existe.
  • Cualquier comando: un argumento obligatorio que falta o una opción desconocida.

schema, skill y remove-full-model salen con 0 salvo que algo lance una excepción.

Salida JSON ​

Con --format=json, cada comando que lo acepta escribe exactamente un documento JSON en la salida estándar y nada más: ni progreso, ni avisos sueltos, ni nada en la salida de errores. Vale también para --dry-run y para los fallos, así que quien lo lee decodifica la salida entera sin recortar nada.

  • ok dice si salió bien.
  • Si el comando no pudo ejecutarse, el documento lleva "ok": false y error con el motivo, y el código de salida es 1.

Los acentos salen escapados

El documento se escribe con json_encode y los caracteres no ASCII salen como í. Cualquier decodificador JSON los devuelve tal cual; en los ejemplos de esta página se muestran legibles.

Un fallo ​

json
{
    "ok": false,
    "error": "La raíz indicada no existe: packages/catalogo"
}

Algunos fallos añaden claves:

ClaveCuándo
findingslarapack:import con un laraimport inválido: los hallazgos de la validación.
exceptionUn fallo que llega como excepción (una raíz que no existe, un argumento que falta): la clase de la excepción.

Los generadores e import ​

larapack:import, larapack:new, larapack:full-model, larapack:providers, larapack:config y cada generador de una pieza:

json
{
    "ok": true,
    "dryRun": false,
    "formatted": 24,
    "summary": { "create": 24, "overwrite": 0, "skipped": 1, "preserved": 1 },
    "files": [
        { "action": "create", "file": "src/Models/Post.php", "stub": "Model/ModelTemplate.txt", "reason": null },
        { "action": "skipped", "file": "database/factories/PostFactory.php", "stub": "Factory/FactoryTemplate.txt", "reason": "ya existe" },
        { "action": "preserved", "file": "src/Policies/PostPolicy.php", "stub": "Policy/PolicyTemplate.txt", "reason": "editado a mano" }
    ],
    "findings": []
}
ClaveQué es
oktrue.
dryRunSi fue una simulación.
formattedCuántos archivos PHP formateó Pint. 0 en una simulación o sin PHP que formatear; null si hacía falta Pint y el proyecto no lo tiene.
summaryRecuento por acción: create, overwrite, skipped y preserved.
files[].actioncreate (creado), overwrite (regenerado), skipped (omitido) o preserved (conservado por estar editado). En una simulación, lo que haría.
files[].fileRuta relativa a la raíz.
files[].stubPlantilla de la que sale, relativa a Stubs/.
files[].reasonPor qué se omitió o se conservó, o null.
findingsSólo en larapack:import: los avisos de la validación, con la forma de los de validate.

Salida de larapack:validate ​

json
{
    "ok": false,
    "file": "/ruta/al/proyecto/laraimport.json",
    "errors": 1,
    "warnings": 1,
    "models": [],
    "findings": [
        {
            "level": "error",
            "path": "/models/0/requests/1/rules",
            "message": "Update debe validar 'post_id': su authorize() y su handle() hacen findOrFail con ese valor."
        },
        {
            "level": "warning",
            "path": "/models/0/load_relations/1/related",
            "message": "'User' no está en este archivo y no declara namespace: se resolverá contra App\\Models."
        }
    ]
}
ClaveQué es
okSin errores, y sin avisos con --strict.
fileEl archivo validado.
errors, warningsRecuentos.
modelsLos nombres de los modelos en orden de migración; vacío si el documento tiene errores.
findings[]level (error o warning), path (puntero JSON) y message.

Salida de larapack:verify ​

json
{
    "ok": false,
    "errors": 1,
    "warnings": 0,
    "findings": [
        {
            "level": "error",
            "check": "missing-file",
            "model": "Post",
            "file": "src/Policies/PostPolicy.php",
            "message": "Se generó pero ya no existe. Regenéralo con --force o retíralo del manifiesto."
        }
    ]
}
ClaveQué es
findings[].levelerror, warning o info.
findings[].checkEl código de la comprobación. Ver Verificar y auditar.
findings[].modelEl modelo, o null para lo que no es de ninguno (proveedores, configuración, andamiaje del módulo).
findings[].fileEl archivo, relativo a la raíz, o null.
findings[].messageQué pasa y qué hacer.

Salida de larapack:audit ​

json
{
    "ok": false,
    "errors": 1,
    "warnings": 1,
    "findings": [
        {
            "level": "error",
            "check": "internal-version",
            "package": "acme/catalogo",
            "message": "`innoboxrr/larapack-generator: ^7.10.2` no admite la línea base `^7.10`."
        },
        {
            "level": "warning",
            "check": "illuminate-version",
            "package": "acme/catalogo",
            "message": "`illuminate/support: ^12.0 || ^13.0` admite versiones fuera de la línea base `^13.0`; la matriz de CI tiene que cubrirlas."
        }
    ]
}
ClaveQué es
findings[].levelerror o warning.
findings[].checkEl código de la comprobación. Ver Verificar y auditar.
findings[].packageEl name del composer.json o del package.json, o el nombre del directorio.
findings[].messageQué pasa.