Kaynağa Gözat

fix(skills): Refresh migrate-ops to current majors (verifier drift)

Re-verified ALL documented targets against endoflife.date + npm on
2026-07-05 (the earlier live run could not reach endoflife.date):
Laravel 11->13, Python 3.12->3.14, Node 22->26, TypeScript 5->6,
Go 1.22->1.26, PHP 8.4->8.5. React 19 and Rust 2024 edition unchanged.

- description + decision trees + codemod table bumped to new targets
- language-upgrades.md: new sections for Python 3.14, Node 24/26
  (LTS-to-LTS guidance), TypeScript 6.0, Go 1.24-1.26, PHP 8.5;
  summary tables extended
- framework-upgrades.md: Laravel section extended through 12 and 13
  (PHP 8.3 minimum, cache/Redis key-prefix change, opt-in AI SDK /
  attributes / queue routing)
- migrate-facts.json claims + patterns updated to match

check-migrate-facts.py --offline and --live both exit 0. Note: the
live run on this machine needs SSL_CERT_FILE pointed at certifi's
bundle (stale local OpenSSL trust store rejects endoflife.date).

NOTE: scripts/install.ps1 must be re-run after landing so the global
~/.claude copy picks up all four refreshed skills.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0xDarkMatter 2 hafta önce
ebeveyn
işleme
9a5703bb6d

+ 14 - 14
skills/migrate-ops/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: migrate-ops
-description: "Framework and language migration patterns - version upgrades, breaking changes, dependency audit, safe rollback. Use for: migrate, migration, upgrade, version bump, breaking changes, deprecation, dependency audit, npm audit, pip-audit, codemod, jscodeshift, rector, rollback, semver, changelog, framework upgrade, language upgrade, React 19, Vue 3, Next.js App Router, Laravel 11, Angular, Python 3.12, Node 22, TypeScript 5, Go 1.22, Rust 2024, PHP 8.4."
+description: "Framework and language migration patterns - version upgrades, breaking changes, dependency audit, safe rollback. Use for: migrate, migration, upgrade, version bump, breaking changes, deprecation, dependency audit, npm audit, pip-audit, codemod, jscodeshift, rector, rollback, semver, changelog, framework upgrade, language upgrade, React 19, Vue 3, Next.js App Router, Laravel 13, Angular, Python 3.14, Node 26, TypeScript 6, Go 1.26, Rust 2024, PHP 8.5."
 license: MIT
 allowed-tools: "Read Edit Write Bash Glob Grep Agent"
 metadata:
@@ -12,7 +12,7 @@ metadata:
 
 Comprehensive migration skill covering framework upgrades, language version bumps, dependency auditing, breaking change detection, codemods, and rollback strategies.
 
-> Ecosystem facts verified as of 2026-07.
+> Ecosystem facts verified as of 2026-07-05.
 
 ## Migration Strategy Decision Tree
 
@@ -23,7 +23,7 @@ What kind of migration are you performing?
 │  └─ In-place upgrade
 │     Update dependency, run tests, deploy
-├─ Major framework version (React 18→19, Vue 2→3, Laravel 10→11)
+├─ Major framework version (React 18→19, Vue 2→3, Laravel 12→13)
 │  │
 │  ├─ Codebase < 50k LOC, good test coverage (>70%)
 │  │  └─ Big Bang Migration
@@ -49,7 +49,7 @@ What kind of migration are you performing?
 │        Pros: highest confidence, catch subtle differences
 │        Cons: double infrastructure cost, comparison logic
-└─ Language version upgrade (Python 3.9→3.12, Node 18→22)
+└─ Language version upgrade (Python 3.12→3.14, Node 22→26)
    └─ In-place upgrade with CI matrix
       Test against both old and new versions in CI
       Drop old version support once all tests pass
@@ -84,13 +84,13 @@ Which framework are you upgrading?
 │  ├─ Tool: Migration build (@vue/compat) for incremental migration
 │  └─ Load: ./references/framework-upgrades.md
