feat: add marketplace.json for standard plugin distribution#48
Conversation
Adds .claude-plugin/marketplace.json to the repo root, making this repository a standard Claude Code plugin marketplace. Users can now install via `claude plugin marketplace add` instead of only through install.sh. Updates claude-code-plugin/README.md with marketplace install instructions alongside the existing install.sh method. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
taylorarndt
left a comment
There was a problem hiding this comment.
Review: Verified against official Claude Code docs
I checked every URL, CLI command, and JSON field in this PR against the official Claude Code plugin documentation at code.claude.com/docs/en/plugin-marketplaces and code.claude.com/docs/en/discover-plugins.
What checks out
The core approach is solid. The marketplace system works exactly as described:
.claude-plugin/marketplace.jsonlocation is correct/plugin marketplace add owner/reposyntax is correct/plugin install plugin-name@marketplace-namesyntax is correctextraKnownMarketplacesandenabledPluginsJSON structures match the docs- Relative path source
"./claude-code-plugin"is valid for git-based marketplaces --scope user/project/localflags are documented- Offline local clone install path is documented
- Marketplace name
community-accessis not on the reserved names list
Issues to fix before merge
1. $schema URL is fabricated
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json" does not appear anywhere in the official docs or examples. No marketplace example in the docs uses a $schema field. This URL likely does not resolve. Recommend removing it.
2. Top-level description is in the wrong location
The docs define three top-level required fields: name, owner, plugins. A marketplace description belongs under metadata.description, not as a top-level description field. From the docs:
Field Type Description metadata.descriptionstring Brief marketplace description
Either move it to "metadata": { "description": "..." } or remove it.
3. owner.url is not a documented field
The docs say owner supports name (required) and email (optional). There is no url field:
Field Type Required Description namestring Yes Name of the maintainer or team string No Contact email for the maintainer
Either change to "email" with a contact address, or remove the field.
4. claude plugin update command is not documented
The README adds claude plugin update accessibility-agents@community-access. The official docs do not show a /plugin update command for individual plugins. Plugin updates are handled through:
/plugin marketplace update marketplace-name(refreshes marketplace listings)- Auto-update at startup (when enabled for the marketplace)
Recommend replacing with the documented update path or verifying this command exists in the current CLI.
Summary
The marketplace concept and structure are correct. Four fields/commands need cleanup to match the actual spec. None are blocking (Claude Code likely ignores unknown fields silently), but they could confuse users who cross-reference the docs.
taylorarndt
left a comment
There was a problem hiding this comment.
Changes Requested: 4 issues found against official Claude Code docs
Verified every URL, CLI command, and JSON field against the official docs at code.claude.com/docs/en/plugin-marketplaces and code.claude.com/docs/en/discover-plugins. The core marketplace approach is correct and well-structured, but 4 fields/commands need cleanup to match the spec.
1. Remove fabricated $schema URL
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json" does not appear in any official doc or example. This URL likely does not resolve. No marketplace example in the docs uses a $schema field. Remove it.
2. Move description under metadata
Top-level "description" is not a documented top-level field. The docs define three top-level required fields: name, owner, plugins. A marketplace description belongs under metadata.description:
"metadata": {
"description": "Accessibility enforcement plugins for Claude Code"
}3. Fix owner.url — not a documented field
The docs say owner supports name (required) and email (optional). There is no url field. Either change to "email" with a contact address, or remove it.
4. Verify claude plugin update command
The README adds claude plugin update accessibility-agents@community-access. The official docs do not show a /plugin update command for individual plugins. Updates are handled through:
/plugin marketplace update marketplace-name(refreshes listings)- Auto-update at startup (when enabled)
Replace with the documented path or confirm this command exists in the current CLI.
What checks out
Everything else is correct: marketplace location, install commands, extraKnownMarketplaces/enabledPlugins structures, relative path source, scopes, offline install, and the marketplace name is not reserved. Good PR — just needs these 4 items cleaned up.
tesles
left a comment
There was a problem hiding this comment.
Darn, was trying to go 3-for-3! Implemented 3 of the 4 corrections and included supporting verification for #4.
See the plugins-reference entry for plugin update:
claude plugin update <plugin> [options]
Arguments:
<plugin> Plugin name or plugin-name@marketplace-name
Options:
-s, --scope <scope> Scope to update: user, project, local, or managed (default: user)
-h, --help Display help for command
There is also a separate command for refreshing marketplace listings: /plugin marketplace update marketplace-name. The two serve different purposes — one updates an installed plugin, the other refreshes the marketplace catalog.
$schema-- Fixed. Removed. Not in the official spec, URL was hallucinated. 😓description-- Fixed. Moved tometadata.descriptionper the documented schema:"metadata": { "description": "Accessibility enforcement plugins for Claude Code" }
owner.url-- Fixed. Removed. Onlyname(required) andemail(optional) are documented on theownerobject.
Remove $schema (not in spec), move description to metadata.description, remove undocumented owner.url field. Addresses review feedback items 1-3 from #48. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
taylorarndt
left a comment
There was a problem hiding this comment.
Approved
Verified all fields and CLI commands against the official Claude Code docs:
- marketplace.json — all fields match the marketplace schema. No undocumented fields remain after the fixes.
claude plugin update— confirmed documented in the plugins-reference CLI commands.- README instructions —
marketplace add,plugin install,extraKnownMarketplaces, scopes, and offline install all match the official docs.
All 4 requested changes from the previous review are resolved. Clean PR, ready to merge.
Summary
.claude-plugin/marketplace.jsonto the repo root, making this repository a standard Claude Code plugin marketplaceclaude plugin marketplace add Community-Access/accessibility-agents-- the official distribution pathclaude-code-plugin/README.mdwith standard marketplace installation instructions alongside existinginstall.shmethodupdate.shplugin cache mutation (lines 113-161) with nativeplugin update, eliminating coupling to Claude Code's internal cache structureinstall.shandupdate.shremain for project-level embedding and legacy installsNote
Scope: Claude Code Only. This PR adds native Claude Code plugin marketplace support. It does not modify any non-Claude-Code artifacts (Copilot agents, Codex config, Gemini extension, VS Code profiles). The
install.shandupdate.shscripts remain unchanged for users who need those platforms.Problem
The current
install.shscript creates a temporary marketplace directory in/var/folders/.../T/tmp.../during installation and registers it as a marketplace source inknown_marketplaces.json. This causes four issues:1. Startup warning after OS cleans /tmp
2. No auto-update path
Directory-sourced marketplaces pointing to temp paths cannot auto-update. GitHub-sourced marketplaces support native
autoUpdatevia the plugin system.3. Non-standard discovery
Users cannot discover or install this plugin through Claude Code's
/pluginUI orplugin marketplace addcommand. The only entry point is running a shell script. Nomarketplace.jsonexists on any of the repository's 12 branches.4. update.sh couples to internal cache layout
update.sh(lines 113-161) directly writes into~/.claude/plugins/cache/*/accessibility-agents/*/to update the plugin. This path structure is an implementation detail of Claude Code's plugin cache. If the cache layout changes in a future Claude Code release, the update script breaks silently -- files are written to the wrong location with no error. The nativeplugin updatecommand is maintained by Anthropic and insulated from these changes.Solution
Add a
marketplace.jsonto the repository root following the Claude Code official marketplace specification. This makes the repo itself a valid marketplace that Claude Code can register directly from GitHub.Changes
New file:
.claude-plugin/marketplace.json{ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json", "name": "community-access", "description": "Accessibility enforcement plugins for Claude Code", "owner": { "name": "Community Access", "url": "https://github.com/Community-Access" }, "plugins": [ { "name": "accessibility-agents", "source": "./claude-code-plugin", "description": "WCAG AA accessibility enforcement for Claude Code. 55 specialist agents, 17 commands, and enforcement hooks that delegate to accessibility-lead for UI code review.", "version": "1.0.0", "author": { "name": "Taylor Arndt" }, "category": "accessibility", "homepage": "https://github.com/Community-Access/accessibility-agents" } ] }Modified:
claude-code-plugin/README.mdaccessibility-agents/ (repo root = marketplace root)
claude-code-plugin/ unchanged -- the actual plugin
.claude-plugin/
plugin.json unchanged -- plugin manifest
agents/ 55 agent .md files
commands/ 17 skill commands
hooks/
hooks.json plugin hook configuration
scripts/
a11y-enforce-edit.sh PreToolUse enforcement
a11y-mark-reviewed.sh PostToolUse session marker
a11y-team-eval.sh UserPromptSubmit detection
CLAUDE.md decision matrix + standards
README.md modified -- adds marketplace install
install.sh unchanged
update.sh unchanged
uninstall.sh unchanged
docs/ unchanged