$npx -y skills add openai/codex --skill plugin-creatorCreate 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,
| 1 | # Plugin Creator |
| 2 | |
| 3 | ## Quick Start |
| 4 | |
| 5 | 1. Run the scaffold script: |
| 6 | |
| 7 | ```bash |
| 8 | # Plugin names are normalized to lower-case hyphen-case and must be <= 64 chars. |
| 9 | # The generated folder and plugin.json name are always the same. |
| 10 | # Run from the skill root (the directory containing this `SKILL.md`). |
| 11 | # By default creates in `~/plugins/<plugin-name>`. |
| 12 | python3 scripts/create_basic_plugin.py <plugin-name> |
| 13 | ``` |
| 14 | |
| 15 | 2. Edit `<plugin-path>/.codex-plugin/plugin.json` when the request gives specific metadata. |
| 16 | The scaffold starts with valid defaults and must not contain `[TODO: ...]` placeholders. |
| 17 | |
| 18 | 3. Generate or update the personal marketplace entry when the plugin should appear in Codex UI ordering: |
| 19 | |
| 20 | ```bash |
| 21 | # Personal marketplace entries default to `~/.agents/plugins/marketplace.json`. |
| 22 | python3 scripts/create_basic_plugin.py my-plugin --with-marketplace |
| 23 | ``` |
| 24 | |
| 25 | Only specify `--marketplace-name <name>` when the default `personal` marketplace name is already |
| 26 | taken or installed and you need to seed a different new marketplace file: |
| 27 | |
| 28 | ```bash |
| 29 | python3 scripts/create_basic_plugin.py my-plugin \ |
| 30 | --with-marketplace \ |
| 31 | --marketplace-name team-local |
| 32 | ``` |
| 33 | |
| 34 | Only use a repo/team marketplace when the user specifically asks for that destination: |
| 35 | |
| 36 | ```bash |
| 37 | python3 scripts/create_basic_plugin.py my-plugin \ |
| 38 | --path <repo-root>/plugins \ |
| 39 | --marketplace-path <repo-root>/.agents/plugins/marketplace.json \ |
| 40 | --with-marketplace |
| 41 | ``` |
| 42 | |
| 43 | When the user specifies a marketplace path, make sure that marketplace is actually installed before |
| 44 | telling the user to reinstall from it. The default personal marketplace file at |
| 45 | `~/.agents/plugins/marketplace.json` is discovered implicitly, but other marketplace paths are not. |
| 46 | On Windows, use the equivalent path under the user profile. |
| 47 | |
| 48 | 4. Generate/adjust optional companion folders as needed: |
| 49 | |
| 50 | ```bash |
| 51 | python3 scripts/create_basic_plugin.py my-plugin \ |
| 52 | --path <parent-plugin-directory> \ |
| 53 | --marketplace-path <marketplace-json-path> \ |
| 54 | --with-skills --with-hooks --with-scripts --with-assets --with-mcp --with-apps --with-marketplace |
| 55 | ``` |
| 56 | |
| 57 | `<parent-plugin-directory>` is the directory where the plugin folder `<plugin-name>` will be |
| 58 | created (for example `~/plugins`). |
| 59 | |
| 60 | 5. Before handing back a generated plugin, run: |
| 61 | |
| 62 | ```bash |
| 63 | python3 scripts/validate_plugin.py <plugin-path> |
| 64 | ``` |
| 65 | |
| 66 | For updates to an existing local plugin during development, keep the scaffold flow as-is and use the |
| 67 | reference instead of hand-editing marketplace files: |
| 68 | |
| 69 | ```bash |
| 70 | python3 scripts/update_plugin_cachebuster.py <plugin-path> |
| 71 | ``` |
| 72 | |
| 73 | Prefer the helper default cachebuster unless the user explicitly asks for a specific override. |
| 74 | See `references/installing-and-updating.md` for the expected cachebuster and reinstall flow while iterating on an existing local plugin. |
| 75 | |
| 76 | ## What this skill creates |
| 77 | |
| 78 | - Default marketplace-backed scaffolds use the personal marketplace file at |
| 79 | `~/.agents/plugins/marketplace.json`, with plugins generally being stored in |
| 80 | `~/plugins/<plugin-name>/`. |
| 81 | - Creates plugin root at `/<parent-plugin-directory>/<plugin-name>/`. |
| 82 | - Always creates `/<parent-plugin-directory>/<plugin-name>/.codex-plugin/plugin.json`. |
| 83 | - Fills the manifest with the validated schema shape that the ingestion path accepts. |
| 84 | - Creates or updates `~/.agents/plugins/marketplace.json` when `--with-marketplace` is set. |
| 85 | - If the marketplace file does not exist yet, seed a personal marketplace root before adding the first plugin entry. |
| 86 | - `<plugin-name>` is normalized using skill-creator naming rules: |
| 87 | - `My Plugin` → `my-plugin` |
| 88 | - `My--Plugin` → `my-plugin` |
| 89 | - underscores, spaces, and punctuation are converted to `-` |
| 90 | - result is lower-case hyphen-delimited with consecutive hyphens collapsed |
| 91 | - Supports optional creation of: |
| 92 | - `skills/` |
| 93 | - `hooks/` |
| 94 | - `scripts/` |
| 95 | - `assets/` |
| 96 | - `.mcp.json` |
| 97 | - `.app.json` |
| 98 | |
| 99 | ## Marketplace workflow |
| 100 | |
| 101 | - Personal-marketplace creation defaults to `~/.agents/plugins/marketplace.json`. Here, |
| 102 | "personal marketplace" means the marketplace whose file is at that path. |
| 103 | - Repo/team marketplace creation is opt-in through both `--path` and `--marketplace-path`, only |
| 104 | when the user specifically requests it. |
| 105 | - `--marketplace-name` is an exception path. Use it only when the default `personal` marketplace |
| 106 | name is already taken and you need to seed a different new marketplace file. |
| 107 | - Do not use `--marketplace-name` to rename an existing marketplace file in place. If the file |
| 108 | already exists, its top-level `name` must already match. |
| 109 | - If the user sp |