-├─ Laravel 10 → 11
-│  ├─ Check: Adopt slim application skeleton
-│  ├─ Check: Update config file structure (consolidated configs)
-│  ├─ Check: Review per-second scheduling changes
-│  ├─ Check: Update Dumpable trait usage
+├─ Laravel 12 → 13
+│  ├─ Check: PHP 8.3 is now the minimum (8.5 supported)
+│  ├─ Check: Cache/Redis key prefixes now use hyphenated suffixes
+│  ├─ Check: Adopt native PHP attributes (models, jobs, controllers) — optional
+│  ├─ Check: Queue routing by class via Queue::route(...) — optional
 │  ├─ Tool: laravel shift (automated upgrade service)
-│  └─ Load: ./references/framework-upgrades.md
+│  └─ Load: ./references/framework-upgrades.md (covers 10→11 in depth; 12→13 is near zero-break)
 ├─ Angular (any major version)
 │  ├─ Check: Run ng update for guided migration
@@ -197,7 +197,7 @@ How do you detect breaking changes?
 | **Next.js** | next-codemod | `npx @next/codemod@latest` | Next.js version upgrades |
 | **Vue** | vue-codemod | `npx @vue/codemod src/` | Vue 2 to 3 transforms |
 | **PHP** | Rector | `vendor/bin/rector process src` | PHP version + framework upgrades |
-| **Python** | pyupgrade | `pyupgrade --py312-plus *.py` | Python version syntax upgrades |
+| **Python** | pyupgrade | `pyupgrade --py314-plus *.py` | Python version syntax upgrades |
 | **Python** | django-upgrade | `django-upgrade --target-version 5.0 *.py` | Django version upgrades |
 | **Go** | gofmt | `gofmt -w .` | Go formatting updates |
 | **Go** | gofix | `go fix ./...` | Go API changes |
@@ -266,13 +266,13 @@ Migration failed or caused issues — how to roll back?
 
 | File | Contents | Lines |
 |------|----------|-------|
-| `references/framework-upgrades.md` | React 18→19, Next.js Pages→App Router, Vue 2→3, Laravel 10→11, Angular, Django upgrade paths | ~700 |
-| `references/language-upgrades.md` | Python 3.9→3.13, Node 18→22, TypeScript 4→5, Go 1.20→1.23, Rust 2021→2024, PHP 8.1→8.4 | ~600 |
+| `references/framework-upgrades.md` | React 18→19, Next.js Pages→App Router, Vue 2→3, Laravel 10→13, Angular, Django upgrade paths | ~700 |
+| `references/language-upgrades.md` | Python 3.9→3.14, Node 18→26, TypeScript 4→6, Go 1.20→1.26, Rust 2021→2024, PHP 8.1→8.5 | ~650 |
 | `references/dependency-management.md` | Audit tools, update strategies, lock files, monorepo deps, supply chain security | ~550 |
 
 ## Staleness verifier
 
