Skip to content

Add the Claude Code plugin marketplace; fix silently-broken skill frontmatter#257

Open
pengfei-threemoonslab wants to merge 1 commit into
mainfrom
claude-code-plugin
Open

Add the Claude Code plugin marketplace; fix silently-broken skill frontmatter#257
pengfei-threemoonslab wants to merge 1 commit into
mainfrom
claude-code-plugin

Conversation

@pengfei-threemoonslab

Copy link
Copy Markdown
Contributor

Roadmap item 3 — the largest untapped discovery channel, and the symmetric counterpart of the existing Codex marketplace.

What

/plugin marketplace add ThreeMoonsLab/agents-shipgate
/plugin install agents-shipgate@agents-shipgate
  • .claude-plugin/marketplace.json + plugins/claude-code/ (plugin.json, the /shipgate command → installs namespaced as /agents-shipgate:shipgate, and the auto-triggering skill).
  • Skill-only by design, matching the Codex plugin's test-pinned shape: workflows, not the scanner; no hooks (install-hooks stays the explicit CLI path where the binary must exist), no MCP config. Test enforces this shape.
  • tests/test_claude_code_plugin_package.py mirrors the Codex package contract: installable manifest, version == __version__ on both manifests (release bumps can't strand the marketplace), byte-identity of skill+command with their canonical sources, and frontmatter-parses assertions.
  • Docs: README Claude Code section, use-with-claude-code.md marketplace subsection (incl. team pre-provisioning via extraKnownMarketplaces/enabledPlugins), CHANGELOG.

The bug found in passing (worth the PR by itself)

claude plugin validate caught that the canonical SKILL.md and the /shipgate command ship YAML frontmatter whose description contains an unquoted : — the YAML fails to parse and Claude Code loads the file with silently-empty metadata. Concretely: description-based skill auto-triggering has been broken for every existing init --claude-code install; the skill only fired when named explicitly. Both descriptions are now quoted, all byte-identical copies synced per the kit-change protocol (render hash updated, outgoing hash appended to prior_render_sha256), and the new test parses the frontmatter so this cannot regress.

Verification

  • claude plugin validate . and claude plugin validate ./plugins/claude-code both pass (also surfaced that the validator rejects displayName — removed; docs and validator disagree there).
  • Full CI-style suite + static-only lint + ruff green.
  • shipgate check on this diff: warn routing to verify (agent-instructions surface — correct boundary behavior); self-verify: review_required via SHIP-VERIFY-TRUST-ROOT-TOUCHED on the skill/command edits — the human review it demands is this PR review.
  • Codex plugin adapter confirmed blind to .claude-plugin/ (no cross-parsing).

Merge-order note: independent of #253#256; only CHANGELOG's Unreleased section may trivially conflict.

🤖 Generated with Claude Code

…ntmatter

The repo now doubles as a Claude Code plugin marketplace — the
symmetric counterpart of the Codex marketplace under .agents/plugins/:

- .claude-plugin/marketplace.json (marketplace: agents-shipgate) with
  one skill-only plugin entry sourcing ./plugins/claude-code.
- plugins/claude-code/: plugin.json + the /shipgate command + the
  agents-shipgate skill, both byte-identical copies of the canonical
  sources (.claude/commands/shipgate.md, skills/agents-shipgate/).
  Skill-only by design, like the Codex plugin: no hooks, no MCP config,
  no scanner binary — hooks stay on the explicit install-hooks CLI
  path where the agents-shipgate binary must exist.
- tests/test_claude_code_plugin_package.py mirrors the Codex package
  contract: installable manifest, versions pinned to __version__ (so
  release bumps cannot strand the marketplace), skill-only shape,
  byte-identity with canonical sources, and frontmatter-parses tests.

Fixed in passing, caught by `claude plugin validate`: the canonical
SKILL.md and /shipgate command shipped YAML frontmatter whose
description contains an unquoted ":" — YAML parse fails and Claude
Code loads the file with silently-empty metadata, which kills
description-based skill auto-triggering for every existing install.
Both are now quoted; all byte-identical copies synced
(adoption-kits/claude-code-skill SKILL.md included, with
EXPECTED_CLAUDE_CODE_SKILL_RENDER_SHA256 updated and the outgoing hash
appended to the kit's prior_render_sha256 per the kit-change
protocol); the new frontmatter test prevents regression.

Wiring: README Claude Code section, docs/agents/use-with-claude-code.md
(marketplace subsection incl. team pre-provisioning via
extraKnownMarketplaces), CHANGELOG. `claude plugin validate` passes at
both marketplace and plugin level; full CI-style suite + static-only
lint + ruff green; self-verify routes the agent-instructions changes to
human review (SHIP-VERIFY-TRUST-ROOT-TOUCHED) — which this PR is.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@pengfei-threemoonslab

Copy link
Copy Markdown
Contributor Author

Rebased onto post-#253#256 main (one trivial CHANGELOG conflict; both Unreleased entries kept, full suite + both claude plugin validate levels re-green on the rebased state).

Diagnostic note for the record: this PR initially showed zero CI runs across push/reopen/synchronize events. Root cause was not event-delivery failure — the PR went CONFLICTING the moment #253#256 merged, and GitHub silently skips pull_request workflow runs when it cannot construct the merge ref. The rebase fixed mergeability and CI triggered immediately. (Distinct from the 2026-07-02 incident on #251, which was a genuine dropped push event.)

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant