QA Radar

Servidor MCP que le indica a tu agente qué archivos probar primero: churn de git, brechas de cobertura y mapeo de pruebas como puntuaciones de riesgo por archivo.

Documentación

QA Radar

Dale a tu agente de IA de codificación el cerebro de calidad que no tiene que desarrollar desde cero.

QA Radar analiza tu base de código y produce un informe estructurado de salud de calidad, combinando churn de git, cobertura de pruebas y mapeo de pruebas a código fuente en módulos con puntuación de riesgo. Funciona como un servidor MCP para agentes de IA de codificación (Claude Code, Cursor, Windsurf) y como una CLI independiente para humanos y pipelines de CI.

Creado para desarrolladores que quieren que su agente de IA escriba pruebas dirigidas, no genéricas.

Inicio Rápido

Claude Code — un solo paso:

/plugin marketplace add Muratkus/qaradar
/plugin install qaradar@qaradar-marketplace

Luego pregúntale a tu agente: "¿Qué debería probar primero?"

O ejecútalo directamente sin instalar:

uvx qaradar serve

Opciones de instalación completas ↓

Qué Hace

QA Radar responde la pregunta que todo nuevo miembro del equipo (y todo agente de IA) se hace: "¿Qué debería probar primero?"

Escanea tres señales y las combina en una puntuación de riesgo por archivo:

SeñalQué MidePor Qué Importa
Churn de GitFrecuencia de commits, líneas cambiadas, actualidadLos archivos con alto churn son imanes de regresiones
Brechas de CoberturaCobertura de líneas y ramas de informes existentesBaja cobertura = puntos ciegos
Mapeo de PruebasQué archivos fuente tienen pruebas correspondientesSin pruebas = sin red de seguridad en absoluto

El resultado es una lista clasificada de módulos por nivel de riesgo (crítico → bajo), con razones legibles para humanos para cada calificación.

¿Por Qué No Simplemente Dejar Que el Agente Lo Haga?

Un agente capaz con acceso a bash podría ejecutar git log --numstat, analizar coverage.xml y buscar archivos de prueba con glob. Entonces, ¿por qué un servidor MCP?

PreocupaciónQué hace QA Radar en su lugar
Costo de tokensgit log durante 90 días en un repositorio mediano son cientos de KB. QA Radar devuelve ~5 KB de JSON estructurado.
DeterminismoUna puntuación de riesgo ponderada calculada ad-hoc en contexto no es confiable. El código es reproducible.
VelocidadUna llamada de herramienta vs. 4–6 llamadas bash secuenciales + razonamiento entre cada una.
Normalización de formatoLCOV / Cobertura / JSON de coverage.py / perfiles de cobertura de Go se analizan de manera diferente. QA Radar normaliza entre formatos para que el agente no tenga que hacerlo.
Codificación de convencionestest_x.py para Python, x.test.ts para JS/TS, x_test.go para Go, FooTest.java para Java — codificado una vez, no re-derivado en cada sesión.
PortabilidadLas mismas herramientas MCP funcionan en Claude Code, Cursor y Windsurf sin necesidad de re-prompting.

Instalar como Plugin de Claude Code (Recomendado)

El camino más rápido — un comando configura el servidor MCP e instala 4 comandos de barra. Sin edición manual de configuración.

Paso 0 — instala uv (si no lo tienes):

curl -LsSf https://astral.sh/uv/install.sh | sh
# or: pip install uv

uv lanza qaradar bajo demanda desde PyPI — no necesitas pip install qaradar por separado.

Paso 1 — agrega el marketplace:

/plugin marketplace add Muratkus/qaradar

Paso 2 — instala:

/plugin install qaradar@qaradar-marketplace

Lo que obtienes: 6 herramientas MCP auto-configuradas + 5 comandos de barra:

ComandoQué hace
/qaradar:qa-checkInforme completo de salud — riesgo, cobertura, archivos sin probar
/qaradar:qa-riskyLista clasificada de archivos más riesgosos con razones
/qaradar:qa-untestedArchivos fuente sin pruebas detectadas + sugerencias de andamiaje
/qaradar:qa-planPlan de pruebas priorizado (encadena 3 herramientas)
/qaradar:qa-pr-riskQué archivos cambiados en este PR son los más riesgosos

Ejemplo: después de fusionar una rama de características grande, ejecuta /qaradar:qa-check para ver qué ha regresado. Antes de abrir un PR, ejecuta /qaradar:qa-pr-risk para ver qué necesitas probar primero.

Servidor MCP (para Agentes de IA de Codificación)

Configuración

Alternativa: configuración manual de MCP (si prefieres no usar el plugin):

Agrega a tu configuración MCP de Claude Code (~/.claude/mcp.json para nivel de usuario, o .mcp.json en la raíz del proyecto para nivel de proyecto):

{
  "mcpServers": {
    "qaradar": {
      "command": "uvx",
      "args": ["qaradar", "serve"]
    }
  }
}

O inícialo manualmente:

uvx qaradar serve

Ejemplos de Prompts

Una vez conectado, pregúntale a tu agente:

"¿Qué debería probar primero en este repositorio?" "¿Qué archivos son los más riesgosos ahora mismo?" "Muéstrame los archivos con mayor churn del último mes." "¿Qué archivos fuente no tienen pruebas en absoluto?" "¿Cuáles de mis archivos cambiados son riesgosos?" ← consciente de diffs

Herramientas MCP Disponibles

