generate-native-extension
Read the approved PRD.md and generate the native sources for a third-party PAM control (the compiled `.ppmplugin` track) — iOS Obj-C `<Pascal>Module` plus optional system-frameworks podspec, Android Kotlin `<Pascal>Module` with build.gradle, AndroidManifest and ReactPackage, a dev-only private packa…
Install / Use
npx skills add microsoft/power-platform-skills --skill generate-native-extensionInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
LegalSupported Platforms
Our assessment of generate-native-extension
generate-native-extension scores 85/100 on our quality scale, 118th of 207 Legal skills we index.
Its SKILL.md is 72 KB long, well organised into 31 sections with 6 code examples: long enough that it reads more like full documentation than a focused instruction file, which agents can find harder to follow.
It has 919 GitHub stars, a meaningful sign that others use it.
Maintenance, license and trust
- The repository was last updated 12 days ago, so generate-native-extension is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
generate-native-extension compared with similar skills
All 4 of these similar skills score higher than generate-native-extension; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| generate-native-extension (this skill)by microsoft | 85 | 919 | 12d ago | SKILL.md |
| headroomby headroomlabs-ai | 100 | 74.5k | today | CLAUDE.md |
| rufloby ruvnet | 100 | 74.0k | today | MCP Server |
| algorithmic-artby anthropics | 100 | 177.9k | 14d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 14d ago | SKILL.md |
Frequently asked questions
- How do I install generate-native-extension?
- Run
npx skills add microsoft/power-platform-skills --skill generate-native-extension. The install tabs above show the steps for each supported agent. - Which AI agents does generate-native-extension work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is generate-native-extension safe to use?
- It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is generate-native-extension still maintained?
- The repository was last updated 12 days ago, so generate-native-extension is actively maintained.
Skill content
View source on GitHubname: generate-native-extension
description: "Read the approved PRD.md and generate the native sources for a third-party PAM control (the compiled .ppmplugin track) — iOS Obj-C <Pascal>Module plus optional system-frameworks podspec, Android Kotlin <Pascal>Module with build.gradle, AndroidManifest and ReactPackage, a dev-only private package.json (react + react-native devDeps for the builds), and the committed ./manifest.json dispatch contract the PCF and build stage both read. No TypeScript INativeExtension layer — the contract is the manifest plus the native modules' dispatch surface. Emits the layout in shared/repo-layout.md and generates substantially complete native code (compiled later by /build-android-binary and /build-ios-binary, not here). Local only — writes files, runs no git and touches no remote or feed. PCF is generated by /generate-pcf-companion; the bundle is built by /generate-ppmplugin."
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
model: opus
/generate-native-extension
Reads PRD.md in the working directory and writes the native sources for a third-party PAM control following the layout in shared/repo-layout.md. This is the native-only (compiled .ppmplugin) track — there is NO TypeScript INativeExtension / handleMessageAsync layer; the wrap host dispatches straight to NativeModules.<Pascal>Module.<method> per the manifest's receivers contract (see shared/ppmplugin-format.md §2). The output is substantially complete native code so the engineer starts at customizing OS-specific code, not writing boilerplate.
This skill writes the native module half of the repo (ios/, android/, optional podspec, dev-only package.json) and the committed ./manifest.json — the dispatch-contract source of truth. The manifest is authored here, alongside the native code it describes, because every field in it is derived from the names this scaffold emits (getName(), the @ReactMethod list, the package class); authoring it now means the Companion PCF (/generate-pcf-companion) reads a real contract instead of re-deriving one, so the composite key <name>/<receiver> can't drift between the PCF and the module. The build stage /generate-ppmplugin-manifest (inside /generate-ppmplugin) then validates + reconciles + stages this manifest rather than authoring it from scratch. The Companion PCF is generated separately by /generate-pcf-companion because it requires pac CLI and a different toolchain.
Step 1 — Read the shared docs and the PRD
Before any write:
-
Apply the per-skill minimal prereq policy (
shared-instructions.md §1.5). This track is self-contained (shared-instructions §0a) and uses only the working tree and public package registries. This skill needs no toolchain to write the files — optionally Node + pnpm to seed the dev-onlypackage.json's devDeps from the public npm registry (used later by/build-android-binary//build-ios-binary, not here). Step 4's smoke check is a structural self-check — it does NOT compile anything. Run the/generate-native-extensioncheck fromprereq-check.md(git required; Node/pnpm optional — there is no "baseline" check in this self-contained track).Print the prereq status as a visible block per
shared-instructions.md §9.2before continuing:━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Prereq check — /generate-native-extension ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🟢 ✓ git installed 🟢 ✓ Node 20+ installed (optional — only to seed package.json devDeps from public npm) 🟢 ✓ pnpm installed (optional — same) 🟢 checks passed. Ready to proceed.If
gitis missing, print its→ Fix:line and STOP. Node/pnpm are optional here — if absent, note them asn/a (devDeps seed deferred to build skills)rather than failing. -
Read
shared/naming-conventions.md— the derived-identifier table is canonical, including theModule-suffix rule for the native module symbol. Derive all file paths and class names from §2 of the PRD using that table; do not invent. -
Read
shared/ppmplugin-format.md— §2 (the runtime dispatch contract:<name>/<receiver>→NativeModules.<nativeModule>.<method>, where<nativeModule>=<Pascal>Module) and §4 (the upload-compatibility checks that the native module symbol must satisfy). The native modules this skill emits dispatch straight off that contract — there is NO TSINativeExtensionlayer mediating; see §3.3 below. -
Read
shared/repo-layout.md— the exact tree, file list, andpackage.jsonshape to emit. -
Read
./PRD.mdfrom the current working directory. If missing or empty, STOP withBLOCKED: PRD.md not found — run /design-native-extension-feature first. -
Read
./.extension-state.mdif present. If the phase showsscaffold-complete, ask the user whether to regenerate (with confirm — overwrites files), resume (only fill in missing files), or abort.
The structural patterns this skill needs to emit (iOS module shape, Android module shape, podspec, package.json) are fully prescribed in this SKILL.md (§3.1–§3.7) and in shared/repo-layout.md. Do NOT fetch the reference extension repo at runtime — its lessons are already encoded here, and fetching it would risk copying PDF-specific code into a non-PDF extension.
If any read fails, STOP and report which file is missing.
Step 2 — Confirm the scaffold plan with the user
Print a concise summary derived from the PRD, then gate on approval before any write.
Scaffold plan
─────────────
Repo: powerapps-<kebab>
package: <kebab>-control (dev-only, private — not published)
Class: <Pascal>
Native module: <Pascal>Module → NativeModules.<Pascal>Module (== ./manifest.json receivers[].nativeModule)
iOS class: RCT<Pascal>Module (+moduleName returns <Pascal>Module)
Android module: <Pascal>Module (com.powerapps.<lower>)
Podspec: <Pascal>Extension.podspec (optional, system-frameworks-only)
Dispatch contract: ./manifest.json (committed — written by this skill; read by the PCF + build stage)
Frameworks
iOS: <list from ARCHITECTURE §1.2>
Android: <list from ARCHITECTURE §1.3>
Operations (<count from PRD §4>): <comma-separated names>
Pattern: <one-shot | streaming | two-way>
Error codes: <count from ARCHITECTURE §5>
Target directory: <cwd> (writes <N> files; no existing files will be overwritten without confirm)
Distribution: the compiled `.ppmplugin` bundle (built later by /generate-ppmplugin). This skill is purely local — no remote, no feed, no registry.
Use AskUserQuestion (single-select):
Proceed with this scaffold?
- Yes — generate the files (recommended): write the control's sources into the current directory. This skill does not run git — no
git init, no staging, no commit (the control lives in your existing repo; you commit when you're ready).- Edit the PRD first — exit; user re-runs
/design-native-extension-featureto adjust.- Cancel
Step 3 — Generate the files
Write files in the order below. After each top-level group, print a one-line progress update (✓ wrote ios/ (3 files)). Don't dump file contents — the user sees the diff via the IDE.
Every file path is relative to the current working directory (the repo root). Names are derived per shared/naming-conventions.md.
3.1 Top-level repo files
Write:
-
.gitignore— emit exactly the following entries:- Node:
node_modules/,dist/,build/ .ppmpluginbuild staging — MANDATORY:ppmplugin/(the gitignored staging dir where/generate-ppmpluginwrites the staged copy of the manifest, the binaries, and the final bundle — never committed. NOTE: the committed source-of-truthmanifest.jsonlives at the repo root (./manifest.json, written below), NOT underppmplugin/— do not gitignore it; seeshared/ppmplugin-format.md §1)- OS / editor:
.DS_Store,.idea/,.vscode/ - Claude Code local state (per-user, not shared):
.claude/ - Env:
.env*(but allow!.env.example) - iOS build:
Pods/,*.xcworkspace,DerivedData/,*.xcodeproj/xcuserdata/ - Android build:
*.iml,.gradle/,local.properties,captures/,.externalNativeBuild/,.cxx/ - PCF build dirs only — NOT the
pcf/folder itself; source files (index.ts,ControlManifest.Input.xml,package.json,pcfconfig.json, etc.) stay tracked:pcf/**/{out,Solutions,node_modules,obj,bin,generated}/ - Test-harness artifacts:
test-harness/*.msapp - Skill-generated backups:
*.bak.*(skills that replace tracked content may save a timestamped backup; those are intentionally local-only) - Design-time previews:
.pcf-preview/(HTML mockup of the PCF as it appears in Canvas Studio — written by/design-native-extension-featureStep 8.0 for visual review; regenerated each design iteration; not a source-of-truth artifact)
- Node:
-
package.json— per the dev-only shape inshared/repo-layout.md§"package.jsonshape (dev-only)". Fill inname(a plain local name, e.g.<kebab>-control) anddescriptionfrom the PRD.versionstarts at0.1.0. Set"private": true.This manifest is never published — no
publishConfig, no feed registry, nofilesarray, nomain/types, no.npmrc. Its only job is to pin the React Native version the native builds compile against:{ "name": "<kebab>-control", "version": "0.1.0", "private": true, "description": "<from PRD §1>", "devDependencies": { "react": "18.2.0", "react-native": "0.79.7" } }The
react-nativedevDep supplies the iOS headers (/build-ios-binary) and pins thereact-androidcoordinate the Android build resolves (/build-android-binary); add any other build-time devDeps the native modules need. All deps resolve from the public npm registry — there is no internal feed. -
manifest.json(repo root, committed — the dispatch-contract source of truth) — author it now from the names this scaffold emits, pershared/ppmplugin-format.md§2 (schema) + §3 (derivation). This is the single artifact the Companion PCF (/generate-pcf-companion) and the build stage (/generate-ppmplugin-manifest) both read; authoring it here, next to the native code it describes, is what keeps the composite key<name>/<receiver>from drifting between the PCF and the module. Fields:name=kebab(<Pascal>)of the class name (not the repo/capability name) — e.g. classPenInput→pen-input.version= thepackage.jsonversion (0.1.0).abi={ "compatibleShells": ">=1.0.0", "builtAgainst": "1.0.0" }(default; the build skills don't change it).receivers[]= a single entry{ "name": "<Pascal>Extension", "nativeModule": "<Pascal>Module", "methods": [<every @ReactMethod / RCT_EXPORT_METHOD name emitted in §3.4 / §3.5>] }.nativeModuleMUST equal AndroidgetName()and the iOS+moduleNamereturn value — theModule-suffixed name (the reserved-name dodge).entrypoints= declare every platform this scaffold generated (so the committed manifest is the full contract; the build stage trims it to the shipped target):- Android →
"android": { "dex": "<Pascal>Plugin.dex", "packageClass": "com.powerapps.<lower>.<Pascal>Package" } - iOS → `"ios": { "framework"
- Android →
Truncated for display — read the full file on GitHub.
Related Skills
headroom
74.5kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
ruflo
74.0k🌊 The original agent harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, federation, vector RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
pptx
177.9kUse this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an em…
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
