@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
@@ -1,14 +1,14 @@
1
1
  <p align="center">
2
2
  <picture>
3
3
  <source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.png">
4
- <img src="assets/logo.png" width="220" alt="Ponytail, the lazy senior dev">
4
+ <img src="assets/logo.png" width="220" alt="Ponytail, 게으른 시니어 개발자">
5
5
  </picture>
6
6
  </p>
7
7
 
8
8
  <h1 align="center">Ponytail</h1>
9
9
 
10
10
  <p align="center">
11
- <em>말이 없다. 한 줄을 쓴다. 돌아간다.</em>
11
+ <em>아무 말도 안 한다. 한 줄 쓴다. 돌아간다.</em>
12
12
  </p>
13
13
 
14
14
  <p align="center">
@@ -19,7 +19,7 @@
19
19
  <img src="https://img.shields.io/github/stars/DietrichGebert/ponytail?style=flat-square&color=111111&label=stars" alt="Stars">
20
20
  <img src="https://img.shields.io/github/v/release/DietrichGebert/ponytail?style=flat-square&color=111111&label=release" alt="Release">
21
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-15%20agents-111111?style=flat-square" alt="Works with 15 agents">
22
+ <img src="https://img.shields.io/badge/works%20with-20%20agents-111111?style=flat-square" alt="Works with 20 agents">
23
23
  <img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT license">
24
24
  </p>
25
25
 
@@ -30,93 +30,43 @@
30
30
  </p>
31
31
 
32
32
  <p align="center">
33
- <strong>코드 약 54% 감소(최대 94%) &middot; 약 20% 저렴 &middot; 약 27% 빠름 &middot; 100% 안전</strong><br>
34
- <sub>실제 오픈소스 저장소(FastAPI + React)를 고치는 실제 Claude Code 세션에서, 스킬을 끈 같은 에이전트와 견줘 측정했다. 약 54%는 기능 작업 12건의 평균이다(Haiku 4.5, n=4). 에이전트가 과하게 짤 여지가 있는 곳(날짜 선택기)에선 94%까지 오르고, 코드가 이미 최소한인 곳에선 0에 가깝다. ponytail은 안전 가드를 하나도 빼놓지 않지만, 그냥 "한 줄로 써"라고만 시킨 프롬프트는 그중 하나를 놓친다. (예전 단발성 벤치마크는 80-94%를 단일 수치로 내세웠는데, 공정한 에이전트 기준선에 견주면 그건 평균이 아니라 작업별 상한이다.) <a href="benchmarks/results/2026-06-18-agentic.md">전체 보고서</a> &middot; <a href="benchmarks/">직접 재현하기</a>.</sub>
33
+ <strong>코드 약 54% 감소 (최대 94%) &middot; 약 20% 저렴 &middot; 약 27% 빠름 &middot; 100% 안전</strong><br>
34
+ <sub>실제 FastAPI + React 저장소를 고치는 실제 Claude Code 세션에서, 같은 에이전트를 스킬이 있을 때와 없을 때로 비교했다 (기능 작업 12개, Haiku 4.5, n=4). <a href="#numbers">자세히</a>.</sub>
35
35
  </p>
36
36
 
37
37
  <p align="center">
38
- <sub>커뮤니티 번역이다. 기준이 되는 최신 버전은 <a href="README.md">영어 README</a>다.</sub>
38
+ <sub><a href="README.md">English</a> &middot; <a href="README.es.md">Español</a> &middot; 한국어 &middot; <a href="README.zh-CN.md">简体中文</a> &middot; <a href="README.ja.md">日本語</a></sub><br>
39
+ <sub>영어 README의 번역본이다. 내용이 다르면 <a href="README.md">영어판</a>이 기준이다.</sub>
39
40
  </p>
40
41
 
41
42
  ---
42
43
 
43
44
  <p align="center">
44
- <a href="https://ponytail.dev/soon"><img src="assets/waitlist-banner-ko.png" alt="새로운 것이 다가오고 있습니다, 대기자 명단 신청" width="760"></a>
45
+ <a href="https://ponytail.dev/soon"><img src="assets/waitlist-banner-ko.png" alt="곧 무언가가 온다, 대기 명단에 등록하기" width="760"></a>
45
46
  </p>
46
47
 
47
- 이런 사람, 다들 알 거다. 긴 포니테일에 타원형 안경. 버전 관리 시스템보다 회사에 오래 있었다. 코드 쉰 줄을 들이밀면 잠깐 보더니, 말없이 한 줄로 바꿔 놓는다.
48
+ ## Ponytail로 이미 만든 것
48
49
 
