{"id":51250401,"url":"https://github.com/dietrichgebert/ponytail","last_synced_at":"2026-07-06T14:00:50.082Z","repository":{"id":364186587,"uuid":"1266797999","full_name":"DietrichGebert/ponytail","owner":"DietrichGebert","description":"Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.","archived":false,"fork":false,"pushed_at":"2026-06-29T05:26:32.000Z","size":1973,"stargazers_count":65547,"open_issues_count":135,"forks_count":3371,"subscribers_count":147,"default_branch":"main","last_synced_at":"2026-06-29T07:23:24.755Z","etag":null,"topics":["agent-skills","ai-agents","claude","claude-code","claude-code-plugin","cursor-rules","developer-tools","llm","prompt-engineering","yagni"],"latest_commit_sha":null,"homepage":"https://ponytail.dev","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DietrichGebert.png","metadata":{"files":{"readme":"README.es.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["DietrichGebert"]}},"created_at":"2026-06-12T00:52:37.000Z","updated_at":"2026-06-29T07:23:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DietrichGebert/ponytail","commit_stats":null,"previous_names":["dietrichgebert/ponytail"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/DietrichGebert/ponytail","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DietrichGebert%2Fponytail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DietrichGebert%2Fponytail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DietrichGebert%2Fponytail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DietrichGebert%2Fponytail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DietrichGebert","download_url":"https://codeload.github.com/DietrichGebert/ponytail/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DietrichGebert%2Fponytail/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35165552,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-skills","ai-agents","claude","claude-code","claude-code-plugin","cursor-rules","developer-tools","llm","prompt-engineering","yagni"],"created_at":"2026-06-29T07:00:22.992Z","updated_at":"2026-07-06T14:00:50.061Z","avatar_url":"https://github.com/DietrichGebert.png","language":"JavaScript","funding_links":["https://github.com/sponsors/DietrichGebert"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-dark.png\"\u003e\n    \u003cimg src=\"assets/logo.png\" width=\"220\" alt=\"Ponytail, el senior dev flojo\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003ePonytail\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eNo dice nada. Escribe una línea. Funciona.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/stars/DietrichGebert/ponytail?style=flat-square\u0026color=111111\u0026label=stars\" alt=\"Stars\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/DietrichGebert/ponytail?style=flat-square\u0026color=111111\u0026label=release\" alt=\"Release\"\u003e\n  \u003cimg src=\"https://img.shields.io/npm/v/@dietrichgebert/ponytail?style=flat-square\u0026color=111111\u0026label=npm\" alt=\"npm\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/funciona%20con-15%20agentes-111111?style=flat-square\" alt=\"Works with 15 agents\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/licencia-MIT-111111?style=flat-square\" alt=\"MIT license\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://trendshift.io/repositories/50668\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg src=\"https://trendshift.io/api/badge/trendshift/repositories/50668/daily\" alt=\"DietrichGebert/ponytail | Trendshift\" width=\"250\" height=\"55\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://trendshift.io/repositories/50668\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\u003cimg src=\"https://trendshift.io/api/badge/trendshift/repositories/50668/weekly\" alt=\"DietrichGebert/ponytail | Trendshift\" width=\"250\" height=\"55\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e~54% menos código (hasta 94%) \u0026middot; ~20% más barato \u0026middot; ~27% más rápido \u0026middot; 100% seguro\u003c/strong\u003e\u003cbr\u003e\n  \u003csub\u003eMedido en sesiones reales de Claude Code editando un repo open-source real (FastAPI + React), contra el mismo agente sin skill. ~54% es el promedio de 12 tareas de feature (Haiku 4.5, n=4); llega al 94% cuando un agente sobre-construye (un selector de fechas) y es casi cero cuando el código ya es mínimo. ponytail mantiene cada guarda de seguridad, mientras que un prompt pelado de \"escribe one-liners\" se salta una. (El benchmark anterior de un solo disparo reportaba 80-94% como cifra plana; contra un baseline agéntico justo, ese es el techo por tarea, no el promedio.) \u003ca href=\"benchmarks/results/2026-06-18-agentic.md\"\u003eReporte completo\u003c/a\u003e \u0026middot; \u003ca href=\"benchmarks/\"\u003ereprodúcelo\u003c/a\u003e.\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eTraducción de la comunidad. La versión de referencia y más reciente es el \u003ca href=\"README.md\"\u003eREADME en inglés\u003c/a\u003e.\u003c/sub\u003e\n\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://ponytail.dev/soon\"\u003e\u003cimg src=\"assets/waitlist-banner-es.png\" alt=\"Algo nuevo está por llegar, únete a la lista\" width=\"760\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nLo 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.\n\nPonytail lo pone dentro de tu agente de IA.\n\n## Antes / después\n\nLe pides un selector de fechas. Tu agente instala flatpickr, escribe un componente wrapper, agrega un stylesheet, y empieza una discusión sobre zonas horarias.\n\nCon ponytail:\n\n```html\n\u003c!-- ponytail: el browser ya tiene uno --\u003e\n\u003cinput type=\"date\"\u003e\n```\n\nMás sobrevivientes en [examples/](examples/).\n\n## Números\n\nLa medición honesta es un agente real haciendo trabajo real: una sesión headless de Claude Code editando [el template full-stack-fastapi de tiangolo](https://github.com/fastapi/full-stack-fastapi-template) (un repo real de FastAPI + React), evaluada sobre el `git diff` que deja. Doce tickets de feature, el mismo agente con y sin el skill, n=4, Haiku 4.5.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/benchmark-agentic.svg\" width=\"860\" alt=\"Cada variante como porcentaje del baseline sin skill en LOC, tokens, costo y tiempo (Haiku 4.5). ponytail es el más bajo en cada métrica (LOC 46%, tokens 78%, costo 80%, tiempo 73%); caveman sube por encima del 100% en tokens, costo y tiempo; yagni-oneliner LOC 67%. Seguridad, tier adversarial aparte: baseline, caveman y ponytail 100%, yagni-oneliner 95%.\"\u003e\n\u003c/p\u003e\n\n| vs baseline sin skill | LOC | tokens | costo | tiempo | seguro |\n|---|--:|--:|--:|--:|--:|\n| **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |\n| caveman (control de prosa concisa) | -20% | +7% | +3% | +2% | 100% |\n| prompt \"YAGNI + one-liners\" | -33% | -14% | -21% | -30% | 95% |\n\nponytail es la única variante que recorta cada métrica, y la única que se mantiene totalmente segura al hacerlo. El recorte es mayor donde hay una trampa real de sobre-construcción (selector de fechas de 404 a 23 líneas, selector de color de 287 a 23, porque usa un `\u003cinput\u003e` nativo en vez de un componente) y casi cero en código que ya es mínimo. Método completo, tablas por tarea y limitaciones: [benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md).\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eNúmeros anteriores de un solo disparo (generación aislada)\u003c/strong\u003e\u003c/summary\u003e\n\nCinco tareas del día a día, tres modelos, tres variantes (sin skill, [caveman](https://github.com/JuliusBrussee/caveman), ponytail), diez ejecuciones, mediana reportada. Un prompt, una completación, contando las líneas de la respuesta:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/benchmark-3model.svg\" width=\"860\" alt=\"Mediana de líneas de código por variante en Haiku, Sonnet y Opus\"\u003e\n\u003c/p\u003e\n\nEsto mostraba **80-94% menos código**. [#126](https://github.com/DietrichGebert/ponytail/issues/126) señaló con razón que el baseline del modelo pelado infla su respuesta con prosa y opciones, así que esa diferencia es en parte un artefacto del baseline conversacional. Los números agénticos de arriba son la versión corregida y defendible. Reproduce la corrida de un solo disparo con `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`.\n\n\u003c/details\u003e\n\n**La regla nunca fue \"menos tokens.\"** Es: escribe solo lo que la tarea necesita, y nunca recortes validación, manejo de errores, seguridad ni accesibilidad. El código termina pequeño porque es necesario, no por golf. El menor costo y latencia son un efecto secundario en los modelos que siguen la escalera; un modelo de razonamiento conciso que gasta tokens de pensamiento deliberando los peldaños puede ir al revés (en GPT-5.5 lo hace).\n\n## Cómo funciona\n\nAntes de escribir código, el agente se detiene en el primer peldaño que aguanta:\n\n```\n1. ¿Necesita existir esto?        → no: omitirlo (YAGNI)\n2. ¿Ya existe en este código?     → reúsalo, no lo reescribas\n3. ¿Lo hace la stdlib?            → úsala\n4. ¿Es una feature nativa?        → úsala\n5. ¿Una dependencia ya instalada? → úsala\n6. ¿Cabe en una línea?            → una línea\n7. Solo entonces: el mínimo que funciona\n```\n\nLa escalera se recorre *después* de entender el problema, no en su lugar: lee el código que toca el cambio y sigue el flujo real antes de elegir un peldaño. Flojo en la solución, nunca en la lectura.\n\nFlojo, 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.\n\n## Instalación\n\nEl mayor esfuerzo que ponytail te va a pedir:\n\nLos 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.\n\n### Claude Code\n\n```\n/plugin marketplace add DietrichGebert/ponytail\n/plugin install ponytail@ponytail\n```\n\nLa app de escritorio no tiene el comando `/plugin`. Instálala desde la interfaz: Customize, el + junto a los plugins personales, Create plugin and add marketplace, Add from repository, y luego ingresa la URL del repo (gracias @NiklasDHahn, #98).\n\n### Codex\n\n```bash\ncodex plugin marketplace add DietrichGebert/ponytail\ncodex\n```\n\nAbre `/plugins`, selecciona el marketplace de Ponytail e instala Ponytail. Luego abre `/hooks`, revisa y autoriza sus dos lifecycle hooks, y empieza un nuevo hilo.\n\nEsta 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.\n\n### GitHub Copilot CLI\n\n```bash\ncopilot plugin marketplace add DietrichGebert/ponytail\ncopilot plugin install ponytail@ponytail\n```\n\nEn una sesión interactiva de Copilot CLI, usa los equivalentes con slash:\n\n```\n/plugin marketplace add DietrichGebert/ponytail\n/plugin install ponytail@ponytail\n```\n\nCopilot CLI agrupa los comandos del plugin bajo el nombre del plugin. Por ejemplo:\n\n```text\n/ponytail:ponytail ultra\n/ponytail:ponytail-review\n```\n\n### Pi agent harness\n\n```\npi install git:github.com/DietrichGebert/ponytail\n```\n\n### OpenCode\n\nAgrega esto a `opencode.json`:\n\n```json\n{ \"plugin\": [\"@dietrichgebert/ponytail\"] }\n```\n\nO ejecútalo desde un checkout (el plugin reutiliza sus `hooks/` y `skills/`):\n\n```json\n{ \"plugin\": [\"./.opencode/plugins/ponytail.mjs\"] }\n```\n\nInyecta 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`.\n\nEl 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).\n\n### Gemini CLI\n\n```bash\ngemini extensions install https://github.com/DietrichGebert/ponytail\n```\n\nCarga 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.\n\n### Antigravity CLI\n\nGoogle está renombrando Gemini CLI a Antigravity CLI (el binario `agy`); la misma extensión se instala ahí:\n\n```bash\nagy plugin install https://github.com/DietrichGebert/ponytail\n```\n\nReutiliza 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/`.\n\n### CodeWhale\n\nLee `AGENTS.md` desde la raíz del proyecto, sin configuración. Copia [`AGENTS.md`](AGENTS.md) a tu proyecto, o ejecuta `codewhale` desde un checkout de este repo. Eso es todo.\n\n### Devin CLI\n\n```bash\ndevin plugins install DietrichGebert/ponytail\n```\n\nInstala ponytail como plugin de Devin; los skills quedan disponibles como `/ponytail:ponytail`, `/ponytail:ponytail-review`, etc.\n\n### OpenClaw\n\n```bash\nclawhub install ponytail\n```\n\nInstala 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/`.\n\nEso fue todo. Él estaría orgulloso. No lo va a decir.\n\nActivo 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.\n\nConfigura 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`.\n\nCursor, 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/)).\n\nKiro: copia `.kiro/steering/ponytail.md` a `~/.kiro/steering/` (global) o `.kiro/steering/` en tu proyecto.\n\nFallback 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.\n\nVS 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).\n\nQué archivos corresponden a qué agente: [Portabilidad de agentes](docs/agent-portability.md).\n\n## Comandos\n\n| Comando | Qué hace |\n|---------|----------|\n| `/ponytail [lite \\| full \\| ultra \\| off]` | Cambia la intensidad, o apágalo. Sin argumento, reporta el nivel actual. |\n| `/ponytail-review` | Revisa el diff actual en busca de sobre-ingeniería y devuelve una lista de qué eliminar. |\n| `/ponytail-audit` | Audita el repo completo en busca de sobre-ingeniería, no solo el diff. |\n| `/ponytail-debt` | Recolecta los atajos marcados con `ponytail:` que dejaste pendientes en un registro, para que \"después\" no se convierta en \"nunca\". |\n| `/ponytail-help` | Referencia rápida de los comandos anteriores. |\n\nLos comandos requieren un host compatible con skills (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival). 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.\n\n## Desarrollo\n\nAl cambiar el texto compacto de las reglas, mantén alineadas las copias en los adaptadores:\n\n```bash\nnode scripts/check-rule-copies.js\nnpm test\n```\n\nEl 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.\n\nEl 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.\n\n## FAQ\n\n**¿Necesita un archivo de configuración?**\nNo. Un opcional `~/.config/ponytail/config.json` o la variable `PONYTAIL_DEFAULT_MODE` pueden fijar el nivel default, pero nada es obligatorio.\n\n**¿Y si realmente necesito la clase de caché de 120 líneas?**\nNo la necesitas. Insiste de todas formas y él la va a construir. Despacio. Correctamente. Mirándote.\n\n**¿Escala?**\nEl código que nunca escribiste escala infinitamente. Cero bugs, cero CVEs, 100% uptime desde siempre.\n\n**¿Por qué \"ponytail\"?**\nYa sabes exactamente por qué.\n\n## Patrocinadores\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://greenpt.com/\"\u003e\n    \u003cpicture\u003e\n      \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-greenpt-dark.svg\"\u003e\n      \u003cimg src=\"assets/logo-greenpt.svg\" width=\"260\" alt=\"GreenPT\"\u003e\n    \u003c/picture\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## Licencia\n\n[MIT](LICENSE). La licencia más corta que funciona.\n\n## Historial de estrellas\n\n\u003ca href=\"https://www.star-history.com/dietrichgebert/ponytail#history\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/chart?repos=DietrichGebert/ponytail\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/chart?repos=DietrichGebert/ponytail\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=DietrichGebert/ponytail\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdietrichgebert%2Fponytail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdietrichgebert%2Fponytail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdietrichgebert%2Fponytail/lists"}