SpyBara
Go Premium

plugin-marketplaces.md 2026-09-08 20:00 UTC to 2026-09-09 22:58 UTC

This page contains 467 additions and 76 deletions.

2026
Wed 9 22:58 Sat 12 03:02 Fri 18 23:58 Wed 23 23:57 Thu 24 22:57 Fri 25 23:58

Créer et distribuer une place de marché de plugins

Créez et hébergez des places de marché de plugins pour distribuer les extensions Claude Code dans vos équipes et communautés.

Une place de marché de plugins est un catalogue qui vous permet de distribuer des plugins à d'autres. Les places de marché offrent une découverte centralisée, un suivi des versions, des mises à jour automatiques et la prise en charge de plusieurs types de sources, notamment les dépôts git et les chemins locaux. Ce guide vous montre comment créer votre propre place de marché pour partager des plugins avec votre équipe ou votre communauté.

Vous cherchez à installer des plugins à partir d'une place de marché existante ? Consultez Découvrir et installer des plugins préconfigurés.

Aperçu

La création et la distribution d'une place de marché impliquent :

  1. Créer des plugins : créez un ou plusieurs plugins avec des compétences, des agents, des hooks, des serveurs MCP ou des serveurs LSP. Ce guide suppose que vous avez déjà des plugins à distribuer ; consultez Créer des plugins pour plus de détails sur la création de plugins.
  2. Créer le fichier de place de marché : définissez un marketplace.json qui répertorie vos plugins et où les trouver. Voir Créer le fichier de place de marché.
  3. Héberger la place de marché : poussez vers GitHub, GitLab ou un autre hôte git. Voir Héberger et distribuer les places de marché.
  4. Partager avec les utilisateurs : les utilisateurs ajoutent votre place de marché avec /plugin marketplace add et installent des plugins individuels. Voir Découvrir et installer des plugins.

Une fois votre place de marché en ligne, vous pouvez la mettre à jour en poussant les modifications vers votre dépôt. Les utilisateurs actualisent leur copie locale avec /plugin marketplace update.

Procédure pas à pas : créer une place de marché locale

Cet exemple crée une place de marché avec un plugin : une compétence quality-review pour les révisions de code. Vous allez créer la structure de répertoires, ajouter une compétence, créer le manifeste du plugin et le catalogue de la place de marché, puis l'installer et la tester.

1

Créer la structure de répertoires

mkdir -p my-marketplace/.claude-plugin
mkdir -p my-marketplace/plugins/quality-review-plugin/.claude-plugin
mkdir -p my-marketplace/plugins/quality-review-plugin/skills/quality-review
2

Créer la compétence

Créez un fichier SKILL.md qui définit ce que fait la compétence quality-review.

---
description: Review code for bugs, security, and performance
---

Review the code I've selected or the recent changes for:
- Potential bugs or edge cases
- Security concerns
- Performance issues
- Readability improvements

Be concise and actionable.
3

Créer le manifeste du plugin

Créez un fichier plugin.json qui décrit le plugin. Le manifeste se trouve dans le répertoire .claude-plugin/.

{
"name": "quality-review-plugin",
"description": "Adds a quality-review skill for quick code reviews",
"version": "1.0.0",
"author": {
"name": "Your Name"
}
}
4

Créer le fichier de place de marché

Créez le catalogue de la place de marché qui répertorie votre plugin.

{
"name": "my-plugins",
"owner": {
"name": "Your Name"
},
"plugins": [
{
"name": "quality-review-plugin",
"source": "./plugins/quality-review-plugin",
"description": "Adds a quality-review skill for quick code reviews"
}
]
}
5

Ajouter et installer

À partir du répertoire qui contient my-marketplace, démarrez Claude Code et exécutez les commandes suivantes. La commande d'installation ouvre une vue de détails du plugin où vous sélectionnez une portée d'installation pour confirmer l'installation. Vérifiez le résumé d'installation : s'il signale Run /reload-plugins to activate., exécutez cette commande.

/plugin marketplace add ./my-marketplace
/plugin install quality-review-plugin@my-plugins
6

Essayer

Sélectionnez du code dans votre éditeur et exécutez votre nouvelle compétence. Les compétences des plugins sont espacées avec le nom du plugin.

/quality-review-plugin:quality-review

Pour en savoir plus sur ce que les plugins peuvent faire, notamment les hooks, les agents, les serveurs MCP et les serveurs LSP, consultez Plugins.

Créer le fichier de place de marché

Créez .claude-plugin/marketplace.json à la racine de votre dépôt. Ce fichier définit le nom de votre place de marché, les informations du propriétaire et une liste de plugins avec leurs sources.

Chaque entrée de plugin a besoin au minimum d'un name et d'une source qui indique à Claude Code où la récupérer. Consultez le schéma complet ci-dessous pour tous les champs disponibles.

{
  "name": "company-tools",
  "owner": {
    "name": "DevTools Team",
    "email": "devtools@example.com"
  },
  "plugins": [
    {
      "name": "code-formatter",
      "source": "./plugins/formatter",
      "description": "Automatic code formatting on save",
      "version": "2.1.0",
      "author": {
        "name": "DevTools Team"
      }
    },
    {
      "name": "deployment-tools",
      "source": {
        "source": "github",
        "repo": "company/deploy-plugin"
      },
      "description": "Deployment automation tools"
    }
  ]
}

Schéma de la place de marché

Champs obligatoires

Champ Type Description Exemple
name string Identifiant de la place de marché en kebab-case, sans espaces, caractères de contrôle ou caractères de formatage bidirectionnel. C'est un élément public : les utilisateurs le voient lors de l'installation de plugins (par exemple, /plugin install my-tool@your-marketplace). Chaque utilisateur ne peut enregistrer qu'une seule place de marché par nom : l'ajout d'une deuxième place de marché portant le même nom remplace la première. Pour publier plusieurs plugins sous un seul nom de place de marché, listez-les tous dans un seul marketplace.json. "acme-tools"
owner object Informations du responsable de la place de marché (voir les champs ci-dessous)
plugins array Liste des plugins disponibles Voir ci-dessous

Champs du propriétaire

Champ Type Obligatoire Description
name string Oui Nom du responsable ou de l'équipe
email string Non Adresse e-mail de contact du responsable
url string Non Site web, profil GitHub ou URL de l'organisation

Champs optionnels

Champ Type Description
$schema string URL du schéma JSON pour l'autocomplétion et la validation de l'éditeur. Claude Code ignore ce champ au moment du chargement.
description string Brève description de la place de marché
version string Version du manifeste de la place de marché
metadata.pluginRoot string Répertoire que Claude Code résout pour les noms de source de plugin nus. Voir Chemins relatifs. Nécessite Claude Code v2.1.239 ou version ultérieure.
allowCrossMarketplaceDependenciesOn array Autres places de marché sur lesquelles les plugins de cette place de marché peuvent dépendre. Les dépendances d'une place de marché non listée ici sont bloquées à l'installation. Voir Dépendre d'un plugin d'une autre place de marché.
renames object Mappage d'un ancien nom de plugin name à son nom actuel, ou à null si le plugin a été supprimé. Permet aux utilisateurs existants de migrer automatiquement lorsque vous renommez ou supprimez une entrée dans plugins. Voir Renommer ou supprimer un plugin. Nécessite Claude Code v2.1.193 ou version ultérieure.

description et version sont également acceptés sous metadata pour la compatibilité rétroactive.

Entrées de plugin

Chaque entrée de plugin dans le tableau plugins décrit un plugin et où le trouver. Vous pouvez inclure n'importe quel champ du schéma du manifeste du plugin, tel que description, version, author, commands et hooks, plus ces champs spécifiques à la place de marché : source, category, tags, strict, relevance, headers et headersHelper.

Champs obligatoires

Champ Type Description
name string Identifiant du plugin en kebab-case, sans espaces, caractères de contrôle ou caractères de formatage bidirectionnel. C'est un élément public : les utilisateurs le voient lors de l'installation (par exemple, /plugin install my-plugin@marketplace).
source string|object Où récupérer le plugin (voir Sources de plugin ci-dessous)

Champs de plugin optionnels

Champs de métadonnées standard :

Champ Type Description
displayName string Nom lisible affiché dans les surfaces de l'interface utilisateur. Revient à name lorsqu'il est omis. Peut contenir des espaces et n'importe quelle casse. Non utilisé pour l'espace de noms ou la recherche.
description string Brève description du plugin
version string Version du plugin. Si défini (ici ou dans plugin.json), le plugin est épinglé à cette chaîne et les utilisateurs ne reçoivent des mises à jour que lorsqu'elle change. Un plugin avec une source command n'est pas épinglé par l'un ou l'autre champ. Si défini dans aucun des deux endroits, la version provient de la source suivante dans gestion des versions.
author object Informations sur l'auteur du plugin (name obligatoire ; email et url optionnels)
homepage string URL de la page d'accueil ou de la documentation du plugin
repository string URL du dépôt du code source
license string Identifiant de licence SPDX (par exemple, MIT, Apache-2.0)
keywords array Balises pour la découverte et la catégorisation des plugins
metadata object Objet libre pour vos propres champs, tels que les données de droit ou de catalogue. Claude Code ne le lit pas. Avant v2.1.222, claude plugin validate signalait la clé comme un champ non reconnu.
category string Catégorie du plugin pour l'organisation
tags array Balises pour la recherche
strict boolean Contrôle si plugin.json est l'autorité pour les définitions de composants (par défaut : true). Voir Mode strict ci-dessous.
relevance object Signaux qui indiquent à Claude Code quand suggérer ce plugin aux utilisateurs. Prend effet uniquement pour les places de marché qu'un administrateur autorise dans les paramètres gérés. Voir Recommander des plugins pour votre organisation.
defaultEnabled boolean Si le plugin est activé après l'installation (par défaut : true). Définissez sur false pour installer le plugin désactivé jusqu'à ce que l'utilisateur l'active. Prend la priorité sur le même champ dans le plugin.json du plugin. Voir Activation par défaut.

Champs de configuration des composants :

Champ Type Description
skills string|array Chemins personnalisés vers les répertoires de compétences contenant <name>/SKILL.md
commands string|array Chemins personnalisés vers les fichiers de compétences .md plats ou les répertoires
agents string|array Chemins personnalisés vers les fichiers d'agents
hooks string|object Configuration personnalisée des hooks ou chemin vers le fichier des hooks
mcpServers string|object Configurations du serveur MCP ou chemin vers la configuration MCP
lspServers string|object Configurations du serveur LSP ou chemin vers la configuration LSP

Champs d'authentification d'archive :

Définissez ces champs lorsque l'entrée a une source archive sur un serveur qui nécessite des identifiants.

Champ Type Description
headers object En-têtes HTTP que Claude Code envoie lorsqu'il télécharge l'archive de cette entrée. Remplace les en-têtes de la place de marché du même nom. Nécessite Claude Code v2.1.238 ou version ultérieure.
headersHelper string Commande qui imprime les en-têtes HTTP pour le téléchargement d'archive de cette entrée sous la forme d'un objet JSON, pour un identifiant qui expire. Voir Authentifier les téléchargements d'archive. L'entrée doit également définir "strict": false. Nécessite Claude Code v2.1.238 ou version ultérieure.

Sources de plugin

