- Python 86.6%
- Shell 13.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Si el rename no llega a herdr, guardar el título hacía que el tick siguiente viera current != record y lo marcase como nombre manual para siempre. |
||
| bin | ||
| config | ||
| fleet | ||
| patches | ||
| .gitignore | ||
| check.sh | ||
| install.sh | ||
| LICENSE | ||
| NOTICE.md | ||
| plugins.tsv | ||
| README.md | ||
herdr-config-public
Todo lo necesario para dejar otra máquina con este Herdr: config.toml, los plugins con su
commit fijado, el script de split, el plugin propio que alimenta el sidebar (estado y
actividad de cada panel) y la instalación de las integraciones de los agentes.
Es una exportación saneada de una configuración personal: sin credenciales, sin
direcciones de red privadas, sin nombres de máquina ni historial git. Traducida a
$HOME donde hacía falta, para que se pueda clonar en cualquier equipo.
Qué incluye
| Ruta | Qué es |
|---|---|
config/config.toml |
La config: tema, teclas, sidebar de spaces y tarjetas de agentes, toasts |
plugins.tsv |
Los 7 plugins que usa, con owner/repo y commit fijado (uno es el auto-title de upstream) |
bin/herdr-split |
Split tipo dwindle (derecha, abajo, derecha…) para prefix+t |
fleet/ |
Plugin vicio.fleet-state: publica $status, $activity, $title, $elapsed, $proj, $adds/$dels y el árbol de tabs de cada space |
patches/ |
auto-title-wrapper-ssh.patch: que un panel abierto con un wrapper de ssh (sshm) se llame por host y no por directorio |
install.sh |
Config + helpers + plugins + integraciones, con backup y preflight |
check.sh |
Detecta deriva entre el repo y lo instalado |
Qué NO incluye
- Credenciales,
.env,auth.json, tokens. - Estado de sesión (
session.json,sessions/), logs, checkouts de plugins (los clona Herdr). - Notificaciones personales al móvil (Telegram/Matrix): son de cada casa y no se replican.
- Fuentes: los glifos Nerd Font (PUA) salen de la fuente que use el terminal;
install.shavisa si no hay ninguna que cubraU+F04B2. - Las configs de los agentes (omp, Claude, Codex, Pi, Hermes): cada uno tiene su repo.
Requisitos
- Herdr 0.9.5 o superior (
herdr --version). - Python 3 para el plugin de estado.
- Go 1.24+ si vas a instalar
herdr.auto-title(Herdr lo compila al instalarlo). - Un agente con su integración instalada (
herdr integration install <agente>) si quieres que Herdr sepa el estado real de cada panel.
Instalación
git clone https://git.okvicio.club/vicio/herdr-config-public.git
cd herdr-config-public
./install.sh # pide confirmación si ya hay config.toml
./check.sh # comprueba que lo instalado coincide con el repo
install.sh es idempotente y falla en cerrado: preflight de todo, backup con fecha de lo
que sustituye y error (--force para modo no interactivo) si ya existe un config.toml.
--skip-plugins se salta los plugins de plugins.tsv (deja config, herdr-split y el plugin de estado, que van con los helpers).
El orden que sigue: config → herdr-split → fleet/ (y herdr plugin link) → los plugins de
plugins.tsv con su commit → herdr integration install para cada agente que esté en el PATH
→ aviso de tipografía → herdr server reload-config.
Instala en:
~/.config/herdr/config.toml (o $HERDR_CONF_DIR/config.toml)
~/.local/bin/herdr-split
~/.local/share/herdr-config/fleet
Plugins
plugins.tsv fija el commit exacto de cada uno; install.sh instala los que falten. Los
required son los que usa el config tal cual; los optional puedes quitarlos de la lista.
| Plugin | Para qué | |
|---|---|---|
herdr.auto-title |
Nombra tabs y paneles con el tema de la sesión | required |
ray.plugin-manager |
Popup de gestión de plugins (prefix+m) |
required |
usagebar |
Cuota y gasto del agente en el sidebar | optional |
herdr-file-viewer |
Ver ficheros sobre el panel | optional |
persiyanov.reviewr |
Revisar diffs al lado del chat | optional |
gavintomlins.herdr-oh-my-agent |
Un panel por delegación de OMP/OpenCode | optional |
herdr-mobile-relay.events |
Acceso desde el móvil por WebRTC | optional |
El parche de auto-title existe porque Herdr informa el líder del grupo de procesos en
primer plano: un lanzador propio (sshm y similares) se queda delante del ssh y el panel
acababa llamado por el directorio local. Aplicarlo necesita compilar, así que es manual:
git clone https://github.com/kryptamine/herdr-auto-title && cd herdr-auto-title
git checkout v0.16.0 && git apply /ruta/al/patches/auto-title-wrapper-ssh.patch
herdr plugin link "$PWD" # Herdr lo compila y lo usa ese checkout
Integraciones
install.sh lanza herdr integration install para cada agente que encuentre en el PATH
(hermes, pi, omp, claude, codex, opencode). Sin la integración Herdr no sabe qué
sesión hay en cada panel: los títulos salen del título del terminal y el estado se adivina.
Cómo se pinta el sidebar
Herdr sólo expone unos cuantos tokens fijos (pane, agent, workspace…). Todo lo demás
lo publica fleet/state.py como metadata del panel o del workspace, y el sidebar lo
lee como $nombre:
| Token | Qué es |
|---|---|
$spin |
Spinner braille mientras trabaja; glifo fijo por estado cuando no |
$icon |
Etiqueta corta del harness (HM, π, ⌥, CC…) |
$title / $title_dim |
Tema de la sesión; en gris cuando el panel ya está leído y quieto |
$status |
working / blocked / done / idle / sleeping / stalled / error |
$activity |
Qué está haciendo ahora mismo cuando el estado no lo dice |
$elapsed, $proj, $adds, $dels, $wsn, $ws |
Tiempo en el estado, proyecto git, diff, número y nombre del space |
$count, $t1…$t4 |
Cuántas tabs/paneles lleva el space y el árbol de sus tabs |
Dos reglas que explican el diseño:
- La pantalla manda sobre la integración. Un panel que genera o compacta a veces sigue
reportando
idle;state.pymira el pie de la TUI y, si hay señal de vida, empujaworking. Al contrario no: nunca informaidle/donepor su cuenta. - Los títulos se generan aparte.
titles.pypide un título de 3-6 palabras al modelo barato que configures; sin endpoint, se queda el que publique el propio agente.
Títulos con IA (opcional)
export FLEET_TITLE_ENDPOINT=http://localhost:8080/v1/chat/completions # cualquier API OpenAI-compatible
export FLEET_TITLE_API_KEY=...
export FLEET_TITLE_MODEL=... # por defecto deepseek-v4.1-flash
También acepta CPA_API_KEY en el entorno (y, si existe, en ~/.hermes/.env). Si no hay
endpoint alcanzable no rompe: deja el título que publique el harness y sigue.
Teclas
prefix es ctrl+space. La idea: una tecla por nivel, y q para cerrar, r para
renombrar, k para la space.
| Tecla | Acción |
|---|---|
prefix+k |
Cerrar la space (pide confirmación) |
prefix+q |
Cerrar el panel: pela un nivel (split → tab si era el único panel → space si era la última tab) |
prefix+shift+q |
Cerrar la tab entera con sus splits |
prefix+r / prefix+shift+r / prefix+alt+r |
Renombrar space / tab / panel |
prefix+alt+shift+r |
Recargar config.toml |
prefix+t |
Split alternando derecha/abajo (herdr-split) |
prefix+h / prefix+v |
Split derecha / abajo |
prefix+f |
Flota: todos los agentes a la vista (fleet/fleet.py) |
prefix+alt+t |
Terminal flotante (popup) |
prefix+m |
Plugin manager (ray.plugin-manager, si está instalado) |
Sobre confirm_close = true: Herdr sólo pregunta cuando el cierre se lleva algo más que
el objetivo — la space (siempre), la última tab de una space, o el último panel de la última
tab. Cerrar un split con hermanos no pregunta. No hay granularidad por acción en [ui].
Al replicar, revisa
- Rutas
$HOMEde los[[keys.command]]si cambias dónde viven los scripts. FLEET_TITLE_ENDPOINT: viene apuntando alocalhost; pon el tuyo.- Ids de plugins de terceros (
ray.plugin-manager,usagebar): si no los tienes, quita esas filas del sidebar o instálalos. theme.name = "terminal": usa la paleta del terminal en vez de un tema de Herdr.
Licencia
MIT, ver LICENSE. Atribuciones de terceros en NOTICE.md.