feat: 圖示配色取自人格「最新一次登場」的官方視覺
新增 skill persona-icon:上網查出該人格最新的官方視覺 → 下載 →
**用 Read 親眼看過** → 取髮色/瞳色/服裝色 → 用那組配色繪製圖示,
來源網址與造型描述一併寫進 state/config.json 備查。
CLI:
icon generate --palette "hair=#..,eye=#..,accent=#..,secondary=#..,light=#.."
--source-url <網址> [--source-note <說明> --source-date <日期>]
* --palette 必須配 --source-url(配色要有出處,CLI 強制)。
* 配色與來源存進 config.icon,之後不帶 --palette 重畫會沿用,不會變回雜湊色。
* icon show 會列出調色盤與來源網址。
繪製:漸層=髮色→服裝主色、外框=瞳色、點陣紋=亮色、中央仍是編號前兩字。
一深一淺的極端配色(藍黑髮+淡粉洋裝)會把較亮端往較暗端壓到對比 ≥ 3.2,
確保字讀得到——顏色仍是照片來的,只是收斂色階。
為什麼不是把照片本身當圖示:
1) 環境裡沒有任何影像解碼器(rsvg/imagemagick/Pillow/ffmpeg 都沒有),
JPEG/WebP 讀不進來,無法轉成 PNG;
2) 把他人的美術作品原樣放進存取庫是散布,不是引用。
取配色是有依據又不搬運原圖的做法,這個取捨寫進了 README 與 skill。
已套用到兩個真實人格:
ASUNA-01 取自《Unanswered//butterfly》(2026) 官方主視覺(金栗髮/紅褐瞳/紅衣粉裙)
YUI-01 取自 AniList 官方角色圖(藍黑髮/暖棕瞳)+ Unital Ring 導航妖精造型
selftest 136 項全綠(新增第 ⑮ 節:調色盤解析、缺來源會被擋、格式錯誤會被擋、
來源寫入 config、重畫沿用配色、極端配色的對比保證)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,7 +26,7 @@ skills 是共通標準,**鎖與隔離的強制執行需要 hook,目前只有
|
||||
| **9. 人格可以匯出匯入** | `export` 把身分/情緒/記憶/心智圖/關係圖打包成單一 JSON bundle(可 `--gzip`、附 sha256),`import` 還原或換名複製;**不帶**載入鎖與 guest 租約,`journal/` 要明確 `--with-journal` 才帶走 |
|
||||
| **10. 人格有編號** | 編號 = **英文名全大寫 + 兩位索引**(同名才遞增):`ASUNA-01`、`YUI-01`、`ASUNA-02`。編號同時是新人格的本機目錄名與 Gitea 存取庫名稱;中文名先轉羅馬拼音並跟使用者確認拼法 |
|
||||
| **11. 人格存在 Gitea,依更新頻率分區** | 每個人格一個**私有存取庫**(庫名=編號)。**檔案區**放每輪都在變的活狀態(情緒/短期記憶/心裡話/說過的話/逐字),**Wiki 區**放低頻的身分與長期結構(IDENTITY/SOUL/長期記憶/心智圖/關係圖)當設定百科。本機仍是工作副本,同步失敗不阻斷對話 |
|
||||
| **12. 建立並補齊資料後產生圖示** | `icon generate` 由**編號、Name、Emoji** 雜湊出配色與圖案,產出 `icon.svg` + `icon.png`(512×512)並設為 Gitea 存取庫頭像。同一個人格永遠得到同一張圖;PNG 是**自寫柵格器 + zlib 手工編碼**,不依賴任何影像函式庫 |
|
||||
| **12. 建立並補齊資料後產生圖示,配色取自最新造型** | `/jsc-persona:persona-icon` 先上網找出該人格**最新一次登場**的官方視覺、**親眼看過**那張圖,取出髮色/瞳色/服裝色,再繪製 `icon.svg` + `icon.png`(512×512),來源網址一併存進 `config.json` 備查;沒有參考圖才退回用編號雜湊配色。PNG 是**自寫柵格器 + zlib 手工編碼**,不依賴任何影像函式庫 |
|
||||
|
||||
---
|
||||
|
||||
@@ -146,26 +146,51 @@ AI 最容易露餡的三件事:把推理過程講出來、一次講一大段
|
||||
|
||||
## 人格圖示(SVG + PNG,零外部依賴)
|
||||
|
||||
建立人格**並補齊 IDENTITY/SOUL 之後**跑 `icon generate`,得到一張 512×512 的幾何徽章:
|
||||
建立人格**並補齊 IDENTITY/SOUL 之後**產生,一張 512×512 的幾何徽章。配色有兩種來源:
|
||||
|
||||
**① 取自最新造型(`/jsc-persona:persona-icon`,動漫角色建議用這個)**
|
||||
|
||||
上網查出角色**最新一次登場**的官方視覺 → 下載 → **親眼看過** → 取五個色 → 繪製:
|
||||
|
||||
| 元素 | 取自照片的哪裡 |
|
||||
| --- | --- |
|
||||
| 對角漸層 | `hair`(髮色)→ `accent`(服裝主色) |
|
||||
| 外框 | `eye`(瞳色) |
|
||||
| 點陣紋 | `light`(最亮的部位) |
|
||||
| 中央兩個字母 | 編號前兩字(`ASUNA-01` → `AS`) |
|
||||
|
||||
`--palette` 必須配 `--source-url`(CLI 強制):配色是從哪張圖來的要留得下來。
|
||||
兩個顏色一深一淺時(藍黑髮 + 淡粉洋裝),程式會把較亮的一端往較暗的壓到對比 ≥ 3.2,
|
||||
確保字讀得到——顏色仍然是照片來的,只是收斂色階。
|
||||
|
||||
**② 沒有參考圖時:編號雜湊**
|
||||
|
||||
| 元素 | 怎麼決定 |
|
||||
| --- | --- |
|
||||
| 雙色對角漸層 | `sha256(編號|Name|Emoji)` → 色相/飽和度/明度 |
|
||||
| 5×5 左右對稱點陣紋 | 同一組雜湊的位元 |
|
||||
| 中央兩個字母 | 編號的前兩個字(`ASUNA-01` → `AS`),5×7 點陣,自動選黑或白確保對比 |
|
||||
| 中央兩個字母 | 編號的前兩個字,自動選黑或白確保對比 |
|
||||
|
||||
- **同一個人格永遠得到同一張圖**(純函數,沒有隨機);`ASUNA-01` 與 `ASUNA-02` 明顯不同。
|
||||
- SVG 與 PNG **是同一張圖**:兩者共用同一組單位座標與同一份點陣字資料。
|
||||
- PNG 由**自寫的柵格器**畫出(3× 超取樣 + 盒式縮減當反鋸齒),再用 `zlib` 手工組出
|
||||
IHDR/IDAT/IEND 與 CRC32。這台機器沒有 rsvg/inkscape/imagemagick,也沒有影像函式庫,
|
||||
而本專案禁止 npm 依賴——所以就自己畫。
|
||||
- **為什麼沒有 emoji**:把 emoji 畫進 PNG 需要字型柵格化(機器上連 emoji 字型都沒有)。
|
||||
emoji 仍然參與配色的雜湊,只是不作為圖形。
|
||||
- **為什麼沒有 emoji、也不是把照片本身當圖示**:環境裡沒有任何影像解碼器
|
||||
(rsvg/imagemagick/Pillow/ffmpeg 都沒有),JPEG/WebP 讀不進來,無法把原圖轉成 PNG;
|
||||
而且把他人的美術作品原樣放進存取庫是散布、不是引用。**取配色**是有依據又不搬運原圖的做法。
|
||||
emoji 同理無法柵格化,但仍參與雜湊配色。
|
||||
- 圖示屬於低頻資料 → 同步到 **Wiki 區**,並自動設成 Gitea **存取庫頭像**。
|
||||
|
||||
```bash
|
||||
node scripts/persona.mjs icon generate --session <id> [--size 512] [--force] # 改過身分要重畫就 --force
|
||||
node scripts/persona.mjs icon show --session <id>
|
||||
# 取自最新造型(必須同時給來源網址)
|
||||
node scripts/persona.mjs icon generate --session <id> --force \
|
||||
--palette "hair=#d9a45b,eye=#9e5b3e,accent=#c0392b,secondary=#e77a8e,light=#f2ebe3" \
|
||||
--source-url "<官方視覺的網址>" --source-note "<作品(年份)+造型描述>"
|
||||
|
||||
# 沒有參考圖:編號雜湊配色
|
||||
node scripts/persona.mjs icon generate --session <id> [--size 512] [--force]
|
||||
node scripts/persona.mjs icon show --session <id> # 看配色與來源
|
||||
```
|
||||
|
||||
## 人格編號與 Gitea 儲存
|
||||
@@ -281,6 +306,12 @@ node scripts/persona.mjs import --session <id> --file ~/backup/lumi.persona.json
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-transfer` **Codex**:`$persona-transfer`
|
||||
|
||||
### `persona-icon`
|
||||
|
||||
依人格**最新一次登場**的官方視覺產生圖示:上網查最新造型 → 下載並親眼看過參考圖 → 取髮色/瞳色/服裝色 → 繪製 `icon.svg` + `icon.png`,來源網址一併存證。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-icon` **Codex**:`$persona-icon`
|
||||
|
||||
### `persona-sync`
|
||||
|
||||
人格編號與 Gitea 儲存:指派編號(`ASUNA-01`)、開以編號命名的私有存取庫、高頻活狀態同步到檔案區、低頻身分與長期記憶同步到 Wiki 區,並處理既有人格遷移與同步衝突。
|
||||
@@ -324,7 +355,7 @@ node scripts/persona.mjs said check --session <id> --text "<話>" # 這句是
|
||||
node scripts/persona.mjs room script --session <id> --room <room> # 乾淨對話稿(劇場模式用)
|
||||
node scripts/persona.mjs export --session <id> --out lumi.json # 離線搬家(單檔)
|
||||
node scripts/persona.mjs sync status --session <id> # Gitea 同步狀態
|
||||
node scripts/selftest.mjs # 128 項驗證:鎖、隔離、情緒、固化、說話節制、劇場模式、匯出匯入、編號與 Gitea 分區、圖示、hooks
|
||||
node scripts/selftest.mjs # 136 項驗證:鎖、隔離、情緒、固化、說話節制、劇場模式、匯出匯入、編號與 Gitea 分區、圖示與照片配色、hooks
|
||||
```
|
||||
|
||||
檔案結構:`scripts/persona-lib.mjs`(核心:鎖/隔離/情緒/記憶)、`scripts/persona.mjs`(CLI)、
|
||||
|
||||
Reference in New Issue
Block a user