What problem does it solve? Migrating an existing Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API is error-prone: macro defaults can silently rename events, change record requiredness, or move blocking work onto the JS thread, breaking the JavaScript contract. This Skill provides a verified, incremental migration workflow that preserves the observable JS/TypeScript API. ## Core Features & Use Cases - Contract-preserving migration: Inventories every exported member (functions, properties, constants, events, records, shared objects) and migrates them group by group while keeping JS names, arity, defaults, and sync/async behavior stable. - Compatibility verification: Checks the actually installed expo-modules-core and macro declarations instead of trusting SDK version numbers, classifying each member as Migrate, Keep in DSL, or Blocked. - Mixed-mode support: Allows @ExpoModule to coexist with a non-empty definition() so unsupported members (views, queue-pinned functions, sync events) stay safely on the 1.0 DSL. - Use Case: You maintain an Expo module written with Name(), Function(), AsyncFunction(), and Events() and want to adopt @ExpoModule, @JS, @Event, and @Record incrementally without breaking existing JS call sites or tests. ## Quick Start Use the expo-migrate-module skill to migrate this module's Swift implementation from the 1.0 definition DSL to the 2.0 macro API without changing its JavaScript contract.