Skip to main content
Os plugins estão em beta. O comportamento e a configuração podem mudar em versões futuras.
Um plugin é um pacote de skills que você pode instalar de um repo do GitHub, de uma URL do git ou de uma pasta local e reutilizar em diferentes projetos. Ao instalar um plugin, suas skills ficam disponíveis como comandos de barra /<plugin>:<skill>, e ele também pode incluir automaticamente outros plugins dos quais depende. Um plugin é simplesmente uma origem que contém:
my-plugin/
├── .devin-plugin/
│   └── plugin.json     # O manifesto do plugin
└── skills/
    └── review/
        └── SKILL.md    # Um skill comum
O diretório skills/ armazena skills comuns — os plugins não introduzem nenhum novo formato de skill. Consulte Criando Skills para ver o formato SKILL.md.

Instalando um plugin

A origem de um plugin pode ser um owner/repo do GitHub, uma URL do git ou um caminho local:
# Do GitHub
devin plugins install acme/review-tools

# De qualquer host git
devin plugins install https://gitlab.com/acme/review-tools.git

# De uma pasta local (ótimo para criação)
devin plugins install ./my-plugin
Antes de instalar, o Devin mostra o que o plugin adiciona — os skills que ele fornece, quais plugins obrigatórios serão instalados automaticamente e quaisquer políticas que ele introduza (por exemplo, se ele proíbe outros plugins). Use -y / --yes para pular o prompt. Os plugins são instalados no nível de usuário e ficam disponíveis em todos os seus projetos.

Gerenciamento de plugins

# Lista os plugins instalados, suas versões e se algum está bloqueado por política
devin plugins list

# Exibe as skills de um plugin e suas listas de obrigatórios/opcionais/proibidos
devin plugins info review-tools

# Rebusca um plugin (ou todos os plugins) na versão mais recente
devin plugins update review-tools
devin plugins update

# Remove um plugin (plugins obrigatórios instalados automaticamente são mantidos no lugar)
devin plugins remove review-tools
Plugins locais ficam vinculados diretamente à pasta de origem, então as edições entram em vigor em tempo real: devin plugins install ./my-plugin → edite skills/<name>/SKILL.md → as alterações são aplicadas na próxima sessão, sem precisar de update.

O manifesto

.devin-plugin/plugin.json descreve o plugin. Apenas name é obrigatório, e ele deve ser único entre os plugins instalados (é o namespace /<name>:…).
{
  "name": "review-tools",
  "version": "1.0.0",
  "description": "Code-review skills for our team",
  "requiredPlugins": [
    "acme/secure-base",
    { "source": "github", "repo": "acme/audit-logging" }
  ],
  "optionalPlugins": [
    "acme/deploy-tools",
    { "source": "url", "url": "https://gitlab.com/acme/extra.git" }
  ],
  "forbiddenPlugins": ["sketchy-org/bad-plugin", "acme/*", "*"]
}
Campos de metadados suportados: name, version, description, author ({ name, email }), homepage, repository, license e keywords. Uma entrada de dependência é uma origem — pode ser uma string abreviada ou um objeto:
  • "owner/repo" → GitHub
  • "https://…", "git@…", "ssh://…" → URL do git
  • { "source": "github", "repo": "owner/repo" }
  • { "source": "url", "url": "https://gitlab.com/team/plugin.git" }
Todas as formas do GitHub para o mesmo repo (owner/repo, a URL HTTPS, a URL .git, a forma SSH) se referem à mesma identidade de plugin.

Dependências e governança

Um plugin pode declarar três listas, permitindo que um único plugin funcione como uma coleção curada e governada de outros plugins.

requiredPlugins

Instalado automaticamente (de forma recursiva) quando o plugin é instalado. Se um plugin obrigatório for bloqueado por uma política, a instalação inteira falha — não há instalação parcial.

optionalPlugins

Uma lista de permissões de plugins que este plugin aprova. Eles não são instalados automaticamente; a lista só serve como uma exceção para uma entrada proibida (veja abaixo).

forbiddenPlugins

Uma lista de bloqueio. Cada entrada é uma das seguintes:
  • Uma identidade exata de plugin, escrita como owner/repo, uma URL git ou um caminho local.
  • Um padrão glob — qualquer entrada que contenha *. O * corresponde a qualquer sequência de caracteres, incluindo /. Os padrões são normalizados primeiro para o espaço de identidade canônica, então acme/* se torna https://github.com/acme/* (todos os repos do GitHub da acme), */secrets corresponde a um repo chamado secrets de qualquer owner, e https://gitlab.com/acme/* corresponde a qualquer repo nesse caminho.
  • O único "*", que corresponde a todos os outros plugins (um bloqueio total impossível de contornar).
As regras da política são:
  • A negação prevalece. Um plugin é bloqueado se qualquer plugin instalado o proibir (por sua identidade exata, por um glob correspondente ou por "*").
  • Auto-override. Os requiredPlugins, optionalPlugins e o próprio plugin ficam isentos da sua própria lista de bloqueio. Portanto, forbiddenPlugins: ["*"] junto com optionalPlugins: [B, C] significa “permitir a mim mesmo, B e C; proibir todo o resto.”
  • Sem reautorização entre plugins. As listas de permissão de um plugin não podem voltar a permitir o que outro plugin proíbe. Um plugin instalado com forbiddenPlugins: ["*"] é um bloqueio total impossível de contornar.
  • Aberto por padrão. Se nenhum plugin instalado proíbe nada, nada é bloqueado.
A política é aplicada em dois momentos:
  • No momento da instalação — a instalação de um plugin bloqueado (ou de um cujos plugins obrigatórios não podem ser atendidos, ou cujo nome colide com o de um plugin instalado) é recusada.
  • No momento do carregamento — se um plugin passar a ser bloqueado após a instalação (por exemplo, se um plugin que o proíbe for instalado depois), ele permanece em disco, mas suas skills são ignoradas no início da sessão, com um aviso informando o nome do plugin que o proíbe.