HerramientaCuándo la Usa el Agente
qaradar_healthcheckVisión general completa de calidad de un repositorio
qaradar_risky_modulesQué probar primero; qué archivos son los más riesgosos
qaradar_churnDetección de puntos calientes; dónde tienden a ocurrir regresiones
qaradar_coverage_gapsArchivos con baja cobertura; dónde están los puntos ciegos
qaradar_untested_filesArchivos fuente sin archivos de prueba correspondientes
qaradar_pr_riskQué archivos cambiados en este PR necesitan atención
qaradar_should_runDespués de terminar el trabajo: ¿debería QA Radar re-analizar, y sobre el diff o todo el repositorio?

Consciente de Diffs: ¿qué es riesgoso en este PR?

qaradar_pr_risk puntúa solo los archivos cambiados entre una ref base y HEAD — no todo el repositorio. Mantiene las puntuaciones de riesgo calibradas usando normalización de repositorio completo, para que un archivo con 2 commits en un PR no sea marcado falsamente como CRÍTICO solo porque es el único archivo cambiado que el agente conoce.

Pregúntale a tu agente:

"¿Cuáles de mis archivos cambiados son riesgosos?" "¿Alguno de los archivos que cambié carece de pruebas?" "¿Qué debería revisar antes de abrir este PR?"

O desde la 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 automáticamente la rama base desde GITHUB_BASE_REF (configurado automáticamente en GitHub Actions) o recurre a main/master. Pasa base_ref explícitamente para anular.

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

Instalación

pip install qaradar

O ejecuta sin instalar:

uvx qaradar serve

Desde el código fuente (para desarrollo):

git clone https://github.com/Muratkus/qaradar.git
cd qaradar
pip install -e .

Soporte de Lenguajes

Todo el soporte de lenguajes vive en un solo registro — qaradar/analyzers/languages.py — por lo que agregar un lenguaje es una sola entrada (extensiones, convención de nombres de pruebas, contador de funciones de prueba), consumida tanto por churn como por mapeo de pruebas.

Nivel 1 — De primera clase, probado

LenguajeDetección de pruebasCobertura
Pythontest_x.py, x_test.pyJSON + XML de coverage.py
JavaScript / TypeScriptx.test.*, x.spec.*, x-test.* (React Native)LCOV, JSON de Jest/Istanbul
Gox_test.goPerfil de cobertura de 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

Nivel 2 — Mejor esfuerzo, basado en nombres

Java, Ruby, Rust — detección de pruebas mediante convenciones de nombres. Cobertura mediante XML de Cobertura o LCOV si se emite.

El análisis de cobertura está impulsado por formato, por lo que abarca más ecosistemas que la detección de mapeo de pruebas, que es específica del lenguaje.

Monorepos: los informes de Istanbul/Jest se descubren automáticamente bajo packages/*/coverage y apps/*/coverage, y las rutas de cobertura absolutas/relativas al paquete se normalizan a relativas al repositorio para que se unan correctamente contra las señales de churn y mapeo de pruebas.

Formatos de Cobertura Soportados

FormatoHerramientas
JSON de coverage.pyPython coverage run + coverage json
JSON de Istanbul / Jestcoverage-final.json, coverage-summary.json (Jest/Vitest/nyc)
XML de CoberturaPython, Java/Gradle, .NET (Coverlet)
LCOVJS/TS, Flutter/Dart, C/C++, Rust (grcov)
Perfil de cobertura de Gogo test -coverprofile=cover.out

Ejemplo de Salida

╭──────────────── 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      │
└──────────────────────┴──────────┴───────┴───────────────┘

Seguimiento de Ejecuciones a lo Largo del Tiempo

Por defecto, QA Radar no tiene estado. Opta por la persistencia para rastrear un repositorio a través de ejecuciones y impulsar el re-análisis incremental (diario/semanal, o después de N diffs, o después de que un agente termine el trabajo).

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 es una puerta, no un programador — conéctalo a lo que ya uses:

# cron / CI / git hook: only do expensive work when criteria are met
qaradar should-run . && qaradar analyze . --save

Informa scope: "full" (intervalo transcurrido) o scope: "diff" (suficientes archivos cambiados), para que un agente que llame a la herramienta MCP qaradar_should_run sepa si debe continuar con qaradar_healthcheck o qaradar_pr_risk. El estado es un .qaradar/state.json por repositorio, por lo que una "colección de repositorios" es solo un bucle sobre repositorios en tu propia infraestructura.

Ajusta los criterios en 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 también informa un delta vs. la ejecución anterior — qué archivos se volvieron riesgosos recientemente, cuáles empeoraron, cuáles mejoraron o se resolvieron.

Hoja de Ruta

  • v0.1.2 — Plugin de Claude Code + comandos de barra
  • v0.2.0 — Archivo de configuración (qaradar.toml), validación de lenguajes de Nivel 2, endurecimiento
  • v0.3.0 — Modo consciente de diffs: qaradar_pr_risk + bandera CLI --base
  • v0.4.0 — Cobertura de lenguajes móviles/monorepo (Swift, Kotlin, Obj-C, Dart, React Native, Jest); persistencia de ejecuciones + criterios de re-ejecución (should-run, --save, qaradar_should_run)
  • v0.5.0 — Detección de pruebas flaky desde el historial de CI (análisis de XML de JUnit)

Filosofía

QA Radar se basa en tres creencias:

  1. El cuello de botella se ha movido. La IA hace que escribir pruebas sea fácil. Saber cuáles pruebas importan es la parte difícil.
  2. La calidad es un paisaje, no un número. Un solo porcentaje de cobertura lo oculta todo. El riesgo es por módulo, por señal, por período de tiempo.
  3. Los agentes necesitan contexto. Un asistente de IA de codificación que no conoce las áreas frágiles de tu repositorio escribirá pruebas genéricas. Dale el paisaje de calidad y escribirá pruebas dirigidas.

Licencia

MIT