Skip to content

Replace legacy metadata guidance with extensions - #104

Open
jonathanhefner wants to merge 3 commits into
Agent-Card:mainfrom
jonathanhefner:agent/fix-103-extensions-docs
Open

Replace legacy metadata guidance with extensions#104
jonathanhefner wants to merge 3 commits into
Agent-Card:mainfrom
jonathanhefner:agent/fix-103-extensions-docs

Conversation

@jonathanhefner

Copy link
Copy Markdown
Contributor

ADR-0017 replaced the native metadata member, but the authoring guides and Claude marketplace mapping still showed documents that conflict with the normative CDDL.

This PR documents extensions at the catalog, entry, and Trust Manifest scopes, and describes the official metadata extension (without imposing a second namespace convention on its schemaless payload).

This PR also omits selective Claude description and homepage mappings, and removes the obsolete Adspirer marketplace snapshot.

Closes #103.

@darrelmiller

Copy link
Copy Markdown
Contributor

While you're touching the Claude mapping, docs/mappings/claude-code-plugins.md still has two \sha1:\ sourceDigest values (lines 113 and 133) that violate the spec's Digest Format rules (SHA-256 or stronger required). These are git commit SHAs, not content digests — PR #81 originally fixed them in the appendix but the mappings were extracted before that landed.

Could you also fix these while you're in here? The Adspirer entry you're already removing has one; the Aikido entry at line ~128 has the other. The git SHA should either move to an extension (e.g. \com.github.sourceSha) or just be dropped from \sourceDigest.

ADR-0017 replaced the native `metadata` member before the 1.0 release,
but the authoring guides and Claude marketplace mapping still showed
documents that conflict with the normative CDDL.

Document `extensions` at the catalog, entry, and Trust Manifest scopes,
and describe the official metadata extension without imposing a second
namespace convention on its schemaless payload.

Omit selective Claude description and homepage mappings, and remove the
obsolete Adspirer marketplace snapshot instead of preserving
source-specific data in generic metadata.
@jonathanhefner
jonathanhefner force-pushed the agent/fix-103-extensions-docs branch from fdb67b9 to 3596257 Compare August 27, 2026 16:05
Remove the live Aikido snapshot and the invalid mapping from
`source.sha` to `sourceDigest`, which treats a Git revision as a
specification digest.

Keep the guide focused on defined AI Catalog projections by using a
minimal URL source and presenting the source forms as illustrative
examples.

@Tehsmash Tehsmash left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The extensions change LGTM. I hadn't realised that we had metadata/extensions on the top level catalog object until I re-read this.

Main issue I have is on the claude code market place conversion stuff, after walking through the examples it seems like we have a bit of a weird situation with the URL and types which needs a bit more discussion IMO.

Comment thread docs/mappings/claude-code-plugins.md Outdated
The `agent-sdk-dev` plugin from
[claude-plugins-official](https://github.com/anthropics/claude-plugins-official)
maps to an AI Catalog where each plugin is an entry:
maps to an AI Catalog as follows:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought this section was to show a conversion from marketplace.json to an ai-catalog.json. The new text doesn't make as much sense I think. Perhaps something like:

A marketplace.json containing one plugin "agent-sdk-dev" maps to an AI catalog as follows:

This makes me wonder if we can create a tool to do this conversion automatically :/

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the underlying problem is that https://github.com/anthropics/claude-plugins-official/blob/main/.claude-plugin/marketplace.json is not a good basis for an example. It is large and sprawling, and has already drifted from the excerpt we previously had.

I added a commit to replace it with a synthetic example.

{
"relation": "publishedFrom",
"sourceId": "https://github.com/amekala/adspirer-mcp-plugin",
"sourceDigest": "sha1:aa70dbdbbbb843e94a794c10c2b13f5dd66b5e40"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand the reason for not using sourceDigest here as its suppose to be a sha256 content digest of the artifact but having an artifact sourced directly from from a git repo is becoming more and more common.

I'm thinking that we probably need to encode this information in the "version" or "URL" field:

"source": {
        "source": "git-subdir",
        "url": "https://github.com/adobe/skills.git",
        "path": "plugins/creative-cloud/adobe-for-creativity",
        "ref": "main",
        "sha": "1307e2c03b9cd20c49872be8cbdfda7ee9aa8c7e"
      },

There is a problem with "version" as the plugin.json itself has a version which is not the "sha" and they should probably match. So then I would suggest that we just encode it in the URL itself for example something like:

https://github.com/adobe/skills.git/plugins/creative-cloud/adobe-for-creativity@1307e2c03b9cd20c49872be8cbdfda7ee9aa8c7e

What I find a little bit odd about this whole conversion is that the "type" is "application/vnd.anthropic.claude-plugin+json" however the given URL's do not resolve to the plugin.json. The "correct" URL for that would be something like:

https://raw.githubusercontent.com/adobe/skills/refs/heads/main/plugins/creative-cloud/adobe-for-creativity/.claude-plugin/plugin.json

But resolving the plugin.json directly isn't useful as it doesn't come with any information about where to find the plugin "code".

There is also an open question of "how do I know that the URL is a git URL?"

I think in reality we're actually defining here is something like application/vnd.anthropic.claude-plugin+git here which implies that you should treat the URL as a git repo which resolves to a plugin folder not a JSON document.

This would then allow you to also have application/vnd.anthropic.claude-plugin+zip or whatever which could be a different packaging mechanism.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This led down a rabbit hole. I added a commit to try to address some of the concerns, but if we want to work on this further I would strongly suggest a separate PR.

If desired, I can separate commits 928e437 and a5fcfd6 out of this PR so that it only contains commit 3596257.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It really is a rabbit hole, thanks for trying to resolve it!

3596257 is way better already, but my main issue is that pointing to plugin.json isn't "useful" for a claude plugin, it'll get you the metadata for the plugin but that doesn't include any reference to the actual plugin code.

One option based on https://code.claude.com/docs/en/plugin-marketplaces#plugin-sources is to add different types like:

application/vnd.anthropic.claude-plugin+git
application/vnd.anthropic.claude-plugin+npm
application/vnd.anthropic.claude-plugin+zip

For each of these the catalog entry URL can have a different semantic meaning e.g. +git its a git file distribution, +zip its a zip file. +npm its the NPM package identifier. This is in alignment with how we're doing agent skills.

Alternatively, I think we perhaps need to go up a level and introduce a "plugin card" (sick emoji) which literally just encodes https://code.claude.com/docs/en/plugin-marketplaces#plugin-entries as a separate thing.
You could quite cleanly embed this into AI Catalog something like:

{
   "entries": [
       {
         "type": "application/vnd.anthropic.claude-plugin-entry+json",  <--- note not plugin.json but plugin-entry.json
         "data": {
            {
			      "name": "code-formatter",
			      "source": {
			        "source": "github",
			        "repo": "company/deploy-plugin"
			      },
			      "description": "Automatic code formatting on save",
			      "version": "2.1.0",
			      "author": {
			        "name": "DevTools Team"
			      }
			},
         }
       }  
   ] 
}

This pushes all the "sources" stuff out of AI Catalog making it a claude specific thing to deal with. The "plugin entry" schema is closer aligned with something like an MCP server card or A2A card.

Replace the live marketplace example with a synthetic marketplace and
plugin manifest so each field in the catalog projection can be traced
without depending on mutable third-party data.

Separate installation sources from AI Catalog artifact delivery and
distinguish metadata mappings from operator-supplied identity, type, and
trust decisions. Remove implied automatic component conversions.
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.

The guides still document metadata, which ADR-0017 replaced with extensions

4 participants