Proposal: adopt APM (microsoft/apm) as the canonical authoring substrate
Why this matters
awesome-copilot today maintains 53 hand-authored plugins/<name>/.github/plugin/plugin.json files plus a custom Node aggregator (eng/generate-marketplace.mjs) to glue them into .github/plugin/marketplace.json. The aggregator format is repo-specific; new contributors have to learn awesome-copilot's bespoke build chain on top of the Claude/Copilot plugin spec itself.
APM (Agent Package Manager) is emerging as the canonical authoring substrate for Copilot plugins/skills/agents across the GitHub + Microsoft ecosystem. It defines:
- a portable
apm.yml manifest format (with a marketplace: block for plugin marketplace authors)
- an
apm pack command that emits Anthropic-spec marketplace.json and plugin.json deterministically
- a dependency + lockfile model so primitives can be composed across repos
awesome-copilot is the highest-leverage public showcase for that authoring story. Adopting APM here makes the canonical path concrete for every contributor who lands on this repo, and lets the rest of the ecosystem point at it as the reference implementation.
What is being proposed
A single PR (linked below) that:
- Adds a root
apm.yml declaring all 53 local plugins under marketplace.packages: (each with source: ./plugins/<name>, version, description mirroring the existing plugin.json values).
- Wires
npm run plugin:generate-marketplace to apm pack (with a tiny eng/merge-external-plugins.mjs bridge that keeps plugins/external.json flowing through unchanged for now).
- Preserves the legacy generator as
npm run plugin:generate-marketplace:legacy so maintainers can A/B during the transition.
- Documents the APM CLI prerequisite in
CONTRIBUTING.md and updates eng/README.md to point at apm pack as canonical.
Output parity is 1:1 by plugin name (54 entries: 53 local + 1 external azure). The only deltas vs the legacy output are key ordering and the source: field shape (./plugins/x vs bare x) -- both are valid under the Anthropic spec given the existing metadata.pluginRoot setting.
Per-plugin plugin.json files and plugins/external.json are NOT touched in this PR. No breaking changes for plugin authors.
Follow-ups (not in the initial PR; tracked here for visibility)
- F1 -- per-plugin migration: replace each
plugins/<x>/.github/plugin/plugin.json with a per-plugin apm.yml, generated via apm pack --format plugin at build time. Eliminates 53 hand-authored manifests.
- F2 -- retire
eng/generate-marketplace.mjs: once F1 lands and parity is confirmed across releases, delete the legacy generator.
- F3 -- native external sources: declare external plugins inside
apm.yml using object-form source: and retire both plugins/external.json and eng/merge-external-plugins.mjs.
Each follow-up is independently shippable and can be sequenced as the maintainers prefer.
Why now
APM is a young project but already shipping (v0.10.x). Landing awesome-copilot on it gives both projects a network effect: APM gets a flagship marketplace built on its substrate; awesome-copilot gets a canonical, ecosystem-wide authoring surface that contributors can transfer to other repos.
PR
The implementation PR will be linked here once opened.
References
Proposal: adopt APM (microsoft/apm) as the canonical authoring substrate
Why this matters
awesome-copilot today maintains 53 hand-authored
plugins/<name>/.github/plugin/plugin.jsonfiles plus a custom Node aggregator (eng/generate-marketplace.mjs) to glue them into.github/plugin/marketplace.json. The aggregator format is repo-specific; new contributors have to learn awesome-copilot's bespoke build chain on top of the Claude/Copilot plugin spec itself.APM (Agent Package Manager) is emerging as the canonical authoring substrate for Copilot plugins/skills/agents across the GitHub + Microsoft ecosystem. It defines:
apm.ymlmanifest format (with amarketplace:block for plugin marketplace authors)apm packcommand that emits Anthropic-spec marketplace.json and plugin.json deterministicallyawesome-copilot is the highest-leverage public showcase for that authoring story. Adopting APM here makes the canonical path concrete for every contributor who lands on this repo, and lets the rest of the ecosystem point at it as the reference implementation.
What is being proposed
A single PR (linked below) that:
apm.ymldeclaring all 53 local plugins undermarketplace.packages:(each withsource: ./plugins/<name>, version, description mirroring the existing plugin.json values).npm run plugin:generate-marketplacetoapm pack(with a tinyeng/merge-external-plugins.mjsbridge that keepsplugins/external.jsonflowing through unchanged for now).npm run plugin:generate-marketplace:legacyso maintainers can A/B during the transition.CONTRIBUTING.mdand updateseng/README.mdto point atapm packas canonical.Output parity is 1:1 by plugin name (54 entries: 53 local + 1 external
azure). The only deltas vs the legacy output are key ordering and thesource:field shape (./plugins/xvs barex) -- both are valid under the Anthropic spec given the existingmetadata.pluginRootsetting.Per-plugin
plugin.jsonfiles andplugins/external.jsonare NOT touched in this PR. No breaking changes for plugin authors.Follow-ups (not in the initial PR; tracked here for visibility)
plugins/<x>/.github/plugin/plugin.jsonwith a per-pluginapm.yml, generated viaapm pack --format pluginat build time. Eliminates 53 hand-authored manifests.eng/generate-marketplace.mjs: once F1 lands and parity is confirmed across releases, delete the legacy generator.apm.ymlusing object-formsource:and retire bothplugins/external.jsonandeng/merge-external-plugins.mjs.Each follow-up is independently shippable and can be sequenced as the maintainers prefer.
Why now
APM is a young project but already shipping (v0.10.x). Landing awesome-copilot on it gives both projects a network effect: APM gets a flagship marketplace built on its substrate; awesome-copilot gets a canonical, ecosystem-wide authoring surface that contributors can transfer to other repos.
PR
The implementation PR will be linked here once opened.
References