Download the PHP package saviogodinho2002/driftguard without Composer

On this page you can find all versions of the php package saviogodinho2002/driftguard. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package driftguard

DriftGuard

Latest Version

Mantém um catálogo PHP curado dos seus models Eloquent sincronizado com o código real, usando um LLM (configurável) num fluxo analyze → revisar → apply. Detecção de mudança via git diff, extração estrutural sempre via reflection real (nunca por prosa da IA), e um passo de revisão humana antes de qualquer escrita.

Por quê

Documentar model manualmente desatualiza. Deixar uma IA reescrever tudo sem revisão arrisca perder curadoria manual. DriftGuard concilia os dois: fatos estruturais (tabela, campos, relações) sempre vêm de reflection — nunca da IA; conhecimento de negócio (descrição, notas, e qualquer campo extra que você definir) é proposto pela IA mas nunca aplicado sem você revisar o diff antes.

Instalação

Configure OPENROUTER_API_KEY no seu .env (o cliente padrão usa OpenRouter + um model Claude — troque em config/driftguard.php ou faça bind de outra implementação de Contracts\AnalysisClient no seu próprio ServiceProvider se quiser outro provedor).

Uso

proposal.php acumula entre chamadas de analyze — se você rodar analyze duas vezes pra models diferentes sem apply no meio, as 2 propostas convivem no mesmo arquivo (model repetido nas 2 rodadas: a mais recente vence). driftguard:apply sempre esvazia proposal.php inteiro depois de aplicar — é o único jeito de limpar uma proposta já resolvida.

driftguard:doctor também avisa (nível WARN, nunca falha o exit code) quando uma entrada de config/models.php não corresponde a nenhum model encontrado em models_path — sinal de que o model foi renomeado, movido ou apagado desde a última análise. O pacote nunca remove essa entrada sozinho (o catálogo é curado à mão, igual qualquer outro campo — ver "Segurança" abaixo); reveja manualmente e decida: se foi rename/move, ajuste models_path/o nome da classe e rode analyze de novo; se o model saiu de vez, apague a entrada à mão em config/models.php.

Se você já analisou tudo por fora (ou só quer marcar "a partir de agora, reanalise o que mudar") sem pagar o custo de rodar --force contra todos os models de novo:

Perguntas pendentes (ask_question) — responda sem editar questions.md à mão:

Introspecção (sem chamar o LLM):

Uso por um agente de IA (CLI headless)

Todo command aceita --json (saída estruturada em vez de tabela/cores):

driftguard:apply --json sem --force nunca aplica — devolve {status: "confirmation_required", diff} e sai com código de erro, pra uma execução headless nunca gravar mudança por engano só por ter esquecido --dry-run.

usage (em analyze --json) é {cost_usd, prompt_tokens, completion_tokens}, somado ao longo de TODAS as chamadas ao LLM da rodada (pode haver mais de 1 por model, quando há request_file/ request_method/correção de scope_class no meio). Cada campo é best-effort: fica null quando o provedor/preset não expõe esse dado — nunca inventado/estimado (ex: cli_harness com preset gemini, que não tem custo em dólar em NENHUM lugar do schema da CLI, confirmado no código-fonte; ver detalhes por preset na seção do cli_harness abaixo). Se TODO campo vier null, é porque nenhuma chamada da rodada reportou nada, não porque o custo foi zero.

Customizando pro seu domínio

Tudo em config/driftguard.php, publicado no seu próprio projeto — edite livremente:

Provedor alternativo: harness de CLI

Além de OpenRouter (padrão) e bind da sua própria Contracts\AnalysisClient (sempre suportado, veja o comentário em DriftGuardServiceProvider), o pacote traz um 3º caminho: invocar um agente-CLI (Claude Code, Gemini CLI, opencode) como subprocesso, em vez de uma API stateless. A diferença real é que o harness explora o código sozinho (Read/Grep próprios, restritos ao seu projeto) em vez de receber um snippet pré-empacotado pelo orçamento de contexto do driftguard.

O preset claude usa o Claude Code CLI: a saída é um JSON limpo, exatamente no formato pedido, com regras de negócio numeradas e cross-referências que o harness descobre sozinho via Grep (sem precisar que você cite o arquivo relacionado no prompt). gemini/opencode também são suportados (nível de confiança de cada shape explicado nos trade-offs abaixo); se a sua versão usar um shape diferente, sobrescreva qualquer chave em llm.cli_harness (mesmo padrão de override do resto do pacote):

Override com null explícito é respeitado — se você precisar zerar uma flag que um preset já define (ex: forçar 'dir_flag' => null no preset claude porque sua versão da CLI mudou o nome da flag), null de propósito NUNCA é silenciosamente trocado pelo default do preset. Isso vale tanto pra chave que você sobrescreve quanto pras que os próprios presets gemini/opencode já deixam null (sem flag de restrição de diretório equivalente nessas CLIs) — o driftguard nunca injeta uma flag específica de outra CLI (como --add-dir/--allowedTools, do Claude Code CLI) só porque o preset não definiu uma equivalente.

Custo/tokens por chamada aparecem no analyze --json (chave usage, ver seção --json acima), extraídos de cada preset via cost_field/prompt_tokens_field/completion_tokens_field — o quanto cada CLI realmente expõe e como é lido está detalhado no último item de "Trade-offs" logo abaixo. Custo também continua sendo logado via Log::info('[driftguard] CliHarnessAnalysisClient: custo da chamada', [...]) a cada chamada, útil pra acompanhar em tempo real (storage/logs/laravel.log por padrão) sem esperar a rodada terminar.

Trade-offs a considerar:

Segurança durante a exploração: 3 camadas independentes

