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:schemaImprime 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:verifyComprueba lo generado contra el manifiesto.
larapack:audit[path]Comprueba la línea base del ecosistema.
larapack:skillInstala 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-runConstruye 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, --reactAñade los avisos de interfaz.
--strictLos 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, --reactGenera 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
--strictLos 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.
--allAudita cada subdirectorio que tenga composer.json o package.json.
--strictLos 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.
--printEscribe el texto en la salida estándar en lugar de instalarlo.
--sourceImprime sólo la ruta del original, dentro de LaraPack.
--forceSobrescribe 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.