-This skill hardcodes specific framework/language target versions (React 19, Laravel 11, Python 3.12, Node 22, TypeScript 5, Go 1.22, Rust 2024, PHP 8.4). [`scripts/check-migrate-facts.py`](scripts/check-migrate-facts.py) guards them against silent drift:
+This skill hardcodes specific framework/language target versions (React 19, Laravel 13, Python 3.14, Node 26, TypeScript 6, Go 1.26, Rust 2024, PHP 8.5). [`scripts/check-migrate-facts.py`](scripts/check-migrate-facts.py) guards them against silent drift:
 
 ```bash
 # Structural (PR CI, no network): every catalogued target version still appears

+ 19 - 19
skills/migrate-ops/assets/migrate-facts.json

@@ -12,38 +12,38 @@
     },
     {
       "label": "Laravel",
-      "version": "11",
+      "version": "13",
       "where": ["description", "body"],
-      "pattern": "laravel[^\\n]*\\b11\\b",
-      "live": {"source": "endoflife", "product": "laravel", "compare": "major", "documented": "11"}
+      "pattern": "laravel[^\\n]*\\b13\\b",
+      "live": {"source": "endoflife", "product": "laravel", "compare": "major", "documented": "13"}
     },
     {
       "label": "Python",
-      "version": "3.12",
+      "version": "3.14",
       "where": ["description", "body"],
-      "pattern": "python[^\\n]*3\\.12\\b",
-      "live": {"source": "endoflife", "product": "python", "compare": "line", "documented": "3.12"}
+      "pattern": "python[^\\n]*3\\.14\\b",
+      "live": {"source": "endoflife", "product": "python", "compare": "line", "documented": "3.14"}
     },
     {
       "label": "Node",
-      "version": "22",
+      "version": "26",
       "where": ["description", "body"],
-      "pattern": "node[^\\n]*\\b22\\b",
-      "live": {"source": "endoflife", "product": "nodejs", "compare": "major", "documented": "22"}
+      "pattern": "node[^\\n]*\\b26\\b",
+      "live": {"source": "endoflife", "product": "nodejs", "compare": "major", "documented": "26"}
     },
     {
       "label": "TypeScript",
-      "version": "5",
+      "version": "6",
       "where": ["description", "body"],
-      "pattern": "typescript[^\\n]*\\b5\\b",
-      "live": {"source": "npm", "product": "typescript", "compare": "major", "documented": "5"}
+      "pattern": "typescript[^\\n]*\\b6\\b",
+      "live": {"source": "npm", "product": "typescript", "compare": "major", "documented": "6"}
     },
     {
       "label": "Go",
-      "version": "1.22",
+      "version": "1.26",
       "where": ["description", "body"],
-      "pattern": "go[^\\n]*1\\.22\\b",
-      "live": {"source": "endoflife", "product": "go", "compare": "line", "documented": "1.22"}
+      "pattern": "go[^\\n]*1\\.26\\b",
+      "live": {"source": "endoflife", "product": "go", "compare": "line", "documented": "1.26"}
     },
     {
       "label": "Rust",
@@ -51,14 +51,14 @@
       "where": ["description", "body"],
       "pattern": "rust[^\\n]*2024\\b",
       "live": null,
-      "_comment": "Rust 2024 is an EDITION (reached stable with Rust 1.85), not a semver major tracked on endoflife.date's product list. Live-checked nowhere; offline-only."
+      "_comment": "Rust 2024 is an EDITION (reached stable with Rust 1.85), not a semver major tracked on endoflife.date's product list. Still the newest edition as of 2026-07 (next expected 2027). Live-checked nowhere; offline-only."
     },
     {
       "label": "PHP",
-      "version": "8.4",
+      "version": "8.5",
       "where": ["description", "body"],
-      "pattern": "php[^\\n]*8\\.4\\b",
-      "live": {"source": "endoflife", "product": "php", "compare": "line", "documented": "8.4"}
+      "pattern": "php[^\\n]*8\\.5\\b",
+      "live": {"source": "endoflife", "product": "php", "compare": "line", "documented": "8.5"}
     }
   ]
 }

+ 25 - 1
skills/migrate-ops/references/framework-upgrades.md

@@ -325,7 +325,7 @@ npm test
 
 ---
 
-## Laravel 10 to 11
+## Laravel 10 to 13
 
 ### Pre-Upgrade Checklist
 
@@ -431,6 +431,30 @@ php artisan config:show
 php artisan route:list
 ```
 
+### Continuing to Laravel 12 and 13
+
+Upgrade one major at a time (11 → 12 → 13); both steps are deliberately light.
+
+**Laravel 12** (Feb 2025) — maintenance-focused: minimal breaking changes, dependency
+bumps, and new starter kits (React/Vue/Livewire). Most apps upgrade by updating
+`composer.json` constraints and re-running the suite.
+
+**Laravel 13** (Mar 2026) — stability-first with an AI/DX push:
+- **Requires PHP 8.3+** (supports through PHP 8.5) — upgrade the runtime first
+- Default cache and Redis key prefixes now use hyphenated suffixes — irrelevant if your
+  config files already pin these values, breaking if you shared a store across versions
+- New (opt-in): first-party Laravel AI SDK, native PHP attributes across models/jobs/
+  controllers/authorization, `Queue::route(...)` class-based queue routing, query-builder
+  vector similarity search (pgvector)
+- Laravel Shift remains the automated PR-based upgrade path
+
+```bash
+# Per major: bump constraint, update, test
+composer require laravel/framework:^13.0 --with-all-dependencies
+php artisan config:show cache   # verify key-prefix expectations
+php artisan test
+```
+
 ---
 
 ## Angular Version Upgrades

