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>
This commit is contained in:
2026-07-29 16:03:27 +00:00
co-authored by Claude Opus 5
parent 4426ede979
commit 2005f26c94
39 changed files with 1878 additions and 2695 deletions
+10 -8
View File
@@ -7,8 +7,10 @@ description: 建立一個新的 AI 人格(persona),並以「與 OpenClaw
以 **OpenClaw 相同的身分描述**建立一個可長期演化的人格,並備妥記憶與情緒骨架。
**CLI**`python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py"`
(其他助理請改成本 plugin 目錄下的 `scripts/persona.py`;以下簡稱 `persona.py`
> 要建的是**動漫/漫畫/遊戲的既有角色**?改用 `/jsc-persona:persona-anime`——它會先上網蒐集該角色的公開設定,再自動填這些欄位並固化成基礎記憶。本 skill 用於**原創**人格。
**CLI**`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`
(其他助理請改成本 plugin 目錄下的 `scripts/persona.mjs`;以下簡稱 `persona.mjs`
**session**:所有指令都要帶 `--session <PERSONA_SESSION>`,值取自 `<persona-runtime>` 區塊注入的 `PERSONA_SESSION=`
---
@@ -18,7 +20,7 @@ description: 建立一個新的 AI 人格(persona),並以「與 OpenClaw
### 1. 先看現況
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" list
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" list
```
若使用者要建的名字已存在 → 詢問是要改名、還是載入既有人格(改走 `persona-chat`)。
@@ -48,7 +50,7 @@ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" list
slug = 小寫英數與連字號(例:`lumi``shen-yu`),是之後所有指令的識別。
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" create \
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" create \
--persona <slug> --session <PERSONA_SESSION> \
--name "<Name>" --creature "<Creature>" --vibe "<Vibe>" \
--emoji "<Emoji>" --avatar "<Avatar>" \
@@ -78,7 +80,7 @@ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" create \
| 神經質、敏感 | `anxiety=25,fear=12,anticipation=30` |
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" emotion \
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" emotion \
--persona <slug> --session <PERSONA_SESSION> --baseline "joy=30,serenity=45,anxiety=8"
```
@@ -86,15 +88,15 @@ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" emotion \
```bash
# 使用者節點(人際關係圖的原點)
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" relation node \
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" relation node \
--persona <slug> --session <PERSONA_SESSION> \
--name "<使用者稱呼>" --kind human --closeness 55 --trust 50 --note "創造我的人"
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" relation edge \
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" relation edge \
--persona <slug> --session <PERSONA_SESSION> \
--to <使用者 id> --label "主要對話者" --affinity 60
# 誕生事件(第一則長期記憶)
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/persona.py" consolidate \
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" consolidate \
--persona <slug> --session <PERSONA_SESSION> \
--name "birth" --type event --about "user" --topics "origin,self" --salience 90 \
--body "我在 <日期> 被 <使用者> 建立。當時他希望我是 <Vibe> 的 <Creature>。"