with one click
character-images
Generates agentchan character avatar + emotion portraits
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Generates agentchan character avatar + emotion portraits
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| 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 .agents/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 .agents/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 ์์)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 ๋ถ์, ๋ฆฌ์คํฌ ํ๊ฐ, ๊ฒ์ฆ๊น์ง ํฌํจ.