Skip to content

Package the repo as an Agent Plugins plugin for ChatGPT and Codex - #24

Merged
Marigold merged 3 commits into
mainfrom
research-distribution-channels
Sep 22, 2026
Merged

Marigold merged 3 commits into
mainfrom
research-distribution-channels

Conversation

@Marigold

@Marigold Marigold commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

ChatGPT and Codex now share one Plugin Directory, and it reads the vendor-neutral Agent Plugins format: a root plugin.json, with skills discovered from skills/. That is already this repo's layout, so a single manifest makes the same commit installable in both ecosystems. This adds that manifest plus a repo-scoped catalog, so codex plugin marketplace add owid/skills resolves this repo as a plugin source. No skill content changes.

Skim — the whole diff is manifests and docs. The one thing worth a considered opinion is the note under "Decisions".

How it works

plugin.json carries portable identity (name, description, author, license) at the root and OpenAI's install-surface copy under extensions.com.openai.interface — display name, categories, starter prompts. Skills need no registration there: the format discovers everything under skills/, and a skills declaration is explicitly ignored for packages that have a root manifest. So adding a skill still means editing exactly one list, the Claude one.

.agents/plugins/marketplace.json is the catalog entry pointing at the repo root (source.path: "./"). Without it the repo is a plugin but not a source, and codex plugin marketplace add owid/skills has nothing to resolve.

Two deliberate omissions:

  • No version field. The schema makes it optional and hosts fall back to 1.0.0, so the repo's versionless convention survives intact rather than acquiring a semver counter nobody would remember to bump.
  • No public directory submission. That path needs identity verification, five positive and three negative test cases, and per-version human review — which collides head-on with shipping on every commit to main. This PR only enables repo and local installs, which have no gatekeeper.

make validate gains a fourth check: plugin.json against the published schema. Worth its own check because the schema sets additionalProperties: false, so a typo'd key doesn't degrade — it makes the whole manifest unreadable — and neither skills-ref nor claude plugin validate looks at this file.

Verified

Installed from this branch with the Codex CLI and confirmed all four skills land in the plugin cache:

codex plugin marketplace add owid/skills --ref research-distribution-channels
codex plugin add owid@owid-skills
ls ~/.codex/plugins/cache/owid-skills/owid/*/skills/
# fetch-chart-data  joining-data  owid-catalog  search-charts

Also verified the local-path route (a personal ~/.agents/plugins/marketplace.json pointing at a worktree) resolves — its paths turn out to be relative to $HOME, which the docs don't state.

Not verified: the ChatGPT desktop app's own install UI, and category: "Productivity" / capabilities: ["Read"] — those are the only values the docs exemplify, and I found no published enumeration to check them against. Both are cosmetic if wrong.

Decisions worth a second look

Installing this way copies the whole repo into the user's plugin cache, evals/ included — the plugin root is the repo root, same as the existing Claude marketplace entry, so this is not a regression. Eval prose still cannot reach an agent's context (skills are read only from skills/), but it does land on disk. If we'd rather it didn't, the fix is a plugins/owid/ subdirectory with the skills inside, which changes both manifests and every install path in the README. I'd leave it, but it's a real call.

README: one install route per client

A follow-up commit reorganises the install section around the reader rather than the packaging format. It now has a routing table and a section each for Claude Code, Codex, the ChatGPT app and the Claude app.

Two gaps that reorganising exposed, both now covered: someone using the ChatGPT app previously had to infer that a Codex CLI command was the step they needed, and had no pointer to developer mode, the Work switcher, or the workspace-marketplace route that lets an admin reach colleagues without it. And the Claude app had no route at all — its apps don't read plugin marketplaces, they take one skill at a time as a zip. Verified that zip -r x.zip x from inside skills/ produces the layout its docs require, with SKILL.md one level down.

The Claude app runs skills in a sandbox rather than on the reader's machine, so its prerequisites differ from the table above it. That is flagged as unverified rather than asserted.

Context for whoever picks this up
  • The format is governed by a TSC spanning Amazon, Cursor, Microsoft, OpenAI and Vercel, so plugin.json is a bet on more than ChatGPT.
  • OpenAI docs: package your plugin, submission.
  • ChatGPT desktop needs Settings → Security and login → Developer mode before local sources appear, and a restart after a source is added or its files change.
  • If a marketplace entry's source can't be resolved, Codex skips that entry rather than failing the whole marketplace — so a broken entry is silent, not loud.

🤖 Generated with Claude Code

Marigold and others added 3 commits September 21, 2026 16:51
The Plugin Directory that ChatGPT and Codex share reads the vendor-neutral
Agent Plugins format: a root plugin.json, with skills discovered from skills/.
That is already this repo's layout, so one manifest makes the same commit
installable in both ecosystems.

Adds:
- plugin.json, with OpenAI install-surface copy under extensions.com.openai.
  No version field, matching the repo's versionless convention; the schema
  makes it optional and hosts fall back to 1.0.0.
- .agents/plugins/marketplace.json, so `codex plugin marketplace add owid/skills`
  resolves the repo itself as a source.
- a make validate check of plugin.json against the published schema, which
  neither skills-ref nor `claude plugin validate` looks at.

Nothing here submits to the public Plugin Directory; that needs identity
verification, test cases and per-version review, and would collide with
shipping on every commit. This only enables repo and local installs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The install section had grown around packaging formats rather than around the
person reading it: Claude Code, then "ChatGPT and Codex" as one lump, then
everything else. Someone using the ChatGPT app had to work out that a Codex CLI
command was the step they needed, and someone using the Claude app found nothing
at all — its apps don't read plugin marketplaces, they take one skill at a time
as a zip.

Now there is a routing table and a section per client: Claude Code, Codex, the
ChatGPT app (developer mode, the Work switcher, and the workspace-marketplace
route for reaching colleagues without it), and the Claude app (enable code
execution, zip each skill folder, upload). Verified the zip layout the Claude
app wants — `zip -r x.zip x` from inside skills/ puts SKILL.md exactly one level
down, as its docs require.

The Claude app runs skills in a sandbox rather than on your machine, so its
prerequisites differ from the table above it; that is flagged as unverified
rather than asserted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Productivity" was a placeholder: it was the only value OpenAI's docs
exemplified, and the PR flagged it as unverified because no published
enumeration of categories exists.

The categories in use are observable, though. Across the 180 plugins in the
curated directory cached locally by the Codex CLI, eleven distinct values
appear: Productivity, Developer Tools, Finance, Business & Operations,
Data & Analytics, Communication, Education & Research, Creativity, Travel,
Security and Other. (A twelfth, Engineering, shows up only in OpenAI's own
bundled marketplace, so it may not be available to third parties.)

Of those, the peer sets decide it. Data & Analytics is BI tooling you point at
your own data — Hex, MotherDuck, Amplitude, Mixpanel, PostHog. Education &
Research is published sources you go to for material — Zotero, Factiva, scite,
policynote. Searching and citing a research publisher's charts belongs with the
second group.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Marigold
Marigold merged commit 14d1a34 into main Sep 22, 2026
2 checks passed
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.

1 participant