plugin distribution: make the marketplace repo authoritative, drop the manifest version (git-hash updates), remove madtea's .claude-plugin, rework assemble #443

Closed
opened 2026-08-17 22:42:28 +00:00 by hexajon · 4 comments
Owner

Implements the decision from #437. The plugin is distributed and maintained from the authoritative marketplace repo sixfold-space/claude-plugins.

Decision

  • The marketplace repo owns the plugin manifest and the vendored components.
  • The plugin manifest drops its version field, so Claude Code uses the marketplace repo's git commit hash for update detection (per the official Claude Code docs). This removes the version-drift that left the source manifest stuck at an old value, and the "version set in both plugin.json and the marketplace entry" anti-pattern.
  • madtea's source .claude-plugin/ is removed; madtea no longer carries a plugin manifest.

Work

In sixfold-space/claude-plugins (authoritative)

  • Remove version from plugins/madtea/.claude-plugin/plugin.json.
  • Remove version from the marketplace.json madtea entry (never set it in both).
  • Fix the manifest description: drop "works with OpenAI Codex CLI and Antigravity CLI". It is a Claude Code plugin; the cross-client surface is the MCP server, a separate install.

In madtea

  • Delete .claude-plugin/.
  • Rework scripts/assemble-plugin-artifact.sh: drop the version stamping (stamp_plugin_json_version) and the require/copy of .claude-plugin/plugin.json from the source tree. Keep vendoring the components (hooks, skills, LICENSE, NOTICE, README) so the plugin content still tracks madtea; the version-less manifest in the marketplace stays authoritative and untouched.
  • Update hooks/tests/assemble-plugin-artifact.test.sh (drop the version-stamp assertions).
  • Update docs/contributing/agent-onboarding.md and any doc that describes a source .claude-plugin/.
  • ADR 0010's "plugin.json version is cosmetic / the marketplace entry is authoritative" consequence is now wrong: the manifest version IS authoritative when present, and we drop it for the git-hash fallback. Reconcile via ADR 0010's Status line or a dated amendment - do not scrub the body.

Acceptance

  • No version in the plugin manifest or the marketplace entry; update detection keys off the marketplace repo's commit hash.
  • madtea source has no .claude-plugin/; a release still vendors current hooks and skills into the marketplace.
  • Full gate green in madtea; the assemble test reflects the new flow.
  • #437 (the finding and decision).
  • ADR 0010, ADR 0033.
Implements the decision from #437. The plugin is distributed and maintained from the authoritative marketplace repo `sixfold-space/claude-plugins`. ## Decision - The marketplace repo owns the plugin manifest and the vendored components. - The plugin manifest drops its `version` field, so Claude Code uses the marketplace repo's git commit hash for update detection (per the official Claude Code docs). This removes the version-drift that left the source manifest stuck at an old value, and the "version set in both `plugin.json` and the marketplace entry" anti-pattern. - madtea's source `.claude-plugin/` is removed; madtea no longer carries a plugin manifest. ## Work ### In `sixfold-space/claude-plugins` (authoritative) - Remove `version` from `plugins/madtea/.claude-plugin/plugin.json`. - Remove `version` from the `marketplace.json` madtea entry (never set it in both). - Fix the manifest `description`: drop "works with OpenAI Codex CLI and Antigravity CLI". It is a Claude Code plugin; the cross-client surface is the MCP server, a separate install. ### In madtea - Delete `.claude-plugin/`. - Rework `scripts/assemble-plugin-artifact.sh`: drop the version stamping (`stamp_plugin_json_version`) and the require/copy of `.claude-plugin/plugin.json` from the source tree. Keep vendoring the components (hooks, skills, LICENSE, NOTICE, README) so the plugin content still tracks madtea; the version-less manifest in the marketplace stays authoritative and untouched. - Update `hooks/tests/assemble-plugin-artifact.test.sh` (drop the version-stamp assertions). - Update `docs/contributing/agent-onboarding.md` and any doc that describes a source `.claude-plugin/`. - ADR 0010's "plugin.json version is cosmetic / the marketplace entry is authoritative" consequence is now wrong: the manifest version IS authoritative when present, and we drop it for the git-hash fallback. Reconcile via ADR 0010's Status line or a dated amendment - do not scrub the body. ## Acceptance - No `version` in the plugin manifest or the marketplace entry; update detection keys off the marketplace repo's commit hash. - madtea source has no `.claude-plugin/`; a release still vendors current hooks and skills into the marketplace. - Full gate green in madtea; the assemble test reflects the new flow. ## Related - #437 (the finding and decision). - ADR 0010, ADR 0033.
Author
Owner

Rescoped by the #450 decision (option 3): the plugin carries hooks and skills only, no bundled MCP server.

Changes to the work here:

  • Drop the bundled MCP server from the plugin so it stops registering a second madt_ tool surface. Vendor hooks and skills only in assemble-plugin-artifact.sh.
  • Marketplace manifest: no server; drop the version field (git-hash update detection, as already planned); fix the description to a hooks-and-skills Claude Code plugin. Remove the "works with OpenAI Codex CLI and Antigravity CLI" claim - that reach is the server, a separate install.
  • Delete madtea's source .claude-plugin/ as planned.
  • ADR 0010 amendment still owed: its "plugin bundles the server / marketplace entry authoritative" consequence now also records that the plugin no longer carries the server.

This resolves #437's manifest contradiction by the same change: no server in the plugin, so no cross-client claim to contradict.

