|
| 1 | +<p align="center"> |
| 2 | + <picture> |
| 3 | + <source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.png"> |
| 4 | + <img src="assets/logo.png" width="220" alt="Ponytail, el senior dev flojo"> |
| 5 | + </picture> |
| 6 | +</p> |
| 7 | + |
| 8 | +<h1 align="center">Ponytail</h1> |
| 9 | + |
| 10 | +<p align="center"> |
| 11 | + <em>No dice nada. Escribe una línea. Funciona.</em> |
| 12 | +</p> |
| 13 | + |
| 14 | +<p align="center"> |
| 15 | + <img src="https://img.shields.io/github/stars/DietrichGebert/ponytail?style=flat-square&color=111111&label=stars" alt="Stars"> |
| 16 | + <img src="https://img.shields.io/github/v/release/DietrichGebert/ponytail?style=flat-square&color=111111&label=release" alt="Release"> |
| 17 | + <img src="https://img.shields.io/badge/funciona%20con-13%20agentes-111111?style=flat-square" alt="Works with 13 agents"> |
| 18 | + <img src="https://img.shields.io/badge/licencia-MIT-111111?style=flat-square" alt="MIT license"> |
| 19 | +</p> |
| 20 | + |
| 21 | +<p align="center"> |
| 22 | + <strong>80-94% menos código · 3-6× más rápido · 47-77% más barato</strong><br> |
| 23 | + <sub>Mediana de 10 ejecuciones con Haiku, Sonnet y Opus. <a href="benchmarks/">Reprodúcelo tú mismo.</a></sub> |
| 24 | +</p> |
| 25 | + |
| 26 | +--- |
| 27 | + |
| 28 | +Lo conoces. Cola de caballo larga. Lentes ovalados. Lleva más tiempo en la empresa que el control de versiones. Le muestras cincuenta líneas; las mira, no dice nada, y las reemplaza por una. |
| 29 | + |
| 30 | +Ponytail lo pone dentro de tu agente de IA. |
| 31 | + |
| 32 | +## Antes / después |
| 33 | + |
| 34 | +Le pides un selector de fechas. Tu agente instala flatpickr, escribe un componente wrapper, agrega un stylesheet, y empieza una discusión sobre zonas horarias. |
| 35 | + |
| 36 | +Con ponytail: |
| 37 | + |
| 38 | +```html |
| 39 | +<!-- ponytail: el browser ya tiene uno --> |
| 40 | +<input type="date"> |
| 41 | +``` |
| 42 | + |
| 43 | +Más sobrevivientes en [examples/](examples/). |
| 44 | + |
| 45 | +## Números |
| 46 | + |
| 47 | +Cinco tareas del día a día (validador de email, debounce, suma de CSV, temporizador, rate limiter), tres modelos, tres variantes: sin skill, el skill [caveman](https://github.com/JuliusBrussee/caveman), y ponytail. Diez ejecuciones por celda, mediana reportada. |
| 48 | + |
| 49 | +<p align="center"> |
| 50 | + <img src="assets/benchmark-3model.svg" width="860" alt="Mediana de líneas de código por variante en Haiku, Sonnet y Opus; ponytail escribe 80-94% menos código que el baseline sin skill"> |
| 51 | +</p> |
| 52 | + |
| 53 | +**80-94% menos código, 47-77% menos costo, y 3-6× más rápido que un agente sin skill, en todos los modelos.** Cada atajo que toma ponytail queda marcado en el código con un comentario `ponytail:` que nombra la ruta de actualización. Reprodúcelo: `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`. Método y números completos: [benchmarks/](benchmarks/). Tareas de nivel producción, donde un agente sin restricciones se infla mucho más, están documentadas en [benchmarks/results/](benchmarks/results/). |
| 54 | + |
| 55 | +## Cómo funciona |
| 56 | + |
| 57 | +Antes de escribir código, el agente se detiene en el primer peldaño que aguanta: |
| 58 | + |
| 59 | +``` |
| 60 | +1. ¿Necesita existir esto? → no: omitirlo (YAGNI) |
| 61 | +2. ¿Lo hace la stdlib? → úsala |
| 62 | +3. ¿Es una feature nativa? → úsala |
| 63 | +4. ¿Una dependencia ya instalada? → úsala |
| 64 | +5. ¿Cabe en una línea? → una línea |
| 65 | +6. Solo entonces: el mínimo que funciona |
| 66 | +``` |
| 67 | + |
| 68 | +Flojo, no negligente: la validación en límites de confianza, el manejo de pérdida de datos, la seguridad y la accesibilidad nunca están en riesgo. |
| 69 | + |
| 70 | +## Instalación |
| 71 | + |
| 72 | +El mayor esfuerzo que ponytail te va a pedir: |
| 73 | + |
| 74 | +Los plugins de Claude Code y Codex ejecutan dos pequeños lifecycle hooks de Node.js, así que `node` debe estar en tu PATH (nota para usuarios de Nix/nvm: debe estar en el PATH del shell no-interactivo). Si no lo está, los skills igualmente funcionan — la activación automática simplemente queda en silencio en vez de lanzar un error en cada prompt. |
| 75 | + |
| 76 | +### Claude Code |
| 77 | + |
| 78 | +``` |
| 79 | +/plugin marketplace add DietrichGebert/ponytail |
| 80 | +/plugin install ponytail@ponytail |
| 81 | +``` |
| 82 | + |
| 83 | +### Codex |
| 84 | + |
| 85 | +```bash |
| 86 | +codex plugin marketplace add DietrichGebert/ponytail |
| 87 | +codex |
| 88 | +``` |
| 89 | + |
| 90 | +Abre `/plugins`, selecciona el marketplace de Ponytail e instala Ponytail. Luego abre `/hooks`, revisa y autoriza sus dos lifecycle hooks, y empieza un nuevo hilo. |
| 91 | + |
| 92 | +Esta misma instalación cubre también la app de escritorio de Codex: reinicia la app después de instalar y detecta el plugin automáticamente. |
| 93 | + |
| 94 | +### GitHub Copilot CLI |
| 95 | + |
| 96 | +```bash |
| 97 | +copilot plugin marketplace add DietrichGebert/ponytail |
| 98 | +copilot plugin install ponytail@ponytail |
| 99 | +``` |
| 100 | + |
| 101 | +En una sesión interactiva de Copilot CLI, usa los equivalentes con slash: |
| 102 | + |
| 103 | +``` |
| 104 | +/plugin marketplace add DietrichGebert/ponytail |
| 105 | +/plugin install ponytail@ponytail |
| 106 | +``` |
| 107 | + |
| 108 | +Copilot CLI agrupa los comandos del plugin bajo el nombre del plugin. Por ejemplo: |
| 109 | + |
| 110 | +```text |
| 111 | +/ponytail:ponytail ultra |
| 112 | +/ponytail:ponytail-review |
| 113 | +``` |
| 114 | + |
| 115 | +### Pi agent harness |
| 116 | + |
| 117 | +``` |
| 118 | +pi install git:github.com/DietrichGebert/ponytail |
| 119 | +``` |
| 120 | + |
| 121 | +### OpenCode |
| 122 | + |
| 123 | +Ejecuta OpenCode desde un checkout de este repo (el plugin reutiliza sus `hooks/` y `skills/`), y agrega esto a `opencode.json`: |
| 124 | + |
| 125 | +```json |
| 126 | +{ "plugin": ["./.opencode/plugins/ponytail.mjs"] } |
| 127 | +``` |
| 128 | + |
| 129 | +Inyecta el ruleset en cada turno con el nivel activo; agrega los comandos `/ponytail` (ver [Comandos](#comandos)). OpenCode también carga automáticamente el `AGENTS.md` de este repo, así que las reglas aplican incluso sin el plugin. El plugin agrega los niveles `lite/full/ultra/off`. |
| 130 | + |
| 131 | +El path `./` se resuelve contra el `opencode.json` de tu proyecto; para compartir un único checkout entre proyectos, apunta al path absoluto del `.mjs` (encuentra sus `hooks/` y `skills/` relativo a su propio archivo). |
| 132 | + |
| 133 | +### Gemini CLI |
| 134 | + |
| 135 | +```bash |
| 136 | +gemini extensions install https://github.com/DietrichGebert/ponytail |
| 137 | +``` |
| 138 | + |
| 139 | +Carga el ruleset como contexto permanente en cada sesión y registra los comandos `/ponytail`; los `skills/` también se incluyen, activados cuando una tarea los necesita. |
| 140 | + |
| 141 | +### Antigravity CLI |
| 142 | + |
| 143 | +Google está renombrando Gemini CLI a Antigravity CLI (el binario `agy`); la misma extensión se instala ahí: |
| 144 | + |
| 145 | +```bash |
| 146 | +agy plugin install https://github.com/DietrichGebert/ponytail |
| 147 | +``` |
| 148 | + |
| 149 | +Reutiliza el `gemini-extension.json` de este repo. Una diferencia: Antigravity convierte los comandos `/ponytail` en skills, así que los escribes en el chat (por ejemplo `/ponytail-review` como mensaje) en vez de seleccionarlos de un menú slash. Hasta que la migración se complete (alrededor del 18 de junio de 2026), `gemini extensions install` también funciona. Para usarlo como regla permanente, coloca el ruleset en `.agents/rules/`. |
| 150 | + |
| 151 | +### OpenClaw |
| 152 | + |
| 153 | +```bash |
| 154 | +clawhub install ponytail |
| 155 | +``` |
| 156 | + |
| 157 | +Instala ponytail como skill de OpenClaw desde ClawHub; los skills de review, audit, debt y help se instalan igual (`clawhub install ponytail-review`, etc.). OpenClaw lo aplica en tareas de código y también lo expone como comando `/ponytail`. Sin ClawHub, copia [`.openclaw/skills/ponytail`](.openclaw/skills/) a `~/.openclaw/skills/`. |
| 158 | + |
| 159 | +Eso fue todo. Él estaría orgulloso. No lo va a decir. |
| 160 | + |
| 161 | +Activo en cada sesión, con un puñado de comandos (ver [Comandos](#comandos)). `/ponytail ultra` existe para cuando el codebase te hizo algo personal. El texto de inicio y de cambio de modo muestra el nivel activo. |
| 162 | + |
| 163 | +Configura el nivel para cada nueva sesión con la variable de entorno `PONYTAIL_DEFAULT_MODE` (`lite`/`full`/`ultra`/`off`), o con un campo `defaultMode` en `~/.config/ponytail/config.json` (`%APPDATA%\ponytail\config.json` en Windows). El default es `full`. |
| 164 | + |
| 165 | +Cursor, Windsurf, Cline, GitHub Copilot (editor), Aider, Kiro: copia el archivo de reglas correspondiente de este repo ([`.cursor/rules/`](.cursor/rules/), [`.windsurf/rules/`](.windsurf/rules/), [`.clinerules/`](.clinerules/), [`.github/copilot-instructions.md`](.github/copilot-instructions.md), [`AGENTS.md`](AGENTS.md), [`.kiro/steering/`](.kiro/steering/)). |
| 166 | + |
| 167 | +Kiro: copia `.kiro/steering/ponytail.md` a `~/.kiro/steering/` (global) o `.kiro/steering/` en tu proyecto. |
| 168 | + |
| 169 | +Fallback de GitHub Copilot CLI (modo solo instrucciones): lee `AGENTS.md` y `.github/copilot-instructions.md` en un proyecto, o copia las reglas a `~/.copilot/copilot-instructions.md` para ejecutar ponytail en todos tus proyectos. Esta vía mantiene la guía permanente, pero no agrega switches de modo ni hooks. |
| 170 | + |
| 171 | +VS Code con la extensión Codex lee `AGENTS.md`, que este repo incluye, así que funciona desde la raíz del repo sin configuración adicional (`~/.codex/AGENTS.md` hace a Codex global). |
| 172 | + |
| 173 | +Qué archivos corresponden a qué agente: [Portabilidad de agentes](docs/agent-portability.md). |
| 174 | + |
| 175 | +## Comandos |
| 176 | + |
| 177 | +| Comando | Qué hace | |
| 178 | +|---------|----------| |
| 179 | +| `/ponytail [lite \| full \| ultra \| off]` | Cambia la intensidad, o apágalo. Sin argumento, reporta el nivel actual. | |
| 180 | +| `/ponytail-review` | Revisa el diff actual en busca de sobre-ingeniería y devuelve una lista de qué eliminar. | |
| 181 | +| `/ponytail-audit` | Audita el repo completo en busca de sobre-ingeniería, no solo el diff. | |
| 182 | +| `/ponytail-debt` | Recolecta los atajos marcados con `ponytail:` que dejaste pendientes en un registro, para que "después" no se convierta en "nunca". | |
| 183 | +| `/ponytail-help` | Referencia rápida de los comandos anteriores. | |
| 184 | + |
| 185 | +Los comandos requieren un host compatible con skills (Claude Code, Codex, OpenCode, Gemini, pi). En Codex son skills; se invocan con `@` (`@ponytail-review`). Los adaptadores de solo instrucciones (Cursor, Windsurf, Cline, Copilot, Kiro, Antigravity) cargan el ruleset permanente sin los comandos. |
| 186 | + |
| 187 | +## Desarrollo |
| 188 | + |
| 189 | +Al cambiar el texto compacto de las reglas, mantén alineadas las copias en los adaptadores: |
| 190 | + |
| 191 | +```bash |
| 192 | +node scripts/check-rule-copies.js |
| 193 | +npm test |
| 194 | +``` |
| 195 | + |
| 196 | +El paquete de skills de OpenClaw (`.openclaw/skills/`) se genera desde `skills/`; ejecuta `node scripts/build-openclaw-skills.js` después de cambiar un skill — la suite de tests falla si está desactualizado. |
| 197 | + |
| 198 | +El benchmark de correctness lanza Python para las verificaciones de email y CSV; se prueba `python3` antes que `python`. Las verificaciones de CSV requieren `pandas` instalado localmente. |
| 199 | + |
| 200 | +## FAQ |
| 201 | + |
| 202 | +**¿Necesita un archivo de configuración?** |
| 203 | +No. Un opcional `~/.config/ponytail/config.json` o la variable `PONYTAIL_DEFAULT_MODE` pueden fijar el nivel default, pero nada es obligatorio. |
| 204 | + |
| 205 | +**¿Y si realmente necesito la clase de caché de 120 líneas?** |
| 206 | +No la necesitas. Insiste de todas formas y él la va a construir. Despacio. Correctamente. Mirándote. |
| 207 | + |
| 208 | +**¿Escala?** |
| 209 | +El código que nunca escribiste escala infinitamente. Cero bugs, cero CVEs, 100% uptime desde siempre. |
| 210 | + |
| 211 | +**¿Por qué "ponytail"?** |
| 212 | +Ya sabes exactamente por qué. |
| 213 | + |
| 214 | +## Licencia |
| 215 | + |
| 216 | +[MIT](LICENSE). La licencia más corta que funciona. |
0 commit comments