Swap em dashes for commas/colons/periods in the README, skills, AGENTS.md and its five rule copies, examples, command files, and benchmark README. Rule copies stay in sync (same edit applied to all) and the invariant guard passes. Left untouched on purpose: the vendored caveman SKILL.md (verbatim third-party text), the dated benchmark writeups in results/ (historical records), and .js code comments. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
142 lines
5.1 KiB
Markdown
142 lines
5.1 KiB
Markdown
<p align="center">
|
||
<img src="assets/logo.png" width="220" alt="Ponytail, the lazy senior dev">
|
||
</p>
|
||
|
||
<h1 align="center">Ponytail</h1>
|
||
|
||
<p align="center">
|
||
<em>He says nothing. He writes one line. It works.</em>
|
||
</p>
|
||
|
||
<p align="center">
|
||
<img src="https://img.shields.io/github/stars/DietrichGebert/ponytail?style=flat-square&color=111111&label=stars" alt="Stars">
|
||
<img src="https://img.shields.io/github/v/release/DietrichGebert/ponytail?style=flat-square&color=111111&label=release" alt="Release">
|
||
<img src="https://img.shields.io/badge/works%20with-10%20agents-111111?style=flat-square" alt="Works with 10 agents">
|
||
<img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT license">
|
||
</p>
|
||
|
||
<p align="center">
|
||
<strong>80-94% less code · 3-6× faster · 47-77% cheaper</strong><br>
|
||
<sub>Median of 10 runs across Haiku, Sonnet, and Opus. <a href="benchmarks/">Reproduce it yourself.</a></sub>
|
||
</p>
|
||
|
||
---
|
||
|
||
You know him. Long ponytail. Oval glasses. Has been at the company longer than the version control. You show him fifty lines; he looks at them, says nothing, and replaces them with one.
|
||
|
||
Ponytail puts him inside your AI agent.
|
||
|
||
## Before / after
|
||
|
||
You ask for a date picker. Your agent installs flatpickr, writes a wrapper component, adds a stylesheet, and starts a discussion about timezones.
|
||
|
||
With ponytail:
|
||
|
||
```html
|
||
<!-- ponytail: browser has one -->
|
||
<input type="date">
|
||
```
|
||
|
||
More survivors in [examples/](examples/).
|
||
|
||
## Numbers
|
||
|
||
Five everyday tasks (email validator, debounce, CSV sum, countdown timer, rate limiter), three models, three arms: no skill, the [caveman](https://github.com/JuliusBrussee/caveman) skill, and ponytail. Ten runs per cell, median reported.
|
||
|
||
<p align="center">
|
||
<img src="assets/benchmark-3model.svg" width="860" alt="Median lines of code per arm across Haiku, Sonnet and Opus; ponytail writes 80-94% less code than the no-skill baseline">
|
||
</p>
|
||
|
||
**80-94% less code, 47-77% less cost, and 3-6× faster than a no-skill agent, on every model.** Every shortcut ponytail takes is marked in the code with a `ponytail:` comment naming its upgrade path. Reproduce it yourself: `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`. Method and raw numbers: [benchmarks/](benchmarks/). Production-grade tasks, where an unconstrained agent bloats far more, are written up in [benchmarks/results/](benchmarks/results/).
|
||
|
||
## How it works
|
||
|
||
Before writing code, the agent stops at the first rung that holds:
|
||
|
||
```
|
||
1. Does this need to exist? → no: skip it (YAGNI)
|
||
2. Stdlib does it? → use it
|
||
3. Native platform feature? → use it
|
||
4. Installed dependency? → use it
|
||
5. One line? → one line
|
||
6. Only then: the minimum that works
|
||
```
|
||
|
||
Lazy, not negligent: trust-boundary validation, data-loss handling, security, and accessibility are never on the chopping block.
|
||
|
||
## Install
|
||
|
||
The most effort ponytail will ever ask of you:
|
||
|
||
### Claude Code
|
||
|
||
```
|
||
/plugin marketplace add DietrichGebert/ponytail
|
||
/plugin install ponytail@ponytail
|
||
```
|
||
|
||
### Codex
|
||
|
||
```bash
|
||
codex plugin marketplace add DietrichGebert/ponytail
|
||
codex
|
||
```
|
||
|
||
Open `/plugins`, select the Ponytail marketplace, and install Ponytail. Then
|
||
open `/hooks`, review and trust its two lifecycle hooks, and start a new thread.
|
||
|
||
### Pi agent harness
|
||
|
||
```
|
||
pi install git:github.com/DietrichGebert/ponytail
|
||
```
|
||
|
||
### OpenCode
|
||
|
||
Run OpenCode from a checkout of this repo (the plugin reuses its `hooks/` and `skills/`), and add to `opencode.json`:
|
||
|
||
```json
|
||
{ "plugin": ["./.opencode/plugins/ponytail.mjs"] }
|
||
```
|
||
|
||
Injects the ruleset every turn at the active level; adds `/ponytail` and `/ponytail-review`. OpenCode also auto-loads this repo's `AGENTS.md`, so the rules hold even without the plugin. The plugin adds the `lite/full/ultra/off` levels.
|
||
|
||
That was it. He'd be proud. He won't say it.
|
||
|
||
Active every session. `/ponytail-review` finds what to delete in your diff. `/ponytail ultra` exists for when the codebase has wronged you personally. `/ponytail-help` explains the rest.
|
||
|
||
In Codex, invoke the skills as `@ponytail`, `@ponytail-review`, and
|
||
`@ponytail-help`. Startup and mode-change text shows the current mode.
|
||
|
||
Cursor, Windsurf, Cline, Copilot, Aider, Kiro: copy the matching rules file from this 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/)).
|
||
|
||
Kiro: copy `.kiro/steering/ponytail.md` to `~/.kiro/steering/` (global) or `.kiro/steering/` in your project.
|
||
|
||
Which files map to which agent: [Agent portability](docs/agent-portability.md).
|
||
|
||
## Development
|
||
|
||
When changing the compact rule text, keep the agent copies aligned:
|
||
|
||
```bash
|
||
node scripts/check-rule-copies.js
|
||
```
|
||
|
||
## FAQ
|
||
|
||
**Does it need a config file?**
|
||
No.
|
||
|
||
**What if I really need the 120-line cache class?**
|
||
You don't. Insist anyway and he'll build it. Slowly. Correctly. While looking at you.
|
||
|
||
**Does it scale?**
|
||
The code you never wrote scales infinitely. Zero bugs, zero CVEs, 100% uptime since forever.
|
||
|
||
**Why "ponytail"?**
|
||
You know exactly why.
|
||
|
||
## License
|
||
|
||
[MIT](LICENSE). The shortest license that works.
|