+ 159 - 13
skills/migrate-ops/references/language-upgrades.md

@@ -4,7 +4,7 @@ Detailed upgrade paths for major programming language version transitions.
 
 ---
 
-## Python 3.9 to 3.13
+## Python 3.9 to 3.14
 
 ### Python 3.10 (from 3.9)
 
@@ -140,6 +140,34 @@ rg "typing\.re\." .
 python3.13t script.py  # if built with --disable-gil
 ```
 
+### Python 3.14 (from 3.13)
+
+**Key Features Gained:**
+- Deferred evaluation of annotations by default (PEP 649/749) — inspect via `annotationlib`; `from __future__ import annotations` is no longer needed
+- Template strings / t-strings (PEP 750)
+- Free-threaded build officially supported (PEP 779 — still a separate build, no longer "experimental")
+- Multiple interpreters in the stdlib (`concurrent.interpreters`, PEP 734)
+- Zstandard compression (`compression.zstd`, PEP 784)
+- Safe external debugger interface (`sys.remote_exec`)
+
+**Breaking Changes:**
+- `asyncio.get_event_loop()` no longer creates a new event loop — use `asyncio.run()` or `get_running_loop()`
+- Long-deprecated `ast` aliases (`ast.Num`, `ast.Str`, `ast.Bytes`, ...) removed — use `ast.Constant`
+- Annotation-introspection code that reads `__annotations__` eagerly may see deferred semantics — migrate to `annotationlib`
+
+**Migration Commands:**
+```bash
+# Find eager-annotation assumptions
+rg "from __future__ import annotations" .   # now redundant (harmless to keep)
+rg "__annotations__" .                       # candidates for annotationlib
+
+# Find event-loop creation via the removed pattern
+rg "asyncio\.get_event_loop\(\)" .
+
+# Modernize syntax to the new floor
+pyupgrade --py314-plus **/*.py
+```
+
 ### Python Version Upgrade Summary
 
 | From → To | Key Action | Biggest Risk |
@@ -148,10 +176,11 @@ python3.13t script.py  # if built with --disable-gil
 | 3.10 → 3.11 | Replace `toml` with `tomllib`, enjoy speed boost | `smtpd` removal |
 | 3.11 → 3.12 | Remove `distutils`/`imp`, adopt type syntax | `distutils` full removal, sqlite3 adapter changes |
 | 3.12 → 3.13 | Remove deprecated stdlib modules | Large number of removed stdlib modules |
+| 3.13 → 3.14 | Adopt deferred annotations + t-strings | `asyncio.get_event_loop()` no longer creates a loop |
 
 ---
 
-## Node.js 18 to 22
+## Node.js 18 to 26
 
 ### Node.js 20 (from 18)
 
@@ -233,16 +262,48 @@ node --experimental-require-module app.js
 # Replace: chokidar/nodemon → node --watch
 ```
 
+### Node.js 24 (from 22)
+
+**Key Features Gained:**
+- `require()` of ESM modules enabled by default (no flag)
+- V8 13.6 — `Float16Array`, `RegExp.escape`, `Error.isError`, explicit resource management (`await using`)
+- `URLPattern` as a global
+- Permission model stable (flag renamed to `--permission`)
+- npm 11, Undici 7
+
+**Breaking Changes:**
+- Windows native builds drop MSVC (ClangCL toolchain) — affects native-addon build pipelines
+- Assorted deprecated API removals (`url.parse()` further discouraged — use `URL`)
+
+**Migration Commands:**
+```bash
+nvm install 24
+nvm use 24
+# FROM node:24-alpine
+
+npm rebuild                      # native modules against new ABI
+rg "require\(['\"]\./.*\.mjs" .  # spots that relied on require(esm) flags
+```
+
+### Node.js 26 (from 24)
+
+Node 26 is the Current line (April 2026); it enters Active LTS in October 2026. For
+production, upgrade LTS-to-LTS: 22 → 24 now, 24 → 26 once 26 is LTS. The mechanics are
+the same as every even-major bump: rebuild native modules, re-run the test suite on the
+new V8, and update `FROM node:26` images plus CI matrices when you cut over.
+
 ### Node.js Version Upgrade Summary
 
 | From → To | Key Action | Biggest Risk |
 |-----------|-----------|--------------|
 | 18 → 20 | Rebuild native modules, test URL parsing | Stricter URL validation, loader hooks off-thread |
 | 20 → 22 | Rebuild native modules, check glibc version | Native module compatibility, header validation |
+| 22 → 24 | Adopt require(esm), permission model | Native-addon toolchain change on Windows |
+| 24 → 26 | LTS-to-LTS bump when 26 enters LTS (Oct 2026) | Riding the Current line before LTS |
 
 ---
 
-## TypeScript 4.x to 5.x
+## TypeScript 4.x to 6.0
 
 ### TypeScript 5.0 (from 4.9)
 
@@ -295,27 +356,65 @@ rg '"suppressExcessPropertyErrors"' tsconfig.json
 | **5.6** | Iterator helper methods, `--noUncheckedSideEffectImports` |
 | **5.7** | `--rewriteRelativeImportExtensions`, `--target es2024` |
 
+### TypeScript 6.0 (from 5.x)
+
+The last release on the JavaScript-based compiler — 6.0 modernises defaults as the
+bridge to the native (Go) compiler in TypeScript 7.
+
+**Key Features Gained:**
+- `es2025` target/lib with types for Temporal, `Map.getOrInsert`, `RegExp.escape`
+- Better inference for `this`-less functions; `#/` subpath-import support
+- `--stableTypeOrdering` flag to ease 6.0 → 7.0 migration diffing
+- Large-monorepo `tsc --watch` rebuilds significantly faster
+
+**Breaking Changes:**
+- `strict: true` is now the **default** — configs that never set it surface new errors
+- Defaults changed: `module: esnext`, `target: es2025`
+- Removed: `moduleResolution: classic`; `module: amd/umd/system/none`; minimum `target` is ES2015 (`es5` deprecated)
+- `esModuleInterop` / `allowSyntheticDefaultImports` can no longer be set to `false`
+- Namespace-with-class merging requires explicit `export`
+
+**Migration Commands:**
+```bash
+npm install -D typescript@6
+
+# Find options 6.0 removed or hard-wires
+rg '"moduleResolution":\s*"classic"' tsconfig.json
+rg '"module":\s*"(amd|umd|system|none)"' tsconfig.json
+rg '"esModuleInterop":\s*false' tsconfig.json
+rg '"target":\s*"es5"' -i tsconfig.json
+
+# Surface the strict-by-default delta before committing to it
+npx tsc --noEmit
+```
+
 ### Migration Strategy
 
 ```
 TypeScript version upgrade approach:
-├─ Minor version (5.x → 5.y)
+├─ Minor version (x.y → x.z)
 │  └─ Generally safe, just update and fix new errors
-│     npm install -D typescript@5.y
+│     npm install -D typescript@latest
 │     npx tsc --noEmit
-└─ Major version (4.x → 5.x)
-   ├─ 1. Update tsconfig.json (remove deleted options)
-   ├─ 2. Install typescript@5
-   ├─ 3. Run tsc --noEmit, fix errors
-   ├─ 4. Decide on decorator strategy (legacy vs ECMAScript)
-   └─ 5. Consider adopting moduleResolution: "bundler"
+├─ Major version (4.x → 5.x)
+│  ├─ 1. Update tsconfig.json (remove deleted options)
+│  ├─ 2. Install typescript@5
+│  ├─ 3. Run tsc --noEmit, fix errors
+│  ├─ 4. Decide on decorator strategy (legacy vs ECMAScript)
+│  └─ 5. Consider adopting moduleResolution: "bundler"
+│
+└─ Major version (5.x → 6.0)
+   ├─ 1. Set strict: true explicitly and fix errors BEFORE upgrading
+   ├─ 2. Replace removed module/moduleResolution options
+   ├─ 3. Install typescript@6, run tsc --noEmit
+   └─ 4. Pin the target you actually ship (defaults moved to es2025)
 ```
 
 ---
 
-## Go 1.20 to 1.23
+## Go 1.20 to 1.26
 
 ### Go 1.21 (from 1.20)
 
@@ -403,6 +502,27 @@ rg "\.Stop\(\)" . --glob "*.go"  # Review timer stop behavior
 rg "\.Reset\(" . --glob "*.go"   # Review timer reset behavior
 ```
 
+### Go 1.24 – 1.26 (from 1.23)
+
+**Key Features Gained:**
+- **1.24**: generic type aliases; `tool` directives in go.mod (tracked tool deps); `os.Root` (filesystem-scoped file access); Swiss-table map implementation (runtime perf); `weak` package; `runtime.AddCleanup` (successor to `SetFinalizer`)
+- **1.25**: container-aware `GOMAXPROCS` (respects cgroup CPU limits); `testing/synctest` for concurrent-code tests; experimental green-tea GC
+- **1.26**: current stable line — as with every Go release, review the release notes for `go vet`/runtime deltas; language changes remain rare and gated on the `go` directive
+
+**Breaking Changes:**
+- Effectively none at the language level (Go 1 compatibility promise); behavior deltas are gated on the `go` directive version in go.mod, so bumps activate deliberately
+
+**Migration Commands:**
+```bash
+go mod edit -go=1.26
+go mod tidy
+go vet ./...
+govulncheck ./...
+
+# Adopt tool directives (1.24+) — replaces tools.go pattern
+go get -tool golang.org/x/tools/cmd/stringer
+```
+
 ### Go Version Upgrade Summary
 
 | From → To | Key Action | Biggest Risk |
@@ -410,6 +530,7 @@ rg "\.Reset\(" . --glob "*.go"   # Review timer reset behavior
 | 1.20 → 1.21 | Update go.mod toolchain, adopt slog | Toolchain directive in go.mod |
 | 1.21 → 1.22 | Enjoy loop variable fix, adopt enhanced routing | Loop variable semantics (usually fixes bugs) |
 | 1.22 → 1.23 | Replace x/exp packages, adopt iterators | Timer/Ticker behavior change |
+| 1.23 → 1.26 | Bump go directive stepwise, adopt tool directives + os.Root | Runtime perf deltas (Swiss maps, GC) in hot paths |
 
 ---
 
@@ -471,7 +592,7 @@ cargo doc --no-deps  # check documentation builds
 
 ---
 
-## PHP 8.1 to 8.4
+## PHP 8.1 to 8.5
 
 ### PHP 8.2 (from 8.1)
 
@@ -580,6 +701,30 @@ vendor/bin/rector process src --set php84
 rg "function \w+\([^)]*\w+ \$\w+ = null" src/ --glob "*.php"
 ```
 
+### PHP 8.5 (from 8.4)
+
+**Key Features Gained:**
+- Pipe operator `|>` for left-to-right call chaining
+- `array_first()` and `array_last()`
+- `#[\NoDiscard]` attribute (warn when a return value is ignored)
+- Fatal errors now include backtraces
+- `clone with` — update readonly/other properties during clone
+
+**Breaking Changes:**
+- Minor-release discipline: mostly new deprecations rather than removals; run the suite with deprecations surfaced (`error_reporting(E_ALL)`) before and after
+
+**Migration Commands:**
+```bash
+vendor/bin/rector process src --set php85
+
+# Adopt the pipe operator where nested calls hurt readability
+# Old: trim(strtolower($name))
+# New: $name |> strtolower(...) |> trim(...)
+
+# Replace reset()/end() misuse for first/last element
+rg "\breset\(|\bend\(" src/ --glob "*.php"   # candidates for array_first/array_last
+```
+
 ### PHP Version Upgrade Summary
 
 | From → To | Key Action | Biggest Risk |
@@ -587,6 +732,7 @@ rg "function \w+\([^)]*\w+ \$\w+ = null" src/ --glob "*.php"
 | 8.1 → 8.2 | Fix dynamic properties, deprecation warnings | Dynamic properties deprecated |
 | 8.2 → 8.3 | Adopt typed constants, #[Override] | array_sum/array_product behavior |
 | 8.3 → 8.4 | Adopt property hooks, asymmetric visibility | Implicit nullable deprecation |
+| 8.4 → 8.5 | Adopt pipe operator, array_first/array_last | New deprecations surfacing in dependencies |
 
 ---