49
- Ponytail은 그를 당신의 AI 에이전트 안에 앉혀 둔다.
50
-
51
- ## Before / after
52
-
53
- 날짜 선택기 하나 만들어 달라고 한다. 에이전트는 flatpickr를 깔고, 래퍼 컴포넌트를 짜고, 스타일시트를 붙이더니, 타임존 얘기를 꺼내기 시작한다.
54
-
55
- ponytail이라면:
56
-
57
- ```html
58
- <!-- ponytail: browser has one -->
59
- <input type="date">
60
- ```
61
-
62
- 살아남은 것들이 더 궁금하다면 [examples/](examples/)로.
63
-
64
- ## Numbers
65
-
66
- 공정하게 재려면 실제 에이전트에게 실질적인 작업을 시켜 봐야 한다. 헤드리스 Claude Code 세션에게 [tiangolo의 full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)(진짜 FastAPI + React 저장소)을 맡기고, 남긴 `git diff`로 점수를 매겼다. 기능 티켓 12건, 같은 에이전트를 스킬만 켜고 끄며 비교, n=4, Haiku 4.5.
67
-
68
- <p align="center">
69
- <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%.">
70
- </p>
71
-
72
- | 스킬 없는 기준선 대비 | LOC | tokens | cost | time | safe |
73
- |---|--:|--:|--:|--:|--:|
74
- | **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |
75
- | caveman (간결한 산문 대조군) | -20% | +7% | +3% | +2% | 100% |
76
- | "YAGNI + one-liners" 프롬프트 | -33% | -14% | -21% | -30% | 95% |
77
-
78
- 모든 지표를 깎은 건 ponytail뿐이고, 그러면서 안전까지 온전히 지킨 것도 ponytail뿐이다. 깎이는 폭은 과잉 구현의 함정이 실제로 있는 곳에서 가장 크다. 컴포넌트 대신 네이티브 `<input>`으로 손이 가니 날짜 선택기는 404줄에서 23줄로, 색상 선택기는 287줄에서 23줄로 줄어든다. 반대로 이미 군더더기 없는 코드에선 거의 0이다. 전체 방법론, 작업별 표, 한계는 [benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md)에 있다.
79
-
80
- <details>
81
- <summary><strong>예전 단발성 수치 (격리된 생성)</strong></summary>
82
-
83
- 일상적인 작업 다섯 가지, 모델 셋, 비교군 셋(스킬 없음, [caveman](https://github.com/JuliusBrussee/caveman), ponytail), 10회 실행, 중앙값 기준. 프롬프트 하나에 응답 하나, 답변의 줄 수를 셌다:
84
-
85
- <p align="center">
86
- <img src="assets/benchmark-3model.svg" width="860" alt="Median lines of code per arm across Haiku, Sonnet and Opus">
87
- </p>
88
-
89
- 여기선 **코드 80-94% 감소**가 나왔다. 다만 [#126](https://github.com/DietrichGebert/ponytail/issues/126)이 맞게 짚었듯, 스킬을 전혀 안 붙인 기준선 모델은 답변을 설명과 선택지로 부풀린다. 그래서 그 격차의 일부는 대화형 기준선이 만들어 낸 착시다. 위의 에이전트 수치가 그걸 바로잡은, 근거 있는 버전이다. 단발성 실행은 `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`로 재현할 수 있다.
90
-
91
- </details>
92
-
93
- **규칙은 애초에 "토큰 최소화"가 아니었다.** 작업에 필요한 만큼만 쓰되, 검증·에러 처리·보안·접근성은 절대 덜어내지 않는다는 것이다. 코드가 작아지는 건 억지로 줄여서가 아니라 딱 그만큼만 필요해서다. 비용과 지연이 낮아지는 것도 단계를 충실히 밟는 모델에서나 부수적으로 딸려 오는 효과일 뿐이다. 그 단계를 고민하느라 사고 토큰을 쏟는 간결한 추론 모델은 오히려 거꾸로 갈 수도 있다(GPT-5.5가 그렇다).
94
-
95
- ## How it works
96
-
97
- 코드를 쓰기 전에, 에이전트는 가장 먼저 들어맞는 단계에서 멈춘다:
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>
98
56
 
99
- ```
100
- 1. 이게 있을 필요가 있나? → 없다: 건너뛴다 (YAGNI)
101
- 2. 이미 이 코드베이스에 있나? → 다시 짜지 말고 가져다 쓴다
102
- 3. 표준 라이브러리로 되나? → 쓴다
103
- 4. 네이티브 플랫폼 기능인가? → 쓴다
104
- 5. 깔려 있는 의존성이 푸나? → 쓴다
105
- 6. 한 줄로 되나? → 한 줄
106
- 7. 그제서야: 돌아가는 최소한
107
- ```
57
+ ---
108
58
 
109
- 단계를 밟는 건 문제를 이해한 *다음*이지, 이해를 대신하는 게 아니다. 변경이 닿는 코드를 읽고 실제 흐름을 따라가 본 뒤에야 단계를 고른다. 해법에는 게을러도, 읽는 데는 절대 게으르지 않다.
59
+ 누군지 알 것이다. 긴 포니테일. 타원형 안경. 버전 관리 시스템보다 회사에 오래 있었다. 쉰 줄을 보여 주면 가만히 보다가, 아무 말 없이 한 줄로 바꿔 놓는다.
110
60
 
111
- 게으른 거지 부주의한 게 아니다. 신뢰 경계의 검증, 데이터 손실 방지, 보안, 접근성은 결코 잘려 나가지 않는다.
61
+ Ponytail은 그 사람을 당신의 AI 에이전트 안에 넣는다.
112
62
 
113
- ## Install
63
+ ## 프롬프트
114
64
 
115
- ponytail이 당신에게 요구할 수고의 최대치:
65
+ Ponytail은 프롬프트 하나다: [`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md). 규칙 파일을 읽는 에이전트용 압축판은 [`AGENTS.md`](AGENTS.md)다. 이 저장소의 나머지는 전부 그 프롬프트를 여러 에이전트에 넣기 위한 것이다.
116
66
 
117
- Claude Code와 Codex 플러그인은 자그마한 Node.js 라이프사이클 훅 두 개를 돌리니, `node`가 PATH에 잡혀 있어야 한다(Nix/nvm 사용자라면 비대화형 셸의 PATH에 있어야 한다). 없어도 스킬은 멀쩡히 돌아간다. 다만 늘 켜져 있던 자동 활성화가 매 프롬프트마다 에러를 뱉는 대신 조용히 비활성으로 남을 뿐이다.
67
+ ## 설치
118
68
 
119
- ### Claude Code
69
+ **Claude Code**, 프롬프트 두 개로 나눠서:
120
70
 
121
71
  ```
122
72
  /plugin marketplace add DietrichGebert/ponytail
@@ -124,203 +74,119 @@ Claude Code와 Codex 플러그인은 자그마한 Node.js 라이프사이클 훅
124
74
  ```
125
75
  /plugin install ponytail@ponytail
126
76
  ```
127
- (설치가 되려면 두 프롬프트를 따로 보내야 한다)
128
-
129
- 데스크톱 앱에는 `/plugin` 명령이 없다. 대신 UI에서 설치한다: Customize, 개인 플러그인 옆의 +, Create plugin and add marketplace, Add from repository, 그다음 저장소 URL 입력(감사합니다 @NiklasDHahn, #98).
130
77
 
131
- ### Codex
78
+ **Codex:**
132
79
 
133
80
  ```bash
134
81
  codex plugin marketplace add DietrichGebert/ponytail
135
- codex
136
- ```
137
-
138
- `/plugins`를 열어 Ponytail 마켓플레이스를 고르고 Ponytail을 설치한다. 그런 다음
139
- `/hooks`를 열어 라이프사이클 훅 두 개를 검토하고 신뢰한 뒤, 새 스레드를 시작한다.
140
-
141
- 이 설치 한 번이면 Codex 데스크톱 앱도 같이 잡힌다. 설치 후 앱을 다시 켜면 플러그인을 알아챈다.
142
-
143
- ### GitHub Copilot CLI
144
-
145
- ```bash
146
- copilot plugin marketplace add DietrichGebert/ponytail
147
- copilot plugin install ponytail@ponytail
82
+ codex plugin add ponytail@ponytail
148
83
  ```
149
84
 
150
- 대화형 Copilot CLI 세션에서는 슬래시 명령으로 똑같이 하면 된다:
85
+ 그다음 Codex에서 `/hooks`를 열어 라이프사이클 훅 두 개를 신뢰하고, 새 스레드를 시작한다.
151
86
 
152
- ```
153
- /plugin marketplace add DietrichGebert/ponytail
154
- /plugin install ponytail@ponytail
155
- ```
87
+ **그 밖의 에이전트:** [`AGENTS.md`](AGENTS.md)를 프로젝트에 복사하거나, 에이전트에게 [`skills/ponytail/SKILL.md`](skills/ponytail/SKILL.md)를 스킬로 설치해 달라고 하면 된다. Copilot, Cursor, OpenCode, Gemini 등의 단계별 설치 방법(영어): **[INSTALL.md](INSTALL.md)**.
156
88
 
157
- Copilot CLI는 플러그인 명령에 그 이름을 네임스페이스로 붙인다. 예를 들면:
89
+ 이게 다다. 그 사람이라면 뿌듯해할 것이다. 말은 안 하겠지만.
158
90
 
159
- ```text
160
- /ponytail:ponytail ultra
161
- /ponytail:ponytail-review
162
- ```
163
-
164
- ### Pi agent harness
165
-
166
- ```
167
- pi install git:github.com/DietrichGebert/ponytail
168
- ```
91
+ 모든 세션에서 켜져 있고, 명령어가 몇 개 있다 ([명령어](#commands) 참고). `/ponytail ultra`는 코드베이스가 당신을 개인적으로 화나게 했을 때를 위한 것이다. 시작할 때와 모드를 바꿀 때 현재 모드가 표시된다.
169
92
 
170
- ### OpenCode
93
+ ponytail은 GitHub의 `DietrichGebert/ponytail`이나 npm의 `@dietrichgebert/ponytail`에서만 설치한다. `.exe`나 `.dll` 파일은 절대 들어 있지 않다. 그런 파일이 들어 있는 사본은 내 것이 아니다.
171
94
 
172
- `opencode.json`에 다음을 더한다:
95
+ ## 전 / 후
173
96
 
174
- ```json
175
- { "plugin": ["@dietrichgebert/ponytail"] }
176
- ```
97
+ 날짜 선택기를 부탁한다. 에이전트가 flatpickr를 설치하고, 래퍼 컴포넌트를 쓰고, 스타일시트를 추가하고, 시간대에 대한 토론을 시작한다.
177
98
 
178
- 체크아웃에서 직접 돌려도 된다(플러그인이 `hooks/`와 `skills/`를 그대로 쓴다):
99
+ ponytail을 쓰면:
179
100
 
180
- ```json
181
- { "plugin": ["./.opencode/plugins/ponytail.mjs"] }
182
- ```
183
-
184
- 매 턴마다 지금 레벨의 룰셋을 주입하고, `/ponytail` 명령들을 붙여 준다([Commands](#commands) 참고). OpenCode는 이 저장소의 `AGENTS.md`도 알아서 불러오니, 플러그인이 없어도 규칙은 살아 있다. 플러그인은 `lite/full/ultra/off` 레벨을 얹어 준다.
185
-
186
- `./` 경로는 프로젝트의 `opencode.json`을 기준으로 풀린다. 체크아웃 하나를 여러 프로젝트에서 같이 쓰려면, 대신 `.mjs`의 절대 경로를 가리키면 된다(그 파일은 제 위치를 기준으로 `hooks/`와 `skills/`를 찾는다).
187
-
188
- ### Gemini CLI
189
-
190
- ```bash
191
- gemini extensions install https://github.com/DietrichGebert/ponytail
192
- ```
193
-
194
- 매 세션 룰셋을 늘 켜진 컨텍스트로 불러오고 `/ponytail` 명령들을 등록한다. `skills/`도 함께 실리며, 작업에 필요할 때 켜진다.
195
- Gemini 어댑터는 일부러 루트 `hooks/hooks.json`을 두지 않는다. Gemini는 그 경로를 자동으로 불러오는데, ponytail의 라이프사이클 훅은 Claude/Codex 이벤트 이름을 쓰기 때문이다.
196
-
197
- ### Antigravity CLI
198
-
199
- Google이 Gemini CLI를 Antigravity CLI(`agy` 바이너리)로 이름을 바꾸는 중인데, 같은 확장이 거기에도 설치된다:
200
-
201
- ```bash
202
- agy plugin install https://github.com/DietrichGebert/ponytail
203
- ```
204
-
205
- 이 저장소의 `gemini-extension.json`을 그대로 재사용한다. 차이는 하나다. Antigravity는 `/ponytail` 명령들을 스킬로 바꿔 버려서, 슬래시 메뉴에서 고르는 대신 채팅에 직접 친다(예: `/ponytail-review`를 메시지로). 전환이 마무리될 때까지(2026년 6월 18일경)는 `gemini extensions install`도 여전히 먹힌다. 늘 켜진 규칙으로 돌리고 싶으면, 룰셋을 `.agents/rules/`에 넣으면 된다.
206
-
207
- ### CodeWhale
208
-
209
- 프로젝트 루트의 `AGENTS.md`를 읽고, 설정은 전혀 필요 없다. [`AGENTS.md`](AGENTS.md)를 프로젝트에 복사하거나, 이 저장소를 체크아웃한 곳에서 `codewhale`을 돌리면 된다. 그게 끝이다.
210
-
211
- ### Swival
212
-
213
- 먼저 컬렉션을 라이브러리에 스테이징한 다음, 원하는 스킬을 더한다:
214
-
215
- ```bash
216
- swival skills add --global https://github.com/DietrichGebert/ponytail # ~/.config/swival/library에 스테이징
217
- swival skills add ponytail # 이 프로젝트에 컬렉션 설치
218
- swival skills add --global ponytail # 또는 모든 프로젝트에서 켜기
219
- ```
220
-
221
- Swival도 프로젝트 루트의 `AGENTS.md`와 전역의 `~/.config/swival/AGENTS.md`를 읽는다. 지시문 전용 폴백이다.
222
-
223
- 명령줄에서는 `$` 접두사로 스킬을 명시적으로 켠다. 예: `$ponytail-review`.
224
-
225
- ### Devin CLI
226
-
227
- ```bash
228
- devin plugins install DietrichGebert/ponytail
229
- ```
230
-
231
- ponytail을 Devin 플러그인으로 설치한다. 스킬은 `/ponytail:ponytail`, `/ponytail:ponytail-review` 등으로 쓸 수 있다.
232
-
233
- ### OpenClaw
234
-
235
- ```bash
236
- clawhub install ponytail
101
+ ```html
102
+ <!-- ponytail: browser has one -->
103
+ <input type="date">
237
104
  ```
238
105
 
239
- ClawHub에서 ponytail을 OpenClaw 스킬로 설치한다. review, audit, debt, gain, help 스킬도 같은 식으로 깐다(`clawhub install ponytail-review` 등). OpenClaw는 코딩 작업에 이를 적용하고 `/ponytail` 명령으로도 열어 준다. ClawHub가 없으면 [`.openclaw/skills/ponytail`](.openclaw/skills/)을 `~/.openclaw/skills/`에 복사하면 된다.
240
-
241
- ### Grok Build
106
+ 살아남은 예제는 [examples/](examples/)에 더 있다.
242
107
 
243
- ```bash
244
- grok plugin install DietrichGebert/ponytail --trust
245
- ```
108
+ ## 작동 방식
246
109
 
247
- 플러그인은 기본이 꺼져 있다. `/plugins` → Plugins에서 `ponytail`에 Space, 또는 `~/.grok/config.toml`:
110
+ 코드를 쓰기 전에, 에이전트는 성립하는 첫 번째 단계에서 멈춘다:
248
111
 
249
- ```toml
250
- [plugins]
251
- enabled = ["ponytail"]
252
112
  ```
253
-
254
- 새 세션을 열거나 플러그인을 다시 로드한다. 스킬은 `/ponytail`, `/ponytail-review`, `/ponytail-audit`, `/ponytail-debt`, `/ponytail-gain`, `/ponytail-help`로 보인다. `grok inspect`로 확인. Grok은 스킬 설명을 바탕으로 코딩 작업에서 ponytail을 자동으로 호출할 수 있다. 명시적으로 활성화해야 하면 `/ponytail`(또는 `/ponytail lite`, `/ponytail full`, `/ponytail ultra`)을 사용한다. `SessionStart` 출력으로는 지시문을 주입할 수 없으므로 Grok 라이프사이클 훅은 사용하지 않는다.
255
-
256
- 체크아웃의 `AGENTS.md`만으로도 지시문 전용 모드는 된다. 제거: `grok plugin uninstall ponytail`.
257
-
258
- ### Cursor
259
-
260
- ```bash
261
- git clone https://github.com/DietrichGebert/ponytail
262
- node ponytail/scripts/cursor-hooks.js install
113
+ 1. 이게 꼭 있어야 하나? → 아니면 건너뛴다 (YAGNI)
114
+ 2. 이미 이 코드베이스에 있나? → 다시 쓰지 말고 재사용한다
115
+ 3. 표준 라이브러리가 해 주나? → 그걸 쓴다
116
+ 4. 플랫폼 기본 기능이 있나? → 그걸 쓴다
117
+ 5. 이미 설치된 의존성이 있나? → 그걸 쓴다
118
+ 6. 한 줄로 되나? → 한 줄로 쓴다
119
+ 7. 그다음에야: 돌아가는 최소한의 코드
263
120
  ```
264
121
 
265
- 네이티브 훅 두 개를 `~/.cursor/hooks.json`에 합쳐 넣고(`--project`를 붙이면 `<프로젝트>/.cursor/hooks.json`에 쓴다), 이미 있던 다른 훅은 그대로 둔다. 항목들은 그 체크아웃에서 `node`를 실행하니, 체크아웃을 옮기지 말거나 옮긴 뒤 설치를 다시 돌린다. Cursor는 저장하면 파일을 다시 읽는다. 새 채팅을 열면 기본 레벨의 룰셋이 `sessionStart`로 들어온다. `/ponytail lite`, `/ponytail full`, `/ponytail ultra`, `/ponytail off`를 일반 메시지로 보내면 그 대화의 남은 구간 동안 레벨이 바뀌고, `/ponytail`은 현재 레벨을 알려 준다. Cursor의 `subagentStart`는 컨텍스트를 주입할 수 없어서 서브에이전트는 룰셋 없이 돌고, 클라우드 에이전트는 `sessionStart`를 아예 실행하지 않는다. 늘 켜진 규칙(`.cursor/rules/ponytail.mdc`)과 훅은 둘 중 하나만 쓴다. 규칙이 워크스페이스에 있으면 훅은 아무것도 주입하지 않고 모드 명령은 안내문으로 답하니, 훅이 레벨을 관리하게 하려면 규칙을 지운다. 계약, 검증 기록, 한계: [docs/cursor-hooks.md](docs/cursor-hooks.md). 제거: `node ponytail/scripts/cursor-hooks.js uninstall`.
122
+ 이 사다리는 문제를 이해한 *다음에* 돈다. 이해를 대신하지 않는다. 변경이 닿는 코드를 읽고 실제 흐름을 따라간 뒤에 단계를 고른다. 해결책에는 게으르고, 읽기에는 절대 게으르지 않다.
266
123
 
267
- 이게 끝이었다. 그 사람이라면 흐뭇해할 거다. 입 밖으로 내진 않겠지만.
124
+ 게으르지만 무책임하지는 않다. 신뢰 경계의 입력 검증, 데이터 손실 처리, 보안, 접근성은 절대 잘라 내지 않는다.
268
125
 
269
- 매 세션 켜져 있고, 명령 몇 개가 딸려 온다([Commands](#commands) 참고). `/ponytail ultra`는 코드베이스가 당신에게 단단히 밉보인 날을 위해 있다. 시작할 때와 모드를 바꿀 때 지금 모드를 보여 준다.
126
+ <a id="commands"></a>
127
+ ## 명령어
270
128
 
271
- 새 세션마다 적용할 레벨은 `PONYTAIL_DEFAULT_MODE` 환경 변수(`lite`/`full`/`ultra`/`off`)로, 또는 `~/.config/ponytail/config.json`의 `defaultMode` 필드(Windows에선 `%APPDATA%\ponytail\config.json`)로 정한다. 기본값은 `full`이다.
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` | 위 명령어들의 빠른 참고. |
272
137
 
273
- Cursor(규칙 파일만, [훅 설치](#cursor)의 대안), Windsurf, Cline, GitHub Copilot(에디터), Aider, Kiro, Zed, CodeWhale: 이 저장소에서 맞는 규칙 파일을 복사하면 된다([`.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/)).
138
+ 명령어는 스킬을 지원하는 호스트가 있어야 한다 (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival, Hermes Agent, Qoder, Grok Build). Codex CLI와 IDE 확장에서는 플러그인 네임스페이스 아래의 스킬이므로 `$ponytail:ponytail-review`처럼 부른다. [훅](INSTALL.md#cursor)을 쓰는 Cursor는 `/ponytail` 레벨 전환만 되고, 일반 메시지로 입력한다. 지시문만 쓰는 어댑터(Cursor 규칙 파일, Windsurf, Cline, Copilot, Kiro, Antigravity)는 명령어 없이 항상 켜진 규칙만 불러온다.
274
139
 
275
- Kiro: `.kiro/steering/ponytail.md`를 `~/.kiro/steering/`(전역)이나 프로젝트의 `.kiro/steering/`에 복사한다.
140
+ <a id="numbers"></a>
141
+ ## 수치
276
142
 
277
- GitHub Copilot CLI 폴백(지시문 전용 모드): 프로젝트의 `AGENTS.md`와 `.github/copilot-instructions.md`를 읽거나, 모든 프로젝트에서 ponytail을 돌리려면 규칙을 `~/.copilot/copilot-instructions.md`에 복사한다. 이 경로는 늘 켜진 가이드는 살리지만, 플러그인 모드 전환이나 훅은 더해 주지 않는다.
143
+ 정직한 측정은 실제 에이전트가 실제 일을 하는 것이다. 헤드리스 Claude Code 세션이 [tiangolo의 full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)(실제 FastAPI + React 저장소)를 고치고, 남긴 `git diff`로 점수를 매긴다. 기능 티켓 12개, 같은 에이전트를 스킬이 있을 때와 없을 때로, n=4, Haiku 4.5.
278
144
 
279
- Codex 확장을 쓰는 VS Code는 이 저장소가 함께 싣는 `AGENTS.md`를 읽으니, 저장소 루트에서 설정 없이 돌아간다(`~/.codex/AGENTS.md`를 두면 Codex 전역으로 잡힌다).
145
+ <p align="center">
146
+ <img src="assets/benchmark-agentic.svg" width="860" alt="각 비교군을 스킬 없는 기준선 대비 백분율로 나타낸 그래프 (줄 수, 토큰, 비용, 시간, Haiku 4.5). ponytail이 모든 지표에서 가장 낮다 (줄 수 46%, 토큰 78%, 비용 80%, 시간 73%). caveman은 토큰, 비용, 시간에서 100%를 넘는다. yagni-oneliner 줄 수 67%. 안전성(별도 공격 테스트): 기준선, caveman, ponytail 100%, yagni-oneliner 95%.">
147
+ </p>
280
148
 
281
- 어떤 파일이 어느 에이전트에 매핑되는지: [Agent portability](docs/agent-portability.md).
149
+ | 스킬 없는 기준선 대비 | 줄 수 | 토큰 | 비용 | 시간 | 안전 |
150
+ |---|--:|--:|--:|--:|--:|
151
+ | **ponytail** | **-54%** | **-22%** | **-20%** | **-27%** | **100%** |
152
+ | caveman (간결한 말투 대조군) | -20% | +7% | +3% | +2% | 100% |
153
+ | "YAGNI + 한 줄짜리" 프롬프트 | -33% | -14% | -21% | -30% | 95% |
282
154
 
283
- ## Commands
155
+ 모든 지표를 줄이는 것은 ponytail뿐이고, 그러면서도 완전히 안전한 것도 ponytail뿐이다. 과잉 구축의 함정이 실제로 있는 곳에서 가장 많이 줄어들고 (날짜 선택기 404줄에서 23줄, 색상 선택기 287줄에서 23줄. 컴포넌트 대신 기본 `<input>`을 쓰기 때문이다), 이미 최소한인 코드에서는 거의 줄지 않는다. 전체 방법, 작업별 표, 한계: [benchmarks/results/2026-06-18-agentic.md](benchmarks/results/2026-06-18-agentic.md).
284
156
 
285
- | 명령 | 하는 일 |
286
- |---------|--------------|
287
- | `/ponytail [lite \| full \| ultra \| off]` | 강도를 정하거나, 끈다. 인수가 없으면 지금 레벨을 알려 준다. |
288
- | `/ponytail-review` | 지금 diff를 과잉 구현 관점에서 훑고, 삭제 목록을 돌려준다. |
289
- | `/ponytail-audit` | diff만이 아니라 저장소 전체를 과잉 구현 관점에서 감사한다. |
290
- | `/ponytail-debt` | 미뤄 둔 `ponytail:` 간소화들을 장부로 모아, "나중에"가 "영영"이 되지 않게 한다. |
291
- | `/ponytail-gain` | 벤치마크로 잰 효과 스코어보드(코드 절감, 비용 절감, 속도 향상)를 보여 준다. |
292
- | `/ponytail-help` | 위 명령들의 빠른 참조. |
157
+ <details>
158
+ <summary><strong>예전 단발 측정 수치 (단독 생성)</strong></summary>
293
159
 
294
- 명령들은 스킬을 지원하는 호스트가 있어야 돈다(Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival). Codex에선 스킬이라 `@`로 부른다(`@ponytail-review`). [훅](#cursor)을 쓰는 Cursor는 `/ponytail` 레벨 전환만 되고, 일반 메시지로 입력한다. 지시문 전용 어댑터(Cursor 규칙 파일, Windsurf, Cline, Copilot, Kiro, Antigravity)는 명령 없이 늘 켜진 룰셋만 불러온다.
160
+ 일상적인 작업 5개, 모델 3개, 비교군 3개 (스킬 없음, [caveman](https://github.com/JuliusBrussee/caveman), ponytail), 10회 실행, 중앙값 보고. 프롬프트 하나, 응답 하나, 응답의 줄 수를 센다:
295
161
 
296
- ## Development
162
+ <p align="center">
163
+ <img src="assets/benchmark-3model.svg" width="860" alt="Haiku, Sonnet, Opus에서 비교군별 코드 줄 수 중앙값">
164
+ </p>
297
165
 
298
- 압축 규칙 텍스트를 바꿀 때는, 에이전트 사본들을 같은 상태로 맞춰 둔다:
166
+ 여기서는 **코드 80-94% 감소**가 나왔다. [#126](https://github.com/DietrichGebert/ponytail/issues/126)이 정확히 지적했듯, 아무것도 붙이지 않은 기준선 모델은 응답을 설명과 선택지로 부풀리기 때문에, 그 차이의 일부는 대화형 기준선이 만든 착시다. 위의 에이전트 수치가 바로잡은, 방어할 수 있는 버전이다. 단발 측정은 `npx promptfoo eval -c benchmarks/promptfooconfig.yaml`로 재현할 수 있다.
299
167
 
300
- ```bash
301
- node scripts/check-rule-copies.js
302
- npm test
303
- ```
168
+ </details>
304
169
 
305
- OpenClaw 스킬 패키지(`.openclaw/skills/`)는 `skills/`에서 생성된다. 스킬을 바꾼 뒤에는 `node scripts/build-openclaw-skills.js`를 다시 돌린다. 묵은 상태면 테스트 스위트가 실패한다.
170
+ **규칙은 처음부터 "토큰을 가장 적게"가 아니었다.** 규칙은 이것이다: 작업에 필요한 것만 쓰고, 검증, 오류 처리, 보안, 접근성은 절대 잘라 내지 않는다. 코드가 작아지는 것은 필요한 만큼이기 때문이지, 억지로 줄였기 때문이 아니다. 비용과 지연 시간이 줄어드는 것은 사다리를 따르는 모델에서 생기는 부수 효과다. 단계를 고민하느라 사고 토큰을 쓰는 간결한 추론 모델에서는 반대가 될 수 있다 (GPT-5.5에서는 그렇다).
306
171
 
307
- 정확성 벤치마크는 이메일·CSV 검사를 위해 Python을 띄운다. `python`보다 `python3`를 먼저 시도한다. CSV 검사는 로컬에 `pandas`가 깔려 있어야 한다.
172
+ ## 자주 묻는 질문
308
173
 
309
- ## FAQ
174
+ **[caveman](https://github.com/JuliusBrussee/caveman)과 같이 써도 되나?**
175
+ 된다. 같이 쓰는 게 좋다. caveman은 에이전트가 하는 말을 줄이고, ponytail은 에이전트가 만드는 것을 줄인다. 서로 다른 절반이라 겹치지 않는다. caveman은 코드를 바이트 하나까지 그대로 두고, ponytail은 말투에 손대지 않는다. 최소한의 코드에 대한 짧은 말.
310
176
 
311
177
  **설정 파일이 필요한가?**
312
- 아니다. 선택 사항인 `~/.config/ponytail/config.json`이나 `PONYTAIL_DEFAULT_MODE` 환경 변수로 기본 레벨을 정할 순 있지만, 꼭 있어야 하는 건 없다.
178
+ 아니다. 선택 사항인 `~/.config/ponytail/config.json`이나 `PONYTAIL_DEFAULT_MODE` 환경 변수로 기본 레벨을 정할 수 있지만, 필요한 것은 없다.
313
179
 
314
- **그래도 120줄짜리 캐시 클래스가 정말 필요하다면?**
315
- 필요 없다. 그래도 우기면 그가 만들어 준다. 천천히. 정확하게. 당신을 쳐다보면서.
180
+ **120줄짜리 캐시 클래스가 정말 필요하면?**
181
+ 필요 없다. 그래도 고집하면 만들어 준다. 천천히. 정확하게. 당신을 쳐다보면서.
316
182
 
317
- **확장은 되나?**
318
- 당신이 안 쓴 코드는 무한히 확장된다. 버그 0, CVE 0, 가동률 100%. 예나 지금이나.
183
+ **확장성은?**
184
+ 쓰지 않은 코드는 무한히 확장된다. 버그 0개, CVE 0개, 태초부터 가동률 100%.
319
185
 
320
- **왜 하필 "ponytail"인가?**
321
- 당신은 이유를 정확히 안다.
186
+ **왜 "ponytail"인가?**
187
+ 왜인지 정확히 알 것이다.
322
188
 
323
- ## Sponsors
189
+ ## 후원
324
190
 
325
191
  <p align="center">
326
192
  <a href="https://greenpt.com/">
@@ -331,11 +197,11 @@ OpenClaw 스킬 패키지(`.openclaw/skills/`)는 `skills/`에서 생성된다.
331
197
  </a>
332
198
  </p>
333
199
 
334
- ## License
200
+ ## 라이선스
335
201
 
336
202
  [MIT](LICENSE). 돌아가는 가장 짧은 라이선스.
337
203
 
338
- ## Star History
204
+ ## 스타 기록
339
205
 
340
206
  <a href="https://www.star-history.com/dietrichgebert/ponytail#history">
341
207
  <picture>