Os plugins estão em beta. O comportamento e a configuração podem mudar em versões futuras.
/<plugin>:<skill>, e ele também pode incluir automaticamente outros plugins dos quais depende.
Um plugin é simplesmente uma origem que contém:
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
owner/repo do GitHub, uma URL do git ou um caminho local:
-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
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, 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" }
owner/repo, a URL HTTPS, a
URL .git, a forma SSH) se referem à mesma identidade de plugin.
Dependências e governança
requiredPlugins
optionalPlugins
forbiddenPlugins
- 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ãoacme/*se tornahttps://github.com/acme/*(todos os repos do GitHub daacme),*/secretscorresponde a um repo chamadosecretsde qualquer owner, ehttps://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).
- 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,optionalPluginse o próprio plugin ficam isentos da sua própria lista de bloqueio. Portanto,forbiddenPlugins: ["*"]junto comoptionalPlugins: [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.
- 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.
