Les plugins sont en bêta. Leur comportement et leur configuration peuvent changer dans de futures versions.
/<plugin>:<skill>, et il peut importer automatiquement d’autres plugins dont il dépend.
Un plugin est simplement une source qui contient :
skills/ contient des skills ordinaires — les plugins n’introduisent aucun nouveau
format de skill. Voir Créer des skills pour le format
SKILL.md.
Installation d’un plugin
owner/repo GitHub, une URL git ou un chemin local :
-y / --yes pour ignorer le
prompt.
Les plugins sont installés au niveau de l’utilisateur et sont disponibles dans tous vos
projets.
Gérer les plugins
devin plugins install ./my-plugin → modifiez skills/<name>/SKILL.md → les modifications
s’appliquent dès la session suivante, sans update.
Le manifeste
.devin-plugin/plugin.json décrit le plugin. Seul name est obligatoire, et
il doit être unique parmi les plugins installés (il s’agit de l’espace de noms /<name>:…).
name, version, description, author
({ name, email }), homepage, repository, license et keywords.
Une entrée de dépendance est une source — soit une forme abrégée sous forme de chaîne, soit un objet :
"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 forme SSH) désignent le même plugin.
Dépendances et gouvernance
requiredPlugins
optionalPlugins
forbiddenPlugins
- Une identité de plugin exacte, écrite sous la forme
owner/repo, d’une URL git ou d’un chemin local. - Un motif glob — toute entrée contenant
*. Le*correspond à n’importe quelle séquence de caractères, y compris/. Les motifs sont d’abord normalisés dans l’espace d’identité canonique :acme/*devient donchttps://github.com/acme/*(tous les repos GitHub deacme),*/secretscorrespond à un repo nommésecretssous n’importe quel propriétaire, ethttps://gitlab.com/acme/*correspond à n’importe quel repo sous ce chemin. - Le seul
"*", qui correspond à tous les autres plugins (un verrouillage impossible à contourner).
- L’interdiction l’emporte. Un plugin est bloqué si un plugin installé
l’interdit (via son identité exacte, un glob correspondant ou
"*"). - Auto-dérogation. Les
requiredPlugins,optionalPluginsd’un plugin, ainsi que le plugin lui-même, sont exemptés de sa propre liste d’interdiction. Ainsi,forbiddenPlugins: ["*"]avecoptionalPlugins: [B, C]signifie « m’autoriser, moi-même, B et C ; interdire tout le reste. » - Aucune réautorisation inter-plugin. Les listes d’autorisation d’un plugin ne peuvent pas réautoriser
ce qu’un autre plugin interdit. Un plugin installé avec
forbiddenPlugins: ["*"]constitue un verrouillage impossible à contourner. - Ouvert par défaut. Si aucun plugin installé n’interdit quoi que ce soit, rien n’est bloqué.
- Au moment de l’installation — l’installation d’un plugin bloqué (ou d’un plugin dont les plugins requis ne peuvent pas être satisfaits, ou dont le nom entre en conflit avec un plugin installé) est refusée.
- Au moment du chargement — si un plugin devient bloqué après l’installation (par exemple, si un plugin qui l’interdit est installé plus tard), il reste sur disque mais ses skills sont ignorées au démarrage de la session, avec un avertissement indiquant le nom du plugin qui l’interdit.
