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 error-prone: macro defaults can silently rename events, change record requiredness, or move blocking work onto the JS thread. This Skill performs the migration incrementally while preserving the module's existing JavaScript and TypeScript contract. ## Core Features & Use Cases - Contract-first migration: Inventories every exported member (functions, properties, constants, events, records, shared objects, lifecycle hooks) and treats the current JS/TS surface as the compatibility contract. - Verified 2.0 surface: Checks the checked-out expo-modules-core and macro declarations before migrating, classifying each member as Migrate, Keep in DSL, or Blocked instead of assuming SDK-version support. - Safe mixed mode: Supports incremental migration where @ExpoModule coexists with a non-empty definition() for unsupported members, with guidance to open tracking issues on expo/expo for gaps. - Use Case: Convert a Swift module using Name, Function, AsyncFunction, Property, Constant, Events, and OnStartObserving into @ExpoModule, @JS, @Event, and @Record equivalents, then verify with builds, native tests, and the example app. ## 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.