Saltar al contenido principal

herdr: probando el reemplazo de tmux pensado para agentes de IA

· 7 min de lectura
Oscar Adrian Ortiz Bustos
Contando lecturas...

Introducción

Llevo ya varios años con tmux como base de mi flujo de trabajo. Prefix, splits, sesiones, un .tmux.conf afinado a fuerza de repetición hasta que los binds quedaron grabados en los dedos más que en la memoria, a tal grado de que cuando estoy en un setup ajeno me siento como un mono. Así que cuando empecé a evaluar herdr, un multiplexor de terminal que se vende como pensado para trabajar con agentes de IA en paralelo, la primera pregunta no fue "¿qué features nuevas trae?" sino "¿me va a doler migrar mis keybindings?"

Aclaro de entrada: esto no es un "me cambié y no vuelvo". Sigo con tmux corriendo al lado, evaluando si herdr se gana un lugar permanente o se queda en la carpeta de experimentos. Este post es el registro de esa migración/prueba, con la config real que terminé armando.

¿Qué es herdr?

herdr es un multiplexor de terminal, en la misma familia que tmux o zellij, pero con una diferencia central: trata a los agentes de IA como ciudadanos de primera clase en vez de tratarlos como un proceso más corriendo dentro de un panel. A dia que escriboo esto, tengo la versión 0.7.5 instalada, y esto es algo que lo que ofrece:

  • Tiene un CLI facade para agentes en vivo, con comandos como start, prompt, send-keys y wait, que apuntan a un panel existente sin tocar el layout.
  • Reconoce el estado de agentes específicos (Codex, Grok, OpenCode, Kimi, Pi, Kilo Code) y reporta si están trabajando, bloqueados o idle en el sidebar, en vez de asumir que un panel de terminal es una caja negra.
  • Tiene integraciones de ciclo de vida por agente: por ejemplo, los paneles de Grok ahora preservan el estado de "working/blocked" a partir de señales del terminal, y los de Pi usan eventos "asentados" para no marcar como idle a un agente que sigue a mitad de turno.
  • Maneja worktrees de Git como concepto nativo, con su propio directorio configurable y binds para crear, abrir y eliminar worktrees sin salir de la sesión.

Nada de esto es indispensable si tu uso de la terminal es "abro un shell y corro comandos". Pero si tenés varios agentes trabajando en paralelo sobre distintas ramas (o como es mi caso, distintos worktrees), la diferencia entre "un panel más" y "herdr sabe que ese panel está bloqueado esperando tu respuesta" empieza a importar. Ademas de que su sidebar de agents no es para nada intrusivo, es un identificador visual del estado en el que se encuentra el agente.

La migración: de .tmux.conf a config.toml

Acá está la parte que más tiempo me llevó. herdr usa un config.toml en vez del .tmux.conf de toda la vida, así que lo primero fue portar los binds 1:1, no adoptar los defaults de herdr y aprender de cero.

# tmux prefix es M-` (Meta+backtick), no el default de herdr ctrl+b.
prefix = "alt+backtick"

split_vertical = "prefix+v"
split_horizontal = "prefix+h"

focus_pane_left = "prefix+ctrl+h"
focus_pane_down = "prefix+ctrl+j"
focus_pane_up = "prefix+ctrl+k"
focus_pane_right = "prefix+ctrl+l"

Con el prefix ya fue una decisión: mi tmux usa Meta+backtick, no el ctrl+b de fábrica, así que lo primero que hice fue pisar el default de herdr. Con los binds de navegación entre paneles pasó algo parecido: tmux los tiene en ctrl+hjkl después del prefix, mientras que herdr por defecto usa hjkl plano. Tuve que decidir conscientemente mantener el ctrl+ para que la h plana quedara libre para split_horizontal, que es donde tmux la tiene.

El problema de la sintaxis de teclas

Algo que no esperaba: herdr solo confirma en su documentación un puñado de nombres de puntuación como tokens válidos (minus, comma, ampersand, plus, backtick). Corchetes, punto y coma, slash, signos de pregunta y paréntesis no están confirmados. Y el detalle importante es que un token inválido no tira un error puntual: hace que herdr descarte todo el archivo de config y caiga a los defaults, en silencio.

