Saltar al contenido

Integración

becwright + Claude Code: guardrails deterministas

CLAUDE.md es consultivo; becwright es la capa que impone. Frena secretos y restos de debug en los commits de Claude Code con un hook de git determinista.

Última actualización

Claude Code produce código rápido, y todo equipo que lo usa acaba viendo el mismo patrón de fallo: el agente commitea un debugger suelto, un volcado de console.log o una API key hardcodeada — aunque CLAUDE.md diga, con todas las letras, que no lo haga. No es un bug de Claude; es la naturaleza de las instrucciones. becwright es un motor determinista de guardrails pre-commit: en vez de pedirle al agente que se porte bien, verifica el código real en el momento del commit y lo frena (código de salida 1) cuando una regla blocking falla. Mantén CLAUDE.md como el lugar donde describes cómo quieres el código; becwright es la capa de enforcement que vuelve innegociable lo innegociable.

¿Por qué CLAUDE.md solo no puede imponer reglas?

CLAUDE.md es contexto, no un contrato. El agente lo lee al inicio de la sesión y normalmente lo sigue — pero ese “normalmente” carga con mucho peso:

  • Las reglas compiten por atención. Tu línea de “nunca commitees secretos” comparte la ventana de contexto con la tarea, el código y toda la conversación. En una sesión larga, sobre todo tras una compactación de contexto, puede sencillamente perder.
  • El cumplimiento es probabilístico. La misma instrucción que ayer se respetó hoy puede saltarse, porque los modelos de lenguaje no ejecutan reglas — las ponderan contra todo lo demás en contexto.
  • Los hooks de Claude Code protegen una sesión. El sistema de hooks propio de Claude Code puede ejecutar comandos alrededor del uso de herramientas, y es útil de verdad — pero restringe a ese agente, en esa sesión. No hace nada frente a un segundo agente, el editor de un compañero, o tú a la 1 a.m.

becwright toma el enfoque opuesto: un hook de git pre-commit nativo corre tus reglas sobre los archivos staged en cada commit, lo haga quien — o lo que — lo haga. La regla pasa o no pasa, sin importar qué modelo produjo el cambio. Si quieres impedir que Claude Code commitee secretos, este es el mecanismo que realmente lo impide en lugar de solicitarlo. Cómo se relaciona esto con el framework clásico del espacio está en becwright vs pre-commit.

Instalación

Los paquetes de npm traen un binario autónomo, así que no necesitas Python:

npm install --save-dev becwright   # o: pnpm add -D becwright
pipx install becwright             # alternativa para plataformas fuera de los binarios npm

Después genera las reglas y el hook con un solo comando:

becwright init

init detecta si el repo tiene archivos Python o JS/TS, escribe un .bec/rules.yaml inicial con reglas acordes e instala el hook de git. El recorrido completo de tres minutos está en el quickstart.

El plugin de Claude Code

No hace falta salir del chat para nada de lo anterior. becwright tiene un plugin de primera clase para Claude Code, instalable desde su marketplace:

/plugin marketplace add DataDave-Dev/becwright
/plugin install becwright@becwright

El plugin no incluye becwright dentro — instala el paquete publicado (npm/PyPI) en tu proyecto. Lo que agrega:

  • Una skill becwright. Le enseña al agente qué es becwright, cómo instalarlo (npm/pnpm sin Python, o pipx), cómo generar reglas y cómo leer y arreglar la salida de check. Claude la invoca automáticamente cuando pides “un guardrail”, “un check pre-commit” o “una regla que no se pueda ignorar”.
  • Un comando /becwright — un punto de entrada directo con cuatro subcomandos:
ComandoQué hace
/becwright initInstala becwright y genera .bec/rules.yaml + hook
/becwright checkCorre las reglas y resume PASS / WARN / BLOCK
/becwright add <regex-o-url>Agrega una regla forbid o importa un BEC
/becwright statusReporta instalación + hook + número de reglas

¿Cómo reacciona el agente a un commit frenado?

Aquí es donde el diseño rinde. Cuando Claude Code ejecuta git commit y una regla blocking falla, el hook sale con 1 y git rechaza el commit. El agente entonces corre becwright check --json y recibe resultados estructurados:

{
  "blocked": true,
  "results": [
    {
      "id": "no-ai-debug-leftovers",
      "severity": "blocking",
      "passed": false,
      "intent": "Ninguna sentencia debugger ni llamada a console.log puede llegar a un commit.",
      "why_it_matters": "Un 'debugger' olvidado detiene la ejecución en producción.",
      "output": "src/api/client.ts:42\n      > debugger;"
    }
  ]
}

Cada regla que falla lleva su intent (qué exige la regla) y su why_it_matters (por qué existe). El agente no solo sabe que fue frenado — lee por qué, arregla el código para satisfacer la intención y vuelve a commitear. El ciclo se cierra sin un humano dentro, y sin que un debugger llegue jamás al historial. check --json no necesita dependencias extra y funciona desde el binario autónomo; el esquema está documentado en MCP y salida JSON.

Ejemplo: frenar restos de debug de la IA

El código generado por IA tiene un fallo de firma: andamiaje de debug que el agente usó mientras iteraba y luego olvidó. Un BEC en .bec/rules.yaml lo cierra:

rules:
  - id: no-ai-debug-leftovers
    intent: >
      Ninguna sentencia debugger ni llamada a console.log puede llegar a un
      commit.
    why_it_matters: >
      Los agentes agregan salida de debug mientras iteran y suelen olvidar
      quitarla; un 'debugger' olvidado detiene la ejecución en producción.
    paths:
      - "src/**/*.js"
      - "src/**/*.ts"
    check: "becwright run forbid --pattern '\\bdebugger\\b|console\\.log\\('"
    severity: blocking

El check integrado forbid acepta cualquier regex (más --ignore-case y --message), así que la mayoría de los guardrails no requieren código propio. Para credenciales existe el check integrado hardcoded_secrets, que detecta claves de AWS, claves privadas y asignaciones password = "..." — y reglas listas para usar que importas con becwright import <url> desde el catálogo, sin escribir nada. Si un patrón aparece de forma legítima, un comentario becwright: ignore en esa línea lo exime.

Próximos pasos

  • Consigue un repo protegido en unos tres minutos con el quickstart.
  • Mira las otras vías de integración — servidor MCP y CLI directa — en Agentes de IA.
  • ¿Ya usas pre-commit? Se complementan — el detalle está en becwright vs pre-commit.