Les sources de plugin indiquent à Claude Code où récupérer chaque plugin individuel répertorié dans votre place de marché. Elles sont définies dans le champ source de chaque entrée de plugin dans marketplace.json.

Claude Code copie chaque plugin installé dans le cache de plugin local versionné à ~/.claude/plugins/cache, sauf pour une source command en mode lien, que Claude Code utilise à la place. Claude Code installe également les dépendances de paquet Node.js éligibles du plugin dans la copie en cache.

Source Type Champs Notes
Chemin relatif string (par exemple "./my-plugin") aucun Répertoire local dans le dépôt de la place de marché. Doit commencer par ./, sauf si vous écrivez un nom nu sous metadata.pluginRoot. Claude Code résout le chemin par rapport à la racine de la place de marché, pas au répertoire .claude-plugin/
github object repo, ref?, sha?
url object url, ref?, sha? Source d'URL Git
git-subdir object url, path, ref?, sha? Sous-répertoire dans un dépôt git. Clone partiellement pour minimiser la bande passante pour les monodépôts
npm object package, version?, registry? Installé via npm install
archive object url, sha256? Archive zip téléchargée via HTTPS. Fonctionne sans git ou npm sur la machine de l'utilisateur. Nécessite Claude Code v2.1.224 ou ultérieur
command object command, timeout?, mode? Répertoire de plugin produit en exécutant une commande locale, réexécutée une fois par session pour récupérer les modifications. Nécessite Claude Code v2.1.229 ou ultérieur

Les types de source basés sur git ci-dessous sont github, url et git-subdir. Lorsque ref et sha sont tous deux définis sur l'un d'eux, le sha est l'épingle effective. Claude Code récupère et vérifie le commit épinglé directement.

Sur la plupart des hôtes git, y compris GitHub, GitLab et Bitbucket, cela signifie que l'installation réussit même si la branche ou le tag nommé par ref a depuis été supprimé en amont, tant que le commit est toujours accessible à partir du dépôt. Certains serveurs, tels qu'AWS CodeCommit, ne prennent pas en charge la récupération des commits par SHA. Sur ces serveurs, le ref doit toujours exister et le commit épinglé doit être accessible à partir de celui-ci.

Si vous distribuez des plugins via Paramètres de l'organisation > Plugins, seuls certains types de source sont autorisés. Voir Distribuer via les paramètres de l'organisation.

Chemins relatifs

Pour les plugins dans le même dépôt, utilisez un chemin commençant par ./ :

{
  "name": "my-plugin",
  "source": "./plugins/my-plugin"
}

Les chemins se résolvent par rapport à la racine de la place de marché, qui est le répertoire contenant .claude-plugin/. Dans l'exemple ci-dessus, ./plugins/my-plugin pointe vers <repo>/plugins/my-plugin, même si marketplace.json se trouve à <repo>/.claude-plugin/marketplace.json. N'utilisez pas ../ pour référencer des chemins en dehors de la racine de la place de marché.

Un nom nu est un seul nom de répertoire sans /, tel que "formatter". Pour écrire des noms nus au lieu de chemins ./, définissez metadata.pluginRoot sur le répertoire sous lequel ils se résolvent. Avec "pluginRoot": "./plugins", Claude Code résout "source": "formatter" en ./plugins/formatter. Nécessite Claude Code v2.1.239 ou ultérieur.

metadata.pluginRoot doit lui-même être un chemin relatif à l'intérieur de la place de marché. Claude Code l'ignore pour une source qui commence déjà par ./. Une source qui contient un /, tel que team-a/formatter, n'est pas un nom nu et a toujours besoin du préfixe ./, même lorsque metadata.pluginRoot est défini.

Dépôts GitHub

{
  "name": "github-plugin",
  "source": {
    "source": "github",
    "repo": "owner/plugin-repo"
  }
}

Vous pouvez épingler à une branche, un tag ou un commit spécifique :

{
  "name": "github-plugin",
  "source": {
    "source": "github",
    "repo": "owner/plugin-repo",
    "ref": "v2.0.0",
    "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
  }
}
Champ Type Description
repo string Obligatoire. Dépôt GitHub au format owner/repo
ref string Optionnel. Branche ou tag Git (par défaut la branche par défaut du dépôt)
sha string Optionnel. SHA de commit git complet de 40 caractères pour épingler à une version exacte

Dépôts Git

{
  "name": "git-plugin",
  "source": {
    "source": "url",
    "url": "https://gitlab.com/team/plugin.git"
  }
}

Vous pouvez épingler à une branche, un tag ou un commit spécifique :

