System Plugin Creator
Purpose
Create and scaffold plugin directories for Codex with a required .codex-plugin/plugin.json, optional plugin folders/files, valid manifest defaults, and personal-marketplace entries by default. Use when Codex needs to create a new personal plugin, add optional plugin structure, or generate or update marketplace entries for plugin ordering and availability metadata.
Description
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 ~/plugins/<plugin-name>.
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py <plugin-name>
-
Edit
<plugin-path>/.codex-plugin/plugin.jsonwhen the request gives specific metadata. The scaffold starts with valid defaults and must not contain[TODO: ...]placeholders. -
Generate or update the personal marketplace entry when the plugin should appear in Codex UI ordering:
# Personal marketplace entries default to ~/.agents/plugins/marketplace.json.
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin --with-marketplace
Only use a repo/team marketplace when the user specifically asks for that destination:
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
--path <repo-root>/plugins \
--marketplace-path <repo-root>/.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> \
--marketplace-path <marketplace-json-path> \
--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).
- Before handing back a generated plugin, run:
python3 .agents/skills/plugin-creator/scripts/validate_plugin.py <plugin-path>
What this skill creates
- Default marketplace-backed scaffolds are personal:
~/plugins/<plugin-name>/plus~/.agents/plugins/marketplace.json. - 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 validated schema shape that the ingestion path accepts.
- Creates or updates
~/.agents/plugins/marketplace.jsonwhen--with-marketplaceis set.- If the marketplace file does not exist yet, seed a personal marketplace root before adding the first plugin entry.
<plugin-name>is normalized using skill-creator naming rules:My Plugin→my-pluginMy--Plugin→my-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
- Personal creation defaults to
~/.agents/plugins/marketplace.json. - Repo/team marketplace creation is opt-in through both
--pathand--marketplace-path, only when the user specifically requests it. - In either location, the generated source path remains
./plugins/<plugin-name>. - Marketplace root metadata supports top-level
nameplus optionalinterface.displayName. - Treat plugin order in
plugins[]as render order in Codex. Append new entries unless a user explicitly asks to reorder the list. displayNamebelongs inside the marketplaceinterfaceobject, not individualplugins[]entries.- 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
policy.installationvalues:NOT_AVAILABLEAVAILABLEINSTALLED_BY_DEFAULT
- Allowed
policy.authenticationvalues:ON_INSTALLON_USE
- Treat
policy.productsas an override. Omit it unless the user explicitly requests product gating. - 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
--forceonly when intentionally replacing an existing marketplace entry for the same plugin name. -
If the target marketplace file does not exist yet, create it with top-level
"name", an"interface"object containing"displayName", and apluginsarray, then add the new entry. -
For a brand-new marketplace file, the root object should look like:
{
"name": "personal",
"interface": {
"displayName": "Personal"
},
"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"name"are always the same normalized plugin name. - Do not remove required structure; keep
.codex-plugin/plugin.jsonpresent. - Do not leave
[TODO: ...]placeholders in plugin manifests. - Keep
appsandmcpServersout ofplugin.jsonunless their companion files are actually created. - Omit unsupported plugin manifest fields that validation rejects, including
hooks. - If creating files inside an existing plugin path, use
--forceonly when overwrite is intentional. - Preserve any existing marketplace
interface.displayName. - When generating marketplace entries, always write
policy.installation,policy.authentication, andcategoryeven if their values are defaults. - Add
policy.productsonly when the user explicitly asks for that override. - Keep marketplace
source.pathrelative to the selected marketplace root as./plugins/<plugin-name>. - When the workflow created or updated a marketplace-backed plugin, end the final user-facing
response with a short Codex app handoff. Say
To view this in the Codex app:and writeView <normalized plugin name>andShare <normalized plugin name>as Markdown links, not raw URLs or code spans. - The View deeplink uses
codex://plugins/<normalized plugin name>?marketplacePath=<absolute marketplace.json path>. The Share deeplink uses the same URL with&mode=share. - Replace the placeholders with the real normalized plugin name and absolute
marketplace.jsonpath from the scaffolded plugin. URL-encode the path segment and query value when needed. - Do not add
pluginNameorhostIdquery parameters to these deeplinks. Codex derives both after the user clicks the link. - Do not emit the
View <normalized plugin name>orShare <normalized plugin name>links when no marketplace entry was created or updated.
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
Before handing back a generated plugin, run:
python3 .agents/skills/plugin-creator/scripts/validate_plugin.py <plugin-path>
Source
Codex
Capabilities
- See original source for capabilities.
Inputs
Inputs depend on the skill's trigger and arguments. See the source SKILL.md.
Outputs
Outputs depend on the skill. Typical: files written, reports generated, agent actions performed.
When To Use
When the user invokes /system-plugin-creator or describes a task the skill's description matches.
Dependencies
See the source skill's references and scripts folders.
Related Systems
- Claude (if synced from
~/.claude/skills/system-plugin-creator) - HQ Project — landing page Skills section
- MD Project (md.sgnk.ai) —
Skills/System Plugin Creator/ - Obsidian Vault —
Skills/System Plugin Creator/
Examples
See workflow.md.
Source: ~/.codex/skills/.system/plugin-creator/SKILL.md Category: General