Replies: 1 comment 1 reply
Why should the file be required to be at repo root? I could see situations where you want multiple distinct marketplaces in the same repo (e.g. different departments). |
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Problem
The v1.0.0 spec defines the layout of a single plugin well, but provides no standard for a repository that hosts multiple plugins and wants to expose a machine-readable index of them (a marketplace). For instance: https://github.com/anthropics/claude-plugins-official
Use case: A monorepo contains plugins under
plugins/*/. Clients need to discover, list, and install individual plugins from it. Today there is no portable format for this index, so each client invents its own (e.g. https://github.com/anthropics/claude-plugins-official/blob/main/.claude-plugin/marketplace.json).Proposal
Proposed: a
marketplace.json(orindex.json) at the repo root:{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://agent-plugins.org/schemas/1.0.0/marketplace.schema.json", "title": "Agent Plugins Marketplace", "description": "Machine-readable schema for marketplace.json in Agent Plugins 1.0.0. The Agent Plugins specification defines additional semantic and operational requirements.", "type": "object", "properties": { "$schema": { "const": "https://agent-plugins.org/schemas/1.0.0/marketplace.schema.json", "description": "Canonical identifier of the marketplace schema for the Agent Plugins version targeted by this document." }, "name": { "type": "string", "minLength": 1, "maxLength": 64, "description": "Human-readable marketplace name." }, "description": { "type": "string" }, "plugins": { "type": "array", "items": { "$ref": "#/$defs/pluginEntry" } } }, "required": ["$schema", "name", "plugins"], "additionalProperties": false, "$defs": { "pluginEntry": { "title": "Plugin entry", "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 64 }, "description": { "type": "string" }, "source": { "$ref": "#/$defs/source" } }, "required": ["name", "source"], "additionalProperties": false }, "source": { "title": "Plugin source", "oneOf": [ { "$ref": "#/$defs/localSource" }, { "$ref": "#/$defs/externalSource" } ] }, "localSource": { "title": "Local source", "description": "A plugin co-located in the same repository, resolved relative to the marketplace root.", "type": "object", "properties": { "path": { "type": "string", "pattern": "^\\./" } }, "required": ["path"], "additionalProperties": false }, "externalSource": { "title": "External source", "description": "A plugin resolved from a remote git repository, optionally scoped to a subdirectory and ref.", "type": "object", "properties": { "url": { "type": "string", "pattern": "^https://", "description": "Git repository URL." }, "path": { "type": "string", "description": "Path to the plugin root within the repository. Defaults to the repository root when omitted." }, "ref": { "type": "string", "description": "Git ref (tag, branch, or commit SHA). Defaults to the repository default branch when omitted." } }, "required": ["url"], "additionalProperties": false } } }Example
{ "$schema": "https://agent-plugins.org/schemas/1.0.0/marketplace.schema.json", "name": "my-org-marketplace", "description": "This is a directory of all our plugins" "plugins": [ { "name": "a-team", "description": "A-Team skills", "source": { "path": "./plugins/a-team" } }, { "name": "external-awesome-plugin", "description": "An external plugin we use", "source": { "url": "https://github.com/external-org/skills.git", "path": "plugins/awesome", "ref": "main" } } ] }Some considerations
sourcesupport remote (git, HTTPS) in addition to local paths?plugin.jsondirectly?All reactions