{
  "name": "git-plugin",
  "source": {
    "source": "url",
    "url": "https://gitlab.com/team/plugin.git",
    "ref": "main",
    "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
  }
}
Champ Type Description
url string Obligatoire. URL complète du dépôt git (https:// ou git@). Le suffixe .git est optionnel, donc les URL Azure DevOps et AWS CodeCommit sans le suffixe fonctionnent
ref string Optionnel. Branche ou tag Git (par défaut la branche par défaut du dépôt)
sha string Optionnel. SHA de commit git complet de 40 caractères pour épingler à une version exacte

Sous-répertoires Git

Utilisez git-subdir pour pointer vers un plugin qui se trouve dans un sous-répertoire d'un dépôt git. Claude Code utilise un clone partiel et clairsemé pour récupérer uniquement le sous-répertoire, minimisant la bande passante pour les grands monodépôts.

{
  "name": "my-plugin",
  "source": {
    "source": "git-subdir",
    "url": "https://github.com/acme-corp/monorepo.git",
    "path": "tools/claude-plugin"
  }
}

Vous pouvez épingler à une branche, un tag ou un commit spécifique :

{
  "name": "my-plugin",
  "source": {
    "source": "git-subdir",
    "url": "https://github.com/acme-corp/monorepo.git",
    "path": "tools/claude-plugin",
    "ref": "v2.0.0",
    "sha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
  }
}

Le champ url accepte également un raccourci GitHub (owner/repo) ou des URL SSH (git@github.com:owner/repo.git).

Champ Type Description
url string Obligatoire. URL du dépôt Git, raccourci GitHub owner/repo ou URL SSH
path string Obligatoire. Chemin du sous-répertoire dans le dépôt contenant le plugin (par exemple, "tools/claude-plugin")
ref string Optionnel. Branche ou tag Git (par défaut la branche par défaut du dépôt)
sha string Optionnel. SHA de commit git complet de 40 caractères pour épingler à une version exacte

Paquets npm

Les plugins distribués en tant que paquets npm sont installés à l'aide de npm install. Cela fonctionne avec n'importe quel paquet du registre npm public ou d'un registre privé que votre équipe héberge.

{
  "name": "my-npm-plugin",
  "source": {
    "source": "npm",
    "package": "@acme/claude-plugin"
  }
}

Pour épingler à une version spécifique, ajoutez le champ version :

{
  "name": "my-npm-plugin",
  "source": {
    "source": "npm",
    "package": "@acme/claude-plugin",
    "version": "2.1.0"
  }
}

Pour installer à partir d'un registre privé ou interne, ajoutez le champ registry :

{
  "name": "my-npm-plugin",
  "source": {
    "source": "npm",
    "package": "@acme/claude-plugin",
    "version": "^2.0.0",
    "registry": "https://npm.example.com"
  }
}
Champ Type Description
package string Obligatoire. Nom du paquet ou paquet scopé (par exemple, @org/plugin)
version string Optionnel. Version ou plage de version (par exemple, 2.1.0, ^2.0.0, ~1.5.0)
registry string Optionnel. URL du registre npm personnalisé. Par défaut le registre npm du système (généralement npmjs.org)

Archives zip

Utilisez archive pour distribuer un plugin en tant que fichier zip que Claude Code télécharge via HTTPS, afin que les installations fonctionnent sans git ou npm sur la machine de l'utilisateur. Hébergez le fichier sur n'importe quel serveur de fichiers statiques ou référentiel d'artefacts, tel qu'un bucket S3, un référentiel générique Artifactory ou nginx. Nécessite Claude Code v2.1.224 ou ultérieur. Sur les versions v2.1.120 à v2.1.223, l'installation du plugin échoue avec This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again. ; sur les versions plus anciennes, une place de marché contenant une entrée archive ne se charge pas du tout.

Cette entrée installe le plugin à partir d'un fichier zip sur un serveur d'artefacts :

{
  "name": "my-plugin",
  "source": {
    "source": "archive",
    "url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip"
  }
}

Lorsque vous créez le zip, vous pouvez zipper le contenu du plugin directement ou zipper le dossier du plugin lui-même. Claude Code recherche .claude-plugin/ en haut de l'archive, puis à l'intérieur d'un seul dossier de niveau supérieur, donc les deux dispositions s'installent :

my-plugin.zip          my-plugin.zip
├── .claude-plugin/    └── my-plugin/
│   └── plugin.json        ├── .claude-plugin/
└── commands/              │   └── plugin.json
                           └── commands/

Claude Code ne cherche pas plus profondément qu'un dossier, donc un plugin imbriqué plus loin ne s'installe pas. Claude Code refuse les archives plus grandes que 256 MiB.

Pour épingler le fichier exact, ajoutez un champ sha256 avec le digest de l'archive :

{
  "name": "my-plugin",
  "source": {
    "source": "archive",
    "url": "https://artifacts.example.com/claude-plugins/my-plugin-2.1.0.zip",
    "sha256": "6bfa50e3d2e00c052b46abe51fff89346ac803e45771f76dcf6df1ab74cca5e1"
  }
}

Si le fichier téléchargé ne correspond pas à l'épingle, Claude Code refuse l'installation et signale Plugin archive integrity check failed.

Les sources d'archive acceptent ces champs :

Champ Type Description
url string Obligatoire. URL HTTPS de l'archive zip. Claude Code rejette les URL http://, ainsi que les hôtes de bouclage, lien-local et métadonnées cloud. Chaque saut de redirection doit satisfaire les mêmes règles, ou Claude Code refuse le téléchargement
sha256 string Optionnel. Digest SHA-256 de l'archive en tant que 64 caractères hexadécimaux, majuscules ou minuscules. Claude Code vérifie chaque téléchargement par rapport à celui-ci et refuse l'installation en cas de non-correspondance

Le digest sha256 sert également de version du plugin lorsque ni plugin.json ni l'entrée de la place de marché n'en déclare une. Voir Gestion des versions. Si vous déclarez une version, cette chaîne de version est le signal de mise à jour, donc après avoir modifié le zip et son digest, augmentez également la version, ou les utilisateurs conservent la copie en cache.

Authentifier les téléchargements d'archive

Pour authentifier un téléchargement d'archive, tel qu'un téléchargement à partir d'un registre privé, définissez les en-têtes HTTP que Claude Code envoie avec celui-ci. Définissez headers sur la source url à partir de laquelle vous avez enregistré la place de marché, tel qu'une entrée extraKnownMarketplaces. Sur Claude Code v2.1.238 ou ultérieur, vous pouvez le définir sur l'entrée du plugin à la place, à côté de source.

Si la valeur que vous mettriez dans headers est de courte durée, tel qu'un jeton que votre registre crée à la demande, définissez plutôt une commande headersHelper au même endroit. Claude Code exécute la commande et envoie l'objet JSON qu'elle imprime en tant que headers de cet endroit. Nécessite Claude Code v2.1.238 ou ultérieur.

L'endroit que vous choisissez décide quels téléchargements obtiennent les en-têtes et quand Claude Code exécute la commande :

Endroit Téléchargements qui obtiennent les en-têtes Quand Claude Code exécute un headersHelper défini là
Source url de la place de marché Téléchargements d'archive sur l'origine de l'URL de la place de marché, ce qui signifie le même schéma, hôte et port Avant chaque récupération du marketplace.json de la place de marché et avant chaque téléchargement d'archive sur cette origine. Claude Code réutilise la sortie d'une exécution pendant jusqu'à 60 secondes
Entrée de plugin Uniquement le téléchargement de cette entrée Uniquement lorsqu'un utilisateur installe ou met à jour ce seul plugin par lui-même et accepte la commande

Lorsque les deux endroits définissent un en-tête du même nom, Claude Code envoie la valeur de l'entrée. Au sein d'un endroit, un en-tête que la commande imprime remplace un en-tête du même nom répertorié dans headers.

Ajouter un headersHelper à une entrée de plugin

Cette entrée définit headersHelper à côté de source. Elle définit également "strict": false, que Claude Code exige d'une entrée marketplace.json qui définit headersHelper. Avec "strict": false, l'entrée de la place de marché est la définition complète du plugin, afin qu'un utilisateur puisse examiner ce que le plugin contient avant d'accepter la commande :

{
  "name": "my-plugin",
  "description": "Formatting commands for internal services",
  "strict": false,
  "commands": "./commands",
  "source": {
    "source": "archive",
    "url": "https://registry.example.com/plugins/my-plugin-2.1.0.zip"
  },
  "headersHelper": "/opt/bin/mint-registry-token.sh"
}

Pour vérifier l'entrée, exécutez claude plugin install my-plugin@your-marketplace. Claude Code vous montre la commande et l'URL de l'archive, et télécharge le zip après que vous acceptiez.

Avant v2.1.238, Claude Code téléchargeait l'archive d'une entrée sans ses headers ou headersHelper, donc une installation qui en dépendait échouait avec HTTP 401 while downloading plugin archive from, suivi de l'URL, avec le code d'état du registre à la place de 401.

Écrire la commande headersHelper

Que vous définissiez headersHelper sur la source url d'une place de marché ou sur une entrée de plugin, écrivez la commande pour répondre à ces exigences :

  • Texte de commande : au maximum 500 caractères ASCII imprimables, sans suite de quatre espaces ou plus.
  • Sortie : imprimez un objet JSON de noms d'en-têtes et de valeurs de chaîne sur stdout, puis quittez 0 dans les 10 secondes.
  • Shell et répertoire de travail : Claude Code exécute la commande via sh, ou cmd.exe sur Windows, à partir du répertoire de configuration, ~/.claude ou CLAUDE_CONFIG_DIR. Donnez un chemin absolu ou une commande sur PATH, car un chemin relatif se résout par rapport à ce répertoire, pas au projet de l'utilisateur.
  • Variables que Claude Code supprime : de l'environnement d'une commande définie dans une entrée marketplace.json ou dans le .claude/settings.json ou .claude/settings.local.json d'un projet, Claude Code supprime chaque variable dont le nom contient un mot tel que TOKEN, SECRET, KEY ou AUTH, y compris ANTHROPIC_API_KEY. Claude Code n'applique pas cette suppression à une commande définie dans les paramètres utilisateur, un fichier --settings ou les paramètres gérés.
  • Variables que Claude Code définit : CLAUDE_CODE_MARKETPLACE_URL et CLAUDE_CODE_MARKETPLACE_NAME pour la commande d'une source url, et CLAUDE_CODE_PLUGIN_NAME et CLAUDE_CODE_PLUGIN_ARCHIVE_URL pour la commande d'une entrée. CLAUDE_CODE_MARKETPLACE_NAME n'est pas défini lors de la première récupération après qu'un utilisateur ajoute une place de marché par URL, car cette récupération est ce qui fournit le nom.

Une commande qui crée un jeton porteur imprime un objet comme celui-ci :

{"Authorization": "Bearer eyJhbGciOiJSUzI1NiJ9"}

Quand Claude Code ignore une commande headersHelper ou abandonne sa sortie

Claude Code n'exécute pas une commande headersHelper, ou abandonne les en-têtes qui proviennent de headers ou de la sortie de la commande, dans ces situations :

  • La commande échoue : si la commande quitte non-zéro, s'exécute au-delà de 10 secondes ou imprime autre chose qu'un objet JSON de valeurs de chaîne, Claude Code ne fait pas la récupération ou le téléchargement pour lequel il a exécuté la commande.
  • L'URL de la place de marché ne commence pas par https:// : Claude Code n'exécute pas la commande de cette source url et envoie uniquement les en-têtes répertoriés dans son champ headers.
  • La redirection quitte l'origine : lorsqu'un téléchargement est redirigé hors de l'origine de l'URL de l'archive, Claude Code abandonne les valeurs headers et la sortie de la commande de la source url de la place de marché et de l'entrée de plugin.
  • L'entrée définit un en-tête de routage ou d'identité : Claude Code abandonne les noms de routage de requête et d'identité client tels que Host, Cookie et X-Forwarded-* de l'entrée headers et de la sortie de la commande, et conserve les noms d'authentification tels que Authorization. Claude Code filtre chaque entrée marketplace.json de cette façon, et une entrée de paramètres en ligne selon le fichier qui la déclare.
  • La commande est définie dans les paramètres d'un répertoire --add-dir : Claude Code l'ignore, sur une source url et sur une entrée de plugin en ligne de même, et envoie uniquement les headers de ce fichier.
  • Les paramètres gérés bloquent la commande : définir disableCommandPluginSources sur true bloque les commandes headersHelper, et allowManagedHooksOnly les bloque aussi sauf si disableCommandPluginSources est explicitement false. Sous l'un ou l'autre bloc, Claude Code exécute toujours la commande pour une place de marché que les paramètres gérés eux-mêmes déclarent.

Comment les utilisateurs acceptent une commande headersHelper

Un utilisateur accepte la commande d'une entrée de plugin chaque fois qu'il installe ou met à jour ce seul plugin par lui-même, à partir de la vue propre du plugin dans /plugin ou avec claude plugin install ou claude plugin update. Claude Code montre la commande et l'URL de l'archive, et exécute la commande uniquement après que l'utilisateur accepte. Dans un shell non-interactif, passez --yes pour l'accepter.

Claude Code exécute uniquement la commande qu'il a montrée, pour l'URL d'archive qu'il a montrée. Si la commande ou l'URL d'archive de l'entrée a changé entre-temps, Claude Code refuse l'installation ou la mise à jour. Un changement dans la chaîne de requête seul ne compte pas.

Installations et mises à jour qui refusent la commande au lieu de demander

Sur toute opération autre qu'une installation ou mise à jour d'un seul plugin, Claude Code n'exécute pas la commande d'une entrée ni ne télécharge son archive, donc le plugin reste à sa version installée ou reste désinstallé. Ce que l'utilisateur voit dépend de l'opération :

  • Installation de plusieurs plugins à la fois, à partir d'une suggestion de plugin ou en tant que dépendance d'un autre plugin : Claude Code refuse le plugin qui a la commande et pointe l'utilisateur vers la vue propre de ce plugin dans /plugin. Les autres plugins dans une installation en masse s'installent toujours. Un plugin qui dépend du plugin refusé ne s'installe pas jusqu'à ce que l'utilisateur installe le plugin refusé par lui-même.
  • Mise à jour automatique en arrière-plan, ou démarrage de session pour un plugin dont l'archive n'a jamais été téléchargée : Claude Code répertorie le plugin dans l'onglet /plugin Erreurs afin que l'utilisateur sache l'installer ou le mettre à jour à la main. Une mise à jour automatique qui trouve l'entrée annonce toujours la version installée répertorie rien.
Quand la commande de la source `url` de la place de marché s'exécute

Un headersHelper de source url de place de marché est déclaré dans un fichier de paramètres, tel qu'une entrée extraKnownMarketplaces, plutôt que dans le catalogue que la place de marché publie, donc Claude Code ne demande pas à l'utilisateur de l'accepter à chaque installation ou mise à jour. Le fichier de paramètres qui le déclare décide quand Claude Code l'exécute :

Fichier de paramètres Quand Claude Code exécute la commande
Paramètres utilisateur, un fichier --settings ou un fichier de paramètres gérés sur la machine Sans demander, y compris lors d'une actualisation de place de marché en arrière-plan
Le .claude/settings.json ou .claude/settings.local.json d'un projet Uniquement après que l'utilisateur accepte la boîte de dialogue de confiance de l'espace de travail pour ce dossier lui-même. Une session -p ou SDK ne compte pas comme l'accepter, et la confiance accordée à un dossier parent non plus
Paramètres gérés par le serveur Uniquement après que l'utilisateur approuve les paramètres livrés dans la boîte de dialogue d'approbation de sécurité

Dans une session -p ou SDK, Claude Code ne peut pas afficher la boîte de dialogue d'approbation de sécurité. Il applique les autres paramètres livrés, mais la récupération de la place de marché, et tout téléchargement d'archive qui a besoin de la commande, échoue jusqu'à ce qu'un utilisateur ait approuvé dans une session interactive.

Pour une entrée de plugin en ligne dans l'un de ces fichiers, Claude Code exige la même confiance de dossier ou approbation de paramètres que pour une commande au niveau de la place de marché dans ce fichier, et l'utilisateur accepte également la commande de l'entrée à chaque installation ou mise à jour.

Sources de commande

Utilisez command lorsqu'un outil installé localement produit le répertoire de plugin, tel qu'un IDE qui rend son plugin pour la chaîne d'outils actuellement sélectionnée. Claude Code exécute la commande lorsque l'utilisateur installe le plugin et la réexécute en arrière-plan une fois par session, afin que vos utilisateurs récupèrent la sortie modifiée de l'outil sans réinstaller. Nécessite Claude Code v2.1.229 ou ultérieur. Sur v2.1.120 à v2.1.228, l'installation du plugin échoue avec This plugin uses a source type your Claude Code version does not support. Update Claude Code and try again., et sur les versions plus anciennes la place de marché entière ne se charge pas.

Cette entrée installe le plugin à partir de quel que soit le répertoire que l'outil imprime :

{
  "name": "my-plugin",
  "source": {
    "source": "command",
    "command": "my-tool claude-plugin-path"
  }
}

Claude Code exécute la commande via le shell de la plateforme, sh sur macOS et Linux ou cmd.exe sur Windows, à partir du répertoire personnel de l'utilisateur. La commande doit imprimer exactement une ligne sur stdout et quitter avec le code 0. Cette ligne est le chemin absolu d'un répertoire qui contient le plugin complet au moment où la commande quitte, et le chemin peut changer entre les exécutions.

Claude Code arrête une commande qui s'exécute plus longtemps que timeout secondes, et l'installation ou la mise à jour échoue. Claude Code refuse également le chemin imprimé dans ces cas, et l'installation ou la mise à jour échoue de la même manière :

  • Le répertoire n'a pas de contenu de plugin à son niveau supérieur, tel qu'un répertoire .claude-plugin/ ou un répertoire skills/, commands/, agents/ ou hooks/
  • Le répertoire est celui dans lequel Claude Code a été démarré, ou l'un de ses parents
  • Sur Windows, le chemin est un chemin UNC

Les sources de commande acceptent ces champs :

Champ Type Description
command string Obligatoire. Commande shell qui imprime le chemin absolu du répertoire de plugin en tant que ligne unique sur stdout et quitte 0. Doit être ASCII imprimable, au maximum 500 caractères, sans suite de quatre espaces ou plus, afin que les utilisateurs puissent examiner la commande entière qu'on leur demande d'accepter
timeout number Optionnel. Nombre entier de secondes à attendre la commande avant d'abandonner (par défaut : 60, maximum : 600)
mode string Optionnel. "copy" (par défaut) copie le répertoire imprimé dans le cache de plugin. "link" utilise le répertoire imprimé à la place. Voir Mode copie et mode lien

Avec le "mode": "copy" par défaut, Claude Code copie le répertoire imprimé dans le cache de plugin versionné et dérive la version du plugin d'un hash du contenu du répertoire. Votre outil peut supprimer ou réécrire le répertoire après que la commande quitte, et une réexécution qui produit un contenu identique compte comme à jour. Claude Code refuse d'installer un répertoire plus grand que 256 MiB ou contenant plus de 20 000 entrées.

Définissez "mode": "link" pour les grands répertoires de plugin qui ne doivent pas être copiés, tel qu'une exportation SDK rendue. Claude Code remplit l'entrée de cache du plugin avec un lien vers chaque entrée de niveau supérieur du répertoire imprimé et utilise les fichiers à la place, donc rien n'est copié, les contenus de fichiers ne sont pas hashés, et les limites de taille ne s'appliquent pas. L'installation échoue si une entrée de niveau supérieur est un lien symbolique qui pointe en dehors du répertoire imprimé. Claude Code ignore également l'installation de dépendance de paquet Node.js pour un plugin en mode lien, donc imprimez un répertoire qui contient déjà tout node_modules dont le plugin a besoin.

Gardez le répertoire imprimé en place tant que le plugin reste installé, car Claude Code charge le plugin via ces liens à chaque démarrage. Claude Code dérive la version du plugin du chemin réel du répertoire imprimé et de ses entrées de niveau supérieur, pas des fichiers à l'intérieur, donc imprimez un chemin différent pour signaler un nouveau contenu. Dans une session démarrée dans le répertoire imprimé ou n'importe où en dessous, Claude Code ne charge pas du tout le plugin.

Claude Code ne prend pas en charge le mode lien sur Windows et refuse d'installer un plugin en mode lien là. Déclarez "mode": "copy" à la place.

Comment les utilisateurs acceptent la commande

Claude Code exécute votre commande sur la machine de l'utilisateur, donc il lie chaque exécution à l'acceptation explicite de l'utilisateur :

  • Lorsque les utilisateurs installent le plugin à partir de son écran de détails dans /plugin, ou l'installent ou le mettent à jour avec claude plugin install ou claude plugin update dans un terminal interactif, Claude Code leur montre d'abord la chaîne de commande exacte et enregistre la commande acceptée pour cette installation. Une claude plugin update qui peut procéder sur l'acceptation enregistrée de la même commande ne montre rien. Dans un shell non-interactif, tel qu'un script de provisionnement, passez --yes à claude plugin install ou claude plugin update pour accepter la commande qu'il imprime.
  • Chaque autre chemin exécute uniquement la commande que l'utilisateur a déjà acceptée. Cela inclut les mises à jour démarrées à partir de /plugin et les exécutions en arrière-plan décrites dans Quand Claude Code réexécute la commande. Lorsqu'aucune n'a été acceptée, Claude Code refuse d'exécuter la commande et dit à l'utilisateur comment l'examiner. Claude Code n'installe jamais un plugin provenant d'une source de commande en tant que dépendance d'un autre plugin, afin que les utilisateurs l'installent eux-mêmes d'abord.
  • Si vous modifiez la command de l'entrée, ou basculez son mode, les utilisateurs conservent la version qu'ils ont déjà et Claude Code arrête de réexécuter la commande. Dans les sessions interactives, l'onglet /plugin Erreurs montre la nouvelle commande jusqu'à ce que l'utilisateur l'examine et l'accepte en exécutant claude plugin update <plugin>@<marketplace>.

Les administrateurs peuvent bloquer les sources de commande dans une organisation avec le paramètre géré disableCommandPluginSources. Si une organisation définit allowManagedHooksOnly, Claude Code bloque les sources de commande par défaut.

Quand Claude Code réexécute la commande

Le répertoire imprimé reflète l'état de l'outil au moment où la commande s'est exécutée, donc Claude Code exécute la commande à nouveau à ces moments :

  • Chaque fois que l'utilisateur installe ou met à jour le plugin
  • Une fois par session pour chaque plugin provenant d'une source de commande activée, en arrière-plan, peu de temps après le démarrage de la session. Cette exécution ne passe pas par la mise à jour automatique de la place de marché, donc elle ne dépend pas du paramètre de mise à jour automatique de la place de marché
  • Au démarrage ou sur /reload-plugins, lorsque la version installée d'un plugin activé est manquante du cache de plugin

Claude Code ignore les deux exécutions en arrière-plan lorsque l'utilisateur définit CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC. Les installations et mises à jour explicites exécutent toujours la commande avec cette variable définie.

Lorsque la sortie hashée de la commande a changé, Claude Code installe le résultat en tant que nouvelle version et la recharge dans la session interactive en cours, basculant les mêmes composants que /reload-plugins bascule. L'utilisateur voit une notification que le plugin a été rechargé. Si le rechargement sur place invaliderait le cache d'invite de la session, Claude Code invite plutôt l'utilisateur à exécuter /reload-plugins, qui avertit du coût du cache et s'applique lorsqu'il est réexécuté avec --force.

Entrées de plugin avancées

Cet exemple montre une entrée de plugin utilisant de nombreux champs optionnels, notamment des chemins personnalisés pour les commandes, les agents, les hooks et les serveurs MCP :

{
  "name": "enterprise-tools",
  "source": {
    "source": "github",
    "repo": "company/enterprise-plugin"
  },
  "description": "Enterprise workflow automation tools",
  "version": "2.1.0",
  "author": {
    "name": "Enterprise Team",
    "email": "enterprise@example.com"
  },
  "homepage": "https://docs.example.com/plugins/enterprise-tools",
  "repository": "https://github.com/company/enterprise-plugin",
  "license": "MIT",
  "keywords": ["enterprise", "workflow", "automation"],
  "category": "productivity",
  "commands": [
    "./commands/core/",
    "./commands/enterprise/",
    "./commands/experimental/preview.md"
  ],
  "agents": ["./agents/security-reviewer.md", "./agents/compliance-checker.md"],
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"
          }
        ]
      }
    ]
  },
  "mcpServers": {
    "enterprise-db": {
      "command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
      "args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"]
    }
  },
  "strict": false
}

