Files
Cahid Arda d995ff5115 DX-2996: plugin icon and mcp descriptions (#34)
* DX-2996 surface the MCP in plugin descriptions and ship the Codex icon

The manifests gained an MCP server but kept their skills-only descriptions,
and Codex installed the plugin with no Upstash icon because
`.codex-plugin/plugin.json` had an incomplete `interface` block.

- Descriptions across all six manifests (and the Claude/Cursor marketplace
  entries) now lead with the MCP server, and are identical everywhere. They
  had drifted into two different wordings before this.
- `.codex-plugin/plugin.json` gains the required `longDescription` and
  `capabilities`, plus `logo`/`composerIcon` pointing at
  `assets/upstash-icon-white-bg.png`, `brandColor` (#00C98D, sampled from the
  icon), `defaultPrompt`, and the privacy/terms URLs. Drops the non-spec
  `interface.repository`. This mirrors the asset layout redis/agent-skills
  uses — Codex is the only client with an icon field, so the other manifests
  cannot carry one.
- Category is "Developer Tools" for Codex and the .agents marketplace entry.
- Fills the gaps the icon audit turned up: `skills: "./skills/"` stated
  explicitly for Claude/Codex/Cursor, `displayName`, `author.url`, and the
  full metadata set (version, author, homepage, license, keywords, category,
  tags) on both marketplace entries. Version bumped to 1.2.0 in lockstep.

Adds `scripts/check-manifests.mjs`, run by `npm run check`, so this drift
fails CI instead of shipping: it pins version/description/repository/license
across manifests, requires the description to mention MCP, requires every
client to point at https://mcp.upstash.com/mcp, and requires the Codex
interface block to be complete with logo files that actually exist.

Gitignores `opencode.json`. OpenCode reads it from the project root, so a
committed one would only configure OpenCode for people working inside a clone
of this repo — a personal dev setting the repo has no reason to ship.

Claude-Session: https://claude.ai/code/session_01FPx9e82XCTxDH1msNUAV1q

* DX-2996 title the plugin "Upstash Redis" for marketplace search

The skills and MCP cover every Upstash product and the descriptions still list
them all, but the title now leads with the flagship. Marketplace search is
largely name-driven, so a plugin called "Upstash" does not surface for people
browsing for "redis".

Sets `displayName` to "Upstash Redis" in the Claude and Cursor plugin.json and
in both marketplace entries, and `interface.displayName` for Codex. Cursor's
plugin.json had no display name at all, so it fell back to the slug.

Deliberately unchanged, and now asserted by the check script:

- `"name": "upstash"` — the install identifier behind
  `/plugin install upstash@upstash` and `codex plugin marketplace add`.
  Renaming it would break every install command in the README.
- `author.name` / `owner.name` — the company, not the plugin.
- The marketplace-level displayName, which names the vendor's marketplace
  rather than the plugin inside it.
- Skill names, which AGENTS.md already rules out renaming for ranking.

AGENTS.md documents the title and the three things adjacent to it that must
not be renamed, including why this does not contradict the skills rule.

Claude-Session: https://claude.ai/code/session_01FPx9e82XCTxDH1msNUAV1q

* DX-2996 conform the Cursor manifests to their real schema, add $schema refs

Answering "does every client actually accept displayName?" turned up a bug I
introduced two commits ago. Cursor publishes real JSON Schemas
(github.com/cursor/plugins/schemas) and both are additionalProperties:false.

- `.cursor-plugin/marketplace.json` entries accept only name, source,
  description and minClientVersions. The earlier commit added nine fields
  Cursor rejects — displayName, version, author, homepage, repository,
  license, keywords, category, tags — plus owner.url. All removed; the entry
  now matches the shape Cursor's own marketplace uses.
- That metadata belongs in `.cursor-plugin/plugin.json`, which does take it.
  Moved category and tags there.
- Cursor has a `logo` field, so the icon works there too. Earlier commits
  claimed Codex was the only client with one; that was wrong, and the README
  and AGENTS.md are corrected. Cursor's own plugins use a bare relative path
  ("assets/logo.png", no "./"), so ours matches.

$schema is added only where it is accepted:

- `.claude-plugin/plugin.json` — verified with `claude plugin validate`, which
  passes with the key present. marketplace.json already had one.
- Cursor takes none: its schemas declare no $schema property under
  additionalProperties:false, and none of Cursor's 65 official manifests carry
  one. The check script now fails if someone adds it.
- Codex and Gemini CLI publish no schema URL, so neither gets one.
- plugin.json and mcp.json keep the agent-plugins.org URLs, the only ones that
  actually serve JSON rather than a docs page.

AGENTS.md gains a per-client schema table and the two Cursor traps, so the
next person copies fields between manifests only after checking.

Claude-Session: https://claude.ai/code/session_01FPx9e82XCTxDH1msNUAV1q
2026-09-04 14:54:46 +03:00

354 B