Codex plugin-creator
Create and scaffold plugin directories for Codex with a required `.codex-plugin/plugin.json`, optional plugin folders/files, and baseline placeholders you can edit before publishing or testing. Use when Codex needs to create a new local plugin, add optional plugin structure, or generate or update repo-root `.agents/plugins/marketplace.json` entries for plugin ordering and availability metadata.
install
source · Clone the upstream repo
git clone https://github.com/openai/codex
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openai/codex "$T" && mkdir -p ~/.claude/skills && cp -r "$T/codex-rs/skills/src/assets/samples/plugin-creator" ~/.claude/skills/openai-codex-plugin-creator && rm -rf "$T"
manifest:
codex-rs/skills/src/assets/samples/plugin-creator/SKILL.mdsource content
Plugin Creator
Quick Start
- Run the scaffold script:
# Plugin names are normalized to lower-case hyphen-case and must be <= 64 chars. # The generated folder and plugin.json name are always the same. # Run from repo root (or replace .agents/... with the absolute path to this SKILL). # By default creates in <repo_root>/plugins/<plugin-name>. python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py <plugin-name>
-
Open
and replace<plugin-path>/.codex-plugin/plugin.json
placeholders.[TODO: ...] -
Generate or update the repo marketplace entry when the plugin should appear in Codex UI ordering:
# marketplace.json always lives at <repo-root>/.agents/plugins/marketplace.json python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin --with-marketplace
For a home-local plugin, treat
<home> as the root and use:
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \ --path ~/plugins \ --marketplace-path ~/.agents/plugins/marketplace.json \ --with-marketplace
- Generate/adjust optional companion folders as needed:
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin --path <parent-plugin-directory> \ --with-skills --with-hooks --with-scripts --with-assets --with-mcp --with-apps --with-marketplace
<parent-plugin-directory> is the directory where the plugin folder <plugin-name> will be created (for example ~/code/plugins).
What this skill creates
- If the user has not made the plugin location explicit, ask whether they want a repo-local plugin or a home-local plugin before generating marketplace entries.
- Creates plugin root at
./<parent-plugin-directory>/<plugin-name>/ - Always creates
./<parent-plugin-directory>/<plugin-name>/.codex-plugin/plugin.json - Fills the manifest with the full schema shape, placeholder values, and the complete
section.interface - Creates or updates
when<repo-root>/.agents/plugins/marketplace.json
is set.--with-marketplace- If the marketplace file does not exist yet, seed top-level
plusname
placeholders before adding the first plugin entry.interface.displayName
- If the marketplace file does not exist yet, seed top-level
is normalized using skill-creator naming rules:<plugin-name>
→My Pluginmy-plugin
→My--Pluginmy-plugin- underscores, spaces, and punctuation are converted to
- - result is lower-case hyphen-delimited with consecutive hyphens collapsed
- Supports optional creation of:
skills/hooks/scripts/assets/.mcp.json.app.json
Marketplace workflow
always lives atmarketplace.json
.<repo-root>/.agents/plugins/marketplace.json- For a home-local plugin, use the same convention with
as the root:<home>
plus~/.agents/plugins/marketplace.json
../plugins/<plugin-name> - Marketplace root metadata supports top-level
plus optionalname
.interface.displayName - Treat plugin order in
as render order in Codex. Append new entries unless a user explicitly asks to reorder the list.plugins[]
belongs inside the marketplacedisplayName
object, not individualinterface
entries.plugins[]- Each generated marketplace entry must include all of:
policy.installationpolicy.authenticationcategory
- Default new entries to:
policy.installation: "AVAILABLE"policy.authentication: "ON_INSTALL"
- Override defaults only when the user explicitly specifies another allowed value.
- Allowed
values:policy.installationNOT_AVAILABLEAVAILABLEINSTALLED_BY_DEFAULT
- Allowed
values:policy.authenticationON_INSTALLON_USE
- Treat
as an override. Omit it unless the user explicitly requests product gating.policy.products - The generated plugin entry shape is:
{ "name": "plugin-name", "source": { "source": "local", "path": "./plugins/plugin-name" }, "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, "category": "Productivity" }
-
Use
only when intentionally replacing an existing marketplace entry for the same plugin name.--force -
If
does not exist yet, create it with top-level<repo-root>/.agents/plugins/marketplace.json
, an"name"
object containing"interface"
, and a"displayName"
array, then add the new entry.plugins -
For a brand-new marketplace file, the root object should look like:
{ "name": "[TODO: marketplace-name]", "interface": { "displayName": "[TODO: Marketplace Display Name]" }, "plugins": [ { "name": "plugin-name", "source": { "source": "local", "path": "./plugins/plugin-name" }, "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, "category": "Productivity" } ] }
Required behavior
- Outer folder name and
plugin.json
are always the same normalized plugin name."name" - Do not remove required structure; keep
present..codex-plugin/plugin.json - Keep manifest values as placeholders until a human or follow-up step explicitly fills them.
- If creating files inside an existing plugin path, use
only when overwrite is intentional.--force - Preserve any existing marketplace
.interface.displayName - When generating marketplace entries, always write
,policy.installation
, andpolicy.authentication
even if their values are defaults.category - Add
only when the user explicitly asks for that override.policy.products - Keep marketplace
relative to repo root assource.path
../plugins/<plugin-name>
Reference to exact spec sample
For the exact canonical sample JSON for both plugin manifests and marketplace entries, use:
references/plugin-json-spec.md
Validation
After editing
SKILL.md, run:
python3 <path-to-skill-creator>/scripts/quick_validate.py .agents/skills/plugin-creator