Points clés à noter :

  • commands et agents : vous pouvez spécifier plusieurs répertoires ou fichiers individuels. Les chemins sont relatifs à la racine du plugin et doivent rester à l'intérieur.
    • Claude Code rejette un chemin qui se résout en dehors du répertoire de plugin, tel que ./../shared.md, avec une erreur path escapes plugin directory, et charge toujours le plugin sans ce composant
  • ${CLAUDE_PLUGIN_ROOT} : utilisez cette variable dans les commandes de hook et les configurations du serveur MCP pour référencer les fichiers dans le répertoire d'installation du plugin.
    • Consultez le tableau de substitution pour savoir quels champs de configuration le substituent par type de serveur
    • Pour les dépendances ou l'état qui doivent survivre aux mises à jour des plugins, utilisez ${CLAUDE_PLUGIN_DATA} à la place
  • strict: false : puisque ceci est défini sur false, le plugin n'a pas besoin de son propre plugin.json. L'entrée de la place de marché définit tout. Voir Mode strict ci-dessous.

Par défaut, les compétences d'un plugin se chargent à partir du répertoire skills/ sous sa source. Les chemins répertoriés dans le champ skills s'ajoutent à cette analyse :

"skills": ["./skills/", "./extra-skills/"]

Lorsque plusieurs entrées de plugin partagent un dossier skills/ à la racine de la place de marché (source: "./"), énumérez plutôt des sous-répertoires spécifiques afin que chaque entrée ne charge que ses propres compétences :

"source": "./",
"skills": ["./skills/code-review", "./skills/docs"]

Avec une source à la racine de la place de marché, les chemins énumérés constituent l'ensemble complet pour cette entrée, et les autres répertoires dans le dossier skills/ partagé ne se chargent pas. L'énumération du répertoire skills/ lui-même, ou de la racine du plugin, maintient l'analyse complète. Si aucun des chemins énumérés n'existe, l'analyse par défaut s'exécute à la place.

Mode strict

Le champ strict contrôle si plugin.json est l'autorité pour les définitions de composants (compétences, agents, hooks, serveurs MCP, styles de sortie).

Valeur Comportement
true (par défaut) plugin.json est l'autorité. L'entrée de la place de marché peut la compléter avec des composants supplémentaires, et les deux sources sont fusionnées.
false L'entrée de la place de marché est la définition complète. Si le plugin a également un plugin.json qui déclare des composants, c'est un conflit et le plugin ne se charge pas.

Quand utiliser chaque mode :

  • strict: true : le plugin a son propre plugin.json et gère ses propres composants. L'entrée de la place de marché peut ajouter des compétences ou des hooks supplémentaires par-dessus. C'est la valeur par défaut et fonctionne pour la plupart des plugins.
  • strict: false : l'opérateur de la place de marché veut le contrôle total. Le dépôt du plugin fournit des fichiers bruts, et l'entrée de la place de marché définit lesquels de ces fichiers sont exposés en tant que compétences, agents, hooks, etc. Utile lorsque la place de marché restructure ou sélectionne les composants d'un plugin différemment de ce que l'auteur du plugin avait prévu.

Héberger et distribuer les places de marché

GitHub est la méthode recommandée pour héberger et distribuer une place de marché :

  1. Créer un dépôt : Configurez un nouveau dépôt pour votre place de marché
  2. Ajouter le fichier de place de marché : Créez .claude-plugin/marketplace.json avec vos définitions de plugins
  3. Partager avec les équipes : Les utilisateurs ajoutent votre place de marché avec /plugin marketplace add owner/repo

Avantages : Contrôle de version intégré, suivi des problèmes et fonctionnalités de collaboration d'équipe.

Héberger sur d'autres services git

N'importe quel service d'hébergement git fonctionne, comme GitLab, Bitbucket et les serveurs auto-hébergés. Les utilisateurs ajoutent avec l'URL complète du dépôt :

/plugin marketplace add https://gitlab.com/company/plugins.git

Dépôts privés

Claude Code prend en charge l'installation de plugins à partir de dépôts privés. Si vous distribuez votre place de marché via Paramètres de l'organisation > Plugins à la place, vos credentials git ne sont pas impliqués : la synchronisation de l'organisation lit le dépôt de la place de marché via l'application GitHub Claude ou l'application GitHub Enterprise de votre organisation, et une source de plugin qu'elle ne peut pas authentifier doit être publique. Consultez Distribuer via les paramètres de l'organisation pour les règles complètes.

Commandes que vous exécutez

