字数 5841,阅读大约需 25 分钟
GitHub上最近冒出来一个项目叫ponytail,41.1k Star,是一个非常火爆的AI编程类插件,在三天内新增1万多的 Star,开源不到一周干了四万多Star,作为一名程序员,必须好奇的探究一波。
AI编程Agent好用是好用,但你让它写个功能,它恨不得把半本《设计模式》复现一遍,三行代码能搞定的事,能给你写出三百行,虽然有时不得不说它写的比我还优雅。
ponytail就是反过来干的,强行干预,不让Agent炫技,让它动笔之前先过脑子。
项目简介 ponytail干的事说起来简单: 给AI编程Agent灌一套"懒人老程序员"的思维方式。
你见过那种在公司待了十几年的老程序员吧?扎个马尾,戴椭圆眼镜,你把五十行代码给他看,他扫一眼,删掉四十九行,改成一行,能跑,还不带bug。
ponytail要的就是这个效果,我让Agent写个日期选择器,没装之前它能装个flatpickr库、写wrapper组件、加CSS、顺带跟你讨论时区。装完之后回你一行 ,浏览器本来就支持,一行HTML,够用了。
功能详情 Agent动笔之前要先过的六层关卡 ponytail不是简单跟Agent说"你写少点"。它有一套规则,Agent每次要写代码之前,按顺序走一遍:
这套东西我用下来最大的感受是,Agent不再一上来就import一堆有的没的。它开始先翻标准库,再翻已经装了的依赖,实在不行才动手写。
有个细节我挺喜欢,ponytail不是那种"懒到连校验都不做"的蠢懒。它的规则写得很死:信任边界的输入校验、防止数据丢失的错误处理、安全逻辑、无障碍访问,这些东西绝对不能砍。懒的是代码量,不是脑子。
它的AGENTS.md里原话是"Lazy means efficient, not careless."翻译过来大概是: 懒是高效,不是粗心 。
还有一个有意思的规定:Agent如果故意简化了代码,得在简化处加 ponytail: 注释。要是这个简化有已知上限,比如全局锁或者O(n²)扫描,注释里还得写清楚上限在哪、后面想升级该怎么走,这比闷头删代码要负责任得多。
支持哪些Agent:Claude Code、Codex、Copilot CLI等等 ponytail覆盖的Agent数量非常多,它不是一个"Claude Code专属"的小插件,而是正儿八经适配了14个。
插件级别的完整支持(带命令、模式切换、生命周期钩子):Claude Code、Codex、OpenCode、pi、Gemini CLI、GitHub Copilot CLI。
规则文件级别的支持(丢一个AGENTS.md或者项目规则进去就行):Cursor、Windsurf、Cline、GitHub Copilot编辑器、Kiro、Aider、CodeWhale、Zed、OpenClaw、Antigravity CLI。
两种方式分得挺清楚,对Claude Code和Codex这种插件系统完善的,提供marketplace一键安装加全套 /ponytail 命令。对Cursor和Windsurf这种只吃规则文件的,直接丢一份规则进去,六层关卡照样跑。
我自己主力是Claude Code,装的插件版。旁边同事用Cursor,复制个规则文件进去也能用。插件版多了模式切换和review命令,但核心的六层关卡两边一样。
装完能用的几个命令 插件版装好以后,ponytail给了几个斜杠命令,直接在对话里敲。
• /ponytail lite | full | ultra | off
用来切模式。lite是温和提醒,full是默认强度,ultra嘛,怎么说呢,你被自己的代码库气到想掀桌子的时候开的。off就是关掉,让它恢复成一个正常Agent。 • /ponytail-review 扫一眼当前改动的diff,把过度工程化的地方揪出来,给一份删除清单。我每次让Agent写完代码都会跑一遍这个,经常能揪出那种"Agent觉得有必要但其实没必要的抽象层"。 • /ponytail-audit 不是只看diff,是审整个仓库。手头有老项目想清代码债的话,跑一遍就知道了。 • /ponytail-debt 这个解决了一个经典问题,我们写代码的时候经常说"先这么写,以后再改",然后永远不改。ponytail要求Agent在简化处加 ponytail: 注释,这个命令就是把这些注释全部收集起来列成一张清单,以后不再是永远不改了。 • /ponytail-gain 弹出基准测试的分数:少写了多少代码、省了多少钱、快了多久,看着挺爽的。 • /ponytail-help 就是快速翻一下上面这些命令的参考。 拿几个真实例子看看效果 ponytail的examples目录里放了不少对比,同一个任务、同一个模型(Claude Haiku 4.5)、温度1,装了ponytail和没装各跑一遍,不是手写的,是真实模型输出。
Email验证这个例子比较直观,没装ponytail的时候Agent写了75行,三个版本:基础正则版、进阶校验版、推荐的第三方库版,末尾还附了使用说明和对比表。
装了ponytail之后回了3行:
import re def is_valid_email ( email: str ) -> bool : return bool (re. match ( r'^[^@]+@[^@]+\.[^@]+$' , email)) Agent自己加的注释也挺有道理:跳过了RFC 5322解析器、DNS MX查询、确认邮件,等真的需要拒绝那种带加号的复杂邮箱地址或者抓错别字的时候再加。现在这个能挡掉99%的"手滑打错了"。
Debounce的例子更夸张,没装ponytail:116行,包括debounce工具函数、带loading状态版、带cancel和immediate选项的高级版,外加HTML和CSS,装完:就10行。
const searchInput = document . querySelector ( 'input[type="search"]' ); let debounceTimer; searchInput. addEventListener ( 'input' , ( e ) => { clearTimeout (debounceTimer); debounceTimer = setTimeout ( () => { fetch ( `/api/search?q= ${ encodeURIComponent (e.target.value)} ` ) . then ( r => r. json ()) . then ( data => console .
log (data)); }, 300 ); }); Agent的注释说得很实在: setTimeout 加 clearTimeout 本身就是debounce,不需要抽一个工具函数出来,除非有三个以上的输入框同时需要。仔细想想,确实是这样。
还有一个是从benchmark里拿的真实agentic测试,不是单次prompt生成,是真的让Claude Code在真实仓库里改代码。
任务加个日期选择器。没装ponytail时Agent装了flatpickr、写了wrapper、加了CSS,404行。装完之后直接 ,23行。
颜色选择器同理,287行变成23行,因为 浏览器自带。用原生控件就能搞定的事,Agent偏偏要给你造轮子,ponytail治的就是这个。
他们自己做了一套基准测试 ponytail的benchmark这块花了点心思,第一版测试出来号称减80-94%代码,然后社区有人(Colin Eberhardt)在issue里提了四个问题,每个都问到点子上:单次prompt生成不是Agent真实用法、基线模型废话太多拉大了差距、写少点会不会牺牲安全、一个短prompt是不是也能达到同样效果。
作者Dietrich Gebert的反应挺有意思,他不是反驳,而是直接把benchmark整个推翻重做了。
新版本用的是真实的headless Claude Code会话,对着一个公开的FastAPI+React开源仓库( tiangolo/full-stack-fastapi-template ),安排了12个真实feature ticket,四组对照: 裸Agent 、 ponytail 、 caveman控制组 、 纯oneliner提示词组 ,每个任务重复跑4遍。不用模型输出的字数算,直接用 git diff 的添加行数。
跑下来的结果是ponytail平均减54%代码,token消耗减22%,费用降两成,时间快两成七。安全测试全过,100%。那个纯oneliner提示词组在安全测试上丢了一分,95%。
caveman组的结果有点意思哈,caveman是只让模型回复简洁、不改变代码逻辑。它把代码减了20%,但token消耗反而多了7%。也就是说,话说少了,但该写的代码没少写,脑子还是转了那么多轮。ponytail的减码靠的不是"话少",是六层关卡从根本上让Agent少干活。
我自己觉得最实在的数字不是54%那个总平均,而是收敛点:后端CRUD这种本来就精简的代码,四组几乎一样,ponytail没瞎砍。日期选择器、颜色选择器这些有"过度工程陷阱"的功能,差距拉到90%以上。该砍的砍,不该砍的不碰,这点让人放心。
模式怎么切换 ponytail四个模式,默认full。lite提醒得比较温柔,ultra是那种你真的被代码库气到了才会开的。
改默认模式两种办法。环境变量:
PONYTAIL_DEFAULT_MODE=lite|full|ultra|off 或者建个配置文件 ~/.config/ponytail/config.json ,里面写
{"defaultMode": "ultra"} Windows的话路径是 %APPDATA%\ponytail\config.json 。
快速上手 ponytail装起来基本上不用费什么劲
Claude Code(插件完整版)
在对话里直接敲:
/plugin marketplace add DietrichGebert/ponytail /plugin install ponytail@ponytail 装完每次新开session自动激活,启动时会提示当前模式。桌面版Claude Code没有 /plugin 命令,从UI走:Customize → 个人插件旁边的加号 → 创建插件并添加市场 → 从仓库添加,输入repo链接就行。
Codex
codex plugin marketplace add DietrichGebert/ponytail 然后打开 /plugins ,选Ponytail市场安装,再去 /hooks 看一眼两个生命周期钩子,审核信任一下,完事。
GitHub Copilot CLI
copilot plugin marketplace add DietrichGebert/ponytail copilot plugin install ponytail@ponytail 交互式会话里也可以用斜杠命令,一样的效果。
Gemini CLI / Antigravity CLI
gemini extensions install https://github.com/DietrichGebert/ponytail Antigravity的话把gemini换成agy: agy plugin install https://github.com/DietrichGebert/ponytail 。
OpenCode
从ponytail的 repo checkout 出来跑,在项目的 opencode.json 里加一行:
{ "plugin" : [ "./.opencode/plugins/ponytail.mjs" ] } CodeWhale
什么都不用装,CodeWhale自己会读项目根目录的 AGENTS.md ,把ponytail的AGENTS.md往项目里一丢就行了。
OpenClaw
clawhub install ponytail review、audit、debt、gain、help这些附属技能也是一样的装法, clawhub install ponytail-review 这样。
Cursor / Windsurf / Cline / Kiro / Zed / Aider
这些Agent只支持规则文件,复制对应的规则进去就行,不用任何安装命令。ponytail的项目里各种格式都给备好了: .cursor/rules/ponytail.mdc 、 .windsurf/rules/ponytail.md 、 .clinerules/ponytail.md 、 .kiro/steering/ponytail.md ,挑自己Agent对应的那个扔进去。
有几个小地方说一下。ponytail的Claude Code和Codex插件里有两个小型的Node.js生命周期钩子,所以 node 得在PATH里。如果是Nix或者nvm管Node的,确认一下非交互式shell也能找到。没有node也不影响规则生效,只是每次启动时的自动激活会静默跳过。
几个要注意的 虽然不是大问题,但用之前知道一下没坏处。
mit协议,随便用随便改,项目活跃度拉满,star 41.1k、fork 2k、issue区22个开着、PR挂了32个,维护者一直在处理。
ponytail的规则是"懒代码不懒安全",但如果Agent本身那个模型推理太拉胯,六层关卡也救不回来,你跑的底层模型很重要。
收尾 ponytail是我今年装过最省心的Agent插件,它没让Agent变聪明,但把它最容易犯的毛病也就是过度工程化,治了个七七八八。
零配置,一个插件,14个Agent通吃,代码量砍一半,费用降两成,安全性不掉链子。GitHub trending第一名算是实至名归。
装完之后Claude Code写代码的风格整个变了。以前像个刚看完《设计模式》急着显摆的实习生,现在像个扎马尾的老程序员:不说话,敲一行,能跑。
GitHub仓库:
https://github.com/DietrichGebert/ponytail