Problemas derivados de la falta de estandarización y el uso masivo de herramientas modernas

Ricardo García
9 min read
AIDevelopment ToolsStandardsBest Practices

El auge de herramientas de desarrollo asistidas por IA ha transformado radicalmente nuestra forma de trabajar. Editores como Cursor, Windsurf, extensiones como GitHub Copilot, y asistentes de terminal como Aider y Claude code se han convertido en compañeros habituales de muchos equipos de desarrollo. Sin embargo, esta adopción masiva ha traído consigo un problema emergente: la ausencia de estándares sobre cómo integrar estas herramientas en nuestros proyectos.

Cada herramienta genera sus propios archivos de configuración (.cursorrules, .aider.conf.yml, .github/copilot-instructions.md, directorios .idea, .claude, .vscode...) que terminan invadiendo nuestros repositorios, planteando preguntas incómodas sobre gestión de versiones, acoplamiento tecnológico y separación de responsabilidades.

El dilema del versionado

Estos archivos de configuración tienen una característica particular: modifican los system prompts de los modelos de lenguaje, condicionando significativamente las respuestas que recibimos. Esto genera un debate legítimo sobre si deberían formar parte del control de versiones.

Los argumentos a favor del versionado son razonables: consistencia entre miembros del equipo, onboarding simplificado, documentación implícita de convenciones y la posibilidad de mejorar colaborativamente estos contextos.

Pero los argumentos en contra también son sólidos: contaminación del repositorio con preferencias personales, acoplamiento a herramientas específicas, violación del principio de independencia de herramientas, y la generación de ruido innecesario en el historial del proyecto.

La raíz del problema no está en elegir uno u otro enfoque, sino en algo más fundamental: estamos intentando versionar implementaciones cuando deberíamos estar versionando interfaces.

La lección del mundo físico: el ejemplo de los tornillos

Pensemos en cómo funciona un producto manufacturado, como un automóvil. Cuando un fabricante diseña un coche, incorpora tornillos con diferentes tipos de cabeza: Allen, Torx, Phillips, Pozidriv... Cada tornillo especifica qué tipo de herramienta se necesita para trabajar con él, pero nunca especifica una marca concreta.

El producto dice "este componente requiere un Allen hexagonal de 5mm", no "este componente requiere un destornillador Bosch Professional modelo 2607019510". La cabeza del tornillo actúa como una interfaz estandarizada entre el producto y las herramientas.

Esta separación tiene beneficios claros:

  • El producto es independiente del fabricante de herramientas: puedes usar Bosch, Makita, Stanley o la marca que prefieras
  • Las herramientas son intercambiables: si tu destornillador se rompe, cualquier Allen de 5mm servirá
  • La especificación es clara y universal: un Allen de 5mm es un Allen de 5mm en cualquier lugar del mundo
  • No hay acoplamiento innecesario: el coche no incluye las herramientas soldadas a cada tornillo

El problema del software: ausencia de interfaces

En desarrollo de software, no tenemos ese equivalente estandarizado para las herramientas de IA y muchas otras herramientas modernas. No existe una "cabeza de tornillo" común que nos permita decir "este proyecto necesita asistencia de IA con el siguiente contexto arquitectónico" de forma independiente de la herramienta específica.

En su lugar, tenemos:

  • .cursorrules para Cursor
  • .aider.conf.yml para Aider
  • .claude para Claude code
  • .github/copilot-instructions.md para GitHub Copilot
  • Configuraciones específicas en .vscode/, .idea/, etc.

Cada herramienta define su propio formato, su propia ubicación, su propia sintaxis. Es como si cada fabricante de destornilladores hubiera inventado su propio tipo de cabeza de tornillo incompatible con el resto.

Las consecuencias prácticas

Esta falta de estandarización genera varios problemas:

1. Acoplamiento tecnológico involuntario

Cuando versionamos .cursorrules, estamos acoplando nuestro proyecto a Cursor. Si mañana el equipo decide cambiar a otra herramienta, ese archivo queda obsoleto pero permanece en el repositorio y en todo su historial.

2. Contaminación del repositorio

El .gitignore termina convirtiéndose en un catálogo de herramientas que el equipo (o individuos del equipo) han usado en algún momento. Paradójicamente, el archivo que debería mantener limpio el repositorio se convierte en evidencia de su contaminación.

3. Fragmentación del conocimiento

El contexto importante del proyecto (arquitectura, convenciones, patrones) queda disperso en múltiples formatos propietarios según qué herramienta use cada desarrollador, en lugar de estar centralizado y accesible para todos.

4. Barrera de entrada artificial

Los nuevos miembros del equipo deben adoptar herramientas específicas para aprovechar el contexto existente, o recrear ese contexto en el formato de sus herramientas preferidas.

Hacia una solución: definir interfaces, no implementaciones

La solución conceptual es clara, aunque su implementación práctica sea compleja: necesitamos separar la especificación de la necesidad (la interfaz) de la herramienta concreta que la satisface (la implementación).

Principio 1: El proyecto define necesidades, no herramientas

Un proyecto debería poder especificar:

  • "Este proyecto necesita formateo automático según estos estándares"
  • "Este código debe analizarse con estas reglas de linting"
  • "Las herramientas de IA deberían conocer estos patrones arquitectónicos"

Sin especificar:

  • "Este proyecto usa Prettier versión X"
  • "Debes usar ESLint con este plugin específico"
  • "Configura Cursor con este archivo"

Principio 2: Separar conocimiento del proyecto de configuración de herramientas

El conocimiento sobre el proyecto (arquitectura, convenciones, contexto del dominio) debería residir en ubicaciones agnósticas a herramientas, como:

