Créateur de Plugin
Démarrage Rapide
- Exécutez le script de scaffold :
# Les noms de plugin sont normalisés en minuscules avec tirets et doivent être <= 64 caractères.
# Le dossier généré et le nom plugin.json sont toujours identiques.
# Exécutez depuis la racine du repo (ou remplacez .agents/... par le chemin absolu de cette SKILL).
# Par défaut, crée dans <repo_root>/plugins/<plugin-name>.
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py <plugin-name>
-
Ouvrez
<plugin-path>/.codex-plugin/plugin.jsonet remplacez les placeholders[TODO: ...]. -
Générez ou mettez à jour l'entrée du marketplace du repo lorsque le plugin doit apparaître dans l'ordre Codex UI :
# marketplace.json se trouve toujours dans <repo-root>/.agents/plugins/marketplace.json
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin --with-marketplace
Pour un plugin local-home, traitez <home> comme la racine et utilisez :
python3 .agents/skills/plugin-creator/scripts/create_basic_plugin.py my-plugin \
--path ~/plugins \
--marketplace-path ~/.agents/plugins/marketplace.json \
--with-marketplace
- Générez/ajustez les dossiers complémentaires optionnels au besoin :
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> est le répertoire où le dossier du plugin <plugin-name> sera créé (par exemple ~/code/plugins).
Ce que crée cette skill
- Si l'utilisateur n'a pas spécifié explicitement l'emplacement du plugin, demandez s'il souhaite un plugin local au repo ou un plugin local-home avant de générer les entrées du marketplace.
- Crée la racine du plugin dans
/<parent-plugin-directory>/<plugin-name>/. - Crée toujours
/<parent-plugin-directory>/<plugin-name>/.codex-plugin/plugin.json. - Remplit le manifest avec la forme de schéma complète, les valeurs placeholder et la section
interfacecomplète. - Crée ou met à jour
<repo-root>/.agents/plugins/marketplace.jsonquand--with-marketplaceest défini.- Si le fichier marketplace n'existe pas encore, initialisez les placeholders de
nameau niveau top etinterface.displayNameavant d'ajouter la première entrée du plugin.
- Si le fichier marketplace n'existe pas encore, initialisez les placeholders de
<plugin-name>est normalisé selon les règles de nommage du skill-creator :My Plugin→my-pluginMy--Plugin→my-plugin- les tirets bas, espaces et ponctuation sont convertis en
- - le résultat est en minuscules, délimité par des tirets avec les tirets consécutifs fusionnés
- Supporte la création optionnelle de :
skills/hooks/scripts/assets/.mcp.json.app.json
Flux de travail Marketplace
marketplace.jsonse trouve toujours dans<repo-root>/.agents/plugins/marketplace.json.- Pour un plugin local-home, utilisez la même convention avec
<home>comme racine :~/.agents/plugins/marketplace.jsonplus./plugins/<plugin-name>. - Les métadonnées racine du marketplace supportent
nameau niveau top plus optionnellementinterface.displayName. - Traitez l'ordre des plugins dans
plugins[]comme l'ordre de rendu dans Codex. Ajoutez les nouvelles entrées à la fin sauf si l'utilisateur demande explicitement de réorganiser la liste. displayNamedoit se trouver à l'intérieur de l'objet marketplaceinterface, pas dans les entrées individuellesplugins[].- Chaque entrée marketplace générée doit inclure :
policy.installationpolicy.authenticationcategory
- Les nouvelles entrées par défaut à :
policy.installation: "AVAILABLE"policy.authentication: "ON_INSTALL"
- Remplacez les valeurs par défaut uniquement quand l'utilisateur spécifie explicitement une autre valeur autorisée.
- Valeurs
policy.installationautorisées :NOT_AVAILABLEAVAILABLEINSTALLED_BY_DEFAULT
- Valeurs
policy.authenticationautorisées :ON_INSTALLON_USE
- Traitez
policy.productscomme un override. Omettez-le sauf si l'utilisateur demande explicitement le gating par produit. - La forme d'entrée du plugin générée est :
{
"name": "plugin-name",
"source": {
"source": "local",
"path": "./plugins/plugin-name"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
-
Utilisez
--forceuniquement quand vous avez l'intention de remplacer une entrée marketplace existante pour le même nom de plugin. -
Si
<repo-root>/.agents/plugins/marketplace.jsonn'existe pas encore, créez-le avec"name"au niveau top, un objet"interface"contenant"displayName"et un tableauplugins, puis ajoutez la nouvelle entrée. -
Pour un nouveau fichier marketplace, l'objet racine doit ressembler à :
{
"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"
}
]
}
Comportement requis
- Le nom du dossier extérieur et le
"name"duplugin.jsonsont toujours le même nom de plugin normalisé. - Ne supprimez pas la structure requise ; gardez
.codex-plugin/plugin.jsonprésent. - Gardez les valeurs du manifest comme placeholders jusqu'à ce qu'un humain ou une étape de suivi les remplisse explicitement.
- Si vous créez des fichiers à l'intérieur d'un chemin de plugin existant, utilisez
--forceuniquement quand la surécriture est intentionnelle. - Préservez tout
interface.displayNameexistant du marketplace. - Lors de la génération d'entrées marketplace, écrivez toujours
policy.installation,policy.authenticationetcategorymême si leurs valeurs sont par défaut. - Ajoutez
policy.productsuniquement quand l'utilisateur le demande explicitement. - Gardez
marketplace source.pathrelatif à la racine du repo comme./plugins/<plugin-name>.
Référence à l'exemple de spec exact
Pour l'exemple JSON canonique exact pour les manifests de plugin et les entrées marketplace, utilisez :
references/plugin-json-spec.md
Validation
Après avoir édité SKILL.md, exécutez :
python3 <path-to-skill-creator>/scripts/quick_validate.py .agents/skills/plugin-creator