I plugin sono in beta chiusa. Per richiedere l’accesso, contatta support@cognition.ai. Il comportamento e la configurazione potrebbero cambiare nelle release future.
/<plugin>:<skill>.
Il plugin è l’unità di installazione. L’installazione di un plugin installa tutte le
sue skill e i relativi requiredPlugins; non puoi installare singole skill da un
plugin. Per offrire le skill separatamente, suddividile in plugin distinti.
Un plugin è semplicemente una sorgente che contiene:
skills/ contiene skill standard: i plugin non introducono alcun nuovo formato di skill.
Vedi Creazione di skill per il
formato SKILL.md.
Una repo (o una sottocartella git-subdir) corrisponde a un plugin. Una singola repo può ospitare
molti plugin come sottocartelle, ciascuno referenziato con la propria sorgente git-subdir.
Oltre alle skill, un plugin può includere:
- Regole — un file
AGENTS.mdnella directory radice del plugin viene iniettato come regola sempre attiva in ogni sessione, insieme alle regole del tuo progetto. Anche i file Markdown in una cartellarules/vengono caricati, con lo stesso frontmattertriggere gli stessi tipi di attivazione delle regole di Windsurf. - Subagenti personalizzati — profili
agents/<name>.mdoagents/<name>/AGENT.md(lo stesso formato dei subagenti personalizzati dei subagent di progetto), disponibili come<plugin>:<name>. I subagent dei plugin attualmente vengono caricati solo negli agenti Devin locali — la CLI e Devin Desktop — non nelle sessioni cloud Devin. - Hook — un file
hooks.jsonnella directory radice del plugin registra Hook del ciclo di vita eseguiti in ogni sessione in cui il plugin è installato. Nelle sessioni cloud, gli hookcommandvengono eseguiti sulla macchina della sessione e si attivano solo quando tale macchina è in funzione. Supportano ogni evento tranneSessionStarteSessionEnd— inclusiPreToolUse,PostToolUse,PermissionRequest,UserPromptSubmit,StopePostCompaction; gli hook di tipopromptsono disponibili solo nella CLI/in locale. - Server MCP — un file
mcp_config.jsonnella directory radice del plugin dichiara server MCP ("mcpServers": { "<name>": { … } }) che si avviano con la sessione. I server MCP dei plugin non vengono ancora visualizzati nell’interfaccia Settings MCP, ma i relativi strumenti sono disponibili per Devin. Una configurazione MCP di un plugin può impostare un ID client OAuth e ambiti, ma mai un client secret: una configurazione del server che ne contiene uno viene rifiutata all’attivazione. Anche il file.mcp.jsonnella radice dei plugin Claude e il campomcpServersdel manifest vengono presi in considerazione.
Formati compatibili
.devin-plugin/plugin.json > .claude-plugin/plugin.json > plugin.json
nella radice:
-
Plugin Claude — se
.devin-plugin/plugin.jsonnon è presente, Devin usa.claude-plugin/plugin.json. Vengono rispettati il file.mcp.jsonnella radice dei plugin Claude e il campomcpServersdel manifest;${CLAUDE_PLUGIN_ROOT}nelle configurazioni dei server viene espanso nella radice del plugin. -
Plugin Agent — vengono caricati anche i plugin pacchettizzati secondo la
spec Agent Plugins 1.0.0
(un manifest
plugin.jsonnella radice del plugin, server MCP in un filemcp.jsonnella radice, skills inskills/). Per questi plugin, il filemcp.jsonnella radice viene letto come sorgente MCP convenzionale (dopo.mcp.json, che ha la precedenza in caso di conflitto tra nomi di server) — i plugin legacy con layout Devin/Claude non lo leggono mai, a meno che il relativo manifest non lo dichiari esplicitamente. Le voci MCP possono dichiarare il transport tramite il campotypedella spec (stdio,streamable-httposse) anzichétransport;${PLUGIN_ROOT}nelle configurazioni dei server viene espanso nella radice del plugin, come${CLAUDE_PLUGIN_ROOT}. Viene emesso un avviso per una versione$schemanon riconosciuta, ma il plugin viene comunque caricato al meglio. I server MCP dei Plugin Agent adottano anche le convenzioni di runtime della spec (si applicano solo ai plugin il cui manifest è il fileplugin.jsonnella radice; i layout Devin e Claude si comportano esattamente come prima):${PLUGIN_DATA}inargs, nei valori dienve incwdviene espanso in una directory dati persistente e scrivibile per ciascun plugin. La directory è associata all’ identità del plugin, non alla versione, quindi il suo contenuto viene mantenuto dopo gli aggiornamenti del plugin e viene eliminata quando il plugin viene disinstallato.- I processi dei server
stdioricevono le variabili d’ambientePLUGIN_ROOTePLUGIN_DATAoltre a qualsiasi valore dienvimpostato dalla configurazione. - Un server può impostare
cwd(relativo alla radice del plugin); per impostazione predefinita corrisponde alla radice del plugin. Uncommandcon prefisso./viene risolto rispetto alla radice del plugin, in modo che i plugin possano includere i propri eseguibili. Entrambi vengono convalidati per garantire che rimangano all’interno della radice del plugin o della directory dati.
Installare un plugin
owner/repo GitHub, un URL git o un percorso locale:
-y / --yes per saltare la
richiesta di conferma.
I plugin vengono installati a livello di utente e sono disponibili in tutti i tuoi
progetti.
Gestire i plugin
devin plugins install ./my-plugin → modifica skills/<name>/SKILL.md → le modifiche
si applicano alla sessione successiva, senza dover eseguire update.
Il manifest
.devin-plugin/plugin.json descrive il plugin. Solo name è obbligatorio e
deve essere univoco tra i plugin installati (corrisponde allo spazio dei nomi /<name>:…).
I nomi sono composti da caratteri alfanumerici minuscoli con singoli separatori - o .
(ad es. review-tools, acme.tools).
name, version, description, author
({ name, email }), homepage, repository, license e keywords.
Altri due campi facoltativi controllano da dove vengono caricati gli asset: skills — un percorso o
un array di percorsi a directory di skill, che sostituisce il valore predefinito skills/ — e
mcpServers — percorsi di file di dichiarazione MCP o una mappa inline di server, letti in
aggiunta alle conventions radice.
Una voce di dipendenza è una sorgente — una stringa in forma abbreviata oppure un oggetto:
Tutte le forme GitHub per la stessa repo (
owner/repo, l’URL HTTPS, l’URL .git, il formato SSH) si riferiscono alla stessa identità del plugin.
Dipendenze e governance
requiredPlugins
optionalPlugins
forbiddenPlugins
forbiddenPlugins vengono confrontate con le identità dei plugin:
- Un’identità esatta, scritta come
owner/repoo come URL Git. Tutte le forme GitHub della stessa repo (owner/repo, l’URL HTTPS, l’URL.git, la forma SSH) si riferiscono alla stessa identità. - Un pattern glob — qualsiasi voce che contenga
*.*corrisponde a qualsiasi sequenza di caratteri, incluso/:acme/*corrisponde a tutte le repo GitHub diacme,*/secretscorrisponde a una repo chiamatasecretscon qualsiasi owner ehttps://gitlab.com/acme/*corrisponde a qualsiasi repo in quel percorso. - Il solo
"*", che corrisponde a tutto il resto (un blocco totale).
- Prevale
deny. Un plugin è bloccato se un qualsiasi manifest attivo o plugin installato lo vieta. Se nulla vieta nulla, non viene bloccato nulla. - Auto-override. I
requiredPluginseoptionalPluginsdi un manifest (o di un plugin) — e, nel caso di un plugin, il plugin stesso — sono esenti dalla propria lista di elementi vietati, quindi"forbiddenPlugins": ["*"]più"optionalPlugins": ["acme/approved"]significa “consenti solo ciò che questo manifest elenca; vieta tutto il resto”. L’eccezione copre solo quelle voci dirette, non le dipendenze transitive di un plugin richiesto: in caso di blocco totale, elencale esplicitamente. - Nessuna nuova autorizzazione tra ambiti diversi. La allow-list di un manifest o plugin non può riabilitare ciò che un altro vieta. Un blocco totale con
"forbiddenPlugins": ["*"]non può essere aggirato da un ambito inferiore.
- Al momento dell’installazione — l’installazione di un plugin bloccato (o di uno i cui plugin richiesti non possono essere soddisfatti, o il cui nome entra in conflitto con un plugin installato) viene rifiutata.
- Al momento del caricamento — un plugin bloccato dopo essere già stato installato resta sul disco, ma le sue skills vengono saltate all’avvio della sessione con un avviso che indica chi lo vieta.
owner/repo e URL git sopra indicate.
Ereditarietà e livelli
- Enterprise — il manifest gestito a livello di account, configurato da un admin.
- Org — un manifest gestito a livello di org, posto al di sotto del relativo account (un’org può aggiungere a quanto dichiarato dal proprio account, ma non può contraddirlo). Questo vale solo per le sessioni cloud Devin: la CLI si autentica a livello di account e non ha alcun contesto di org, quindi i plugin richiesti e vietati a livello di org non si applicano agli utenti della CLI. Inserisci nel manifest enterprise/account tutto ciò che deve essere imposto nella CLI.
- Repo — i
requiredPlugins/optionalPlugins/forbiddenPluginsnel file.devin/config.jsondi un checkout, individuati risalendo dalla tua directory di lavoro. - Utente — i plugin che installi tu stesso con
devin plugins install.
- Un livello inferiore non può mai riautorizzare ciò che un livello superiore vieta.
- Un livello inferiore non può mai vietare ciò che un livello superiore richiede: il divieto viene ignorato e il plugin viene comunque caricato.
Una denylist viene sovrascritta solo al proprio livello
forbiddenPlugins
di un livello viene sovrascritto solo dagli optionalPlugins (o
requiredPlugins) dello stesso manifest, mai da una lista di un livello inferiore.
Per esempio, un manifest gestito a livello Enterprise può limitare l’account a un
singolo plugin approvato:
acme/approved e vieta
qualsiasi altro plugin.” Nessuna org, repo o utente può ampliare questa lista di elementi consentiti — né
installando un plugin, né aggiungendolo a optionalPlugins a un livello inferiore.
L’eccezione copre inoltre solo le voci che questo manifest elenca direttamente; le
dipendenze transitive di un plugin obbligatorio non sono esenti, quindi elencale
esplicitamente in caso di lockdown.
Conflitti e dipendenze
- Un requisito e un divieto per lo stesso plugin allo stesso livello, ma da manifest diversi (per esempio due plugin a livello di utente installati separatamente), si risolvono a favore del divieto: un’allow-list esenta solo le voci del proprio manifest, quindi non può “salvare” un plugin che un altro manifest vieta. (All’interno di un singolo manifest, i propri elementi obbligatori/opzionali restano esenti dai propri divieti, come sopra.)
- Un plugin bloccato dalla governance va in soft-fail: all’inizio della sessione le sue skill vengono saltate con un avviso che indica chi ha imposto il divieto, invece di interrompere la sessione.
- Il fatto di essere una dipendenza non conferisce alcuna esenzione. Un plugin incluso solo come dipendenza transitiva è comunque soggetto a ogni divieto applicabile e eredita il livello di autorità più alto di qualsiasi plugin che lo richieda.

