I plugin sono in beta. Il comportamento e la configurazione potrebbero cambiare nelle release future.
/<plugin>:<skill> e possono includere automaticamente anche altri
plugin da cui dipendono.
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.
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>:…).
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" }
owner/repo, l’URL HTTPS, l’URL .git,
la forma SSH) si riferiscono alla stessa identità del plugin.
Dipendenze e governance
requiredPlugins
optionalPlugins
forbiddenPlugins
- 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, quindiacme/*diventahttps://github.com/acme/*(tutte le repo GitHub diacme),*/secretscorrisponde a una repo chiamatasecretsdi qualsiasi owner ehttps://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).
- 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, glioptionalPluginsdi un plugin e il plugin stesso sono esclusi dalla propria lista di plugin vietati. QuindiforbiddenPlugins: ["*"]insieme aoptionalPlugins: [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.
- 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.
