Skip to content

Preparar el proyecto ​

Un agente sólo sigue el flujo de LaraPack si lo conoce. Las instrucciones viven dentro de LaraPack, en skill/SKILL.md, y se copian al proyecto donde el agente sí las lee. Antes de eso, conviene elegir bien el punto de partida.

Elegir el punto de partida ​

Vas a…Empieza conQué te ahorra
Crear una aplicaciónLa aplicación base (innoboxrr/laravel-setup)Sesión, sitio, administrador, el usuario generado y todo lo que el módulo generado espera de la aplicación
Crear un paquetelarapack:newcomposer.json en la línea base, proveedores, tests, workflows, AGENTS.md y la skill instalada
Trabajar en un proyecto que ya existecomposer require de LaraPack y larapack:skillNada de lo anterior: revisa En un proyecto existente

Una aplicación nueva: la aplicación base ​

Es el mejor punto de partida para un agente, porque le quita el trabajo que peor hace: pegar piezas. En la aplicación base ya están resueltos statefulApi(), JsonResource::withoutWrapping(), los proveedores registrados en bootstrap/providers.php, los avisos y la confirmación montados, las traducciones del módulo cargadas y el menú que se construye solo con las rutas de cada modelo. El usuario ya está declarado en laraimport.json con authenticatable, así que el agente añade modelos al mismo archivo y aparecen en el menú.

bash
composer create-project laravel/laravel mi-app
cd mi-app
# configura la base de datos y APP_URL en .env

composer require --dev innoboxrr/laravel-setup
php artisan app:setup
git diff                      # revisa lo que escribió
# pon tu correo en ADMIN_EMAILS del .env

php artisan app:install
php artisan larapack:skill
composer run dev
bash
composer create-project laravel/laravel mi-app
cd mi-app
# configura la base de datos y APP_URL en .env

composer require --dev innoboxrr/laravel-setup
php artisan app:setup --react
git diff                      # revisa lo que escribió
# pon tu correo en ADMIN_EMAILS del .env

php artisan app:install
php artisan larapack:skill
composer run dev

Atención

APP_URL tiene que ser la dirección con la que abres la aplicación, con su puerto. Sanctum sólo acepta la cookie de sesión desde los dominios de SANCTUM_STATEFUL_DOMAINS; con otra dirección el login funciona, pero cada tabla del administrador responde 401. Es lo primero que un agente diagnostica mal.

app:setup sólo trabaja sobre una aplicación recién creada (sin --force, se niega) y no instala nada: escribe composer.json, package.json, la configuración, las pantallas y el usuario. app:install actualiza las dependencias, migra, siembra el sitio de ejemplo, exporta routes.json y compila. larapack:skill va después de app:install, porque LaraPack llega a vendor/ con ese composer update. Los detalles están en Instalar.

Añadir un modelo a la aplicación base es siempre lo mismo:

bash
php artisan larapack:validate laraimport.json --vue
php artisan larapack:import laraimport.json --vue
php artisan migrate
php artisan route:json
npm run build

(con --react en una aplicación React). Para que sólo lo vean los administradores, añade su ruta a adminOnly: el nombre de la ruta en Vue, su id en React. Ver Personalizar y ampliar.

Un paquete nuevo: larapack:new ​

bash
php vendor/bin/builder larapack:new acme/catalogo packages/catalogo
cd packages/catalogo
composer install

php vendor/bin/builder es el binario de una instalación de LaraPack que ya exista, por ejemplo la de la aplicación donde vas a usar el paquete. Dentro de una aplicación Laravel también vale php artisan larapack:new.

larapack:new deja al agente todo lo que necesita:

  • .claude/skills/larapack/SKILL.md, la skill ya instalada;
  • AGENTS.md, que apunta a la skill para los agentes que no son Claude Code;
  • composer.json con las versiones de la línea base, LaraPack en require-dev, y phpunit.xml.dist con un primer test;
  • tests.yml y release.yml, pint.json, phpstan.neon.dist, VERSION en 0.1.0 y CHANGELOG.md.

No trabaja sobre un directorio que ya tenga composer.json, y larapack:new acme/catalogo --dry-run dice exactamente lo que crearía. El .gitattributes que genera marca .claude y AGENTS.md como export-ignore: las instrucciones del agente no viajan a quien instala el paquete.

Un proyecto que ya existe ​

bash
composer require --dev innoboxrr/larapack-generator

En un paquete que no creó larapack:new, una vez:

bash
php vendor/bin/builder larapack:providers   # App, Auth, Event y Route
php vendor/bin/builder larapack:config

