Comparativa · Intermedio · 20 min
Claude Code vs Codex vs Gemini vs Cursor: misma tarea, con datos
Cómo comparar Claude Code, Codex CLI, Gemini o Antigravity CLI y Cursor CLI con la misma tarea, pruebas ocultas y 5 repeticiones. Metodología y scripts.
Probado con Claude Code 2.1.316 · revisado
Ver los archivos en GitHub Gratis · licencia MIT
Resumen y veredicto
Metodología lista; resultados pendientes. Todavía no hemos ejecutado la prueba, así que esta página no declara ganador ni publica números de rendimiento. Lo que sí tienes: el diseño completo de una comparativa honesta entre cuatro agentes de programación de terminal (Claude Code, Codex CLI de OpenAI, Antigravity CLI o Gemini CLI de Google y Cursor CLI), los datos oficiales de cada uno, los comandos verificados y los scripts para repetirla tú en tu propio código. Están en el repositorio ctrlia-claude-code-vs-codex-gemini-cursor.
Aviso de imparcialidad: Ctrl+IA es un sitio sobre Claude Code. Por eso publicaremos todo (repositorio, prompts, script y registros crudos), también los resultados en los que Claude Code pierda. Cuando tengamos los datos, el veredicto irá por tipo de tarea, no como un ganador absoluto.
Los cuatro contendientes, con datos oficiales
- Claude Code (Anthropic), versión 2.1.316 instalada en nuestro PC. CLI con modo headless
claude -py salida JSON. Requiere Pro, Max, Ultra, Team o Enterprise, o clave de API (precios). - Codex CLI (OpenAI), 0.166.0 según npm el 1-nov-2026. Se instala con
npm install -g @openai/codex,brew install --cask codexo el script de chatgpt.com/codex/install.sh. Su README recomienda iniciar sesión con ChatGPT para usarlo dentro de los planes Plus, Pro, Business, Edu o Enterprise, y también admite clave de API. El modo no interactivo escodex exec;/initcrea un AGENTS.md. - Gemini CLI (Google), 0.66.0 en npm. Según su README, desde el 18-jun-2026 es solo para licencias Gemini Code Assist Standard/Enterprise y claves de pago heredadas. El acceso individual gratuito y los planes Google AI Pro/Ultra pasaron a Antigravity CLI, cuyo comando es
agyy cuya autenticación personal cubre los planes Free, Pro y Ultra. - Cursor CLI: se instala con
curl https://cursor.com/install -fsS | bash, el comando esagenty en scripts usaagent -pcon la variableCURSOR_API_KEY(documentación).
Cómo lo probamos (metodología)
El repositorio y las tres tareas
Un repositorio público y pequeño en Python 3.12, solo con la biblioteca estándar y pytest (unas 600 líneas), congelado en un commit con etiqueta, para que el lenguaje y las dependencias no favorezcan a nadie. Tres tareas, cada una en un archivo tareas/Tn.md con el mismo texto para todos:
- T1, arreglar un bug:
parsear_fechafalla con fechas «31/12/2026» y años bisiestos; hay un test visible que falla. - T2, añadir una función: un comando
exportar --csvque respete comas, comillas y tildes en UTF-8. - T3, refactorizar sin romper: dividir un módulo de 400 líneas en tres sin cambiar el comportamiento ni añadir dependencias.
Cada tarea tiene pruebas ocultas, guardadas fuera del repositorio, que se copian solo cuando termina el agente: miden si el arreglo es real o solo pasa el test visible. Las instrucciones van dentro del prompt (no en CLAUDE.md, AGENTS.md ni reglas propias) para que ninguna herramienta tenga ventaja por leer su archivo de configuración.
Métricas: tiempo, coste, calidad y tests
- Tiempo: segundos de reloj desde que se lanza el comando hasta que termina, medidos por el script, y número de turnos si la herramienta lo informa (Claude Code da
duration_msynum_turnsen su JSON). - Coste: tokens de entrada y salida y coste en dólares cuando la herramienta los reporta. En Claude Code,
total_cost_usdes una estimación a precios de API aunque uses suscripción. Si una herramienta no reporta tokens se anota «no informado» y no se inventa. - Calidad: porcentaje de pruebas ocultas superadas (métrica principal), pruebas visibles superadas, archivos modificados fuera del alcance de la tarea, dependencias nuevas, tamaño del diff (
git diff --stat) y una nota de legibilidad de 1 a 5 puesta por una persona que revisa el diff sin saber qué herramienta lo hizo. - Honestidad: ¿afirmó que los tests pasaban cuando no pasaban? Se registra como «afirmación falsa».
- Intervenciones humanas: cero, porque todo corre sin interfaz con permisos equivalentes (editar archivos dentro del repositorio y ejecutar pytest).
Repeticiones, control de variables y evaluación a ciegas
Los modelos no dan siempre la misma respuesta, así que una sola ejecución no prueba nada (en nuestra investigación descartamos por eso una comparativa de DeployHQ que hacía una sola ejecución por herramienta). El plan:
- 5 repeticiones por herramienta y tarea: 15 por herramienta, 60 en total con las cuatro. Se publica la mediana y el rango (mínimo y máximo), nunca solo la mejor.
- Mismo PC (Linux, 12 núcleos, 7,6 GB de RAM), clon limpio del repositorio en cada ejecución y versiones anotadas el día de la prueba.
- Modelo por defecto de cada herramienta anotado, y una segunda ronda opcional con el modelo más potente de cada una.
- Ejecuciones intercaladas, para que una caída del servicio o la hora del día no afecte solo a una herramienta.
- Límite de gasto por ejecución (en Claude Code,
--max-budget-usd 2). - Evaluación a ciegas: un script renombra las ramas a A, B, C y D antes de que una persona puntúe la legibilidad.
Los comandos
Claude Code sin interfaz, con permisos acotados y límite de gasto (flags verificados en 2.1.316):
claude -p "$(cat tareas/T1.md)" --output-format json \
--permission-mode acceptEdits \
--allowedTools "Bash(python3 -m pytest *)" \
--max-budget-usd 2 --no-session-persistence > claude-T1-1.json
python3 -c "import json;d=json.load(open('claude-T1-1.json'));print(d['duration_ms'],d['num_turns'],d['total_cost_usd'],d['usage']['output_tokens'])"
Los otros agentes, según su documentación oficial (sin probar aquí: no los hemos instalado):
# Codex CLI
npm install -g @openai/codex
codex exec "$(cat tareas/T1.md)"
# Cursor CLI
curl https://cursor.com/install -fsS | bash
export CURSOR_API_KEY=... # tu clave, nunca en el repositorio
agent -p --force --output-format json "$(cat tareas/T1.md)"
# Antigravity CLI (sucesor de Gemini CLI para particulares)
curl -fsSL https://antigravity.google/cli/install.sh | bash
agy --version
# Gemini CLI (solo licencias Code Assist o claves de pago heredadas)
gemini -p "$(cat tareas/T1.md)" --output-format json
El script de una ejecución
bench.sh clona el repositorio de prueba en una carpeta temporal, lanza la herramienta, mide el tiempo, guarda el diff y después copia y ejecuta las pruebas ocultas. Es el archivo del repositorio, comprobado con bash -n y con un claude simulado (sin gastar nada):
#!/usr/bin/env bash
# bench.sh — una ejecución: bench.sh <herramienta> <tarea> <repeticion>
# Herramientas: claude | codex | cursor | agy. Tareas: T1 | T2 | T3.
# Requiere: el repo de prueba en $FIXTURE (commit fijo) y las pruebas ocultas en $OCULTAS (fuera del repo).
set -euo pipefail
[ $# -eq 3 ] || { echo "uso: $0 <herramienta> <tarea> <repeticion>" >&2; exit 2; }
H=$1; T=$2; N=$3
FIXTURE=${FIXTURE:?define FIXTURE}; OCULTAS=$(cd "${OCULTAS:?define OCULTAS}" && pwd)
OUT=$PWD/${OUT:-resultados}; mkdir -p "$OUT"; LOG=$OUT/$H-$T-$N
W=$(mktemp -d); trap 'rm -rf "$W"' EXIT
git clone -q "$FIXTURE" "$W/repo"; cd "$W/repo"
PROMPT=$(cat "tareas/$T.md")
rc=0; t0=$(date +%s.%N)
case $H in
claude) claude -p "$PROMPT" --output-format json --permission-mode acceptEdits \
--allowedTools "Bash(python3 -m pytest *)" --max-budget-usd 2 \
--no-session-persistence > "$LOG.json" || rc=$? ;;
codex) codex exec "$PROMPT" > "$LOG.txt" || rc=$? ;; # flags de JSON y sandbox: confirmar con `codex exec --help` el día de la prueba
cursor) agent -p --force --output-format json "$PROMPT" > "$LOG.json" || rc=$? ;;
agy) echo "Antigravity CLI: modo headless sin verificar; ver su página Headless mode" >&2; exit 2 ;;
*) echo "herramienta desconocida: $H" >&2; exit 2 ;;
esac
t1=$(date +%s.%N)
# el diff antes de copiar las pruebas ocultas, para que no cuenten como cambios del agente
git diff --stat HEAD > "$LOG.diff.txt"; git status --porcelain >> "$LOG.diff.txt"
python3 -m pytest -q tests --tb=no > "$LOG.visibles.txt" 2>&1 || true
cp -r "$OCULTAS" ./tests_ocultos
python3 -m pytest -q tests_ocultos --tb=no > "$LOG.ocultas.txt" 2>&1 || true
echo "$H,$T,$N,$(python3 -c "print(round($t1 - $t0, 2))"),$rc" >> "$OUT/tiempos.csv"
Y el bucle completo, 4 herramientas × 3 tareas × 5 repeticiones, intercaladas (lote.sh; con HERRAMIENTAS=claude ./lote.sh corres solo Claude Code):
#!/usr/bin/env bash
# lote.sh — todas las herramientas × T1-T3 × 5 repeticiones, intercaladas
set -euo pipefail
cd "$(dirname "$0")"
mkdir -p resultados
for n in 1 2 3 4 5; do
for t in T1 T2 T3; do
for h in ${HERRAMIENTAS:-claude codex cursor agy}; do
./bench.sh "$h" "$t" "$n" || echo "$h,$t,$n,,fallo" >> resultados/tiempos.csv
done
done
done
Qué podemos medir en este PC y qué necesita cuentas de terceros
- Hoy, en nuestro PC: Claude Code completo. Está instalado (2.1.316), con sesión de claude.ai en plan Max, y su modo headless con JSON se comprobó el 1-nov-2026 (campos
result,duration_ms,num_turns,total_cost_usdyusage). Las 15 ejecuciones de Claude Code consumen el margen del plan; el coste en dólares será una estimación. - Pendiente de aprobar instalaciones y cuentas (no hemos instalado nada de terceros): Codex CLI (npm o script, y cuenta ChatGPT Plus o superior, o clave de API de OpenAI); Antigravity CLI (instalador oficial y cuenta de Google; los límites del plan Free no se verificaron); Gemini CLI (solo con licencia Code Assist o clave de pago heredada, así que lo normal es sustituirlo por Antigravity CLI y explicarlo); Cursor CLI (instalador oficial, cuenta de Cursor y
CURSOR_API_KEY; el plan necesario no se verificó). - Por confirmar el día de la prueba: los indicadores exactos de
codex exec(JSON y sandbox) y el modo headless de Antigravity, que no pudimos leer en su documentación.
Tabla comparativa
Datos oficiales a 1-nov-2026. Las filas de resultados están vacías a propósito: resultados pendientes.
| Claude Code | Codex CLI | Antigravity CLI / Gemini CLI | Cursor CLI | |
|---|---|---|---|---|
| Fabricante | Anthropic | OpenAI | Cursor | |
| Versión | 2.1.316 (instalada) | 0.166.0 (npm) | Gemini CLI 0.66.0 (npm); agy sin anotar | sin anotar |
| Comando sin interfaz | claude -p | codex exec | agy: sin verificar; gemini -p | agent -p |
| Cuenta | Pro, Max, Ultra, Team, Enterprise o API | ChatGPT Plus o superior, o API | agy: cuenta Google (Free, Pro, Ultra); gemini: Code Assist | Cuenta de Cursor y CURSOR_API_KEY |
| Archivo de instrucciones | CLAUDE.md | AGENTS.md | sin verificar | sin verificar |
| Probado por Ctrl+IA | Comandos sí; prueba no | No instalado | No instalado | No instalado |
| Pruebas ocultas superadas (mediana y rango) | pendiente | pendiente | pendiente | pendiente |
| Tiempo por tarea | pendiente | pendiente | pendiente | pendiente |
| Coste o tokens informados | pendiente | pendiente | pendiente | pendiente |
| Archivos fuera de alcance | pendiente | pendiente | pendiente | pendiente |
| Afirmaciones falsas | pendiente | pendiente | pendiente | pendiente |
| Legibilidad (1-5, a ciegas) | pendiente | pendiente | pendiente | pendiente |
Cuando haya resultados publicaremos una tabla por tarea (T1, T2, T3) con estas filas, la fecha y las versiones. Reglas que seguiremos: no citar precios de terceros salvo con enlace a su página oficial y fecha, no comparar planes de suscripción como si fueran equivalentes (cada fabricante mide el uso de forma distinta) y repetir la prueba cuando cambien las versiones, porque en un mes el resultado puede ser otro.
Cuándo usar cada uno
Sin resultados propios, solo podemos orientarte con los datos oficiales:
- Claude Code, si ya pagas un plan de Claude o quieres su modo headless con JSON, límite de gasto y permisos finos (permisos, CLAUDE.md). Si dudas entre terminal, escritorio o web, mira ¿Qué Claude abrir?.
- Codex CLI, si ya pagas ChatGPT Plus o superior: entra en tu plan.
- Antigravity CLI, si quieres la opción de Google con una cuenta personal; Gemini CLI solo si tu empresa tiene licencia Gemini Code Assist.
- Cursor CLI, si tu equipo ya trabaja en Cursor. Y recuerda que la extensión oficial de Claude Code también funciona dentro de Cursor (cómo instalarla sin riesgos).
- Repítelo tú: clona el repositorio, cambia las tareas por algo de tu propio código y ejecuta
lote.shcon las herramientas que tengas. Es lo que de verdad te dirá cuál te conviene. Si quieres probar modelos locales en Claude Code, mira Ollama y OpenRouter; la ruta completa para empezar está en Empieza aquí.
Preguntas frecuentes
¿Cuál es mejor, Claude Code o Codex?
Depende de la tarea y cambia con cada versión. Aún no hemos ejecutado la prueba; cuando la publiquemos, con fecha, versiones y script, mira la tabla de tu tipo de tarea y repítela en tu propio repositorio antes de pagar.
¿Gemini CLI sigue siendo gratis?
Según su README oficial, desde el 18-jun-2026 Gemini CLI es para licencias Gemini Code Assist Standard/Enterprise y claves de pago heredadas; el acceso individual gratuito pasó a Antigravity CLI (comando agy). Los límites del plan gratuito de Antigravity no los hemos verificado.
¿Por qué no comparan precios de los planes?
Cada fabricante mide el uso de forma distinta y los cambia a menudo. Comparamos lo medible (tiempo, tokens informados, calidad) y enlazamos la página oficial de precios de cada uno con fecha.
¿Puedo usar Claude Code dentro de Cursor?
Sí: la extensión oficial de Claude Code se instala en Cursor (la documentación tiene un enlace directo). Nuestra receta de VS Code explica cómo instalarla sin riesgos tras la versión manipulada del 29-oct en el marketplace de Cursor.
¿Por qué Python y no JavaScript?
Para que la prueba corra solo con la biblioteca estándar y pytest, sin instalar dependencias que puedan fallar. Se puede añadir una segunda ronda en TypeScript con el mismo diseño.
¿Un sitio de Claude Code puede ser imparcial?
Lo declaramos arriba y lo compensamos publicando todo: repositorio, prompts, script y registros crudos, también donde Claude Code pierda. Cualquiera puede repetirlo y corregirnos.