plugin-creator

Créer et structurer les répertoires de plugins pour Codex avec un `.codex-plugin/plugin.json` obligatoire, des dossiers/fichiers de plugins optionnels, et des espaces réservés de base que vous pouvez modifier avant la publication ou les tests. À utiliser lorsque Codex doit créer un nouveau plugin local, ajouter une structure de plugin optionnelle, ou générer ou mettre à jour les entrées `.agents/plugins/marketplace.json` à la racine du dépôt pour l'ordonnancement des plugins et les métadonnées de disponibilité.

npx skills add https://github.com/openai/skills --skill plugin-creator

Créateur de Plugin

Démarrage Rapide

  1. 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>
  1. Ouvrez <plugin-path>/.codex-plugin/plugin.json et remplacez les placeholders [TODO: ...].

  2. 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
  1. 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 interface complète.
  • Crée ou met à jour <repo-root>/.agents/plugins/marketplace.json quand --with-marketplace est défini.
    • Si le fichier marketplace n'existe pas encore, initialisez les placeholders de name au niveau top et interface.displayName avant d'ajouter la première entrée du plugin.
  • <plugin-name> est normalisé selon les règles de nommage du skill-creator :
    • My Pluginmy-plugin
    • My--Pluginmy-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.json se 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.json plus ./plugins/<plugin-name>.
  • Les métadonnées racine du marketplace supportent name au niveau top plus optionnellement interface.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.
  • displayName doit se trouver à l'intérieur de l'objet marketplace interface, pas dans les entrées individuelles plugins[].
  • Chaque entrée marketplace générée doit inclure :
    • policy.installation
    • policy.authentication
    • category
  • 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.installation autorisées :
    • NOT_AVAILABLE
    • AVAILABLE
    • INSTALLED_BY_DEFAULT
  • Valeurs policy.authentication autorisées :
    • ON_INSTALL
    • ON_USE
  • Traitez policy.products comme 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 --force uniquement 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.json n'existe pas encore, créez-le avec "name" au niveau top, un objet "interface" contenant "displayName" et un tableau plugins, 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" du plugin.json sont toujours le même nom de plugin normalisé.
  • Ne supprimez pas la structure requise ; gardez .codex-plugin/plugin.json pré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 --force uniquement quand la surécriture est intentionnelle.
  • Préservez tout interface.displayName existant du marketplace.
  • Lors de la génération d'entrées marketplace, écrivez toujours policy.installation, policy.authentication et category même si leurs valeurs sont par défaut.
  • Ajoutez policy.products uniquement quand l'utilisateur le demande explicitement.
  • Gardez marketplace source.path relatif à 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