بنقرة واحدة
character-images
Generates agentchan character avatar + emotion portraits
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Generates agentchan character avatar + emotion portraits
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Compact the current conversation into a handoff document for another agent to pick up.
Audit and refine ADRs in docs/adr/ using the deep-module framing — a good ADR is a deep module of decision, not a dump of discussion. Use when reviewing ADRs produced by grill-with-docs, when an ADR feels meeting-notes-shaped or bloated, or when the user wants to tighten a decision record before merging.
Review the changes since a fixed point (commit, branch, tag, or merge-base) along two axes — Standards (does the code follow this repo's documented coding standards?) and Spec (does the code match what the originating issue/PRD asked for?). Runs both reviews in parallel sub-agents and reports them side by side. Use when the user wants to review a branch, a PR, work-in-progress changes, or asks to "review since X".
Turn the current conversation context into a PRD and publish it to the project issue tracker. Use when user wants to create a PRD from the current context.
Set up and use portless for named local dev server URLs (e.g. https://myapp.localhost instead of http://localhost:3000). Use when integrating portless into a project, configuring dev server names, setting up the local proxy, working with .localhost domains, or troubleshooting port/proxy issues.
Monorepo 의존성을 최신 버전으로 업데이트. Changelog 분석, 리스크 평가, 검증까지 포함.
| name | character-images |
| description | Generates agentchan character avatar + emotion portraits |
| disable-model-invocation | true |
Agentchan 런타임 UI용 캐릭터 포트레이트를 만든다. 목표는 키비주얼이 아니라 반복 가능하고 배경 제거 가능한 단독 인물 PNG다.
Star graph: 모든 emotion은 같은 기준 컷을 참조한다. emotion끼리 체인하지 않는다.
[text] → raw/avatar.jpg ─┬→ raw/happy.jpg ─┬→ happy.png
├→ raw/sad.jpg ├→ sad.png
├→ raw/surprised.jpg ├→ surprised.png
└→ raw/thinking.jpg └→ thinking.png
.env auto-load)GEMINI_API_KEY 또는 GOOGLE_API_KEYrembg CLI: pip install rembgpip install pillow{char-dir}/{char-name}.md에서 추출:
| 필드 | 용도 |
|---|---|
frontmatter name | kebab-case 파일명 |
display-name | 프롬프트 이름 |
## 정체성 | 나이·역할·종족·성별 |
## 외모 | 비주얼 bullet |
## 감정 삽화 테이블 | 생성할 emotion 키 목록 |
대상 범위와 생성 개수 × $0.02-0.04 비용을 공지하고 승인 받는다. 모호하면 먼저 묻는다.
템플릿 톤을 한 줄로 정하고 avatar와 모든 emotion 프롬프트에서 동일하게 반복한다.
Persona 5 cover art 스타일의 만화 포트레이트Punishing Gray Raven visual novel 스타일Studio Ghibli 톤의 부드러운 일러스트사용자가 생존 작가, 특정 스튜디오, 특정 작품의 스타일을 요청하면 이름을 그대로 프롬프트에 넣지 말고 시각적 특성으로 치환한다.
예: 고채도 팝 누아르 애니, 강한 실루엣, 날카로운 선, 선명한 셀 셰이딩, 과장된 표정, 그래픽한 포즈
프롬프트 템플릿:
Create a solo character portrait for an Agentchan runtime UI.
Aesthetic direction: {스타일}. Do not imitate any named artist.
{display-name}, {age}세 {gender}, {role}.
외모:
- {외모 bullet 5~6줄}
Pose and framing: exactly one person, centered upper body, front-facing, clear silhouette.
Background: flat simple studio background for background removal. No venue, no crowd, no furniture.
Strict negatives: no text, no logo, no watermark, no second face, no group, no duplicate character, no scene background, no cropped head, no malformed hands.
출력은 먼저 assets/raw/{base}.jpg 또는 assets/raw/{base}.png에 둔다. 최종 노출 파일은 rembg 후에만 assets/{base}.png로 만든다.
bun run .claude/skills/character-images/scripts/gen-image.ts \
"files/characters/{name}/assets/raw/{base}.jpg" --aspect 3:4 <<'PROMPT'
{prompt}
PROMPT
생성 직후 이미지를 눈으로 확인한다. 아래 중 하나라도 보이면 해당 기준 컷을 폐기하고 다시 생성한다.
항상 기준 컷을 --ref로 넣는다. 기준 컷이 실패했으면 emotion을 만들지 않는다.
프롬프트 템플릿:
Using the attached reference image, recreate the exact same character:
{display-name}, same face, hair, outfit, props, proportions, line art, shading, and color palette.
Change only the expression and body tension.
새 표정: {modifier}
Keep: exactly one person, centered upper-body front-facing portrait, flat simple studio background.
Strict negatives: no text, no logo, no watermark, no second face, no other person, no duplicate character, no scene background, no malformed hands.
emotion 토큰이 물리 손상으로 오해될 수 있으면 프롬프트에서 풀어 쓴다.
| 토큰 예 | 프롬프트 표현 |
|---|---|
cracked | emotional collapse, not physical damage; face and skin are normal and undamaged |
broken | emotionally devastated, no broken body, no wounds |
damaged | shaken and guilty, no physical injury |
예시:
bun run .claude/skills/character-images/scripts/gen-image.ts \
"files/characters/{name}/assets/raw/{emo}.jpg" \
--ref "files/characters/{name}/assets/raw/{base}.jpg" \
--aspect 3:4 <<'PROMPT'
{prompt}
PROMPT
각 emotion 생성 후에도 기준 컷과 같은 시각 검수를 반복한다.
최종 노출 파일은 반드시 assets/{emotion}.png다. 배경 있는 raw 이미지를 avatar-image나 감정 토큰이 직접 참조하지 않게 한다.
먼저 고품질 모델을 쓰고, 메모리 실패나 0바이트 출력이 생기면 가벼운 모델로 재시도한다.
rembg i -m bria-rmbg "files/characters/{name}/assets/raw/{emo}.jpg" "files/characters/{name}/assets/{emo}.png"
# bria-rmbg 실패 시
rm -f "files/characters/{name}/assets/{emo}.png"
rembg i -m u2netp "files/characters/{name}/assets/raw/{emo}.jpg" "files/characters/{name}/assets/{emo}.png"
파일 존재나 MIME만 보지 말고, PIL로 실제 이미지를 열어 RGBA/alpha/0바이트를 확인한다.
python - <<'PY'
from PIL import Image
from pathlib import Path
for p in sorted(Path("files/characters").glob("*/assets/*.png")):
im = Image.open(p)
alpha = im.getchannel("A") if im.mode == "RGBA" else None
transparent = alpha is not None and alpha.getextrema()[0] < 255
if p.stat().st_size <= 0 or im.mode != "RGBA" or not transparent:
print(f"BAD: {p} size={p.stat().st_size} mode={im.mode} transparent={transparent}")
else:
print(f"OK: {p} {im.size} {im.mode}")
PY
검증 후 최종 이미지를 다시 눈으로 확인한다. 투명 배경 뷰어가 검은색으로 보일 수 있으므로 alpha 검증 결과와 함께 판단한다.
| 증상 | 원인 | 복구 |
|---|---|---|
| 다중 인물, 장면 배경, 군중 | 프롬프트가 키비주얼/장면으로 열림 | solo, studio background, no crowd, no scene background를 강화해 기준 컷부터 재생성 |
| 캐릭터별 emotion 얼굴이 다름 | ref 미사용 또는 체인 생성 | 기준 컷을 --ref로 emotion 전부 재생성 |
cracked가 얼굴 균열로 나옴 | 토큰의 문자적 해석 | emotional collapse, not physical damage로 재생성 |
| 0바이트 PNG 또는 PIL open 실패 | rembg 실패 중 출력 생성 | 파일 삭제 후 u2netp로 재시도 |
rembg bria-rmbg 메모리 실패 | ONNX 모델 메모리 부족 | u2netp fallback 사용 |
| 텍스트·로고가 들어감 | 네거티브 미흡 | strict negatives를 강화해 raw부터 재생성 |
files/characters/{name}/assets/
├── raw/ (생성/검수 중에만 사용, 최종 반영 전 삭제 권장)
│ ├── avatar.jpg
│ └── ...
├── avatar.png (896×1200, RGBA, transparent)
├── happy.png
├── sad.png
├── surprised.png
└── thinking.png
character.md frontmatter의 avatar-image: assets/avatar처럼 확장자 없이 둔다. /files/:path 라우트의 확장자 폴백이 처리한다.
scripts/gen-image.ts <output> [--ref <path>] [--aspect <ratio>] < stdin
1:1, 3:4(기본), 4:3, 9:16, 16:9gemini-3.1-flash-image-preview (변경은 scripts/gen-image.ts의 MODEL 상수)