- name
- pumasi-image
- description
- Image-generation companion skill for the pumasi plugin family. Use when the user asks for an image, thumbnail, poster, logo, illustration, banner, profile image, cover, icon, or any visual artifact โ including casual phrasing like "๊ทธ๋ฆผ ํ๋ ๋ฝ์์ค", "๋น์ฃผ์ผ ๋ง๋ค์ด์ค", and Codex-named requests like "์ฝ๋ฑ์ค๋ก ์ด๋ฏธ์ง ๋ง๋ค์ด์ค"; this skill owns every image request. In Codex it maps to the native image generation/editing tool (gpt-image-2), with an optional Grok image_gen backend through the bundled scripts. Korean triggers โ "์ด๋ฏธ์ง ๋ง๋ค์ด์ค", "๊ทธ๋ฆผ ์์ฑํด์ค", "์ธ๋ค์ผ ๋ง๋ค์ด", "๋ก๊ณ ๋ง๋ค์ด์ค", "์ผ๋ฌ์คํธ ๊ทธ๋ ค์ค", "ํฌ์คํฐ ๋ง๋ค์ด", "๋ฐฐ๋ ๋ง๋ค์ด", "์์ด์ฝ ๋ง๋ค์ด", "ํ์ง ์ด๋ฏธ์ง". English triggers โ "create image", "make thumbnail", "make logo", "make illustration", "draw image". DO NOT trigger on code-generation requests like "ํจ์/์ปดํฌ๋ํธ/ํ์ด์ง/๋ฐฐ๋ ์ปดํฌ๋ํธ ๋ง๋ค์ด์ค" โ those go to the pumasi skill.
# /pumasi-image โ Codex ์ด๋ฏธ์ง ์์ฑ
> Codex์ ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง ์์ฑ/ํธ์ง ๋๊ตฌ(`image_gen`, gpt-image-2)๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๋ค.
> ์ฝ๋ ๋ณ๋ ฌ ์ธ์ฃผ(pumasi)์ ์์ ํ ๋ถ๋ฆฌ๋ ๋
๋ฆฝ ์คํฌ.
> **์ด๋ฏธ์ง ์์ฒญ์ ์ฌ์ฉ์๊ฐ "์ฝ๋ฑ์ค๋ก"๋ผ๊ณ ๋งํด๋ ์ ๋ถ ์ด ์คํฌ์ด ๋ด๋นํ๋ค** โ pumasi๋ก ๋๊ธฐ์ง ์๋๋ค.
## ๋จผ์ ์ฝ์ ๊ฒ
- `references/clarification-matrix.md` โ ๋ชจ๋๋ณ ์๋ ํ์
์ง๋ฌธ ๋งคํธ๋ฆญ์ค
- `references/keyword-mapping.md` โ ๋น์จยทํ๋ฆฌํฐ ํค์๋ ์๋ ๋งคํ + ์์ฐ์ด ํํธ ๋ณํํ
- `references/image-studio-prompt.md` โ ๋ชจ๋ ๋ถ๋ฅ + Output Template ์์คํ
ํ๋กฌํํธ (์๋ฌธ ํ๋กฌํํธ ์์ฑ ์ง์ ์๋ง Read)
---
## ํต์ฌ ์์น
1. **๋ฐฑ์๋๋ 2์ข
โ Codex ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง ๋๊ตฌ(๊ธฐ๋ณธ)ยทGrok `image_gen`(์ ํ)** โ nanobanana ๋ฑ ๋ค๋ฅธ ๋ฐฑ์๋ ์ฌ์ฉ ์ ํจ. ๋ฐฑ์๋๋ Step 3์์ ์ฌ์ฉ์๊ฐ ๊ณ ๋ฅธ๋ค(์
๋ ฅ์ ์ง๋ช
์ด ์์ผ๋ฉด ์คํต). Grok์ ์ธ ๋๋ ๋ฐ๋์ `scripts/imagen.sh`(`--backend grok`)๋ฅผ ๊ฒฝ์ ํ๋ค(๋น์จ ๊ฐ์ ยทํ์ฅ์ ์ ํฉยท์คํจ ์ฌ์ ํ๋ฉดํ๊ฐ ๊ทธ ์์ ์๋ค). `grok`์ ์ง์ ๋ถ๋ฅด์ง ๋ง ๊ฒ.
2. **API ํค๋ฅผ ๊บผ๋ด ์ง์ ํธ์ถํ์ง ์๋๋ค** โ ๋ณผํธยทํ๊ฒฝ๋ณ์ยท์ค์ ํ์ผ์์ OpenAI(๋๋ xAI) API ํค๋ฅผ ์ฝ์ด `api.openai.com` ๋ฑ ์ด๋ฏธ์ง API ์๋ํฌ์ธํธ๋ฅผ ์ง์ ๋ถ๋ฅด๋ ํ๋์ **๊ธ์ง**. ์ด๋ฏธ์ง๋ ์ค์ง (a) Codex ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง ๋๊ตฌ ๋๋ (b) `scripts/`์ codex/grok ๋ฐฑ์๋๋ก๋ง ๋ง๋ ๋ค. ๊ตฌ๋
์ธ์
์ด ์ธ์ฆ์ ๋ด๋นํ๋ฉฐ, ์ด ์คํฌ์ ์ด๋ค ํค๋ ๋ง๋ค๊ฑฐ๋ ๋ณต์ฌํ์ง ์๋๋ค.
3. **image-studio ์์คํ
ํ๋กฌํํธ ๋ด๋ฉดํ** โ ๋ชจ๋ ๋ถ๋ฅ + Output Template ์์ฑ
4. **ํ์ฒ๋ฆฌ ์ ๋ ๊ธ์ง** โ sips/ImageMagick/์ฌ์ธ์ฝ๋ฉ ๊ธ์ง, ์์ฑ ์๋ณธ ๊ทธ๋๋ก ์ ์ฅ(SHA1 ์ ์ง)
5. **์ ์ฅ ๊ฒฝ๋ก ๊ณ ์ ** โ `{BASE_DIR}/images/{YYYY-MM-DD}/{slug}-{seq}.png`
6. **์ต๋ 5๊ฐ ์ง๋ฌธ** โ ๊ธฐ์ 2๊ฐ + ์๋ 3๊ฐ, ์กฐ๊ฑด๋ถ ์คํต
7. **ํ
์คํธ๋ ์ด๋ฏธ์ง ๋๊ตฌ๊ฐ ์ง์ ๋ ๋๋งํ๋ค** โ ์ธ๋ค์ผยทํฌ์คํฐยท๋ก๊ณ ์ ํ๊ธ/์๋ฌธ ์นดํผ๋ ํ๋กฌํํธ์ Text Integration ์น์
์ ๋ฐ์ดํ๋ก ๋ฌถ์ด ๊ทธ๋๋ก ๋ช
์. **HTML/CSS ๋ถ๋ฆฌยทํํฉ์ฑยทํ
์คํธ ๋ ์ด์ด ๋ถํ ์ ๋ ๊ธ์ง.** ๊ตฌ์ธ๋ diffusion(SD/Midjourney) ๊ฐ์ ์ผ๋ก "ํ
์คํธ ๋ชป ๊ทธ๋ฆผ"์ด๋ผ๊ณ ํํผํ์ง ๋ง ๊ฒ โ ๋ค์ ยง์ capability snapshot ์ฐธ์กฐ.
---
## gpt-image-2 capability snapshot (as of 2026-05)
> ๋ชฉ์ : ๊ตฌ์ธ๋ 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์ฐจ ์ง์ ๋ ๋ ๊ธ์ง ์ฌ์ ์๋
- โ "์ธ๋ค์ผ์ด๋๊น ํ
์คํธ ๋ถ๋ถ๋ง ๋ฐ๋ก ๋์์ธํ์" โ ํ ์ปท์ ํตํฉ ๋ ๋๊ฐ ์ ์
- โ "๋ก๊ณ ์ ํ์/ํ๊ธ ๋ค์ด๊ฐ๋ฉด ์ ๋จ" โ ์๋๋งํฌ ์ง์ ๋ ๋ ๊ฐ๋ฅ
### Grok image_gen ์ฐจ์ด (์ ํ ๋ฐฑ์๋)
- ๋น์จ์ **9:16 / 16:9 / 1:1๋ง** ์ง์ โ ๊ทธ ์ธ๋ฅผ ์ฃผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ 1:1๋ก ๊ฐ์ ํ๊ณ ๊ฒฝ๊ณ ํ๋ค
- ํ๋ฆฌํฐ ํ๋ผ๋ฏธํฐ ์์ (ํ๋ฆฌํฐ ์ง๋ฌธ ์คํต)
- ์ฐ์ถ๋ฌผ์ด ๋ณดํต **JPEG** โ ์คํฌ๋ฆฝํธ๊ฐ ํ๊น ํ์ฅ์๋ฅผ ์์ค์ ๋ง์ถฐ ์๋ ์กฐ์ ํ๊ณ ์ต์ข
๊ฒฝ๋ก๋ฅผ `path:`๋ก ๋ณด๊ณ ํ๋ค
- ํ
์คํธ ๋ ๋ ํ์ง์ gpt-image-2 ๋๋น ๋ฏธ๊ฒ์ฆ. SuperGrok ๊ตฌ๋
์ด๋ฉด ํ๊ณ๋น์ฉ 0
### ์ด์ ๋ฃฐ
1. **1์ฐจ๋ ๋ฌด์กฐ๊ฑด ์ด๋ฏธ์ง ๋๊ตฌ๋ก ์ง์ ๋ ๋** โ ํ
์คํธ ํฌํจ ์ฌ๋ถ ๋ฌด๊ด
2. **๊ฒฐ๊ณผ ๊ฒ์** โ ์ด๋ฏธ์ง ํ์ ํ ํ
์คํธ ์ ํ๋ ์ฌ์ฉ์ ํ์ธ (Step 7 ๋ชจ๋ ์ฐธ์กฐ)
3. **์ฌ์๋ ์ฐ์ ** โ ์ฒซ ๊ฒฐ๊ณผ๊ฐ ๊นจ์ก์ผ๋ฉด ํ๋กฌํํธ ๋ณด๊ฐ(ํฐํธ ๋ช
์, ํฌ๊ธฐ ๋ช
์)ํด์ 1-2ํ ์ฌ์์ฑ
4. **ํฉ์ฑ ์ต์
์ ์ฌ์ฉ์ ๋ช
์ ๊ฑฐ๋ถ ํ** โ "์ง์ ๋ ๋ ๊ฒฐ๊ณผ ๋ง์์ ์ ๋ค์ด, ํฉ์ฑ์ผ๋ก ๊ฐ์"๋ ์ฌ์ฉ์ ๋ฐํ๊ฐ ์์ ๋๋ง ํํฉ์ฑ ์ํฌํ๋ก์ฐ ์ ์
---
## ์ํฌํ๋ก์ฐ
### Step 0: feature flag ํ์ธ (scripts ๊ฒฝ๋ก๋ฅผ ์ธ ๋๋ง)
๋ค์ดํฐ๋ธ ๋๊ตฌ๋ฅผ ์ง์ ์ฐ๋ฉด ์ด ๋จ๊ณ๋ ์๋ค. `scripts/imagen.sh` ์์ ๊ฒฝ๋ก๋ฅผ ์ธ ๋๋ ์คํฌ๋ฆฝํธ๊ฐ `codex features list`๋ก `image_generation` ํ๋๊ทธ๋ฅผ ํ์ธํ๊ณ ๊บผ์ ธ ์์ผ๋ฉด `codex features enable image_generation`์ผ๋ก ์ผ ๋ค โ ์ฌ์ฉ์์๊ฒ๋ ์กฐ์ฉํ ์ํํ๋ค๊ณ ๋ง ์งง๊ฒ ์๋ฆฐ๋ค.
### 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 3์ ์ง๋ฌธ์ "๋ชจ๋ ์ ํ" 1๊ฐ๋ฅผ ์ถ๊ฐํ๋ค.
### Step 2: ํค์๋ ์๋ ๋งคํ โ ํ๋ผ๋ฏธํฐ ์ถ์ถ
`references/keyword-mapping.md`๋ฅผ Readํ์ฌ ๋น์จยทํ๋ฆฌํฐ ์์ฐ์ด ํํธ๋ฅผ ์ถ์ถํ๋ค.
- ๋น์จ ํค์๋๊ฐ ์
๋ ฅ์ ์์ผ๋ฉด โ ๋น์จ ์ง๋ฌธ ์คํต
- ํ๋ฆฌํฐ ํค์๋๊ฐ ์
๋ ฅ์ ์์ผ๋ฉด โ ํ๋ฆฌํฐ ์ง๋ฌธ ์คํต
### Step 3: ์ฌ์ฉ์ ์ง๋ฌธ (ยงA ๋ฒํธํ ๋ธ๋ก, ์ต๋ 5๊ฐ)
Codex CLI์๋ ๊ฐ๊ด์ ์นด๋ํ ์ง๋ฌธ UI๊ฐ **์๋ค.** ๊ฒฐ์ ์ด ๊ผญ ํ์ํ๋ฉด
`$PLUGIN_ROOT/shared/questioning-policy.md ยงA`์ **์ฑํ
๋ฒํธํ ์ ํ์ง ๋ธ๋ก**์ผ๋ก ๋ฌป๋๋ค.
`references/clarification-matrix.md`๋ฅผ Readํ์ฌ ๋ชจ๋๋ณ ์๋ ํ์
์นดํ
๊ณ ๋ฆฌ 3๊ฐ๋ฅผ ํ์ ํ๋ค.
**์ง๋ฌธ ์์** (ํ ํด ์ต๋ 4๋ฌธํญ โ ์ด๊ณผ๋ถ์ ์ฐ์ ์์ ๋ฎ์ ์๋ ์ง๋ฌธ๋ถํฐ ์๋ผ๋ธ๋ค):
0. **๋ฐฑ์๋** (์
๋ ฅ์ "๊ทธ๋ก์ผ๋ก"/"grok"/"์ฝ๋ฑ์ค๋ก"/"codex" ์ง๋ช
์ด ์์ผ๋ฉด ์คํต)
```text
์ง๋ฌธ: ์ด๋ค ๋ฐฑ์๋๋ก ์์ฑํ ๊น์?
1. Codex gpt-image-2 (๊ถ์ฅ) โ ์์ ๋น์จ, ํ๊ธ/์๋ฌธ ํ
์คํธ ๋ ๋ ๊ฐํจ
2. Grok image_gen โ SuperGrok ๊ตฌ๋
์ ํ๊ณ๋น์ฉ 0. ๋จ ๋น์จ 9:16/16:9/1:1๋ง, ํ
์คํธ ๋ ๋ ๋ฏธ๊ฒ์ฆ
3. ๋ฌธ์ฅ์ผ๋ก ์ง์ ์๋ ค์ฃผ๊ธฐ
```
1. ๋น์จ (Step 2์์ ํ์ ๋์ผ๋ฉด ์คํต. **Grok ์ ํ ์ ์ ํ์ง๋ฅผ 9:16/16:9/1:1๋ก ์ ํ**)
2. ํ๋ฆฌํฐ (Step 2์์ ํ์ ๋์ผ๋ฉด ์คํต. Grok์๋ ํ๋ฆฌํฐ ํ๋ผ๋ฏธํฐ๊ฐ ์์ผ๋ฏ๋ก Grok ์ ํ ์ ์คํต)
3~5. ์๋ ํ์
3๊ฐ (๋ชจ๋ ๋งคํธ๋ฆญ์ค ๊ธฐ๋ฐ)
**์ง๋ฌธ ์์น**:
- ยง1 + ยง2c: ์ด๋ฏธ ์
๋ ฅ์์ ํ์ ๋ ์ฐจ์์ **๋ฌป์ง ์๋๋ค**. ์์ฒญ์ด ๊ตฌ์ฒด์ ์ด๋ฉด ์ง๋ฌธ ์์ด ๋ฐ๋ก ์์ฑํ๋ค(๊ณผ์ ์ง๋ฌธ = ๋ง์ฐฐ ์คํจ).
- ๋ฌผ์ ๋๋ ยงA ๋ฒํธํ ๋ธ๋ก์ผ๋ก โ ๊ฐ ์ฌ๋กฏ๋น 5๊ฐ ์ด์ ์ ํ์ง, ๊ทธ์ค 1~2๊ฐ๋ ์ฐฝ์์ ๋์(โ
), ๋ง์ง๋ง์ "๋ฌธ์ฅ์ผ๋ก ์ง์ ์๋ ค์ฃผ๊ธฐ"(Other ๋์ฒด).
- "์๋ ์ถ์ฒ(AI ํ๋จ)" ์์ ๋ง ์ ํ์ง๋ฅผ ํญ์ ํฌํจํ๊ณ , "๋ชจ๋ฅด๋ฉด 1๋ฒ(์๋ ์ถ์ฒ)์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค"๋ก ์๋ดํ๋ค.
- ์ฌ๋ฌ ์ฌ๋กฏ์ ํ ๋ฒ์ ๋ฌผ์ ๋๋ ๊ฐ ์ง๋ฌธ ๋ธ๋ก์ ์ด์ด์ ์ถ๋ ฅํ๊ณ "์ฌ๋ฌ ๊ฐ๋ฉด 1,3์ฒ๋ผ ์ ์ด์ฃผ์ธ์"๋ก ์๋ด. ์นด๋ UI๋ฅผ ํ๋ด๋ด์ง ๋ง ๊ฒ.
ยงA ๋ธ๋ก ์์ (๋จ์ผ ์ฌ๋กฏ):
```text
์ง๋ฌธ: ์ด๋ค ๋ถ์๊ธฐ๋ก ๊ฐ๊น์?
1. ์๋ ์ถ์ฒ โ ๋ด์ฉ์ ๋ง๊ฒ ํ๋จ. ๊ฒฐ์ ํผ๋ก ์์ด ์งํ
2. ๋คํฌ ์๋ค๋งํฑ โ ์ํ์ , ๊น์ ๊ทธ๋ฆผ์
3. ๋ฐ๋ปํจ โ ์น๊ทผ, ํ์ด, ํ์คํ
4. ์กฐ์ฉํ ์๋ก๊ฐ (โ
) โ ์์ํจ, ์ฌ์ด
5. ๋ฌธ์ฅ์ผ๋ก ์ง์ ์๋ ค์ฃผ๊ธฐ
```
### Step 4: image-studio ๋ด๋ฉดํ + Output Template ์์ฑ
`references/image-studio-prompt.md`๋ฅผ Readํ์ฌ ์์คํ
ํ๋กฌํํธ๋ฅผ ๋ด๋ฉดํํ๋ค.
๋ด๋ฉดํ ํ:
1. Normalization JSON ๋ด๋ถ์ ์ผ๋ก ์์ฑ (๋
ธ์ถํ์ง ์์)
2. ์ ํ๋ ๋ชจ๋์ Output Template์ 200~500 ๋จ์ด ์๋ฌธ ํ๋กฌํํธ๋ก ์์ฑ
3. ์ฌ์ฉ์ ์ ํ ๊ฐ(๋น์จยทํ๋ฆฌํฐยท์๋ 3๊ฐ)์ Technical Specifications / Anti-Patterns ์น์
์ ๋ฐ์
4. ๋น์จยทํ๋ฆฌํฐ ์์ฐ์ด ํํธ๋ฅผ Technical Specifications์ ์ฝ์
(keyword-mapping.md ์ฐธ์กฐ)
5. **Format / Medium Guard** โ ๋จ์ผ ์ฌ๋ณผ ์ปจ์
(๋๋ณด๊ธฐยท๋ก์ผยท๋ฐฉํจ ๋ฑ)์ ์ฌ์ฉ์๊ฐ ๋ก๊ณ /์์ด์ฝ์ ์์ฒญํ์ง ์์๋๋ฐ ์ฑ์์ด์ฝยท๊ธ๋์ค ๋ฐฐ์ง๋ก ๋ง๋ค์ง ์๋๋ค. hero/๋ฐฐ๋/์ปค๋ฒ/์ฌ์ ํ๋ ์์ ๊ฐ๋ ์ฑ์ฐ๋ full-bleed ์ฅ๋ฉด์ผ๋ก ๋ฒ์ญํ๋ค (image-studio-prompt.md์ ๊ฐ๋ ์ฐธ์กฐ)
ํ๋กฌํํธ๋ฅผ ๋ค์ ๊ฒฝ๋ก์ ์ ์ฅ (์์ผ๋ฉด `mkdir -p`):
```
{BASE_DIR}/.imagen/prompt-{timestamp}.md
```
### Step 4-bis (์ ํ, feature flag ๋ค): ์๋ฌธ ํ๋กฌํํธ ์์ฑ์ codex ์์ปค์ ์์
ํ๊ฒฝ๋ณ์ `PUMASI_IMAGE_DELEGATE_PROMPT=1` ์ค์ ์:
1. Step 4์ image-studio-prompt.md Read + ์๋ฌธ ํ๋กฌํํธ ์์ฑ ๋จ๊ณ **์คํต**
2. Step 6์์ `scripts/imagen-full.sh` ํธ์ถ โ ์๋ ํ ์ค + mode + aspect + quality + ํ๊น ๊ฒฝ๋ก(+ ์ ํ ref ์ด๋ฏธ์ง)๋ง ์ ๋ฌ
3. ์๋ฌธ ํ๋กฌํํธ ์์ฑ์ codex ์์ปค ์ธก์์ ์ํํ๊ณ prompt.md + manifest.json + codex.log๋ฅผ `{ํ๊น๋๋ ํ ๋ฆฌ}/.imagen-full/`์ ์ ์ฅ (refine ๋ณต๊ตฌ์ฉ)
4. **์๋ fallback**: imagen-full.sh๊ฐ exit โ 0์ด๋ฉด ์ฆ์ Step 4(์ง์ ์์ฑ) + ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ก ํด๋ฐฑ. ์ฌ์ฉ์์๊ฒ๋ "์์ ๊ฒฝ๋ก ์คํจ โ ์ง์ ์์ฑ ๊ฒฝ๋ก๋ก ์ ํ" ํ ์ค ์๋ด. codex ๋ฐฑ์๋ ์ ์ฉ(Grok์๋ ์์).
### Step 5: ์ ์ฅ ๊ฒฝ๋ก ๊ณ์ฐ
**๊ธฐ์ค ๋๋ ํ ๋ฆฌ (ํ๋์ฝ๋ฉ ๊ธ์ง, ๋์ ๊ณ์ฐ)**:
```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" # ์์ฒญ์์ ๊ณ์ฐ (ํต์ฌ ๋ช
์ฌ 1~2๊ฐ โ ์๋ฌธ kebab-case)
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"
```
**์ git root ๊ธฐ์ค์ธ๊ฐ**: ์ธ์
์ cwd๊ฐ ํญ์ ํ๋ก์ ํธ ๋ฃจํธ๋ ์๋๋ค. ๋จ์ ์๋๊ฒฝ๋ก๋ ์๋ฑํ ๊ณณ์ ์ ์ฅ๋ ์ํ์ด ์์ด, ํ๋ก์ ํธ ๋ฃจํธ์ `images/` ํ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๋ค. git ์ ์ฅ์ ๋ฐ์ด๋ฉด `pwd` ๊ธฐ์ค.
slug ์: "๋ถ์ฐ ๊ด์๋๊ต ์ผ๊ฒฝ" โ `busan-gwangan-bridge-night`, "AI ๋ง์ผํ๋ ์ด์ค ๋ก๊ณ " โ `ai-marketplace-logo`.
ํ์ฅ์๋ `.png`. Grok ๋ฐฑ์๋๋ ์ฐ์ถ๋ฌผ์ด ๋ณดํต JPEG๋ผ ์คํฌ๋ฆฝํธ๊ฐ ํ์ฅ์๋ฅผ ๋ง์ถฐ ์กฐ์ ํ๋ฏ๋ก **๊ฒฐ๊ณผ ๋ณด๊ณ ๋ ์คํฌ๋ฆฝํธ ์ถ๋ ฅ์ `path:`๋ฅผ ๊ธฐ์ค**์ผ๋ก ํ๋ค.
### Step 6: ์ด๋ฏธ์ง ์์ฑ ํธ์ถ
**๊ธฐ๋ณธ ๊ฒฝ๋ก โ Codex ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง ๋๊ตฌ๋ฅผ ์ง์ ํธ์ถํ๋ค.**
- ๋ฐฑ๊ทธ๋ผ์ด๋ CLI ์ธ์
์ ๋์ฐ์ง ์๋๋ค.
- Step 4์ ์๋ฌธ ํ๋กฌํํธ + Step 5์ ํ๊น ๊ฒฝ๋ก๋ฅผ ๋๊ตฌ์ ์ ๋ฌํ๋ค.
- ํ๋กฌํํธ ๋์ ํ์ฒ๋ฆฌ ๊ธ์ง ๊ฐ๋(์๋ณธ ์ ์ง, ์ฌ์ธ์ฝ๋ฉ ๊ธ์ง)๋ฅผ ๋ช
์ํ๋ค.
- ํ
์คํธ๊ฐ ๊นจ์ก์ผ๋ฉด ํฉ์ฑํ์ง ๋ง๊ณ ํ๋กฌํํธ๋ฅผ ๋ณด๊ฐํด 1~2ํ ์ฌ์์ฑํ๋ค(์ด์ ๋ฃฐ 3).
- ๋๊ตฌ๊ฐ ๋๋ ค์ค ์ด๋ฏธ์ง๋ฅผ **์ด๋ฒ ํธ์ถ ์ฐ์ถ๋ฌผ๋ง** Step 5์ ํ๊น ๊ฒฝ๋ก์ ์ ์ฅํ๋ค. ์์ฑ์ด 0์ฅ์ด๋ฉด ๊ฑฐ์ง ์ฑ๊ณต์ ๋ณด๊ณ ํ์ง ๋ง๊ณ ์คํจ๋ก ์ฒ๋ฆฌํ๋ค.
**์คํ์ผ ์ต์ปค(๋ ํผ๋ฐ์ค)**: ์ฌ๋ฌ ์ฅ์ ๊ฐ์ ์คํ์ผ๋ก ๋ฝ์ ๋๋ 1์ฅ์ ๋จผ์ ์์ฑยท์น์ธ๋ฐ๊ณ , ๋๋จธ์ง๋ฅผ ์ ๋ถ ๊ทธ ํ์ผ์ ๋ ํผ๋ฐ์ค๋ก ๋ฌผ๋ ค ํธ์ง ๋๊ตฌ๋ก ์์ฑํ๋ค(์ต์ปค ์ฐ์ ํจํด). ๋ ํผ๋ฐ์ค๊ฐ ์์ผ๋ฉด ํ๋กฌํํธ์์ ์คํ์ผ ์์ ์ ๊ฑท์ด๋ด๊ณ "์ฒจ๋ถ ์ด๋ฏธ์ง์ ์คํ์ผยท์กฐ๋ช
ยท์๊ฐ ์ ์ง" + ํผ์ฌ์ฒดยท๊ตฌ๋ ๋ธํ๋ง ์ด๋ค โ ๋ ํผ๋ฐ์ค๊ฐ ์ด๋ฏธ ๋ฌถ์ ๊ฒ์ ๊ธด ์ฐ๋ฌธ์ผ๋ก ์ฌ์์ ํ๋ฉด ๋์ด ์ธ์ด๋ค. ์คํ์ผ ์ผ๊ด์ฑ ์๋จ ์์ด(1์ฐจ ์ถ์ฒ ๋ฆฌ์์น 2026-08-22): ๋ ํผ๋ฐ์ค ์ด๋ฏธ์ง โซ ํ
์คํธ ์ฌ์ฌ์ฉ โซ seed(์ด๋ ๋ฒค๋๋ ํ๋กฌํํธ๊ฐ ๋ฌ๋ผ์ง ๋ค์ ์ฌํ์ ๋ณด์ฅํ์ง ์์).
#### ์์ ๊ฒฝ๋ก (์ ํ) โ scripts ์ฌ์ฉ
๋ณ๋ `codex exec` ์์ปค์ ์์ฑ์ ์์ํ๊ฑฐ๋(ํธ์คํธ ์ปจํ
์คํธ ์ ์ฝ), **Grok ๋ฐฑ์๋**๋ฅผ ์ฐ๊ฑฐ๋, ์๋ฌธ ํ๋กฌํํธ ์์ฑ๊น์ง ์์ํ๋ ค๋ฉด `scripts/`์ ๊ฒฐ์ ์ ๋ํผ๋ฅผ ์ด๋ค:
```bash
# ์๋ฌธ ํ๋กฌํํธ๋ ํธ์คํธ๊ฐ ์์ฑ, ์์ฑ๋ง ์์ (3๋ฒ์งธ ์ธ์ ๋น์จ์ ์ค์ธก ๋น๊ต ๊ฒฝ๊ณ ์ฉ, --ref ๋ฐ๋ณต ๊ฐ๋ฅ)
bash $PLUGIN_ROOT/skills/pumasi-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 โ ์๋ต ๊ฐ๋ฅ}"
# ์๋ฌธ ํ๋กฌํํธ ์์ฑ๊น์ง codex ์์ปค์ ์์ (PUMASI_IMAGE_DELEGATE_PROMPT ๊ฒฝ๋ก)
bash $PLUGIN_ROOT/skills/pumasi-image/scripts/imagen-full.sh \
"{intent}" "{mode}" "{aspect}" "{quality}" "{target_image_path}" "{ref_image โ ์๋ต ๊ฐ๋ฅ}"
# ์ฌ๋ฌ ์ฅ ์ผ๊ด (partial success + per-item retry manifest; ํญ๋ชฉ์ "ref" ํค๋ก ์ต์ปค ์ง์ ๊ฐ๋ฅ)
bash $PLUGIN_ROOT/skills/pumasi-image/scripts/imagen-batch.sh "{batch_json_path}"
```
`--backend grok`: `grok` ํค๋๋ฆฌ์ค `image_gen`์ผ๋ก ์์ฑํ๋ค(`--ref`๋ฅผ ์ฃผ๋ฉด `image_edit`). ์ฌ์ ์กฐ๊ฑด: grok CLI ์ค์น(`$HOME/.grok/bin/grok`) + `grok login`. ๋ฏธ์ค์น/๋ฏธ๋ก๊ทธ์ธ์ด๋ฉด ์คํฌ๋ฆฝํธ๊ฐ exit 3์ผ๋ก ์คํจํ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๊ณ codex ์ฌ์์ฑ ์ฌ๋ถ๋ฅผ ยงA ๋ธ๋ก์ผ๋ก ํ์ธํ๋ค.
๋ํผ ๋ด๋ถ ๋์(codex ๋ฐฑ์๋):
1. `codex features list`๋ก image_generation feature flag ์ฌํ์ธ (์์ ๋ง)
2. `codex exec --json โฆ < /dev/null` ํธ์ถ โ codex๊ฐ ์ด๋ฏธ์ง ๋๊ตฌ๋ก 1์ฅ ์์ฑ. `< /dev/null`์ exec๊ฐ stdin EOF๋ฅผ ๋ฌดํ ๋๊ธฐ(ํค๋๋ฆฌ์ค ํ)ํ๋ ๊ฒ์ ๋ง๋๋ค. ๋ ํผ๋ฐ์ค๋ `--image=<path>`(ํ์ผ๋น 1๊ฐ)๋ก ์ ๋ฌ โ `-i FILE...`์ ๊ฐ๋ณ ์ธ์๋ผ ๋ค๋ฐ๋ฅด๋ ํ๋กฌํํธ๋ฅผ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ก ์ผ์ผ "No prompt provided" ์คํจ๋ฅผ ๋ง๋ ๋ค(์ค์ธก 2026-08-22).
3. **ํ์ ๊ณ์ฝ (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 ๋์ฝ๋ฉ ํด๋ฐฑ(`extract_image.py`)์ ์ ์งํ๋ค. ์์ฑ 0์ฅ์ด๋ฉด ๊ฑฐ์ง ์ฑ๊ณต ์์ด exit 5.
4. ์ค์ธก ํด์๋(`sips`) + ์์ฒญ ๋น์จ๊ณผ 15%โ ๊ดด๋ฆฌ ์ ๊ฒฝ๊ณ . ํ์ฒ๋ฆฌ๋ ์ ๋ ํ์ง ์์.
5. **ํ๋ก์ ์ฐํ** โ ๋ก์ปฌ ํ๋ก์(`HTTP_PROXY`/`HTTPS_PROXY`)๊ฐ ํ๊ฒฝ์ ์์๋ผ ์์ผ๋ฉด codex ํธ์ถ์์๋ง ๋ฒ๊ธด๋ค. ํ๋ก์๋ฅผ ๊ฒฝ์ ํ๋ฉด ์ด๋ฏธ์ง ์๋ํฌ์ธํธ ์์ฒญ์ด ~153์ด ๋ค `network error`๋ก ์ฃฝ๋๋ค(2026-07-23 ์ค์ธก: ๊ฒฝ์ 89/89 ์คํจ, ์ฐํ ์ ๋์ผ ํ๋กฌํํธ 44์ด ์ฑ๊ณต). ํด์ ๋ `PUMASI_IMAGE_KEEP_PROXY=1`.
6. **์คํจ ์ฌ์ ํ๋ฉดํ** โ codex๊ฐ ๋จ๊ธด `image generation failed: โฆ` ์๋ฌธ์ `REASON:`์ผ๋ก ์ถ๋ ฅํ๊ณ , network error๋ฉด ํ๋ก์ ํํธ๋ฅผ ๋ง๋ถ์ธ๋ค. ๋คํธ์ํฌ ์คํจ์ ์ ์ฑ
๊ฑฐ๋ถ๋ฅผ ๊ตฌ๋ถํด ๋ณด๊ณ ํ๋ค.
> โ ๏ธ **์๋๋ฐ์ค/์น์ธ ์ฐํ ๊ฒฝ๊ณ (opt-in).** ๋ํผ๋ `codex exec --skip-git-repo-check --dangerously-bypass-approvals-and-sandbox`๋ก
> ๋น๋ํํ ์คํํ๋ค โ ๋์์ ๋์ ์ด๋ฏธ์ง ๊ฒฝ๋ก 1๊ฐ ์ฐ๊ธฐ๋ก ํ์ ๋๋ค. **์ ๋ขฐํ๋ ๋ณธ์ธ ํ๋ก์ ํธ์์๋ง** ์ฌ์ฉํ๋ค.
### Step 7: ๊ฒฐ๊ณผ ํ์ธ + ํ์ (๋ชจ๋๋ณ)
์์ฑ ๋ชจ๋๋ฅผ ํ์ ํ ํ ๊ทธ์ ๋ง๊ฒ ๋์ํ๋ค. (PNG 1์ฅ ํ์ = ์ฝ 1,400~3,000 ๋น์ ํ ํฐ์ด cached prefix์ ๋ฐํ๋ฏ๋ก ๊ธฐ๋ณธ๊ฐ์ ํ์ ์ ํจ.)
#### ๋ชจ๋ ํ์ ๊ท์น
- **fast/no-show** (๊ธฐ๋ณธ๊ฐ): ๊ฒ์/audit ํค์๋ ์๊ณ , ๋ชจ๋๊ฐ ํ
์คํธ ์์กด(E_THUMBNAIL/F_LOGO)๋ ์๋๊ณ , ์๋์ ํ๊ธ/์๋ฌธ ์นดํผ๊ฐ ์์ ๋
- **review/show-one**: ๋ชจ๋๊ฐ `MODE_E_THUMBNAIL` / `MODE_F_LOGO` / ์๋์ ์ง์ ์ธ์ฉ๋ ์นดํผ(๋ฐ์ดํ)๊ฐ ์์ ๋ โ ๋ง์ง๋ง 1์ฅ๋ง ํ์
- **audit/show-all**: ์ฌ์ฉ์๊ฐ "๊ฒ์ํด์ค", "์ ๋ถ ๋ณด์ฌ์ค", "๊ผผ๊ผผํ ํ์ธ", "review all" ๋ช
์ํ ๋ โ ์ ์ฒด ํ์
#### ๋์
1. ํ์ผ ์กด์ฌ ํ์ธ + `file {target_image_path}`๋ก ํด์๋/ํฌ๋งท/sha1 ํ์ธ (์คํฌ๋ฆฝํธ ๊ฒฝ๋ก๋ฉด ์ถ๋ ฅ์ `path:` ๊ธฐ์ค)
2. ๋ชจ๋๋ณ ๋ถ๊ธฐ:
- **fast**: ๊ฒฝ๋ก๋ง ์๋ด (`โ
์์ฑ ์๋ฃ: {path} ({ํด์๋} {ํฌ๋งท}, sha1: {prefix})` + "๊นจ์ก์ผ๋ฉด '์ด๋ฏธ์ง ๋ณด์ฌ์ค'๋ผ๊ณ ๋ง์ํด์ฃผ์ธ์"). ์ด๋ฏธ์ง ํ์ ์ ํจ.
- **review**: ์ ์๋ด + ๋ง์ง๋ง 1์ฅ๋ง ํ์ (ํ
์คํธ ๋ ๋๋ง ๊ฒ์). ์๋ด์ "[review ๋ชจ๋]" ์ถ๊ฐ.
- **audit**: ์ ์๋ด + ๋ชจ๋ ์ด๋ฏธ์ง ํ์. ์๋ด์ "[audit ๋ชจ๋]" ์ถ๊ฐ.
### Step 8: MODE_REFINE ๋ฃจํ (state ์ ์ง + Step 4 ์ฌ๋ก๋ ๊ธ์ง)
์์ฑ ์งํ ๋ค์์ ๋ํ ์ปจํ
์คํธ(skill state)๋ก ์ ์ง:
- `last_prompt_path`: ๋ง์ง๋ง ์๋ฌธ ํ๋กฌํํธ ํ์ผ ๊ฒฝ๋ก (Step 4 ์ฐ์ถ๋ฌผ)
- `last_image_path`: ๋ง์ง๋ง ์ด๋ฏธ์ง ๊ฒฝ๋ก (์ต์ปค ํ๋ณด)
- `last_manifest_path`: ๋ง์ง๋ง manifest.json ๊ฒฝ๋ก (imagen-full.sh ์ฌ์ฉ ์)
- ์ ํ ํ๋ผ๋ฏธํฐ (backend / mode / aspect / quality / ์๋ ๋ต๋ณ 3๊ฐ)
**๋ฆฌํ์ธ ํ์ **:
- **๋์ผ ์ด๋ฏธ์ง ๋ฆฌํ์ธ** ("์๊ฐ ์ข ๋ฐ๊ฟ์ค", "๋ ๋ฐ๊ฒ"):
- Step 4 ์ฌ๋ก๋ **๊ธ์ง** โ `last_prompt_path` Read + ์ฌ์ฉ์ ๋ธํ๋ง patch
- ์๊ฐ ์ปจํ
์คํธ ํ์ ์ `last_image_path` ํ์ (์๋ review ๋ชจ๋)
View on GitHub