laravel-upgrade
from 1weiho/laravel-upgrade-skill
An agent skill for upgrading Laravel applications one major version at a time
npx skills add https://github.com/1weiho/laravel-upgrade-skill --skill laravel-upgradeSKILL.md
Laravel Upgrade
Upgrade Laravel applications one major version at a time. Supports: 9→10, 10→11, 11→12.
Workflow
1. Detect Current Version
Read composer.json and find the laravel/framework version constraint:
// Example: "laravel/framework": "^10.0" means Laravel 10.x
Determine target version (current + 1). If already on Laravel 12, inform user they're on the latest supported version.
2. Load Upgrade Guide
Based on detected versions, read the appropriate reference file:
| Current | Target | Reference File |
|---|---|---|
| 9.x | 10.x | references/from-9-to-10.md |
| 10.x | 11.x | references/from-10-to-11.md |
| 11.x | 12.x | references/from-11-to-12.md |
3. Scan and Fix
For each breaking change in the guide, scan the codebase and apply fixes:
High Impact (always check):
composer.jsondependency versions- PHP version requirements
- Database migrations using deprecated methods
Medium Impact (check relevant files):
- Model
$datesproperty →$casts(9→10) - Database expressions with
(string)casting (9→10) - Column modification migrations missing attributes (10→11)
HasUuidstrait behavior change (11→12)
Low Impact (check if patterns found):
- Deprecated method calls (
Bus::dispatchNow,Redirect::home, etc.) - Contract interface changes
- Configuration file updates
4. Update Dependencies
After code fixes, update composer.json:
# Update laravel/framework constraint to target version
# Update related packages per upgrade guide
composer update
5. Post-Upgrade Verification
- Run
php artisanto verify framework boots - Run test suite if available
- Check for deprecation warnings in logs
Common Patterns
Dependency Updates (all upgrades)
Search composer.json for outdated constraints and update per guide.
Model $dates to $casts (9→10)
// Before
protected $dates = ['deployed_at'];
// After
protected $casts = ['deployed_at' => 'datetime'];
Search pattern: protected \$dates\s*=
Database Expression Casting (9→10)
// Before
$string = (string) DB::raw('select 1');
// After
$string = DB::raw('select 1')->getValue(DB::connection()->getQueryGrammar());
Column Modification (10→11)
Migrations using ->change() must now include all modifiers:
// Before (implicit retention)
$table->integer('votes')->nullable()->change();
// After (explicit)
$table->integer('votes')->unsigned()->default(1)->nullable()->change();
HasUuids Trait (11→12)
// Before (ordered UUIDv4)
use Illuminate\Database\Eloquent\Concerns\HasUuids;
// After (if you need UUIDv4 behavior)
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids;