Guardrails para software construído com IAv0.5.0

Faça o verdesignificar algo.

mido é a escada de verificação entre uma mudança e a entrega. Seis portões sobre todo o workspace. Um veredito amarrado à revisão que ele mediu.

  • Rust
  • TypeScript
  • JavaScript
Licença MIT · Fala MCP
mido~/acme-apilocal
targetworkspace (./)revision4f2a9c1emeasured42 files (42 rust)
[1/6]syntaxclean
[2/6]sizewithin bounds
[3/6]analysismaintainability 71
[4/6]tests214 passed
[5/6]coverage91.3%
[6/6]mutation46/49 killed · 93.8%
verdictSHIP-READY
revision stamp: 4f2a9c1e | 9c31b7d4
Execução ilustrativa — a saída real é texto puro e continua honesta quando canalizada.

Por que mido

Código ficou barato. Prova não.

Um agente pode produzir mil linhas antes do almoço. Um teste verde só diz que um comando saiu com zero; não diz que a mudança é pequena, está coberta ou que os testes de fato verificam algo.

O mido impõe o piso em ordem de custo: as verificações baratas de rodar vêm primeiro; as caras de falsificar, por último. Nada é medido só porque mudou. Tudo é medido porque vai ser entregue.

Veja o que a escada exige
portões, uma ordem fixa
6
linguagens, um contrato
3
veredito amarrado à revisão
1
passes silenciosos
0

A escada

Seis portões. Na única ordem que faz sentido.

Verificações baratas primeiro, prova cara por último. Todo portão precisa responder. Ferramenta ausente é INCOMPLETE, nunca passe.

barato de rodar → caro de falsificaro alvo inteiro, sempre
  1. 01

    syntax

    Está limpo?

    Formatador, linter e type checker sobre o alvo medido. Qualquer diagnóstico reprova o portão.

    zero diagnósticoscargo fmt · clippy · cargo check / prettier · eslint · tsc
  2. 02

    size

    Dá para segurar na cabeça?

    Linhas por arquivo, linhas por função, complexidade ciclomática e profundidade de aninhamento em todo o alvo — não só no diff.

    arquivo 300/500 · fn 40/60 · cc 10/15 · aninhamento 3/4tokei · rust-code-analysis / eslint
  3. 03

    analysis

    Vai envelhecer bem?

    Complexidade cognitiva e um índice de manutenibilidade onde a stack mede um. Nenhuma nota inventada onde ela não mede.

    MI ≥ 20 · cognitiva ≤ 15rust-code-analysis / eslint + sonarjs
  4. 04

    tests

    Ele se comporta?

    A suíte do próprio projeto, cada comando que ele declara. Nunca pule, ignore ou afrouxe uma asserção para ficar verde.

    a suíte passacargo test / <package manager> test
  5. 05

    coverage

    Os testes passam por ele?

    Cobertura total de linhas contra um piso, mais a queda contra uma baseline. Relatório vazio é INCOMPLETE, não 100%.

    ≥ 80% · queda ≤ 0cargo-llvm-cov / vitest · jest · c8
  6. 06

    mutation

    Os testes realmente asseguram?

    Mutantes sobreviventes na mudança. Um sobrevivente precisa de uma asserção real ou de uma justificativa de equivalência por escrito.

    ≥ 70% mortoscargo-mutants / stryker

Um contrato, três ecossistemas

Ele encontra sua stack onde ela está.

O mido infere o módulo de linguagem pelo repositório, ou aceita --lang. O módulo é dono dos comandos, parsers, medição e baseline.

Rust

Cargo.toml

tokei · rust-code-analysis · cargo-llvm-cov · cargo-mutants

TypeScript

tsconfig.json

prettier · eslint · tsc · vitest/jest/c8 · stryker

JavaScript

package.json

prettier · eslint · vitest/jest/c8 · stryker

Um repositório que nenhum módulo reconhece sai com 2 e diz por quê. Não existe fallback silencioso.

Vereditos

Verde precisa de definição.

