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.
Das Plugin ist die Installationseinheit. Beim Installieren eines Plugins werden alle
seine Skills und seine requiredPlugins installiert; Sie können keine einzelnen Skills aus einem
Plugin installieren. Um Skills separat anzubieten, teilen Sie sie in separate Plugins auf.
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.
Ein Repo (oder ein git-subdir-Unterordner) entspricht einem Plugin. Ein einzelnes Repo kann
viele Plugins als Unterordner enthalten, die jeweils mit einer eigenen git-subdir-Quelle referenziert werden.
Über Skills hinaus kann ein Plugin Folgendes mitliefern:
- Regeln — eine
AGENTS.mdim Plugin-Stammverzeichnis 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 Plugin-Stammverzeichnis registriert Lifecycle-Hooks, die in jeder Sitzung ausgeführt werden, in der das Plugin installiert ist. In Cloud-Sitzungen werdencommand-Hooks auf der Maschine der Sitzung ausgeführt und nur ausgelöst, solange diese Maschine läuft. Sie unterstützen jedes Ereignis außerSessionStartundSessionEnd— einschließlichPreToolUse,PostToolUse,PermissionRequest,UserPromptSubmit,StopundPostCompaction; Hooks vom Typpromptsind nur in der CLI bzw. lokal verfügbar. - MCP-Server — eine
mcp_config.jsonim Plugin-Stammverzeichnis deklariert MCP-Server ("mcpServers": { "<name>": { … } }), die mit der Sitzung starten. Plugin-MCP- Server werden noch nicht in der MCP-Settings-UI angezeigt, aber ihre Tools sind für Devin verfügbar. Eine Plugin-MCP-Konfiguration kann eine OAuth-Client-ID und Scopes festlegen, aber niemals ein Client Secret — eine Serverkonfiguration, die eines enthält, wird bei der Aktivierung abgelehnt. Die.mcp.jsonim Plugin-Stammverzeichnis von Claude-Plugins und dasmcpServers-Feld im Manifest werden ebenfalls berücksichtigt.
Kompatible Formate
.devin-plugin/plugin.json > .claude-plugin/plugin.json > plugin.json
im Stammverzeichnis:
-
Claude-Plugins — wenn keine
.devin-plugin/plugin.jsonvorhanden ist, greift Devin auf.claude-plugin/plugin.jsonzurück. Die.mcp.jsonim Stammverzeichnis und das ManifestfeldmcpServersvon Claude-Plugins werden berücksichtigt, und${CLAUDE_PLUGIN_ROOT}in Serverkonfigurationen wird zum Plugin-Stammverzeichnis aufgelöst. -
Agent Plugins — Plugins, die gemäß der offenen
Agent Plugins 1.0.0
Spezifikation paketiert sind (ein
plugin.json-Manifest im Plugin-Stammverzeichnis, MCP-Server in einermcp.jsonim Stammverzeichnis, Skills unterskills/), werden ebenfalls geladen. Für diese Plugins wird diemcp.jsonim Stammverzeichnis als konventionelle MCP-Quelle gelesen (nach.mcp.json, die bei einer Kollision von Servernamen Vorrang hat) — Legacy-Plugins im Devin-/Claude-Aufbau lesen sie nur, wenn ihr Manifest sie ausdrücklich deklariert. MCP-Einträge können ihren Transport über dastype-Feld der Spezifikation (stdio,streamable-httpodersse) statt übertransportangeben, und${PLUGIN_ROOT}in Serverkonfigurationen wird wie${CLAUDE_PLUGIN_ROOT}zum Plugin-Stammverzeichnis aufgelöst. Bei einer nicht erkannten$schema-Version wird eine Warnung ausgegeben, und das Plugin wird dennoch bestmöglich geladen. MCP-Server von Agent Plugins erhalten außerdem die Runtime-Konventionen der Spezifikation (diese gelten nur für Plugins, deren Manifest dieplugin.jsonim Stammverzeichnis ist; Devin- und Claude-Aufbauten verhalten sich genau wie zuvor):${PLUGIN_DATA}inargs,env-Werten undcwdwird zu einem persistenten, beschreibbaren Datenverzeichnis pro Plugin aufgelöst. Das Verzeichnis ist über die Plugin-Identität — nicht die Version — bestimmt, sodass sein Inhalt Plugin-Updates überdauert, und wird gelöscht, wenn das Plugin deinstalliert wird.stdio-Serverprozesse erhalten die UmgebungsvariablenPLUGIN_ROOTundPLUGIN_DATAzusätzlich zu allenenv-Werten, die in der Konfiguration festgelegt sind.- Ein Server kann
cwdfestlegen (relativ zum Plugin-Stammverzeichnis); standardmäßig ist dies das Plugin-Stammverzeichnis. Ein mit./beginnendercommandwird relativ zum Plugin-Stammverzeichnis aufgelöst, sodass Plugins ihre eigenen ausführbaren Dateien mitliefern können. Beide werden darauf geprüft, innerhalb des Plugin-Stammverzeichnisses oder Datenverzeichnisses zu bleiben.
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>:…).
Namen bestehen aus alphanumerischen Kleinbuchstaben mit einzelnen -- oder .-Trennzeichen
(z. B. review-tools, acme.tools).
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.