/docs
  /architecture
  /conventions
  /ai-context

Cada desarrollador configuraría su herramienta preferida para leer de estas ubicaciones comunes, similar a cómo las herramientas de linting leen de configuraciones estandarizadas.

Principio 3: Interfaces públicas, implementaciones privadas

Lo que va al repositorio es la interfaz (qué necesita el proyecto). Lo que queda fuera es la implementación (qué herramienta específica usa cada desarrollador y cómo la configura).

El camino hacia la estandarización ya ha comenzado: AGENTS.md

La buena noticia es que el camino hacia la estandarización ya está en marcha. AGENTS.md es un formato simple y abierto para guiar a los agentes de código que ya está siendo adoptado por más de 20,000 proyectos de código abierto. Piensen en AGENTS.md como un archivo README, pero diseñado específicamente para agentes de IA.

¿Qué es AGENTS.md?

AGENTS.md se posiciona como un complemento a la documentación tradicional, ofreciendo contexto legible por máquinas que complementa archivos orientados a humanos como README.md. AGENTS.md complementa el README al contener el contexto extra y a veces detallado que los agentes de código necesitan: pasos de construcción, pruebas y convenciones que podrían saturar un README o no ser relevantes para colaboradores humanos.

El archivo incluye típicamente:

  • Instrucciones del entorno de desarrollo
  • Comandos de construcción y pruebas
  • Directrices de estilo de código
  • Instrucciones para pull requests
  • Consideraciones de seguridad
  • Cualquier contexto que le dirías a un nuevo compañero de equipo

Un esfuerzo colaborativo de la industria

Google, OpenAI, Factory, Sourcegraph y Cursor lanzaron conjuntamente AGENTS.md como un estándar abierto simple diseñado para proporcionar a los agentes de código una forma predecible de entender y operar proyectos de software. Actualmente, las definiciones de agentes son compatibles con un ecosistema creciente de agentes y herramientas de código de IA, incluyendo las herramientas más populares del mercado.

El paralelismo con los tornillos

AGENTS.md es precisamente el tipo de interfaz estandarizada que necesitábamos. Es el equivalente a decir "este proyecto requiere un Allen de 5mm" en lugar de "este proyecto requiere un destornillador Bosch". En lugar de introducir otro archivo propietario, eligieron un nombre y formato que podría funcionar para cualquiera.

El formato es deliberadamente simple: Markdown estándar en un archivo con un nombre predecible. Cualquier herramienta puede leerlo, cualquier desarrollador puede editarlo, y no hay dependencia de un ecosistema propietario específico.

Flexibilidad para proyectos complejos

La flexibilidad se extiende a monorepos grandes, donde archivos AGENTS.md anidados pueden proporcionar instrucciones a nivel de paquete. Los agentes leen automáticamente el archivo más cercano en el árbol de directorios, asegurando que los subproyectos reciban orientación personalizada.

El camino pragmático mientras el estándar madura

Aunque AGENTS.md representa un avance significativo, aún estamos en las primeras etapas de adopción. Mientras el estándar madura y se consolida en la industria, podemos tomar decisiones pragmáticas:

A nivel de repositorio:

  • Adoptar AGENTS.md como punto central de documentación para herramientas de IA
  • Mantener archivos específicos de herramientas fuera del control de versiones
  • No contaminar el .gitignore con preferencias personales (usar configuración global de Git)
  • Versionar únicamente el conocimiento del proyecto en formatos agnósticos

A nivel de equipo:

  • Documentar en AGENTS.md qué tipos de herramientas son útiles para el proyecto
  • Proporcionar ejemplos de configuración para herramientas populares en la documentación
  • Permitir que cada desarrollador elija sus herramientas manteniendo acceso al contexto común

A nivel individual:

  • Desarrollar frameworks personales para gestionar configuraciones de herramientas
  • Usar configuraciones globales de Git para ignorar archivos de herramientas personales
  • Contribuir al AGENTS.md del proyecto con conocimiento útil para todo el equipo

Conclusión

El uso masivo de herramientas modernas de desarrollo, especialmente las asistidas por IA, ha revelado una carencia importante en nuestra industria: la falta de interfaces estandarizadas que separen qué necesita un proyecto de cómo se satisfacen esas necesidades.

El mundo físico resolvió este problema hace décadas con especificaciones como los tornillos hexagonales o las medidas métricas. En software seguimos mezclando la especificación con la implementación, acoplando proyectos a herramientas concretas y contaminando repositorios con preferencias tecnológicas.

La aparición de AGENTS.md marca un punto de inflexión importante. Por primera vez, tenemos un estándar emergente respaldado por los principales actores de la industria que nos permite especificar las necesidades del proyecto de forma agnóstica a herramientas. Es la "cabeza de tornillo" que nos faltaba.

AGENTS.md se está comparando con los primeros días de README.md, una convención inicialmente simple que desde entonces se ha vuelto fundamental en el código abierto. Estamos presenciando potencialmente el nacimiento de un nuevo estándar que podría definir cómo los proyectos de software se comunican con las herramientas de IA durante los próximos años.

La solución pasa por cambiar nuestra mentalidad: dejar de pensar en "¿versionamos los archivos de Cursor?" y empezar a pensar en "¿cómo especificamos las necesidades del proyecto en AGENTS.md?". Solo así podremos aprovechar la innovación vertiginosa en herramientas de desarrollo sin comprometer la longevidad y claridad de nuestros proyectos.

Porque al final, un buen proyecto debería ser como un buen coche: debería funcionar independientemente de qué destornillador uses para mantenerlo. Y con AGENTS.md, finalmente estamos empezando a estandarizar las cabezas de los tornillos.