@herbertgao/pi-extensions 2026.10.0 → 2026.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +7 -7
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-audit.md +1 -1
  4. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-debt.md +1 -1
  5. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-gain.md +1 -1
  6. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail-review.md +1 -1
  7. package/node_modules/@dietrichgebert/ponytail/.opencode/command/ponytail.md +1 -1
  8. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/index.js +4 -0
  9. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail-frontmatter.cjs +43 -3
  10. package/node_modules/@dietrichgebert/ponytail/.opencode/plugins/ponytail.mjs +142 -59
  11. package/node_modules/@dietrichgebert/ponytail/.qoder-plugin/plugin.json +1 -1
  12. package/node_modules/@dietrichgebert/ponytail/README.es.md +87 -204
  13. package/node_modules/@dietrichgebert/ponytail/README.ja.md +212 -0
  14. package/node_modules/@dietrichgebert/ponytail/README.ko.md +92 -226
  15. package/node_modules/@dietrichgebert/ponytail/README.md +58 -244
  16. package/node_modules/@dietrichgebert/ponytail/README.zh-CN.md +212 -0
  17. package/node_modules/@dietrichgebert/ponytail/hooks/claude-codex-hooks.json +3 -3
  18. package/node_modules/@dietrichgebert/ponytail/hooks/copilot-hooks.json +4 -4
  19. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-activate.js +63 -16
  20. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-config.js +8 -7
  21. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-mode-tracker.js +46 -23
  22. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-runtime.js +39 -7
  23. package/node_modules/@dietrichgebert/ponytail/hooks/ponytail-subagent.js +20 -3
  24. package/node_modules/@dietrichgebert/ponytail/hooks/qoder-hooks.json +3 -3
  25. package/node_modules/@dietrichgebert/ponytail/package.json +2 -2
  26. package/node_modules/@dietrichgebert/ponytail/pi-extension/index.js +47 -17
  27. package/node_modules/@dietrichgebert/ponytail/scripts/uninstall.js +21 -7
  28. package/node_modules/@dietrichgebert/ponytail/skills/plugin.json +5 -0
  29. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-audit/SKILL.md +7 -2
  30. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-debt/SKILL.md +1 -1
  31. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-gain/SKILL.md +16 -14
  32. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-help/SKILL.md +3 -3
  33. package/node_modules/@dietrichgebert/ponytail/skills/ponytail-review/SKILL.md +12 -7
  34. package/node_modules/@narumitw/pi-caffeinate/package.json +4 -4
  35. package/node_modules/pi-typesafe/README.md +1 -1
  36. package/node_modules/pi-typesafe/dist/backends.d.ts +15 -5
  37. package/node_modules/pi-typesafe/dist/backends.js +18 -0
  38. package/node_modules/pi-typesafe/dist/client.d.ts +4 -3
  39. package/node_modules/pi-typesafe/dist/client.js +22 -7
  40. package/node_modules/pi-typesafe/dist/index.d.ts +2 -2
  41. package/node_modules/pi-typesafe/dist/index.js +1 -1
  42. package/node_modules/pi-typesafe/dist/usage.d.ts +14 -4
  43. package/node_modules/pi-typesafe/dist/usage.js +147 -42
  44. package/node_modules/pi-typesafe/package.json +1 -1
  45. package/node_modules/pi-web-access/CHANGELOG.md +48 -0
  46. package/node_modules/pi-web-access/README.md +57 -11
  47. package/node_modules/pi-web-access/brave-rate-limit.ts +8 -2
  48. package/node_modules/pi-web-access/curator-page.ts +5 -1
  49. package/node_modules/pi-web-access/curator-server.ts +2 -0
  50. package/node_modules/pi-web-access/declared-web-links.ts +2 -2
  51. package/node_modules/pi-web-access/degoog.ts +323 -0
  52. package/node_modules/pi-web-access/dist/index.js +3483 -2745
  53. package/node_modules/pi-web-access/dist/mcp-cli.js +27443 -0
  54. package/node_modules/pi-web-access/exa.ts +5 -1
  55. package/node_modules/pi-web-access/extract.ts +41 -3
  56. package/node_modules/pi-web-access/firecrawl.ts +35 -4
  57. package/node_modules/pi-web-access/gemini-search.ts +34 -11
  58. package/node_modules/pi-web-access/gemini-web.ts +14 -9
  59. package/node_modules/pi-web-access/index.ts +153 -1202
  60. package/node_modules/pi-web-access/keenable.ts +221 -0
  61. package/node_modules/pi-web-access/mcp-cli.ts +40 -0
  62. package/node_modules/pi-web-access/mcp-server.ts +81 -0
  63. package/node_modules/pi-web-access/mcp-tool-definitions.ts +117 -0
  64. package/node_modules/pi-web-access/openai-search.ts +34 -1
  65. package/node_modules/pi-web-access/package.json +23 -5
  66. package/node_modules/pi-web-access/perplexity.ts +64 -56
  67. package/node_modules/pi-web-access/tool-arguments.ts +20 -0
  68. package/node_modules/pi-web-access/video-extract.ts +1 -1
  69. package/node_modules/pi-web-access/web-tool-contract.ts +86 -0
  70. package/node_modules/pi-web-access/web-tool-core.ts +1502 -0
  71. package/node_modules/pi-web-access/youtube-extract.ts +2 -5
  72. package/package.json +6 -6
  73. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-3model.svg +0 -21
  74. package/node_modules/@dietrichgebert/ponytail/assets/benchmark-agentic.svg +0 -62
  75. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.png +0 -0
  76. package/node_modules/@dietrichgebert/ponytail/assets/logo-dark.svg +0 -115
  77. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt-dark.svg +0 -27
  78. package/node_modules/@dietrichgebert/ponytail/assets/logo-greenpt.svg +0 -27
  79. package/node_modules/@dietrichgebert/ponytail/assets/logo.png +0 -0
  80. package/node_modules/@dietrichgebert/ponytail/assets/retriever-icon.png +0 -0
  81. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-dark.svg +0 -4
  82. package/node_modules/@dietrichgebert/ponytail/assets/retriever-logo-light.svg +0 -4
  83. package/node_modules/@dietrichgebert/ponytail/assets/social-preview.png +0 -0
  84. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-es.png +0 -0
  85. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner-ko.png +0 -0
  86. package/node_modules/@dietrichgebert/ponytail/assets/waitlist-banner.png +0 -0
