Files
persona/skills/persona-icon/SKILL.md
T
jiantw83andClaude Opus 5 d0c42f0c15 feat: 形象圖改為「依人格資料重繪」,並驗證 Wiki 同步
1. 不再直接使用網路上找到的圖片
   舊版把裁下來的官方美術當圖示(photo 樣式)。現在改成:
     找圖 → `icon headshot` 裁出**大頭照當底稿** → AI 用 Read 親眼看過 →
     讀出髮型/瀏海/眼型/表情/髮飾/領口等特徵 → **由本工具重新繪製**。
   * 底稿寫在 <人格>/.sync/headshot.png,**不是圖示、不同步、不發佈**。
   * 產出的 SVG 不得有 <image>/base64/外連(selftest 會擋)。
   * 移除 photo 樣式與 photoSvg;config 裡殘留的舊樣式會被忽略而非退回徽章。

2. 重繪引擎:五官與造型可參數化
   新增 --features:hairstyle(5) / length(4) / fringe(4) / eyes(4) /
   expression(4) / accessory(5) / side / collar(4) / ahoge。
   渲染器新增 polygon 圖元(呆毛、緞帶、V 領、銳利眼角),SVG 與自寫柵格器
   仍共用同一份圖形清單,兩邊必然一致。
   另外調了臉部比例:眉毛用「髮色偏膚色」避免深髮角色眉毛與瀏海連成黑帶、
   加了鼻子(否則嘴會被看成鼻子)、眼與嘴的縱向配置重排。

3. Wiki 形象圖必須同步(並且會被驗證)
   新增 `sync verify`(不一致以非零結束)與 verifyIconInWiki();
   `icon generate` 推完 Wiki 會自動回頭確認 icon.svg + icon.png 真的在遠端
   且與本機一致。
   修掉一個會讓驗證永遠失敗的 bug:Wiki 首頁內嵌了 `最後同步 ${now}`,
   每次產生都不同 → 永遠 dirty、每次 push 都多一個 commit。改用圖示的
   generated_at。porcelain 解析也從固定位移改為正規式。

已重繪兩個真實人格(皆為 portrait 樣式,並通過 Wiki 同步驗證):
  ASUNA-01  底稿=《Unanswered//butterfly》(2026) 主視覺左側;金蜜色極長直髮、
            中分瀏海、呆毛、紅褐杏眼、沉靜神情、紅上衣 V 領
  YUI-01    底稿=AniList 官方角色圖;藍黑極長直髮、齊瀏海、圓大棕眼、燦爛笑容,
            髮飾與配色採現行 Unital Ring 導航妖精造型(淡粉洋裝、藍花)

selftest 161 項全綠(新增第 ⑰ 節:特徵解析、換髮型/眼型/表情會畫出不同的圖、
polygon 兩邊一致、舊樣式不污染、SVG 無內嵌影像、Wiki 首頁無時間戳)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 02:57:18 +00:00

