Escopos de configuração
Existem três escopos de configuração, avaliados em ordem de prioridade:| Escopo | Caminho do arquivo | Finalidade |
|---|---|---|
| project | .failproofai/policies-config.json | Configurações por repositório, versionadas no controle de versão |
| local | .failproofai/policies-config.local.json | Substituições pessoais por repositório, ignoradas pelo git |
| global | ~/.failproofai/policies-config.json | Padrões do usuário aplicados a todos os projetos |
Regras de mesclagem
enabledPolicies — a união dos três escopos. Uma política habilitada em qualquer nível fica ativa.
policyParams — o primeiro escopo que define parâmetros para uma determinada política vence por completo. Não há mesclagem profunda de valores dentro dos parâmetros de uma política.
customPoliciesPath — o primeiro escopo que o define vence.
llm — o primeiro escopo que o define vence.
Formato do arquivo de configuração
Referência de campos
enabledPolicies
Tipo: string[]
Lista de nomes de políticas a serem habilitadas. Os nomes devem corresponder exatamente aos identificadores de política exibidos pelo failproofai policies. Consulte Políticas Integradas para a lista completa.
Políticas que não estão em enabledPolicies ficam inativas, mesmo que tenham entradas em policyParams.
policyParams
Tipo: Record<string, Record<string, unknown>>
Substituições de parâmetros por política. A chave externa é o nome da política; as chaves internas são específicas de cada política. Cada política documenta seus parâmetros disponíveis em Políticas Integradas.
Se uma política possui parâmetros, mas você não os especifica, os padrões integrados da política são utilizados. Usuários que não configuram policyParams têm comportamento idêntico ao das versões anteriores.
Chaves desconhecidas dentro do bloco de parâmetros de uma política são silenciosamente ignoradas no momento do disparo do hook, mas sinalizadas como avisos quando você executa failproofai policies.
hint (transversal)
Tipo: string (opcional)
Uma mensagem anexada ao motivo quando uma política retorna deny ou instruct. Use para fornecer ao Claude orientações práticas sem modificar a própria política.
Funciona com qualquer tipo de política — integrada, personalizada (custom/), convenção de projeto (.failproofai-project/) ou convenção do usuário (.failproofai-user/).
hint não estiver definido, o comportamento permanece inalterado (compatível com versões anteriores).
customPoliciesPath
Tipo: string (caminho absoluto)
Caminho para um arquivo JavaScript contendo políticas de hook personalizadas. Este campo é definido automaticamente por failproofai policies --install --custom <path> (o caminho é resolvido para absoluto antes de ser armazenado).
O arquivo é carregado novamente a cada evento de hook — não há cache. Consulte Políticas Personalizadas para detalhes de criação.
Políticas baseadas em convenção
Além docustomPoliciesPath explícito, o failproofai descobre e carrega automaticamente arquivos de política dos diretórios .failproofai/policies/:
| Nível | Diretório | Escopo |
|---|---|---|
| Projeto | .failproofai/policies/ | Compartilhado com a equipe via controle de versão |
| Usuário | ~/.failproofai/policies/ | Pessoal, aplica-se a todos os projetos |
*policies.{js,mjs,ts} são carregados (por exemplo, security-policies.mjs, workflow-policies.js). Outros arquivos no diretório são ignorados.
Sem configuração necessária: Políticas por convenção não requerem entradas em policies-config.json. Basta colocar os arquivos no diretório e eles serão detectados no próximo evento de hook.
Carregamento por união: Ambos os diretórios de convenção — de projeto e de usuário — são verificados. Todos os arquivos correspondentes de ambos os níveis são carregados (diferente do customPoliciesPath, que usa o primeiro escopo encontrado).
Consulte Políticas Personalizadas para mais detalhes e exemplos.
llm
Tipo: object (opcional)
Configuração do cliente LLM para políticas que fazem chamadas de IA. Não é necessário para a maioria dos cenários.
Gerenciando a configuração pela CLI
Os comandospolicies --install e policies --uninstall escrevem no arquivo de configurações de hooks da CLI do agente (os pontos de entrada dos hooks), enquanto o policies-config.json é o arquivo que você gerencia diretamente. Os dois são separados:
- Configurações da CLI do agente — instrui o agente a chamar
failproofai --hook <event>a cada uso de ferramenta:- Claude Code:
~/.claude/settings.json(usuário),<cwd>/.claude/settings.json(projeto),<cwd>/.claude/settings.local.json(local) - OpenAI Codex:
~/.codex/hooks.json(usuário),<cwd>/.codex/hooks.json(projeto) — o Codex não possui escopolocal - GitHub Copilot CLI (beta):
~/.copilot/hooks/failproofai.json(usuário),<cwd>/.github/hooks/failproofai.json(projeto) — o Copilot não tem escopolocal. As entradas de hook usam os campos de comandobash/powershellcom chave de SO do Copilot comtimeoutSec; o arquivo contém um marcadorversion: 1no nível superior. O suporte ao Copilot CLI está em beta enquanto verificamos o esquema de registroevents.jsonl(não especificado na documentação pública) contra mais sessões do mundo real. - Cursor Agent (beta):
~/.cursor/hooks.json(usuário),<cwd>/.cursor/hooks.json(projeto) — o Cursor não tem escopolocal. As entradas de hook usam o formato no estilo Claude{type, command, timeout}(sem separaçãobash/powershell), mas armazenadas sob chaves de evento em camelCase (preToolUse,beforeSubmitPrompt, …) em um array plano seguindo o esquema de hooks do Cursor; o arquivo contém um marcadorversion: 1no nível superior. O handler canonicaliza camelCase → PascalCase viaCURSOR_EVENT_MAP, então as políticas integradas existentes disparam sem alterações. O suporte ao Cursor Agent está em beta enquanto verificamos o formato de transcrição em disco do Cursor (não especificado na documentação pública) contra mais instalações do mundo real. - OpenCode (beta):
~/.config/opencode/opencode.json+~/.config/opencode/plugins/failproofai.mjs(usuário),<cwd>/.opencode/opencode.json+<cwd>/.opencode/plugins/failproofai.mjs(projeto) — o OpenCode não tem escopolocal. Diferente dos outros seis CLIs, o OpenCode não possui sistema de hook por comando externo: ele carrega plugins JS/TS em processo, explicitamente registrados via o arrayplugin: []emopencode.json(a descoberta automática de.opencode/plugins/não é como os plugins carregam no opencode v1.14.33). A instalação cria um pequeno shim de plugin gerado que chama o binário failproofai como subprocesso e traduz a resposta JSON no formato Claude de volta para semântica de plugin:throw new Error()para deny em eventos de ferramenta (cancela a chamada da ferramenta),client.session.prompt(...)para instruct E para deny deStop/SubagentStop(envia o motivo da negação como próxima mensagem do usuário — o único canal de força de reenvio, já quesession.idleé apenas notificação e lançar exceção a partir dele não tem efeito), e no-op para allow. O shim canonicaliza tanto os nomes das ferramentas (lowercase → PascalCase viaOPENCODE_TOOL_MAP) quanto as chaves dos argumentos de entrada de ferramentas (camelCase → snake_case viaOPENCODE_TOOL_INPUT_MAPparaRead/Write/Edit, por exemplofilePath→file_path,oldString→old_string) antes de repassar ao binário, de modo que as políticas integradas de verificação de caminho comoblock-read-outside-cwd,block-env-fileseblock-secrets-writedisparam normalmente em chamadas de ferramenta do OpenCode. As sessões ficam no banco SQLite do opencode em~/.local/share/opencode/opencode.db; o visualizador de sessões do dashboard as lê viaopencode db --format jsoneopencode export <id>. O suporte ao OpenCode está em beta enquanto verificamos o comportamento em diferentes versões e contra mais sessões do mundo real. Consulte a documentação de plugins do OpenCode. - Pi (beta):
~/.pi/agent/settings.json(usuário),<cwd>/.pi/settings.json(projeto) — o Pi não tem escopolocal. O Pi carrega pacotes de extensão TypeScript na inicialização; o arquivo de configurações é um array simples de strings{"packages": ["./relative/path", …]}. O failproofai escreve uma única entrada no array de pacotes apontando para seu diretóriopi-extension/empacotado. A extensão internamente assina os eventostool_call/user_bash/input/session_startdo Pi e executafailproofai --hook <Event> --cli pi; o handler canonicaliza underscore_lower_snake_case → PascalCase viaPI_EVENT_MAP, então as políticas integradas existentes disparam sem alterações. Os argumentos de entrada das ferramentas também são canonicalizados viaPI_TOOL_INPUT_MAP(Read / Write / Edit do Pi entregampathem vez defile_path; mapear a chave de nível superior permite queblock-env-fileseblock-secrets-writedisparem —block-read-outside-cwdjá possuía um fallback parapath). O suporte ao Pi está em beta enquanto a API de extensão e o layout do log de sessão do Pi se estabilizam. - Gemini CLI (beta):
~/.gemini/settings.json(usuário),<cwd>/.gemini/settings.json(projeto) — o Gemini não tem escopolocal(documenta um escoposystemem/etc/gemini-cli/settings.json, que o failproofai não expõe). As entradas de hook usam o formato Claude{type, command, timeout}encapsulado no esquema de matcher do Gemini{matcher, hooks: [...]}commatcher: "*"por padrão. Os eventos são PascalCase (SessionStart,BeforeAgent,AfterAgent,BeforeModel,AfterModel,BeforeToolSelection,BeforeTool,AfterTool,PreCompress,Notification,SessionEnd); o handler mapeia para nomes canônicos Claude viaGEMINI_EVENT_MAP. Os nomes das ferramentas são snake_case (run_shell_command,read_file,write_file,replace, …) — o handler canonicaliza viaGEMINI_TOOL_MAP, então as políticas integradas existentes disparam sem alterações. O avaliador de políticas emite o formato plano{decision: "deny", reason}do Gemini (preferido pela “Regra de Ouro” do exit-0 do Gemini),{hookSpecificOutput: {hookEventName, additionalContext}}para injeção de contexto em BeforeAgent / AfterTool / SessionStart, e{decision: "block", reason}no AfterAgent para semântica de força de reenvio. O suporte ao Gemini CLI está em beta enquanto ampliamos a cobertura do mundo real. Consulte a documentação de hooks do Gemini CLI.
- Claude Code:
policies-config.json— instrui o failproofai sobre quais políticas avaliar e com quais parâmetros (compartilhado entre todos os CLIs de agentes)
--cli claude|codex|copilot|cursor|opencode|pi|gemini para direcionar um agente específico (separado por espaço ou repetido para qualquer subconjunto):
--cli é omitido, o failproofai detecta quais CLIs de agentes estão instalados (which claude / which codex / which copilot / which cursor-agent / which opencode / which pi / which gemini):
- Um CLI detectado — seleciona automaticamente esse CLI sem solicitar confirmação.
- Múltiplos CLIs detectados em um terminal interativo — exibe um prompt de seleção única com teclas de seta, agrupado em uma seção
Detected (N)(com uma linha agregadaInstall for all N detected+ cada CLI detectado individualmente) e uma seçãoNot installed (M) · install hooks ahead of timelistando todos os CLIs suportados não detectados como opção de instalação antecipada (↑↓ para mover, Enter para selecionar, ^C para sair). O fluxo de desinstalação exibe apenas a seção Detected. - Múltiplos CLIs detectados em uma execução não interativa (CI, sem TTY) — instala para todos os CLIs detectados sem solicitar confirmação.
- Nenhum detectado — volta para
claude, com um aviso de que nenhum binário de agente foi encontrado no PATH; o comando de hook ainda é escrito para que seja ativado assim que você instalar um.
policies-config.json diretamente a qualquer momento; as alterações têm efeito imediato no próximo evento de hook, sem necessidade de reinicialização.
Exemplo: configuração no nível do projeto com padrões da equipe
Faça commit de.failproofai/policies-config.json no seu repositório:
.failproofai/policies-config.local.json (ignorado pelo git) para substituições pessoais sem afetar os colegas de equipe.
