Les plugins sont en bêta fermée. Pour demander l’accès, contactez support@cognition.ai. 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.
Au-delà des skills, un plugin peut également inclure :
- Règles — un fichier
AGENTS.mdà la racine du plugin est injecté en tant que règle toujours active dans chaque session, aux côtés des règles de votre projet. Les fichiers Markdown du dossierrules/sont également chargés, avec le même frontmattertriggeret les mêmes types d’activation que les règles Windsurf. - Sous-agents personnalisés — des profils
agents/<name>.mdouagents/<name>/AGENT.md(le même format de sous-agent personnalisé que les sous-agents de projet), disponibles sous la forme<plugin>:<name>. Les sous-agents de plugin se chargent actuellement uniquement dans les agents Devin locaux — le CLI et Devin Desktop — et non dans les cloud Devin sessions. - Hooks — un fichier
hooks.jsonà la racine du plugin enregistre des hooks de cycle de vie qui s’exécutent dans chaque session où le plugin est installé. - Serveurs MCP — un fichier
mcp_config.jsonà la racine du plugin déclare des serveurs MCP ("mcpServers": { "<name>": { … } }) qui démarrent avec la session. Le fichier racine.mcp.jsondes plugins Claude et le champmcpServersdu manifeste sont également pris en charge.
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.
Deux autres champs facultatifs déterminent d’où les ressources sont chargées : skills — un chemin ou
un tableau de chemins vers des répertoires de skills, qui remplace skills/ par défaut — et
mcpServers — des chemins de fichiers de déclaration MCP ou une table de serveurs inline, lus en
plus des conventions à la racine.
Une entrée de dépendance est une source — soit une forme abrégée sous forme de chaîne, soit un objet :
Toutes les formes GitHub pour un même repo (
owner/repo, l’URL HTTPS, l’URL .git, la forme SSH) correspondent à la même identité de plugin.
Dépendances et gouvernance
requiredPlugins
optionalPlugins
forbiddenPlugins
forbiddenPlugins sont mises en correspondance avec les identités de plugin :
- Une identité exacte, écrite sous la forme
owner/repoou d’une URL Git. Toutes les formes GitHub d’un même repo (owner/repo, l’URL HTTPS, l’URL.git, la forme SSH) renvoient à la même identité. - Un motif glob — toute entrée contenant
*. Le*correspond à n’importe quelle séquence de caractères, y compris/:acme/*correspond à tous les repos GitHub deacme,*/secretscorrespond à un repo nommésecretschez n’importe quel propriétaire, ethttps://gitlab.com/acme/*correspond à n’importe quel repo sous ce chemin. - Le simple
"*", qui correspond à tout le reste (verrouillage complet).
- L’interdiction l’emporte. Un plugin est bloqué si un manifest actif ou un plugin installé l’interdit. Si rien n’interdit quoi que ce soit, rien n’est bloqué.
- Dérogation pour soi-même. Les
requiredPluginsetoptionalPluginsd’un manifest (ou d’un plugin) — et, pour un plugin, le plugin lui-même — sont exemptés de leur propre liste d’interdictions. Ainsi,"forbiddenPlugins": ["*"]plus"optionalPlugins": ["acme/approved"]signifie « n’autoriser que ce que ce manifest liste ; interdire tout le reste. » Cette exception ne couvre que ces entrées directes, pas les dépendances transitives d’un plugin requis — listez-les explicitement dans le cadre d’un verrouillage. - Aucune réautorisation inter-périmètres. La liste des autorisations d’un manifest ou d’un plugin ne peut pas réautoriser ce qu’un autre interdit. Un verrouillage
"forbiddenPlugins": ["*"]ne peut pas être contourné depuis un périmètre inférieur.
- À 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 chargement — un plugin bloqué après avoir déjà été installé reste sur le disque, mais ses skills sont ignorées au démarrage de la session, avec un avertissement indiquant l’élément qui l’interdit.
owner/repo et URL git ci-dessus.
Héritage et niveaux
- Enterprise — le manifeste géré à l’échelle du compte, configuré par un admin.
- Org — un manifeste géré au niveau de l’org, situé sous le compte dans la hiérarchie (une org peut compléter ce que son compte déclare, mais ne peut pas y déroger). Cela s’applique uniquement aux cloud Devin sessions : la CLI s’authentifie au niveau du compte et n’a aucun contexte d’org. Les plugins requis ou interdits au niveau de l’org ne s’appliquent donc pas aux utilisateurs de la CLI. Placez dans le manifeste Enterprise/compte tout ce qui doit être appliqué dans la CLI.
- Repo — les
requiredPlugins/optionalPlugins/forbiddenPluginsdans le.devin/config.jsond’un checkout, détectés en remontant depuis votre répertoire de travail. - User — les plugins que vous installez vous-même avec
devin plugins install.
- Un niveau inférieur ne peut jamais réautoriser ce qu’un niveau supérieur interdit.
- Un niveau inférieur ne peut jamais interdire ce qu’un niveau supérieur exige — l’interdiction est ignorée et le plugin est quand même chargé.
Une liste de refus ne peut être outrepassée qu’à son propre niveau
forbiddenPlugins
d’un niveau ne peut être outrepassé que par le optionalPlugins de ce même manifeste (ou
requiredPlugins) — jamais par une liste située à un niveau inférieur.
Par exemple, un manifeste géré au niveau de l’entreprise peut restreindre le compte à un
seul plugin approuvé :
acme/approved et interdire
tout autre plugin.” Aucune organisation, aucun dépôt ni aucun utilisateur ne peut élargir
cette liste d’autorisation — ni en installant un plugin, ni en l’ajoutant aux
optionalPlugins d’un niveau inférieur. L’exception ne couvre également que les entrées
que ce manifeste liste directement ; les dépendances transitives d’un plugin requis ne
sont pas exemptées, alors indiquez-les explicitement dans une configuration verrouillée.
Conflits et dépendances
- Pour un même plugin, un
requireet unforbidau même niveau mais issus de manifestes différents (par exemple, deux plugins distincts installés au niveau utilisateur) donnent priorité àforbid— une liste d’autorisation n’exempte que les entrées de son propre manifeste, elle ne peut donc pas lever l’interdiction d’un plugin interdit par un autre manifeste. (Au sein d’un même manifeste, ses propres éléments requis/facultatifs restent exemptés de ses propres interdictions, comme ci-dessus.) - Un plugin bloqué par la gouvernance échoue de manière non bloquante : au démarrage de la session, ses skills sont ignorées avec un avertissement indiquant l’origine de l’interdiction, au lieu d’interrompre la session.
- Le fait d’être une dépendance n’accorde aucune exemption. Un plugin inclus uniquement comme dépendance transitive reste soumis à toute interdiction qui s’applique à lui, et il hérite du niveau d’autorité le plus élevé de tout plugin qui l’exige.

