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:

SinalO Que MedePor Que Importa
Churn de GitFrequência de commits, linhas alteradas, recênciaArquivos com alto churn são ímãs de regressão
Lacunas de CoberturaCobertura de linhas e branches de relatórios existentesBaixa cobertura = pontos cegos
Mapeamento de TestesQuais arquivos-fonte têm testes correspondentesSem 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çãoO que o QA Radar faz em vez disso
Custo de tokensgit log em 90 dias em um repositório médio são centenas de KB. O QA Radar retorna ~5 KB de JSON estruturado.
DeterminismoUma pontuação de risco ponderada calculada ad-hoc no contexto não é confiável. Código é reproduzível.
VelocidadeUma chamada de ferramenta vs. 4–6 chamadas bash sequenciais + raciocínio entre cada uma.
Normalização de formatoLCOV / 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çõestest_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.
PortabilidadeAs 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:

ComandoO que faz
/qaradar:qa-checkRelatório completo de saúde — risco, cobertura, arquivos sem teste
/qaradar:qa-riskyLista classificada dos arquivos mais arriscados com razões
/qaradar:qa-untestedArquivos-fonte sem testes detectados + sugestões de scaffold
/qaradar:qa-planPlano de teste priorizado (encadeia 3 ferramentas)
/qaradar:qa-pr-riskQuais 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

FerramentaQuando o Agente a Usa
qaradar_healthcheckVisão geral completa de qualidade de um repositório
qaradar_risky_modulesO que testar primeiro; quais arquivos são os mais arriscados
qaradar_churnDetecção de hotspots; onde regressões tendem a ocorrer
qaradar_coverage_gapsArquivos com baixa cobertura; onde estão os pontos cegos
qaradar_untested_filesArquivos-fonte sem arquivos de teste correspondentes
qaradar_pr_riskQuais arquivos alterados neste PR precisam de atenção
qaradar_should_runApó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

LinguagemDetecção de testesCobertura
Pythontest_x.py, x_test.pycoverage.py JSON + XML
JavaScript / TypeScriptx.test.*, x.spec.*, x-test.* (React Native)LCOV, Jest/Istanbul JSON
Gox_test.goPerfil cover do Go (cover.out)
SwiftXTests.swift (XCTest func test…)Cobertura / LCOV
KotlinXTest.kt (@Test)Cobertura / LCOV
Dart / Flutterx_test.dart (test(, testWidgets()LCOV (coverage/lcov.info)
Objective-CXTests.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

FormatoFerramentas
coverage.py JSONPython coverage run + coverage json
Istanbul / Jest JSONcoverage-final.json, coverage-summary.json (Jest/Vitest/nyc)
Cobertura XMLPython, Java/Gradle, .NET (Coverlet)
LCOVJS/TS, Flutter/Dart, C/C++, Rust (grcov)
Perfil cover do Gogo 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:

  1. O gargalo mudou. A IA torna fácil escrever testes. Saber quais testes importam é a parte difícil.
  2. 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.
  3. 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