Lorsque vous exécutez /plugin marketplace add, /plugin install, /plugin update ou /plugin marketplace update, Claude Code utilise vos assistants de credentials git existants, donc l'accès HTTPS via gh auth login, Keychain macOS ou git-credential-store fonctionne de la même manière que dans votre terminal. L'accès SSH fonctionne tant que l'hôte est déjà dans votre fichier known_hosts et que la clé est chargée dans ssh-agent, puisque Claude Code supprime les invites SSH interactives pour l'empreinte digitale de l'hôte et la phrase de passe de la clé. Les sources de raccourci owner/repo GitHub clonent par défaut via SSH ; définissez CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 pour les cloner via HTTPS à la place.

Mises à jour automatiques en arrière-plan

Par défaut, l'actualisation en arrière-plan désactive les assistants de credentials git pour son git pull, donc le pull ne peut pas s'authentifier auprès des dépôts privés sur HTTPS même lorsqu'un assistant est configuré. Les remotes SSH ne sont pas affectées : une clé chargée dans ssh-agent authentifie les pulls en arrière-plan de la même manière que les commandes que vous exécutez. Lorsque le pull en arrière-plan échoue, Claude Code revient à re-cloner la place de marché à partir de zéro. Le re-clone utilise vos credentials git stockés, mais il peut expirer sur les grands dépôts, donc les mises à jour automatiques de places de marché privées peuvent échouer par intermittence.

Deux paramètres rendent les places de marché privées prévisibles :

  • Définissez CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 pour conserver le clone existant lorsque le pull en arrière-plan échoue, au lieu de supprimer et re-cloner. Vos plugins continuent de fonctionner à partir du dernier état synchronisé, et les mises à jour manuelles avec /plugin marketplace update tirent toujours avec vos credentials.
  • Configurez un assistant de credentials git, par exemple avec gh auth setup-git pour GitHub, afin que le fallback re-clone puisse s'authentifier sans inviter.

Définir un jeton de fournisseur tel que GITHUB_TOKEN dans votre environnement n'active pas par lui-même l'authentification en arrière-plan. Les jetons ne prennent effet que via un assistant de credentials configuré, par exemple l'assistant de l'CLI gh, qui lit GH_TOKEN et GITHUB_TOKEN.

Pour que le pull en arrière-plan lui-même s'authentifie sur HTTPS, configurez une réécriture d'URL git globale. La réécriture intègre un jeton dans l'URL distante, donc elle prend effet même si le pull en arrière-plan désactive les assistants de credentials, et un pull réussi ignore le fallback re-clone. L'exemple suivant réécrit l'URL du dépôt de la place de marché pour inclure un jeton d'accès :

git config --global url."https://x-access-token:YOUR_TOKEN@github.com/acme-corp/plugins".insteadOf "https://github.com/acme-corp/plugins"

Limitez la réécriture au dépôt de la place de marché ou au chemin de l'organisation. Une réécriture dont la base est uniquement l'hôte s'applique à chaque fetch et push vers cet hôte sur la machine et remplace vos credentials normaux, y compris les pushes vers vos propres dépôts.

Chaque fournisseur attend un nom d'utilisateur différent dans l'URL réécrite, et la même limitation de chemin s'applique à chaque fournisseur. Pour les serveurs auto-hébergés, remplacez le nom d'hôte par le nom d'hôte de votre serveur :

Fournisseur Forme d'URL réécrite
GitHub https://x-access-token:YOUR_TOKEN@github.com/acme-corp/plugins
GitLab https://oauth2:YOUR_TOKEN@gitlab.com/acme-corp/plugins
Bitbucket https://x-token-auth:YOUR_TOKEN@bitbucket.org/acme-corp/plugins

La réécriture stocke le jeton en texte brut dans votre gitconfig, donc utilisez un jeton avec accès en lecture seule au dépôt de la place de marché.

Distribuer via les paramètres de l'organisation

Si vous distribuez des plugins via Paramètres de l'organisation > Plugins sur un plan Team ou Enterprise, ces règles de source s'appliquent :

  • Le dépôt de la place de marché doit être privé ou interne. La synchronisation de l'organisation le lit via l'application GitHub Claude ou l'application GitHub Enterprise de votre organisation.
  • Chaque source de plugin doit être de type github, url ou git-subdir, ou un chemin relatif qui commence par ./. Si vous listez un plugin par nom nu sous metadata.pluginRoot, la synchronisation de l'organisation le rejette comme source non prise en charge, donc écrivez le chemin, comme ./plugins/deploy-tools.
  • Une source de plugin peut être privée dans deux cas :
    • Une source github.com qui partage le propriétaire du dépôt de la place de marché
    • Une source sur l'hôte GitHub Enterprise de votre organisation avec l'application GHE installée sur le dépôt
  • La synchronisation de l'organisation récupère chaque autre source sans credentials, donc les dépôts github.com sous un propriétaire différent et les dépôts sur d'autres hôtes, comme GitLab ou Bitbucket, doivent être publics.

Consultez Gérer les plugins pour votre organisation pour le flux de travail administrateur.

Pour inclure des plugins privés, placez les dossiers de plugins à l'intérieur du dépôt de la place de marché et référencez-les avec un chemin relatif. La synchronisation de l'organisation empaquette chaque plugin lors de la distribution, donc les utilisateurs n'ont jamais besoin d'accès à un dépôt source séparé.

Par exemple, cette entrée de plugin marketplace.json référence un plugin que vous avez commité à plugins/deploy-tools dans le dépôt de la place de marché :

{
  "name": "deploy-tools",
  "source": "./plugins/deploy-tools"
}

Garder les exécutables hors du répertoire bin de niveau supérieur

N'incluez pas de répertoire bin/ de niveau supérieur dans aucun plugin que vous distribuez via les paramètres de l'organisation. claude.ai rejette un plugin qui en a un, que le plugin arrive par synchronisation de place de marché ou par téléchargement direct :

  • Synchronisation de place de marché : la synchronisation de l'organisation rejette ce plugin et synchronise le reste de la place de marché. Le message d'erreur commence par Plugin contains a top-level bin/ directory.
  • Téléchargement direct : si vous téléchargez le plugin dans Paramètres de l'organisation > Plugins à la place, claude.ai rejette le téléchargement avec le même message.

Gardez les exécutables dans un autre répertoire, comme scripts/, et référencez-les comme ${CLAUDE_PLUGIN_ROOT}/scripts/<name> à partir de vos skills, hooks ou configurations de serveur MCP.

Exiger des places de marché pour votre équipe

Vous pouvez configurer votre dépôt pour que Claude Code ajoute votre place de marché pour les membres de l'équipe une fois qu'ils font confiance au dossier du projet, sans invite séparée. Ajoutez votre place de marché à .claude/settings.json :

{
  "extraKnownMarketplaces": {
    "company-tools": {
      "source": {
        "source": "github",
        "repo": "your-org/claude-plugins"
      }
    }
  }
}

Vous pouvez également spécifier quels plugins doivent être activés par défaut :

{
  "enabledPlugins": {
    "code-formatter@company-tools": true,
    "deployment-tools@company-tools": true
  }
}

Pour les options de configuration complètes, consultez Paramètres des plugins.

Pré-remplir les plugins pour les conteneurs

Pour les images de conteneur et les environnements CI, vous pouvez pré-remplir un répertoire de plugins au moment de la construction afin que Claude Code démarre avec des places de marché et des plugins déjà disponibles, sans rien cloner au moment de l'exécution. Définissez la variable d'environnement CLAUDE_CODE_PLUGIN_SEED_DIR pour pointer vers ce répertoire.

Pour superposer plusieurs répertoires de seed, séparez les chemins avec : sur Unix ou ; sur Windows. Claude Code recherche chaque répertoire dans l'ordre et utilise le premier seed qui contient une place de marché ou un cache de plugin donné.

Le répertoire de seed reflète la structure de ~/.claude/plugins :

$CLAUDE_CODE_PLUGIN_SEED_DIR/
  known_marketplaces.json
  marketplaces/<name>/...
  cache/<marketplace>/<plugin>/<version>/...

Pour construire un répertoire de seed, exécutez Claude Code une fois lors de la construction de l'image, installez les plugins dont vous avez besoin, puis copiez le répertoire ~/.claude/plugins résultant dans votre image et pointez CLAUDE_CODE_PLUGIN_SEED_DIR vers lui.

Pour ignorer l'étape de copie, définissez CLAUDE_CODE_PLUGIN_CACHE_DIR sur votre chemin de seed cible lors de la construction afin que les plugins s'installent directement là :

CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin marketplace add your-org/plugins
CLAUDE_CODE_PLUGIN_CACHE_DIR=/opt/claude-seed claude plugin install my-tool@your-plugins

Ensuite, définissez CLAUDE_CODE_PLUGIN_SEED_DIR=/opt/claude-seed dans l'environnement d'exécution de votre conteneur afin que Claude Code lise à partir du seed au démarrage.

Au démarrage, Claude Code enregistre les places de marché trouvées dans le known_marketplaces.json du seed dans la configuration principale, et utilise les caches de plugins trouvés sous cache/ en place sans re-cloner. Cela fonctionne à la fois en mode interactif et en mode non-interactif avec le drapeau -p.

Détails du comportement :

  • Lecture seule : le répertoire de seed n'est jamais écrit. Les mises à jour automatiques sont désactivées pour les places de marché de seed puisque git pull échouerait sur un système de fichiers en lecture seule.
  • Les entrées de seed ont la priorité : les places de marché déclarées dans le seed remplacent toutes les entrées correspondantes dans la configuration de l'utilisateur à chaque démarrage. Pour refuser un plugin de seed, utilisez /plugin disable plutôt que de supprimer la place de marché.
  • Résolution des chemins : Claude Code localise le contenu de la place de marché en sondant $CLAUDE_CODE_PLUGIN_SEED_DIR/marketplaces/<name>/ au moment de l'exécution, pas en faisant confiance aux chemins stockés dans le JSON du seed. Cela signifie que le seed fonctionne correctement même lorsqu'il est monté à un chemin différent de celui où il a été construit.
  • La mutation est bloquée : l'exécution de /plugin marketplace remove ou /plugin marketplace update contre une place de marché gérée par seed échoue avec des conseils pour demander à votre administrateur de mettre à jour l'image de seed.
  • Compose avec les paramètres : si extraKnownMarketplaces ou enabledPlugins déclarent une place de marché qui existe déjà dans le seed, Claude Code utilise la copie du seed au lieu de cloner.

Restrictions des places de marché gérées

Pour les organisations nécessitant un contrôle strict sur les sources de plugins, les administrateurs peuvent restreindre les places de marché de plugins que les utilisateurs sont autorisés à ajouter en utilisant le paramètre strictKnownMarketplaces dans les paramètres gérés. Pour également rejeter les drapeaux CLI qui chargent les plugins, les agents et les serveurs MCP pour une seule exécution, associez-le à disableSideloadFlags. Pour créer une liste blanche des places de marché dont les plugins peuvent apparaître comme suggestions d'installation contextuelle, définissez pluginSuggestionMarketplaces.

strictKnownMarketplaces correspond à la place de marché d'où provient un plugin, pas aux entrées à l'intérieur, donc les utilisateurs peuvent toujours installer un plugin avec une source command à partir d'une place de marché autorisée. Pour bloquer également les sources de commande, définissez disableCommandPluginSources.

