Project version check + migration API (Unity-style)

See ADR-0012 for the full technical decisions.

Why

project.json's turian_version is currently round-tripped but never checked. Breaking changes to on-disk project data (scene JSON shape, component ABI, cooked-asset formats) have so far been handled ad hoc — #45 (closed)'s material_guidmaterial_guids rename needed a deprecated-field-plus-warning fallback and a one-off CLI command, invented on the spot, with no discoverable home for the next breaking change.

Scope

  • Compare project.json's turian_version against the running engine's version on project open (major always, minor via a Settings toggle, default on).
  • Studio dialog on open: project older → Cancel / Update / Migrate-and-Update (pre-flight lists every pending migration + any manual steps); project newer → Cancel / warned Open Anyway.
  • CLI equivalent: turian-cli migrate <project-path> [--yes|--no] [--dry-run], unattended-capable for CI.
  • editor/project/migrations/: one file per version bump, hand-maintained discovery list (no comptime reflection), idempotent: bool advisory metadata.
  • Fold the existing scene material_guid fixup (turian-cli migrate, shipped ahead of this issue) in as the framework's first migration entry.

Suggested phasing

  1. Migration runner + registry + CLI (migrate command, flags, dry-run).
  2. Studio version-check dialog on project open.

Not scoped here: migrating projects from other engines (Unity/Unreal/etc.) — this is Turian-project-to-newer-Turian-version only.