Allow. Ask.
Deny.
Toda ação do agente resolve para um de três verbos. A config permission decide o que roda sozinho, o que pede aprovação e o que é bloqueado — por ferramenta, por padrão, por agente.
01A forma básica
{
"permission": {
"*": "ask",
"bash": "allow",
"edit": "deny"
}
}Ou tudo de uma vez: "permission": "allow". As chaves casam por curinga contra o nome real da ferramenta — o mesmo mecanismo cobre nativas, customizadas e MCP ("meumcp_*": "deny").
02Regras granulares
A maioria das permissões aceita um objeto padrão → ação. As regras avaliam em ordem e a última que casa vence — catch-all primeiro, específicas depois:
{
"permission": {
"bash": {
"*": "ask",
"git *": "allow",
"npm *": "allow",
"rm *": "deny"
},
"edit": {
"*": "deny",
"docs/**/*.md": "allow"
}
}
}*casa qualquer sequência;?exatamente um caractere; o resto é literal.bashcasa contra o comando parseado —"grep *"permitegrep padrão arquivo;"grep"sozinho bloquearia com argumentos.~e$HOMEno início do padrão expandem para a sua home.
03Chaves disponíveis
| Chave | Casa contra | Granular |
|---|---|---|
| read | Caminho do arquivo lido | sim |
| edit | Caminho — cobre edit, write e apply_patch | sim |
| glob · grep · list | Padrão de busca | sim |
| bash | Comando parseado (git status --porcelain) | sim |
| task | Nome do subagente invocado | sim |
| skill | Nome da skill carregada | sim |
| external_directory | Caminho fora do worktree do projeto | sim |
| webfetch · websearch | URL · consulta | shorthand |
| lsp · question · todowrite | — | shorthand |
| doom_loop | Mesma tool call repetida 3× com input idêntico | shorthand |
04Defaults que protegem
Sem configuração, o MVCode parte de defaults permissivos com três exceções deliberadas:
external_directoryedoom_loopnascem emask.readnasce emallow, mas arquivos .env são negados por padrão (*.env,*.env.*) — só*.env.examplepassa.
05Diretórios externos
Qualquer ferramenta que toque caminho fora do diretório de trabalho passa por external_directory. Um diretório permitido herda os defaults do workspace — restrinja por ferramenta quando quiser leitura sem escrita:
{
"permission": {
"external_directory": { "~/projetos/pessoal/**": "allow" },
"edit": { "~/projetos/pessoal/**": "deny" }
}
}Referências configuradas atravessam essa fronteira automaticamente — as permissões de ferramenta continuam valendo.
06O que o "ask" pergunta
O dock de permissão oferece três saídas:
| Resposta | Efeito |
|---|---|
| once | Aprova só esta chamada. |
| always | Aprova o padrão sugerido pela ferramenta (ex.: git status*) pelo resto da sessão. |
| reject | Nega — o agente recebe a recusa como resultado e replaneja. |
Pedidos pendentes também chegam como notificação no celular — decisão remota, mesma semântica.
07Por agente
Permissões de agente se mesclam com as globais, com precedência do agente — o build pode commitar com ask enquanto o global nega:
{
"permission": { "bash": { "*": "ask", "git push *": "deny" } },
"agent": {
"build": {
"permission": { "bash": { "git commit *": "ask" } }
}
}
}Para frotas, as mesmas regras podem vir de configuração gerenciada que o usuário não altera — veja policies.
A config booleana tools foi mesclada em permission e está deprecada — segue aceita por compatibilidade (true ≡ {"*": "allow"}).