Rescoped by the #450 decision (option 3): the plugin carries hooks and skills only, no bundled MCP server. Changes to the work here: - Drop the bundled MCP server from the plugin so it stops registering a second `madt_` tool surface. Vendor hooks and skills only in `assemble-plugin-artifact.sh`. - Marketplace manifest: no server; drop the `version` field (git-hash update detection, as already planned); fix the description to a hooks-and-skills Claude Code plugin. Remove the "works with OpenAI Codex CLI and Antigravity CLI" claim - that reach is the server, a separate install. - Delete madtea's source `.claude-plugin/` as planned. - ADR 0010 amendment still owed: its "plugin bundles the server / marketplace entry authoritative" consequence now also records that the plugin no longer carries the server. This resolves #437's manifest contradiction by the same change: no server in the plugin, so no cross-client claim to contradict.
Author
Owner

The marketplace-repo side is now tracked in its own repo: sixfold-space/claude-plugins#15 (drop the bundled server, the manifest version, and the cross-client claim). This issue stays the madtea-side work: the assemble rework and the source .claude-plugin/ removal, plus the ADR 0010 amendment.

The marketplace-repo side is now tracked in its own repo: sixfold-space/claude-plugins#15 (drop the bundled server, the manifest version, and the cross-client claim). This issue stays the madtea-side work: the assemble rework and the source `.claude-plugin/` removal, plus the ADR 0010 amendment.
Author
Owner

Design settled. The madtea-side scope is now fixed.

Cadence: the vendor step stays release-time only (inside release.sh) - trigger unchanged. Plus an idempotency guard: it commits into claude-plugins ONLY when the vendored content (hooks/skills/LICENSE/NOTICE) actually differs from what is already there. A release that changes no hooks/skills produces no vendor commit, so no phantom plugin update.

Update model: no version anywhere. Claude Code keys plugin updates off the marketplace repo's commit hash, so a real vendor commit is the update signal (verified against code.claude.com/docs plugin-marketplaces). The marketplace repo (claude-plugins) is the sole owner of plugin.json, marketplace.json, and README - the narrowed versions are already merged there (its PR #16).

madtea-side work here:

  • assemble-plugin-artifact.sh: stop owning the metadata. Remove the require/copy of source .claude-plugin/plugin.json, stamp_plugin_json_version, bump_marketplace_version, and the versioned README generation. Vendor only hooks + skills + LICENSE + NOTICE, and leave plugin.json / marketplace.json / README untouched.
  • Add the idempotency guard: no vendor commit when the content is byte-identical to what is in claude-plugins.
  • Delete madtea's source .claude-plugin/.
  • Update hooks/tests/assemble-plugin-artifact.test.sh: drop the version-stamp and manifest-present assertions; assert assemble does NOT write the metadata files; cover the idempotent no-op.
  • ADR 0010 dated amendment: marketplace manifest authoritative; version dropped (hash-based updates); plugin carries no server; assemble is idempotent and no longer owns the manifest/version/README.

Not needed: the version machinery, a GitHub sync, or any push-triggered vendor.

Design settled. The madtea-side scope is now fixed. Cadence: the vendor step stays release-time only (inside `release.sh`) - trigger unchanged. Plus an idempotency guard: it commits into `claude-plugins` ONLY when the vendored content (hooks/skills/LICENSE/NOTICE) actually differs from what is already there. A release that changes no hooks/skills produces no vendor commit, so no phantom plugin update. Update model: no `version` anywhere. Claude Code keys plugin updates off the marketplace repo's commit hash, so a real vendor commit is the update signal (verified against code.claude.com/docs plugin-marketplaces). The marketplace repo (`claude-plugins`) is the sole owner of `plugin.json`, `marketplace.json`, and `README` - the narrowed versions are already merged there (its PR #16). madtea-side work here: - `assemble-plugin-artifact.sh`: stop owning the metadata. Remove the require/copy of source `.claude-plugin/plugin.json`, `stamp_plugin_json_version`, `bump_marketplace_version`, and the versioned README generation. Vendor only hooks + skills + LICENSE + NOTICE, and leave `plugin.json` / `marketplace.json` / `README` untouched. - Add the idempotency guard: no vendor commit when the content is byte-identical to what is in `claude-plugins`. - Delete madtea's source `.claude-plugin/`. - Update `hooks/tests/assemble-plugin-artifact.test.sh`: drop the version-stamp and manifest-present assertions; assert assemble does NOT write the metadata files; cover the idempotent no-op. - ADR 0010 dated amendment: marketplace manifest authoritative; version dropped (hash-based updates); plugin carries no server; assemble is idempotent and no longer owns the manifest/version/README. Not needed: the version machinery, a GitHub sync, or any push-triggered vendor.
Author
Owner

Landed on main in 90c68c2a. That commit's "Closes #[443]" carried a bracket typo, so the forge never auto-closed this. All acceptance is met on main: source .claude-plugin/ is deleted, assemble-plugin-artifact.sh vendors only hooks + skills and no longer owns the manifest/version/README, the idempotency guard is in place (a release that changes no hooks/skills produces no vendor commit), hooks/tests/assemble-plugin-artifact.test.sh covers the new flow, and ADR 0010 carries the dated 2026-08-25 amendment. The marketplace-repo side is tracked and merged in sixfold-space/claude-plugins (#16). Closing.

Landed on main in 90c68c2a. That commit's "Closes #[443]" carried a bracket typo, so the forge never auto-closed this. All acceptance is met on main: source .claude-plugin/ is deleted, assemble-plugin-artifact.sh vendors only hooks + skills and no longer owns the manifest/version/README, the idempotency guard is in place (a release that changes no hooks/skills produces no vendor commit), hooks/tests/assemble-plugin-artifact.test.sh covers the new flow, and ADR 0010 carries the dated 2026-08-25 amendment. The marketplace-repo side is tracked and merged in sixfold-space/claude-plugins (#16). Closing.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
sixfold-space/madtea#443
No description provided.