A five-agent review of718c79aandd2480b8found no skill, agent or hook regressions (39 skills before and after) and confirmed both hook removals are genuinely moot -- verified against the tree, not taken on the commit's word. It did find one functional regression (fixed separately) and this documentation drift. Counting errors, all from a git pathspec `*` crossing `/`: - 17 .bats files shipped to consumers is really 10; 17 counted tracked paths merely containing /tests/, one of them a template asset - "roughly 88s off every push" is ~92.4s; 88 omitted validate-plugins - "roughly 70% of each plugin remains live" holds only for kyberforge; the real spread is 44.3% (bin) to 70.6%, now a table - the pre-push enforcement row was half-corrected: 33 entries stood unstruck (now 27) and 14 -> 11 switched counting basis mid-sentence - the root .claude-plugin/plugin.json was described as "kept"; it has never been tracked gates.md said "Ten hooks" above a nine-row table (11 was decremented for one removal, not two), and "both need the claude CLI" for one remaining validator. Its pretty-format-json exclude rationale claimed six alternations expanding to sixteen files in a passage headed "Mind which number you are quoting" -- four alternations, two live files; the two dead ones are dropped from the pattern. check-useless-excludes could not catch this: it only flags an exclude matching nothing at all. ADR-0024 cited ADR-0006 for a patch-bump rule it does not contain and which ADR-0015 explicitly retired; stated apm's marketplace probe order backwards (.claude-plugin/ is the last candidate, not the first, so the earlier .github/plugin/ deletion only demoted resolution); undercounted apm's skill-deploying targets as seven when there are fifteen; and never recorded that validate-plugins was removed. The symlink hedge is resolved: apm_cli/security/gate.py's ignore_non_content() drops symlinks silently on deploy while apm_modules/ materialization dereferences them, so content survives that far and vanishes at install. Accepted with no replacement guard, per decision -- kyberforge/docs/hooks.md previously asserted a guard that had been deleted with its script. Four plugin READMEs still advertised `claude plugin install`; ADRs 0001, 0006, 0013, 0014, 0015 and 0019 described deleted machinery in the present tense, 0019 most consequentially as the live justification for the SessionStart hook's .apm/ path. CONTEXT.md's "apm package" entry forbade "plugin" while using it in its own body, and "Output profile" lost the antecedent for "one catalogue serves both". run-tests.sh gains the .claude/skills/ exclusion run-bats.sh already had. Latent today -- no test-*.sh lives under any .apm/skills/*/tests/ -- but apm now deploys those directories, so one would be discovered twice. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBD
28 lines
2.1 KiB
Markdown
28 lines
2.1 KiB
Markdown
# version field is present in both plugin manifests
|
|
|
|
**Moot as of ADR-0015.** This ADR addressed drift risk between two independently
|
|
*hand-maintained* manifests. Since issue #90's conversion executed, `.claude-plugin/plugin.json`
|
|
and `.github/plugin/plugin.json` are both **compiled output** of `apm pack`, generated in the
|
|
same pass from a single `apm.yml` per plugin — there is no longer a second hand-authored file
|
|
that could drift out of parity. The invariant this ADR required (`version` present and
|
|
identical in both manifests) still holds in the compiled output, but structurally, not because
|
|
a skill enforces it: both files are derived from the same `apm.yml` `version:` field, so
|
|
divergence is no longer possible by construction. `plugin-author`, the skill that enforced this
|
|
invariant, is deleted per ADR-0015 rather than adapted. Kept below as the historical record of
|
|
the pre-APM decision.
|
|
|
|
**Fully void as of ADR-0024 (2026-09-14).** Both manifests are now deleted outright, so the two
|
|
files this ADR was about no longer exist in any form, compiled or hand-authored. `apm.yml`'s
|
|
`version:` is the only version field a plugin has. This ADR states no patch-bump rule and never
|
|
did — ADR-0015 retired that rule explicitly; do not cite this ADR as the source of one.
|
|
|
|
---
|
|
|
|
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.
|