Cómo funciona¶
Curupira es un único programa en Rust que se ejecuta en tu máquina. Pide trabajo a las fuentes de tareas, prepara un checkout de Git para cada tarea e inicia la CLI de agente de código que elegiste con un prompt construido a partir de la tarea. Nada se aloja en un servidor y ningún servicio llama a tu máquina.
Una tarea, de principio a fin¶
flowchart LR
S["Fuente de tareas<br/>conector o cron"] -- "siguiente elemento<br/>(pares clave/valor)" --> H["Curupira<br/>host"]
H -- "clona una vez,<br/>un worktree por tarea" --> W["Worktree de Git"]
H -- "prompt con los<br/>${fields} completados" --> A["CLI de agente<br/>claude · codex · gemini …"]
A -- "trabaja dentro" --> W
H -. "ok / fail,<br/>registrado" .-> D[("estado<br/>SQLite")]
- Consulta. Para cada automatización, Curupira pide a su trigger el siguiente elemento. Un conector devuelve un elemento (en GitHub, una issue, un pull request o una tarjeta de tablero) como una lista plana de campos; cron devuelve la ocurrencia que vence.
- Deduplica. Los campos se convierten en un hash que forma la identidad de la tarea. Una identidad que ya terminó se omite, así que el mismo elemento nunca se ejecuta dos veces.
- Prepara. El repositorio se clona una vez en
~/.curupira/workspaces/. Cada tarea recibe su propio worktree y su rama (curupira/<automation>/…), así que las tareas nunca comparten archivos y tu propio checkout nunca se toca. - Renderiza. El prompt de la automatización se completa con los campos de la tarea
(
${issue_title},${pr_number}, …) y puede usar condiciones y bucles.run --dry-runse detiene aquí y lo imprime. - Ejecuta. Curupira inicia la CLI del agente en modo no interactivo dentro del
worktree y espera. Hasta
max_active_taskstareas se ejecutan al mismo tiempo. - Termina. El resultado se guarda, el worktree se elimina y
runimprimeokofailcon la identidad de la tarea. Las sesiones interrumpidas se reanudan después de reiniciar.
Las piezas que configuras¶
Todo vive en ~/.curupira/settings.toml. Estos son los nombres que verás en toda la
documentación:
- Repositorio
- Un remoto de Git donde trabaja el agente, declarado en
[repositories.<alias>]. Curupira lo clona; no es el repositorio de GitHub que se vigila (ese es el filtrorepodel trigger), aunque normalmente apunta al mismo lugar. - Perfil de agente
- Una forma con nombre de ejecutar un agente de código (
[agents.profiles.<name>]): elprovider(claude,codex, …) más opciones comomodeloeffort. Consulta Agentes de código. - Plugin
- Un paquete de fuentes de tareas registrado en
[plugins.<alias>], iniciado conuvxonpx. Un plugin para una herramienta, como GitHub, se llama conector; consulta Plugins y conectores. - Trigger
- Una fuente de tareas, referida como
<alias>/<trigger>(por ejemploplugins-py/github-issues) o elcronintegrado. - Automatización
- La regla que lo une todo (
[automations.<name>]): un trigger con sus filtros, el repositorio donde trabajar, el perfil de agente y el prompt. Consulta Automatizaciones. - Tarea
- Un elemento que encontró una automatización, como la issue #128. Tiene una identidad, un worktree, un prompt y una ejecución del agente.
Quién hace qué¶
| Curupira (el host en Rust) | Plugins (fuentes de tareas) | CLI de agentes |
|---|---|---|
| Lee y valida el TOML | Encuentran el siguiente elemento | Leen el prompt |
| Consulta los triggers y deduplica las tareas | Validan sus propios filtros | Cambian el código en el worktree |
Clona, crea worktrees, ejecuta setup_script |
Reciben avisos cuando una tarea empieza y termina | Usan su propio inicio de sesión y sus ajustes |
| Renderiza el prompt e inicia el agente | Nunca tocan Git ni el agente | Nunca hablan con los plugins |
| Guarda el estado y reanuda sesiones |
Los plugins son procesos separados que hablan un pequeño protocolo JSON-RPC por stdin y stdout. Los agentes de código están integrados en el host, así que dar soporte a un agente nuevo es un cambio en Curupira, no un plugin. Para escribir tu propia fuente de tareas, consulta Desarrollar extensiones.
Archivos en disco¶
| Ruta | Qué contiene |
|---|---|
~/.curupira/settings.toml |
Tu configuración |
~/.curupira/workspaces/ |
Clones y worktrees por tarea (workspace_dir) |
~/.curupira/state.sqlite3 |
Ocurrencias de cron y sesiones reanudables del agente (state_db_path) |
~/.curupira/dispatch.lock |
Lo mantiene el único proceso que está despachando |