Install any skill in seconds. Free to start, no credit card required.
Get Started Free →이미지 placeholder를 동적으로 materialize. Codex 채널에서는 내장 image-generation primitive 호출, Claude Code 채널에서는 omd-asset-curator로 fall back, OpenCode에서는 spec dump. HTML/MD의 `<!-- omd:gen-image -->` 블록을 단일 source of truth로 사용. '이미지 생성해줘', '플레이스홀더 채워줘', '코덱스로 이미지 만들어' 류 트리거.
.claude/skills/kwakseongjae-omd-codex-image/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 402% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 177% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-03 | ✓→✗ | ▼ Worse | 17% | 0% |
<!-- omd:installed-skill — managed by omd install-skills. Do not edit; rerun the command to refresh. -->
채널-aware 이미지 materialization 스킬. 하나의 spec format + 세 가지 downstream 처리.
문제: oh-my-design이 emit하는 HTML/MD에는 늘 illustration 자리가 비어있다. 채널별 capability가 다르다 — Codex CLI는 내장 image generation을 갖고, Claude Code는 안 가졌고, OpenCode는 user에게 위임한다. 이 차이를 skill 1개로 통합한다.
artifact (HTML, Markdown, JSX, MDX) 안에 다음 주석 블록을 둔다.
html<!-- omd:gen-image filename: assets/karrot-hero.png prompt: "Karrot mobile home feed screenshot — white canvas, warm near-black headings, single Karrot Orange #FF6600 floating CTA. Mobile portrait, no chrome." aspect: "16:9" style: "product screenshot, minimal, mobile" references: - https://www.daangn.com/ - https://seed-design.io/ notes: "Single saturated element per viewport. Use brand orange only on the CTA." --> <img src="assets/karrot-hero.png" alt="당근 홈 피드의 단일 오렌지 CTA" />
규칙:
filename — 결과물 저장 경로. 같은 디렉토리 기준 상대경로 권장.prompt — 한 문단, 구체적, 시각 디테일 + 톤 + 컬러 hex 포함.aspect — 16:9 4:3 1:1 9:16 중 하나.style — 1~3 단어 (product screenshot / inline svg / editorial photo / dieline diagram).references — 실제 브랜드 URL (선택, IP-safe 컨텍스트용).notes — generator나 검수자가 알아야 할 제약. 이 spec은 channel과 무관하다. 채널별 처리는 §1.
호출 envelope의 channel (또는 환경 detect — process.env.OMD_CHANNEL이나 host agent 식별)에 따라:
codexCodex CLI는 native image generation을 갖고 있다. 다음 순서:
<!-- omd:gen-image ... --> 블록을 정규식으로 추출 (multiline)generate_image, image.create, dall_e_image_generation, gpt_image_1 등). Codex agent가 자기 환경에서 사용 가능한 것을 선택한다.filename 경로에 저장 (mkdir -p)<img src>나 ![]() 경로가 매칭되는지 확인. 안 맞으면 alt 텍스트 보존하면서 src만 교체.<!-- omd:gen-image:done at=<ISO timestamp> by=codex --> 주석을 spec 블록 아래에 1줄 추가.generation 실패 시: spec 블록은 그대로, <!-- omd:gen-image:error reason="..." --> 추가. 다음 호출이 재시도 가능하도록.
prompt 보강 (Codex가 좋은 결과를 내려면):
prompt 원문 + 다음 prefix 자동 prepend: "Render as <aspect> <style>. "notes에 색 hex 있으면 prompt 끝에 "Use only the following colors: <hex list>." 추가references 있으면 "Stylistic reference inspiration only — do not copy verbatim: <urls>" 추가claude-codeClaude Code는 native image generation이 없다. 대신 omd-asset-curator 스킬로 라우팅:
prompt → asset-curator의 descriptionstyle → asset-curator의 medium 힌트 (product screenshot → Picsum/Loremflickr, inline svg → 직접 SVG 생성, icon → Lucide)filename에 저장<!-- omd:gen-image:done at=<ISO> by=asset-curator source=<url> --> 추가opencodeOpenCode는 image generation도, asset-curator도 자동으로 못 돌린다. user-in-the-loop:
## Image generation queue 섹션을 emit: 3개 이미지를 수동으로 생성/소싱해서 다음 경로에 두세요:
prompt: "Karrot mobile home feed — single orange CTA..." refs: https://www.daangn.com/
artifact를 처리할 때 항상 우선순위:
Codex native gen ──┐
├─► success → done 주석 추가
asset-curator ──┘
│
└─► fail → user-queue (OpenCode 식 prompt)각 단계 실패는 다음 단계로 escalate. 마지막 단계도 실패하면 error 주석 + 사용자에게 명시.
이 스킬은 같은 artifact에 여러 번 돌려도 안전해야 한다.
<!-- omd:gen-image:done --> 주석이 붙은 spec 블록은 스킵filename 경로의 파일이 이미 존재하면 (size > 0) 스킵--force 명시되면 둘 다 무시하고 재생성references URL은 inspiration만. 절대 verbatim 카피 X.처리 끝에 한 줄 요약:
✓ 4 images materialized (codex) · 0 skipped · 0 errors
→ experiments/2026-05-19/karrot/assets/{hero,one-color,grid,detail}.png또는 fallback이 섞였을 때:
✓ 2 codex · 2 asset-curator fallback · 1 user-queueyamlagent: omd-codex-image inputs: artifact_path: experiments/2026-05-19/karrot/landing.html channel: codex # 또는 claude-code | opencode | auto force: false # done 주석 무시하고 재생성 dry_run: false # spec parse만 하고 generation 안 함
channel: auto면 env 또는 host detection으로 분기.
references: URL 검증용으로 같이 쓰면 정확도 ↑.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | fail→fail | 6,151 | 5,295 | -14% | 1 | 1 | 0% | 1,276 | 2,276 | +78% | 0 | 0 | — |
case-01 | fail→fail | 6,165 | 6,736 | +9% | 1 | 1 | 0% | 313 | 2,296 | +634% | 0 | 0 | — |
case-02 | fail→fail | 4,636 | 4,524 | -2% | 1 | 1 | 0% | 247 | 2,238 | +806% | 0 | 0 | — |
case-03 | pass→fail | 10,909 | 5,489 | -50% | 1 | 1 | 0% | 2,048 | 2,401 | +17% | 0 | 0 | — |
case-04 | pass→pass | 5,239 | 4,670 | -11% | 1 | 1 | 0% | 897 | 2,870 | +220% | 0 | 0 | — |
case-05 | pass→pass | 5,984 | 3,907 | -35% | 1 | 1 | 0% | 942 | 2,714 | +188% | 0 | 0 | — |
case-06 | pass→fail | 6,023 | 6,392 | +6% | 1 | 1 | 0% | 963 | 2,358 | +145% | 0 | 0 | — |
case-07 | pass→fail | 13,426 | 2,528 | -81% | 1 | 1 | 0% | 2,296 | 2,255 | -2% | 0 | 0 | — |
case-08 | fail→pass | 4,560 | 7,016 | +54% | 1 | 1 | 0% | 639 | 3,208 | +402% | 0 | 0 | — |
case-09 | fail→pass | 11,327 | 8,010 | -29% | 1 | 1 | 0% | 1,848 | 3,540 | +92% | 0 | 0 | — |
case-10 | pass→fail | 6,488 | 4,815 | -26% | 1 | 1 | 0% | 1,215 | 2,216 | +82% | 0 | 0 | — |
case-11 | pass→pass | 3,676 | 5,250 | +43% | 1 | 1 | 0% | 659 | 3,094 | +369% | 0 | 0 | — |
case-12 | fail→pass | 6,903 | 5,513 | -20% | 1 | 1 | 0% | 1,072 | 2,966 | +177% | 0 | 0 | — |
case-13 | pass→pass | 11,821 | 5,896 | -50% | 1 | 1 | 0% | 1,980 | 2,985 | +51% | 0 | 0 | — |
case-14 | fail→pass | 15,906 | 9,185 | -42% | 1 | 1 | 0% | 2,605 | 3,687 | +42% | 0 | 0 | — |
case-15 | fail→fail | 10,497 | 3,761 | -64% | 1 | 1 | 0% | 1,712 | 2,193 | +28% | 0 | 0 | — |
case-16 | pass→pass | 9,514 | 3,951 | -58% | 1 | 1 | 0% | 1,388 | 2,629 | +89% | 0 | 0 | — |
case-17 | fail→fail | 20,137 | 7,231 | -64% | 1 | 1 | 0% | 3,163 | 2,721 | -14% | 0 | 0 | — |
case-18 | fail→fail | 3,431 | 4,595 | +34% | 1 | 1 | 0% | 561 | 2,675 | +377% | 0 | 0 | — |
case-19 | fail→fail | 8,235 | 4,444 | -46% | 1 | 1 | 0% | 1,393 | 2,326 | +67% | 0 | 0 | — |
case-20 | fail→fail | 13,936 | 4,823 | -65% | 1 | 1 | 0% | 2,541 | 2,270 | -11% | 0 | 0 | — |
case-21 | fail→fail | 3,611 | 3,944 | +9% | 1 | 1 | 0% | 563 | 2,747 | +388% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 14 counted toward the lift figure. The other 8 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 14 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.