What problem does it solve? Migrating an existing Apple/Swift Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API is risky: macro support varies across expo-modules-core versions, async threading semantics changed architecturally, and a verbatim rewrite can silently break the JavaScript contract. This Skill provides a verified, incremental migration workflow that preserves the module's observable JS/TypeScript API. ## Core Features & Use Cases - Contract-first migration: Inventories every exported member (functions, properties, events, records, shared objects, lifecycle hooks) and treats the existing JS/TS surface and tests as the compatibility contract. - Compatibility verification: Checks the checked-out expo-modules-core source for actual macro and runtime support before migrating each member, instead of trusting SDK version numbers. - Mixed-mode fallback: Classifies members as Migrate, Keep in DSL, or Blocked, and supports incremental co-existence of @ExpoModule macros with a remaining 1.0 definition() block. - Use Case: You maintain an Expo module with AsyncFunction, Events, and Record definitions on SDK 57. Use this Skill to convert them to @JS, @Event, and @Record macros while preserving event wire names, record requiredness, and off-JS-thread execution for blocking work. ## Quick Start Use the expo-migrate-module skill to migrate this Expo module's Swift implementation from the 1.0 definition DSL to the 2.0 macro API without changing its JavaScript contract.