sem: Control de versiones semántico
Publicado el 15 de March de 2026 en Programación
Me encontré con sem hace unas semanas y me parece una idea brutal. Es un CLI que va más allá del diff tradicional línea a línea y entiende la estructura real del código.
La diferencia entre líneas y entidades¶
Cuando haces un git diff tradicional, ves algo como:
- const oldAuth = function(user) { ... }
+ const newAuth = async function(user) { ... }
Pero con sem diff ves:
⊕ function validateToken [added]
∆ function authenticateUser [modified]
⊖ function legacyAuth [deleted]
No líneas añadidas o eliminadas, sino entidades que cambiaron: funciones, clases, métodos. Mucho más útil para entender qué pasó realmente en el PR.
Comandos disponibles¶
sem diff: Muestra qué entidades cambiaronsem impact <entidad>: Analiza qué se rompería si cambias esa entidad (dependencias entrantes)sem blame: Blame a nivel de entidad — quién cambió cada función/clasesem graph: Muestra el grafo de dependencias entre entidades
Ejemplo práctico¶
# Ver qué entidades cambiaron en working directory
sem diff
# Ver solo cambios staged
sem diff --staged
# Ver cambios de un commit específico
sem diff --commit abc1234
# Ver impacto de cambiar una función
sem impact validateToken
# Salida JSON para pipelines CI
sem diff --format json
Instalación¶
# macOS
brew install sem-cli
# Linux (mi caso)
brew install sem-cli
# o descargar binario de GitHub Releases
O build from source si tienes Rust instalado:
git clone https://github.com/Ataraxy-Labs/sem
cd sem/crates
cargo install --path sem-cli
Why esto es útil¶
Para mí, principalmente dos casos:
- Code reviews más rápidas — Entiendes el impacto real de un cambio en segundos
- Refactors seguros — Antes de renombrar una función crítica,
sem impactte dice qué puede romperse
Soporta 20 lenguajes (incluyendo Python, Rust, Go, TypeScript, Java, C++, etc.) usando tree-sitter para parsear el código.
Una herramienta que va directo a mi toolkit diario.