Después alinea las versiones con larapack:audit y copia los workflows de un paquete recién creado (larapack:new vendor/x --dry-run en un directorio vacío dice cuáles son). En una aplicación, lee antes Paquete o aplicación: los proveedores se registran a mano en bootstrap/providers.php.

Nota

El README de LaraPack muestra composer require innoboxrr/larapack-generator sin --dev. larapack:new y la aplicación base lo ponen en require-dev, que es lo coherente: el código generado no depende de LaraPack para funcionar.

Instalar la skill ​

bash
php vendor/bin/builder larapack:skill                  # -> .claude/skills/larapack/SKILL.md
php vendor/bin/builder larapack:skill --path=AGENTS.md # para agentes que leen AGENTS.md
php vendor/bin/builder larapack:skill --print          # por salida estándar
php vendor/bin/builder larapack:skill --source         # ruta del original dentro de vendor/
php vendor/bin/builder larapack:skill --force          # sobrescribe el destino

Dentro de una aplicación, lo mismo con php artisan larapack:skill.

OpciónQué hace
--path=RUTADestino, relativo a la raíz del proyecto. Por omisión .claude/skills/larapack/SKILL.md.
--printEscribe la skill por salida estándar y no instala nada.
--sourceImprime sólo la ruta del original dentro del paquete.
--forceSobrescribe el destino aunque exista y sea distinto.
--root=RUTAProyecto sobre el que se instala, si no es el que se descubre.

Por qué una copia. Un paquete dentro de vendor/ no lo lee ningún agente: ni Claude Code ni Codex miran ahí. Y como el original vive en LaraPack, actualizar el generador trae instrucciones nuevas; basta con volver a copiarlas.

Claude Code ​

Claude Code carga sola la skill de .claude/skills/larapack/ cuando la tarea toca modelos, endpoints, formularios o vistas. La descripción de la skill le dice que la use antes de escribir a mano cualquier controlador, request, política, migración o módulo de interfaz.

Codex y otros agentes ​

Leen AGENTS.md. Hay dos formas de dárselo:

  • Un AGENTS.md corto que apunta a la skill. Es lo que crea larapack:new:

    md
    # Instrucciones para agentes
    
    La arquitectura de este paquete la genera LaraPack. Antes de crear o cambiar un
    modelo, un endpoint, una request, una política, una migración o una vista, lee
    `.claude/skills/larapack/SKILL.md` y sigue su flujo: se declara en
    `laraimport.json` y se genera, no se escribe a mano.
    
    Si ese archivo falta, o LaraPack se actualizó:
    
    ```
    php vendor/bin/builder larapack:skill --force
    ```
  • La skill entera en AGENTS.md, con larapack:skill --path=AGENTS.md.

Atención

En un paquete creado con larapack:new, AGENTS.md ya existe. Sin --force, --path=AGENTS.md no lo toca; con --force sustituye el puntero —y cualquier regla del proyecto que hubieras añadido— por la skill completa.

Después de actualizar LaraPack ​

Las instrucciones viajan con la versión del generador. Tras cada actualización:

bash
php vendor/bin/builder larapack:skill --force

Sin --force, un destino que difiere del paquete no se pisa, para no perder reglas del proyecto que se hayan añadido a la copia. En ese caso el comando dice «Ya existe y difiere del paquete» y sale con código 0: no falla. Para ver qué cambió antes de sobrescribir:

bash
git diff --no-index .claude/skills/larapack/SKILL.md "$(php vendor/bin/builder larapack:skill --source)"

Consejo

Si añadiste reglas propias a la copia de la skill, llévalas a otro archivo antes de usar --force. Así actualizar LaraPack no las borra.

Comprobar que el proyecto está listo ​

Antes de pedirle nada al agente:

  1. .larapack/manifest.json está versionado. Sin él, el generador no distingue tu código del suyo y se vuelve conservador con todo.
  2. laraimport.json valida: larapack:validate --vue (o --react). En la aplicación base ya trae el usuario.
  3. larapack:verify sale en verde. En un proyecto donde todavía no se generó nada avisa con empty-manifest.
  4. Pint está en el proyecto (composer require --dev laravel/pint). Sin él, lo generado queda sin formatear: la importación lo avisa en texto, y en JSON formatted vale null.
  5. La suite pasa: vendor/bin/phpunit.
  6. En un paquete, larapack:audit no tiene errores.

Con eso, el agente parte de verde y cualquier rojo que aparezca es suyo. Sigue en El ciclo del agente.