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 risky: macro support varies across expo-modules-core versions, async threading semantics changed architecturally, and a careless 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 as the compatibility contract. - Compatibility verification: Checks the checked-out expo-modules-core for actual macro and runtime support before migrating each capability, instead of trusting SDK version numbers. - Mixed-mode fallback: Keeps unsupported or blocked members (views, static shared-object members, queue-pinned functions) in the 1.0 DSL alongside the migrated @ExpoModule, with guidance on tracking issues for gaps. - Use Case: You maintain an Expo module with AsyncFunction, Events, and Record definitions on SDK 57 and want to adopt @ExpoModule, @JS, @Event, and @Record macros without changing any JS call sites or moving blocking work onto the JS thread. ## Quick Start Ask the agent to migrate this Expo module's Swift implementation from the 1.0 definition DSL to the 2.0 macro API while preserving its JavaScript contract.