O mido não dá nota por simpatia. A escada termina numa resposta honesta, e uma isenção nunca fica escondida.

SHIP-READYexit 0

Todo portão que rodou passou.

Se a config isentou um portão, o veredito nomeia. Verde para a escada que você configurou, nunca uma afirmação sobre o portão que ficou de fora.

BLOCKEDexit 1 / 2

Um portão falhou ou não conseguiu responder.

FAIL significa que o código quebrou o contrato. INCOMPLETE significa que o portão não chegou a um veredito — ferramenta ausente, arquivo ilegível, timeout. Nenhum dos dois é passe.

SKIPPEDnomeado

Uma isenção, por escrito.

enabled = false não roda nada e reporta SKIPPED. O veredito diz waived: mutation — enabled = false in .mido.toml. Sem omissões silenciosas.

Um portão dispensado não é um portão aprovado.

Para agentes

Escrito por um agente. Lido pelo próximo.

O mido assume que um LLM escreveu a mudança e que outro vai continuar o trabalho. Não interativo por contrato, com evidência em primeiro lugar.

  1. 01

    Códigos de saída, não vibes

    0 é pronto para entregar. 1 é portão reprovado. 2 é incompleto ou erro de setup. --json dá estrutura quando o chamador precisa de mais que o código.

  2. 02

    O relatório é o prompt

    Uma falha nomeia o portão, o contrato, a evidência e a correção. É escrita para a próxima tentativa, não para quem vai ler logs.

  3. 03

    Amarrado à revisão

    HEAD mais um hash do estado sujo. Um verde de antes da última edição não pode ser reaproveitado nela.

  4. 04

    Nativo em MCP

    mido mcp expõe list_targets e run_ladder via stdio. Silencioso por padrão; o relatório markdown é o artefato.

O artefato de passagemFAIL

BLOCKED — size=FAIL

targetworkspace (./)

[2/6] ✗ size — FAIL

summary
worst function 74 sloc / cc 1 (oversized_demo)
contract
.mido.toml [size] function_loc.fail=60, complexity.fail=15
evidence
src/size_demo.rs: oversized_demo has function_loc 74 (fail >= 60)
fix

split along a real seam — moving the code into another file does not pass this gate

MCP

Chame a escada direto.

Aponte um agente que fala MCP para mido mcp. Ele recebe as regras exatas da CLI: pacote desconhecido é erro de setup, argumento desconhecido é rejeitado.

  • list_targetsNome, caminho e tipo de cada alvo no repositório.
  • run_ladderMede um alvo em silêncio; devolve o código de saída e o relatório.
Ler a documentação do MCP

Configuração do cliente MCPJSON

{
  "mcpServers": {
    "mido": {
      "command": "mido",
      "args": ["mcp"]
    }
  }
}

Comece aqui

Coloque um portão antes da entrega.

Instale o binário e rode dentro de um repositório. O mido infere Rust, TypeScript ou JavaScript e funciona com a baseline embutida antes de você escrever qualquer config.

Instalação em uma linha

v0.5.0
curl -fsSL https://github.com/alessandromalacarne/mido/releases/latest/download/install.sh | sh

Outros caminhos

Cargocargo install mido-guard
Nixnix develop
Do código-fontecargo build --release

Precisa de git e das ferramentas que os portões da sua stack chamam. nix develop traz todas.

  1. 01

    Instale

    O instalador confere a release contra o SHA256SUMS e coloca o mido em ~/.local/bin.

  2. 02

    Rode

    Na raiz do repositório: mido. Ele mede o workspace inteiro, não só o diff.

  3. 03

    Aperte

    Mova um limite no .mido.toml quando fizer sentido. Uma isenção fica escrita e é nomeada no veredito.

O caminho de entrada

Faça o próximo verde significar algo.

Seis portões entre o seu código e a entrega. Um veredito para entregar ao próximo leitor.

“Se quiser passar por aqui, leve ao menos uma espada e um escudo!”

Mido, guardando a entrada da Floresta Kokiri