@@ -31,11 +31,11 @@
31
31
 
32
32
  <p align="center">
33
33
  <strong>~54% less code (up to 94%) &middot; ~20% cheaper &middot; ~27% faster &middot; 100% safe</strong><br>
34
- <sub>Measured on real Claude Code sessions editing a real open-source repo (FastAPI + React), against the same agent with no skill. ~54% is the mean across 12 feature tasks (Haiku 4.5, n=4); it reaches 94% where an agent over-builds (a date picker) and is near zero where the code is already minimal. ponytail keeps every safety guard while a bare "write one-liners" prompt drops one. (The earlier single-shot benchmark reported 80-94% as a flat figure; against a fair agentic baseline that is the per-task ceiling, not the average.) <a href="benchmarks/results/2026-06-18-agentic.md">Full writeup</a> &middot; <a href="benchmarks/">reproduce it</a>.</sub>
34
+ <sub>Real Claude Code sessions editing a real FastAPI + React repo, the same agent with and without the skill (12 feature tasks, Haiku 4.5, n=4). <a href="#numbers">Details</a>.</sub>
35
35
  </p>
36
36
 
37
37
  <p align="center">
38
- <sub><a href="README.es.md">Español</a> &middot; <a href="README.ko.md">한국어</a></sub>
38
+ <sub><a href="README.es.md">Español</a> &middot; <a href="README.ko.md">한국어</a> &middot; <a href="README.zh-CN.md">简体中文</a> &middot; <a href="README.ja.md">日本語</a></sub>
39
39
  </p>
40
40
 
41
41
  ---
@@ -59,75 +59,13 @@ You know him. Long ponytail. Oval glasses. Has been at the company longer than t
59
59
 
60
60
  Ponytail puts him inside your AI agent.
61
61
 
