태그 목록에서 중복만 빼달라고 했는데, 새 패키지와 설정 파일까지 생겼다면 다음 변경부터는 그 코드도 함께 관리해야 합니다. Dietrich Gebert의 오픈소스 스킬 Ponytail은 코딩 에이전트가 변경 범위를 정할 때, 프로젝트에 있는 코드와 언어의 기본 기능부터 검토하도록 지시합니다.
Codex에 설치하기
터미널에서 아래 두 명령을 순서대로 실행합니다. 플러그인의 시작·종료 훅을 실행하려면 Codex가 쓰는 환경에서 Node.js를 찾을 수 있어야 합니다.
codex plugin marketplace add DietrichGebert/ponytail
codex plugin add ponytail@ponytailCodex CLI를 열고 /hooks에서 Ponytail이 등록한 두 훅의 실행 내용을 확인한 뒤, 신뢰할 수 있으면 승인하고 새 채팅을 시작합니다. 데스크톱 앱을 쓰면 설치 후 앱을 다시 시작합니다. 설치 환경별 안내는 Ponytail 공식 설치 문서에 있습니다.
Claude Code에 설치하기
Claude Code 프롬프트에 아래 명령을 한 줄씩 따로 보냅니다. 설치한 뒤 새 세션에서 /ponytail full로 기본 강도를 지정할 수 있습니다.
/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail첫 요청에 동작 조건을 적기
Codex에서 업스트림 플러그인을 설치했다면 입력창에서 Ponytail 스킬을 선택하거나 $ponytail:ponytail을 붙여 호출할 수 있습니다. Claude Code라면 /ponytail full로 모드를 켠 다음 아래 요청을 보냅니다.
태그 목록에서 중복을 제거해 줘.
처음 나온 순서를 유지하고 대소문자가 다른 태그는 각각 남겨 줘.
기존 헬퍼부터 확인하고, 빈 목록과 중복이 있는 목록을 검증해 줘.예제에서 달라지는 코드
앞 요청을 구현하는 한 가지 방법은 중복 검사 함수와 별도의 목록 변환 단계를 만드는 겁니다. JavaScript의 Set은 문자열을 처음 추가한 순서대로 순회하고 대소문자가 다른 문자열을 구분하므로 이 예제의 두 조건을 이미 만족합니다. 프로젝트에 같은 헬퍼가 없다면 아래 한 줄로 충분합니다.
아래는 동작을 설명하기 위해 만든 예제입니다. tags.mjs로 저장하고 node tags.mjs를 실행하면 순서, 대소문자, 빈 목록을 검증할 수 있습니다.
import assert from 'node:assert/strict';
const uniqueTags = tags => [...new Set(tags)];
assert.deepEqual(uniqueTags(['news', 'AI', 'news', 'ai']), ['news', 'AI', 'ai']);
assert.deepEqual(uniqueTags([]), []);태그를 대소문자 구분 없이 합쳐야 하는 제품이라면 동일하다고 볼 기준과 어떤 표기를 남길지 먼저 정해야 합니다. 예제를 내 코드에 옮길 때는 기존 호출자가 기대하는 동작도 같이 확인합니다.
강도 고르기
Table 1 · 요청에 맞는 Ponytail 강도 고르기
| 강도 | 어떤 때 쓰나 |
|---|---|
| Lite | 요청한 범위는 유지하고, 더 작은 대안이 있는지도 듣고 싶을 때 |
| Full | 기존 코드와 표준 기능부터 확인해 요구사항을 만족하는 최소 변경을 찾을 때. 기본값 |
| Ultra | 기능이나 옵션이 꼭 필요한지부터 다시 따져보고 싶을 때 |
외부 입력 검증, 데이터 손실을 막는 오류 처리, 보안과 접근성은 어느 강도에서든 유지할 조건입니다. 변경을 받으면 줄 수보다 먼저 diff와 테스트를 열어 처음 요청에 적었던 조건이 남아 있는지 확인합니다. Ponytail 원본 스킬