Eso me obligó a dejar sin mapear varios binds de tmux que dependían de esa puntuación (; para el último panel activo, [ para copy mode, ( ) para cambiar de sesión) en vez de arriesgarme a adivinar la sintaxis y perder toda mi config de un tirón. Los mapeé por concepto en otras teclas confirmadas:

# tmux: ; -> select-pane -l (último panel activo). Mapeado a prefix+tab
# en vez del ";" literal, que sigue sin confirmar.
last_pane = "prefix+tab"

# tmux: ( / ) -> switch-client previous/next session
previous_workspace = "prefix+ctrl+p"
next_workspace = "prefix+ctrl+n"

Si algo de esto te suena a "por qué no probás y ves si tira error", la respuesta corta es: porque el fallo es silencioso. Mejor dejar algo sin mapear temporalmente que perder el resto de la config sin darme cuenta.

Cosas que no tienen equivalente directo en tmux

herdr trae conceptos que tmux simplemente no tiene, y para esos no había nada que migrar, solo que decidir:

[worktrees]
directory = "~/herdr-worktrees"

[keys]
open_worktree = "prefix+g"
remove_worktree = "prefix+ctrl+g"

toggle_sidebar = "prefix+b"
next_agent = "prefix+a"
previous_agent = "prefix+shift+a"
focus_agent = "prefix+ctrl+1..9"

El sidebar con estado de agentes y la navegación entre agentes (next_agent/previous_agent) son la parte que más curiosidad me genera, porque es justo el pitch central de herdr: si estás corriendo Codex en un panel y OpenCode en otro, no tenés que acordarte en cuál pane quedó cada uno, el sidebar te lo muestra agrupado y coloreado por estado.

herdr sidebar de agentes

Y mas con el tema de los sonidos de las notificaciones: herdr puede avisarte con un beep cuando un agente termina de procesar, y si estás en otra pestaña o en otra app, eso es un aviso más directo que mirar el prompt de cada panel. Lo que para mi, la neta que es un plus que le aporta mucho valor a la experiencia de tener varios agentes corriendo.

Lo que todavía me genera dudas

No todo fue plug and play. El changelog de la 0.7.5 tiene fixes bastante recientes para cosas que uno esperaría resueltas hace rato: paneles de Codex con títulos de terminal personalizados que se quedaban en estado idle, reportes de ciclo de vida de OpenCode que llegaban desordenados y dejaban un panel marcado como "trabajando" cuando ya había terminado, o waits de agente que colgaban el timeout completo en vez de devolver el error apenas el panel se cerraba. Son bugs de una herramienta relativamente joven, no defectos de diseño, pero sí me hacen ir con cautela antes de apostar todo mi flujo diario a herdr.

Tampoco es gratis pisar años de memoria muscular de tmux. Todavía me equivoco con el prefix a veces, todavía tengo que pensar antes de hacer un split o un resize, y cuando estoy presentando la pantalla a mis compañeros de equipo me da un poco de vergüenza que vean como me confundo con los binds de herdr en vez de los de tmux. Pero eso es normal, y va a pasar hasta que la memoria muscular se reentrene. Eso no es culpa de herdr, es el costo de cualquier migración de este tipo.

Conclusión

Por ahora sigo en modo evaluación, con tmux y herdr corriendo en paralelo. Lo que más me interesa comprobar con el tiempo es si el awareness de agentes realmente cambia algo en un día de trabajo con varios agentes de IA corriendo a la vez, o si termina siendo una capa más de complejidad sobre algo que tmux ya resolvía bien con un poco de scripting propio. La config está portada, los binds funcionan, y el sidebar de agentes es lo próximo que voy a poner a prueba en serio. Si migro del todo, va a ser porque ese sidebar me ahorró tiempo real, no porque "es lo nuevo".

"We shape our tools, and thereafter our tools shape us."

Marshall McLuhan

Referencias

Escrito por un humano