Plugins sind in der geschlossenen Beta. Um Zugang anzufordern, kontaktieren Sie support@cognition.ai. Verhalten und Konfiguration können sich in zukünftigen Releases ändern.
/<plugin>:<skill>-Slash-Befehle verfügbar, und es kann automatisch andere Plugins einbinden, von denen es abhängt.
Ein Plugin ist einfach eine Quelle, die Folgendes enthält:
skills/-Verzeichnis enthält normale Skills — Plugins bringen kein neues Skill-
Format mit. Das Format von SKILL.md wird unter Skills erstellen beschrieben.
Über Skills hinaus kann ein Plugin Folgendes mitliefern:
- Regeln — eine
AGENTS.mdim Stammverzeichnis des Plugins wird in jeder Sitzung zusammen mit den eigenen Regeln Ihres Projekts als immer aktive Regel eingefügt. Markdown-Dateien in einemrules/-Ordner werden ebenfalls geladen, mit demselbentrigger-Frontmatter und denselben Aktivierungstypen wie Windsurf-Regeln. - Benutzerdefinierte Subagenten —
agents/<name>.mdoderagents/<name>/AGENT.md-Profile (dasselbe Format für benutzerdefinierte Subagenten wie Projekt- Subagenten), verfügbar als<plugin>:<name>. Plugin-Subagenten werden derzeit nur in lokalen Devin-Agenten geladen — in der CLI und in Devin Desktop — nicht in Cloud-Devin-Sitzungen. - Hooks — eine
hooks.jsonim Stammverzeichnis des Plugins registriert Lifecycle-Hooks, die in jeder Sitzung ausgeführt werden, in der das Plugin installiert ist. - MCP-Server — eine
mcp_config.jsonim Stammverzeichnis des Plugins deklariert MCP-Server ("mcpServers": { "<name>": { … } }), die mit der Sitzung starten. Die.mcp.jsonim Stammverzeichnis von Claude-Plugins und dasmcpServers-Feld im Manifest werden ebenfalls berücksichtigt.
Ein Plugin installieren
owner/repo, eine Git-URL oder ein lokaler Pfad möglich:
-y / --yes, um die
Abfrage zu überspringen.
Plugins werden auf Nutzer-Ebene installiert und sind in all Ihren
Projekten verfügbar.
Plugins verwalten
devin plugins install ./my-plugin → skills/<name>/SKILL.md bearbeiten → Änderungen
werden in der nächsten Sitzung übernommen, kein update erforderlich.
Das Manifest
.devin-plugin/plugin.json beschreibt das Plugin. Nur name ist erforderlich; der Wert
muss unter den installierten Plugins eindeutig sein (er bildet den Namespace /<name>:…).
name, version, description, author
({ name, email }), homepage, repository, license und keywords.
Zwei weitere optionale Felder steuern, wo Assets geladen werden: skills — ein Pfad oder
ein Array von Pfaden zu Skill-Verzeichnissen, das den Standard skills/ ersetzt — und
mcpServers — Pfade zu MCP-Deklarationsdateien oder eine Inline-Serverzuordnung, die
zusätzlich zu den Konventionen im Stammverzeichnis eingelesen wird.
Ein Eintrag für eine Abhängigkeit ist eine Quelle – entweder eine Kurzschreibweise als String oder ein Objekt:
Alle GitHub-Formen für dasselbe Repo (
owner/repo, die HTTPS-URL, die .git-URL, die SSH-Form) verweisen auf dieselbe Plugin-Identität.
Abhängigkeiten und Governance
requiredPlugins
optionalPlugins
forbiddenPlugins
forbiddenPlugins-Einträge werden mit Plugin-Identitäten abgeglichen:
- Eine exakte Identität, angegeben als
owner/repooder als git-URL. Alle GitHub-Varianten desselben Repo (owner/repo, die HTTPS-URL, die.git-URL, die SSH-Form) beziehen sich auf dieselbe Identität. - Ein Glob-Muster — also jeder Eintrag, der
*enthält. Das*steht für jede Zeichenfolge, einschließlich/:acme/*entspricht allen GitHub-Repos vonacme,*/secretsentspricht einem Repo namenssecretsunter jedem Owner undhttps://gitlab.com/acme/*entspricht jedem Repo unter diesem Pfad. - Das einzelne
"*", das auf alles andere passt (ein vollständiger Lockdown).
- Deny wins. Ein Plugin wird blockiert, wenn es von einem aktiven Manifest oder einem installierten Plugin verboten wird. Wenn nichts verboten ist, wird auch nichts blockiert.
- Selbst-Override. Die eigenen
requiredPluginsundoptionalPluginseines Manifests (oder Plugins) — und bei einem Plugin das Plugin selbst — sind von seiner eigenen Verbotsliste ausgenommen;"forbiddenPlugins": ["*"]plus"optionalPlugins": ["acme/approved"]bedeutet also: „Erlaube nur, was dieses Manifest auflistet; verbiete alles andere.“ Diese Ausnahme gilt nur für diese direkten Einträge, nicht für die transitiven Abhängigkeiten eines erforderlichen Plugins — führe sie bei einem Lockdown ausdrücklich auf. - Keine scope-übergreifende Wiederfreigabe. Die Allow-List eines Manifests oder Plugins kann nicht erneut erlauben, was ein anderes verbietet. Ein
"forbiddenPlugins": ["*"]-Lockdown kann nicht aus einem niedrigeren Geltungsbereich ausgehebelt werden.
- Bei der Installation — die Installation eines blockierten Plugins (oder eines Plugins, dessen erforderliche Plugins nicht erfüllt werden können oder dessen Name mit einem installierten Plugin kollidiert) wird verweigert.
- Beim Laden — ein Plugin, das erst nach der Installation blockiert wird, bleibt auf dem Datenträger, aber seine Skills werden beim Start der Sitzung übersprungen, zusammen mit einer Warnung, die den Verursacher des Verbots nennt.
owner/repo und Git-URL auch ein lokaler Pfad sein (für Plugins, die aus einem lokalen Ordner installiert werden).
Vererbung und Ebenen
- Enterprise — das kontoweit verwaltete Manifest, das von einem Admin konfiguriert wird.
- Org — ein auf Organisationsebene verwaltetes Manifest, das unterhalb des zugehörigen Kontos liegt (eine Org kann ergänzen, was ihr Konto deklariert, es aber nicht außer Kraft setzen). Das gilt nur für Cloud-Devin-Sitzungen: Die CLI authentifiziert sich auf Kontoebene und hat keinen Org-Kontext, daher gelten Anforderungen und Verbote auf Organisationsebene nicht für CLI-Nutzer. Alles, was in der CLI erzwungen werden soll, muss im Enterprise-/Kontomanifest stehen.
- Repo — die
requiredPlugins/optionalPlugins/forbiddenPluginsin der.devin/config.jsoneines Checkouts, die ermittelt werden, indem vom Arbeitsverzeichnis aus nach oben traversiert wird. - User — Plugins, die Sie selbst mit
devin plugins installinstallieren.
- Eine niedrigere Ebene kann niemals wieder erlauben, was eine höhere Ebene verbietet.
- Eine niedrigere Ebene kann niemals verbieten, was eine höhere Ebene verlangt — das Verbot wird ignoriert und das Plugin wird trotzdem geladen.
Eine Denylist wird nur auf ihrer eigenen Ebene überschrieben
forbiddenPlugins
einer Ebene wird nur durch die eigenen optionalPlugins (oder
requiredPlugins) desselben Manifests überschrieben — niemals durch eine Liste auf einer niedrigeren Ebene.
Zum Beispiel kann ein auf Enterprise-Ebene verwaltetes Manifest das Konto auf ein
einziges genehmigtes Plugin beschränken:
acme/approved zuzulassen und
jedes andere Plugin zu verbieten.” Keine Org, kein Repo und kein Nutzer kann diese
Allowlist erweitern — weder durch die Installation eines Plugins noch durch das Hinzufügen
zu den optionalPlugins einer niedrigeren Ebene.
Diese Ausnahme gilt außerdem nur für die Einträge, die dieses Manifest direkt aufführt; die
eigenen transitiven Abhängigkeiten eines erforderlichen Plugins sind nicht ausgenommen und müssen
bei einem Lockdown daher ausdrücklich mit aufgeführt werden.
Konflikte und Abhängigkeiten
- Ein require und ein forbid für dasselbe Plugin auf derselben Ebene, aber aus verschiedenen Manifesten (zum Beispiel zwei separat installierte Plugins auf Nutzer-Ebene), führen dazu, dass sich das forbid durchsetzt — eine Allowlist nimmt nur Einträge im eigenen Manifest aus, sie kann also kein Plugin retten, das ein anderes Manifest verbietet. (Innerhalb eines einzelnen Manifests bleiben dessen eigene required/optional von dessen eigenen forbids ausgenommen, wie oben.)
- Ein durch Governance blockiertes Plugin scheitert weich: Zu Sitzungsbeginn werden seine Skills mit einer Warnung übersprungen, die nennt, wer das forbid gesetzt hat, statt die Sitzung abzubrechen.
- Eine Abhängigkeit von ihm gewährt keine Ausnahme. Ein Plugin, das nur als transitive Abhängigkeit eingebunden wird, unterliegt weiterhin jedem forbid, das auf es zutrifft, und es übernimmt die höchste Autoritätsebene aller Plugins, die es voraussetzen.

