Riferimento dei componenti del plugin
Skills
I plugin aggiungono skills a Claude Code, creando scorciatoie/name che tu o Claude potete invocare.
Posizione: directory skills/ o commands/ nella radice del plugin, oppure un singolo file SKILL.md nella radice del plugin
Formato file: Gli skills sono directory con SKILL.md; i commands sono semplici file markdown
Struttura skill:
skills/ e nessun campo manifest skills, un SKILL.md nella radice del plugin viene caricato come un singolo skill. Impostare il campo frontmatter name per controllare il nome di invocazione dello skill. Senza di esso, Claude Code ricade al nome della directory di installazione, che per i plugin installati dal marketplace è una stringa di versione che cambia ad ogni aggiornamento. Per i plugin che forniscono più di uno skill, utilizzare il layout della directory skills/ mostrato sopra.
Negli skills e nei commands del plugin, i campi frontmatter booleani come disable-model-invocation accettano yes, no, on, off, 1 e 0 in qualsiasi caso di lettera, oltre a true e false. Prima della v2.1.218, Claude Code riconosceva solo true e false.
Per i dettagli completi, vedere Skills.
Agents
I plugin possono fornire subagent specializzati per compiti specifici che Claude può invocare automaticamente quando appropriato. Posizione: directoryagents/ nella radice del plugin
Formato file: File markdown che descrivono le capacità dell’agent
Struttura agent:
name, description, model, effort, maxTurns, tools, disallowedTools, skills, memory, background e isolation. L’unico valore isolation valido è "worktree". Per motivi di sicurezza, hooks, mcpServers e permissionMode non sono supportati per gli agent forniti dal plugin.
Claude Code carica un agent del plugin anche quando il suo frontmatter non ha name o non viene analizzato:
- Nessun
name: Claude Code nomina l’agent in base al file, quindiagents/reviewer.mdin un plugin denominatomy-pluginviene caricato comemy-plugin:reviewer - Frontmatter che non viene analizzato: Claude Code nomina l’agent in base al file, utilizza
Agent from my-plugin plugincome sua descrizione e ignora ogni campo nel file
name o non viene analizzato.
Per trovare i file nella directory agents/ predefinita di un plugin il cui frontmatter non viene analizzato, eseguire claude plugin validate. Il percorso che passi dipende dal fatto che il plugin abbia un manifest, e entrambi gli esempi utilizzano ./my-plugin come directory del plugin:
- Un plugin con un manifest:
claude plugin validate ./my-plugin - Un plugin senza un manifest:
claude plugin validate ./my-plugin/agents. Richiede Claude Code v2.1.233 o successivo.
my-plugin:code-reviewer, una volta che il plugin è abilitato.
Per i dettagli completi, vedere Subagent.
Hooks
I plugin possono fornire gestori di eventi che rispondono automaticamente agli eventi di Claude Code. Posizione:hooks/hooks.json nella radice del plugin, oppure inline in plugin.json
Formato: Configurazione JSON con matcher di eventi e azioni
Configurazione hook:
Tipi di hook:
command: eseguire comandi shell o scripthttp: inviare l’evento JSON come richiesta POST a un URLmcp_tool: chiamare uno strumento su un server MCP configuratoprompt: valutare un prompt con un LLM (utilizza il placeholder$ARGUMENTSper il contesto)agent: eseguire un verificatore agentico con strumenti per compiti di verifica complessi
if prendono il nome dello strumento con scope mcp__plugin_<plugin-name>_<server-name>__<tool>, e il campo server di un hook mcp_tool prende plugin:<plugin-name>:<server-name>. Un matcher scritto contro la chiave del server nuda non si attiva mai. Vedere Match MCP tools e Plugin-provided MCP servers.
MCP servers
I plugin possono raggruppare server Model Context Protocol (MCP) per connettere Claude Code con strumenti e servizi esterni. Posizione:.mcp.json nella radice del plugin, oppure inline in plugin.json
Formato: Configurazione standard del server MCP
Configurazione del server MCP:
- I server MCP del plugin si avviano automaticamente quando il plugin è abilitato
- I server vengono visualizzati come strumenti MCP standard nel toolkit di Claude
- I server del plugin possono essere configurati indipendentemente dai server MCP dell’utente
- Se esegui
/reload-pluginsa metà sessione, Claude Code mantiene le connessioni live dei server la cui configurazione è invariata
LSP servers
I plugin possono fornire server Language Server Protocol (LSP) per dare a Claude intelligenza del codice in tempo reale mentre lavori sulla tua codebase. Posizione:.lsp.json nella radice del plugin, oppure inline in plugin.json
Formato: Configurazione JSON che mappa i nomi dei server di linguaggio alle loro configurazioni
Formato file .lsp.json:
plugin.json:
Campi opzionali:
restartOnCrash e shutdownTimeout richiedono Claude Code v2.1.205 o successivo. Prima della v2.1.205, lo schema di configurazione accettava entrambe le opzioni ma l’impostazione di una di esse causava a Claude Code di saltare completamente quel server LSP all’avvio, con il motivo visibile solo nell’output di claude --debug.
Più server per la stessa estensione: quando più di un server LSP abilitato dichiara la stessa estensione di file in extensionToLanguage, indipendentemente dal fatto che i server provengano da un plugin o da plugin diversi, il primo server registrato gestisce i file con quell’estensione e gli altri non si avviano mai. L’interfaccia /plugin mostra un avviso che nomina il plugin il cui server è attivo.
Server che non riescono a inizializzare: Claude Code salta un server la cui configurazione non è valida, ad esempio uno che manca command o extensionToLanguage, e gli altri server configurati si avviano comunque. Eseguire claude --debug per vedere perché un server è stato saltato.
Un server saltato non rivendica le sue estensioni di file, quindi un altro server valido che dichiara la stessa estensione, dallo stesso plugin o da un plugin diverso, gestisce comunque quei file.
Invia l’output del log a stderr, non a stdout: Claude Code legge lo stdout di un server solo come messaggi di protocollo e accetta intestazioni di messaggi fino a 64 KiB e un corpo di messaggio fino a 32 MiB. Claude Code disconnette un server che supera uno dei due limiti o scrive output non-protocollo a stdout, e conta la disconnessione come un crash per restartOnCrash e maxRestarts. Quando esegui con --debug, Claude Code scrive un errore che nomina la causa nel log di debug.
Plugin LSP disponibili:
Installa il server di linguaggio per primo, quindi installa il plugin dal marketplace.
Monitors
I plugin possono dichiarare monitor in background che Claude Code avvia automaticamente quando il plugin è attivo. Ogni monitor esegue un comando shell per la durata della sessione e fornisce ogni riga stdout a Claude come notifica, in modo che Claude possa reagire alle voci di log, ai cambiamenti di stato o agli eventi sondati senza essere chiesto di avviare il watch stesso. I monitor del plugin utilizzano lo stesso meccanismo dello strumento Monitor e condividono i suoi vincoli di disponibilità. Vengono eseguiti solo in sessioni CLI interattive, vengono eseguiti senza sandbox allo stesso livello di fiducia degli hook e vengono saltati su host dove lo strumento Monitor non è disponibile. Posizione:monitors/monitors.json nella radice del plugin, oppure inline in plugin.json
Formato: Array JSON di voci di monitor
Il seguente monitors/monitors.json osserva un endpoint di stato di distribuzione e un log di errore locale:
experimental.monitors in plugin.json sullo stesso array. Per caricare da un percorso non predefinito, impostare experimental.monitors su una stringa di percorso relativo come "./config/monitors.json". I monitor sono un componente sperimentale.
Campi obbligatori:
Campi opzionali:
Il valore
command supporta le sostituzioni di percorso ${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA} e ${CLAUDE_PROJECT_DIR}, più qualsiasi ${ENV_VAR} dall’ambiente. Prefisso il comando con cd "${CLAUDE_PLUGIN_ROOT}" && se lo script deve essere eseguito dalla directory del plugin stesso.
Un command di monitor non può fare riferimento ai valori ${user_config.*}. Il comando viene eseguito attraverso una shell, quindi Claude Code rifiuta il monitor con un errore invece di sostituire il valore. I processi di monitor non ricevono variabili di ambiente CLAUDE_PLUGIN_OPTION_<KEY>, quindi fai in modo che lo script di monitor legga il valore da un file di configurazione che possiede.
Se disabiliti un plugin a metà sessione, Claude Code non interrompe i monitor che sono già in esecuzione; si fermano quando la sessione termina.
Themes
I plugin possono fornire temi di colore che vengono visualizzati in/theme insieme ai preset integrati e ai temi locali dell’utente. Un tema è un file JSON in themes/ con un preset base e una mappa sparsa overrides di token di colore. I temi sono un componente sperimentale.
custom:<plugin-name>:<slug> nella sua configurazione. I temi del plugin sono di sola lettura: quando un utente preme Ctrl+E su uno in /theme, Claude Code lo copia in ~/.claude/themes/ in modo che possano modificare la copia.
Ambiti di installazione dei plugin
Quando installi un plugin, scegli un ambito che determina dove il plugin è disponibile e chi altro può utilizzarlo:
I plugin utilizzano lo stesso sistema di ambiti di altre configurazioni di Claude Code. Per le istruzioni di installazione e i flag di ambito, vedi Install plugins. Per una spiegazione completa degli ambiti, vedi Configuration scopes.
Plugin della directory skills
Qualsiasi cartella sotto una directory skills che contiene un manifest.claude-plugin/plugin.json viene caricata come plugin denominato <name>@skills-dir nella sessione successiva, senza marketplace e senza passaggio di installazione. Creane uno con plugin init. A differenza di un’installazione marketplace copiata, il plugin viene scoperto sul posto piuttosto che copiato nella cache dei plugin.
Un albero di directory skills supporta tre cose distinte:
Scegli da dove il plugin viene caricato
Un plugin con ambito progetto viene archiviato nel repository e raggiunge ogni collaboratore che lo clona. Poiché quel contenuto proviene dal repository piuttosto che da te, viene caricato solo dopo lo stesso gate di trust che governa le regole di autorizzazione del progetto in
.claude/settings.json, quindi fidarsi di una cartella padre o eseguire con -p non è sufficiente, e i componenti che eseguono codice sono ulteriormente limitati:
- I server MCP che dichiara passano attraverso la stessa approvazione per server di un
.mcp.jsondel progetto - I server LSP si avviano solo dopo che hai fiducia nell’area di lavoro
- I monitor in background non vengono caricati
Modifica, ricarica e disabilita un plugin della directory skills
Le modifiche che apporti alSKILL.md di una skill hanno effetto immediato nella sessione corrente. Le modifiche agli altri componenti del plugin, come hooks/, .mcp.json, agents/ e output-styles/, non lo fanno. Esegui /reload-plugins o riavvia Claude Code per caricarli. Vedi Live change detection.
Per smettere di caricare un plugin della directory skills, elimina la sua cartella o disabilitalo per nome. Non c’è un passaggio uninstall perché nulla è stato installato da un marketplace.
Plugin sincronizzati da claude.ai
In Cowork e sessioni cloud, Claude Code scarica i plugin abilitati per il vostro account claude.ai in~/.claude/plugins/synced/ nell’ambiente della sessione stessa e carica ciascuno come <name>@synced, senza marketplace e senza record di installazione. Claude Code non li carica nelle sessioni che avviate nel vostro terminale. All’interno di quell’ambiente Cowork o cloud, claude plugin list mostra le copie scaricate sotto un’intestazione Synced from claude.ai. Prima della v2.1.239, Claude Code caricava questi plugin come <name>@inline, l’identità che i plugin --plugin-dir utilizzano.
Gestite un plugin sincronizzato tramite l’ID <name>@synced che claude plugin list stampa:
- Disabilitarne uno: nella sessione sincronizzata, eseguite
claude plugin disable <name>@synced, oppure chiedete a Claude di eseguirlo. Claude Code salva la scelta come"<name>@synced": falsenelenabledPluginsa livello di utente di quell’ambiente. Per riabilitare il plugin, eseguiteclaude plugin enable <name>@syncednella stessa sessione. Per escludere un plugin da ogni sessione sincronizzata, disabilitatelo per il vostro account claude.ai. Per escluderlo dalle sessioni sincronizzate di un progetto in ogni ambiente, impostate"<name>@synced": falsesottoenabledPluginsnel.claude/settings.jsoncommittato del progetto. - Gestite il plugin stesso su claude.ai:
claude plugin install,updateeuninstallnon si applicano a un plugin sincronizzato. Per rimuoverne uno, disabilitate il plugin per il vostro account claude.ai; la prossima sessione sincronizzata inizierà senza di esso.
--plugin-dir, corrisponde al nome di un plugin sincronizzato, Claude Code carica quel plugin e segnala la copia sincronizzata come non caricata. Per utilizzare la copia da claude.ai, disabilitate la vostra copia. Prima della v2.1.239, Claude Code caricava la copia sincronizzata al posto di un’installazione da marketplace con lo stesso nome.
Schema del manifest del plugin
Il file.claude-plugin/plugin.json definisce i metadati e la configurazione del plugin.
Il manifest è facoltativo. Se omesso, Claude Code scopre automaticamente i componenti nelle posizioni predefinite e deriva il nome del plugin dal nome della directory. Utilizzare un manifest quando è necessario fornire metadati o percorsi di componenti personalizzati.
Schema completo
Campi obbligatori
Se si include un manifest,name è l’unico campo obbligatorio.
Questo nome viene utilizzato per lo spazio dei nomi dei componenti. Ad esempio, nell’interfaccia utente, l’agente
agent-creator per il plugin con nome plugin-dev apparirà come plugin-dev:agent-creator.
Campi non riconosciuti
Claude Code ignora i campi di primo livello che non riconosce. È possibile mantenere i metadati da un altro ecosistema inplugin.json e il plugin si carica comunque. Questo rende pratico mantenere un unico manifest che funziona sia come manifest di VS Code o Cursor, come package.json npm, o come manifest di bundle MCPB/DXT.
claude plugin validate segnala i campi non riconosciuti come avvisi, non come errori. Se un campo è uno o due caratteri diverso da uno riconosciuto, l’avviso suggerisce il nome probabilmente inteso. Un plugin con solo avvisi di campi non riconosciuti passa comunque la convalida e si carica al runtime.
Il modo in cui Claude Code gestisce un campo riconosciuto il cui valore ha il tipo sbagliato dipende dal campo:
- La maggior parte dei campi: il plugin non si carica. Ad esempio, un valore
keywordsche è una stringa invece di un array è un errore di caricamento, eclaude plugin validatelo segnala come tale. experimentalemetadata: Claude Code ignora un valore non-oggetto, eclaude plugin validatesegnala un avviso.
--strict per trattare gli avvisi come errori. Utilizzarlo in CI per rilevare un nome di campo scritto male o un campo rimasto da un manifest di un altro strumento prima della pubblicazione, anche se il plugin si caricherà al runtime.
Campi di metadati
Abilitazione predefinita
ImpostaredefaultEnabled: false in plugin.json per distribuire un plugin che si installa disabilitato. L’utente lo attiva con claude plugin enable <plugin> o l’interfaccia /plugin. Utilizzare questa opzione per i plugin che aggiungono costi o ambito a cui un utente dovrebbe acconsentire esplicitamente, come uno che si connette a un servizio esterno.
defaultEnabled è il fallback quando nient’altro ha deciso lo stato del plugin. Due cose hanno la precedenza su di esso:
- L’impostazione dell’utente: una voce per il plugin in
enabledPluginsin qualsiasi ambito di impostazioni. Una volta scritta, persiste tra gli aggiornamenti e le reinstallazioni del plugin, quindi modificaredefaultEnabledin una versione successiva non capovolge un utente esistente. - Un requisito di dipendenza: quando un plugin è richiesto da un altro che è attivo, Claude Code scrive
trueper esso al momento dell’installazione o dell’abilitazione. Questo gli dà un’impostazione esplicita, quindi il suo valore predefinito non si applica più. Vedere Abilitare o disabilitare un plugin con dipendenze.
plugin.json. Vedere Campi plugin facoltativi.
Campi del percorso del componente
Componenti sperimentali
I componenti sotto la chiaveexperimental, themes e monitors, hanno uno schema di manifest che potrebbe cambiare tra le versioni mentre si stabilizzano. Dove li si dichiara è una migrazione separata: il livello superiore funziona ancora, claude plugin validate avverte, e una versione futura richiederà experimental.*.
Configurazione utente
Il campouserConfig dichiara i valori per i quali Claude Code richiede all’utente quando il plugin è abilitato. Utilizzare questa opzione invece di richiedere agli utenti di modificare manualmente settings.json.
Ogni valore è disponibile per la sostituzione come
${user_config.KEY} nelle configurazioni del server MCP e LSP e nei comandi hook. I valori non sensibili possono anche essere sostituiti nel contenuto di skill e agenti. Tutti i valori vengono esportati ai processi hook come variabili di ambiente CLAUDE_PLUGIN_OPTION_<KEY>, dove <KEY> è la chiave dell’opzione in maiuscolo.
I campi che vengono eseguiti in una shell rifiutano ${user_config.*}: sostituire un valore configurato in un comando shell consentirebbe alla shell di eseguire qualsiasi cosa contenga quel valore, quindi il componente fallisce con un errore invece. Ogni campo rifiutato ha un modo alternativo per passare il valore:
Prima della v2.1.207, questi campi sostituivano i valori
${user_config.KEY}; aggiornare i plugin che si basavano su questo.
I valori non sensibili vengono memorizzati sotto la chiave pluginConfigs nel file settings.json dell’utente come pluginConfigs[<plugin-id>].options.
Su macOS, Claude Code memorizza i valori sensibili nel Portachiavi di macOS, ricadendo su ~/.claude/.credentials.json quando il Portachiavi rifiuta la scrittura. Su piattaforme senza un portachiavi supportato, li memorizza in ~/.claude/.credentials.json. L’archiviazione del Portachiavi è condivisa con i token OAuth e ha un limite totale approssimativo di 2 KB, quindi mantenere i valori sensibili piccoli.
Claude Code legge tutti i valori pluginConfigs da solo tre fonti di impostazioni:
- Impostazioni utente:
~/.claude/settings.json, il file in cui la richiesta al momento dell’abilitazione scrive --settings: il flag CLI o le impostazioni inline SDK- Impostazioni gestite: politica controllata dall’organizzazione
--settings, quindi le impostazioni utente. L’unica fonte che è possibile rimuovere da questo elenco è le impostazioni utente: passare --setting-sources senza user e Claude Code le salta. Le impostazioni gestite e --settings rimangono qualsiasi cosa si passi. L’opzione settingSources dell’SDK imposta lo stesso elenco.
Le voci nel file .claude/settings.json o .claude/settings.local.json di un progetto vengono ignorate. Entrambi i file si trovano nell’area di lavoro, quindi un repository clonato potrebbe fornire valori lì, e quei valori fluirebbero nei comandi hook del plugin, nelle configurazioni del server MCP, nei comandi LSP e nei comandi monitor. Prima della v2.1.207, queste voci venivano lette. La restrizione è specifica per pluginConfigs: enabledPlugins onora ancora le impostazioni del progetto e locali.
Canali
Il campochannels consente a un plugin di dichiarare uno o più canali di messaggi che iniettano contenuto nella conversazione. Ogni canale si associa a un server MCP fornito dal plugin.
server è obbligatorio e deve corrispondere a una chiave in mcpServers del plugin. L’opzionale userConfig per canale utilizza lo stesso schema del campo di primo livello, consentendo al plugin di richiedere token bot o ID proprietario quando il plugin è abilitato.
Regole di comportamento del percorso
Se un percorso personalizzato sostituisce o estende la directory predefinita del plugin dipende dal campo:- Sostituisce il valore predefinito:
commands,agents,workflows,outputStyles,experimental.themes,experimental.monitors. Ad esempio, quando il manifest specificacommands, la directory predefinitacommands/non viene scansionata. Per mantenere il valore predefinito e aggiungerne altri, elencarli esplicitamente:"commands": ["./commands/", "./extras/"] - Si aggiunge al valore predefinito:
skills. La directory predefinitaskills/viene sempre scansionata, e le directory elencate inskillsvengono caricate insieme ad essa. Eccezione: per una voce del marketplace la cuisourcesi risolve nella radice del marketplace, dichiarare sottodirectory specifiche sostituisce la scansione predefinitaskills/ - Regole di merge proprie: hooks, server MCP, e server LSP. Vedere ogni sezione per come più fonti si combinano
claude plugin list e nella vista dei dettagli /plugin. Il plugin si carica comunque utilizzando i percorsi del manifest. Claude Code non avverte quando la chiave manifest punta nella cartella predefinita, ad esempio "commands": ["./commands/deploy.md"], perché quel percorso nomina la cartella esplicitamente.
Per tutti i campi del percorso:
- Tutti i percorsi devono essere relativi alla radice del plugin e iniziare con
./, tranne che il camposkillsaccetta anche"."- Sia
"."che"./"denotano la radice del plugin stesso - Prima della v2.1.221,
"."falliva la convalida del manifest e il plugin non si caricava, quindi utilizzare"./"per supportare versioni precedenti
- Sia
- I componenti da percorsi personalizzati utilizzano le stesse regole di denominazione e spazio dei nomi
- Più percorsi possono essere specificati come array
- Un percorso di skill può puntare a una directory che contiene direttamente un
SKILL.md, ad esempio"skills": ["."]per la radice del plugin- Claude Code prende il nome di invocazione della skill dal campo frontmatter
nameinSKILL.md, quindi il nome rimane stabile indipendentemente da come viene denominata la directory di installazione - Se
namenon è impostato nel frontmatter, Claude Code ritorna al nome della directory di base
- Claude Code prende il nome di invocazione della skill dal campo frontmatter
SKILL.md alla sua radice, nessuna sottodirectory skills/, e nessun campo manifest skills viene caricato automaticamente come plugin a skill singola. Non è necessario impostare "skills": ["./"] in plugin.json per questo layout.
Esempi di percorso:
Variabili di ambiente
Claude Code fornisce tre variabili per fare riferimento ai percorsi:
Tutti e tre vengono esportati come variabili di ambiente ai processi hook e ai sottoprocessi del server MCP e LSP. Quali campi sostituiscono inline dipende dal componente del plugin:
Nei comandi hook, utilizzare forma exec con
args in modo che ogni percorso venga passato come un argomento senza virgolette. Negli hook in forma shell e nei comandi monitor, racchiudere le variabili tra virgolette doppie, come in "${CLAUDE_PROJECT_DIR}/scripts/server.sh". Questo hook in forma shell esegue uno script fornito con un plugin:
${CLAUDE_PLUGIN_ROOT} cambia quando il plugin si aggiorna. La directory della versione precedente rimane su disco per un periodo di grazia dopo un aggiornamento, ma trattarla come effimera e non scrivere stato lì. Vedere plugin caching per la semantica di pulizia.
Quando un plugin si aggiorna a metà sessione, i comandi hook, i monitor, i server MCP e i server LSP continuano a utilizzare il percorso della versione precedente. Eseguire /reload-plugins per passare i hook, i server MCP e i server LSP al nuovo percorso; i monitor richiedono un riavvio della sessione. In una sessione senza un terminale interattivo, il ricaricamento lascia i server MCP del plugin sul percorso precedente fino alla sessione successiva.
Per un plugin con una command source, Claude Code può ricaricare il plugin stesso.
I server MCP possono anche chiamare la richiesta roots/list per leggere le directory di lavoro della sessione al runtime. Vedere cosa restituisce roots/list e quando Claude Code notifica al server i cambiamenti.
Directory di dati persistenti
La directory${CLAUDE_PLUGIN_DATA} si risolve in ~/.claude/plugins/data/{id}/, dove {id} è l’identificatore del plugin con caratteri al di fuori di a-z, A-Z, 0-9, _, e - sostituiti da -. Per un plugin installato come formatter@my-marketplace, la directory è ~/.claude/plugins/data/formatter-my-marketplace/.
Un uso comune è installare le dipendenze del linguaggio una volta e riutilizzarle tra sessioni e aggiornamenti del plugin. Utilizzarla per le dipendenze Python, le dipendenze bloccate con Yarn o pnpm, e i pacchetti i cui script del ciclo di vita devono essere eseguiti. Per un plugin installato dal marketplace, potrebbe non essere necessario affatto: Claude Code installa automaticamente le dipendenze del pacchetto Node.js idonee quando memorizza il plugin nella cache.
Poiché la directory di dati sopravvive a qualsiasi singola versione del plugin, un controllo per l’esistenza della directory da solo non può rilevare quando un aggiornamento cambia il manifest delle dipendenze del plugin. Il modello consigliato confronta il manifest fornito con una copia nella directory di dati e reinstalla quando differiscono.
Questo hook SessionStart installa node_modules alla prima esecuzione e di nuovo ogni volta che un aggiornamento del plugin include un package.json modificato:
diff esce con codice diverso da zero quando la copia memorizzata è mancante o differisce da quella fornita, coprendo sia la prima esecuzione che gli aggiornamenti che cambiano le dipendenze. Se npm install fallisce, il trailing rm rimuove il manifest copiato in modo che la sessione successiva riprovi.
Gli script forniti in ${CLAUDE_PLUGIN_ROOT} possono quindi essere eseguiti contro il node_modules persistente:
/plugin mostra la dimensione della directory e richiede conferma prima di eliminare. La CLI elimina per impostazione predefinita; passare --keep-data per preservarla.
Caching dei plugin e risoluzione dei file
I plugin vengono specificati in uno di due modi:- Tramite
claude --plugin-diroclaude --plugin-url, per la durata di una sessione. - Tramite un marketplace, installato per sessioni future.
~/.claude/plugins/cache) piuttosto che utilizzarli sul posto, ad eccezione delle command sources in link mode, che Claude Code utilizza sul posto tramite link nella voce della cache.
Per i plugin copiati, ogni versione installata è una directory separata nella cache, raggruppata per marketplace e plugin e denominata per la versione risolta, con la propria copia dei file del plugin e delle dipendenze dei pacchetti Node.js. Una dipendenza risolta da un release tag ottiene un nome di directory con un suffisso commit-SHA.
Quando aggiornate o disinstallate un plugin, Claude Code contrassegna la directory della versione precedente come orfana e la rimuove in una scansione in background approssimativamente 14 giorni dopo. Il periodo di grazia consente alle sessioni di Claude Code concorrenti che hanno già caricato la versione precedente di continuare a funzionare senza errori. Claude Code esegue la scansione solo mentre è installato almeno un plugin; dopo aver disinstallato l’ultimo plugin, le directory orfane rimangono su disco fino a quando non installate di nuovo un plugin.
Claude Code rimuove una cartella di plugin o marketplace dalla cache solo quando non contiene più alcuna directory o symlink. Se create un symlink di uno sviluppo locale nella cache come voce di versione di un plugin, Claude Code non contrassegna mai il link come orfano e non lo rimuove mai né le cartelle che lo contengono. Claude Code inoltre non scrive mai i suoi file di tracciamento delle versioni all’interno del checkout collegato.
Gli strumenti Glob e Grep di Claude saltano le directory delle versioni orfane durante le ricerche, quindi i risultati dei file non includono codice di plugin obsoleto.
Dipendenze dei pacchetti Node.js
Quando Claude Code copia un plugin nella cache, installa anche le dipendenze dei pacchetti Node.js del plugin lì, in modo che gli hook e i server MCP del plugin possano caricarli. Questa sezione copre i pacchetti npm e Bun che un plugin dichiara nel suopackage.json. Per i plugin che dipendono da altri plugin, vedere versioni delle dipendenze dei plugin.
Claude Code esegue l’installazione all’interno della directory della versione copiata ogni volta che ne crea una: quando installate un plugin, quando Claude Code aggiorna un plugin a una nuova versione, e all’inizio della sessione quando un plugin abilitato non è ancora memorizzato nella cache, ad esempio su una nuova macchina. L’installazione viene eseguita solo quando la directory root del plugin contiene sia un package.json che un lockfile supportato:
Se un plugin contiene più di uno di questi lockfile, Claude Code utilizza la prima corrispondenza, controllando in ordine:
bun.lock, bun.lockb, npm-shrinkwrap.json, package-lock.json. Claude Code salta yarn.lock e pnpm-lock.yaml perché Yarn e pnpm supportano hook di configurazione in fase di risoluzione che bypassano --ignore-scripts.
Fornite un lockfile npm per la portata più ampia. Claude Code esegue il gestore di pacchetti del lockfile corrispondente dal PATH dell’utente e non esegue il fallback all’altro lockfile se manca. Per un plugin distribuito tramite una fonte npm, utilizzate npm-shrinkwrap.json; npm esclude package-lock.json dai pacchetti pubblicati.
Claude Code vincola questa installazione di dipendenze in modo che nessun codice dal plugin o dai suoi pacchetti venga eseguito durante essa, e limita quanto tempo può durare:
- Risoluzione congelata: Bun e npm installano esattamente ciò che il lockfile fissa, e falliscono piuttosto che ri-risolvere le versioni quando
package.jsone il lockfile non concordano. - Nessuno script del ciclo di vita:
--ignore-scriptsimpedisce l’esecuzione degli scriptpreinstall,installepostinstall, in modo che le dipendenze che compilano moduli nativi in questi script scarichino ma non compilino durante questa installazione. - Timeout di 60 secondi: Claude Code interrompe un’installazione che dura più a lungo e la tratta come non riuscita.
npm install con script del ciclo di vita abilitati, prima che questa installazione di dipendenze venga eseguita.
Un’installazione non riuscita o saltata non blocca mai il plugin. Quando l’installazione fallisce, o Claude Code salta un lockfile yarn o pnpm, registra il motivo come avviso nell’output di debug. Un plugin con un package.json e nessun lockfile viene saltato senza una voce di log. Un’installazione scaduta può lasciare un albero node_modules parziale nella copia memorizzata nella cache.
Non potete disattivare l’installazione automatica; nessuna impostazione o variabile di ambiente la disabilita. In reti ristrette, vedere i requisiti di accesso alla rete per gli host da consentire.
Per le dipendenze che l’installazione automatica non può fornire, come pacchetti che necessitano dei loro script del ciclo di vita per compilare, dipendenze Python, o un plugin bloccato con Yarn o pnpm, installatele da un hook nella directory dei dati persistenti.
Limitazioni dell’attraversamento dei percorsi
Claude Code non consente a un plugin di fare riferimento a file al di fuori della sua stessa directory. Rifiuta un percorso di componente che si risolve al di fuori della root del plugin, indipendentemente dal fatto che il percorso sia dichiarato inplugin.json o in una voce del marketplace. Ciò copre un percorso che punta al di fuori del plugin come scritto, come ../shared-utils, e un symlink che porta al di fuori del plugin, ad eccezione dei link all’interno di un marketplace.
Su macOS e Linux, Claude Code rifiuta anche un percorso di componente che contiene una barra rovesciata in qualsiasi punto, anche quando il percorso rimane all’interno del plugin. I componenti dichiarati con percorsi con barra rovesciata quindi si caricano solo su Windows. Scrivete i percorsi dei componenti con barre oblique, come ./commands/deploy.md.
Quando Claude Code rifiuta un percorso, segnala un errore path escapes plugin directory e carica il plugin senza quel componente.
Claude Code inoltre non copia i file al di fuori della directory del plugin nella cache quando installa il plugin, quindi quando uno script all’interno di un plugin copiato legge un percorso sopra la root del plugin, non trova nemmeno quei file.
Condividere file all’interno di un marketplace con symlink
Se il vostro plugin ha bisogno di condividere file con altre parti dello stesso marketplace, potete creare link simbolici all’interno della directory del vostro plugin. Il modo in cui un symlink viene gestito quando il plugin viene copiato nella cache dipende da dove si risolve il suo target:- All’interno della directory del plugin: il symlink viene preservato come symlink relativo nella cache, in modo che continui a risolvere il target copiato in fase di esecuzione.
- Altrove all’interno dello stesso marketplace: il symlink viene dereferenziato. Il contenuto del target viene copiato nella cache al suo posto. Ciò consente alla directory
skills/di un meta-plugin di collegarsi alle skill definite da altri plugin nel marketplace. - Al di fuori del marketplace: il symlink viene saltato per motivi di sicurezza. Ciò impedisce ai plugin di estrarre file host arbitrari come percorsi di sistema nella cache.
--plugin-dir, da un percorso locale, o da una command source in copy mode, solo i symlink che si risolvono all’interno della directory del plugin stesso vengono preservati. Tutti gli altri vengono saltati.
Il seguente comando crea un link dall’interno di un plugin del marketplace a una skill condivisa definita da un plugin sibling. Su Windows, utilizzate mklink /D da un Command Prompt elevato o abilitate Developer Mode:
Struttura della directory dei plugin
Layout standard dei plugin
Un plugin completo segue questa struttura:CLAUDE.md nella radice del plugin non viene caricato come contesto del progetto. I plugin contribuiscono al contesto attraverso skills, agents e hooks piuttosto che tramite CLAUDE.md. Per fornire istruzioni che si carichino nel contesto di Claude, inseritele in una skill.
Riferimento delle posizioni dei file
Riferimento dei comandi CLI
Claude Code fornisce comandi CLI per la gestione non interattiva dei plugin, utile per scripting e automazione.plugin init
Crea lo scaffolding di un nuovo plugin in~/.claude/skills/<name>/. Nella prossima sessione di Claude Code si carica automaticamente come <name>@skills-dir e appare in /plugin e claude plugin list senza alcun passaggio di installazione.
Vedi Skills-directory plugins per i requisiti di ambito e fiducia.
<name>: Nome del plugin. Diventa lo spazio dei nomi della skill e il nome della directory sotto~/.claude/skills/, quindi non può contenere spazi o separatori di percorso.
claude plugin new è un alias per questo comando.
Ogni valore --with aggiunge un file di avvio per quel componente, pronto per essere modificato:
Il plugin creato con lo scaffolding utilizza la fonte
@skills-dir piuttosto che un marketplace. Gli amministratori possono bloccare questa fonte con strictKnownMarketplaces o aggiungendo {"source": "skills-dir"} a blockedMarketplaces nelle impostazioni gestite. Quando bloccato, plugin init fallisce prima di scrivere.
Questi esempi mostrano invocazioni comuni:
plugin install
Installa un plugin dai marketplace disponibili.<plugin>: Nome del plugin oplugin-name@marketplace-nameper un marketplace specifico
L’ambito determina quale file di impostazioni il plugin installato viene aggiunto. Ad esempio,
--scope project scrive in enabledPlugins in .claude/settings.json, rendendo il plugin disponibile a chiunque cloni il repository del progetto.
Con --json, l’ultima riga di stdout è un oggetto JSON. Analizza solo quella riga, perché Claude Code stampa qualsiasi comando che il marketplace dichiara prima di essa. Tre campi sono sempre presenti:
command: il sottocomando che è stato eseguito, comeinstalloutcome:okofailedmessage: una descrizione leggibile del risultato
pluginId, scope e failureCode, appaiono solo quando applicabili. L’opzione --json su plugin uninstall, plugin update, plugin enable e plugin disable stampa lo stesso oggetto con i campi propri di quel sottocomando. Un errore di utilizzo, come uno --scope non valido, non stampa alcuna riga di risultato ed esce con 1 con il motivo su stderr.
Questi esempi mostrano invocazioni comuni:
plugin uninstall
Rimuovi un plugin installato.<plugin>: Nome del plugin oplugin-name@marketplace-name
claude plugin remove e claude plugin rm sono alias per questo comando.
Per impostazione predefinita, la disinstallazione dall’ultimo ambito rimanente elimina anche la directory ${CLAUDE_PLUGIN_DATA} del plugin. Usa --keep-data per preservarla, ad esempio quando reinstalli dopo aver testato una nuova versione.
Quando i plugin installati da diversi marketplace condividono un nome, il modulo
plugin-name@marketplace-name disinstalla solo il plugin dal marketplace denominato. Prima della v2.1.212, il modulo qualificato potrebbe corrispondere e disinstallare lo stesso plugin denominato da un marketplace diverso.plugin prune
Rimuovi le dipendenze dei plugin auto-installate che non sono più richieste da alcun plugin installato. Le dipendenze che Claude Code ha inserito per soddisfare il campodependencies di un altro plugin vengono rimosse; i plugin che hai installato direttamente non vengono mai toccati.
claude plugin autoremove è un alias per questo comando.
Il comando elenca le dipendenze orfane e chiede conferma prima di rimuoverle. Per rimuovere un plugin e pulire le sue dipendenze in un unico passaggio, esegui claude plugin uninstall <plugin> --prune.
plugin enable
Abilita un plugin disabilitato. Quando il target è installato da un marketplace e dichiara dependencies, Claude Code li abilita transitivamente nello stesso ambito. Il comando fallisce nelle condizioni che Enable or disable a plugin with dependencies elenca.<plugin>: Nome del plugin oplugin-name@marketplace-name
plugin disable
Disabilita un plugin senza disinstallarlo. Quando il target è installato da un marketplace, il comando fallisce se un altro plugin abilitato dipende da esso. Il messaggio di errore include un comando concatenato che disabilita prima ogni dipendente.[plugin]: Nome del plugin oplugin-name@marketplace-name. Facoltativo quando si usa--all
plugin update
Aggiorna un plugin all’ultima versione.<plugin>: Nome del plugin oplugin-name@marketplace-name
Claude Code risolve un nome di plugin semplice rispetto ai plugin installati. Quando i plugin installati da diversi marketplace condividono il nome, Claude Code rifiuta l’aggiornamento ed elenca i comandi
plugin-name@marketplace-name qualificati da eseguire invece. Prima della v2.1.246, Claude Code accettava solo il modulo qualificato e rifiutava un nome semplice come non trovato.plugin list
Elenca i plugin installati con la loro versione, il marketplace di origine e lo stato di abilitazione.
All’interno di una sessione interattiva,
/plugin list stampa un elenco simile inline, ma copre solo i plugin installati dal marketplace:
- I plugin caricati dalle directory delle skill appaiono nell’interfaccia
/plugine inclaude plugin list, ma non nell’output inline/plugin list. - Su Claude Code v2.1.239 o successivo, i plugin sincronizzati da claude.ai appaiono in
claude plugin listquando lo esegui nell’ambiente in cui una sessione sincronizzata li ha scaricati. Non appaiono nell’output inline/plugin list. - I plugin caricati per la sessione con
--plugin-diro--plugin-urlappaiono nell’interfaccia/plugine inclaude plugin listsolo quando lo stesso flag precede il sottocomando, come inclaude --plugin-dir <dir> plugin list. Solo il nome del flag identifica la loro posizione, quindi un sempliceclaude plugin listnon può trovarli, a differenza dei plugin sincronizzati e dei plugin della directory delle skill, le cui directory fisse Claude Code scansiona.
--enabled o --disabled per mostrare solo i plugin in quello stato, e ls come abbreviazione per list.
plugin details
Mostra l’inventario dei componenti di un plugin e il costo del token previsto. L’output elenca tutti i componenti che il plugin contribuisce, raggruppati come Skills, Agents, Hooks, server MCP e server LSP, insieme a una stima di quanti token aggiunge a ogni sessione. Il gruppo Skills include sia le vociskills/ che commands/.
<name>: Nome del plugin oplugin-name@marketplace-name
L’output mostra due cifre di costo per ogni componente:
- Always-on: token aggiunti a ogni sessione dal testo dell’elenco del plugin, come descrizioni delle skill, descrizioni degli agent e nomi dei comandi, indipendentemente dal fatto che un componente si attivi.
- On-invoke: token che un componente costa quando si attiva. Mostrato per componente, non come totale del plugin, perché una sessione tipica invoca solo un sottoinsieme di componenti.
count_tokens per il tuo modello attivo. I numeri per componente sono proporzionalmente scalati da quel totale. Se l’API non è raggiungibile, il comando ricade su una stima basata su caratteri.
plugin validate
Controlla un plugin o un marketplace per errori di sintassi e schema prima della pubblicazione. Il comando esce con 0 quando la convalida passa, 1 quando fallisce e 2 quando l’esecuzione della convalida stessa fallisce, ad esempio quando il percorso che passi non è leggibile.<path>: Percorso a una directory di plugin o una directory di marketplace. Vedi Validate a plugin or a directory without a manifest per quali file una esecuzione di plugin copre.
Con
--json, Claude Code scrive il rapporto su stdout come un oggetto JSON con questi campi di livello superiore:
success: lo stesso verdetto che il codice di uscita forniscestrict: se l’esecuzione ha trattato gli avvisi come erroritarget: il percorso risolto che Claude Code ha convalidatomanifest: il risultato del manifest stesso, onullper un’esecuzione senza manifestcontents: risultati per file, ognuno nominando il suofilee portando arrayerrors,warningsenotes
/plugin validate <path> esegue gli stessi controlli inline.
plugin eval
Esegui i eval cases di un plugin e segnala i risultati valutati. Richiede Claude Code v2.1.269 o successivo. Ogni caso è un prompt più grader; Claude Code lo esegue più volte in una sessione isolata con solo il plugin target caricato, e per impostazione predefinita anche senza il plugin in modo che il rapporto mostri la differenza. Vedi Test plugins with evals per il formato del caso, i grader, i risultati e l’utilizzo in CI.target facoltativo è una directory di plugin, un singolo file prompt.md o case.yaml, un plugin installato come name o name@marketplace, o name@skills-dir, e predefinito è la directory corrente. Mettilo prima di --tag, --allow-tools e --json.
Questa tabella elenca le opzioni che la maggior parte delle esecuzioni utilizza. Esegui claude plugin eval --help per l’insieme completo, inclusi --case, --tag, --output-dir, --report, --allow-real-servers, --keep-temp e --verbose.
Il comando esce con 0 quando ogni caso soddisfa la soglia, 1 su un caso fallito, un errore di caricamento o una directory di plugin non attendibile, 2 su un’esecuzione parziale, 130 quando interrotto e 143 quando terminato. Vedi Run evals in CI.
plugin eval init
Crea una suite di eval per il plugin nella directory corrente. Richiede Claude Code v2.1.269 o successivo. In un terminale questo avvia un’intervista di authoring che legge il plugin, propone casi e grader, li pilota e scrive i file. Con--bare, o senza un terminale, scrive invece un modello di singolo caso vuoto. Esegui da dentro una sessione interattiva di Claude Code, stampa le istruzioni dell’intervista per quella sessione da seguire piuttosto che scrivere un modello. Vedi Create your first eval suite.
name facoltativo è un nome di caso: l’intervista non ne ha bisogno, mentre --bare e il percorso del modello senza terminale lo richiedono. Accetta queste opzioni:
plugin tag
Crea un tag git di rilascio per un plugin. Per impostazione predefinita il comando etichetta il plugin nella directory corrente; passa un percorso per etichettare un plugin altrove. Vedi Tag plugin releases.[path]: Percorso alla directory del plugin. Predefinito è la directory corrente.
Strumenti di debug e sviluppo
Comandi di debug
Utilizzareclaude --debug per visualizzare i dettagli del caricamento dei plugin:
Questo mostra:
- Quali plugin vengono caricati
- Eventuali errori nei manifest dei plugin
- Registrazione di skill, agent e hook
- Inizializzazione del server MCP
Problemi comuni
Messaggi di errore di esempio
Errori di convalida del manifest:Invalid JSON syntax: Unexpected token } in JSON at position 142: controllare la presenza di virgole mancanti, virgole extra o stringhe non quotatePlugin <name> has an invalid manifest file at .claude-plugin/plugin.json. Validation errors: name: Invalid input: expected string, received undefined: un campo obbligatorio è mancantePlugin <name> has a corrupt manifest file at .claude-plugin/plugin.json. JSON parse error: ...: errore di sintassi JSON. Prima della versione 2.1.246, Claude Code produceva anche questo errore per unplugin.jsonsalvato come UTF-8 con un byte order mark (BOM) iniziale, anche quando il JSON era altrimenti valido.
Warning: No commands found in plugin my-plugin custom directory: ./cmds. Expected .md files or SKILL.md in subdirectories.: il percorso del comando esiste ma non contiene file di comando validiPlugin directory not found at path: ./plugins/my-plugin. Check that the marketplace entry has the correct path.: il percorsosourcein marketplace.json punta a una directory inesistentePlugin my-plugin has conflicting manifests: both plugin.json and marketplace entry specify components.: rimuovere le definizioni di componenti duplicate o rimuoverestrict: falsenella voce del marketplace
Risoluzione dei problemi degli hook
Script hook non in esecuzione:- Verificare che lo script sia eseguibile:
chmod +x ./scripts/your-script.sh - Verificare la riga shebang: La prima riga deve essere
#!/bin/basho#!/usr/bin/env bash - Verificare che il percorso utilizzi
${CLAUDE_PLUGIN_ROOT}:"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/your-script.sh" - Testare lo script manualmente:
./scripts/your-script.sh
- Verificare che il nome dell’evento sia corretto (sensibile alle maiuscole):
PostToolUse, nonpostToolUse - Verificare che il pattern del matcher corrisponda ai vostri strumenti:
"matcher": "Write|Edit"per le operazioni su file - Confermare che il tipo di hook sia valido:
command,http,mcp_tool,promptoagent
Risoluzione dei problemi del server MCP
Server non avviato:- Verificare che il comando esista e sia eseguibile
- Verificare che tutti i percorsi utilizzino la variabile
${CLAUDE_PLUGIN_ROOT} - Controllare i log del server MCP:
claude --debugmostra gli errori di inizializzazione - Testare il server manualmente al di fuori di Claude Code
- Assicurarsi che il server sia configurato correttamente in
.mcp.jsonoplugin.json - Verificare che il server implementi correttamente il protocollo MCP
- Controllare i timeout di connessione nell’output di debug
Errori di struttura della directory
Sintomi: Il plugin viene caricato ma i componenti (skill, agent, hook) sono mancanti. Struttura corretta: I componenti devono essere nella radice del plugin, non dentro.claude-plugin/. Solo plugin.json appartiene a .claude-plugin/.
Elenco di controllo del debug:
- Eseguire
claude --debuge cercare i messaggi “loading plugin” - Verificare che ogni directory di componenti sia elencata nell’output di debug
- Verificare che i permessi dei file consentano la lettura dei file del plugin
Riferimento di distribuzione e versioning
Gestione delle versioni
Claude Code utilizza la versione del plugin come chiave di cache che determina se un aggiornamento è disponibile. Quando esegui/plugin update o l’aggiornamento automatico si attiva, Claude Code calcola la versione corrente e salta l’aggiornamento se corrisponde a quella già installata.
Per ogni tipo di sorgente eccetto command, Claude Code risolve la versione dal primo di questi che è impostato:
- Il campo
versionnelplugin.jsondel plugin - Il campo
versionnella voce del plugin nel marketplace inmarketplace.json - Lo SHA del commit git della sorgente del plugin, per le sorgenti
github,url,git-subdire relative-path in un marketplace ospitato su git - Il digest SHA-256, per le sorgenti
archive: il pinsha256nella voce del marketplace, o il digest del file scaricato quando non imposti alcun pin. Claude Code lo accorcia ai primi 12 caratteri unknown, per le sorgentinpmo le directory locali non all’interno di un repository git
command, Claude Code deriva sempre la versione da ciò che il comando ha prodotto: un hash di contenuto di 12 caratteri da solo, o aggiunto alla versione plugin.json come <version>-<hash> quando uno è impostato. Claude Code ignora il campo version della voce del marketplace per le sorgenti command. Un comando il cui output con hash cambia produce quindi una nuova versione, anche quando la stringa di versione creata rimane la stessa. In link mode, l’hash copre il percorso reale della directory stampata e le sue voci di primo livello piuttosto che i contenuti dei file.
Per questi tipi di sorgente, questo ti dà tre modi per versioning di un plugin:
Se utilizzi versioni esplicite, segui il semantic versioning (
MAJOR.MINOR.PATCH): aumenta MAJOR per i cambiamenti che rompono la compatibilità, MINOR per le nuove funzionalità, PATCH per le correzioni di bug. Documenta i cambiamenti in un CHANGELOG.md.
Vedi anche
- Plugin - Tutorial e utilizzo pratico
- Marketplace dei plugin - Creazione e gestione dei marketplace
- Skills - Dettagli dello sviluppo delle skill
- Subagents - Configurazione e capacità dell’agent
- Hooks - Gestione degli eventi e automazione
- MCP - Integrazione di strumenti esterni
- Impostazioni - Opzioni di configurazione per i plugin