lx: una herramienta de vibe coding bajo el control total del desarrollador
(github.com/chebread)Introducción
Hola. Soy un estudiante interesado en la ingeniería informática. Esta vez desarrollé un programa llamado lx y quise hacer mi primera publicación en GeekNews, donde hasta ahora solo leía artículos.
Últimamente está de moda el vibe coding, donde le das instrucciones en lenguaje natural a una IA y ella se encarga de escribir todo el código.
A mí este tipo de vibe coding me da miedo.
No se trata simplemente del miedo a perder el trabajo, sino de la sensación de pérdida en la programación al ver que nos están quitando "la diversión de escribir código (Wrangling code) (fuente: Kent Beck - Augmented Coding: Beyond the Vibes)" y también "el control del desarrollador".
Algunos dicen que este cambio es una evolución natural de la programación, como el paso de las tarjetas perforadas al lenguaje máquina, ensamblador y C. Pero yo creo que esa comparación es incorrecta.
Las abstracciones del pasado eran un proceso para ponerle al desarrollador "un mejor martillo" en la mano.
Las herramientas siguieron evolucionando, pero quien blandía el martillo seguía siendo el ser humano, y el resultado estaba completamente bajo el control del desarrollador.
Pero la codificación con IA de hoy es distinta.
Ahora el robot es quien blande el martillo, y el desarrollador queda reducido a mirar o, con suerte, a tratar de persuadir un poco al robot.
Si ya no podemos blandir el martillo, entonces creo que eso ya no puede llamarse programación.
Porque ya no está completamente bajo nuestro control.
Por eso hice lx.
lx es una herramienta que le quita el martillo al robot y lo vuelve a poner en manos del desarrollador.
lx permite tratar a la IA como una herramienta estrictamente controlable.
Desarrollo
lx tiene la filosofía de "la interfaz la hace el humano, la lógica la hace la IA".
El desarrollador define las entradas, salidas y el propósito de una función para establecer un "contrato", y la IA solo se encarga de la implementación interna de esa función.
Este enfoque garantiza la continuidad del desarrollo.
En el momento en que se escriben las entradas y salidas de una función, esa lógica ya se considera completada.
El programador puede seguir escribiendo de inmediato la lógica de nivel superior sin quedar atrapado en la implementación detallada, manteniendo así el flujo de desarrollo sin interrupciones.
Además, lx no es una simple sustitución de texto. Usa el paquete github.com/tree-sitter/go-tree-sitter para parsear el código fuente basándose en AST (árbol de sintaxis abstracta). Por eso no contamina otro código, comentarios ni la indentación dentro del archivo, y reemplaza de forma segura únicamente la lógica del alcance especificado.
Uso básico
La forma básica de usar lx es la siguiente.
package main
import (
"fmt"
lx "github.com/chebread/lxgo"
)
func main() {
var year string = "2025-01-02"
// El desarrollador controla las llamadas de función y el flujo.
result1 := LX_GetYear(year)
var age = 30
result2 := LX_GetAge(age)
fmt.Println(result1, result2)
}
func LX_GetYear(year string) (result string) {
// Prompt que se le enviará a la IA
lx.Generate("Convertir el formato yyyy-dd-mm a una fecha al estilo coreano")
return
}
func LX_GetAge(year int) (result string) {
// Para quienes no quieran instalar por separado la librería de lx según el lenguaje de programación, también se admite la forma de marcador con comentario lx() como abajo.
// lx("Convertir la edad coreana a edad internacional")
return
}
En el código anterior, la función LX_GetYear es el contrato definido por el desarrollador.
Cuando se ejecuta la herramienta lx, reconoce lx.Generate(...) o el marcador // lx(...), envía el prompt al LLM y sobrescribe el cuerpo de esa función con código realmente funcional.
En ese momento se aplica una optimización de tokens. En lugar de enviar el archivo completo, solo se mandan al LLM la firma de la función y el prompt, lo que reduce costos y mejora la seguridad.
2. Control del desarrollador
Aunque la IA escriba la lógica interna de una función lx, quien debe usar esa función sigue siendo el desarrollador.
Sin embargo, si se mezcla lógica personalizada dentro de una función lx, esta se ignora, por lo que se puede mantener el control mediante una función wrapper como se muestra a continuación.
package test
import (
"fmt"
lx "github.com/chebread/lxgo"
)
func main() {
var year string = "2025-01-02"
result1 := ParseYear(year) // Llamada a la función wrapper
fmt.Println(result1)
}
// Lógica de negocio controlada por el desarrollador
func ParseYear(year string) string {
// Usa la lógica generada por IA como si fuera un componente
res := LX_GetYear(year)
// El procesamiento adicional del resultado queda en manos del desarrollador
foo := fmt.Sprintf("¡Hoy es %v!", res)
return foo
}
func LX_GetYear(year string) (result string) {
lx.Generate("Convertir el formato yyyy-dd-mm a una fecha al estilo coreano")
return
}
3. Gestión segura de dependencias y transparencia
lx busca seguir el principio de responsabilidad única (SRP).
Solo genera código; no compila ni ejecuta el programa.
Además, si el código generado por la IA requiere librerías externas, lx no instala paquetes por su cuenta.
-
Code: indicar un comentario
// lx-dep: ...en la parte superior del código generado -
Output: reportar en la salida estándar del CLI la lista de instalaciones necesarias
En cambio, se lo informa al desarrollador de estas dos maneras.
El desarrollador puede revisarlo y decidir personalmente si quiere instalar las dependencias.
4. Configuración
Para usar lx, se necesita configurar el LLM. Basta con crear lx-config.yaml en el directorio home (~/) o en la raíz del proyecto (./). Si el archivo existe en ambas rutas, se aplica primero el archivo de configuración local, por lo que se puede manejar una configuración distinta de lx para cada proyecto.
# lx-config.yaml
provider: "gemini"
api_key: "foo"
model: "bar"
5. Instalación y ejecución
Los usuarios de Mac pueden instalarlo mediante Homebrew, y en otros sistemas operativos se puede descargar el binario desde lx GitHub Releases para instalarlo.
brew tap chebread/lx
brew install lx
Después de instalarlo, al ejecutar el comando lx en la ruta del proyecto se genera el código real.
lx incluye una función de generación inteligente, por lo que no vuelve a llamar al LLM para funciones cuyo código ya fue generado; así que se puede ejecutar el comando lx repetidamente con tranquilidad.
Nota: lx usa herramientas específicas de cada lenguaje para formatear el código generado (Go: goimports, Python: ruff, JS: prettier). Esas herramientas deben estar instaladas de antemano.
6. Licencia
lx se distribuye bajo la licencia AGPL-3.0.
La intención es que lx contribuya al ecosistema open source y, al mismo tiempo, evitar que esta herramienta sea apropiada de forma cerrada.
Conclusión
El software es un cristal tejido a partir del esfuerzo constante de los seres humanos. Incluso en la era de la IA, el programador debe seguir siendo el dueño del código.
lx permite delegarle a la IA las "implementaciones aburridas", como expresiones regulares tediosas o parsing de datos, mientras que la estructura y el flujo del programa siguen siendo plenamente propiedad del ser humano.
¡Recomiendo esta herramienta a quienes no quieren perder la diversión de escribir código (Wrangling code) ni el control!
12 comentarios
De acuerdo con la política de operación, el comentario inapropiado fue eliminado y el uso de esa cuenta fue restringido.
Ahora mismo, incluso programar sigue estando en realidad basado en estándares humanos.
Más adelante, creo que se desarrollará de una forma que no dependa de lenguajes ineficientes basados en estándares humanos.
Disfrutemos mucho los frameworks centrados en lo humano mientras podamos.
Me parece muy interesante porque va completamente en sentido contrario a la tendencia actual de que para hacerlo bien ni siquiera deberías mirar el código.
Dependiendo de cómo se elija usarlo, quizá también podría servir simplemente con la idea de delimitar con claridad qué área puede tocar la IA.
También podría estar bien intentar construirlo como una skill de los agentes de programación, ¿no?
Lo revisaré activamente. Si les interesa, ¡envíen muchos PR!
¡Parece un proyecto interesante!
Primero se escribe la especificación en Ix -> luego, con la herramienta Ix, las funciones de lx se reemplazan por funciones reales -> y después se compila con Go.
Al surgir una capa en el proyecto que usa lx,
parece que se podrá separar la capa escrita con LLM, así que más adelante también podría facilitar el mantenimiento.
¡Parece un intento interesante usando LLM!
Gracias.
lxtambién es compatible con lenguajes además de Go, así que agradecemos mucho que lo usen y nos compartan sus comentarios.El objetivo es interesante, pero a lo largo de todo el texto se siente muy fuerte el estilo característico de la IA,
así que me cuesta confiar en él.
Tiene razón. Como soy estudiante de secundaria, no tengo mucho tiempo, así que al usar inteligencia artificial para escribir, el texto terminó convirtiéndose en uno cuya confiabilidad se redujo bastante. Aunque pueda resultar un poco incómodo, le agradecería su comprensión.
Vaya, es increíble que un estudiante de secundaria haya ideado algo así.
Con más experiencia, parece que podrá crear cosas aún más impresionantes.
¿Entonces la idea sería que, cuando el código que llama a
lx.Generateda una orden desde la línea de comandos, ese código se reemplace por código escrito por el LLM?Me parece una buena idea que la parte que hace la llamada pueda servir como una especie de restricción de tipos. También me da curiosidad si están considerando una forma en la que el comando
lxse ejecute automáticamente desde el editor u otros entornos y reemplace el código de implementación. (Además, estaría bien que hubiera una forma de regenerarlo cuando el código generado no convenza).Revisé el proyecto con mucho interés.
Si se ejecuta el código que llama a
lx.Generate, ¿la idea es que, cuando se da una instrucción desde la línea de comandos, se reemplace por código escrito con el LLM? -> Sí, así es.Me parece una buena idea que la parte que hace la llamada pueda servir como una especie de restricción de tipos. También me da curiosidad si están considerando una forma en la que el comando
lxse ejecute automáticamente en el editor o similares para sustituir el código de implementación. -> De verdad me parece una muy buena idea. La vamos a tomar muy en cuenta.Además, estaría bien que hubiera alguna forma de regenerar el código cuando el resultado no convence. -> Como la filosofía del proyecto es que la IA esté bajo el control del desarrollador, lo diseñamos para que, si hace falta regenerarlo, se vuelvan a crear los marcadores
lx.Viendo el nivel de comentario que dejan después de meterse a la fuerza por haber visto que lo hizo un estudiante de secundaria, ya se puede imaginar su nivel de inteligencia.
Mírese al espejo y búsquese tratamiento.
killdong | hace 9 meses | parent | on: Uso bombas ZIP para proteger mi servidor (idiallo.com)
Creo que si en internet no se hacen responsables por la basura que expulsan, deberían prohibirles usar internet. Háganse cargo de lo que soltaron.