Add portable display metadata (displayName and icon) to the manifest#21
Open
digitarald wants to merge 1 commit into
Open
Add portable display metadata (displayName and icon) to the manifest#21digitarald wants to merge 1 commit into
displayName and icon) to the manifest#21digitarald wants to merge 1 commit into
Conversation
Consolidate the two prior open display-metadata PRs — agentplugins#17 (displayName) and agentplugins#19 (icon) — into a single, self-contained change and supersede them. Additions to the closed portable manifest: - `displayName`: optional, unconstrained human-readable label for host UIs (§5.7). Hosts MAY present it instead of the constrained `name`; when it is absent or empty, hosts fall back to `name`. `name` is re-described as the plugin identifier (§5.3/§5.5) now that `displayName` carries the label role. - `icon`: optional plugin-relative path to an image (§5.8). Deliberately narrower than PR agentplugins#19: remote (http/https) references are excluded so assets ship inside the package under §4.1 containment, avoiding load-time fetching, SSRF, and privacy concerns. A non-string `icon` is a fatal type violation; a string `icon` with an invalid or out-of-root path is advisory and ignored, and never affects component discovery or execution. Hosts that render the icon MUST treat it as untrusted image data, MUST NOT execute active content, and MUST NOT trigger network requests (including subresources) while rendering. Updated consistently: §5.2 field list and fatal/advisory rules, §5.4 metadata table and type-only validation carve-out, §5.7/§5.8 normative subsections, §11.3 failure rules, the Appendix A conformance checklist, a new Design Decisions rationale, the full example manifest, and the official JSON schema. Explicitly rejected as out of scope (left to client `extensions`): a `category`/taxonomy field, remote icon URLs, screenshots, colors, starter prompts, legal/policy URLs, and marketplace ranking signals. Optional fields with no `required` change: backward compatible. Two independent adversarial reviews (Claude Opus and GPT-5.6) reviewed the final diff; their findings (icon fatality consistency and icon render-time security hardening) were addressed and re-reviewed clean. Supersedes agentplugins#17. Supersedes agentplugins#19. Refs agentplugins#16, agentplugins#18. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7b920053-3358-460c-a9d2-824b058c7b55
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a modest, portable display-metadata pair to the closed plugin manifest —
displayNameandicon— and consolidates the two prior open PRs on this topic into a single self-contained change.This supersedes and folds in the worthwhile parts of:
Add optional displayName field(closes Add optionaldisplayNamefield to the plugin manifest #16)Add optional icon field(closes Add optionalicon#18)Rather than leaving three competing PRs, this one change lands both fields consistently across the spec text, the official JSON schema, examples, the conformance checklist, and Design Decisions. #17 and #19 can be closed in favor of this PR.
What's added
displayName(§5.7)Optional, unconstrained, human-readable label for host UIs. Hosts MAY present it instead of the constrained machine identifier
name(§5.5); when it is absent or empty, hosts fall back toname.nameis re-described as the plugin identifier now thatdisplayNamecarries the label role (adopted from #17).icon(§5.8)Optional plugin-relative path (§4.1) to an image representing the plugin.
Deliberately narrower than #19: remote
http:/https:icon references are excluded. Assets ship inside the package and are covered by the existing §4.1 containment rules, which removes load-time fetching, SSRF, and privacy concerns entirely and answers the open questions raised in #18:iconis a fatal type violation (like other metadata); a stringiconwith an invalid or out-of-root path is advisory — ignored, never affecting component discovery or execution.Scope: chosen vs. rejected
Grounded in cross-host practice (Claude marketplace is minimal; Cursor exposes displayName/logo/category/tags; OpenAI carries rich client-specific interface metadata), the portable core is limited to the two fields that mean the same thing across hosts and packages.
Explicitly rejected / left to client
extensions(§8): acategoryor other taxonomy field (overlapskeywords, drifts toward marketplace/ranking semantics), remote icon URLs, screenshots, colors, starter prompts, legal/policy URLs, and marketplace ranking signals. An exploratorycategoryfield was considered and dropped to keep the addition narrow.Compatibility
Both fields are optional and
requiredis unchanged, so existing conformant plugins stay valid and existing hosts treat the fields as known-optional (or, on older hosts, as report-and-ignore unknown fields per §5.2). No backwards-incompatible change.Consistency / tests
The repository has no build or test harness (spec =
README.md+ JSON schemas). Validation performed:schemas/1.0.0/plugin.schema.jsonparses as valid JSON.plugin.jsonexamples in the README validate against the updated schema viajsonschema(including the full example withdisplayName+icon).Adversarial review
Two independent read-only reviews of the final diff (Claude Opus and GPT-5.6):
iconwas described as advisory in §5.8 but made fatal by the general rules in §5.2/§5.4/§11.3, and that icon rendering security (active content / embedded subresource fetches) was only aSHOULD. Both addressed: non-stringiconis now explicitly fatal while a bad path is explicitly advisory across §5.2/§5.4/§5.8/§11.3, and the render-time security requirements were raised toMUST NOT.Changed files
README.mdschemas/1.0.0/plugin.schema.jsonThis is a community contribution and does not imply endorsement or consensus from any host or vendor.
Supersedes #17. Supersedes #19. Refs #16, #18.