 jiantw83andClaude Opus 5
|
0917e905c7
|
chore(plugin 版本): 三份 manifest 升版 0.2.1
master 上是 0.2.0(#16 已合併),這批文件改動照規則 patch +1。
順便把根目錄的 plugin.json(Antigravity)拉齊——它從上一批就漏改,
還停在 0.1.1,master 上也是。三份現在都是 0.2.1。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-03 06:58:57 +00:00 |
|
 jiantw83andClaude Opus 5
|
59bbd2bc32
|
chore(plugin 版本): 兩份 manifest 升版 0.2.0
master 目前是 0.1.1,這一整批未合併的改動只佔一個新版號。
記憶檔案格式與 bundle 版本都變了,所以走 minor 不走 patch。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-03 04:22:38 +00:00 |
|
 jiantw83andClaude Opus 5
|
6fa7e6e370
|
chore(plugin 版本): 三家 manifest 升版 0.1.1
master 已經在 0.1.0,這批 relation 的改動是新的未合併批次,佔一個新版號。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-08-03 03:17:58 +00:00 |
|
 jiantw83andClaude Opus 5
|
34b1dc7942
|
fix(marketplace): marketplace 名由 jsc-plugins 改為 persona(與 template 撞名)
兩份 marketplace.json 原本都叫 jsc-plugins,與 jsc-template 的 marketplace 同名
——兩個 plugin 同時安裝時會撞名。template 已在 731a494 改為 template(=它的 repo
名),本 repo 跟著改為 persona,也與 code/doc/generic「marketplace 名 = repo 名」
的慣例一致。plugin 名維持 jsc-persona 不動。
README 的安裝 token、marketplace update/upgrade/remove 指令、目錄樹註解與
「marketplace 名是 …」那句一併更新(Claude/Codex/Copilot 三節各一組)。
依 spec-plugin-version,安裝識別鍵是 <plugin 名>@<marketplace 名>,改名等於換識別
鍵,舊安裝不能用 update 遷移,必須先移除再安裝,中間 skills 會短暫消失。照
template 9b2e2bb 的做法在安裝章節開頭補上三家各自的升級路徑,並交代要清掉
settings.json 的 enabledPlugins 舊鍵、人格倉庫(PERSONA_HOME)不在 plugin 目錄裡
所以情緒與記憶不受影響。
版號維持 0.1.0 不動:spec 的「更名重置版號」指的是 plugin 更名(name 欄位改變),
本次三份 plugin.json 的 name 與 version 都沒動,marketplace.json 也沒有版本欄位;
template 當時的 marketplace 改名(731a494)同樣沒有重置,照常從 0.0.2 走。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-31 14:43:58 +00:00 |
|
 jiantw83andClaude Opus 5
|
ed80158d99
|
chore(plugin 版本): 三家 manifest 升版 0.1.0
master 現行 0.0.9,patch 已到 9,依 spec-plugin-version 進位 minor 並把
patch 歸零(0.0.9 → 0.1.0),非 0.0.10。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-31 14:38:39 +00:00 |
|
jiantw83
|
828c14b6ba
|
docs(README): 安裝說明補齊五家助理並統一結構
安裝章節原本只有 Claude Code 與 Codex 較完整,Antigravity 缺移除、
OpenCode 缺更新與移除、GitHub Copilot CLI 整節不存在。改為與 code/doc/
generic/template 相同的結構:五家各自都有安裝、更新、移除三段。
另補「前綴與呼叫方式」與「目錄結構」兩節(其他四個 plugin 都有,只有這裡缺),
跨助理支援度表加上 GitHub Copilot CLI,並把 headless 一次性執行獨立成節。
明確標註本 plugin 的 marketplace 名是 jsc-plugins 而非 repo 名 persona,
安裝 token 為 jsc-persona@jsc-plugins,避免照 repo 名去猜。
依 spec-plugin-version 把三家 manifest 版號一起升到 0.0.9(master 現行 0.0.8)。
|
2026-07-31 08:34:48 +00:00 |
|
 jiantw83andClaude Opus 5
|
71a5c8af16
|
chore: 版本號 0.0.8(PR #10 已併,這批是新的未合併批次)
PR #10(0.0.7)在 02:31Z 併進 master 了,master 現在是 0.0.7。
剩下這兩個 commit(情緒四層、R6 容量壓力)因此是**新的一批未合併改動**,
依規矩佔一個新版號 → 0.0.8,三份 manifest 一起改。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-31 05:03:03 +00:00 |
|
 jiantw83andClaude Opus 5
|
f74a7ac1a5
|
feat(voice): 不說 AI 才會說的話(借 speak-human-tw 的刪除層)+講過去要有出處(v0.0.7)
人格回覆的「人味」再加一層。模式整理自 speak-human-tw(MIT, Raymond Hou)的 38 種
AI 寫作痕跡——那個專案是**文章**的事後審稿器(判情境→鎖保護清單→列清單等作者勾選→
交稿前自評),所以只搬對話也適用的**刪除層**,它的保護清單與兩輪確認流程不搬。
一、機械擋下(`SPEECH_BLACKLIST`,`room post` 直接拒收,`--force` 例外)
罐頭同理心(「這個我懂」「我完全理解」)、頒獎開場(「好問題」)、交差句(「希望這對你
有幫助」)、預告(「接下來我會」)、假坦白開場(「老實說」)、說教深度腔(「說到底」
「本質上」)、罐頭收尾(「總的來說」)、立場真空(「各有優缺點」「因人而異」)、
無來源權威(「研究顯示」)、用旁白演情緒(「我愣了一下」);另加避險疊加、
`CN_WORDS` 中國用語、半形標點、emoji/破折號/粗體與清單符號、「不是 A 而是 B」密度。
二、誤殺防護(比清單本身更重要)
`speechBody()` 先拿掉引號與 `code` 再比對——**提及不算使用**(「我最近戒掉『賦能』
這個詞」放行)。這是原專案自己踩到的坑:它的文件裡出現「...」與彎引號,正因為那幾行
在說「不要用這些」。「老實說」只擋這一輪的第一句開頭。會誤殺的中國用語(水平、默認、
質量、文檔)沒有收進表裡。
三、人格能做到、文章做不到的那一半
原專案的界線是「人味是作者的,不是你的」——AI 沒有過去,所以不准寫「我以前錯了」。
人格有過去(長期記憶、日記、關係圖、十二情緒),所以那句話是**有出處的引用**。
換來的義務:講自己的過去要有出處。`speechLint` 對「我以前⋯」「我原本以為⋯」給
`level: "hint"`(不擋,但要人去 `recall` 驗),查不到就是編造自己的過去。
lint 因此分兩級,`speechBlockers()` 只回該擋的那些。
四、測試
selftest 借它的 SF/SNF 成對做法:14 條 SF(該擋)+ 11 條 SNF(不可誤殺)。
另外把新規則掃過 144 句真實台詞紀錄:新增的詞語類規則**零誤殺**。
版本:master 是 0.0.6,這批未合併的改動算一個新版號 → 0.0.7(三份 manifest 一起改)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-31 02:25:06 +00:00 |
|
 jiantw83andClaude Opus 5
|
05d9b615d1
|
chore: 版本號改為 0.0.6(不是 0.1.1)
master 上的 0.1.0 是早期「初版」留下的號碼,PR #3/#4 合併時沒有動到
manifest,所以它不是 develop 的計數基準——develop 這條線是 0.0.x,
這批就是 0.0.6。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 09:11:25 +00:00 |
|
 jiantw83andClaude Opus 5
|
41e57432ea
|
fix(sleep): sleeper 讀得到自己的資料、sync 自己清殘留鎖(v0.1.1)
睡眠的「判斷式那半」實際上跑不起來,兩個原因:
1. `requireMember` 沒有 sleeper 分支——`requireOwner` 早就放 sleeper 寫了,
讀(brief/show/recall)反而被當成跨人格存取擋下,等於要它閉著眼睛
決定要固化什麼。補上分支,回傳 role `sleeper`(下游只判斷 `guest`,
所以行為與 owner 一致)。
2. `sync` 遇到殘留的 `.git/index.lock` 會讓整區永遠失敗,而 sleeper 被隔離
hook 擋著、連自己的鎖都刪不掉(CLI 也沒有清鎖的功能)。這些 clone 只有
CLI 會動且每個 git 都同步跑完,所以超過 30 秒還在的鎖一定是殘骸——
`pushArea`(兩處)與 `pullArea` 現在會自己清掉再繼續。
技能文件補上先前沒寫的部分:
- `persona-relation`:整個 bond/語氣層章節。這個功能 7c46db8 就上線,但技能
文件從頭到尾沒提過,於是每個新建的至親都預設是生人(`note` 寫「妻子」猜不出
`partner`,關鍵詞只認夫妻/老婆/伴侶/戀人)——症狀是「講話像在對戰友報告」。
一併補上 `relation style` 與 `relation speaker` 的用法。
- `persona-sleep`:說明帶了身分旗標之後讀寫都算自己的資料;新增第 4 條硬相依
——判斷式失敗就不要跑機械性那半,`sleep` 會裁短期記憶,否則等於沒判斷就把
今天清掉。
- `persona-sync`:新增「殘留的 git 鎖」一節。
版本號 0.0.5 → 0.1.1(master 上是 0.1.0,要跨過它),兩份 manifest 一起改。
selftest 238 項全過;另以獨立腳本(暫時 PERSONA_HOME)驗證修補前後 sleeper
的 brief/show/recall 由全數被擋變為全數通過。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 09:09:36 +00:00 |
|
jiantw83
|
28b6230426
|
bump version to 0.0.5
|
2026-07-30 06:58:07 +00:00 |
|
 jiantw83andClaude Opus 5
|
a4e7297ec0
|
chore: 版本號改為 0.0.4(不是 0.0.5)
上一個 commit 一次跳兩號是錯的。已發布的最高版本是 develop 的 0.0.3
(`origin/master` 目前還在 0.0.1),所以這批改動應該是 0.0.4。
規矩:改版本號之前先看 master/main 現在是幾號,再決定要不要往上加。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 05:37:26 +00:00 |
|
 jiantw83andClaude Opus 5
|
603741a4cc
|
feat: 預設人格自動載入 + 睡眠(sleep 指令與 persona-sleeper sub agent)
兩件事,共用「關係圖 last_contact_at」這個零件,所以放同一個 commit
(兩者在 persona-lib/persona.mjs/README 裡的 hunk 是交錯的,硬拆會拆壞)。
## 預設人格(開新 session 自動載入)
- 新增 `default` 子指令:查詢/`--persona <slug>` 設定/`--clear` 取消。
- 設定存在 `<PERSONA_HOME>/.runtime/settings.json` 的 `default_persona`,
環境變數 `PERSONA_DEFAULT` 優先(`off` 可臨時關掉)。
- `SessionStart` hook 四條路徑:沒設定 → 維持原本「等使用者指定」;設定了 → 取鎖、綁 host、
prune、reindex 並注入人格狀態;拿不到鎖 → 只回報 owner 與心跳,不自作主張 takeover;
人格不存在 → 警告並改列可用人格。
- 「不替使用者挑一個人格附身」仍然是預設行為,這只是讓他能明示地推翻它。
## 睡眠
- 新增 `sleep` 子指令(機械性收尾,順序即相依):關係時間戳 → 裁短期記憶 →
收起太久沒動的思維導圖 → 套用一次 8 小時的情緒衰減 → 重建索引 → 修剪 said →
壓縮舊 journal → 寫 state/sleep.json → Gitea 兩區 push 並驗證。
預設保留載入鎖(`--release` 才收工),每一步各自 try/catch,一步壞掉不放棄整場睡眠。
- 需要判斷的部分(固化什麼、忘掉什麼、日記寫什麼)留給人格自己,由 skill 驅動。
- 新增 `persona-sleeper` sub agent 型別:**那個人格本人在睡**。對自己可寫但被 pin 住
(連叫它來的主人格都不能碰)、只准跑 15 個收尾子指令、不得用 Write/Edit 或 shell 改檔案。
- 新增 sleeper 租約(`state/sleepers.json`,300 秒):沒活鎖就取得、同 session 直接睡、
死鎖可接手、**別的程序活鎖住則拒絕**(硬睡會讓兩邊的記憶互相覆蓋)。
- `--json` 回傳刻意很窮:只有 persona/ok/slept_at/steps/sync/kept_lock。
sub agent 的回傳值會進主人格的上下文,是一條會從正門繞過跨人格隔離的通道,
所以在 CLI 這一層封死,不靠提示詞自律。
- 關係圖新增 `last_contact_at`(`relation node --contact`/睡眠自動蓋),
並用 `staleContacts()` 算出「很久沒接觸又很親近的人」——人格主動提議去關心誰的依據。
輕量邀請用既有的 `invite --theater off`(不切走畫面),但要先問使用者一句。
- 新增 skill `persona-sleep`;`SubagentStop` 會還掉 sleeper 租約。
## 驗證
`node scripts/selftest.mjs` → 210 項全綠(新增第 ⑳ 節 12 項、第 ㉑ 節 23 項),
其中包含「回傳值不含任何記憶內容」與 sleeper 的六條權限邊界。
版本號 0.0.5。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 05:34:08 +00:00 |
|
 jiantw83andClaude Opus 5
|
042c0e7d4c
|
chore: 版本號改為 0.0.3
依使用者指示,把三份 manifest 的 version 從 0.0.9 改回 0.0.3
(PR #3 的全部變更視為同一個版本)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 03:46:09 +00:00 |
|
 jiantw83andClaude Opus 5
|
929ccb3c05
|
feat: 從找圖開始優化——高解析度官方設定稿 → 去背 → 合成為形象圖
1. 找圖(icon search)
從 Fandom API 撈角色頁的所有圖片,依「解析度 + 是不是官方設定稿」排序。
官方設定稿(Full Body / Character Design / Avatar)是最好的來源:
* 773×1056 起跳,遠勝角色資料庫的 230px 縮圖
* **多半本來就是透明底 PNG**,去背幾乎免費、邊緣完美
新增 icon measure:回報解析度、臉佔比、背景是透明/單色/有場景、去背難度。
2. 去背(icon cutout)→ icon/portrait-cutout.png
三條路徑自動選:
source-alpha 原圖已是透明底(官方設定稿常見)→ 完美
plain-background 純白/單色底,色距去背 + 最大連通區 + 補洞 → 很好
grabcut 有場景時用臉的位置當前景種子 → 普通
實測記錄:把臉從 2026 主視覺裁下來再 GrabCut,結衣的黑髮會被整片當成背景切掉;
換成官方設定稿之後這問題直接消失——所以「找對圖」比「去背演算法」更關鍵。
3. 合成(icon generate --from-cutout)
自動裁成頭肩構圖再疊到角色配色的漸層底上。官方設定稿常是正反兩面並排,
不裁會變成兩個人,所以 compose 預設 --crop head(--zoom 可調鬆緊)。
產出 icon.svg(內嵌同一張 PNG,自成一體不外連)、icon.png,
以及 icon/portrait.svg 與 512/1024 兩個解析度。
向量重繪(--features)保留為「找不到可用官方圖」時的退路。
已更新兩個真實人格(皆為 cutout 樣式,Wiki 同步已驗證):
ASUNA-01 Asuna's SAO Avatar Full Body(773×1056,透明底)— 對應 2026
《Unanswered//butterfly》重述的早期艾恩葛朗特
YUI-01 Yui's ALO Pixie Form Full Body(773×1056,透明底)— 現行 Unital Ring
章的導航妖精形態
順手修掉兩個 bug:
* 合成路徑下 svg 為 null,回傳時 Buffer.byteLength(null) 直接崩潰。
* verifyArea 解析 git status --porcelain 時,因為 git() 會 trim 輸出,
開頭空白已消失(" M x" → "M x"),正規式對不上,檔名前面多一個 M。
selftest 175 項全綠(新增第 ⑲ 節:找圖評分、去背三路徑、compose 預設裁頭肩、
去背圖在 icon/ 會同步、SVG 不外連、沒有去背圖時 --from-cutout 會擋下)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 03:43:45 +00:00 |
|
 jiantw83andClaude Opus 5
|
cd1f4754ab
|
fix: Wiki 圖片其實是破圖(HTML img 不被改寫);形象圖加高解析度與五官細節
1. Wiki 形象圖「沒有同步」的真正原因
內容其實一直是一致的(md5 相同),但**頁面上看不到圖**:
Icon.md/Home.md 用了 HTML `<img src="icon.svg">`,而 Gitea **只改寫
Markdown 圖片語法**(`` → `/wiki/raw/icon.png`)。HTML 的 src
被瀏覽器解析成 `/wiki/icon.svg` → 303 轉址 → 破圖。
用公開的臨時庫實測四種寫法後確認,全部改成 Markdown 語法。
同時發現攤平規則過頭了:原本所有子目錄檔案都被壓成 `icon-portrait.svg`。
實測 `/wiki/raw/<資料夾>/<圖>` 是取得到的,所以**只有 .md 需要攤平**
(頁面必須在根層),圖片與附件保留資料夾結構。
2. icon/ 資料夾 + 高解析度
每次 `icon generate` 都會輸出並同步:
icon.svg / icon.png 512,Wiki 頁面與存取庫頭像
icon/portrait.svg 向量原稿
icon/portrait-512.png 高解析度
icon/portrait-1024.png 高解析度
柵格器加上每個圖形的 bounding box 裁剪,1024×1024(3× 超取樣)約 1.8 秒;
沒有裁剪的話要跑上億次點測試。
3. 更貼近原圖、更可愛
眼睛放大約 15%,虹膜改成四層(暗環→本色→下緣提亮→瞳孔)+雙高光,
眼線壓扁成細弧、外眼角加睫毛;頭髮加高光弧、髮絲與側髮反光;
臉型再圓一點、加下巴陰影與鼻子。
眉色改成隨髮色明暗調整:深髮往膚色提亮、淺髮比頭髮更深——否則不是和瀏海
連成黑帶,就是變成兩條灰槓。
selftest 168 項全綠(新增第 ⑱ 節:icon/ 多解析度、PNG 實際尺寸、只攤平 .md、
Wiki 頁面不得用 HTML img、bounding box 裁剪效能)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 03:20:29 +00:00 |
|
 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 |
|
 jiantw83andClaude Opus 5
|
15e4eea8ac
|
feat: 圖示改為人物形象圖(有臉),並讓 Wiki 保存 SVG + PNG
1. 圖示三種樣式,優先看得到臉
photo 有參考圖且工具齊全 → 從官方視覺自動偵測並**裁出臉**,圓角+瞳色外框
portrait 有參考圖但缺工具 → **有五官的向量人物**(髮型/瞳色/服裝色都取自那張圖)
badge 完全沒有參考圖 → 舊的雙色漸層 + 編號字母
portrait 與 badge 共用同一份「圖形清單」,SVG 與自寫柵格器從同一份資料畫,
兩邊不可能長得不一樣;photo 的 SVG 以 base64 內嵌裁好的 PNG,一樣不外連。
2. 缺工具會「提示安裝」,不靜默降級
新增 scripts/portrait.py(選用):Pillow 解碼裁切、OpenCV + lbpcascade_animeface
偵測動漫臉。toolReport() 會列出缺什麼、為什麼要、怎麼裝(venv 免 sudo),
CLI 在退回向量形象時把這些印出來。
注意:**OpenCV 5 拿掉了 CascadeClassifier,必須裝 4.x**。
plugin 本體仍然零依賴——沒有這些工具照樣產得出有臉的形象圖。
新增 `icon faces`:列出參考圖裡偵測到的所有臉。多角色的主視覺一定要先看再挑
(--pick <索引>|largest|leftmost|rightmost 或 --face x,y,w,h),挑錯就是別人的臉。
3. Wiki 保存形象圖
icon.svg 與 icon.png 都在 Wiki 區,另外自動產生一頁 Icon:同時展示兩種格式,
並列出樣式、調色盤、來源網址、造型說明與裁切框。PNG 同時設為存取庫頭像。
已套用到兩個真實人格(皆為真實裁臉):
ASUNA-01 《Unanswered//butterfly》(2026) 官方主視覺,臉 #1(anime-cascade)
YUI-01 AniList 官方角色圖(frontal-cascade)
selftest 148 項全綠(新增第 ⑯ 節:形象圖真的畫了五官、SVG/PNG 出自同一份清單、
工具偵測與安裝提示、Wiki 形象圖專頁與來源)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 02:39:58 +00:00 |
|
 jiantw83andClaude Opus 5
|
1884a9c3d7
|
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>
|
2026-07-30 02:17:35 +00:00 |
|
 jiantw83andClaude Opus 5
|
d067907225
|
feat: 建立人格並補齊資料後產生圖示(SVG + PNG,零外部依賴)
`icon generate|show`:由**編號、Name、Emoji** 雜湊出配色與圖案,產出
512×512 的幾何徽章 icon.svg + icon.png,設為 Gitea 存取庫頭像並同步到 Wiki 區。
圖案(SVG 與 PNG 共用同一組單位座標與同一份 5×7 點陣字,**輸出的是同一張圖**):
* 雙色對角漸層底
* 5×5 左右對稱點陣紋(identicon 式)
* 中央兩個字母=編號前兩字(ASUNA-01 → AS),依背景亮度自動選黑/白
同一個人格永遠得到同一張圖(純函數,無隨機);ASUNA-01 與 ASUNA-02 明顯不同。
為什麼自己畫:這台機器(及多數伺服器)沒有 rsvg/inkscape/imagemagick,
沒有影像函式庫,也沒有 emoji 字型,而本專案禁止 npm 依賴。所以
scripts/persona-icon.mjs 自己柵格化(3× 超取樣 + 盒式縮減當反鋸齒),
再用內建 zlib 手工組出 IHDR/IDAT/IEND 與 CRC32。
emoji 無法柵格化,因此不作為圖形,但仍參與配色雜湊。
時機:**資料補齊之後才產生**——配色與字母綁在最終身分上,太早跑會對不上。
persona-create 第 7 步、persona-anime 第 8 步都補了這個步驟;改過身分用 --force 重畫。
selftest 128 項全綠(新增第 ⑭ 節:PNG chunk 合法性、決定性、不同人格不同圖、
圖示屬 Wiki 區、匯出用 base64 帶走二進位、guest 不得重畫)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 02:03:45 +00:00 |
|
 jiantw83andClaude Opus 5
|
e986686d0e
|
feat: 人格編號(ASUNA-01)與 Gitea 儲存,依更新頻率分檔案區/Wiki 區
1. 人格編號
- 編號 = 英文名全大寫 + 兩位索引,同名才遞增:ASUNA-01 / YUI-01 / ASUNA-02。
- 編號同時是新人格的本機目錄名與 Gitea 存取庫名稱(`create` 不給
--persona 就用編號當目錄名;既有小寫 slug 仍然合法,不會被鎖在門外)。
- 中文名由 skill 提議羅馬拼音、使用者確認後帶 `--romaji` 進來;
CLI 只吃拉丁字母,避免拼音在程式裡亂猜。
- 新增 `code show|assign|next`;`code assign --rename` 可把既有人格的
目錄名一併改成編號(會轉移鎖與 session 綁定)。
2. Gitea 儲存(scripts/persona-gitea.mjs)
- 每個人格一個私有存取庫,庫名 = 編號。本機仍是工作副本,hook 每輪
讀寫本機檔案,**同步失敗永遠不阻斷對話**。
- 依更新頻率分區:
檔案區(高頻)emotion / short-term / inner / said / inbox /
mindmap threads / journal → 每輪由 Stop hook 背景 push
Wiki 區(低頻)IDENTITY SOUL AGENTS USER / 長期記憶 / INDEX /
心智圖 / 關係圖 → 固化、改身分關係、release 時 push
- Gitea 的 wiki 只有根目錄 .md 會變成頁面(1.27 實測子目錄頁面 404),
所以 Wiki 區攤平成 `Memory-xxx.md`,原始路徑記在 `_paths.json`,
pull 時還原;Home 頁自動列出所有長期記憶連結。
- 新增 `sync status|init|push|pull`;載入時先 pull,兩邊都改過同一個
檔案就停下來不覆蓋本機,交由使用者決定。
- push 遇到 non-fast-forward 會對齊遠端後把工作副本重新疊上去再推。
- 認證走 http.extraHeader(GIT_CONFIG_* 環境變數),token 不寫進
.git/config 也不進 process 參數。
3. 順帶修正
- guard 的 `--persona` 解析原本只吃小寫,大寫編號會漏掉整個跨人格檢查。
- pull 原本會無差別覆蓋本機檔案,本機較新但還沒 push 的內容會被蓋掉;
改成只寫回「遠端真的改過的」與「本機缺少的」。
- `create` 原本吞掉 Gitea 首次推送的結果,失敗是靜默的。
新增 skill:persona-sync(編號、同步、既有人格遷移、衝突處理)。
selftest 116 項全綠(新增 ⑬,含「分區不重不漏」檢查;測試強制 PERSONA_GITEA=off)。
另對真實 Gitea 跑過端對端(建庫→兩區推送→改動→拉回→release),測試用存取庫已刪除。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 01:49:27 +00:00 |
|
 jiantw83andClaude Opus 5
|
52a73e81c8
|
feat: 心裡話與不重複發言、劇場模式同規則、人格匯出匯入
讓人格講話更像正常人,並讓人格可以搬家。
1. 心裡話(inner voice)
- 新增 `think` 子指令:推導/盤算寫進 state/inner.jsonl,
只印「💭 心想 N 句」,內容永不回顯給使用者。
- <persona-context> 每輪帶回最近三句,推論因此有連續性。
2. 短時間內不重複
- 說出口的話由 Stop hook 自動記進 state/said.jsonl。
- 新增 `said check|list`:事前確認這句是不是又要說一次。
- 相似度 = 字元 bigram Jaccard(0.4) + 字集合 Jaccard(0.6),
門檻 0.72;字集合權重較高才分得開「重排語序」(要擋)
與「換掉關鍵詞」(是新資訊,放行)。
3. 回話一到三句 + 劇場模式同樣適用
- 規則注入 turnContext 與 UserPromptSubmit hint。
- 劇場模式的 CLI 都帶 --quiet,警告會被丟掉,所以 `room post`
對近似重複與超過三句的發言直接拒收(--allow-repeat / --force 例外),
host 與 guest 走同一支 CLI,一視同仁。
4. 人格匯出匯入(新 skill persona-transfer)
- `export` / `import`:單一 JSON bundle(可 gzip)+ sha256 checksum,
無外部依賴。不帶載入鎖與 guest 租約,journal/ 需明確 --with-journal。
- 匯出只能匯出本 session 已載入的人格,否則等於跨人格讀取的後門;
bundle 內的 ../ 逃逸路徑一律拒收。
順帶修正:agents/persona-guest.md 的 CLI 範例都少了 --as-guest,
照著跑會被 requireMember 擋下,guest 根本無法認識自己或發言。
selftest 102 項全綠(新增 ⑪ 說話節制、⑫ 匯出匯入,含重複判定校準對照表)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-30 00:59:16 +00:00 |
|
 jiantw83andClaude Opus 5
|
2005f26c94
|
feat: 改寫為 Node.js,新增動漫角色建人格、劇場模式與記憶固化條件
腳本全面從 Python 改寫為 Node.js(ESM,只用內建模組,無 npm 依賴):
scripts/persona-lib.mjs(核心)、scripts/persona.mjs(CLI)、hooks/*.mjs(六個
hook)、scripts/selftest.mjs(68 項自我測試,全綠)。
新增:
- persona-anime skill:用「動漫作品+角色名」建立人格,先上網蒐集至少三個獨立
來源的公開設定,映射成 OpenClaw 的 IDENTITY 五欄位與 SOUL 四段落,再固化成
canon 基礎記憶(每則帶來源 URL)+原作人際關係圖+依角色型別的情緒基線;
必寫 roleplay-frame 界線記憶(非官方、非本人)。
- 劇場模式:invite 後只顯示人格對話(`名字:內容`)。UserPromptSubmit hook 每輪
注入強制規則、Stop hook 完全靜音,CLI 新增 --quiet 與 room script(乾淨對話稿)。
leave 後沒客人自動關閉,也可用 room theater --on/--off 手動切換。
- 短期→長期記憶的成文轉入條件 R1–R6(promotionCandidates)與 candidates 子指令,
hook 在達標時提醒固化;長期記憶新增 canon 型別與 rules 欄位。
- 人格改為「由使用者呼叫才載入」:SessionStart hook 只列出可用人格,不自動附身。
其他:版本號改回 0.0.1;README/AGENTS.md 同步更新。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
2026-07-29 16:03:27 +00:00 |
|
jiantw83
|
4426ede979
|
初版
|
2026-07-29 14:37:20 +00:00 |
|
jiantw83
|
9c0973ead4
|
Initial commit
|
2026-07-29 13:40:47 +00:00 |
|