La navegación de código es una habilidad esencial no solo para los ingenieros de software humanos, sino también para las inteligencias artificiales especializadas en desarrollo de software, conocidas comúnmente como AI SWEs (Artificial Intelligence Software Engineers). A medida que los entornos de desarrollo y las bases de código se vuelven cada vez más complejos, la necesidad de contar con sistemas robustos que permitan una exploración eficiente y precisa de estos códigos es crítica para garantizar productividad, calidad y escalabilidad en el trabajo diario. En Engines, una plataforma diseñada específicamente para potenciar a los AI SWEs, se ha llevado a cabo un análisis exhaustivo sobre distintos métodos y arquitecturas para facilitar la navegación de código. Este análisis no solo se ha centrado en soluciones ya implementadas, sino que también ha explorado herramientas de vanguardia y técnicas provenientes de investigaciones recientes. El objetivo fundamental ha sido entender qué enfoques realmente funcionan para las necesidades únicas de la inteligencia artificial aplicada al desarrollo de software, y cuáles presentan limitaciones que dificultan su adopción generalizada.
Uno de los aspectos más importantes descubiertos es que, al igual que los desarrolladores humanos, los AI SWEs requieren la capacidad de interpretar el contexto de cada archivo y función dentro de un gran repositorio, para poder realizar operaciones como encontrar todas las referencias de una función o navegar a su definición con facilidad. La capacidad de explorar un código base no debe ser algo estático ni fragmentado; debe permitir interacciones dinámicas con múltiples herramientas integradas que funcionen de manera armónica y eficiente. Diversas soluciones han abordado este problema desde diferentes perspectivas. Un ejemplo es SWE-Agent, que utiliza una búsqueda de cadenas de texto a lo largo de todo el repositorio y complementa esta búsqueda con una vista fragmentada que muestra bloques de cien líneas para facilitar la revisión. Por su parte, CodeMonkey opta por ingresar todos los archivos en un LLM pequeño que los clasifica según su relevancia para la consulta actual.
Otro enfoque destacable es el de Moatless, que realiza búsquedas semánticas para determinar qué archivos requieren modificaciones, aumentando así la eficiencia del proceso. Entre estas propuestas, Engines eligió seguir una línea similar a la solución OpenHands, que provee al agente herramientas concretas de navegación, como la función para encontrar todas las referencias de un símbolo o ir directamente a su definición. Esta interfaz recuerda a un servidor de lenguaje (LSP, por sus siglas en inglés), pero con mayores niveles de adaptación y flexibilidad, pensada específicamente para las necesidades de AI SWEs. Uno de los retos centrales en el diseño de esta infraestructura es garantizar que sea escalable y eficiente a lo largo del tiempo. La capacidad de indexar el código no debería duplicar esfuerzos con cada nuevo commit, sino que la indexación debe ser incremental, adaptándose únicamente a los cambios recientes sin necesidad de reindexar repositorios completos.
Además, debe existir la flexibilidad para navegar en cualquier commit arbitrario, sin importar su antigüedad, para facilitar análisis históricos o comparativos. Otro aspecto relevante es la licencia bajo la cual se distribuye la tecnología base. Dado que esta infraestructura será un componente crítico para futuros desarrollos, es vital que el sistema tenga una licencia permisiva que permita modificaciones y extensiones conforme evolucionen las necesidades. Esta condición descarta automáticamente varias opciones populares que emplean licencias restrictivas como AGPL, las cuales implican restricciones comerciales o limitaciones de distribución. Entre las tecnologías exploradas se encuentra lsproxy, una biblioteca creada especialmente para soportar servidores LSP orientados a AI SWEs.
Esta solución es capaz de detectar automáticamente el lenguaje de un proyecto y activar el servidor correspondiente, facilitando un inicio rápido y eficiente. Sin embargo, lsproxy utiliza una licencia AGPL, lo que supone un impedimento para su uso en productos comerciales sin la adquisición de una suscripción. Esto limita su adopción en plataformas que buscan mantener un enfoque abierto y flexible. Por otro lado, Stack Graphs representa una estructura de datos avanzada desarrollada inicialmente por GitHub para su plataforma de navegación de código web. Su diseño se basa en un análisis estático profundo que facilita una indexación incremental, lo que significa que al modificar un archivo solo se reindexa esa parte, no el repositorio completo.
Además, su arquitectura es teóricamente independiente del lenguaje, permitiendo consultas rápidas y efectivas. Sin embargo, su desventaja radica en la limitada compatibilidad con lenguajes y la complejidad para mantener las gramáticas personalizadas necesarias para la construcción de grafos, lo que dificulta su escalabilidad a proyectos multi-lenguaje. Otra herramienta interesante es Glean, un sistema de indexación desarrollado por Meta, diseñado para manejar proyectos extremadamente grandes y complejos, como los de su ecosistema de C++. Glean opera almacenando hechos sobre el código en base a esquemas definidos por el usuario, utilizando un lenguaje declarativo llamado Angle para consultarlos con precisión. Esta plataforma cumple con los requisitos de incrementalidad, escalabilidad y flexibilidad que se buscan.
Además, tiene la virtud de poder trabajar con esquemas generados por SCIP, lo que expande notablemente su soporte multiproceso. Sin embargo, el uso de Glean en entornos open source presenta obstáculos para su integración, principalmente porque su sistema RPC se basa en Thrift con dependencias internas específicas de Meta, complicando la generación de clientes para lenguajes distintos a Haskell. Además, para aprovechar plenamente el sistema se requiere un parser customizado para cada lenguaje, de los cuales solo hay soporte oficial para C++ en la versión pública. Estas dificultades limitan su adopción masiva pese al gran potencial que representa. Multilspy es una biblioteca en Python cuyo objetivo es simplificar la interacción con servidores LSP, ofreciendo facilidades para descargar automáticamente servidores para diferentes lenguajes y un entorno sencillo para operar.
Nació de un proyecto de investigación enfocado en la incorporación de análisis estático a los procesos generados por modelos de lenguaje. Aunque es una herramienta práctica y fácil de usar, existen inconvenientes como la dependencia de mantener un proceso de Python activo para sostener el servidor LSP y la posible falta de control sobre las descargas automáticas de binarios, que pueden no ser ideales en entornos controlados o empresariales. El gigante Sourcegraph también ofrece una API para navegación precisa de código compatible con numerosos lenguajes y repositorios de gran escala. Sin embargo, su modelo de negocio basado en clientes empresariales con suscripciones limita su uso para quienes buscan una infraestructura abierta y modular para AI SWEs, lo que reduce su atractivo para proyectos con una filosofía de libre colaboración y personalización. Tras evaluar todas estas opciones, la conclusión es clara: no existe aún una solución open source ideal que combine un enfoque independiente del lenguaje, incrementabilidad, escalabilidad y facilidad de uso que satisfaga plenamente las necesidades de los AI SWEs.
La combinación de estas características resulta fundamental para construir una plataforma confiable y eficiente que pueda crecer con el tiempo y el tamaño del código. Con este panorama, Engines optó por una solución pragmática y escalonada, basada en el proyecto multilspy, añadiendo un servidor con soporte para MCP (un protocolo para comunicación entre procesos) y un contenedor Docker para facilitar la ejecución en ambientes controlados y aislados. Esta estrategia permite ofrecer funcionalidad inmediata mientras se continúa explorando y desarrollando futuros avances que puedan integrar mejores sistemas de análisis y navegación. La navegación de código para AI SWEs sigue siendo un campo de investigación abierto y apasionante. Los retos técnicos, la necesidad de soporte multi lenguaje, la escalabilidad para repositorios inmensos y la ambición de generar un entorno sencillo pero poderoso son temas en constante evolución.