## Why Plugin and marketplace management had no governed authoring path. Creating or updating a plugin required knowing the dual-manifest convention, version parity rules, and directory skeleton by memory — nothing enforced consistency or guided the process. `/plugin-author` closes that gap by owning the full plugin scaffold lifecycle: create, update, rename, and release. `/marketplace-author` handles the marketplace-facing side: register, deregister, and update plugin entries in `marketplace.json`. ADR-0016 codifies the version parity convention (identical `version` in both `plugin.json` and `.claude-plugin/plugin.json`) that `/plugin-author` now enforces. The two plugin.json files in this repo are backfilled to comply (keys also sorted to pass the pretty-format-json hook). CONTEXT.md gains glossary entries for "plugin scaffold" and "version parity" so future agents have shared vocabulary for these concepts. ## Implementation Notes `/plugin-author` ships a `scripts/new-plugin.sh` scaffold script that generates the directory skeleton and both manifests in one shot; the skill calls the script rather than generating files ad hoc so the scaffold is reviewable and repeatable. Version parity is an invariant, not a suggestion — the skill will fail loudly on create/update if the two versions would diverge. ADR: docs/adr/0016-plugin-version-parity.md
904 B
version field is present in both plugin manifests
Each plugin has two manifests: plugin.json (Copilot CLI) and .claude-plugin/plugin.json (Claude Code). Both tools support a version field. Prior to this decision, only the CC manifest carried version; the Copilot manifest omitted it.
We now require version in both manifests, always identical. A reader of plugin.json alone should be able to determine the plugin version without consulting the CC manifest. The plugin-author skill enforces this invariant on every create, update, and release operation.
Considered options
CC-only version (rejected) — version only in .claude-plugin/plugin.json; Copilot derives version from the git tag. Rejected because it makes plugin.json incomplete as a standalone descriptor and creates a class of drift where the two manifests disagree on version without any tooling catching it.