test-native-extension

Installation
SKILL.md

/test-native-extension

Runs the 4-layer validation ladder for a third-party control repo — the one that ships as a .ppmplugin binary bundle, not as a TypeScript extension. Layers 1–4 are automated; Layer 5 is interactive (requires a real device or simulator and the Companion PCF deployed to a test environment).

Layer What Mode Speed Requires
0 Holistic contract consistency (native ↔ manifest ↔ PCF cross-check) Automated, warn-only seconds at least a native module on disk
1 Native-source structure asserts (Android getName() ↔ iOS +moduleName ↔ manifest) Automated, grep/parse seconds android/ and/or ios/
2 Manifest validation (ppmplugin-format §4 rules) Automated seconds (skipped only if no manifest on disk) ./manifest.json (committed; else staged copy)
3 Native-source contract asserts (request/response/error grep cross-check) Automated seconds native module(s)
4 PCF compile (npm run build in pcf/<Pascal>PCF/) Automated seconds (after first install) pcf/<Pascal>PCF/ must exist (skipped otherwise)
5 Manual device / simulator end-to-end Recipe-only — skill prints, user runs on own time 5–10m, off-skill pcf/ must exist + PCF deployed

Run order is layer-by-layer for Layers 1–4. Stop on the first failure in the automated layers. Layer 5 is not gated by the skill — it prints the device recipe and exits; the user runs it on their own time and updates .extension-state.md manually.

What this skill does NOT validate: native code compilation into a loadable DEX / framework. That's the job of /build-android-binary and /build-ios-binary — they run the real Gradle / xcodebuild toolchain against the pinned RN version and surface the real compiler error. Standalone pod lib lint and ./gradlew assembleDebug from this skill would give false-confidence (they resolve dependencies from public CDN/maven, not against the wrap host's pinned versions). This skill is the structural pre-flight that runs in seconds with no toolchain — it asserts the native source is shaped correctly (right base class, right symbols, the Android getName() ↔ iOS +moduleName ↔ manifest agreement) so the build skills don't fail late on a fixable-in-seconds mistake. There is no TypeScript / INativeExtension layer in this track to type-check — a native-only .ppmplugin bundle dispatches straight to NativeModules.<nativeModule>.<method> (ppmplugin-format §2Runtime dispatch contract).


Installs
34
GitHub Stars
889
First Seen
Aug 25, 2026
test-native-extension — microsoft/power-platform-skills