Lorsque strictKnownMarketplaces est configuré dans les paramètres gérés, le comportement de restriction dépend de la valeur :

Valeur Comportement
Non défini (par défaut) Aucune restriction. Les utilisateurs peuvent ajouter n'importe quelle place de marché
Tableau vide [] Verrouillage complet. Bloque chaque source de place de marché, y compris la place de marché officielle Anthropic
Liste de sources Liste d'autorisation appliquée. Les utilisateurs ne peuvent ajouter que les places de marché qui correspondent à une entrée

Configurations courantes

Désactiver tous les ajouts de place de marché, y compris la place de marché officielle Anthropic :

{
  "strictKnownMarketplaces": []
}

Autoriser uniquement la place de marché officielle Anthropic. La correspondance pour une entrée de dépôt unique est exacte, donc cette entrée ne couvre pas les variantes ref ou path du même dépôt :

{
  "strictKnownMarketplaces": [
    {
      "source": "github",
      "repo": "anthropics/claude-plugins-official"
    }
  ]
}

Avec cette entrée, Claude Code garde une place de marché officielle déjà enregistrée disponible et, sur une machine neuve, enregistre la place de marché automatiquement la première fois que vous démarrez Claude Code de manière interactive.

L'enregistrement automatique ne couvre pas chaque machine. Il manque le plus souvent :

  • Les environnements non-interactifs qui s'exécutent avant le premier lancement interactif de la machine.
  • Les machines où Claude Code a déjà fonctionné de manière interactive sous une politique qui a bloqué la place de marché, comme le verrouillage du tableau vide. Claude Code enregistre la tentative bloquée et ne réessaie pas après le changement de politique.

Sur ces machines, ajoutez la place de marché à extraKnownMarketplaces dans le même managed-settings.json afin que Claude Code l'enregistre automatiquement, ou exécutez claude plugin marketplace add anthropics/claude-plugins-official.

Autoriser uniquement les places de marché spécifiques :

{
  "strictKnownMarketplaces": [
    {
      "source": "github",
      "repo": "acme-corp/approved-plugins"
    },
    {
      "source": "github",
      "repo": "acme-corp/security-tools",
      "ref": "v2.0"
    },
    {
      "source": "url",
      "url": "https://plugins.example.com/marketplace.json"
    }
  ]
}

Autoriser chaque dépôt de place de marché sous une organisation GitHub avec une entrée owner-wildcard. Les owner-wildcards nécessitent Claude Code v2.1.223 ou ultérieur.

{
  "strictKnownMarketplaces": [
    {
      "source": "github",
      "repo": "acme-corp/*"
    }
  ]
}

Autoriser toutes les places de marché d'un serveur git interne en utilisant la correspondance de motif regex sur l'hôte. C'est l'approche recommandée pour GitHub Enterprise Server ou les instances GitLab auto-hébergées :

{
  "strictKnownMarketplaces": [
    {
      "source": "hostPattern",
      "hostPattern": "^github\\.example\\.com$"
    }
  ]
}

Autoriser les places de marché basées sur le système de fichiers à partir d'un répertoire spécifique en utilisant la correspondance de motif regex sur le chemin :

{
  "strictKnownMarketplaces": [
    {
      "source": "pathPattern",
      "pathPattern": "^/opt/approved/"
    }
  ]
}

Utilisez ".*" comme pathPattern pour autoriser n'importe quel chemin du système de fichiers tout en contrôlant les sources réseau avec hostPattern.

Comment fonctionnent les restrictions

Les restrictions sont vérifiées avant toute opération réseau ou système de fichiers. La vérification s'exécute lors de l'ajout de place de marché et lors de l'installation, la mise à jour, l'actualisation et la mise à jour automatique du plugin. Si une place de marché a été ajoutée avant la configuration de la politique et que sa source ne correspond plus à la liste d'autorisation, Claude Code refuse d'installer ou de mettre à jour les plugins à partir de celle-ci. L'application de la même restriction s'applique à blockedMarketplaces.

Pour bloquer chaque dépôt de place de marché sous un propriétaire GitHub, utilisez la forme owner-wildcard dans une entrée blockedMarketplaces : { "source": "github", "repo": "untrusted-org/*" }. Nécessite Claude Code v2.1.223 ou ultérieur. Pour les règles de correspondance, qui diffèrent entre la liste de blocage et la liste d'autorisation, consultez Owner wildcards.

Lorsqu'un utilisateur ajoute une URL de dépôt https:// que Claude Code clone plutôt que récupère, comme une URL de dépôt github.com ou gitlab.com nu, Claude Code la vérifie également par rapport aux entrées url dans blockedMarketplaces. Claude Code bloque l'ajout si une entrée nomme la même URL. Dans cette comparaison, Claude Code ignore le suffixe .git et toute ref que l'utilisateur ajoute après #. Nécessite Claude Code v2.1.232 ou ultérieur. Avant v2.1.232, Claude Code ne correspondait à une entrée url que par rapport à une URL qu'il récupérait en tant que fichier marketplace.json hébergé.

