Référence des plugins
Référence technique complète pour le système de plugins Claude Code, incluant les schémas, les commandes CLI et les spécifications des composants.
Vous cherchez à installer des plugins ? Consultez Découvrir et installer des plugins. Pour créer des plugins, consultez Plugins. Pour distribuer des plugins, consultez Marchés de plugins.
Un plugin est un répertoire autonome de composants qui étend Claude Code avec des fonctionnalités personnalisées. Les composants de plugin incluent skills, agents, hooks, serveurs MCP, serveurs LSP et moniteurs.
Référence des composants de plugin
Skills
Les plugins ajoutent des skills à Claude Code, créant des raccourcis /name que vous ou Claude pouvez invoquer.
Emplacement : répertoire skills/ ou commands/ à la racine du plugin, ou un seul fichier SKILL.md à la racine du plugin
Format de fichier : Les skills sont des répertoires avec SKILL.md ; les commandes sont de simples fichiers markdown
Structure du skill :
skills/
├── pdf-processor/
│ ├── SKILL.md
│ ├── reference.md (optional)
│ └── scripts/ (optional)
└── code-reviewer/
└── SKILL.md
Les skills et les commandes sont automatiquement découverts lors de l'installation du plugin.
Si un plugin n'a pas de répertoire skills/ et pas de champ manifest skills, un SKILL.md à la racine du plugin est chargé comme un skill unique. Définissez le champ frontmatter name pour contrôler le nom d'invocation du skill. Sans cela, Claude Code revient au nom du répertoire d'installation, qui pour les plugins installés depuis la marketplace est une chaîne de version qui change à chaque mise à jour. Pour les plugins qui fournissent plus d'un skill, utilisez la disposition du répertoire skills/ montrée ci-dessus.
Dans les skills et commandes de plugin, les champs frontmatter booléens tels que disable-model-invocation acceptent yes, no, on, off, 1 et 0 dans n'importe quelle casse de lettre, en plus de true et false. Avant v2.1.218, Claude Code ne reconnaissait que true et false.
Pour plus de détails, consultez Skills.
Agents
Les plugins peuvent fournir des sous-agents spécialisés pour des tâches spécifiques que Claude peut invoquer automatiquement si approprié.
Emplacement : répertoire agents/ à la racine du plugin
Format de fichier : Fichiers markdown décrivant les capacités de l'agent
Structure de l'agent :
---
name: agent-name
description: What this agent specializes in and when Claude should invoke it
model: sonnet
effort: medium
maxTurns: 20
disallowedTools: Write, Edit
---
Detailed system prompt for the agent describing its role, expertise, and behavior.
Les agents de plugin supportent les champs frontmatter name, description, model, effort, maxTurns, tools, disallowedTools, skills, memory, background et isolation. La seule valeur isolation valide est "worktree". Pour des raisons de sécurité, hooks, mcpServers et permissionMode ne sont pas supportés pour les agents fournis par les plugins.
Claude Code charge un agent de plugin même quand son frontmatter n'a pas de name ou ne s'analyse pas :
- Pas de
name: Claude Code nomme l'agent d'après le fichier, doncagents/reviewer.mddans un plugin nommémy-pluginse charge commemy-plugin:reviewer - Frontmatter qui ne s'analyse pas : Claude Code nomme l'agent d'après le fichier, utilise
Agent from my-plugin plugincomme sa description, et ignore tous les champs du fichier
En contraste, Claude Code ignore un fichier d'agent de projet, utilisateur ou géré dont le frontmatter n'a pas de name ou ne s'analyse pas.
Pour trouver les fichiers dans le répertoire agents/ par défaut d'un plugin dont le frontmatter ne s'analyse pas, exécutez claude plugin validate. Le chemin que vous passez dépend de si le plugin a un manifest, et les deux exemples utilisent ./my-plugin comme répertoire du plugin :
- Un plugin avec un manifest :
claude plugin validate ./my-plugin - Un plugin sans manifest :
claude plugin validate ./my-plugin/agents. Nécessite Claude Code v2.1.233 ou ultérieur.
Les agents apparaissent dans la typeahead @-mention sous leur nom scopé, tel que my-plugin:code-reviewer, une fois que le plugin est activé.
Pour plus de détails, consultez Sous-agents.
Hooks
Les plugins peuvent fournir des gestionnaires d'événements qui répondent automatiquement aux événements de Claude Code.
Emplacement : hooks/hooks.json à la racine du plugin, ou en ligne dans plugin.json
Format : Configuration JSON avec des matchers d'événements et des actions
Configuration du hook :
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/format-code.sh"
}
]
}
]
}
}
Les hooks de plugin répondent aux mêmes événements de cycle de vie que les hooks définis par l'utilisateur :
| Événement | Quand il se déclenche |
|---|---|
SessionStart |
Quand une session commence ou reprend |
Setup |
Quand vous démarrez Claude Code avec --init-only, ou avec --init ou --maintenance en mode -p. Pour une préparation unique en CI ou dans les scripts |
UserPromptSubmit |
Quand vous soumettez une invite, avant que Claude la traite |
UserPromptExpansion |
Quand une commande tapée par l'utilisateur se développe en une invite, avant qu'elle n'atteigne Claude. Peut bloquer l'expansion |
PreToolUse |
Avant qu'un appel d'outil s'exécute. Peut le bloquer |
PermissionRequest |
Quand un appel d'outil nécessite une décision de permission |
PermissionDenied |
Quand le mode automatique refuse un appel d'outil, y compris les refus sans verdict du classificateur. Utilisez la sortie JSON hookSpecificOutput.retry: true pour indiquer au modèle qu'il peut réessayer l'appel d'outil refusé. Claude Code ignore retry quand le classificateur n'a produit aucun verdict |
PostToolUse |
Après qu'un appel d'outil réussisse |
PostToolUseFailure |
Après qu'un appel d'outil échoue |
PostToolBatch |
Après qu'un lot complet d'appels d'outils parallèles se résout, avant l'appel du modèle suivant |
Notification |
Quand Claude Code envoie une notification |
MessageDisplay |
Pendant que le texte du message assistant s'affiche |
SubagentStart |
Quand un sous-agent est généré |
SubagentStop |
Quand un sous-agent se termine |
TaskCreated |
Quand une tâche est en cours de création via TaskCreate |
TaskCompleted |
Quand une tâche est marquée comme complétée |
Stop |
Quand Claude finit de répondre |
StopFailure |
Quand le tour se termine en raison d'une erreur API |
TeammateIdle |
Quand un coéquipier d'une équipe d'agents est sur le point de devenir inactif |
InstructionsLoaded |
Quand un fichier CLAUDE.md ou .claude/rules/*.md est chargé dans le contexte. Se déclenche au démarrage de la session et quand les fichiers sont chargés paresseusement pendant une session |
ConfigChange |
Quand un fichier de configuration change pendant une session |
CwdChanged |
Quand le répertoire de travail change, par exemple quand Claude exécute une commande cd. Utile pour la gestion réactive de l'environnement avec des outils comme direnv |
DirectoryAdded |
Quand un répertoire de travail est ajouté en milieu de session via /add-dir ou la demande de contrôle SDK register_repo_root |
FileChanged |
Quand un fichier surveillé change sur le disque. Le champ matcher spécifie les noms de fichiers à surveiller |
WorktreeCreate |
Quand un worktree est en cours de création via --worktree, isolation: "worktree", ou pour une session en arrière-plan. Remplace le comportement git par défaut |
WorktreeRemove |
Quand un worktree est supprimé à la sortie de la session, quand un sous-agent se termine, ou quand vous supprimez une session en arrière-plan |
PreCompact |
Avant la compaction du contexte |
PostCompact |
Après la compaction du contexte est complétée |
PreModelSwitch |
Avant que Claude Code applique un changement de modèle que vous ou un client avez demandé. Peut bloquer le changement |
PostModelSwitch |
Après que le modèle de la session change, y compris les changements que Claude Code effectue de lui-même, comme la restauration du modèle quand vous reprenez une session |
Elicitation |
Quand un serveur MCP demande une entrée utilisateur pendant un appel d'outil |
ElicitationResult |
Après qu'un utilisateur réponde à une élicitation MCP, avant que la réponse soit renvoyée au serveur |
SessionEnd |
Quand une session se termine |
Types de hook :
command: exécuter des commandes shell ou des scriptshttp: envoyer l'événement JSON comme une requête POST à une URLmcp_tool: appeler un outil sur un serveur MCP configuréprompt: évaluer un prompt avec un LLM (utilise le placeholder$ARGUMENTSpour le contexte)agent: exécuter un vérificateur agentic avec des outils pour les tâches de vérification complexes
Les hooks qui ciblent le serveur MCP bundlé du plugin doivent utiliser ses noms scopés. Les matchers d'outils et les champs if prennent le nom d'outil scopé mcp__plugin_<plugin-name>_<server-name>__<tool>, et le champ server d'un hook mcp_tool prend plugin:<plugin-name>:<server-name>. Un matcher écrit contre la clé de serveur nue ne se déclenche jamais. Consultez Match MCP tools et Plugin-provided MCP servers.
MCP servers
Les plugins peuvent bundler des serveurs Model Context Protocol (MCP) pour connecter Claude Code avec des outils et services externes.
Emplacement : .mcp.json à la racine du plugin, ou en ligne dans plugin.json
Format : Configuration standard du serveur MCP
Configuration du serveur MCP :
{
"mcpServers": {
"plugin-database": {
"command": "${CLAUDE_PLUGIN_ROOT}/servers/db-server",
"args": ["--config", "${CLAUDE_PLUGIN_ROOT}/config.json"],
"env": {
"DB_PATH": "${CLAUDE_PLUGIN_ROOT}/data"
}
},
"plugin-api-client": {
"command": "npx",
"args": ["@company/mcp-server", "--plugin-mode"]
}
}
}
Comportement d'intégration :
- Les serveurs MCP de plugin démarrent automatiquement quand le plugin est activé
- Les serveurs apparaissent comme des outils MCP standard dans la boîte à outils de Claude
- Les serveurs de plugin peuvent être configurés indépendamment des serveurs MCP utilisateur
- Si vous exécutez
/reload-pluginsen milieu de session, Claude Code maintient les connexions actives des serveurs dont la configuration est inchangée
LSP servers
Vous cherchez à utiliser des plugins LSP ? Installez-les depuis la marketplace officielle : recherchez « lsp » dans l'onglet Discover /plugin. Cette section documente comment créer des plugins LSP pour les langages non couverts par la marketplace officielle.
Les plugins peuvent fournir des serveurs Language Server Protocol (LSP) pour donner à Claude une intelligence de code en temps réel en travaillant sur votre base de code.
Emplacement : .lsp.json à la racine du plugin, ou en ligne dans plugin.json
Format : Configuration JSON mappant les noms de serveurs de langage à leurs configurations
Format du fichier .lsp.json :
{
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}
En ligne dans plugin.json :
{
"name": "my-plugin",
"lspServers": {
"go": {
"command": "gopls",
"args": ["serve"],
"extensionToLanguage": {
".go": "go"
}
}
}
}
Champs obligatoires :
| Field | Description |
|---|---|
command |
Le binaire LSP à exécuter (doit être dans PATH) |
extensionToLanguage |
Mappe les extensions de fichier aux identifiants de langage |
Champs optionnels :
| Field | Description |
|---|---|
args |
Arguments de ligne de commande pour le serveur LSP |
transport |
Transport de communication : stdio (par défaut) ou socket. Claude Code accepte socket mais exécute chaque serveur sur stdio, donc les règles du protocole stdout s'appliquent à tous les serveurs |
env |
Variables d'environnement à définir au démarrage du serveur |
initializationOptions |
Options passées au serveur lors de l'initialisation |
settings |
Paramètres passés via workspace/didChangeConfiguration |
workspaceFolder |
Chemin du dossier d'espace de travail pour le serveur |
startupTimeout |
Temps maximum d'attente du démarrage du serveur (millisecondes) |
shutdownTimeout |
Temps maximum d'attente de l'arrêt gracieux (millisecondes). Quand le délai d'attente s'écoule, Claude Code termine le processus du serveur. Quand non défini, aucun délai d'attente ne s'applique |
restartOnCrash |
Si le serveur doit redémarrer après un crash. Par défaut true. Définissez à false pour laisser un serveur crashé arrêté au lieu de le redémarrer |
maxRestarts |
Nombre maximum de tentatives de redémarrage avant d'abandonner |
diagnostics |
Si les diagnostics doivent être poussés dans le contexte de Claude après les éditions (par défaut true). Définissez à false pour garder la navigation de code mais supprimer l'injection automatique de diagnostics. |
restartOnCrash et shutdownTimeout nécessitent Claude Code v2.1.205 ou ultérieur. Avant v2.1.205, le schéma de configuration acceptait les deux options mais définir l'une d'elles causait à Claude Code de sauter ce serveur LSP entièrement au démarrage, avec la raison visible uniquement dans la sortie claude --debug.
Plusieurs serveurs pour la même extension : quand plus d'un serveur LSP activé déclare la même extension de fichier dans extensionToLanguage, que les serveurs proviennent d'un plugin ou de différents plugins, le premier serveur enregistré gère les fichiers avec cette extension et les autres ne démarrent jamais. L'interface /plugin affiche un avertissement nommant le plugin dont le serveur est actif.
Serveurs qui échouent à initialiser : Claude Code ignore un serveur dont la configuration est invalide, par exemple un manquant command ou extensionToLanguage, et les autres serveurs configurés démarrent toujours. Exécutez claude --debug pour voir pourquoi un serveur a été ignoré.
Un serveur ignoré ne réclame pas ses extensions de fichier, donc un autre serveur valide qui déclare la même extension, du même plugin ou d'un plugin différent, gère toujours ces fichiers.
Envoyez la sortie de log à stderr, pas stdout : Claude Code lit le stdout d'un serveur comme des messages de protocole uniquement, et accepte les en-têtes de message jusqu'à 64 KiB et un corps de message jusqu'à 32 MiB. Claude Code déconnecte un serveur qui dépasse l'une ou l'autre limite ou écrit une sortie non-protocole à stdout, et compte la déconnexion comme un crash pour restartOnCrash et maxRestarts. Quand vous exécutez avec --debug, Claude Code écrit une erreur nommant la cause au journal de débogage.
Vous devez installer le binaire du serveur de langage séparément. Les plugins LSP configurent comment Claude Code se connecte à un serveur de langage, mais ils n'incluent pas le serveur lui-même. Si vous voyez Executable not found in $PATH dans l'onglet Errors /plugin, installez le binaire requis pour votre langage.
Plugins LSP disponibles :
| Plugin | Language server | Install command |
|---|---|---|
pyright-lsp |
Pyright (Python) | pip install pyright ou npm install -g pyright |
typescript-lsp |
TypeScript Language Server | npm install -g typescript-language-server typescript |
rust-analyzer-lsp |
rust-analyzer | Voir l'installation de rust-analyzer |
Installez d'abord le serveur de langage, puis installez le plugin depuis la marketplace.
Monitors
Les plugins peuvent déclarer des moniteurs de fond que Claude Code démarre automatiquement quand le plugin est actif. Chaque moniteur exécute une commande shell pour la durée de vie de la session et livre chaque ligne stdout à Claude comme une notification, donc Claude peut réagir aux entrées de log, changements de statut, ou événements sondés sans être demandé de démarrer la montre lui-même.
Les moniteurs de plugin utilisent le même mécanisme que l'outil Monitor et partagent ses contraintes de disponibilité. Ils s'exécutent uniquement dans les sessions CLI interactives, s'exécutent non-sandboxés au même niveau de confiance que les hooks, et sont ignorés sur les hôtes où l'outil Monitor est indisponible.
Emplacement : monitors/monitors.json à la racine du plugin, ou en ligne dans plugin.json
Format : Tableau JSON d'entrées de moniteur
Le monitors/monitors.json suivant surveille un point de terminaison de statut de déploiement et un journal d'erreurs local :
[
{
"name": "deploy-status",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/poll-deploy.sh",
"description": "Deployment status changes"
},
{
"name": "error-log",
"command": "tail -F ./logs/error.log",
"description": "Application error log",
"when": "on-skill-invoke:debug"
}
]
Pour déclarer les moniteurs en ligne, définissez experimental.monitors dans plugin.json au même tableau. Pour charger depuis un chemin non-par défaut, définissez experimental.monitors à une chaîne de chemin relatif telle que "./config/monitors.json". Les moniteurs sont un composant expérimental.
Champs obligatoires :
| Field | Description |
|---|---|
name |
Identifiant unique au sein du plugin. Empêche les processus dupliqués quand le plugin se recharge ou un skill est invoqué à nouveau |
command |
Commande shell exécutée comme un processus de fond persistant dans le répertoire de travail de la session |
description |
Résumé court de ce qui est surveillé. Affiché dans le panneau de tâches et dans les résumés de notification |
Champs optionnels :
| Field | Description |
|---|---|
when |
Contrôle quand le moniteur démarre. "always" le démarre au démarrage de la session et au rechargement du plugin, et est la valeur par défaut. "on-skill-invoke:<skill-name>" le démarre la première fois que le skill nommé dans ce plugin est dispatché |
La valeur command supporte les substitutions de chemin ${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA} et ${CLAUDE_PROJECT_DIR}, plus n'importe quel ${ENV_VAR} de l'environnement. Préfixez la commande avec cd "${CLAUDE_PLUGIN_ROOT}" && si le script doit s'exécuter depuis le répertoire du plugin lui-même.
Une command de moniteur ne peut pas référencer les valeurs ${user_config.*}. La commande s'exécute via un shell, donc Claude Code rejette le moniteur avec une erreur au lieu de substituer la valeur. Les processus de moniteur ne reçoivent pas les variables d'environnement CLAUDE_PLUGIN_OPTION_<KEY>, donc faites en sorte que le script de moniteur lise la valeur depuis un fichier de configuration qu'il possède.
Si vous désactivez un plugin en milieu de session, Claude Code n'arrête pas les moniteurs qui sont déjà en cours d'exécution ; ils s'arrêtent quand la session se termine.
Themes
Les plugins peuvent fournir des thèmes de couleur qui apparaissent dans /theme aux côtés des présets intégrés et des thèmes locaux de l'utilisateur. Un thème est un fichier JSON dans themes/ avec un préset base et une carte overrides clairsemée de jetons de couleur. Les thèmes sont un composant expérimental.
{
"name": "Dracula",
"base": "dark",
"overrides": {
"claude": "#bd93f9",
"error": "#ff5555",
"success": "#50fa7b"
}
}
Quand un utilisateur sélectionne un thème de plugin, Claude Code enregistre custom:<plugin-name>:<slug> dans sa configuration. Les thèmes de plugin sont en lecture seule : quand un utilisateur appuie sur Ctrl+E sur l'un d'eux dans /theme, Claude Code le copie dans ~/.claude/themes/ pour qu'ils puissent éditer la copie.
Portées d'installation des plugins
Lorsque vous installez un plugin, vous choisissez une portée qui détermine où le plugin est disponible et qui d'autre peut l'utiliser :
| Portée | Fichier de paramètres | Cas d'usage |
|---|---|---|
user |
~/.claude/settings.json |
Plugins personnels disponibles dans tous les projets (par défaut) |
project |
.claude/settings.json |
Plugins d'équipe partagés via le contrôle de version |
local |
.claude/settings.local.json |
Plugins spécifiques au projet, ignorés par git lorsque Claude Code enregistre un paramètre |
managed |
Paramètres gérés | Plugins gérés (lecture seule, mise à jour uniquement) |
Les plugins utilisent le même système de portée que les autres configurations de Claude Code. Pour les instructions d'installation et les drapeaux de portée, consultez Installer des plugins. Pour une explication complète des portées, consultez Portées de configuration.
Plugins du répertoire de compétences
Tout dossier situé sous un répertoire de compétences qui contient un manifeste .claude-plugin/plugin.json est chargé en tant que plugin nommé <name>@skills-dir lors de la session suivante, sans marketplace et sans étape d'installation. Générez-en un avec plugin init. Contrairement à une installation marketplace copiée, le plugin est découvert sur place plutôt que copié dans le cache des plugins.
Un arborescence de répertoire de compétences prend en charge trois choses distinctes :
| Ce que vous avez | Ce que c'est |
|---|---|
<skills-dir>/foo/SKILL.md sans manifeste |
Une simple compétence nommée foo |
<skills-dir>/foo/.claude-plugin/plugin.json |
Un plugin foo@skills-dir, qui peut regrouper ses propres compétences, agents, hooks et bien plus |
<plugin>/skills/bar/SKILL.md |
Une compétence bar empaquetée à l'intérieur d'un plugin |
Choisir d'où le plugin se charge
| Répertoire de compétences | Portée | Charge |
|---|---|---|
~/.claude/skills/ |
personnel | Dans chaque projet, puisque l'emplacement vous appartient uniquement |
<cwd>/.claude/skills/ |
projet | Uniquement après que vous acceptiez la boîte de dialogue de confiance de l'espace de travail pour ce dossier |
Un plugin de portée projet est archivé dans le référentiel et atteint chaque collaborateur qui le clone. Parce que ce contenu provient du référentiel plutôt que de vous, il se charge uniquement après la même barrière de confiance qui régit les règles d'autorisation du projet dans .claude/settings.json, donc faire confiance à un dossier parent ou exécuter avec -p ne suffit pas, et les composants qui exécutent du code sont davantage restreints :
- Les serveurs MCP qu'il déclare passent par la même approbation par serveur qu'un
.mcp.jsonde projet - Les serveurs LSP ne démarrent qu'après que vous fassiez confiance à l'espace de travail
- Les moniteurs en arrière-plan ne se chargent pas
Les plugins de portée personnelle n'ont aucune de ces restrictions.
Les plugins @skills-dir de portée projet se chargent uniquement à partir du .claude/skills/ du répertoire de travail principal de la session. Ils ne remontent pas jusqu'à la racine du référentiel comme le font les compétences et commandes simples, donc lancer depuis un sous-répertoire manque un plugin qui se trouve à la racine du référentiel. Lancez depuis la racine du référentiel, ou déplacez la session là-bas avec /cd sur v2.1.246 ou ultérieur.
Modifier, recharger et désactiver un plugin du répertoire de compétences
Les modifications que vous apportez au SKILL.md d'une compétence prennent effet immédiatement dans la session actuelle. Les modifications apportées aux autres composants du plugin, tels que hooks/, .mcp.json, agents/ et output-styles/, ne le font pas. Exécutez /reload-plugins ou redémarrez Claude Code pour les récupérer. Voir Détection des changements en direct.
Pour arrêter le chargement d'un plugin du répertoire de compétences, supprimez son dossier ou désactivez-le par nom. Il n'y a pas d'étape uninstall car rien n'a été installé à partir d'une marketplace.
claude plugin disable my-tool@skills-dir
Plugins synchronisés depuis claude.ai
Dans Cowork et les sessions cloud, Claude Code télécharge les plugins activés pour votre compte claude.ai dans ~/.claude/plugins/synced/ dans l'environnement propre de la session et charge chacun d'eux en tant que <name>@synced, sans marketplace et sans enregistrement d'installation. Claude Code ne les charge pas dans les sessions que vous démarrez dans votre propre terminal. À l'intérieur de cet environnement Cowork ou cloud, claude plugin list affiche les copies téléchargées sous un en-tête Synced from claude.ai. Avant la v2.1.239, Claude Code chargeait ces plugins en tant que <name>@inline, l'identité que les plugins --plugin-dir utilisent.
Gérez un plugin synchronisé par l'ID <name>@synced que claude plugin list affiche :
- Désactiver un plugin : dans la session synchronisée, exécutez
claude plugin disable <name>@synced, ou demandez à Claude de l'exécuter. Claude Code enregistre le choix en tant que"<name>@synced": falsedans leenabledPluginsau niveau utilisateur de cet environnement. Pour réactiver le plugin, exécutezclaude plugin enable <name>@synceddans la même session. Pour exclure un plugin de chaque session synchronisée, désactivez-le pour votre compte claude.ai. Pour l'exclure des sessions synchronisées d'un projet dans chaque environnement, définissez"<name>@synced": falsesousenabledPluginsdans le.claude/settings.jsonengagé de ce projet. - Gérer le plugin lui-même sur claude.ai :
claude plugin install,updateetuninstallne s'appliquent pas à un plugin synchronisé. Pour en supprimer un, désactivez le plugin pour votre compte claude.ai ; la prochaine session synchronisée démarre sans lui.
Lorsqu'un plugin activé provenant de toute autre source, comme une installation marketplace, un plugin du répertoire de skills, ou un plugin --plugin-dir, correspond au nom d'un plugin synchronisé, Claude Code charge ce plugin et signale que la copie synchronisée n'est pas chargée. Pour utiliser la copie claude.ai à la place, désactivez votre propre copie. Avant la v2.1.239, Claude Code chargeait la copie synchronisée à la place d'une installation marketplace portant le même nom.
Schéma du manifeste du plugin
Le fichier .claude-plugin/plugin.json définit les métadonnées et la configuration de votre plugin.
Le manifeste est facultatif. S'il est omis, Claude Code découvre automatiquement les composants dans les emplacements par défaut et dérive le nom du plugin du nom du répertoire. Utilisez un manifeste lorsque vous devez fournir des métadonnées ou des chemins de composants personnalisés.
Schéma complet
{
"name": "plugin-name",
"displayName": "Plugin Name",
"version": "1.2.0",
"description": "Brief plugin description",
"author": {
"name": "Author Name",
"email": "author@example.com",
"url": "https://github.com/author"
},
"homepage": "https://docs.example.com/plugin",
"repository": "https://github.com/author/plugin",
"license": "MIT",
"keywords": ["keyword1", "keyword2"],
"metadata": { "catalogId": "cat-123", "tier": "pro" },
"skills": "./custom/skills/",
"commands": ["./custom/commands/special.md"],
"agents": ["./custom/agents/reviewer.md"],
"hooks": "./config/hooks.json",
"mcpServers": "./mcp-config.json",
"outputStyles": "./styles/",
"lspServers": "./.lsp.json",
"experimental": {
"themes": "./themes/",
"monitors": "./monitors.json",
"evals": "quality/evals"
},
"dependencies": [
"helper-lib",
{ "name": "secrets-vault", "version": "~2.1.0" }
]
}
Champs obligatoires
Si vous incluez un manifeste, name est le seul champ obligatoire.
| Champ | Type | Description | Exemple |
|---|---|---|---|
name |
string | Identifiant unique en kebab-case, sans espaces, caractères de contrôle ou caractères de formatage bidirectionnel. Lorsqu'une entrée de marketplace répertorie le plugin sous un nom différent, le nom de l'entrée de marketplace est celui utilisé par les clés enabledPlugins et /plugin |
"deployment-tools" |
Ce nom est utilisé pour l'espace de noms des composants. Par exemple, dans l'interface utilisateur, l'agent agent-creator pour le plugin nommé plugin-dev apparaîtra comme plugin-dev:agent-creator.
Champs non reconnus
Claude Code ignore les champs de niveau supérieur qu'il ne reconnaît pas. Vous pouvez conserver les métadonnées d'un autre écosystème dans plugin.json et le plugin se charge toujours. Cela rend pratique de maintenir un seul manifeste qui sert également de manifeste d'extension VS Code ou Cursor, d'un package.json npm, ou d'un manifeste de bundle MCPB/DXT.
claude plugin validate signale les champs non reconnus comme des avertissements, pas des erreurs. Si un champ est décalé d'un ou deux caractères par rapport à un champ reconnu, l'avertissement suggère le nom probablement prévu. Un plugin avec uniquement des avertissements de champs non reconnus réussit toujours la validation et se charge au moment de l'exécution.
La façon dont Claude Code gère un champ reconnu dont la valeur a le mauvais type dépend du champ :
- La plupart des champs : le plugin ne se charge pas. Par exemple, une valeur
keywordsqui est une chaîne au lieu d'un tableau est une erreur de chargement, etclaude plugin validatela signale comme telle. experimentaletmetadata: Claude Code ignore une valeur non-objet, etclaude plugin validatesignale un avertissement.
Passez --strict pour traiter les avertissements comme des erreurs. Utilisez-le dans CI pour détecter un nom de champ mal orthographié ou un champ laissé par l'outil de manifeste d'un autre avant la publication, même si le plugin se chargerait au moment de l'exécution.
claude plugin validate ./my-plugin --strict
Champs de métadonnées
| Champ | Type | Description | Exemple |
|---|---|---|---|
$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. | "https://json.schemastore.org/claude-code-plugin-manifest.json" |
displayName |
string | Nom lisible par l'homme affiché dans le sélecteur /plugin et autres surfaces d'interface utilisateur. Pour un plugin installé depuis une marketplace, un displayName sur l'entrée de marketplace prend précédence sur cette valeur. Lorsqu'aucun nom d'affichage n'est défini dans l'un ou l'autre endroit, les utilisateurs voient name. Contrairement à name, peut contenir des espaces et n'importe quelle casse. Non utilisé pour l'espace de noms ou la recherche. |
"Deployment Tools" |
version |
string | Facultatif. Version sémantique. La définition de ceci épingle le plugin à cette chaîne de version, de sorte que les utilisateurs ne reçoivent des mises à jour que lorsque vous la modifiez, sauf pour une command source ; voir Gestion des versions. S'il est également défini dans l'entrée de marketplace, plugin.json gagne. S'il est omis, la version provient de la source suivante dans Gestion des versions. |
"2.1.0" |
description |
string | Brève explication de l'objectif du plugin | "Deployment automation tools" |
author |
object | Informations sur l'auteur | {"name": "Dev Team", "email": "dev@company.com"} |
homepage |
string | URL de documentation | "https://docs.example.com" |
repository |
string | URL du code source | "https://github.com/user/plugin" |
license |
string | Identifiant de licence | "MIT", "Apache-2.0" |
keywords |
array | Balises de découverte | ["deployment", "ci-cd"] |
metadata |
object | Objet de forme libre pour vos propres données, telles que les champs d'habilitation ou de catalogue. Claude Code ne le lit pas, donc les valeurs n'affectent jamais le comportement du plugin. Claude Code ignore une valeur non-objet, et claude plugin validate la signale comme un avertissement. Avant v2.1.222, Claude Code traitait la clé comme un champ non reconnu. |
{"catalogId": "cat-123"} |
defaultEnabled |
boolean | Si le plugin démarre dans un état activé lorsque l'utilisateur n'en a pas défini un. Par défaut true. Voir Activation par défaut. |
false |
Activation par défaut
Définissez defaultEnabled: false dans plugin.json pour livrer un plugin qui s'installe désactivé. L'utilisateur l'active avec claude plugin enable <plugin> ou l'interface /plugin. Utilisez ceci pour les plugins qui ajoutent un coût ou une portée auquel un utilisateur devrait s'inscrire, comme celui qui se connecte à un service externe.
defaultEnabled est le repli lorsque rien d'autre n'a décidé l'état du plugin. Deux choses prennent précédence sur lui :
- Le paramètre de l'utilisateur : une entrée pour le plugin dans
enabledPluginsà n'importe quelle portée de paramètres. Une fois écrite, elle persiste à travers les mises à jour et réinstallations du plugin, donc changerdefaultEnableddans une version ultérieure ne bascule pas un utilisateur existant. - Une exigence de dépendance : lorsqu'un plugin est requis par un autre qui est actif, Claude Code écrit
truepour lui au moment de l'installation ou de l'activation. Cela lui donne un paramètre explicite, donc sa propre valeur par défaut ne s'applique plus. Voir Activer ou désactiver un plugin avec des dépendances.
Le même champ peut apparaître dans l'entrée de marketplace d'un plugin, où il prend précédence sur la valeur dans plugin.json. Voir Champs de plugin facultatifs.
Champs de chemin de composant
| Champ | Type | Description | Exemple |
|---|---|---|---|
skills |
string|array | Répertoires de compétences personnalisés contenant <name>/SKILL.md. S'ajoute à l'analyse par défaut skills/. Voir Règles de comportement des chemins pour l'exception de racine de marketplace |
"./custom/skills/" |
commands |
string|array | Fichiers de compétences .md plats personnalisés ou répertoires (remplace le défaut commands/) |
"./custom/cmd.md" ou ["./cmd1.md"] |
agents |
string|array | Fichiers d'agent personnalisés (remplace le défaut agents/) |
"./custom/agents/reviewer.md" |
workflows |
string|array | Fichiers ou répertoires de scripts workflow personnalisés (remplace le défaut workflows/) |
"./custom/workflows/" |
hooks |
string|array|object | Chemins de configuration de hooks ou configuration en ligne | "./my-extra-hooks.json" |
mcpServers |
string|array|object | Chemins de configuration MCP ou configuration en ligne | "./my-extra-mcp-config.json" |
outputStyles |
string|array | Fichiers/répertoires de style de sortie personnalisés (remplace le défaut output-styles/) |
"./styles/" |
lspServers |
string|array|object | Configurations du Language Server Protocol pour l'intelligence du code (aller à la définition, trouver les références, etc.) | "./.lsp.json" |
experimental.themes |
string|array | Fichiers/répertoires de thème de couleur (remplace le défaut themes/). Voir Thèmes |
"./themes/" |
experimental.monitors |
string|array | Configurations de Monitor en arrière-plan qui démarrent automatiquement lorsque le plugin est actif. Voir Moniteurs | "./monitors.json" |
experimental.evals |
string|array | Répertoire sous la racine du plugin qui contient les cas d'évaluation du plugin, lorsqu'il n'est pas le défaut evals/. claude plugin eval --eval-dir le remplace |
"quality/evals" |
userConfig |
object | Valeurs configurables par l'utilisateur demandées au moment de l'activation. Voir Configuration utilisateur | Voir ci-dessous |
channels |
array | Déclarations de canal pour l'injection de messages (style Telegram, Slack, Discord). Voir Canaux | Voir ci-dessous |
dependencies |
array | Autres plugins que ce plugin nécessite, éventuellement avec des contraintes de version semver. Voir Contraindre les versions de dépendance du plugin | [{ "name": "secrets-vault", "version": "~2.1.0" }] |
Composants expérimentaux
Les composants sous la clé experimental, themes et monitors, ont un schéma de manifeste qui peut changer entre les versions pendant qu'ils se stabilisent. L'endroit où vous les déclarez est une migration séparée : le niveau supérieur fonctionne toujours, claude plugin validate avertit, et une version future exigera experimental.*.
Configuration utilisateur
Le champ userConfig déclare les valeurs pour lesquelles Claude Code demande à l'utilisateur lorsque le plugin est activé. Utilisez ceci au lieu d'exiger que les utilisateurs modifient manuellement settings.json.
{
"userConfig": {
"api_endpoint": {
"type": "string",
"title": "API endpoint",
"description": "Your team's API endpoint"
},
"api_token": {
"type": "string",
"title": "API token",
"description": "API authentication token",
"sensitive": true
}
}
}
Les clés doivent être des identifiants valides. Chaque option prend en charge ces champs :
| Champ | Obligatoire | Description |
|---|---|---|
type |
Oui | L'un de string, number, boolean, directory, ou file |
title |
Oui | Étiquette affichée dans la boîte de dialogue de configuration |
description |
Oui | Texte d'aide affiché sous le champ |
sensitive |
Non | Si true, masque l'entrée et stocke la valeur dans le stockage sécurisé au lieu de settings.json |
required |
Non | Si true, la validation échoue lorsque le champ est vide |
default |
Non | Valeur utilisée lorsque l'utilisateur ne fournit rien |
multiple |
Non | Pour le type string, autoriser un tableau de chaînes |
min / max |
Non | Limites pour le type number |
Chaque valeur est disponible pour la substitution comme ${user_config.KEY} dans les configurations de serveur MCP et LSP et les commandes de hook. Les valeurs non sensibles peuvent également être substituées dans le contenu des compétences et des agents. Toutes les valeurs sont exportées vers les processus de hook en tant que variables d'environnement CLAUDE_PLUGIN_OPTION_<KEY>, où <KEY> est la clé d'option en majuscules.
Les champs qui s'exécutent dans un shell rejettent ${user_config.*} : substituer une valeur configurée dans une commande shell permettrait au shell d'exécuter tout ce que cette valeur contient, donc le composant échoue avec une erreur à la place. Chaque champ rejeté a une autre façon de passer la valeur :
| Champ rejeté | Comment passer la valeur |
|---|---|
| Commandes de hook de forme shell | Utilisez la forme exec avec args, ou lisez CLAUDE_PLUGIN_OPTION_<KEY> à partir de l'environnement du hook |
| Commandes Monitor | Lisez la valeur à partir d'un fichier de configuration dans le script |
MCP headersHelper |
Lisez la valeur à partir d'un fichier de configuration dans le script |
Avant v2.1.207, ces champs substituaient les valeurs ${user_config.KEY} ; mettez à jour les plugins qui en dépendaient.
Les valeurs non sensibles sont stockées sous la clé pluginConfigs dans votre settings.json utilisateur comme pluginConfigs[<plugin-id>].options.
Sur macOS, Claude Code stocke les valeurs sensibles dans le Keychain macOS, en revenant à ~/.claude/.credentials.json lorsque le Keychain rejette l'écriture. Sur les plates-formes sans un keychain pris en charge, il les stocke dans ~/.claude/.credentials.json. Le stockage Keychain est partagé avec les jetons OAuth et a une limite totale d'environ 2 KB, donc gardez les valeurs sensibles petites.
Claude Code lit toutes les valeurs pluginConfigs à partir de seulement trois sources de paramètres :
- Paramètres utilisateur :
~/.claude/settings.json, le fichier que l'invite au moment de l'activation écrit --settings: l'indicateur CLI ou les paramètres en ligne du SDK- Paramètres gérés : politique contrôlée par l'organisation
Lorsque plusieurs sources définissent la même clé, les paramètres gérés prennent précédence, puis --settings, puis les paramètres utilisateur. La seule source que vous pouvez supprimer de cette liste est les paramètres utilisateur : passez --setting-sources sans user et Claude Code les ignore. Les paramètres gérés et --settings restent quels que soient les paramètres que vous passez. L'option settingSources du SDK définit la même liste.
Les entrées dans le .claude/settings.json ou .claude/settings.local.json d'un projet sont ignorées. Les deux fichiers vivent dans l'espace de travail, donc un référentiel cloné pourrait fournir des valeurs là, et ces valeurs s'écouleraient dans les commandes de hook de plugin, les configurations de serveur MCP, les commandes LSP et les commandes de moniteur. Avant v2.1.207, ces entrées étaient lues. La restriction est spécifique à pluginConfigs : enabledPlugins honore toujours les paramètres de projet et locaux.
Canaux
Le champ channels permet à un plugin de déclarer un ou plusieurs canaux de message qui injectent du contenu dans la conversation. Chaque canal se lie à un serveur MCP que le plugin fournit.
{
"channels": [
{
"server": "telegram",
"userConfig": {
"bot_token": {
"type": "string",
"title": "Bot token",
"description": "Telegram bot token",
"sensitive": true
},
"owner_id": {
"type": "string",
"title": "Owner ID",
"description": "Your Telegram user ID"
}
}
}
]
}
Le champ server est obligatoire et doit correspondre à une clé dans le mcpServers du plugin. Le userConfig optionnel par canal utilise le même schéma que le champ de niveau supérieur, permettant au plugin de demander des jetons de bot ou des ID de propriétaire lorsque le plugin est activé.
Règles de comportement des chemins
Si un chemin personnalisé remplace ou étend le répertoire par défaut du plugin dépend du champ :
- Remplace le défaut :
commands,agents,workflows,outputStyles,experimental.themes,experimental.monitors. Par exemple, lorsque le manifeste spécifiecommands, le répertoire par défautcommands/n'est pas analysé. Pour conserver le défaut et en ajouter plus, listez-le explicitement :"commands": ["./commands/", "./extras/"] - S'ajoute au défaut :
skills. Le répertoire par défautskills/est toujours analysé, et les répertoires listés dansskillssont chargés à côté de lui. Exception : pour une entrée de marketplace dont lasourcese résout à la racine de marketplace, déclarer des sous-répertoires spécifiques remplace l'analyse par défautskills/ - Règles de fusion propres : hooks, serveurs MCP, et serveurs LSP. Voir chaque section pour savoir comment plusieurs sources se combinent
Lorsqu'un plugin a à la fois un dossier par défaut et la clé de manifeste correspondante, Claude Code avertit du dossier ignoré dans claude plugin list et la vue de détail /plugin. Le plugin se charge toujours en utilisant les chemins du manifeste. Claude Code n'avertit pas lorsque la clé de manifeste pointe dans le dossier par défaut, par exemple "commands": ["./commands/deploy.md"], car ce chemin nomme le dossier explicitement.
Pour tous les champs de chemin :
- Tous les chemins doivent être relatifs à la racine du plugin et commencer par
./, sauf que le champskillsaccepte également"."- À la fois
"."et"./"désignent la racine du plugin elle-même - Avant v2.1.221,
"."échouait la validation du manifeste et le plugin ne se chargeait pas, donc utilisez"./"pour prendre en charge les versions antérieures
- À la fois
- Les composants des chemins personnalisés utilisent les mêmes règles de nommage et d'espace de noms
- Plusieurs chemins peuvent être spécifiés comme des tableaux
- Un chemin de compétence peut pointer vers un répertoire qui contient directement un
SKILL.md, par exemple"skills": ["."]pour la racine du plugin- Claude Code prend le nom d'invocation de la compétence à partir du champ
namedu frontmatter dansSKILL.md, donc le nom reste stable quel que soit le nom du répertoire d'installation - Si
namen'est pas défini dans le frontmatter, Claude Code revient au nom de base du répertoire
- Claude Code prend le nom d'invocation de la compétence à partir du champ
Un plugin qui a un SKILL.md à sa racine, aucun sous-répertoire skills/, et aucun champ de manifeste skills est automatiquement chargé comme un plugin à compétence unique. Vous n'avez pas besoin de définir "skills": ["./"] dans plugin.json pour cette disposition.
Exemples de chemins :
{
"commands": [
"./specialized/deploy.md",
"./utilities/batch-process.md"
],
"agents": [
"./custom-agents/reviewer.md",
"./custom-agents/tester.md"
]
}
Variables d'environnement
Claude Code fournit trois variables pour référencer les chemins :
| Variable | Se résout à | Utilisez-la pour |
|---|---|---|
${CLAUDE_PLUGIN_ROOT} |
Chemin absolu vers le répertoire d'installation du plugin | Scripts, binaires et fichiers de configuration fournis avec le plugin |
${CLAUDE_PLUGIN_DATA} |
Répertoire persistant qui survit aux mises à jour du plugin, créé à la première référence | Dépendances installées telles que node_modules ou environnements virtuels Python, code généré et caches |
${CLAUDE_PROJECT_DIR} |
La racine du projet | Scripts et fichiers de configuration locaux au projet |
Les trois sont exportés en tant que variables d'environnement vers les processus de hook et vers les sous-processus de serveur MCP et LSP. Les champs qui les substituent en ligne dépendent du composant du plugin :
| Composant du plugin | Champs où les espaces réservés se résolvent |
|---|---|
| Contenu des compétences et des agents | N'importe où l'espace réservé apparaît |
| Commandes de hook et de moniteur | N'importe où l'espace réservé apparaît |
Serveurs MCP stdio |
command, args, env |
Serveurs MCP http, sse, ws |
url, headers, headersHelper |
| Serveurs LSP | command, args, env, workspaceFolder |
Dans les commandes de hook, utilisez la forme exec avec args afin que chaque chemin soit passé comme un argument sans guillemets. Dans les hooks de forme shell et les commandes de moniteur, enveloppez les variables entre guillemets doubles, comme dans "${CLAUDE_PROJECT_DIR}/scripts/server.sh". Ce hook de forme shell exécute un script fourni avec un plugin :
{
"hooks": {
"PostToolUse": [
{
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/process.sh"
}
]
}
]
}
}
${CLAUDE_PLUGIN_ROOT} change lorsque le plugin se met à jour. Le répertoire de la version précédente reste sur le disque pendant une période de grâce après une mise à jour, mais traitez-le comme éphémère et n'écrivez pas d'état là. Voir mise en cache du plugin pour la sémantique de nettoyage.
Lorsqu'un plugin se met à jour en milieu de session, les commandes de hook, les moniteurs, les serveurs MCP et les serveurs LSP continuent d'utiliser le chemin de la version précédente. Exécutez /reload-plugins pour basculer les hooks, les serveurs MCP et les serveurs LSP vers le nouveau chemin ; les moniteurs nécessitent un redémarrage de session. Dans une session sans terminal interactif, le rechargement laisse les serveurs MCP du plugin sur l'ancien chemin jusqu'à la session suivante. Pour un plugin avec une source command, Claude Code peut recharger le plugin lui-même.
Les serveurs MCP peuvent également appeler la demande roots/list pour lire les répertoires de travail de la session au moment de l'exécution. Voir ce que roots/list retourne et quand Claude Code notifie le serveur des changements.
Répertoire de données persistant
Le répertoire ${CLAUDE_PLUGIN_DATA} se résout à ~/.claude/plugins/data/{id}/, où {id} est l'identifiant du plugin avec les caractères en dehors de a-z, A-Z, 0-9, _, et - remplacés par -. Pour un plugin installé comme formatter@my-marketplace, le répertoire est ~/.claude/plugins/data/formatter-my-marketplace/.
Un usage courant est d'installer les dépendances de langage une fois et de les réutiliser à travers les sessions et les mises à jour du plugin. Utilisez-le pour les dépendances Python, les dépendances verrouillées avec Yarn ou pnpm, et les packages dont les scripts de cycle de vie doivent s'exécuter. Pour un plugin installé depuis une marketplace, vous n'en aurez peut-être pas besoin du tout : Claude Code installe automatiquement les dépendances de package Node.js éligibles lorsqu'il met en cache le plugin.
Parce que le répertoire de données survit à n'importe quelle version de plugin unique, une vérification de l'existence du répertoire seule ne peut pas détecter lorsqu'une mise à jour change le manifeste de dépendance du plugin. Le modèle recommandé compare le manifeste fourni par rapport à une copie dans le répertoire de données et réinstalle lorsqu'ils diffèrent.
Ce hook SessionStart installe node_modules à la première exécution et à nouveau chaque fois qu'une mise à jour du plugin inclut un package.json modifié :
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "diff -q \"${CLAUDE_PLUGIN_ROOT}/package.json\" \"${CLAUDE_PLUGIN_DATA}/package.json\" >/dev/null 2>&1 || (cd \"${CLAUDE_PLUGIN_DATA}\" && cp \"${CLAUDE_PLUGIN_ROOT}/package.json\" . && npm install) || rm -f \"${CLAUDE_PLUGIN_DATA}/package.json\""
}
]
}
]
}
}
Le diff sort avec un code non-zéro lorsque la copie stockée est manquante ou diffère de celle fournie, couvrant à la fois la première exécution et les mises à jour changeant les dépendances. Si npm install échoue, le rm final supprime le manifeste copié afin que la session suivante réessaye.
Les scripts fournis dans ${CLAUDE_PLUGIN_ROOT} peuvent ensuite s'exécuter contre le node_modules persistant :
{
"mcpServers": {
"routines": {
"command": "node",
"args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
"env": {
"NODE_PATH": "${CLAUDE_PLUGIN_DATA}/node_modules"
}
}
}
}
Le répertoire de données est supprimé automatiquement lorsque vous désinstallez le plugin de la dernière portée où il est installé. L'interface /plugin affiche la taille du répertoire et demande une confirmation avant de supprimer. Le CLI supprime par défaut ; passez --keep-data pour le conserver.
Mise en cache des plugins et résolution des fichiers
Les plugins sont spécifiés de deux façons :
- Via
claude --plugin-dirouclaude --plugin-url, pour la durée d'une session. - Via une marketplace, installés pour les sessions futures.
À des fins de sécurité et de vérification, Claude Code copie les plugins de marketplace dans le cache de plugins local de l'utilisateur (~/.claude/plugins/cache) plutôt que de les utiliser sur place, sauf pour les sources command en mode lien, que Claude Code utilise sur place via des liens dans l'entrée du cache.
Pour les plugins copiés, chaque version installée est un répertoire distinct dans le cache, regroupé par marketplace et plugin et nommé pour la version résolue, avec sa propre copie des fichiers du plugin et des dépendances de packages Node.js. Une dépendance résolue à partir d'une balise de version obtient un nom de répertoire avec un suffixe de commit-SHA.
Lorsque vous mettez à jour ou désinstallez un plugin, Claude Code marque le répertoire de la version précédente comme orphelin et le supprime lors d'un balayage en arrière-plan environ 14 jours plus tard. La période de grâce permet aux sessions Claude Code concurrentes qui ont déjà chargé l'ancienne version de continuer à fonctionner sans erreurs. Claude Code exécute le balayage uniquement si au moins un plugin est installé ; après avoir désinstallé votre dernier plugin, les répertoires orphelins restent sur le disque jusqu'à ce que vous installiez à nouveau un plugin.
Claude Code supprime un dossier de plugin ou de marketplace du cache uniquement lorsqu'il ne contient plus aucun répertoire ou lien symbolique. Si vous créez un lien symbolique vers une extraction de développement dans le cache en tant qu'entrée de version d'un plugin, Claude Code ne marque jamais le lien comme orphelin et ne le supprime jamais, ni les dossiers qui le contiennent. Claude Code n'écrit jamais non plus ses fichiers de suivi de version à l'intérieur de l'extraction liée.
Les outils Glob et Grep de Claude ignorent les répertoires de version orphelins lors des recherches, de sorte que les résultats de fichiers n'incluent pas le code de plugin obsolète.
Dépendances de packages Node.js
Lorsque Claude Code copie un plugin dans le cache, il installe également les dépendances de packages Node.js du plugin à cet endroit, afin que les hooks et serveurs MCP du plugin puissent les charger. Cette section couvre les packages npm et Bun qu'un plugin déclare dans son propre package.json. Pour les plugins qui dépendent d'autres plugins, voir versions de dépendances de plugins.
Claude Code exécute l'installation dans le répertoire de version copié chaque fois qu'il en crée un : lorsque vous installez un plugin, lorsque Claude Code met à jour un plugin vers une nouvelle version, et au démarrage de la session lorsqu'un plugin activé n'est pas encore en cache, par exemple sur une nouvelle machine. L'installation s'exécute uniquement lorsque le répertoire racine du plugin contient à la fois un package.json et un fichier de verrouillage pris en charge :
| Fichier de verrouillage | Commande |
|---|---|
bun.lock ou bun.lockb |
bun install --frozen-lockfile --ignore-scripts |
npm-shrinkwrap.json ou package-lock.json |
npm ci --ignore-scripts |
Si un plugin contient plus d'un de ces fichiers de verrouillage, Claude Code utilise la première correspondance, en vérifiant dans l'ordre : bun.lock, bun.lockb, npm-shrinkwrap.json, package-lock.json. Claude Code ignore yarn.lock et pnpm-lock.yaml car Yarn et pnpm prennent en charge les hooks de configuration au moment de la résolution qui contournent --ignore-scripts.
Livrez un fichier de verrouillage npm pour la plus large portée. Claude Code exécute le gestionnaire de packages du fichier de verrouillage correspondant à partir du PATH de l'utilisateur et ne revient pas au fichier de verrouillage alternatif s'il est manquant. Pour un plugin distribué via une source npm, utilisez npm-shrinkwrap.json ; npm exclut package-lock.json des packages publiés.
Claude Code contraint cette installation de dépendances de sorte qu'aucun code du plugin ou de ses packages ne s'exécute pendant celle-ci, et limite la durée pendant laquelle elle peut s'exécuter :
- Résolution figée : Bun et npm installent exactement ce que le fichier de verrouillage épingle, et échouent plutôt que de re-résoudre les versions lorsque
package.jsonet le fichier de verrouillage ne sont pas d'accord. - Pas de scripts de cycle de vie :
--ignore-scriptsempêche les scriptspreinstall,installetpostinstallde s'exécuter, de sorte que les dépendances qui construisent des modules natifs dans ces scripts téléchargent mais ne se compilent pas pendant cette installation. - Délai d'expiration de 60 secondes : Claude Code arrête une installation qui s'exécute plus longtemps et la traite comme échouée.
L'extraction d'un plugin lui-même à partir d'une source npm exécute npm install avec les scripts de cycle de vie activés, avant que cette installation de dépendances ne s'exécute.
Une installation échouée ou ignorée ne bloque jamais le plugin. Lorsque l'installation échoue, ou que Claude Code ignore un fichier de verrouillage yarn ou pnpm, il enregistre la raison comme un avertissement dans la sortie de débogage. Un plugin avec un package.json et aucun fichier de verrouillage est ignoré sans entrée de journal. Une installation qui expire peut laisser un arbre node_modules partiel dans la copie en cache.
Vous ne pouvez pas désactiver l'installation automatique ; aucun paramètre ou variable d'environnement ne la désactive. Dans les réseaux restreints, voir les exigences d'accès réseau pour les hôtes à autoriser.
Pour les dépendances que l'installation automatique ne peut pas fournir, telles que les packages qui ont besoin de leurs scripts de cycle de vie pour se construire, les dépendances Python, ou un plugin verrouillé avec Yarn ou pnpm, installez-les à partir d'un hook dans le répertoire de données persistantes.
Limitations de traversée de chemin
Claude Code ne permet pas à un plugin de référencer des fichiers en dehors de son propre répertoire. Il rejette un chemin de composant qui se résout en dehors de la racine du plugin, que le chemin soit déclaré dans plugin.json ou dans une entrée de marketplace. Cela couvre un chemin qui pointe en dehors du plugin tel qu'écrit, comme ../shared-utils, et un lien symbolique qui mène en dehors du plugin, autre que les liens au sein d'une marketplace.
Sur macOS et Linux, Claude Code rejette également un chemin de composant qui contient une barre oblique inverse n'importe où dedans, même lorsque le chemin reste à l'intérieur du plugin. Les composants déclarés avec des chemins de barre oblique inverse se chargent donc uniquement sous Windows. Écrivez les chemins de composant avec des barres obliques avant, comme ./commands/deploy.md.
Lorsque Claude Code rejette un chemin, il signale une erreur path escapes plugin directory et charge le plugin sans ce composant.
Claude Code ne copie pas non plus les fichiers en dehors du répertoire du plugin dans le cache lorsqu'il installe le plugin, de sorte que lorsqu'un script à l'intérieur d'un plugin copié lit un chemin au-dessus de la racine du plugin, il ne trouve pas non plus ces fichiers.
Partager des fichiers au sein d'une marketplace avec des liens symboliques
Si votre plugin doit partager des fichiers avec d'autres parties de la même marketplace, vous pouvez créer des liens symboliques à l'intérieur de votre répertoire de plugin. La façon dont un lien symbolique est traité lorsque le plugin est copié dans le cache dépend de l'endroit où sa cible se résout :
- Au sein du propre répertoire du plugin : le lien symbolique est préservé en tant que lien symbolique relatif dans le cache, de sorte qu'il continue de se résoudre à la cible copiée au moment de l'exécution.
- Ailleurs au sein de la même marketplace : le lien symbolique est déréférencé. Le contenu de la cible est copié dans le cache à sa place. Cela permet au répertoire
skills/d'un meta-plugin de créer un lien vers les compétences définies par d'autres plugins de la marketplace. - En dehors de la marketplace : le lien symbolique est ignoré pour des raisons de sécurité. Cela empêche les plugins de tirer des fichiers hôtes arbitraires tels que les chemins système dans le cache.
Pour les plugins installés avec --plugin-dir, à partir d'un chemin local, ou à partir d'une source command en mode copie, seuls les liens symboliques qui se résolvent au sein du propre répertoire du plugin sont préservés. Tous les autres sont ignorés.
La commande suivante crée un lien à partir d'un plugin de marketplace vers une compétence partagée définie par un plugin frère. Sous Windows, utilisez mklink /D à partir d'une invite de commande élevée ou activez le mode développeur :
ln -s ../../shared-plugin/skills/foo ./skills/foo
Structure du répertoire des plugins
Disposition standard des plugins
Un plugin complet suit cette structure :
enterprise-plugin/
├── .claude-plugin/ # Répertoire de métadonnées (optionnel)
│ └── plugin.json # manifeste du plugin
├── skills/ # Skills
│ ├── code-reviewer/
│ │ └── SKILL.md
│ └── pdf-processor/
│ ├── SKILL.md
│ └── scripts/
├── commands/ # Skills en tant que fichiers .md plats
│ ├── status.md
│ └── logs.md
├── agents/ # Définitions de sous-agents
│ ├── security-reviewer.md
│ ├── performance-tester.md
│ └── compliance-checker.md
├── workflows/ # Scripts de flux de travail
│ └── release-audit.js
├── output-styles/ # Définitions de style de sortie
│ └── terse.md
├── themes/ # Définitions de thème de couleur
│ └── dracula.json
├── monitors/ # Configurations de moniteur en arrière-plan
│ └── monitors.json
├── hooks/ # Configurations de hooks
│ ├── hooks.json # Configuration principale des hooks
│ └── security-hooks.json # Hooks supplémentaires
├── bin/ # Exécutables du plugin ajoutés à PATH
│ └── my-tool # Invocable en tant que commande nue dans l'outil Bash
├── settings.json # Paramètres par défaut du plugin
├── .mcp.json # Définitions du serveur MCP
├── .lsp.json # Configurations du serveur LSP
├── scripts/ # Scripts de hooks et utilitaires
│ ├── security-scan.sh
│ ├── format-code.py
│ └── deploy.js
├── LICENSE # Fichier de licence
└── CHANGELOG.md # Historique des versions
Le répertoire .claude-plugin/ contient le fichier plugin.json. Tous les autres répertoires (commands/, agents/, skills/, workflows/, output-styles/, themes/, monitors/, hooks/) doivent être à la racine du plugin, pas à l'intérieur de .claude-plugin/.
Un fichier CLAUDE.md à la racine du plugin n'est pas chargé en tant que contexte de projet. Les plugins contribuent au contexte par le biais de skills, d'agents et de hooks plutôt que par CLAUDE.md. Pour livrer des instructions qui se chargent dans le contexte de Claude, mettez-les dans un skill.
Référence des emplacements de fichiers
| Composant | Emplacement par défaut | Objectif |
|---|---|---|
| Manifeste | .claude-plugin/plugin.json |
Métadonnées et configuration du plugin (optionnel) |
| Skills | skills/ |
Skills avec la structure <name>/SKILL.md |
| Commandes | commands/ |
Skills en tant que fichiers Markdown plats. Utilisez skills/ pour les nouveaux plugins |
| Agents | agents/ |
Fichiers Markdown de sous-agents |
| Flux de travail | workflows/ |
Fichiers de script de flux de travail |
| Styles de sortie | output-styles/ |
Définitions de style de sortie |
| Thèmes | themes/ |
Définitions de thème de couleur |
| Hooks | hooks/hooks.json |
Configuration des hooks |
| Serveurs MCP | .mcp.json |
Définitions du serveur MCP |
| Serveurs LSP | .lsp.json |
Configurations du serveur de langage |
| Moniteurs | monitors/monitors.json |
Configurations de moniteur en arrière-plan |
| Exécutables | bin/ |
Exécutables ajoutés au PATH de l'outil Bash et invocables en tant que commandes nues tandis que le plugin est activé. Vous ne pouvez pas inclure ce répertoire dans un plugin que vous distribuez via les paramètres de l'organisation claude.ai |
| Paramètres | settings.json |
Configuration par défaut appliquée lorsque le plugin est activé. Seules les clés agent et subagentStatusLine sont prises en charge |
Référence des commandes CLI
Claude Code fournit des commandes CLI pour la gestion non-interactive des plugins, utiles pour les scripts et l'automatisation.
plugin init
Créez un nouveau plugin dans ~/.claude/skills/<name>/. À la prochaine session Claude Code, il se charge automatiquement en tant que <name>@skills-dir et apparaît dans /plugin et claude plugin list sans étape d'installation.
Consultez Plugins du répertoire de compétences pour les exigences de portée et de confiance.
claude plugin init <name> [options]
La commande prend ces arguments :
<name>: Nom du plugin. Devient l'espace de noms de la compétence et le nom du répertoire sous~/.claude/skills/, il ne peut donc pas contenir d'espaces ou de séparateurs de chemin.
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
--description <text> |
Description du manifeste | |
--author <name> |
Nom de l'auteur | git config user.name |
--author-email <email> |
E-mail de l'auteur | git config user.email |
--with <components...> |
Créez également des dossiers de composants. Valeurs valides : skills, agents, hooks, mcp, lsp, output-style, channel |
|
-f, --force |
Remplacez un .claude-plugin/ existant à la cible |
|
-h, --help |
Afficher l'aide pour la commande |
claude plugin new est un alias pour cette commande.
Chaque valeur --with ajoute un fichier de démarrage pour ce composant, prêt à être modifié :
| Composant | Ce qu'il crée |
|---|---|
skills |
Une compétence supplémentaire nommée <name>:example à côté de celle par défaut |
agents |
Une définition de sous-agent agents/ |
hooks |
Un hooks/hooks.json avec un gestionnaire d'événements exemple |
mcp |
Un .mcp.json avec des exemples de serveur HTTP et stdio |
lsp |
Un exemple .lsp.json de serveur de langage |
output-style |
Un output-styles/<name>.md qui s'applique automatiquement lorsque le plugin est activé |
channel |
Un canal basé sur MCP : un serveur stdio (server.ts), son .mcp.json, et un package.json |
Le plugin créé utilise la source @skills-dir plutôt qu'une marketplace. Les administrateurs peuvent bloquer cette source avec strictKnownMarketplaces ou en ajoutant {"source": "skills-dir"} à blockedMarketplaces dans les paramètres gérés. Lorsqu'elle est bloquée, plugin init échoue avant d'écrire.
Ces exemples montrent les invocations courantes :
# Créer un plugin minimal
claude plugin init my-helper
# Créer avec des dossiers de compétences et de hooks
claude plugin init my-helper --with skills hooks
# Remplacer un scaffold existant
claude plugin init my-helper --force
plugin install
Installez un plugin à partir des marketplaces disponibles.
claude plugin install <plugin> [options]
La commande prend ces arguments :
<plugin>: Nom du plugin ouplugin-name@marketplace-namepour une marketplace spécifique
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-s, --scope <scope> |
Portée d'installation : user, project, ou local |
user |
--config <key=value> |
Définissez une option userConfig déclarée dans le manifeste du plugin. Répétez le drapeau pour définir plusieurs options |
|
-y, --yes |
Acceptez une commande que la marketplace du plugin déclare, sans l'invite de confirmation : la commande qui produit un plugin avec une command source, ou le headersHelper qui authentifie un téléchargement d'archive. Accepter un headersHelper nécessite Claude Code v2.1.238 ou ultérieur. Claude Code imprime toujours la commande en premier. Requis lorsque stdin ou stdout n'est pas un TTY. N'a aucun effet dans une session Claude Code, exécutez donc la commande depuis votre propre terminal |
|
--json |
Imprimez le résultat en tant qu'un objet JSON sur la dernière ligne de stdout au lieu du message lisible par l'homme, pour une utilisation dans les scripts. Consultez Format de résultat JSON. Nécessite Claude Code v2.1.268 ou ultérieur | |
-h, --help |
Afficher l'aide pour la commande |
La portée détermine quel fichier de paramètres le plugin installé est ajouté à. Par exemple, --scope project écrit dans enabledPlugins dans .claude/settings.json, rendant le plugin disponible pour tous ceux qui clonent le référentiel du projet.
Avec --json, la dernière ligne de stdout est un objet JSON. Analysez uniquement cette ligne, car Claude Code imprime toute commande que la marketplace déclare avant elle. Trois champs sont toujours présents :
command: la sous-commande qui a été exécutée, commeinstalloutcome:okoufailedmessage: une description lisible par l'homme du résultat
D'autres champs, tels que pluginId, scope, et failureCode, n'apparaissent que lorsqu'ils s'appliquent. L'option --json sur plugin uninstall, plugin update, plugin enable, et plugin disable imprime le même objet avec les propres champs de cette sous-commande. Une erreur d'utilisation, comme un --scope invalide, n'imprime aucune ligne de résultat et quitte 1 avec la raison sur stderr.
Ces exemples montrent les invocations courantes :
# Installer dans la portée utilisateur (par défaut)
claude plugin install formatter@my-marketplace
# Installer dans la portée du projet (partagé avec l'équipe)
claude plugin install formatter@my-marketplace --scope project
# Installer dans la portée locale (non partagé avec l'équipe)
claude plugin install formatter@my-marketplace --scope local
plugin uninstall
Supprimez un plugin installé.
claude plugin uninstall <plugin> [options]
La commande prend ces arguments :
<plugin>: Nom du plugin ouplugin-name@marketplace-name
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-s, --scope <scope> |
Désinstaller de la portée : user, project, ou local |
user |
--keep-data |
Préservez le répertoire de données persistantes du plugin | |
--prune |
Supprimez également les dépendances auto-installées qu'aucun autre plugin ne nécessite. Consultez plugin prune | |
-y, --yes |
Ignorez l'invite de confirmation --prune. Requis lorsque stdin ou stdout n'est pas un TTY |
|
--json |
Imprimez le résultat en tant qu'un objet JSON sur la dernière ligne de stdout, au même format que plugin install --json. Ne peut pas être combiné avec --prune. Nécessite Claude Code v2.1.268 ou ultérieur |
|
-h, --help |
Afficher l'aide pour la commande |
claude plugin remove et claude plugin rm sont des alias pour cette commande.
Par défaut, la désinstallation de la dernière portée restante supprime également le répertoire ${CLAUDE_PLUGIN_DATA} du plugin. Utilisez --keep-data pour le préserver, par exemple lors de la réinstallation après avoir testé une nouvelle version.
Lorsque les plugins installés de différentes marketplaces partagent un nom, la forme plugin-name@marketplace-name désinstalle uniquement le plugin de la marketplace nommée. Avant v2.1.212, la forme qualifiée pouvait correspondre et désinstaller le plugin du même nom d'une marketplace différente.
plugin prune
Supprimez les dépendances de plugin auto-installées qui ne sont plus requises par aucun plugin installé. Les dépendances que Claude Code a intégrées pour satisfaire le champ dependencies d'un autre plugin sont supprimées ; les plugins que vous avez installés directement ne sont jamais touchés.
claude plugin prune [options]
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-s, --scope <scope> |
Élaguer à la portée : user, project, ou local |
user |
--dry-run |
Listez ce qui serait supprimé sans rien supprimer | |
-y, --yes |
Ignorez l'invite de confirmation. Requis lorsque stdin ou stdout n'est pas un TTY | |
-h, --help |
Afficher l'aide pour la commande |
claude plugin autoremove est un alias pour cette commande.
La commande liste les dépendances orphelines et demande une confirmation avant de les supprimer. Pour supprimer un plugin et nettoyer ses dépendances en une seule étape, exécutez claude plugin uninstall <plugin> --prune.
plugin enable
Activez un plugin désactivé. Lorsque la cible est installée à partir d'une marketplace et déclare des dépendances, Claude Code les active transitivement à la même portée. La commande échoue dans les conditions que Activer ou désactiver un plugin avec des dépendances énumère.
claude plugin enable <plugin> [options]
La commande prend ces arguments :
<plugin>: Nom du plugin ouplugin-name@marketplace-name
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-s, --scope <scope> |
Portée à activer : user, project, ou local. Lorsqu'elle est omise, Claude Code détecte la portée où le plugin est installé |
Détection automatique |
--json |
Imprimez le résultat en tant qu'un objet JSON sur la dernière ligne de stdout, au même format que plugin install --json. Nécessite Claude Code v2.1.268 ou ultérieur |
|
-h, --help |
Afficher l'aide pour la commande |
plugin disable
Désactivez un plugin sans le désinstaller. Lorsque la cible est installée à partir d'une marketplace, la commande échoue si un autre plugin activé en dépend. Le message d'erreur inclut une commande chaînée qui désactive d'abord chaque dépendant.
claude plugin disable [plugin] [options]
La commande prend ces arguments :
[plugin]: Nom du plugin ouplugin-name@marketplace-name. Optionnel lors de l'utilisation de--all
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-a, --all |
Désactivez tous les plugins activés. Ne peut pas être combiné avec --scope |
|
-s, --scope <scope> |
Portée à désactiver : user, project, ou local. Lorsqu'elle est omise, Claude Code détecte la portée où le plugin est installé |
Détection automatique |
--json |
Imprimez le résultat en tant qu'un objet JSON sur la dernière ligne de stdout, au même format que plugin install --json. Nécessite Claude Code v2.1.268 ou ultérieur |
|
-h, --help |
Afficher l'aide pour la commande |
plugin update
Mettez à jour un plugin vers la dernière version.
claude plugin update <plugin> [options]
La commande prend ces arguments :
<plugin>: Nom du plugin ouplugin-name@marketplace-name
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-s, --scope <scope> |
Portée à mettre à jour : user, project, local, ou managed |
user |
-y, --yes |
Acceptez une commande que la marketplace du plugin déclare, sans l'invite de confirmation : la commande qui produit un plugin avec une command source, ou le headersHelper qui authentifie un téléchargement d'archive. Accepter un headersHelper nécessite Claude Code v2.1.238 ou ultérieur. Claude Code imprime toujours la commande en premier. Requis lorsque stdin ou stdout n'est pas un TTY. N'a aucun effet dans une session Claude Code, exécutez donc la commande depuis votre propre terminal |
|
--json |
Imprimez le résultat en tant qu'un objet JSON sur la dernière ligne de stdout, au même format que plugin install --json. Nécessite Claude Code v2.1.268 ou ultérieur |
|
-h, --help |
Afficher l'aide pour la commande |
Claude Code résout un nom de plugin nu par rapport à vos plugins installés. Lorsque les plugins installés de différentes marketplaces partagent le nom, Claude Code refuse la mise à jour et énumère les commandes plugin-name@marketplace-name qualifiées à exécuter à la place. Avant v2.1.246, Claude Code acceptait uniquement la forme qualifiée et rejetait un nom nu comme non trouvé.
plugin list
Listez les plugins installés avec leur version, leur marketplace source et leur statut d'activation.
claude plugin list [options]
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
--json |
Sortie en JSON. Une ligne de plugin avec des problèmes de chargement ou des avertissements de création porte des tableaux de chaînes errors ou notes. Sur Claude Code v2.1.268 ou ultérieur, les tableaux parallèles errorDetails et noteDetails donnent à chaque entrée son type de diagnostic et les noms auxquels elle se réfère, comme le plugin, la marketplace, le serveur ou le fichier |
|
--available |
Incluez les plugins disponibles des marketplaces. Nécessite --json |
|
-h, --help |
Afficher l'aide pour la commande |
Dans une session interactive, /plugin list imprime un listage similaire en ligne, mais il couvre uniquement les plugins installés depuis une marketplace :
- Les plugins chargés à partir des répertoires de compétences apparaissent dans l'interface
/pluginet dansclaude plugin list, mais pas dans la sortie en ligne/plugin list. - Sur Claude Code v2.1.239 ou ultérieur, les plugins synchronisés depuis claude.ai apparaissent dans
claude plugin listlorsque vous l'exécutez dans l'environnement où une session synchronisée les a téléchargés. Ils n'apparaissent pas dans la sortie en ligne/plugin list. - Les plugins chargés pour la session avec
--plugin-dirou--plugin-urlapparaissent dans l'interface/plugin, et dansclaude plugin listuniquement lorsque le même drapeau précède la sous-commande, comme dansclaude --plugin-dir <dir> plugin list. Seul le nom du drapeau indique leur emplacement, donc unclaude plugin listnu ne peut pas les trouver, contrairement aux plugins synchronisés et aux plugins du répertoire de compétences, dont les répertoires fixes sont analysés par Claude Code.
La forme interactive accepte --enabled ou --disabled pour afficher uniquement les plugins dans cet état, et ls comme raccourci pour list.
plugin details
Affichez l'inventaire des composants d'un plugin et le coût en jetons projeté. La sortie énumère tous les composants que le plugin contribue, regroupés en tant que Compétences, Agents, Hooks, serveurs MCP et serveurs LSP, ainsi qu'une estimation du nombre de jetons qu'il ajoute à chaque session. Le groupe Compétences inclut à la fois les entrées skills/ et commands/.
claude plugin details <name>
La commande prend ces arguments :
<name>: Nom du plugin ouplugin-name@marketplace-name
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
-h, --help |
Afficher l'aide pour la commande |
La sortie affiche deux chiffres de coût pour chaque composant :
- Toujours actif : jetons ajoutés à chaque session par le texte de listage du plugin, comme les descriptions de compétences, les descriptions d'agents et les noms de commandes, indépendamment du fait qu'un composant se déclenche ou non.
- À l'invocation : jetons qu'un composant coûte lorsqu'il se déclenche. Affiché par composant, pas comme un total de plugin, car une session typique n'invoque qu'un sous-ensemble de composants.
Cet exemple montre à quoi ressemble la sortie pour un plugin avec deux compétences :
dependency-guard 1.2.0
Dependency analysis for Claude Code sessions
Source: dependency-guard@example-marketplace
Component inventory
Skills (2) scan-dependencies, review-changes
Agents (0)
Hooks (1) SessionStart (harness-only — no model context cost)
MCP servers (0)
LSP servers (0)
Projected token cost
Always-on: ~180 tok added to every session
Per-component (rounded)
component always-on on-invoke
scan-dependencies ~100 ~2400
review-changes ~80 ~1800
On-invoke cost is paid each time a skill or agent fires.
Token counts are estimates and may differ from actual usage.
Le total toujours actif est calculé via l'API count_tokens pour votre modèle actif. Les nombres par composant sont proportionnellement mis à l'échelle à partir de ce total. Si l'API est inaccessible, la commande revient à une estimation basée sur les caractères.
plugin validate
Vérifiez un plugin ou une marketplace pour les erreurs de syntaxe et de schéma avant la publication.
La commande quitte 0 lorsque la validation réussit, 1 lorsqu'elle échoue, et 2 lorsque l'exécution de la validation elle-même échoue, par exemple lorsque le chemin que vous transmettez est illisible.
claude plugin validate <path> [options]
La commande prend ces arguments :
<path>: Chemin vers un répertoire de plugin ou un répertoire de marketplace. Consultez Valider un plugin ou un répertoire sans manifeste pour savoir quels fichiers une exécution de plugin couvre.
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
--strict |
Traitez les avertissements comme des erreurs et quittez 1 sur eux. Utilisez dans CI pour détecter les problèmes que le runtime tolère, comme les champs non reconnus | |
--json |
Sortez le rapport de validation en tant qu'un objet JSON avec les mêmes codes de sortie. Nécessite Claude Code v2.1.259 ou ultérieur | |
-h, --help |
Afficher l'aide pour la commande |
Avec --json, Claude Code écrit le rapport sur stdout en tant qu'un objet JSON avec ces champs de niveau supérieur :
success: le même verdict que le code de sortie donnestrict: si l'exécution a traité les avertissements comme des erreurstarget: le chemin résolu que Claude Code a validémanifest: le propre résultat du manifeste, ounullpour une exécution sans manifestecontents: résultats par fichier, chacun nommant sonfileet portant des tableauxerrors,warnings, etnotes
À la sortie 2, la commande n'écrit rien sur stdout ; le message d'erreur va à stderr.
Dans une session interactive, /plugin validate <path> exécute les mêmes vérifications en ligne.
plugin eval
Exécutez les cas d'évaluation d'un plugin et rapportez les résultats notés. Nécessite Claude Code v2.1.269 ou ultérieur. Chaque cas est une invite plus des évaluateurs ; Claude Code l'exécute plusieurs fois dans une session isolée avec uniquement le plugin cible chargé, et par défaut aussi sans le plugin afin que le rapport montre la différence. Consultez Tester les plugins avec des évaluations pour le format des cas, les évaluateurs, les résultats et l'utilisation en CI.
claude plugin eval [target] [options]
La target optionnelle est un répertoire de plugin, un seul fichier prompt.md ou case.yaml, un plugin installé en tant que name ou name@marketplace, ou name@skills-dir, et par défaut le répertoire courant. Mettez-le avant --tag, --allow-tools, et --json.
Ce tableau énumère les options que la plupart des exécutions utilisent. Exécutez claude plugin eval --help pour l'ensemble complet, y compris --case, --tag, --output-dir, --report, --allow-real-servers, --keep-temp, et --verbose.
| Option | Description | Par défaut |
|---|---|---|
--runs <n> |
Exécutions par cas par bras | runs de chaque cas, sinon 3 |
-j, --concurrency <n> |
Sessions d'agent à exécuter à la fois, 1 à 8. Elles partagent votre limite de débit | 1 |
--model <model> |
Modèle pour l'agent en test | model de chaque cas, sinon ANTHROPIC_MODEL s'il est défini, sinon la valeur par défaut de Claude Code |
--judge-model <model> |
Modèle pour les évaluateurs llm et baseline |
Un petit modèle rapide |
--ablation <mode> |
none ou with-without. Consultez Comparer par rapport à une ligne de base sans plugin |
with-without lorsqu'un plugin se résout, sinon none |
--threshold <0..1> |
Quittez 1 si un cas quelconque note en dessous de ceci | 1.0 |
--max-cost-usd <usd> |
Arrêtez avant la prochaine exécution une fois que les dépenses atteignent ceci, quittez 2, et rapportez les résultats partiels | Pas de plafond |
--allow-tools <tools...> |
Accordez des outils au-delà de l'ensemble en lecture seule, comme Bash, Write, Edit, ou "mcp__plugin_<plugin>_<server>__*". Consultez Accorder des outils |
|
--scaffold |
Exécutez le scaffold_script de chaque cas |
Désactivé |
--trust-plugin |
Ignorez l'invite de confiance à la première exécution, pour CI. Consultez Ce qu'une exécution peut accéder | Désactivé |
--mocks <mode> |
record ou off. Consultez Serveurs MCP fictifs |
record |
--eval-dir <dir> |
Répertoire sous le plugin qui contient les cas | Le experimental.evals du manifeste, sinon evals |
--json [path] |
Imprimez le document de résultat sur stdout, ou écrivez-le dans un chemin .json |
|
--no-publish |
Gardez le rapport HTML local | |
-h, --help |
Afficher l'aide pour la commande |
La commande quitte 0 lorsque chaque cas respecte le seuil, 1 sur un cas défaillant, une erreur de chargement, ou un répertoire de plugin non approuvé, 2 sur une exécution partielle, 130 lorsqu'elle est interrompue, et 143 lorsqu'elle est terminée. Consultez Exécuter les évaluations en CI.
plugin eval init
Créez une suite d'évaluation pour le plugin dans le répertoire courant. Nécessite Claude Code v2.1.269 ou ultérieur. Dans un terminal, cela démarre une interview de création qui lit le plugin, propose des cas et des évaluateurs, les teste, et écrit les fichiers. Avec --bare, ou sans terminal, il écrit un modèle de cas unique vierge à la place. Exécutez depuis une session Claude Code interactive, il imprime les instructions d'interview pour que cette session suive plutôt que d'écrire un modèle. Consultez Créer votre première suite d'évaluation.
claude plugin eval init [name] [options]
Le name optionnel est un nom de cas : l'interview n'en a pas besoin, tandis que --bare et le chemin du modèle sans terminal l'exigent. Il accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
--bare |
Écrivez un prompt.md vierge et graders/criteria.md pour <name> au lieu d'exécuter l'interview |
|
-i, --interactive |
Exigez l'interview. Échoue sans terminal au lieu d'écrire un modèle | |
--eval-dir <dir> |
Répertoire sous le répertoire courant pour écrire les cas dans | Le experimental.evals du manifeste, sinon evals |
-h, --help |
Afficher l'aide pour la commande |
plugin tag
Créez une balise git de version pour un plugin. Par défaut, la commande balise le plugin dans le répertoire courant ; transmettez un chemin pour baliser un plugin ailleurs. Consultez Baliser les versions de plugin.
claude plugin tag [path] [options]
La commande prend ces arguments :
[path]: Chemin vers le répertoire du plugin. Par défaut, le répertoire courant.
La commande accepte ces options :
| Option | Description | Par défaut |
|---|---|---|
--push |
Poussez la balise vers le serveur distant après l'avoir créée | |
--dry-run |
Imprimez ce qui serait balisé sans créer la balise | |
-f, --force |
Créez la balise même si l'arborescence de travail est sale ou la balise existe déjà | |
-m, --message <msg> |
Message d'annotation de balise. Utilisez %s comme espace réservé pour la version |
|
--remote <name> |
Serveur distant vers lequel pousser avec --push |
origin |
-h, --help |
Afficher l'aide pour la commande |
Outils de débogage et de développement
Commandes de débogage
Utilisez claude --debug pour voir les détails du chargement des plugins :
Cela affiche :
- Les plugins en cours de chargement
- Les erreurs dans les manifestes de plugins
- L'enregistrement des skills, agents et hooks
- L'initialisation du serveur MCP
Problèmes courants
| Problème | Cause | Solution |
|---|---|---|
| Plugin ne se charge pas | plugin.json invalide |
Exécutez claude plugin validate ./my-plugin ou /plugin validate ./my-plugin, où ./my-plugin est votre répertoire de plugin, pour vérifier plugin.json, hooks/hooks.json et le frontmatter des skills, agents et commandes dans les répertoires par défaut du plugin pour les erreurs de syntaxe et de schéma. Consultez Validate a plugin or a directory without a manifest pour savoir ce qu'une exécution couvre |
| Les skills n'apparaissent pas | Structure de répertoire incorrecte | Assurez-vous que skills/ ou commands/ se trouve à la racine du plugin, pas à l'intérieur de .claude-plugin/ |
| Les hooks ne se déclenchent pas | Script non exécutable | Exécutez chmod +x script.sh |
| Le serveur MCP échoue | ${CLAUDE_PLUGIN_ROOT} manquant |
Utilisez la variable pour tous les chemins de plugin |
| Erreurs de chemin | Chemins absolus utilisés | Rendez les chemins relatifs, en commençant par ./ ; consultez Path behavior rules, qui couvrent l'exception "." du champ skills |
LSP Executable not found in $PATH |
Serveur de langage non installé | Installez le binaire (par exemple, npm install -g typescript-language-server typescript) |
Exemples de messages d'erreur
Erreurs de validation de manifeste :
Invalid JSON syntax: Unexpected token } in JSON at position 142: vérifiez les virgules manquantes, les virgules supplémentaires ou les chaînes non citéesPlugin <name> has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Invalid input: expected string, received undefined: un champ obligatoire est manquantPlugin <name> has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...: erreur de syntaxe JSON. Avant v2.1.246, Claude Code produisait également cette erreur pour unplugin.jsonenregistré en UTF-8 avec une marque d'ordre des octets (BOM), même lorsque le JSON était par ailleurs valide.
Erreurs de chargement de plugin :
Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.: le chemin de la commande existe mais ne contient aucun fichier de commande validePlugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.: le cheminsourcedans marketplace.json pointe vers un répertoire inexistantPlugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.: supprimez les définitions de composants en double ou supprimezstrict: falsedans l'entrée marketplace
Dépannage des hooks
Le script du hook ne s'exécute pas :
- Vérifiez que le script est exécutable :
chmod +x ./scripts/your-script.sh - Vérifiez la ligne shebang : La première ligne doit être
#!/bin/bashou#!/usr/bin/env bash - Vérifiez que le chemin utilise
${CLAUDE_PLUGIN_ROOT}:"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh" - Testez le script manuellement :
./scripts/your-script.sh
Le hook ne se déclenche pas sur les événements attendus :
- Vérifiez que le nom de l'événement est correct (sensible à la casse) :
PostToolUse, paspostToolUse - Vérifiez que le motif du matcher correspond à vos outils :
"matcher": "Write|Edit"pour les opérations de fichier - Confirmez que le type de hook est valide :
command,http,mcp_tool,promptouagent
Dépannage du serveur MCP
Le serveur ne démarre pas :
- Vérifiez que la commande existe et est exécutable
- Vérifiez que tous les chemins utilisent la variable
${CLAUDE_PLUGIN_ROOT} - Vérifiez les journaux du serveur MCP :
claude --debugaffiche les erreurs d'initialisation - Testez le serveur manuellement en dehors de Claude Code
Les outils du serveur n'apparaissent pas :
- Assurez-vous que le serveur est correctement configuré dans
.mcp.jsonouplugin.json - Vérifiez que le serveur implémente correctement le protocole MCP
- Vérifiez les délais d'expiration de la connexion dans la sortie de débogage
Erreurs de structure de répertoire
Symptômes : Le plugin se charge mais les composants (skills, agents, hooks) sont manquants.
Structure correcte : Les composants doivent être à la racine du plugin, pas à l'intérieur de .claude-plugin/. Seul plugin.json appartient à .claude-plugin/.
Liste de contrôle de débogage :
- Exécutez
claude --debuget recherchez les messages « loading plugin » - Vérifiez que chaque répertoire de composant est listé dans la sortie de débogage
- Vérifiez que les permissions de fichier permettent de lire les fichiers du plugin
Référence de distribution et de versioning
Gestion des versions
Claude Code utilise la version du plugin comme clé de cache qui détermine si une mise à jour est disponible. Lorsque vous exécutez /plugin update ou que la mise à jour automatique se déclenche, Claude Code calcule la version actuelle et ignore la mise à jour si elle correspond à celle déjà installée.
Pour chaque type de source sauf command, Claude Code résout la version à partir du premier de ces éléments qui est défini :
- Le champ
versiondans le fichierplugin.jsondu plugin - Le champ
versiondans l'entrée marketplace du plugin dansmarketplace.json - Le SHA du commit git du plugin, pour les sources
github,url,git-subdiret relative-path dans une marketplace hébergée sur git - Le digest SHA-256, pour les sources
archive: le pinsha256dans l'entrée marketplace, ou le digest du fichier téléchargé lorsque vous ne définissez aucun pin. Claude Code le raccourcit aux 12 premiers caractères unknown, pour les sourcesnpmou les répertoires locaux ne se trouvant pas dans un dépôt git
Pour une source command, Claude Code dérive toujours la version à partir de ce que la commande a produit : un hash de contenu de 12 caractères seul, ou ajouté à la version plugin.json sous la forme <version>-<hash> lorsqu'une version est définie. Claude Code ignore le champ version de l'entrée marketplace pour les sources command. Une commande dont la sortie hachée change produit donc une nouvelle version, même lorsque la chaîne de version créée reste la même. En mode lien, le hash couvre le chemin réel du répertoire imprimé et ses entrées de niveau supérieur plutôt que le contenu des fichiers.
Pour ces types de sources, cela vous donne trois façons de versionner un plugin :
| Approche | Comment | Comportement de mise à jour | Idéal pour |
|---|---|---|---|
| Version explicite | Définissez "version": "2.1.0" dans plugin.json |
Les utilisateurs reçoivent les mises à jour uniquement lorsque vous augmentez ce champ. Pousser de nouveaux commits sans l'augmenter n'a aucun effet, et /plugin update signale « déjà à la dernière version ». |
Plugins publiés avec des cycles de publication stables |
| Version SHA du commit | Omettez version à la fois de plugin.json et de l'entrée marketplace |
Les utilisateurs reçoivent les mises à jour chaque fois que le commit résolu de la source change | Plugins internes ou d'équipe en développement actif |
| Version du digest | Utilisez une source archive et omettez version à la fois de plugin.json et de l'entrée marketplace |
Avec un pin sha256, les utilisateurs reçoivent les mises à jour lorsque vous modifiez le pin. Sans pin, les utilisateurs reçoivent les mises à jour chaque fois que les octets du fichier zip hébergé changent |
Plugins publiés en tant que fichiers zip sur un serveur statique ou un référentiel d'artefacts |
Si vous utilisez des versions explicites, suivez le versioning sémantique (MAJOR.MINOR.PATCH) : augmentez MAJOR pour les modifications incompatibles, MINOR pour les nouvelles fonctionnalités, PATCH pour les corrections de bogues. Documentez les modifications dans un fichier CHANGELOG.md.
Voir aussi
- Plugins - Tutoriels et utilisation pratique
- Marketplaces de plugins - Création et gestion des marketplaces
- Skills - Détails du développement des skills
- Subagents - Configuration et capacités des agents
- Hooks - Gestion des événements et automatisation
- MCP - Intégration des outils externes
- Paramètres - Options de configuration pour les plugins