O harness explora o código sozinho, então "o que garante que ele não vai escrever/executar algo indevido?" tem uma resposta em camadas — nenhuma sozinha é o bastante:

  1. readonly_lock (default true) — trava allowed_base_path contra escrita no sistema de arquivos ANTES de rodar o subprocesso, e restaura o modo original de cada arquivo depois (mesmo se a chamada falhar ou estourar timeout). É a defesa PRINCIPAL: funciona igual pros 3 presets, independente de a CLI alvo ter allowlist de tool própria. storage/, bootstrap/cache/, vendor/, node_modules/ e .git/ nunca são travados, mesmo dentro de allowed_base_path (travar storage/ quebraria log/cache/sessão de requests concorrentes rodando ao mesmo tempo). Não funciona no Windowschmod() lá não impõe restrição real de diretório (só um atributo cosmético) — nesse caso é desabilitado automaticamente, sem precisar desligar na mão; driftguard:doctor avisa quando isso acontece.
  2. --allowedTools/--add-dir — allowlist de tool da própria CLI alvo, quando ela suporta (hoje só o preset claude tem tools_flag confirmado; gemini/opencode não têm equivalente documentado — driftguard:doctor avisa disso também).
  3. Denylist de códigoBash/Write/Edit/NotebookEdit nunca entram na allowlist passada pra CLI, mesmo que você configure harness_tools incluindo alguma delas por engano.

Isso é só a segurança durante a exploração. Depois que o harness responde, a saída passa pelo MESMO portão de revisão que qualquer outro provedor: nunca escreve config/models.php direto (só proposal.phpdriftguard:apply --dry-run → confirmação), e um campo scope_class proposto passa pelas mesmas 3 guardas de sempre (ScopeClassWriter::sanitize() → checagem semântica → php -l) antes de virar arquivo .php — o harness nunca escreve arquivo, só propõe uma string.

Por que não chamar a CLI direto, sem passar pelo driftguard? Porque o que o driftguard garante não é "chamar a IA com segurança" (isso as 3 camadas acima resolvem) — é tudo em volta disso, que se perde num claude -p "documenta meus models" avulso: fatos estruturais (tabela/campos/relações) sempre por reflection real, nunca pela IA (mesmo que o harness erre um nome de coluna, reflection sempre vence no merge final); detecção incremental via git diff, só reanalisa o que mudou; e o portão de revisão humana + as guardas de scope_class do parágrafo anterior.

Multi-tenancy: escrevendo uma boa instrução pra scope_class

scope_class é o field mais delicado de instruir bem, porque a resposta certa depende de onde a regra de tenant realmente mora no seu app — e isso varia. Dois princípios ajudam a escrever a instrução:

1. O que já está garantido no contexto, sem precisar pedir. O arquivo do próprio model entra inteiro sempre que cabe no orçamento (max_snippet_chars); acima disso, a extração segura sempre preserva booted()/addGlobalScope, scopes locais (scopeXxx()) e métodos de relação (são públicos — a extração segura nunca corta método público) — então "olhe global scopes, scopes locais, e relações que já implicam tenant (belongsTo(Empresa::class))" a IA já tem material pra fazer sozinha de qualquer forma. Não precisa instruir isso, é estrutural.

2. O que não está garantido — e onde configurar, não instruir. Arquivos de apoio só entram se estiverem em supporting_paths e referenciarem o model (ModelDiscovery::supportingFilesForModel()). Se a lógica de tenant mora num middleware (comum em apps multi-tenant — resolve o tenant antes de qualquer controller/model ser tocado), esse arquivo só entra no contexto se você adicionar o diretório de middlewares em supporting_paths. Isso é "onde procurar" — resolve-se na config, não pedindo pra IA adivinhar ou usar request_file às cegas.

Cuidado com "olhe o controller e replique". Controller filtrando manualmente (->where('empresa_id', $user->empresa_id) espalhado em várias actions) é exatamente o anti-padrão que scope_class existe pra resolver — centralizar a regra numa classe só. Se a instrução mandar "replique o que o controller faz" e existirem 2-3 pontos de entrada (ex: API + painel admin + import em lote) filtrando de formas ligeiramente diferentes — cenário comum em apps multi-tenant que cresceram organicamente, não hipotético —, esse é exatamente o padrão que a regra 6 do prompt base já cobre (preferir ask_question a escolher uma versão em silêncio). A instrução abaixo reforça isso com um exemplo concreto do domínio de tenant — não é o único mecanismo, mas ajuda a IA a citar exatamente esses pontos de entrada divergentes, em vez de uma menção genérica.

Instrução recomendada como ponto de partida (adapte Empresa/empresa_id pro seu domínio):

Perguntas pendentes e o modo rerun

Quando a IA usa ask_question em vez de propor uma atualização, o model fica pendente até alguém responder — php artisan driftguard:answer {model} {resposta} (sem precisar editar questions.md). A próxima driftguard:analyze (sem --force/--model) detecta automaticamente qualquer model com pergunta respondida e o inclui na rodada — a resposta anterior entra no prompt como contexto humano autoritativo, ao lado de context_docs.

Segurança

Testando

Testes rodam via Orchestra Testbench, contra models de fixture de um domínio genérico (blog) — sem depender de nenhuma app Laravel real.

Licença

MIT.


All versions of driftguard with dependencies

PHP Build Version
Package Version
Requires php Version ^8.2
illuminate/console Version ^10.0|^11.0|^12.0|^13.0
illuminate/database Version ^10.0|^11.0|^12.0|^13.0
illuminate/support Version ^10.0|^11.0|^12.0|^13.0
guzzlehttp/guzzle Version ^7.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package saviogodinho2002/driftguard contains the following files

Loading the files please wait ...