QA Radar
Servidor MCP que informa ao seu agente quais arquivos testar primeiro — churn do git, lacunas de cobertura e mapeamento de testes como pontuações de risco por arquivo.
Documentação
QA Radar
Dê ao seu agente de IA o cérebro de qualidade que ele não precisa desenvolver do zero.
O QA Radar analisa seu codebase e produz um relatório estruturado de saúde de qualidade — combinando churn de git, cobertura de testes e mapeamento teste-fonte em módulos com pontuação de risco. Ele funciona como um servidor MCP para agentes de IA de codificação (Claude Code, Cursor, Windsurf) e como um CLI autônomo para humanos e pipelines de CI.
Construído para desenvolvedores que querem que seu agente de IA escreva testes direcionados, não genéricos.
Início Rápido
Claude Code — um passo:
/plugin marketplace add Muratkus/qaradar
/plugin install qaradar@qaradar-marketplace
Depois pergunte ao seu agente: "O que devo testar primeiro?"
Ou execute diretamente sem instalar:
uvx qaradar serve
Opções completas de instalação ↓
O Que Ele Faz
O QA Radar responde à pergunta que todo novo membro da equipe (e todo agente de IA) faz: "O que devo testar primeiro?"
Ele analisa três sinais e os combina em uma pontuação de risco por arquivo:
| Sinal | O Que Mede | Por Que Importa |
|---|---|---|
| Churn de Git | Frequência de commits, linhas alteradas, recência | Arquivos com alto churn são ímãs de regressão |
| Lacunas de Cobertura | Cobertura de linhas e branches de relatórios existentes | Baixa cobertura = pontos cegos |
| Mapeamento de Testes | Quais arquivos-fonte têm testes correspondentes | Sem testes = nenhuma rede de segurança |
A saída é uma lista classificada de módulos por nível de risco (crítico → baixo), com razões legíveis para cada classificação.
Por Que Não Deixar o Agente Fazer Isso?
Um agente capaz com acesso ao bash poderia executar git log --numstat, analisar coverage.xml e fazer glob em arquivos de teste. Então por que um servidor MCP?
| Preocupação | O que o QA Radar faz em vez disso |
|---|---|
| Custo de tokens | git log em 90 dias em um repositório médio são centenas de KB. O QA Radar retorna ~5 KB de JSON estruturado. |
| Determinismo | Uma pontuação de risco ponderada calculada ad-hoc no contexto não é confiável. Código é reproduzível. |
| Velocidade | Uma chamada de ferramenta vs. 4–6 chamadas bash sequenciais + raciocínio entre cada uma. |
| Normalização de formato | LCOV / Cobertura / coverage.py JSON / perfis cover do Go são todos analisados de forma diferente. O QA Radar normaliza entre formatos para que o agente não precise. |
| Codificação de convenções | test_x.py para Python, x.test.ts para JS/TS, x_test.go para Go, FooTest.java para Java — codificados uma vez, não re-derivados a cada sessão. |
| Portabilidade | As mesmas ferramentas MCP funcionam em Claude Code, Cursor e Windsurf sem re-prompting. |
Instalar como Plugin do Claude Code (Recomendado)
O caminho mais rápido — um comando conecta o servidor MCP e instala 4 comandos de barra. Sem edição manual de configuração.
Passo 0 — instale o uv (se você não o tiver):
curl -LsSf https://astral.sh/uv/install.sh | sh
# or: pip install uv
O uv inicia o qaradar sob demanda a partir do PyPI — você não precisa pip install qaradar separadamente.
Passo 1 — adicione o marketplace:
/plugin marketplace add Muratkus/qaradar
Passo 2 — instale:
/plugin install qaradar@qaradar-marketplace
O que você obtém: 6 ferramentas MCP auto-configuradas + 5 comandos de barra:
| Comando | O que faz |
|---|---|
/qaradar:qa-check | Relatório completo de saúde — risco, cobertura, arquivos sem teste |
/qaradar:qa-risky | Lista classificada dos arquivos mais arriscados com razões |
/qaradar:qa-untested | Arquivos-fonte sem testes detectados + sugestões de scaffold |
/qaradar:qa-plan | Plano de teste priorizado (encadeia 3 ferramentas) |
/qaradar:qa-pr-risk | Quais arquivos alterados neste PR são os mais arriscados |
Exemplo: após mesclar uma grande branch de feature, execute /qaradar:qa-check para ver o que regrediu. Antes de abrir um PR, execute /qaradar:qa-pr-risk para ver o que você precisa testar primeiro.
Servidor MCP (para Agentes de IA de Codificação)
Configuração
Alternativa: configuração manual do MCP (se você preferir não usar o plugin):
Adicione à sua configuração MCP do Claude Code (~/.claude/mcp.json para nível de usuário, ou .mcp.json na raiz do projeto para nível de projeto):
{
"mcpServers": {
"qaradar": {
"command": "uvx",
"args": ["qaradar", "serve"]
}
}
}
Ou inicie manualmente:
uvx qaradar serve
Exemplos de Prompts
Uma vez conectado, pergunte ao seu agente:
"O que devo testar primeiro neste repositório?" "Quais arquivos são os mais arriscados agora?" "Mostre-me os arquivos com maior churn do último mês." "Quais arquivos-fonte não têm testes?" "Quais dos meus arquivos alterados são arriscados?" ← ciente de diff
Ferramentas MCP Disponíveis
| Ferramenta | Quando o Agente a Usa |
|---|---|
qaradar_healthcheck | Visão geral completa de qualidade de um repositório |
qaradar_risky_modules | O que testar primeiro; quais arquivos são os mais arriscados |
qaradar_churn | Detecção de hotspots; onde regressões tendem a ocorrer |
qaradar_coverage_gaps | Arquivos com baixa cobertura; onde estão os pontos cegos |
qaradar_untested_files | Arquivos-fonte sem arquivos de teste correspondentes |
qaradar_pr_risk | Quais arquivos alterados neste PR precisam de atenção |
qaradar_should_run | Após terminar o trabalho: o QA Radar deve re-analisar, e sobre o diff ou o repositório inteiro? |
Ciente de diff: o que é arriscado neste PR?
qaradar_pr_risk pontua apenas os arquivos alterados entre uma ref base e HEAD — não o repositório inteiro. Ele mantém as pontuações de risco calibradas usando normalização do repositório inteiro, para que um arquivo com 2 commits em um PR não seja sinalizado falsamente como CRÍTICO apenas por ser o único arquivo alterado que o agente conhece.
Pergunte ao seu agente:
"Quais dos meus arquivos alterados são arriscados?" "Algum dos arquivos que alterei não tem testes?" "O que devo revisar antes de abrir este PR?"
Ou pela CLI:
# Diff against main — shows only changed files
qaradar analyze . --base main
# Diff against a specific ref
qaradar analyze . --base origin/main --days 60
qaradar_pr_risk detecta automaticamente a branch base a partir de GITHUB_BASE_REF (definido automaticamente no GitHub Actions) ou recorre a main/master. Passe base_ref explicitamente para substituir.
CLI
# Full health check on current directory
qaradar analyze
# Analyze a specific repo with 180 days of history
qaradar analyze /path/to/repo --days 180
# Output as JSON (for piping to other tools)
qaradar analyze --json-output
# Show top 10 risky modules only
qaradar analyze --top 10
# Diff-aware: score only files changed since main
qaradar analyze . --base main
Instalação
pip install qaradar
Ou execute sem instalar:
uvx qaradar serve
A partir do código-fonte (para desenvolvimento):
git clone https://github.com/Muratkus/qaradar.git
cd qaradar
pip install -e .
Suporte a Linguagens
Todo o suporte a linguagens vive em um único registro — qaradar/analyzers/languages.py —
então adicionar uma linguagem é uma única entrada (extensões, convenção de nomes de teste, contador
de funções de teste), consumida tanto pelo churn quanto pelo mapeamento de testes.
Nível 1 — Primeira classe, testado
| Linguagem | Detecção de testes | Cobertura |
|---|---|---|
| Python | test_x.py, x_test.py | coverage.py JSON + XML |
| JavaScript / TypeScript | x.test.*, x.spec.*, x-test.* (React Native) | LCOV, Jest/Istanbul JSON |
| Go | x_test.go | Perfil cover do Go (cover.out) |
| Swift | XTests.swift (XCTest func test…) | Cobertura / LCOV |
| Kotlin | XTest.kt (@Test) | Cobertura / LCOV |
| Dart / Flutter | x_test.dart (test(, testWidgets() | LCOV (coverage/lcov.info) |
| Objective-C | XTests.m / .mm (XCTest - (void)test…) | Cobertura / LCOV |
Nível 2 — Melhor esforço, baseado em nomes
Java, Ruby, Rust — detecção de testes via convenções de nomenclatura. Cobertura via XML Cobertura ou LCOV se emitida.
A análise de cobertura é orientada por formato, então abrange mais ecossistemas do que a detecção de mapeamento de testes, que é específica da linguagem.
Monorepos: relatórios Istanbul/Jest são descobertos automaticamente em packages/*/coverage e
apps/*/coverage, e caminhos de cobertura absolutos/relativos ao pacote são normalizados para
relativos ao repositório para que se juntem corretamente aos sinais de churn e mapeamento de testes.
Formatos de Cobertura Suportados
| Formato | Ferramentas |
|---|---|
| coverage.py JSON | Python coverage run + coverage json |
| Istanbul / Jest JSON | coverage-final.json, coverage-summary.json (Jest/Vitest/nyc) |
| Cobertura XML | Python, Java/Gradle, .NET (Coverlet) |
| LCOV | JS/TS, Flutter/Dart, C/C++, Rust (grcov) |
| Perfil cover do Go | go test -coverprofile=cover.out |
Exemplo de Saída
╭──────────────── QA Radar Health Report ─────────────────╮
│ Repository: /home/user/my-service │
│ Source files: 47 Test files: 23 Ratio: 0.49 │
│ Avg coverage: 62.3% Tested: 31 Untested: 16 │
╰─────────────────────────────────────────────────────────╯
CRITICAL risk modules: 3
HIGH risk modules: 7
┌─────────────────────────────────────────────────────────┐
│ Risky Modules │
├──────────────────────┬──────────┬───────┬───────────────┤
│ File │ Risk │ Score │ Reasons │
├──────────────────────┼──────────┼───────┼───────────────┤
│ src/payments/core.py │ CRITICAL │ 0.87 │ High churn: │
│ │ │ │ 34 commits; │
│ │ │ │ No tests │
│ src/auth/tokens.py │ CRITICAL │ 0.82 │ Low coverage: │
│ │ │ │ 12.3%; Active │
│ │ │ │ recently │
└──────────────────────┴──────────┴───────┴───────────────┘
Acompanhando Execuções ao Longo do Tempo
Por padrão, o QA Radar é sem estado. Opte pela persistência para acompanhar um repositório entre execuções e impulsionar re-análise incremental (diária/semanal, ou após N diffs, ou após um agente terminar o trabalho).
qaradar analyze . --save # record a snapshot to .qaradar/state.json (gitignore it)
qaradar should-run . # exit 0 if a re-run is warranted, 1 if not — prints JSON
qaradar status . # last run, commits/days since, current decision + risk delta
should-run é um gate, não um agendador — conecte-o ao que você já usa:
# cron / CI / git hook: only do expensive work when criteria are met
qaradar should-run . && qaradar analyze . --save
Ele reporta scope: "full" (intervalo decorrido) ou scope: "diff" (arquivos suficientes alterados),
para que um agente que chame a ferramenta MCP qaradar_should_run saiba se deve continuar com
qaradar_healthcheck ou qaradar_pr_risk. O estado é um .qaradar/state.json por repositório,
então uma "coleção de repositórios" é apenas um loop sobre repositórios na sua própria infraestrutura.
Ajuste os critérios em qaradar.toml:
[schedule]
interval_days = 7 # re-run the full healthcheck at least weekly
min_changed_files = 25 # ...or sooner, once this many files have changed
--save também reporta um delta em relação à execução anterior — quais arquivos se tornaram
recentemente arriscados, quais pioraram, quais melhoraram ou foram resolvidos.
Roadmap
- v0.1.2 — Plugin do Claude Code + comandos de barra
- v0.2.0 — Arquivo de configuração (
qaradar.toml), validação de linguagens Nível 2, endurecimento - v0.3.0 — Modo ciente de diff:
qaradar_pr_risk+ flag CLI--base - v0.4.0 — Cobertura de linguagens mobile/monorepo (Swift, Kotlin, Obj-C, Dart, React Native, Jest); persistência de execução + critérios de re-execução (
should-run,--save,qaradar_should_run) - v0.5.0 — Detecção de testes instáveis a partir do histórico de CI (análise de XML JUnit)
Filosofia
O QA Radar é construído sobre três crenças:
- O gargalo mudou. A IA torna fácil escrever testes. Saber quais testes importam é a parte difícil.
- Qualidade é uma paisagem, não um número. Uma única porcentagem de cobertura esconde tudo. O risco é por módulo, por sinal, por período de tempo.
- Agentes precisam de contexto. Um assistente de codificação de IA que não conhece as áreas frágeis do seu repositório escreverá testes genéricos. Dê a ele a paisagem de qualidade e ele escreverá testes direcionados.
Licença
MIT