Difflock 1.0.0 es un paquete de Laravel creado por Rati Rukhadze y disponible en GitHub como `Heyosseus/difflock`. Requiere PHP 8.3 y es compatible con Laravel 12 y 13. También funciona con MySQL, MariaDB, PostgreSQL y SQLite.

terminal
php artisan difflock:lint
php artisan difflock:lint -v
php artisan difflock:lint --rule=drop-column

El paquete analiza el código fuente de las migraciones sin cargarlo ni ejecutarlo. Después combina ese análisis con el esquema conectado y los metadatos sobre el tamaño de las tablas. Sus reglas cubren operaciones destructivas, cambios de columnas, índices, claves foráneas y nombres de columnas sensibles.

`difflock:lint` toma como entrada las migraciones pendientes. El ejemplo añade a `orders` una columna obligatoria `channel`, una clave `customer_id` con restricciones y `cascadeOnDelete()`, una columna nullable `card_number` de longitud 32 y un índice sobre `status`. También elimina `legacy_token` de `customers` y cambia el nombre de `name` a `full_name`.

Con una base de datos que ya contiene registros, Difflock señala la nueva columna obligatoria, `dropColumn()` y el cambio de nombre. También advierte que `cascadeOnDelete()` borra las filas hijas dentro de la base de datos. Los eventos de los modelos, los observers y los soft deletes no intervienen en ese proceso. La regla `change-column` compara `->change()` con la definición actual de la columna. `unindexed-foreign-key` comprueba el índice que necesita el motor de base de datos. `redundant-index` detecta casos como `(status)` cuando ya existe `(status, created_at)`.

La opción `-v` muestra más información y `--rule=` filtra una regla concreta. Cuando no quedan migraciones pendientes, el comando revisa todos los archivos de migración. Un proyecto existente puede aceptar su historial con `php artisan difflock:lint --all --accept`. El estado aceptado se guarda en `database/difflock/accepted.json`.

La detección de diferencias de esquema parte de una observación de la base de datos. Difflock no intenta reconstruir un esquema previsto a partir de los archivos de migración. Las condiciones, los bucles y el SQL sin formato de esos archivos no requieren interpretación. `php artisan difflock:diff --save` escribe `database/difflock/schema.json`, que se puede guardar en el repositorio. Más adelante, `php artisan difflock:diff` compara la conexión actual con ese archivo. `--from=staging --to=production` compara dos conexiones configuradas.

La referencia JSON incluye tablas, columnas, índices, valores predeterminados y claves foráneas. No incluye filas de las tablas ni credenciales. `snapshot.defaults`, `snapshot.comments` e `ignore.tables` permiten limitar los datos registrados. El artículo también menciona el linting de esquemas de Vacuum para PostgreSQL.

La instalación no modifica `php artisan migrate`. La protección se activa mediante `php artisan difflock:migrate`. El comando analiza las migraciones pendientes y se detiene antes de escribir en la base cuando los hallazgos alcanzan el nivel de bloqueo configurado. `--allow-risky` permite saltarse esa protección. El parámetro `--force` de Laravel sigue siendo la confirmación independiente para migraciones en producción.

En CI se puede ejecutar `php artisan difflock:check --ci`. El proceso devuelve 0 cuando la comprobación es correcta, 1 cuando hay diferencias de esquema o hallazgos que alcanzan el umbral, y 2 cuando no puede ejecutarse. Las reglas basadas solo en el código fuente funcionan sin conexión a la base. En ese caso, Difflock informa de que faltan los datos de las tablas.

`php artisan difflock:mcp` inicia un servidor MCP independiente mediante stdio. Sus cuatro herramientas ofrecen contexto de tablas, linting de migraciones, comprobaciones de diferencias de esquema y documentación de reglas. La herramienta de migraciones acepta una ruta de archivo o texto fuente. Un agente de programación con IA puede revisar una migración antes de crearla usando el esquema actual y las estadísticas de las tablas. `php artisan difflock:explain` genera un informe en Markdown sin usar un modelo de lenguaje ni una API externa.

La instalación se realiza con `composer require heyosseus/difflock --dev`. La configuración se publica mediante `php artisan vendor:publish --tag=difflock-config`. `php artisan difflock:doctor` informa sobre la conexión, las tablas disponibles, las migraciones pendientes, las reglas registradas y la capacidad de escritura del rol configurado. Para inspeccionar una conexión de producción resulta adecuada una cuenta de solo lectura.