La liste d'autorisation utilise la correspondance exacte pour la plupart des types de sources, à part les entrées github owner-wildcard. Pour qu'une place de marché soit autorisée, tous les champs spécifiés doivent correspondre :

  • Pour les sources GitHub : repo est obligatoire, nommant soit un dépôt soit utilisant la forme owner-wildcard owner/* pour couvrir chaque dépôt sous ce propriétaire. Pour la façon dont les entrées wildcard correspondent, y compris les règles de casse, consultez Owner wildcards. Pour les entrées de dépôt unique, ref doit correspondre exactement ou être absent à la fois de la source de place de marché et de l'entrée de liste d'autorisation, et la même règle s'applique à path
  • Pour les sources URL : l'URL complète doit correspondre exactement
  • Pour les sources hostPattern : l'hôte de la place de marché est comparé au motif regex
  • Pour les sources pathPattern : le chemin du système de fichiers de la place de marché est comparé au motif regex

La correspondance exacte de la liste d'autorisation traite les URL qui diffèrent uniquement par une barre oblique finale, un suffixe .git ou le schéma ssh:// et https:// comme des valeurs différentes. Si la place de marché de votre organisation peut être clonée par plus d'une forme d'URL, préférez une entrée hostPattern à une URL littérale afin que les formes https://, ssh:// et user@host:path correspondent toutes.

Parce que strictKnownMarketplaces est défini dans les paramètres gérés, les configurations individuelles des utilisateurs et des projets ne peuvent pas contourner ces restrictions.

Pour les détails de configuration complets, y compris tous les types de sources pris en charge et la comparaison avec extraKnownMarketplaces, consultez la référence strictKnownMarketplaces.

Résolution des versions et canaux de publication

Les versions des plugins déterminent les chemins du cache et la détection des mises à jour : si la version résolue correspond à ce qu'un utilisateur possède déjà, /plugin update et la mise à jour automatique ignorent le plugin. Pour les sources basées sur git, si vous omettez version, Claude Code utilise le SHA du commit résolu de la source, donc les utilisateurs obtiennent une mise à jour chaque fois que ce commit change ; c'est la configuration la plus simple pour les plugins internes ou en développement actif. Consultez Gestion des versions pour l'ordre de résolution complet, y compris les sources archive.

Configurer les canaux de publication

Pour prendre en charge les canaux de publication « stable » et « latest » pour vos plugins, vous pouvez configurer deux places de marché qui pointent vers différentes refs ou SHAs du même dépôt. Vous pouvez ensuite assigner chaque groupe d'utilisateurs sa propre place de marché via les paramètres gérés de l'une des deux façons suivantes :

  • Déployez des paramètres gérés gérés par endpoint séparés, comme un fichier de paramètres gérés ou un profil MDM, aux appareils de chaque groupe. Comment Claude Code combine les sources gérées indique si le fichier ou le profil par groupe s'applique sur un appareil qui a également une source à l'échelle de l'organisation.
  • Définissez une politique de passerelle d'applications Claude par groupe. La passerelle applique la première politique dont la règle de correspondance correspond à un utilisateur, donc ordonnez les politiques afin que chaque utilisateur atteigne la politique de son groupe. La extraKnownMarketplaces d'une politique de groupe remplace la carte de la politique de rattrapage plutôt que de fusionner avec elle, donc listez chaque place de marché dont le groupe a besoin dans la politique du groupe, pas seulement sa place de marché de canal.

Les paramètres gérés par serveur à partir de la console d'administration s'appliquent à chaque utilisateur de votre organisation, donc ils ne peuvent pas porter une affectation par groupe.

Exemple
{
  "name": "stable-tools",
  "plugins": [
    {
      "name": "code-formatter",
      "source": {
        "source": "github",
        "repo": "acme-corp/code-formatter",
        "ref": "stable"
      }
    }
  ]
}
{
  "name": "latest-tools",
  "plugins": [
    {
      "name": "code-formatter",
      "source": {
        "source": "github",
        "repo": "acme-corp/code-formatter",
        "ref": "latest"
      }
    }
  ]
}
Assigner les canaux aux groupes d'utilisateurs

Assignez chaque place de marché à son groupe d'utilisateurs via les paramètres gérés par endpoint par groupe ou la politique de passerelle décrite sous Configurer les canaux de publication. Par exemple, le groupe stable reçoit :

{
  "extraKnownMarketplaces": {
    "stable-tools": {
      "source": {
        "source": "github",
        "repo": "acme-corp/stable-tools"
      }
    }
  }
}

Le groupe early-access reçoit latest-tools à la place :

{
  "extraKnownMarketplaces": {
    "latest-tools": {
      "source": {
        "source": "github",
        "repo": "acme-corp/latest-tools"
      }
    }
  }
}

Épingler les versions des dépendances

Un plugin peut contraindre ses dépendances à une plage semver afin que les mises à jour d'une dépendance ne cassent pas le plugin dépendant. Consultez Contraindre les versions des dépendances de plugins pour la convention de balise git {plugin-name}--v{version}, la syntaxe de plage et la façon dont plusieurs contraintes sur la même dépendance sont combinées.

Renommer ou supprimer un plugin

Le name d'un plugin est son identifiant stable. Les utilisateurs le référencent dans enabledPlugins, pluginConfigs et les commandes /plugin install, donc le changer casse chaque installation existante. Pour changer l'étiquette affichée dans l'interface utilisateur sans casser les installations, définissez displayName et gardez name inchangé.

Si vous devez changer le name d'un plugin, ou si vous supprimez un plugin du tableau plugins, ajoutez une entrée renames au niveau supérieur afin que les utilisateurs existants migrent au lieu de voir une erreur plugin-not-found. La migration automatique nécessite Claude Code v2.1.193 ou ultérieur. Mappez chaque ancien nom à son nouveau nom, ou à null si le plugin n'existe plus. L'exemple suivant renomme formatter en code-formatter et enregistre que legacy-linter a été supprimé :

{
  "name": "acme-tools",
  "owner": { "name": "Acme" },
  "plugins": [
    { "name": "code-formatter", "source": "./plugins/code-formatter" }
  ],
  "renames": {
    "formatter": "code-formatter",
    "legacy-linter": null
  }
}

Lorsqu'un utilisateur démarre Claude Code avec l'ancien nom toujours dans ses paramètres, Claude Code suit la carte renames :

  • Si l'entrée pointe vers un nouveau nom, Claude Code charge le plugin sous son nouveau nom et affiche un avis d'une ligne tel que Renamed to "code-formatter" in the "acme-tools" marketplace. Il réécrit ensuite l'ancienne clé vers la nouvelle clé dans les portées de paramètres utilisateur, projet et local pour enabledPlugins et pluginConfigs, afin que l'avis n'apparaisse qu'une fois.
  • Pour une entrée null, Claude Code supprime l'ancienne clé et l'avis signale que le plugin a été supprimé de la place de marché.
  • Si le plugin renommé utilise une source distante telle que github ou npm, Claude Code signale plugin-cache-miss après le renommage et l'utilisateur doit exécuter /plugin install une fois pour le récupérer sous le nouveau nom.

Traitez renames comme un historique d'ajout uniquement : gardez les anciennes entrées en place même après vous attendre à ce que chaque utilisateur ait migré. Claude Code suit les chaînes, donc si vous renommez ultérieurement code-formatter en formatter-pro, ajoutez une deuxième entrée plutôt que de modifier la première. Un utilisateur qui a toujours le formatter original activé se résout ensuite à travers les deux entrées vers formatter-pro.

Exécutez claude plugin validate . après avoir modifié la carte ; il rejette toute entrée dont la chaîne forme un cycle ou ne se termine pas à null ou à un nom listé dans plugins.

Les versions antérieures de Claude Code ignorent le champ renames et signalent plugin-not-found pour l'ancien nom.

Validation et test

Testez votre place de marché avant de la partager.

Validez la syntaxe JSON de votre répertoire de place de marché :

claude plugin validate .

Ou depuis Claude Code :

/plugin validate .

Ajoutez la place de marché pour le test :

/plugin marketplace add ./path/to/marketplace

Installez un plugin de test pour vérifier que tout fonctionne :

/plugin install test-plugin@marketplace-name

Pour les flux de travail complets de test de plugins, consultez Tester vos plugins localement. Pour le dépannage technique, consultez Référence des plugins.

Gérer les places de marché à partir de la CLI

Claude Code fournit des sous-commandes claude plugin marketplace non-interactives pour les scripts et l'automatisation. Elles sont équivalentes aux commandes /plugin marketplace disponibles dans une session interactive.

Plugin marketplace add

Ajoutez une place de marché à partir d'un dépôt GitHub, d'une URL git, d'une URL distante ou d'un chemin local.

claude plugin marketplace add <source> [options]

Arguments :

  • <source> : Raccourci GitHub owner/repo, URL git, URL distante vers un fichier marketplace.json ou chemin de répertoire local. Pour épingler à une branche ou un tag, ajoutez @ref au raccourci GitHub ou #ref à une URL git

Une URL doit inclure son schéma. À partir de Claude Code v2.1.196, un hôte saisi sans schéma, tel que gitlab.example.com/team/plugins, est rejeté comme un raccourci owner/repo invalide et l'erreur vous indique d'ajouter https:// ou d'utiliser ./ pour un chemin local. Les versions antérieures l'interprétaient mal comme un chemin de dépôt GitHub et échouent au moment du clonage avec une erreur GitHub non trouvé.

Options :

Option Description Par défaut
--scope <scope> Où déclarer la place de marché : user, project ou local. Voir Portées d'installation des plugins user
--sparse <paths...> Limiter le checkout à des répertoires spécifiques via git sparse-checkout. Utile pour les monodépôts

Ajoutez une place de marché à partir de GitHub en utilisant le raccourci owner/repo :

claude plugin marketplace add acme-corp/claude-plugins

Épinglez à une branche ou un tag spécifique avec @ref :

claude plugin marketplace add acme-corp/claude-plugins@v2.0

Ajoutez à partir d'une URL git sur un hôte non-GitHub :

claude plugin marketplace add https://gitlab.example.com/team/plugins.git

Ajoutez à partir d'une URL distante qui sert le fichier marketplace.json directement :

claude plugin marketplace add https://example.com/marketplace.json

Ajoutez à partir d'un répertoire local pour le test :

claude plugin marketplace add ./my-marketplace

Déclarez la place de marché à la portée du projet afin qu'elle soit partagée avec votre équipe via .claude/settings.json :

claude plugin marketplace add acme-corp/claude-plugins --scope project

Pour un monodépôt, limitez le checkout aux répertoires qui contiennent le contenu du plugin :

claude plugin marketplace add acme-corp/monorepo --sparse .claude-plugin plugins

Plugin marketplace list

Listez toutes les places de marché configurées.

claude plugin marketplace list [options]

Options :

Option Description
--json Sortie en JSON

Avec --json, chaque entrée inclut name, source, un champ installLocation avec le chemin du cache local où la place de marché est stockée, et des champs spécifiques à la source : repo pour les sources GitHub, url pour les sources git et URL, et path pour les sources locales. Les sources GitHub et git incluent également un champ ref lorsque la place de marché a été ajoutée avec une branche ou un tag épinglé.

Plugin marketplace remove

Supprimez une place de marché configurée. L'alias rm est également accepté.

claude plugin marketplace remove <name> [options]

Arguments :

  • <name> : nom de la place de marché à supprimer, comme indiqué par claude plugin marketplace list. C'est le name de marketplace.json, pas la source que vous avez passée à add

Options :

Option Description Par défaut
--scope <scope> Restreindre la suppression à une seule portée de paramètres : user, project ou local. Voir Portées d'installation des plugins. Lorsqu'il est omis, la déclaration est supprimée de chaque portée modifiable. Lorsqu'il est donné, seule la déclaration de cette portée est supprimée ; l'état partagé, le cache et les données des plugins installés sont préservés lorsque la place de marché est toujours déclarée dans une autre portée (toutes les portées)

Plugin marketplace update

Actualisez les places de marché à partir de leurs sources pour récupérer les nouveaux plugins et les changements de version. Une place de marché ajoutée avec une branche ou un tag ref se met à jour vers le dernier commit de cette ref, pas la branche par défaut du dépôt.

claude plugin marketplace update [name]

Arguments :

  • [name] : nom de la place de marché à mettre à jour, comme indiqué par claude plugin marketplace list. Met à jour toutes les places de marché si omis

À la fois remove et update échouent lorsqu'ils sont exécutés contre une place de marché gérée par seed, qui est en lecture seule. Lors de la mise à jour de toutes les places de marché, les entrées gérées par seed sont ignorées et les autres places de marché se mettent toujours à jour. Pour modifier les plugins fournis par seed, demandez à votre administrateur de mettre à jour l'image de seed. Voir Pré-remplir les plugins pour les conteneurs.

Dépannage

La place de marché ne se charge pas

Symptômes : Impossible d'ajouter la place de marché ou de voir les plugins qu'elle contient

Solutions :

  • Vérifiez que l'URL de la place de marché est accessible
  • Vérifiez que .claude-plugin/marketplace.json existe au chemin spécifié
  • Assurez-vous que la syntaxe JSON est valide en utilisant claude plugin validate . ou /plugin validate . à partir du répertoire de la place de marché. Pour vérifier le frontmatter des compétences, agents et commandes, consultez Valider un plugin ou un répertoire sans manifeste
  • Pour les dépôts privés, confirmez que vous avez les permissions d'accès

Erreurs de validation de la place de marché

Exécutez claude plugin validate . ou /plugin validate . à partir de votre répertoire de place de marché pour vérifier les problèmes. Lorsqu'il est pointé sur un répertoire de place de marché, le validateur vérifie marketplace.json pour les erreurs de schéma, les noms de plugins en doublon et la traversée de chemin source. Pour chaque entrée dont la source est un chemin local, il valide également le plugin.json de ce plugin et avertit lorsque la version de l'entrée ne correspond pas à celle dans plugin.json. Les problèmes trouvés dans le plugin.json d'un plugin sont préfixés par l'index d'entrée, sous la forme plugins[2] plugin.json →.

À partir de Claude Code v2.1.196, la passe par entrée inclut également :

  • les plugins dont la source est .
  • s'exécute lorsque marketplace.json est en dehors d'un répertoire .claude-plugin, en résolvant les sources par rapport au répertoire du fichier lui-même
  • signale les problèmes de chaque entrée même lorsqu'une autre partie du fichier a des erreurs de schéma

Les versions antérieures ignorent les plugins à la racine de la place de marché et ne descendent que depuis un .claude-plugin/marketplace.json.

À partir d'un répertoire de place de marché, Claude Code n'ouvre pas les fichiers de compétence, agent, commande ou hook des plugins. Pour trouver les erreurs dans ces fichiers, consultez Valider un plugin ou un répertoire sans manifeste. Le tableau ci-dessous énumère les erreurs les plus courantes d'un répertoire de place de marché, avec la cause et la correction pour chacune :

Erreur Cause Solution
No manifest found in directory. Expected .claude-plugin/marketplace.json or .claude-plugin/plugin.json Le répertoire que vous avez nommé n'a pas de .claude-plugin/marketplace.json ou plugin.json, et aucun fichier de compétence, agent ou commande à vérifier Exécutez à partir de la racine de la place de marché, ou créez .claude-plugin/marketplace.json avec les champs obligatoires
Invalid JSON syntax: Unexpected token... Erreur de syntaxe JSON dans marketplace.json Vérifiez les virgules manquantes, les virgules supplémentaires ou les chaînes non citées
Duplicate plugin name "x" found in marketplace Deux plugins partagent le même nom Donnez à chaque plugin une valeur name unique
plugins[0].source: Path contains ".." Le chemin source contient .. Utilisez des chemins relatifs à la racine de la place de marché sans ... Voir Chemins relatifs
Marketplace name cannot contain control or bidirectional-formatting characters Le nom de la place de marché contient un caractère de formatage bidirectionnel Unicode ou un caractère de contrôle, tel qu'une échappement ou une nouvelle ligne Supprimez le caractère du nom. Avant v2.1.247, ces caractères produisaient l'erreur Marketplace name impersonates an official Anthropic/Claude marketplace
Plugin name cannot contain control or bidirectional-formatting characters Un nom de plugin contient un caractère de formatage bidirectionnel Unicode ou un caractère de contrôle, tel qu'une échappement ou une nouvelle ligne Supprimez le caractère du nom. Avant v2.1.247, Claude Code n'exécutait pas cette vérification

Avertissements (non bloquants) :

  • Marketplace has no plugins defined : ajoutez au moins un plugin au tableau plugins
  • No marketplace description provided : ajoutez une description au niveau supérieur pour aider les utilisateurs à comprendre votre place de marché
  • Plugin name "x" is not kebab-case : renommez en minuscules, chiffres et tirets uniquement (par exemple, my-plugin). Claude Code accepte d'autres formes, mais la synchronisation de la place de marché claude.ai les rejette.
  • Marketplace name "x" is reserved in Claude Desktop : la place de marché est nommée org, org-provisioned ou unknown, dans n'importe quelle casse. Claude Code accepte ces noms, mais la synchronisation de la place de marché gérée de Claude Desktop rejette la place de marché entière. Renommez la place de marché. Avant v2.1.221, claude plugin validate n'exécutait pas cette vérification.
  • Marketplace name "x" is not accepted by Claude Desktop ou Plugin name "x" is not accepted by Claude Desktop : Claude Desktop accepte les noms de jusqu'à 128 caractères composés de lettres, chiffres, ., _ et -, commençant par une lettre ou un chiffre. Claude Code accepte d'autres formes, mais la synchronisation de la place de marché gérée de Claude Desktop rejette une place de marché dont le nom échoue à la vérification et supprime silencieusement une entrée de plugin dont le nom échoue. Renommez la place de marché ou le plugin. Avant v2.1.221, claude plugin validate n'exécutait pas ces vérifications.

Valider un plugin ou un répertoire sans manifeste

Pour trouver les fichiers de compétence, agent et commande dont le frontmatter ne s'analyse pas, exécutez claude plugin validate et nommez le répertoire qui les contient. Claude Code ne regarde pas en dehors du répertoire que vous nommez. Chaque exécution sauf une contre un plugin qui a un plugin.json nécessite Claude Code v2.1.233 ou ultérieur.

Choisir le répertoire à nommer

Claude Code vérifie différents fichiers selon le répertoire que vous nommez. Trouvez ce que vous voulez vérifier dans la première colonne, et exécutez la commande de cette ligne :

Pour vérifier Exécutez Claude Code vérifie
Un plugin qui a un plugin.json claude plugin validate ./plugins/my-plugin plugin.json, hooks/hooks.json, et les répertoires skills, agents et commands à la racine du plugin
Un répertoire de compétences, agents ou commandes, comme un plugin qui n'a pas encore de plugin.json claude plugin validate .claude/skills, ~/.claude/agents, ou ./my-plugin/agents Chaque fichier de compétence, agent ou commande dans ce répertoire
Un dossier dont la compétence est son SKILL.md racine claude plugin validate ./skills, en nommant le répertoire skills qui contient le dossier Le SKILL.md racine de chaque dossier. Le répertoire contenant doit être nommé skills ; un dossier sous un autre nom, comme plugins/, n'a pas d'exécution qui vérifie son SKILL.md racine
Les trois répertoires d'un projet à la fois claude plugin validate .claude, ou la racine du projet lorsqu'il n'a pas de manifeste .claude-plugin/ .claude/skills, .claude/agents et .claude/commands
Vos répertoires au niveau utilisateur claude plugin validate ~/.claude ~/.claude/skills, ~/.claude/agents et ~/.claude/commands
Vérifier un plugin dont la compétence est son `SKILL.md` racine

Lorsque vous exécutez claude plugin validate contre un répertoire de plugin, Claude Code ne vérifie pas un SKILL.md à la racine du plugin. Lorsque le plugin se trouve dans un répertoire nommé skills, exécutez la commande deux fois :

  • Nommez ce répertoire skills pour vérifier le SKILL.md racine du plugin.
  • Nommez le répertoire du plugin pour vérifier le reste.

Lorsque le plugin se trouve sous un autre nom, comme plugins/, l'exécution du répertoire skills n'est pas disponible, et aucune exécution ne vérifie son SKILL.md racine.

Lorsque vous exécutez claude plugin validate, Claude Code ne suit pas les symlinks à l'intérieur du répertoire que vous nommez. Ce qu'il fait dépend de l'endroit où se trouve le lien :

  • Un répertoire skills, agents ou commands lié sous la racine du plugin ou .claude : Claude Code avertit que rien dedans n'a été lu.
  • Une entrée liée à l'intérieur d'un répertoire skills, agents ou commands : Claude Code la saute et avertit, par répertoire, combien d'entrées il a sautées qu'une session chargerait.
  • Le répertoire skills, agents ou commands que vous nommez est lui-même un symlink, ou son répertoire parent .claude est : Claude Code signale une erreur et ne vérifie rien dedans. Nommez le répertoire réel à la place.

Dans deux cas de compétences, l'exécution réussit avec des avertissements. Pour vérifier les fichiers liés, exécutez à nouveau et nommez un répertoire qui les contient directement :

Lire les résultats de validation

Une exécution propre se termine par Validation passed.

No manifest found in directory signifie que Claude Code n'a trouvé aucun plugin.json ou marketplace.json là-bas, et aucun fichier de compétence, agent ou commande dans les répertoires qu'il sonde en dessous. Nommez le répertoire skills, agents ou commands qui contient vos fichiers à la place.

Deux des erreurs que Claude Code signale à partir de ces exécutions, avec la correction pour chacune :

  • YAML frontmatter failed to parse: ... : corrigez le YAML dans le bloc frontmatter du fichier de compétence, agent ou commande. Jusqu'à ce que vous le fassiez, une session ne lit aucun champ frontmatter du fichier
  • Invalid JSON syntax: ... sur hooks/hooks.json : corrigez la syntaxe JSON. Jusqu'à ce que vous le fassiez, une session charge le plugin sans les hooks dans ce fichier. Claude Code signale cette erreur uniquement dans une exécution de plugin

Dans une exécution de plugin, Claude Code avertit également d'un CLAUDE.md à la racine du plugin. Pour les chemins que vous définissez via les champs de chemin de composant dans plugin.json, Claude Code vérifie que chaque chemin existe mais ne lit pas les fichiers là-bas.

Échecs d'installation de plugins

Symptômes : La place de marché apparaît mais l'installation du plugin échoue

Solutions :

  • Vérifiez que les URL sources des plugins sont accessibles
  • Vérifiez que les répertoires des plugins contiennent les fichiers requis
  • Pour les sources GitHub, assurez-vous que les dépôts sont publics ou que vous avez accès
  • Testez manuellement les sources de plugins en les clonant/téléchargeant
  • Si la source épingle à la fois ref et sha, une branche ou un tag en amont supprimé ne bloque pas l'installation sur la plupart des hôtes git, y compris GitHub, GitLab et Bitbucket. Sur les serveurs qui ne supportent pas la récupération des commits par SHA, comme AWS CodeCommit, le ref doit toujours exister et le commit épinglé doit être accessible à partir de celui-ci. Si l'installation échoue toujours, confirmez que le commit épinglé existe toujours dans le dépôt

L'authentification du dépôt privé échoue

Symptômes : Erreurs d'authentification lors de l'installation de plugins à partir de dépôts privés

Solutions :

Pour l'installation manuelle et les mises à jour :

  • Vérifiez que vous êtes authentifié auprès de votre fournisseur git (par exemple, exécutez gh auth status pour GitHub)
  • Vérifiez que votre assistant de credentials est configuré : git config --global credential.helper
  • Exécutez git ls-remote <marketplace-url> pour tester si git peut s'authentifier seul. Si git demande un nom d'utilisateur ou un mot de passe, stockez d'abord les credentials : pour GitHub via HTTPS, exécutez gh auth setup-git, et pour les dépôts SSH, chargez votre clé dans ssh-agent

Pour les mises à jour automatiques en arrière-plan :

  • Par défaut, les actualisations en arrière-plan désactivent les assistants de credentials git pour la récupération, de sorte que la récupération ne peut pas s'authentifier via HTTPS. Les dépôts SSH avec une clé chargée dans ssh-agent s'authentifient toujours. Un échec de récupération déclenche un re-clonage à partir de zéro, qui utilise vos credentials stockés mais peut expirer sur les grands dépôts
  • Définissez CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 pour conserver le clone existant lorsque la récupération en arrière-plan échoue
  • Configurez un assistant de credentials git, par exemple gh auth setup-git, de sorte que le re-clonage de secours puisse s'authentifier
  • Si le re-clonage expire sur un grand dépôt, augmentez la limite avec CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS
  • Configurez une réécriture d'URL git limitée au dépôt de la place de marché de sorte que la récupération en arrière-plan s'authentifie directement
  • Ou mettez à jour les places de marché privées manuellement avec /plugin marketplace update <name>, qui utilise vos credentials

Les mises à jour de la place de marché échouent dans les environnements hors ligne

Symptômes : Le git pull de la place de marché échoue en arrière-plan et Claude Code tente à plusieurs reprises un re-clonage qui ne peut pas réussir.

Cause : Par défaut, lorsqu'un git pull échoue, Claude Code tente un re-clonage à partir de zéro. Dans les environnements hors ligne ou isolés, le re-clonage échoue de la même manière, et la restauration du cache précédent après est au mieux un effort. L'actualisation s'exécute en arrière-plan après le démarrage, de sorte qu'elle ne retarde pas le démarrage, mais chaque session répète les tentatives échouées et chaque opération git peut attendre le délai d'expiration de 120 secondes.

Solution : Définissez CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1 pour ignorer la tentative de re-clonage et continuer à utiliser le cache existant lorsque la récupération échoue :

export CLAUDE_CODE_PLUGIN_KEEP_MARKETPLACE_ON_FAILURE=1

Pour les déploiements entièrement hors ligne où le dépôt ne sera jamais accessible, utilisez CLAUDE_CODE_PLUGIN_SEED_DIR pour pré-remplir le répertoire des plugins au moment de la construction à la place.

Les opérations Git expirent

Symptômes : L'installation du plugin ou les mises à jour de la place de marché échouent avec une erreur de délai d'expiration comme « Git clone timed out after 120s » ou « Git pull timed out after 120s ».

Cause : Claude Code utilise un délai d'expiration de 120 secondes pour toutes les opérations git, y compris le clonage des dépôts de plugins et l'extraction des mises à jour de la place de marché. Les grands dépôts ou les connexions réseau lentes peuvent dépasser cette limite.

Solution : Augmentez le délai d'expiration en utilisant la variable d'environnement CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS. La valeur est en millisecondes :

export CLAUDE_CODE_PLUGIN_GIT_TIMEOUT_MS=300000  # 5 minutes

Les plugins avec chemins relatifs échouent dans les places de marché basées sur les URL

Symptômes : Vous avez ajouté une place de marché via URL (comme https://example.com/marketplace.json), mais les plugins avec des sources de chemin relatif comme "./plugins/my-plugin" échouent à installer avec des erreurs « path not found ».

Cause : L'ajout d'une place de marché basée sur les URL télécharge uniquement le fichier marketplace.json lui-même, et Claude Code ne récupère pas les fichiers de plugins par chemin relatif à partir de ce serveur. Les chemins relatifs dans l'entrée de la place de marché référencent des fichiers sur le serveur distant qui n'ont pas été téléchargés.

Solutions :

  • Utiliser des sources externes : changez les entrées de plugins pour n'importe quelle source de plugin autre qu'un chemin relatif :
    { "name": "my-plugin", "source": { "source": "github", "repo": "owner/repo" } }
    
  • Utiliser une place de marché basée sur Git : Hébergez votre place de marché dans un dépôt Git et ajoutez-la avec l'URL git. Les places de marché basées sur Git clonent le dépôt entier, ce qui rend les chemins relatifs fonctionnels.

Fichiers non trouvés après l'installation

Symptômes : Le plugin s'installe mais les références aux fichiers échouent, en particulier les fichiers en dehors du répertoire du plugin

Cause : Les plugins sont copiés vers un répertoire de cache plutôt que d'être utilisés sur place, sauf pour une source command en mode lien. Les chemins qui référencent des fichiers en dehors du répertoire du plugin copié (comme ../shared-utils) ne fonctionneront pas car ces fichiers ne sont pas copiés.

Solutions : Consultez Plugin caching and file resolution pour les solutions de contournement, y compris les symlinks et la restructuration des répertoires.

Pour des outils de débogage supplémentaires et des problèmes courants, consultez Debugging and development tools.

Voir aussi