Summary
Bring APM's apm marketplace add to parity with Anthropic's spec by accepting all four source shapes:
| Source shape |
Example |
Today |
owner/repo (GitHub) |
apm marketplace add anthropic/skills |
✅ |
Git URL (any host, with #ref) |
apm marketplace add https://gitlab.com/.../plugins.git#v1.0.0 |
❌ |
| Local path (dir or file) |
apm marketplace add ./vendor/internal-marketplace |
❌ |
Remote marketplace.json URL |
apm marketplace add https://example.com/marketplace.json |
❌ |
Phase 2 covers auth integration via AuthResolver for private sources (the gap originally raised in #692).
.well-known/agent-skills/ (Cloudflare RFC) is deferred behind a clear external trigger: the RFC reaches v1.0, OR the upstream agentskills.io PR (#254) merges, OR production adoption shows up. See discussion in #676 (comment).
Why
Anthropic's /plugin marketplace add already accepts these four source shapes, and it's the closest thing the plugin-marketplace world has to a settled spec. Three missing source shapes against that spec is the real, achievable gap to close — not a draft RFC. Closing the parity gap unlocks:
- Air-gapped / enterprise workflows: register marketplaces from internal git mirrors, local checkouts, or a hosted JSON file behind corporate auth.
- Non-GitHub publishers (GitLab, Bitbucket, self-hosted): same UX as the GitHub case.
- Lower friction for adopters who don't want to publish a full git repo just to share a curated catalog — a single
marketplace.json URL is enough.
Phase 1 — source parity (this issue)
Accept all four source shapes in apm marketplace add. Lockfile records canonical source + content digest for reproducibility.
Building on the foundation in #691 by @Vicente-Pastor:
MarketplaceSource generalization (marketplace/models.py)
- ETag / conditional-refresh (
marketplace/client.py)
- Archive safety / zip-slip protection (
marketplace/archive.py)
- Auth-first client design
- Lockfile provenance fields (
deps/lockfile.py)
- ~364 tests across 8 test files
The destination contract changes from the agent-skills index format to Anthropic's marketplace.json schema, but most of the plumbing transfers cleanly.
Phase 2 — auth integration (follow-on)
Wire AuthResolver into URL-based marketplace fetch so private git URLs and authenticated marketplace.json endpoints work end-to-end. Tracked in #692.
Reference
Related
Summary
Bring APM's
apm marketplace addto parity with Anthropic's spec by accepting all four source shapes:owner/repo(GitHub)apm marketplace add anthropic/skills#ref)apm marketplace add https://gitlab.com/.../plugins.git#v1.0.0apm marketplace add ./vendor/internal-marketplacemarketplace.jsonURLapm marketplace add https://example.com/marketplace.jsonPhase 2 covers auth integration via
AuthResolverfor private sources (the gap originally raised in #692)..well-known/agent-skills/(Cloudflare RFC) is deferred behind a clear external trigger: the RFC reaches v1.0, OR the upstream agentskills.io PR (#254) merges, OR production adoption shows up. See discussion in #676 (comment).Why
Anthropic's
/plugin marketplace addalready accepts these four source shapes, and it's the closest thing the plugin-marketplace world has to a settled spec. Three missing source shapes against that spec is the real, achievable gap to close — not a draft RFC. Closing the parity gap unlocks:marketplace.jsonURL is enough.Phase 1 — source parity (this issue)
Accept all four source shapes in
apm marketplace add. Lockfile records canonical source + content digest for reproducibility.Building on the foundation in #691 by @Vicente-Pastor:
MarketplaceSourcegeneralization (marketplace/models.py)marketplace/client.py)marketplace/archive.py)deps/lockfile.py)The destination contract changes from the
agent-skillsindex format to Anthropic'smarketplace.jsonschema, but most of the plumbing transfers cleanly.Phase 2 — auth integration (follow-on)
Wire
AuthResolverinto URL-based marketplace fetch so private git URLs and authenticatedmarketplace.jsonendpoints work end-to-end. Tracked in #692.Reference
Related
.well-knownURIs #554 — supersedes (close as dup once Phase 1 lands)