62
- ## Before / after
63
-
64
- You ask for a date picker. Your agent installs flatpickr, writes a wrapper component, adds a stylesheet, and starts a discussion about timezones.
65
-
66
- With ponytail:
67
-
68
- ```html
69
- <!-- ponytail: browser has one -->
70
- <input type="date">
71
- ```
72
-
73
- More survivors in [examples/](examples/).
74
-
75
- ## Numbers
76
-
77
- The honest measurement is a real agent doing real work: a headless Claude Code session editing [tiangolo's full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) (a real FastAPI + React repo), scored on the `git diff` it leaves behind. Twelve feature tickets, the same agent with and without the skill, n=4, Haiku 4.5.
78
-
79
- <p align="center">
80
- <img src="assets/benchmark-agentic.svg" width="860" alt="Each arm as a percent of the no-skill baseline across LOC, tokens, cost and time (Haiku 4.5). ponytail is lowest on every metric (LOC 46%, tokens 78%, cost 80%, time 73%); caveman rises above 100% on tokens, cost and time; yagni-oneliner LOC 67%. Safety, separate adversarial tier: baseline, caveman and ponytail 100%, yagni-oneliner 95%.">
81
- </p>
82
-
83
- | vs no-skill baseline | LOC | tokens | cost | time | safe |
84
- |---|--:|--:|--:|--:|--:|
85
- | **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |
86
- | caveman (terse-prose control) | -20% | +7% | +3% | +2% | 100% |
87
- | "YAGNI + one-liners" prompt | -33% | -14% | -21% | -30% | 95% |
88
-
89
- ponytail is the only arm that cuts every metric, and the only one that stays fully safe while doing it. The cut is biggest where there is a real over-build trap (date picker 404 to 23 lines, color picker 287 to 23, because it reaches for a native `<input>` instead of a component) and near zero on code that is already minimal. Full method, per-task tables, and limitations: [benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md).
90
-
91
- <details>
92
- <summary><strong>Older single-shot numbers (isolated generation)</strong></summary>
93
-
94
- Five everyday tasks, three models, three arms (no skill, [caveman](https://github.com/JuliusBrussee/caveman), ponytail), ten runs, median reported. One prompt, one completion, counting lines of the answer:
95
-
96
- <p align="center">
97
- <img src="assets/benchmark-3model.svg" width="860" alt="Median lines of code per arm across Haiku, Sonnet and Opus">
98
- </p>
99
-
100
- This showed **80-94% less code**. [#126](https://github.com/DietrichGebert/ponytail/issues/126) fairly pointed out that the bare-model baseline pads its answer with prose and options, so that gap is partly a conversational-baseline artifact. The agentic numbers above are the corrected, defensible version. Reproduce the single-shot run with `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`.
101
-
102
- </details>
103
-
104
- **The rule was never "fewest tokens."** It is: write only what the task needs, and never cut validation, error handling, security, or accessibility. The code ends up small because it is necessary, not golfed. Lower cost and latency are a side effect on the models that follow the ladder; a terse reasoning model that spends thinking tokens deliberating the rungs can go the other way (on GPT-5.5 it does).
105
-
106
- ## How it works
62
+ ## The prompt
107
63
 
108
- Before writing code, the agent stops at the first rung that holds:
109
-
110
- ```
111
- 1. Does this need to exist? → no: skip it (YAGNI)
112
- 2. Already in this codebase? → reuse it, don't rewrite
113
- 3. Stdlib does it? → use it
114
- 4. Native platform feature? → use it
115
- 5. Installed dependency? → use it
116
- 6. One line? → one line
117
- 7. Only then: the minimum that works
118
- ```
119
-
120
- The ladder runs *after* it understands the problem, not instead of it: it reads the code the change touches and traces the real flow before picking a rung. Lazy about the solution, never about reading.
121
-
122
- Lazy, not negligent: trust-boundary validation, data-loss handling, security, and accessibility are never on the chopping block.
64
+ Ponytail is one prompt: [`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md). The compact version, for agents that read a rules file, is [`AGENTS.md`](AGENTS.md). Everything else in this repo loads that prompt into different agents.
123
65
 
124
66
  ## Install
125
67
 
126
- The most effort ponytail will ever ask of you:
127
-
128
- The Claude Code and Codex plugins (and the Cursor hooks) run two tiny Node.js lifecycle hooks, so `node` needs to be on your PATH (note for Nix/nvm users: it must be on the non-interactive shell's PATH). If it isn't, the skills still work, the always-on activation just stays quiet instead of erroring on every prompt.
129
-
130
- ### Claude Code
68
+ **Claude Code**, as two separate prompts:
131
69
 
132
70
  ```
133
71
  /plugin marketplace add DietrichGebert/ponytail
@@ -135,222 +73,98 @@ The Claude Code and Codex plugins (and the Cursor hooks) run two tiny Node.js li
135
73
  ```
136
74
  /plugin install ponytail@ponytail
137
75
  ```
138
- (You have to send two separate prompts for the install to work)
139
-
140
- Same steps in the Claude Code Desktop app's Code tab: type the two `/plugin` commands above into the prompt box, or click the **+** button next to it, choose **Plugins** → **Add plugin** to browse your configured marketplaces, and manage marketplaces from **Customize** in the sidebar.
141
76
 
142
- ### Codex
77
+ **Codex:**
143
78
 
144
79
  ```bash
145
80
  codex plugin marketplace add DietrichGebert/ponytail
146
81
  codex plugin add ponytail@ponytail
147
82
  ```
148
83
 
149
- Run `codex` and open `/hooks`, review and trust its two lifecycle hooks, and start a new thread.
150
-
151
- This same install also covers the Codex desktop app: restart the app after installing and it picks up the plugin.
152
-
153
- ### GitHub Copilot CLI
154
-
155
- ```bash
156
- copilot plugin marketplace add DietrichGebert/ponytail
157
- copilot plugin install ponytail@ponytail
158
- ```
159
-
160
- In an interactive Copilot CLI session, use the slash equivalents:
161
-
162
- ```
163
- /plugin marketplace add DietrichGebert/ponytail
164
- /plugin install ponytail@ponytail
165
- ```
166
-
167
- Copilot CLI namespaces plugin commands by plugin name. For example:
168
-
169
- ```text
170
- /ponytail:ponytail ultra
171
- /ponytail:ponytail-review
172
- ```
173
-
174
- ### Pi agent harness
175
-
176
- ```
177
- pi install git:github.com/DietrichGebert/ponytail
178
- ```
179
-
180
- ### OpenCode
181
-
182
- Add to `opencode.json`:
183
-
184
- ```json
185
- { "plugin": ["@dietrichgebert/ponytail"] }
186
- ```
187
-
188
- Run from a checkout instead (the plugin reuses `hooks/` and `skills/`):
189
-
190
- ```json
191
- { "plugin": ["./.opencode/plugins/ponytail.mjs"] }
192
- ```
193
-
194
- Injects the ruleset every turn at the active level; adds the `/ponytail` commands (see [Commands](#commands)). 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.
195
-
196
- The `./` path resolves against your project's `opencode.json`; to share one checkout across projects, point it at the absolute path of the `.mjs` instead (it finds its `hooks/` and `skills/` relative to its own file).
197
-
198
- ### Gemini CLI
199
-
200
- ```bash
201
- gemini extensions install https://github.com/DietrichGebert/ponytail
202
- ```
203
-
204
- Loads the ruleset as always-on context every session and registers the `/ponytail` commands; the `skills/` ship too, activated when a task needs them.
205
- The Gemini adapter intentionally does not ship a root `hooks/hooks.json`: Gemini auto-loads that path, while Ponytail's lifecycle hooks use Claude/Codex event names.
84
+ Then open `/hooks` in Codex, trust its two lifecycle hooks, and start a new thread.
206
85
 
207
- ### Qoder
86
+ **Any other agent:** copy [`AGENTS.md`](AGENTS.md) into your project, or ask your agent to install [`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md) as a skill. Step by step for Copilot, Cursor, OpenCode, Gemini and the rest: **[INSTALL.md](INSTALL.md)**.
208
87
 
209
- Qoder auto-loads `AGENTS.md` from the repo root as always-on context, so running ponytail from a checkout works with zero setup. For per-project rules, copy [`.qoder/rules/ponytail.md`](.qoder/rules/ponytail.md) into your project's `.qoder/rules/`. The six ponytail skills (`/ponytail`, `/ponytail-review`, `/ponytail-audit`, `/ponytail-debt`, `/ponytail-gain`, `/ponytail-help`) are available via Qoder's Skill system; the plugin manifest at [`.qoder-plugin/plugin.json`](.qoder-plugin/plugin.json) points at the `skills/` directory.
210
-
211
- For full plugin-tier support (automatic mode activation + ruleset injection on every prompt), add the hooks from [`hooks/qoder-hooks.json`](hooks/qoder-hooks.json) to your `.qoder/settings.json`. Replace `PONYTAIL_DIR` with the path to your ponytail checkout. Qoder's `UserPromptSubmit` hook activates the default mode on first prompt and injects the ruleset every turn; `PreToolUse` with `task|Task` matcher injects the ruleset into subagents. Level switches (`/ponytail lite|full|ultra|off`) work automatically.
212
-
213
- ### Antigravity CLI
214
-
215
- Google is renaming Gemini CLI to Antigravity CLI (the `agy` binary); the same extension installs there:
216
-
217
- ```bash
218
- agy plugin install https://github.com/DietrichGebert/ponytail
219
- ```
220
-
221
- It reuses this repo's `gemini-extension.json`. One difference: Antigravity converts the `/ponytail` commands into skills, so you type them into the chat (e.g. `/ponytail-review` as a message) instead of picking them from a slash menu. Until the migration completes (around June 18, 2026), `gemini extensions install` still works too. To run it as an always-on rule instead, drop the ruleset into `.agents/rules/`.
222
-
223
- ### Hermes Agent
224
-
225
- ```bash
226
- hermes plugins install DietrichGebert/ponytail --enable
227
- ```
228
-
229
- Restart Hermes after installing. The plugin injects the active Ponytail mode before each LLM turn, registers the bundled skills as `ponytail:<skill>`, and adds `/ponytail`, `/ponytail-review`, `/ponytail-audit`, `/ponytail-debt`, `/ponytail-gain`, and `/ponytail-help`. In shared gateways, restrict `/ponytail` to trusted users with Hermes slash-command access controls; runtime mode is process-local.
230
-
231
- ### CodeWhale
232
-
233
- Reads `AGENTS.md` from the project root, zero setup. Copy [`AGENTS.md`](AGENTS.md) to your project, or run `codewhale` from a checkout of this repo. That's it.
234
-
235
- ### Swival
236
-
237
- Stage the collection in your library first, then add the skills you want:
238
-
239
- ```bash
240
- swival skills add --global https://github.com/DietrichGebert/ponytail # stage into ~/.config/swival/library
241
- swival skills add ponytail # install the collection into this project
242
- swival skills add --global ponytail # or activate it in every project
243
- ```
244
-
245
- Swival also reads `AGENTS.md` from the project root and `~/.config/swival/AGENTS.md` globally, the instruction-only fallback.
88
+ That was it. He'd be proud. He won't say it.
246
89
 
247
- On the command line, use a `$` prefix to explicitly activate a skill. For example: `$ponytail-review`.
90
+ Active every session, with a handful of commands (see [Commands](#commands)). `/ponytail ultra` exists for when the codebase has wronged you personally. Startup and mode-change text shows the current mode.
248
91
 
249
- ### Devin CLI
92
+ Only install ponytail from `DietrichGebert/ponytail` on GitHub or `@dietrichgebert/ponytail` on npm. It never ships `.exe` or `.dll` files; a copy that does is not mine.
250
93
 
251
- ```bash
252
- devin plugins install DietrichGebert/ponytail
253
- ```
94
+ ## Before / after
254
95
 
255
- Installs ponytail as a Devin plugin; skills are available as `/ponytail:ponytail`, `/ponytail:ponytail-review`, and so on.
96
+ You ask for a date picker. Your agent installs flatpickr, writes a wrapper component, adds a stylesheet, and starts a discussion about timezones.
256
97
 
257
- ### OpenClaw
98
+ With ponytail:
258
99
 
259
- ```bash
260
- clawhub install ponytail
100
+ ```html
101
+ <!-- ponytail: browser has one -->
102
+ <input type="date">
261
103
  ```
262
104
 
263
- Installs ponytail as an OpenClaw skill from ClawHub; the review, audit, debt, gain, and help skills install the same way (`clawhub install ponytail-review`, and so on). OpenClaw applies it on coding tasks and also exposes it as a `/ponytail` command. Without ClawHub, copy [`.openclaw/skills/ponytail`](.openclaw/skills/) into `~/.openclaw/skills/`.
264
-
265
- ### Grok Build
105
+ More survivors in [examples/](examples/).
266
106
 
267
- ```bash
268
- grok plugin install DietrichGebert/ponytail --trust
269
- ```
107
+ ## How it works
270
108
 
271
- Enable the plugin (off by default): `/plugins` → Plugins → Space on `ponytail`, or in `~/.grok/config.toml`:
109
+ Before writing code, the agent stops at the first rung that holds:
272
110
 
273
- ```toml
274
- [plugins]
275
- enabled = ["ponytail"]
276
111
  ```
277
-
278
- Start a new session (or reload plugins). Skills show as `/ponytail`, `/ponytail-review`, `/ponytail-audit`, `/ponytail-debt`, `/ponytail-gain`, `/ponytail-help`. Verify with `grok inspect`. Grok can auto-invoke ponytail for coding tasks from its skill description; use `/ponytail` (or `/ponytail lite`, `/ponytail full`, `/ponytail ultra`) when activation needs to be explicit. Grok lifecycle hooks are not used because their SessionStart output cannot inject instructions.
279
-
280
- `AGENTS.md` still works instruction-only from a checkout without the plugin.
281
-
282
- ### Cursor
283
-
284
- ```bash
285
- git clone https://github.com/DietrichGebert/ponytail
286
- node ponytail/scripts/cursor-hooks.js install
112
+ 1. Does this need to exist? → no: skip it (YAGNI)
113
+ 2. Already in this codebase? → reuse it, don't rewrite
114
+ 3. Stdlib does it? → use it
115
+ 4. Native platform feature? → use it
116
+ 5. Installed dependency? → use it
117
+ 6. One line? → one line
118
+ 7. Only then: the minimum that works
287
119
  ```
288
120
 
289
- Merges two native hooks into `~/.cursor/hooks.json` (add `--project` to write `<project>/.cursor/hooks.json` instead) and keeps any hooks you already have there. The entries run `node` from that checkout, so leave it where it is or re-run the install after moving it. Cursor reloads the file on save; open a new chat and the ruleset for your default level arrives through `sessionStart`. Send `/ponytail lite`, `/ponytail full`, `/ponytail ultra` or `/ponytail off` as a plain message to switch the level for the rest of the conversation; `/ponytail` reports it. Cursor's `subagentStart` cannot inject context, so subagents run without the ruleset, and cloud agents never fire `sessionStart`. The always-on rule (`.cursor/rules/ponytail.mdc`) and the hooks are alternatives: while the rule is in a workspace the hooks inject nothing and the mode commands answer with a notice, so delete the rule to let the hooks manage the level. Contract, verification record and limitations: [docs/cursor-hooks.md](docs/cursor-hooks.md). Uninstall: `node ponytail/scripts/cursor-hooks.js uninstall`.
290
-
291
- That was it. He'd be proud. He won't say it.
292
-
293
- Active every session, with a handful of commands (see [Commands](#commands)). `/ponytail ultra` exists for when the codebase has wronged you personally. Startup and mode-change text shows the current mode.
294
-
295
- Set the level for every new session with the `PONYTAIL_DEFAULT_MODE` env var (`lite`/`full`/`ultra`/`off`), or a `defaultMode` field in `~/.config/ponytail/config.json` (`%APPDATA%\ponytail\config.json` on Windows). The default is `full`.
296
-
297
- While active, the ruleset is also injected into every subagent spawned via the Agent tool. To scope that to specific agent types (say, keep it off read-only search agents), set the `PONYTAIL_SUBAGENT_MATCHER` env var to a regex tested against the subagent's `agent_type`. It is unanchored and case-insensitive: `explore|general` matches either, `^general$` is exact, and plugin agent types look like `plugin:name`. Unset means inject into every subagent (the default); an invalid regex, or a subagent whose type the platform doesn't report, also falls back to injecting.
298
-
299
- Cursor (rule-only alternative to the [hooks install](#cursor)), Windsurf, Cline, GitHub Copilot Chat (the VS Code, JetBrains, and Visual Studio editor extension, not the standalone Copilot CLI covered under [Install](#install)), Aider, Kiro, Zed, CodeWhale, Swival, Qoder: 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/), [`.qoder/rules/`](.qoder/rules/)).
300
-
301
- Kiro: copy `.kiro/steering/ponytail.md` to `~/.kiro/steering/` (global) or `.kiro/steering/` in your project.
302
-
303
- GitHub Copilot CLI fallback (instruction-only mode): it reads `AGENTS.md` and `.github/copilot-instructions.md` in a project, or copy the rules into `~/.copilot/copilot-instructions.md` to run ponytail in every project. This path keeps always-on guidance, but does not add plugin mode switches or hooks.
304
-
305
- VS Code with the Codex extension reads `AGENTS.md`, which this repo ships, so it works from the repo root with no setup (`~/.codex/AGENTS.md` makes Codex global).
306
-
307
- JetBrains Junie can read `AGENTS.md` once you point it there in Settings → Tools → Junie → Project Settings → Guidelines Path (it is not automatic yet). This repo ships `AGENTS.md`; `.junie/guidelines.md` is Junie's legacy path.
308
-
309
- Amp (Sourcegraph) reads `AGENTS.md` from the working directory and parent directories up to `$HOME`, which this repo ships, so it works with no setup (`~/.config/amp/AGENTS.md` works globally).
310
-
311
- Jules (Google) reads `AGENTS.md` from the repository root, which this repo ships, so it picks up the ruleset with no setup.
312
-
313
- Which files map to which agent: [Agent portability](docs/agent-portability.md).
314
-
315
- ### Uninstall
316
-
317
- | Host | Command |
318
- |------|---------|
319
- | Claude Code | `/plugin remove ponytail` |
320
- | Codex | `codex plugin remove ponytail` |
321
- | Devin CLI | `devin plugins remove ponytail` |
322
- | Grok Build | `grok plugin uninstall ponytail` |
323
- | Pi agent | `pi uninstall ponytail` |
324
- | Cursor hooks | `node scripts/cursor-hooks.js uninstall` (add `--project` for a project-level install); removes only ponytail's entries from `hooks.json` |
325
- | Cursor rule / Windsurf / Cline / Qoder / etc. | Delete the copied rule file |
121
+ The ladder runs *after* it understands the problem, not instead of it: it reads the code the change touches and traces the real flow before picking a rung. Lazy about the solution, never about reading.
326
122
 
327
- These remove the plugin's own files. They leave behind a small amount of state ponytail writes outside the plugin folder: the mode flag (`~/.claude/.ponytail-active`, or `~/.cursor/.ponytail-active` for Cursor), `~/.config/ponytail/config.json`, ponytail's entries in `~/.cursor/hooks.json`, and (if you accepted the setup nudge) a `statusLine` entry in `~/.claude/settings.json`. Run `node scripts/uninstall.js` to clean those up too. **Run it before the host remove command above** — the script is itself a plugin file, so removing the plugin first deletes it (or run it from a separate clone of this repo). It only removes the statusLine entry if it points at ponytail's own script, so a statusline you set up yourself is left untouched.
123
+ Lazy, not negligent: trust-boundary validation, data-loss handling, security, and accessibility are never on the chopping block.
328
124
 
329
125
  ## Commands
330
126
 
331
127
  | Command | What it does |
332
128
  |---------|--------------|
333
- | `/ponytail [lite \| full \| ultra \| off]` | Set the intensity, or turn it off. No argument reports the current level. |
334
- | `/ponytail-review` | Review the current diff for over-engineering, hands back a delete-list. |
129
+ | `/ponytail [lite \| full \| ultra \| off]` | Set the intensity, or turn it off. No argument switches ponytail on at the default level if it is off, and otherwise reports the current level. |
130
+ | `/ponytail-review` | Review the current diff for over-engineering, hands back a delete-list. Name a target in plain words to narrow or widen it: `uncommitted`, `staged`, `branch`, or a PR link. |
335
131
  | `/ponytail-audit` | Audit the whole repo for over-engineering, not just the diff. |
336
132
  | `/ponytail-debt` | Harvest the `ponytail:` shortcuts you've deferred into a ledger, so "later" doesn't become "never". |
337
133
  | `/ponytail-gain` | Show the measured impact scoreboard (less code, less cost, more speed) from the benchmark. |
338
134
  | `/ponytail-help` | Quick reference for the commands above. |
339
135
 
340
- Commands need a skill-capable host (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival, Hermes Agent, Qoder, Grok Build). In Codex they're skills, invoke with `@` (`@ponytail-review`). Cursor with the [hooks](#cursor) gets `/ponytail` level switching only, typed as a plain message. The instruction-only adapters (Cursor's rule file, Windsurf, Cline, Copilot, Kiro, Antigravity) load the always-on ruleset without the commands.
136
+ Commands need a skill-capable host (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival, Hermes Agent, Qoder, Grok Build). In Codex CLI and the IDE extension they're skills under the plugin's namespace; invoke with `$ponytail:ponytail-review`. Cursor with the [hooks](INSTALL.md#cursor) gets `/ponytail` level switching only, typed as a plain message. The instruction-only adapters (Cursor's rule file, Windsurf, Cline, Copilot, Kiro, Antigravity) load the always-on ruleset without the commands.
341
137
 
342
- ## Development
138
+ ## Numbers
343
139
 
344
- When changing the compact rule text, keep the agent copies aligned:
140
+ The honest measurement is a real agent doing real work: a headless Claude Code session editing [tiangolo's full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) (a real FastAPI + React repo), scored on the `git diff` it leaves behind. Twelve feature tickets, the same agent with and without the skill, n=4, Haiku 4.5.
345
141
 
346
- ```bash
347
- node scripts/check-rule-copies.js
348
- npm test
349
- ```
142
+ <p align="center">
143
+ <img src="assets/benchmark-agentic.svg" width="860" alt="Each arm as a percent of the no-skill baseline across LOC, tokens, cost and time (Haiku 4.5). ponytail is lowest on every metric (LOC 46%, tokens 78%, cost 80%, time 73%); caveman rises above 100% on tokens, cost and time; yagni-oneliner LOC 67%. Safety, separate adversarial tier: baseline, caveman and ponytail 100%, yagni-oneliner 95%.">
144
+ </p>
145
+
146
+ | vs no-skill baseline | LOC | tokens | cost | time | safe |
147
+ |---|--:|--:|--:|--:|--:|
148
+ | **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |
149
+ | caveman (terse-prose control) | -20% | +7% | +3% | +2% | 100% |
150
+ | "YAGNI + one-liners" prompt | -33% | -14% | -21% | -30% | 95% |
151
+
152
+ ponytail is the only arm that cuts every metric, and the only one that stays fully safe while doing it. The cut is biggest where there is a real over-build trap (date picker 404 to 23 lines, color picker 287 to 23, because it reaches for a native `<input>` instead of a component) and near zero on code that is already minimal. Full method, per-task tables, and limitations: [benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md).
350
153
 
351
- The OpenClaw skill package (`.openclaw/skills/`) is generated from `skills/`; rerun `node scripts/build-openclaw-skills.js` after changing a skill, the test suite fails if it is stale. To publish the skills to ClawHub, run `clawhub login` once, then `node scripts/publish-openclaw-skills.js` (it publishes all six at the `package.json` version; pass `--dry-run` to preview).
154
+ <details>
155
+ <summary><strong>Older single-shot numbers (isolated generation)</strong></summary>
352
156
 
353
- The correctness benchmark spawns Python for email and CSV checks; `python3` is tried before `python`. CSV checks need `pandas` installed locally.
157
+ Five everyday tasks, three models, three arms (no skill, [caveman](https://github.com/JuliusBrussee/caveman), ponytail), ten runs, median reported. One prompt, one completion, counting lines of the answer:
158
+
159
+ <p align="center">
160
+ <img src="assets/benchmark-3model.svg" width="860" alt="Median lines of code per arm across Haiku, Sonnet and Opus">
161
+ </p>
162
+
163
+ This showed **80-94% less code**. [#126](https://github.com/DietrichGebert/ponytail/issues/126) fairly pointed out that the bare-model baseline pads its answer with prose and options, so that gap is partly a conversational-baseline artifact. The agentic numbers above are the corrected, defensible version. Reproduce the single-shot run with `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`.
164
+
165
+ </details>
166
+
167
+ **The rule was never "fewest tokens."** It is: write only what the task needs, and never cut validation, error handling, security, or accessibility. The code ends up small because it is necessary, not golfed. Lower cost and latency are a side effect on the models that follow the ladder; a terse reasoning model that spends thinking tokens deliberating the rungs can go the other way (on GPT-5.5 it does).
354
168
 
355
169
  ## FAQ
356
170
 
@@ -0,0 +1,212 @@
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,偷懒的资深开发者">
5
+ </picture>
6
+ </p>
7
+
8
+ <h1 align="center">Ponytail</h1>
9
+
10
+ <p align="center">
11
+ <em>他一言不发。他写一行。它能跑。</em>
12
+ </p>
13
+
14
+ <p align="center">
15
+ <a href="https://trendshift.io/repositories/50668?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-50668" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/50668" alt="DietrichGebert%2Fponytail | Trendshift" width="250" height="55"/></a>
16
+ </p>
17
+
18
+ <p align="center">
19
+ <img src="https://img.shields.io/github/stars/DietrichGebert/ponytail?style=flat-square&color=111111&label=stars" alt="Stars">
20
+ <img src="https://img.shields.io/github/v/release/DietrichGebert/ponytail?style=flat-square&color=111111&label=release" alt="Release">
21
+ <img src="https://img.shields.io/npm/v/@dietrichgebert/ponytail?style=flat-square&color=111111&label=npm" alt="npm">
22
+ <img src="https://img.shields.io/badge/works%20with-20%20agents-111111?style=flat-square" alt="Works with 20 agents">
23
+ <img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT license">
24
+ </p>
25
+
26
+ <p align="center">
27
+ <a href="https://trendshift.io/repositories/50668" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/50668/daily" alt="DietrichGebert/ponytail | Trendshift" width="250" height="55"/></a>
28
+ <a href="https://trendshift.io/repositories/50668" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/50668/weekly" alt="DietrichGebert/ponytail | Trendshift" width="250" height="55"/></a>
29
+ <a href="https://trendshift.io/repositories/50668?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-50668" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/trendshift/repositories/50668/monthly?language=JavaScript" alt="DietrichGebert%2Fponytail | Trendshift monthly ranking" width="250" height="55"/></a>
30
+ </p>
31
+
32
+ <p align="center">
33
+ <strong>代码减少约 54%(最多 94%)&middot; 成本降低约 20% &middot; 速度提升约 27% &middot; 100% 安全</strong><br>
34
+ <sub>在真实的 Claude Code 会话中修改一个真实的 FastAPI + React 仓库,同一个智能体分别在启用和不启用该 skill 时运行(12 个功能任务,Haiku 4.5,n=4)。<a href="#numbers">详情</a>。</sub>
35
+ </p>
36
+
37
+ <p align="center">
38
+ <sub><a href="README.md">English</a> &middot; <a href="README.es.md">Español</a> &middot; <a href="README.ko.md">한국어</a> &middot; 简体中文 &middot; <a href="README.ja.md">日本語</a></sub><br>
39
+ <sub>本文译自英文 README。如有出入,以<a href="README.md">英文版</a>为准。</sub>
40
+ </p>
41
+
42
+ ---
43
+
44
+ <p align="center">
45
+ <a href="https://ponytail.dev/soon"><img src="assets/waitlist-banner.png" alt="新东西即将到来,加入等候名单" width="760"></a>
46
+ </p>
47
+
48
+ ## 已用 Ponytail 构建
49
+
50
+ <a href="https://theretriever.app">
51
+ <picture>
52
+ <source media="(prefers-color-scheme: dark)" srcset="assets/retriever-logo-dark.svg">
53
+ <img src="assets/retriever-logo-light.svg" height="128" alt="Retriever">
54
+ </picture>
55
+ </a>
56
+
57
+ ---
58
+
59
+ 你认识他。长马尾。椭圆眼镜。他在公司待的时间比版本控制系统还长。你给他看五十行代码;他看了看,一言不发,把它们换成了一行。
60
+
61
+ Ponytail 把他放进你的 AI 智能体里。
62
+
63
+ ## 提示词
64
+
65
+ Ponytail 就是一段提示词:[`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md)。给读取规则文件的智能体用的精简版是 [`AGENTS.md`](AGENTS.md)。仓库里的其他东西都只是为了把这段提示词装进不同的智能体。
66
+
67
+ ## 安装
68
+
69
+ **Claude Code**,分成两条提示:
70
+
71
+ ```
72
+ /plugin marketplace add DietrichGebert/ponytail
73
+ ```
74
+ ```
75
+ /plugin install ponytail@ponytail
76
+ ```
77
+
78
+ **Codex:**
79
+
80
+ ```bash
81
+ codex plugin marketplace add DietrichGebert/ponytail
82
+ codex plugin add ponytail@ponytail
83
+ ```
84
+
85
+ 然后在 Codex 里打开 `/hooks`,信任它的两个生命周期 hook,再开一个新线程。
86
+
87
+ **其他任何智能体:**把 [`AGENTS.md`](AGENTS.md) 复制到你的项目里,或者让你的智能体把 [`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md) 安装为 skill。Copilot、Cursor、OpenCode、Gemini 等的分步安装说明(英文):**[INSTALL.md](INSTALL.md)**。
88
+
89
+ 就这些。他会很满意。但他不会说出来。
90
+
91
+ 每个会话都会启用,另外有几个命令(见[命令](#commands))。`/ponytail ultra` 是为代码库把你个人惹毛了的时候准备的。启动和切换模式时会显示当前模式。
92
+
93
+ 只从 GitHub 上的 `DietrichGebert/ponytail` 或 npm 上的 `@dietrichgebert/ponytail` 安装 ponytail。它从不包含 `.exe` 或 `.dll` 文件;包含这些文件的副本不是我的。
94
+
95
+ ## 之前 / 之后
96
+
97
+ 你要一个日期选择器。你的智能体安装了 flatpickr,写了一个包装组件,加了一个样式表,还开始讨论时区问题。
98
+
99
+ 用了 ponytail:
100
+
101
+ ```html
102
+ <!-- ponytail: browser has one -->
103
+ <input type="date">
104
+ ```
105
+
106
+ 更多幸存的例子见 [examples/](examples/)。
107
+
108
+ ## 工作原理
109
+
110
+ 在写代码之前,智能体会停在第一个成立的台阶上:
111
+
112
+ ```
113
+ 1. 这东西真的需要存在吗? → 不需要:跳过(YAGNI)
114
+ 2. 代码库里已经有了吗? → 复用,不要重写
115
+ 3. 标准库能做吗? → 用标准库
116
+ 4. 平台原生功能能做吗? → 用原生功能
117
+ 5. 已安装的依赖能做吗? → 用它
118
+ 6. 一行能搞定吗? → 就写一行
119
+ 7. 只有到这一步:写能跑的最少代码
120
+ ```
121
+
122
+ 这个阶梯在理解问题*之后*才运行,而不是代替理解:它会先读改动涉及的代码,追踪真实的执行流程,再选择台阶。对方案偷懒,对阅读从不偷懒。
123
+
124
+ 偷懒,但不失职:信任边界上的输入校验、防止数据丢失的处理、安全和无障碍访问,永远不会被砍掉。
125
+
126
+ <a id="commands"></a>
127
+ ## 命令
128
+
129
+ | 命令 | 作用 |
130
+ |------|------|
131
+ | `/ponytail [lite \| full \| ultra \| off]` | 设置强度或关闭。不带参数时:如果已关闭,就以默认级别打开;否则显示当前级别。 |
132
+ | `/ponytail-review` | 审查当前 diff 中的过度设计,返回一份删除清单。用普通的话指定目标来缩小或扩大范围:`uncommitted`、`staged`、`branch`,或一个 PR 链接。 |
133
+ | `/ponytail-audit` | 审查整个仓库的过度设计,而不只是 diff。 |
134
+ | `/ponytail-debt` | 把你推迟处理的 `ponytail:` 捷径收集成一份清单,免得"以后再说"变成"永远不做"。 |
135
+ | `/ponytail-gain` | 以计分板形式显示基准测试测得的效果(更少代码、更低成本、更快速度)。 |
136
+ | `/ponytail-help` | 上述命令的速查表。 |
137
+
138
+ 命令需要支持 skill 的宿主(Claude Code、Codex、Devin CLI、OpenCode、Gemini、pi、Swival、Hermes Agent、Qoder、Grok Build)。在 Codex CLI 和 IDE 扩展中,它们是插件命名空间下的 skill,用 `$ponytail:ponytail-review` 调用。使用 [hooks](INSTALL.md#cursor) 的 Cursor 只支持 `/ponytail` 级别切换,以普通消息输入。只有指令的适配器(Cursor 的规则文件、Windsurf、Cline、Copilot、Kiro、Antigravity)会加载始终生效的规则,但没有这些命令。
139
+
140
+ <a id="numbers"></a>
141
+ ## 数据
142
+
143
+ 诚实的测量方式是让真实的智能体做真实的工作:一个无界面的 Claude Code 会话修改 [tiangolo 的 full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)(一个真实的 FastAPI + React 仓库),按它留下的 `git diff` 打分。12 个功能工单,同一个智能体分别在启用和不启用该 skill 时运行,n=4,Haiku 4.5。
144
+
145
+ <p align="center">
146
+ <img src="assets/benchmark-agentic.svg" width="860" alt="各组相对于无 skill 基线的百分比,涵盖代码行数、token、成本和时间(Haiku 4.5)。ponytail 在所有指标上都最低(行数 46%、token 78%、成本 80%、时间 73%);caveman 在 token、成本和时间上超过 100%;yagni-oneliner 行数 67%。安全性(单独的对抗测试):基线、caveman 和 ponytail 均为 100%,yagni-oneliner 为 95%。">
147
+ </p>
148
+
149
+ | 相对于无 skill 基线 | 行数 | token | 成本 | 时间 | 安全 |
150
+ |---|--:|--:|--:|--:|--:|
151
+ | **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |
152
+ | caveman(简洁话语对照组) | -20% | +7% | +3% | +2% | 100% |
153
+ | "YAGNI + 一行代码" 提示词 | -33% | -14% | -21% | -30% | 95% |
154
+
155
+ ponytail 是唯一在所有指标上都有削减的一组,也是唯一在削减的同时保持完全安全的一组。在真正存在过度构建陷阱的地方削减最多(日期选择器从 404 行降到 23 行,颜色选择器从 287 行降到 23 行,因为它直接用原生 `<input>` 而不是组件),而在本来就很精简的代码上几乎为零。完整方法、逐任务表格和局限性:[benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md)。
156
+
157
+ <details>
158
+ <summary><strong>早期的单次生成数据(孤立生成)</strong></summary>
159
+
160
+ 5 个日常任务,3 个模型,3 组(无 skill、[caveman](https://github.com/JuliusBrussee/caveman)、ponytail),每组运行 10 次,报告中位数。一个提示,一次回答,统计回答的行数:
161
+
162
+ <p align="center">
163
+ <img src="assets/benchmark-3model.svg" width="860" alt="Haiku、Sonnet 和 Opus 上各组代码行数的中位数">
164
+ </p>
165
+
166
+ 这里显示**代码减少 80-94%**。[#126](https://github.com/DietrichGebert/ponytail/issues/126) 很公道地指出,什么都不加的基线模型会用说明文字和多种选项把回答撑大,所以这个差距部分是对话式基线造成的假象。上面的智能体数据才是修正过的、站得住脚的版本。用 `npx promptfoo eval -c benchmarks/promptfooconfig.yaml` 可以复现单次生成的测试。
167
+
168
+ </details>
169
+
170
+ **规则从来不是"token 最少"。**规则是:只写任务需要的东西,永远不砍校验、错误处理、安全和无障碍访问。代码最后变小,是因为只留下了必要的部分,而不是被硬压缩出来的。成本和延迟的降低,是遵循阶梯的模型上的副作用;一个为了斟酌台阶而消耗思考 token 的简洁推理模型,可能会反过来(在 GPT-5.5 上就是这样)。
171
+
172
+ ## 常见问题
173
+
174
+ **可以和 [caveman](https://github.com/JuliusBrussee/caveman) 一起用吗?**
175
+ 可以,而且应该一起用。caveman 精简智能体说的话;ponytail 精简智能体造的东西。各管一半,互不重叠:caveman 让代码一字节都不变,ponytail 不碰说话方式。用简短的话谈最少的代码。
176
+
177
+ **需要配置文件吗?**
178
+ 不需要。可选的 `~/.config/ponytail/config.json` 或环境变量 `PONYTAIL_DEFAULT_MODE` 可以设置默认级别,但什么都不是必需的。
179
+
180
+ **如果我真的需要那个 120 行的缓存类呢?**
181
+ 你不需要。非要的话,他也会写。慢慢地。正确地。一边看着你。
182
+
183
+ **它能扩展吗?**
184
+ 你从没写过的代码可以无限扩展。零 bug,零 CVE,开天辟地以来 100% 在线。
185
+
186
+ **为什么叫 "ponytail"?**
187
+ 你心里很清楚为什么。
188
+
189
+ ## 赞助商
190
+
191
+ <p align="center">
192
+ <a href="https://greenpt.com/">
193
+ <picture>
194
+ <source media="(prefers-color-scheme: dark)" srcset="assets/logo-greenpt-dark.svg">
195
+ <img src="assets/logo-greenpt.svg" width="260" alt="GreenPT">
196
+ </picture>
197
+ </a>
198
+ </p>
199
+
200
+ ## 许可证
201
+
202
+ [MIT](LICENSE)。能用的最短许可证。
203
+
204
+ ## Star 历史
205
+
206
+ <a href="https://www.star-history.com/dietrichgebert/ponytail#history">
207
+ <picture>
208
+ <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=DietrichGebert/ponytail&type=Date&theme=dark" />
209
+ <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=DietrichGebert/ponytail&type=Date" />
210
+ <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=DietrichGebert/ponytail&type=Date" />
211
+ </picture>
212
+ </a>
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ponytail-activate.js\"",
9
+ "command": "node -e \"require(require('node:path').join(process.env.CLAUDE_PLUGIN_ROOT.replaceAll(String.fromCharCode(92), '/'), 'hooks/ponytail-activate.js'))\"",
10
10
  "timeout": 5,
11
11
  "statusMessage": "Loading ponytail mode..."
12
12
  }
@@ -18,7 +18,7 @@
18
18
  "hooks": [
19
19
  {
20
20
  "type": "command",
21
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ponytail-subagent.js\"",
21
+ "command": "node -e \"require(require('node:path').join(process.env.CLAUDE_PLUGIN_ROOT.replaceAll(String.fromCharCode(92), '/'), 'hooks/ponytail-subagent.js'))\"",
22
22
  "timeout": 5,
23
23
  "statusMessage": "Loading ponytail mode..."
24
24
  }
@@ -30,7 +30,7 @@
30
30
  "hooks": [
31
31
  {
32
32
  "type": "command",
33
- "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/ponytail-mode-tracker.js\"",
33
+ "command": "node -e \"require(require('node:path').join(process.env.CLAUDE_PLUGIN_ROOT.replaceAll(String.fromCharCode(92), '/'), 'hooks/ponytail-mode-tracker.js'))\"",
34
34
  "timeout": 5,
35
35
  "statusMessage": "Tracking ponytail mode..."
36
36
  }