169 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: persona-icon
description: 產生或更新人格的形象圖(icon.svg + icon.png,人物頭像、看得到臉):先上網找出該人格「最新一次登場」的官方視覺,裁出**大頭照當底稿**,親眼看過之後萃取髮色/瞳色/服裝色與髮型、眼型、表情、配件等特徵,再**由本工具依人格資料重新繪製**——絕不把找到的圖片直接當圖示。來源網址、底稿裁切框與重繪依據都會存進 config 備查,圖示同步到 Gitea Wiki(SVG + PNG)並設為存取庫頭像,且會回頭驗證同步結果。當使用者說要做人格頭像/形象圖/icon、要依角色最新造型更新圖示、說現在的圖示不像或看不到臉、或剛建立完人格要補圖示時觸發。不適用於:建立人格本身(persona-createpersona-anime,它們會叫用本技能的步驟)、同步到 Gitea(persona-sync)。
---
# 🎨 persona-icon — 依最新造型產生人格形象圖(有臉)
**CLI**`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`(帶 `--session <PERSONA_SESSION>`
**時機****人格建立且 IDENTITY/SOUL 補齊之後**——形象綁在最終身分上。
**目標**:圖示要是**人物形象圖,看得到臉**;退而求其次才是抽象徽章。
> **鐵則:找到的圖片只能當底稿,不能當圖示。**
> 網路上的角色圖是別人的美術作品。這裡的做法是「裁出大頭照 → 看清楚 →
> **依人格資料重新繪製**」,產出的每一個像素都是本工具畫的。
---
## 為什麼要上網找圖
圖示要像這個人格,就得用他**現在**的樣子:動漫角色會換造型、換作品、換髮色。
所以流程是「查最新登場 → 看那張圖 → 取色 → 畫」,而不是憑印象填色。
## 步驟
### 1. 查出「最新一次登場」
用 WebSearch 找這個角色最近的官方動向(新作、新章節、新造型),至少確認:
- 最新的作品/章節名稱與年份
- 那個版本的造型敘述(髮色、瞳色、服裝主色)
搜尋語彙範例:`<角色> <作品> 2026 新作 主視覺``<character> latest anime key visual outfit`
### 2. 取得一張真的參考圖
要**直接的圖片網址**`.png` / `.jpg`),優先序:
1. 官方新作的主視覺/key visual(新聞稿內的圖)
2. AniList 的官方角色圖——可直接查,不需登入:
```bash
curl -s -X POST -H "Content-Type: application/json" \
-d '{"query":"query{Media(id:<動畫 id>,type:ANIME){characters(perPage:25){nodes{name{full} image{large}}}}}"}' \
https://graphql.anilist.co
```
3. 其他公開的官方素材
下載下來:`curl -sL -o /tmp/ref.png "<圖片網址>"`
### 3. **親眼看過那張圖**(不可省略)
用 Read 工具打開它。**沒看過就不准填顏色**——憑記憶填色等於編造。
從圖上讀出五個顏色(用取樣到的實際色,不是「大概是紅色」):
| 欄位 | 取哪裡 |
| --- | --- |
| `hair` | 頭髮的主色(不是高光也不是陰影) |
| `eye` | 瞳孔顏色 |
| `accent` | 服裝最顯眼的主色 |
| `secondary` | 服裝的第二色/配件色 |
| `light` | 最亮的部位(白袖、皮膚亮面) |
### 4. 裁出大頭照當底稿
```bash
# 先看看圖裡有幾張臉——多角色的主視覺一定要先看
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon faces --session <PERSONA_SESSION> --photo "<圖片網址或路徑>"
# 裁出底稿(索引由左到右;也可以用 largest/leftmost/rightmost,或 --face x,y,w,h 自己框)
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon headshot --session <PERSONA_SESSION> --photo "<圖片網址或路徑>" --pick <索引>
```
底稿寫到 `<人格>/.sync/headshot.png`,**不是圖示、不會同步、不會發佈**。
**多角色的圖務必自己看過再挑**`icon faces` 只給座標,哪張臉是本人要由你判斷。
裁完**一定要用 Read 打開確認是本人**——挑錯就是別人的臉。
工具不齊時 CLI 會**印出安裝指令**——不會靜默失敗。需要的工具:
| 工具 | 做什麼 | 怎麼裝(免 sudo) |
| --- | --- | --- |
| Pillow | 解碼照片、裁切、縮放 | `python3 -m venv ~/.cache/jsc-persona/venv && ~/.cache/jsc-persona/venv/bin/pip install pillow` |
| OpenCV 4.x | 自動找臉的位置 | `~/.cache/jsc-persona/venv/bin/pip install "opencv-python-headless<5"` |
| 動漫臉模型 | OpenCV 內建模型認不出動漫臉 | `curl -sL -o ~/.cache/jsc-persona/lbpcascade_animeface.xml https://raw.githubusercontent.com/nagadomi/lbpcascade_animeface/master/lbpcascade_animeface.xml` |
> OpenCV **5.x 拿掉了 `CascadeClassifier`**,一定要裝 4.x。
> venv 放在 `~/.cache/jsc-persona/venv` 會被自動偵測到;也可以用 `PERSONA_PYTHON` 指定別的。
### 5. 看著底稿,把特徵讀出來
用 Read 打開 `.sync/headshot.png`**同時**讀這個人格的 `IDENTITY.md``SOUL.md`canon 記憶。
形象要同時對得起「他長什麼樣」與「他是誰」:
| 特徵 | 可選值 | 從哪裡判斷 |
| --- | --- | --- |
| `hairstyle` | straight / twintails / ponytail / bob / braid | 底稿的髮型 |
| `length` | short / medium / long / very-long | 底稿的髮長 |
| `fringe` | blunt / parted / swept / curtain | 底稿的瀏海 |
| `eyes` | round / almond / sharp / droopy | 底稿的眼型 |
| `expression` | gentle / bright / calm / neutral | **SOUL 的 Vibe** 底稿的神情 |
| `accessory` | none / ribbon / clip / flower / hairband | 底稿或最新造型的髮飾 |
| `side` | left / right | 髮飾在哪一側 |
| `collar` | round / v / high / sailor | 服裝領口 |
| `ahoge` | yes / no | 有沒有呆毛 |
### 6. 重新繪製
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon generate --session <PERSONA_SESSION> --force \
--palette "hair=#d9a45b,eye=#9e5b3e,accent=#c0392b,secondary=#e77a8e,light=#f2ebe3,skin=#f7ddc4" \
--features "hairstyle=straight,length=very-long,fringe=parted,eyes=almond,expression=calm,accessory=none,collar=v,ahoge=yes" \
--source-url "<底稿那張圖的網址>" \
--source-note "<作品(年份)+底稿是誰+重繪依據:髮型、眼型、神情、服裝>" \
--source-date <YYYY-MM-DD>
```
**畫完一定要用 Read 打開產出的 `icon.png` 看一眼**,不像就調特徵重畫(`--force`)。
- **`--palette` 一定要配 `--source-url`**:配色是從哪張圖來的必須留得下來(CLI 會強制)。
- 兩者都會寫進 `state/config.json` 的 `icon` 欄位,之後 `icon show` 查得到。
- 產出的 `icon.svg` + `icon.png` 會自動設成 Gitea 存取庫頭像、同步到 Wiki 區,
並在 Wiki 產生一頁 **Icon**(同時展示 SVG 與 PNG,附上來源網址與裁切框)。
找不到可靠的參考圖 → **不要硬掰**,直接 `icon generate` 不帶 `--palette`
用編號雜湊出的配色,並告訴使用者「沒找到最新造型的官方圖,先用預設配色」。
### 7. 回報
一句話說明:用了哪部作品哪一年的視覺、取到什麼配色、圖示放哪裡。
把來源網址附上,讓使用者可以自己核對。
## 三種樣式
| 樣式 | 什麼時候用 | 長什麼樣 |
| --- | --- | --- |
| `portrait` | 有底稿(有調色盤)→ **預設** | 依特徵重繪的人物頭像:髮型、瀏海、眼型、表情、髮飾、領口全部照特徵畫 |
| `badge` | 完全沒有參考圖(原創人格) | 雙色漸層徽章 + 編號前兩個字母 |
- 兩種樣式都由 Node 自己柵格化,SVG 與 PNG **共用同一份圖形清單**(橢圓/矩形/多邊形),
兩邊必然一致;PNG 是自寫的柵格器 + zlib 編碼,不依賴任何影像函式庫。
- SVG **不會內嵌任何影像**——沒有 `<image>`、沒有 base64、沒有外連。
- `badge` 樣式下若兩個顏色一深一淺(藍黑髮 + 淡粉洋裝),程式會把較亮的一端往較暗的壓,
確保字讀得到。
## 界線
- **找到的圖片只能當底稿**:裁出來的大頭照留在 `.sync/`,不進圖示、不同步、不發佈。
圖示的每個像素都是本工具依特徵畫出來的。
- 底稿的來源網址會記在 `config.json`,方便日後核對,但不重製原圖。
## Wiki 必須同步
`icon generate` 推完 Wiki 會**自動回頭驗證**,確認 `icon.svg` 與 `icon.png` 真的在 Wiki 上
而且與本機一致;不一致會直接報錯。也可以手動查:
```bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sync verify --session <PERSONA_SESSION> --area wiki
```
## 邊界
- 只能對「本 session 已載入的人格」產生圖示。
- 已有圖示時要重畫必須加 `--force`。
- 不帶 `--palette` 重畫會**沿用 config 裡已存的配色**(不會突然變回雜湊色)。
- `.sync/reference.*` 與 `.sync/headshot.png` 是底稿快取,可以安全刪除(不會同步出去)。
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。