Skip to main content
I plugin sono in beta. Il comportamento e la configurazione potrebbero cambiare nelle release future.
Un plugin è un pacchetto di skills che puoi installare da una repo GitHub, un URL git o una cartella locale e riutilizzare in più progetti. Quando installi un plugin, le sue skills diventano disponibili come slash command /<plugin>:<skill> e possono includere automaticamente anche altri plugin da cui dipendono. Un plugin è semplicemente una sorgente che contiene:
my-plugin/
├── .devin-plugin/
│   └── plugin.json     # Il manifest del plugin
└── skills/
    └── review/
        └── SKILL.md    # Uno skill ordinario
La directory skills/ contiene skill standard: i plugin non introducono alcun nuovo formato di skill. Vedi Creazione di skill per il formato SKILL.md.

Installare un plugin

La sorgente di un plugin può essere un owner/repo GitHub, un URL git o un percorso locale:
# Da GitHub
devin plugins install acme/review-tools

# Da qualsiasi host git
devin plugins install https://gitlab.com/acme/review-tools.git

# Da una cartella locale (ideale per la creazione di plugin)
devin plugins install ./my-plugin
Prima dell’installazione, Devin mostra cosa aggiunge il plugin — le skills che mette a disposizione, gli eventuali plugin richiesti che verranno installati automaticamente e qualsiasi policy che introduce (ad esempio, se vieta altri plugin). Usa -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

# Elenca i plugin installati, le loro versioni e se qualcuno è bloccato dalla policy
devin plugins list

# Mostra le skill di un plugin e i relativi elenchi required/optional/forbidden
devin plugins info review-tools

# Esegue nuovamente il fetch di un plugin (o di tutti i plugin) all'ultima versione
devin plugins update review-tools
devin plugins update

# Rimuove un plugin (i plugin required installati automaticamente vengono mantenuti)
devin plugins remove review-tools
I plugin locali sono collegati direttamente alla cartella sorgente, quindi le modifiche sono immediate: 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>:…).
{
  "name": "review-tools",
  "version": "1.0.0",
  "description": "Code-review skills for our team",
  "requiredPlugins": [
    "acme/secure-base",
    { "source": "github", "repo": "acme/audit-logging" }
  ],
  "optionalPlugins": [
    "acme/deploy-tools",
    { "source": "url", "url": "https://gitlab.com/acme/extra.git" }
  ],
  "forbiddenPlugins": ["sketchy-org/bad-plugin", "acme/*", "*"]
}
Campi di metadati supportati: name, version, description, author ({ name, email }), homepage, repository, license e keywords. Una voce di dipendenza è una sorgente — una stringa in forma abbreviata oppure un oggetto:
  • "owner/repo" → GitHub
  • "https://…", "git@…", "ssh://…" → URL git
  • { "source": "github", "repo": "owner/repo" }
  • { "source": "url", "url": "https://gitlab.com/team/plugin.git" }
Tutte le forme GitHub della stessa repo (owner/repo, l’URL HTTPS, l’URL .git, la forma SSH) si riferiscono alla stessa identità del plugin.

Dipendenze e governance

Un plugin può dichiarare tre elenchi, consentendo a un singolo plugin di fungere da raccolta curata e sottoposta a governance di altri plugin.

requiredPlugins

Installati automaticamente (in modo ricorsivo) quando viene installato il plugin. Se un plugin richiesto è bloccato da una policy, l’intera installazione fallisce — non è prevista un’installazione parziale.

optionalPlugins

Un’allow-list di plugin che questo plugin autorizza. Non vengono installati automaticamente; l’elenco serve solo come eccezione a una voce vietata (vedi sotto).

forbiddenPlugins

Una deny-list. Ogni voce è una delle seguenti:
  • Un’identità esatta del plugin, scritta come owner/repo, un URL git o un percorso locale.
  • Un pattern glob — qualsiasi voce che contenga *. * corrisponde a qualsiasi sequenza di caratteri, incluso /. I pattern vengono prima normalizzati nello spazio delle identità canoniche, quindi acme/* diventa https://github.com/acme/* (tutte le repo GitHub di acme), */secrets corrisponde a una repo chiamata secrets di qualsiasi owner e https://gitlab.com/acme/* corrisponde a qualsiasi repo in quel percorso.
  • Il solo "*", che corrisponde a tutti gli altri plugin (un blocco totale impossibile da aggirare).
Le regole della policy sono:
  • Deny ha la precedenza. Un plugin viene bloccato se un qualsiasi plugin installato lo vieta (tramite la sua identità esatta, un glob corrispondente o "*").
  • Override del plugin stesso. I requiredPlugins, gli optionalPlugins di un plugin e il plugin stesso sono esclusi dalla propria lista di plugin vietati. Quindi forbiddenPlugins: ["*"] insieme a optionalPlugins: [B, C] significa “consenti me stesso, B e C; vieta tutto il resto.”
  • Nessuna nuova autorizzazione tra plugin diversi. Le allow-list di un plugin non possono autorizzare di nuovo ciò che un altro plugin vieta. Un plugin installato con forbiddenPlugins: ["*"] è un blocco totale impossibile da aggirare.
  • Aperto per impostazione predefinita. Se nessun plugin installato vieta nulla, nulla viene bloccato.
La policy viene applicata in due momenti:
  • In fase di installazione — l’installazione di un plugin bloccato (o di uno i cui plugin richiesti non possono essere soddisfatti, o il cui nome è in conflitto con quello di un plugin installato) viene rifiutata.
  • In fase di caricamento — se un plugin viene bloccato dopo l’installazione (per esempio, perché un plugin che lo vieta viene installato successivamente), rimane sul disco ma le sue skill vengono ignorate all’avvio della sessione, con un avviso che indica il plugin che lo vieta.