generate-ppmplugin-manifest
Validate, reconcile to the chosen target(s), and stage the `manifest.json` for a `.ppmplugin` bundle. In the normal flow the committed `./manifest.json` already exists (authored by /generate-native-extension), so this stage reads it, runs the plugin's upload-compatibility checks locally as a pre-fli…
Install / Use
npx skills add microsoft/power-platform-skills --skill generate-ppmplugin-manifestInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
MarketingSupported Platforms
Our assessment of generate-ppmplugin-manifest
generate-ppmplugin-manifest scores 85/100 on our quality scale, 407th of 596 Marketing skills we index.
Its SKILL.md is 19 KB long, well organised into 8 sections with 3 code examples: a thorough specification that gives an agent plenty to work with.
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-ppmplugin-manifest 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-ppmplugin-manifest compared with similar skills
All 4 of these similar skills score higher than generate-ppmplugin-manifest; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| generate-ppmplugin-manifest (this skill)by microsoft | 85 | 919 | 12d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 92.4k | 21d ago | CLAUDE.md |
| algorithmic-artby anthropics | 100 | 177.9k | 14d ago | SKILL.md |
| pptxby anthropics | 100 | 177.9k | 14d ago | SKILL.md |
| designby nextlevelbuilder | 100 | 130.2k | 15d ago | SKILL.md |
Frequently asked questions
- How do I install generate-ppmplugin-manifest?
- Run
npx skills add microsoft/power-platform-skills --skill generate-ppmplugin-manifest. The install tabs above show the steps for each supported agent. - Which AI agents does generate-ppmplugin-manifest 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-ppmplugin-manifest 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-ppmplugin-manifest still maintained?
- The repository was last updated 12 days ago, so generate-ppmplugin-manifest is actively maintained.
Skill content
View source on GitHubname: generate-ppmplugin-manifest
description: "Validate, reconcile to the chosen target(s), and stage the manifest.json for a .ppmplugin bundle. In the normal flow the committed ./manifest.json already exists (authored by /generate-native-extension), so this stage reads it, runs the plugin's upload-compatibility checks locally as a pre-flight gate (name regex, canonical prefix, known incompatible names, method and identifier shapes), reconciles entrypoints down to the platform(s) you ship, and writes the gitignored staged copy ppmplugin/staging/manifest.json that /assemble-ppmplugin zips. If no committed manifest exists (a hand-authored module) it falls back to deriving every field from the class name and Android module source, writing both the committed file and the staged copy. No toolchain — pure read, validate, write. Target-aware. Run after the native module exists, before the build skills."
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, AskUserQuestion, Skill
model: sonnet
/generate-ppmplugin-manifest
Stages the manifest.json that goes inside a .ppmplugin bundle — the small descriptor the wrap runtime and upload service read to identify the plugin and route calls into it. In the normal flow the committed ./manifest.json already exists (authored by /generate-native-extension next to the code it describes); this stage's job is to validate it, reconcile its entrypoints to the shipped target(s), and write the staged build copy ppmplugin/staging/manifest.json. It is the "get the strings right" gate: it runs instantly, needs no build tools, and catches common upload failures before any Android build. If the repo has no ./manifest.json (a hand-authored native module that skipped the scaffold), this stage authors it from source as a fallback — see Step 2.
Read shared/ppmplugin-format.md — it is the source of truth for the schema, the derivation table, and the validation rules this skill enforces.
Two manifests, one contract. ./manifest.json (repo root, committed) is the source-of-truth contract — it declares every platform the module supports. ppmplugin/staging/manifest.json (gitignored) is the build copy this stage produces — same contract, but entrypoints trimmed to the platform(s) actually being shipped. The build/assemble skills only ever read the staged copy; the committed root file is what the PCF and humans read.
What this skill does NOT do
- Does not compile anything — no Gradle, no DEX. That's
/build-android-binary. - Does not zip the bundle — that's
/assemble-ppmplugin. - Does not verify a declared platform's binary actually exists — it stages the intended
entrypoints;/assemble-ppmpluginreconciles them against the binaries actually staged and gates on any mismatch. - Does not rewrite the committed
./manifest.jsonon the normal path — it reads it. It only writes./manifest.jsonin the fallback case (no committed manifest existed). It never touchessrc/,ios/,android/, PRD, orpackage.jsonbeyond reading them.
Step 1 — Read shared docs + prereq block
- Read
shared/shared-instructions.md,shared/naming-conventions.md, andshared/ppmplugin-format.md. - This skill does no installs / auth / network. Print the zero-prereq block (per shared-instructions §9.2):
Prereq check — /generate-ppmplugin-manifest: skipped (skill does no installs / auth / network — failures surface at validation).
- Confirm the working directory is a third-party-control repo: a
package.json(the dev-only, private, plain<kebab>-controlname — NOT a published@powerapps/extension-*scope; this track ships a binary, not an npm package — seerepo-layout.md) and anandroid/and/orios/native module exist. If not, STOP withNEEDS_CONTEXT: not a third-party-control repo (no package.json / native module). - Read
.extension-state.md— if it carries a## ppmplugin (third-party controls)block, note the last target choice and last manifest write (the re-run mode below uses them).
Step 1.5 — Locate the source manifest (which mode are we in?)
This stage has two modes, decided by whether the committed ./manifest.json exists:
-
Validate-and-stage mode (the normal flow).
./manifest.jsonexists at the repo root (authored by/generate-native-extension). This is the source of truth — do not re-author it. Read it, validate it (Step 3), reconcile itsentrypointsto the chosen target (Step 2 → Target only), and write the staged copy (Step 4). Step 2's field-derivation is skipped — the contract is already authored; you're verifying and staging it, not regenerating it. (Optionally re-derivemethodsfrom the Android module source and, if they've drifted from./manifest.json— e.g. a@ReactMethodwas added by hand after scaffold — surface the diff and offer to update the committed file; never silently rewrite it.) -
Author-from-source mode (fallback). No
./manifest.jsonexists — a hand-authored native module that skipped the scaffold. Derive every field mechanically from source (Step 2 in full), then write both the committed./manifest.jsonand the staged copy (Step 4).
Re-run within a build session. If the staged copy ppmplugin/staging/manifest.json already exists from a prior run, don't blindly overwrite — diff the target/entrypoints against the committed source and ask via AskUserQuestion: Update (re-stage from the current ./manifest.json + target) / Keep as-is (report and stop). Default the target to the prior choice in .extension-state.md; don't re-ask an answered question.
Step 2 — Determine target(s); derive fields only in author-from-source mode
The structure preflight + target selection below run in both modes (you always need to know which platforms are viable and which to ship). The field-derivation sub-section (items 1–6 + the compute block) runs only in author-from-source mode (Step 1.5) — in the normal validate-and-stage mode the fields already live in ./manifest.json; read them from there and skip derivation, keeping only the target choice.
First, run a structure preflight. The ppmplugin path expects the canonical PAM-extension layout — the shape /generate-native-extension produces (see shared/repo-layout.md). A hand-rolled, foreign, or drifted repo may be missing pieces; flag exactly what, here and now, rather than failing later with a cryptic Gradle/Xcode error or a silently-wrong manifest. Print a visible ✓/✗ block:
- Common:
package.json(dev-only<kebab>-controlname — there is no@powerapps/extension-*scope and nosrc/TS layer in this track); class name resolvable from the native module (android/.../<Pascal>Module.kt/ios/RCT<Pascal>Module.m),./manifest.json, or.extension-state.md. - Android (if
android/present):android/build.gradle; a Kotlin module class extendingReactContextBaseJavaModulewith anoverride fun getName(); aReactPackageclass; ≥1@ReactMethod. - iOS (if
ios/present):ios/RCT<Pascal>Module.hdeclaring<RCTBridgeModule>;.mwith+ (NSString *)moduleName(NOTRCT_EXPORT_MODULE) and ≥1RCT_EXPORT_METHOD.
A platform whose structure is incomplete is not a valid target — exclude it and say which element is missing. If neither platform is structurally complete, STOP with NEEDS_CONTEXT: repo doesn't match the expected PAM-extension layout — missing <list> pointing at shared/repo-layout.md. (Working on a staged copy protects the source; it does NOT make a missing module appear — that's what this preflight is for.)
Then determine which platform(s) this bundle targets (only from the structurally-complete ones) — it controls which entrypoints get declared:
- Confirm via
AskUserQuestion: Android-only / iOS-only / Both — offer only the targets that passed the preflight. Default to what's present, or — on a re-run in Update mode — to the prior target recorded in.extension-state.md. - Note availability:
/build-android-binaryis stable;/build-ios-binaryis v0 (Mac-only; known limitation: its React-Core weak-link config still needs validation against a live PAM/wrap shell). If the user targets iOS/Both, the manifest declaresentrypoints.ios;/assemble-ppmpluginwill still gate if the iOS binary isn't staged at packaging time.
Then derive fields from the actual files, not from assumptions (author-from-source mode only — in validate-and-stage mode skip to Step 3 with the fields read from ./manifest.json):
-
Class name
<Pascal>— from the native module (the Android<Pascal>Module.ktfilename / itsgetName()="<Pascal>Module", or the iOSRCT<Pascal>Module), or the.extension-state.mdIdentity block. There is nosrc/<Pascal>Extension.tsin this track. This is the basis forname,nativeModule,receivers[].name. -
version—package.jsonversion. -
nativeModule— read the Android module'soverride fun getName(): String = "<X>". Use<X>verbatim. -
packageClass— read theReactPackage.ktfile: combine itspackage <...>line with the class name → FQN (e.g.com.powerapps.peninput.PenInputPackage). -
methods— scan the Android module (via the Read/Grep tools, not a shell-specific command — this skill is OS-neutral) for@ReactMethodand collect each annotated function name. Cross-check the count against the operations inARCHITECTURE.md §3/PRD §4; if a documented operation has no matching@ReactMethod, surface it as a warning (the manifest reflects what the binary actually exposes, but the mismatch usually means an operation wasn't wired). -
iOS entrypoint fields (only when targeting iOS / Both) — read
ios/RCT<Pascal>Module.hfor the class name (@interface RCT<Pascal>Module : NSObject <RCTBridgeModule>) → that isentrypoints.ios.moduleClass. Readios/RCT<Pascal>Module.mfor+ (NSString *)moduleName { return @"<X>"; }and assert<X>equals thenativeModulefrom step 3 — it's the same bridge symbol on both platforms; a mismatch means the iOS and Android modules disagree. (The.mmust not useRCT_EXPORT_MODULE— that macro's+loadregistration is invisible to the framework'sdlopenflat namespace, so the module never loads on device.)
Then compute, per ppmplugin-format.md §3:
name = kebab(className)— from the class name, not the capability/repo name. Ifkebab(className)differs from the repo's capability kebab (e.g. repopowerapps-pdf-controlbut classPdfViewer→name: pdf-viewer), print a one-line note so the user knows the.ppmpluginfilename won't match the repo name. This is required for the canonical-prefix rule to pass.receivers[].name— take it from the PCF if one exists, do NOT blindly default. If a sibling PCF is present (pcf/<…>/index.ts), grep it for the dispatch key —COMPOSITE_KEY = "<name>/<receiver>"(or theReceiverKeyit binds) — and use that<receiver>value, because the PCF already dispatches to it; a manifest that registers a different receiver name will fail on first dispatch (real bug: PCF dispatched toSnapshotwhile the manifest defaulted toDeviceInfoExtension). Only if no PCF exists, fall back to<Pascal>Extension. Either way, surface the chosen value as a confirmation point: "PCF dispatches to<name>/<receiver>; the manifest will register receiver<receiver>— confirm?" (Audit re-checks this — see `/audi
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
92.4kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
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…
design
130.2kComprehensive design skill: brand identity, design tokens, UI styling, logo generation (55 styles, Gemini, Atlas Cloud, or MuAPI AI), corporate identity program (50 deliverables, CIP mockups), HTML presentations (Chart.js), banner design (22 styles, social/ads/web/print), icon design (15 styles, SVG…
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.
