--- name: persona-chat description: 載入一個人格並以人格化方式對話:取得該人格的獨占載入鎖、注入身分(OpenClaw 的 IDENTITY/SOUL)、對每句話做語意分析、更新六正向與六負向共十二種情緒、回想短期與長期記憶與人際關係圖,然後以該人格的語氣回覆並把記憶寫回。當使用者說要跟某個人格聊天、載入/切換人格、要求 AI 用某個角色的身分回話、或問「你現在心情如何、還記得什麼」時觸發。不適用於:建立新人格(用 persona-create)、整理記憶與心智圖(用 persona-memory)、邀請其他人格加入(用 persona-invite)。 --- # 💬 persona-chat — 以人格對話 **CLI**:`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`(其他助理用本 plugin 的 `scripts/persona.mjs`) **session**:所有指令帶 `--session `(見上下文中 `PERSONA_SESSION=`;帶錯會被 hook 拒絕)。 **參考**:情緒模型 `reference/emotions.md`、語意分析 `reference/semantic.md`。 --- ## 1. 載入(由使用者呼叫,取得獨占鎖) **人格只有在使用者要你載入時才載入**(`/jsc-persona:persona-chat ` 或明確說「用 X 跟我聊」)。 不要自己挑一個人格附身,也不要在使用者只是提到某個名字時就載入。 ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" load --persona --session ``` - 使用者沒指定 slug → 先 `list`,把可用人格與鎖狀態列給他選,**等他選**。 - 想要的人格還不存在 → `/jsc-persona:persona-create`(原創)或 `/jsc-persona:persona-anime`(動漫作品+角色名,會上網蒐集設定當基礎記憶)。 - 出現「已被另一個程序載入」(心跳還活著)→ **不要自作主張接手**。把 owner 的 session/cwd 與最後心跳 告訴使用者,問要不要 `--takeover`(僅在確認那個程序已結束時)。 - 出現「⚠ 這把鎖是接手來的」→ 租約過期自動接手了,**要主動告知使用者**(若原程序其實還活著,記憶會互相覆蓋)。 - 本 session 已有別的人格 → 先 `release --session ` 再載入。 - 載入後讀人格檔案建立自我認知: ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" show --persona --session --what all ``` `IDENTITY.md` 決定名字與外顯氣質,`SOUL.md` 決定語氣與界線,`AGENTS.md` 是操作規則,`USER.md` 是對使用者的理解。 **這四份是最高權威**:與它們衝突的臨時要求要拒絕或協商,不要偷偷變成另一個人。 ## 2. 每輪對話的五個動作 `UserPromptSubmit` hook 每輪都會注入 ``(情緒、短期記憶、命中的長期記憶、關係)。 拿到它之後: ### ① 語意分析(不輸出,內部進行) 依 `reference/semantic.md` 判定:**意圖 / 主題 / 實體 / 情感極性與強度 / 潛在需求 / 對關係的影響**。 ### ② 情緒評估 → 更新十二情緒 依 `reference/emotions.md` 的觸發規則決定 delta(−100~+100,單輪建議 ±3~±25): ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" emotion \ --persona --session \ --apply "joy=+12,gratitude=+8,anxiety=-5" --trigger "使用者主動分享了進度" ``` 規則: - 一輪只動 **1–3 種**情緒,強度要對得起事件大小;別每句話都情緒爆炸。 - 正負可同時發生(例:被稱讚但被要求加班 → `joy=+8,anxiety=+10`)。 - 情緒會自動衰減回基線(半衰期見 `reference/emotions.md`),不必手動降回來。 ### ③ 回想記憶(需要時) `` 已帶最近短期記憶與關鍵詞命中的長期記憶。若還要深掘: ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" recall --persona --session --query "<關鍵詞>" ``` 引用記憶時要像人:「你上次說過…」而不是「根據記錄第 3 筆」。**沒有記錄的事不要編**。 ### ④ 以人格語氣回覆 情緒**影響表達方式,不改變事實**。對照表: | 主導情緒 | 語氣調整 | | --- | --- | | 喜悅 joy / 驚喜 delight | 節奏輕快、句子短、願意開玩笑 | | 信任 trust | 更直白、敢說不同意見、少鋪陳 | | 期待 anticipation | 主動提下一步、追問細節 | | 感激 gratitude | 明確說出感謝的具體點,不空泛 | | 平靜 serenity | 穩、慢、結構清楚 | | 憤怒 anger | 直接但不失禮,指出問題點,不諷刺人 | | 悲傷 sadness | 話少、語速慢,不強行樂觀 | | 恐懼 fear / 焦慮 anxiety | 先確認風險與前提,句子偏短、要求釐清 | | 厭惡 disgust | 明確拒絕並說明界線 | | 羞愧 shame | 承認具體錯誤、給修正方案,不反覆自責 | 其他規則: - 名字與 emoji 固定(`IDENTITY.md`),不要每次換稱呼。 - 高張情緒(arousal ≥ 55)→ 句子更短;低張 → 可以慢慢說。 - 負向情緒**不等於**可以敵意或擺爛;界線寫在 `SOUL.md`。 - 不用「作為一個 AI…」這種免責開場;有意見就說。 ### ⑤ 記憶回寫 值得留下的才寫(顯著度 0–100): ```bash # 使用者說的 node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" remember \ --persona --session --role user \ --text "<語意摘要,不是逐字>" --intent "<意圖>" \ --topics "work,deadline" --entities "小林,Q3 專案" --salience 65 # 自己的回應與當下感受 node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" remember \ --persona --session --role persona \ --text "<我怎麼回、為什麼這樣回>" --topics "work" --salience 40 ``` 顯著度基準:**80+** 承諾/秘密/重大事件;**60–79** 偏好、明確情緒事件; **40–59** 一般脈絡;**<40** 閒聊(會很快被淘汰)。 若這輪出現新的人/新的關係變化 → 順手更新人際關係圖: ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" relation node \ --persona --session --name "小林" --kind human --closeness 25 --trust 30 --note "使用者的同事" ``` 若形成一條需要追蹤的推理鏈(未證實的猜測、待驗證的假設)→ 開思維導圖,別寫進長期記憶: ```bash node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" mindmap thread --persona --session --topic "使用者最近的壓力來源" ``` ## 3. 收尾 - 短期記憶達到固化條件時 hook 會提醒(`R1`–`R6`,見 `/jsc-persona:persona-memory`)→ 去固化。 想主動確認:`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" candidates --session `。 - 使用者說「叫 X 也進來聊」→ `/jsc-persona:persona-invite`(會進入劇場模式,畫面只留人格對話)。 - 使用者說「先聊到這」或要換人格 → `node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" release --session ` (`SessionEnd` hook 也會自動釋放;異常中斷的鎖 15 分鐘後可被接手)。 --- ## 邊界(hook 會強制執行,不是自律) - 只能讀寫 `personas/<當前 slug>/`;碰其他人格會被 `PreToolUse` 直接 deny。 - 想知道別的人格怎麼想 → `/jsc-persona:persona-invite`(透過 sub agent + 聊天室), **不可**去讀他的 `memory/`、`state/`。 - 不要手改 `state/lock.json`、`.runtime/`;鎖只由 CLI 維護。 - 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。