docs(README 結構): 統一章節順序與命名,跟 shared/doc/code 對齊
共通四節(安裝、CLI、Skills 目錄、跨助理支援度)原本被領域內容擠到檔尾,改為搬到前段,與其他三份 repo 一致(前綴/呼叫方式 -> 目錄結構 -> 安裝 -> CLI -> Skills 目錄 -> 跨助理支援度 -> 新增一個 skill,領域內容與設計取捨移到其後);「新增/修改 skill」節名統一為「新增一個 skill」。只搬移不改寫內文,逐一核對過文中的相對指路詞未失效。
This commit is contained in:
@@ -60,6 +60,196 @@ persona/
|
||||
|
||||
---
|
||||
|
||||
## 安裝 / 更新 / 移除(各助理)
|
||||
|
||||
> 本 plugin 的 marketplace 名是 `persona`(= repo 名),plugin 名是 `jsc-persona`,安裝 token 為 `jsc-persona@persona`。
|
||||
>
|
||||
> **⚠ 若本機還留著更早的 `jsc-persona@jsc-plugins` 安裝**,那是舊版命名的殘影,請先移除舊鍵再重裝新 token。
|
||||
>
|
||||
> **人格資料不受影響**:人格倉庫在 `~/.claude/personas/`(或 `PERSONA_HOME`),不在 plugin 目錄裡,移除/重裝 plugin 不會動到情緒、記憶與關係圖。Antigravity/OpenCode 是本地路徑/目錄安裝,沒有 marketplace 名,不受此命名影響。
|
||||
>
|
||||
> 完整的安裝/更新/移除指令(Claude Code、Codex、Antigravity、OpenCode、GitHub Copilot CLI 五種助理),一律以 [`/jsc-shared:spec-plugin-cli`](https://gitea.jsc.idv.tw/plugins/shared/src/branch/master/skills/spec-plugin-cli/SKILL.md) 為唯一權威版本,套用時代入下列佔位符:
|
||||
>
|
||||
> | 佔位符 | 值 |
|
||||
> | --- | --- |
|
||||
> | `<host>` | `gitea.jsc.idv.tw` |
|
||||
> | `<name>` | `persona` |
|
||||
> | `<plugin>` | `jsc-persona` |
|
||||
> | `<marketplace>` | `persona` |
|
||||
> | `<token>`(= `<plugin>@<marketplace>`) | `jsc-persona@persona` |
|
||||
> | `<url>` | `https://gitea.jsc.idv.tw/plugins/persona.git` |
|
||||
|
||||
---
|
||||
|
||||
## 用 CLI 直接執行 skill(headless / 一次性)
|
||||
|
||||
安裝好之後,不必進互動介面,一行指令就能叫某個 skill 跑完並印出結果:
|
||||
|
||||
| 助理 | headless 指令 | 執行 `persona-chat` skill |
|
||||
| --- | --- | --- |
|
||||
| Claude Code | `claude -p "<prompt>"` | `claude -p "/jsc-persona:persona-chat lumi"` |
|
||||
| Codex | `codex exec "<prompt>"` | `codex exec '$persona-chat lumi'` |
|
||||
| Antigravity | `agy -p "<prompt>"` | `agy -p "/jsc-persona:persona-chat lumi"` |
|
||||
| OpenCode | `opencode run "<message>"` | `opencode run "用 lumi 這個人格跟我聊聊"` |
|
||||
| GitHub Copilot CLI | `copilot -p "<message>"` | `copilot -p "用 lumi 這個人格跟我聊聊"` |
|
||||
|
||||
- Claude / Antigravity 支援 `/jsc-persona:` 前綴,直接 `-p "/jsc-persona:<name>"` 即可。
|
||||
- Codex 以 `$<name>` 觸發;在 shell 請用**單引號**避免 `$` 被展開:`codex exec '$persona-chat …'`。
|
||||
- OpenCode 與 Copilot 沒有前綴,用自然語言描述需求;Copilot CLI 會讀取已安裝 plugin 提供的 skills。
|
||||
- 帶引數就接在後面,例如 `claude -p "/jsc-persona:persona-status --json"`。
|
||||
|
||||
---
|
||||
|
||||
## Skills 目錄
|
||||
|
||||
<!-- JSC-SKILLS:START -->
|
||||
|
||||
### `persona-create`
|
||||
|
||||
建立人格:以 OpenClaw 相同的五個身分欄位與 SOUL 段落訪談使用者,初始化情緒基線、記憶、心智圖與關係圖,並立即取得載入鎖。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-create` **Codex**:`$persona-create`
|
||||
|
||||
### `persona-anime`
|
||||
|
||||
用「動漫作品+角色名」建立人格:上網蒐集角色公開設定 → 映射成 OpenClaw 五欄位與 SOUL → 固化成 `canon` 基礎記憶(附來源)+原作關係圖+情緒基線。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-anime 《作品》 角色名` **Codex**:`$persona-anime`
|
||||
|
||||
### `persona-chat`
|
||||
|
||||
載入人格並對話:取得獨占鎖 → 每輪做語意分析(推導寫進心裡話,不說出口)→ 更新十二情緒 → 回想記憶與關係 → 以人格語氣回覆(1–3 句、不重複說過的話)→ 寫回記憶。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-chat <slug>` **Codex**:`$persona-chat`
|
||||
|
||||
### `persona-invite`
|
||||
|
||||
邀請一個或多個人格透過 `persona-guest` sub agent 加入聊天室,進入**劇場模式**(畫面只留 `名字:內容` 的人格對話);結束後讓它們離場並把見聞留在各自的 inbox。多位 guest 可用 `invite --guests A,B` 同場加入。同場的發言權分**一對一**(`--to <他>`,旁人不該接話)與**全場**(`--to all`),現況查 `room floor`。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-invite <slug>` **Codex**:`$persona-invite`
|
||||
|
||||
### `persona-story`
|
||||
|
||||
把小說(或漫畫、劇本、遊戲文本)匯入既有人格:逐章判斷他在不在場、**只取他在場或知情的部分**、轉成第一人稱記憶,同時累積他自己講過的原句與「事件 → 他做了什麼」的反應對照。三條界線寫死在流程裡——他不知道的事不能變成他的 `event`、整本原文不入倉庫、`SOUL.md` 只有使用者能改。
|
||||
|
||||
正名表不請使用者手打:`novel scan` 從章節抽人名候選(對話歸屬、敬稱結尾、片假名、高頻詞),附出現次數與一兩行上下文,猜關係節點並分四種信心度,使用者只做確認。`persona-anime` 給的是查得到的公開設定,這支給的是原文。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-story` **Codex**:`$persona-story`
|
||||
|
||||
### `persona-transfer`
|
||||
|
||||
人格搬家:把身分、十二情緒、短期/長期記憶、心智圖與關係圖打包成單一 bundle 檔(可 gzip、附 checksum),或從 bundle 還原/換名複製成新人格。
|
||||
|
||||
- **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 區,並處理既有人格遷移與同步衝突。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-sync` **Codex**:`$persona-sync`
|
||||
|
||||
### `persona-memory`
|
||||
|
||||
記憶固化:依 R1–R6 條件把短期記憶轉入長期(一則一檔)、淘汰雜訊、更新心智圖與思維導圖、消化 guest inbox、重建索引。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-memory` **Codex**:`$persona-memory`
|
||||
|
||||
### `persona-relation`
|
||||
|
||||
人際關係圖維護:節點/連線、親近度與信任度調整、輸出 Mermaid 關係圖。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-relation` **Codex**:`$persona-relation`
|
||||
|
||||
### `persona-therapist`
|
||||
|
||||
語氣診療(第三方、不附身、唯讀):由雙方各給姓名/關係/情緒/逐字稿,用「關係、事實、目的」三把尺逐句標記不合理的語氣與用詞(模式表 P1–P16),指出是誰說的,只對出錯的人給保留原意的改寫。出現自傷、暴力或受控訊號時改為安全優先,不做語氣潤飾。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-therapist` **Codex**:`$persona-therapist`
|
||||
|
||||
### `persona-sleep`
|
||||
|
||||
睡眠與收尾:固化該記住的、忘掉該忘的、更新心智圖與關係圖、套用一次 8 小時的情緒衰減、壓縮舊紀錄,最後兩個區都同步到 Gitea 並驗證。也可以由主人格透過 sub agent 請其他人格各自去睡,或一次用 `sleep --personas A,B` 批次收尾多個人格。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-sleep` **Codex**:`$persona-sleep`
|
||||
|
||||
### `persona-status`
|
||||
|
||||
載入狀態與鎖管理:誰被哪個程序鎖住、guest 租約、釋放、接手死鎖、清理殘留,以及**預設人格**(開新 session 要自動載入誰)。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-status` **Codex**:`$persona-status`
|
||||
|
||||
<!-- JSC-SKILLS:END -->
|
||||
|
||||
### Agents
|
||||
|
||||
- `persona-guest`(`agents/persona-guest.md`)— 受邀人格的 sub agent,唯讀、被綁死在自己的人格目錄。
|
||||
- `persona-sleeper`(`agents/persona-sleeper.md`)— 睡眠收尾的 sub agent:**就是那個人格本人在睡**,對自己可寫但被 pin 住,只回傳「睡完了沒、哪一步出錯」。
|
||||
|
||||
### CLI 與自我測試
|
||||
|
||||
所有狀態變更都經過 `scripts/persona.mjs`(**Node.js ≥ 18**,只用內建模組,無 npm 依賴):
|
||||
|
||||
```bash
|
||||
node scripts/persona.mjs --help
|
||||
node scripts/persona.mjs list
|
||||
node scripts/persona.mjs candidates --session <PERSONA_SESSION> # 看哪些短期記憶該固化
|
||||
node scripts/persona.mjs migrate --session <id> --all --dry-run # 長期記憶升格式(冪等;先試跑)
|
||||
node scripts/persona.mjs loop list --session <id> # 現在懸著哪幾件事(上限 5)
|
||||
node scripts/persona.mjs loop add --session <id> --kind promise --text "<他答應要做的事>"
|
||||
node scripts/persona.mjs probe add --session <id> --text "是不是上個月那次?" # 模糊記憶的試探
|
||||
node scripts/persona.mjs probe audit --session <id> # 試探幾次、被否認幾次
|
||||
node scripts/persona.mjs think --session <id> --text "<推導>" # 心裡話(只回報「心想 N 句」)
|
||||
node scripts/persona.mjs said check --session <id> --text "<話>" # 這句是不是又要說一次?
|
||||
node scripts/persona.mjs room script --session <id> --room <room> # 乾淨對話稿(劇場模式用)
|
||||
node scripts/persona.mjs room floor --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/persona.mjs chapter add --session <id> --name "在 SAO 那兩年" --body "<這段是什麼>"
|
||||
node scripts/persona.mjs relation rift --session <id> --name <who> --about "<還沒和好的事>"
|
||||
node scripts/persona.mjs voice add --session <id> --kind idiolect --facet 自稱 --value 我
|
||||
node scripts/selftest.mjs # 773 項驗證:鎖、隔離、情緒(含疲勞/當日底色/抑制與慣性)、固化、回想強度與模糊態、格式遷移、未完事項、說話節制、標點與分段、語域、慣例、自傳章節、未修復裂痕、劇場模式與發言權、匯出匯入、編號與 Gitea、找圖去背合成、高解析輸出與 Wiki 同步、預設人格、睡眠與 sleeper、hooks
|
||||
node scripts/expression-check.mjs # G2/G3 表達驗收(人工看,不判定通過失敗)
|
||||
```
|
||||
|
||||
`selftest` 是機械檢查,它只能守住「不崩」。**「有沒有變成模仿腔」「是不是在用旁白演情緒」
|
||||
機械上驗不出來**,所以另有 `expression-check.mjs`:它把四段情境(誇外表、被說在害羞、
|
||||
被戳穿嘴硬、第三個人在場)× 三檔羞恥度(低/嘴硬/惱羞)的**注入內容**攤開,
|
||||
附一張「人工看什麼」的清單,用完整的暫時 `PERSONA_HOME`,不動真的人格資料。
|
||||
|
||||
檔案結構:`scripts/persona-lib.mjs`(核心:鎖/隔離/情緒/記憶)、`scripts/persona.mjs`(CLI)、
|
||||
`scripts/persona-gitea.mjs`(編號與 Gitea 同步)、`scripts/persona-icon.mjs`(形象圖:SVG + 自寫 PNG 編碼)、`scripts/portrait.py`(選用:照片裁臉)、`hooks/*.mjs`(六個 hook)、`scripts/selftest.mjs`(自我測試)、`scripts/expression-check.mjs`(G2/G3 表達驗收)。
|
||||
|
||||
---
|
||||
|
||||
## 跨助理支援度
|
||||
|
||||
| 助理 | skills | hooks(鎖/隔離強制) | 受邀人格 sub agent |
|
||||
| --- | --- | --- | --- |
|
||||
| Claude Code | ✅ `/jsc-persona:<name>` | ✅ 完整 | ✅ `jsc-persona:persona-guest` |
|
||||
| Codex | ✅ `$<name>` | ❌ | ⚠ 需自行以子任務模擬 |
|
||||
| Antigravity | ✅ `/jsc-persona:<name>` | ❌ | ⚠ |
|
||||
| OpenCode | ✅ 依描述自動觸發 | ❌ | ⚠ |
|
||||
| GitHub Copilot CLI | ✅ 依描述自動觸發 | ❌ | ⚠ |
|
||||
|
||||
> 沒有 hook 的助理仍會遵守 CLI 層的檢查(`--session` 綁定、`require_owner`/`require_member`、
|
||||
> guest 唯讀),但那是**自律**而非強制:真正的 deny 只有 Claude Code 的 `PreToolUse` 做得到。
|
||||
|
||||
---
|
||||
|
||||
## 新增一個 skill
|
||||
|
||||
1. 複製一個現有 skill 目錄,改 `SKILL.md` 的 `name` 與 `description`(描述要寫清楚何時用、何時不用)。
|
||||
2. 需要新的狀態操作 → 加到 `scripts/persona.mjs` 的子指令,並在 `scripts/selftest.mjs` 補測試。
|
||||
3. 動到隔離規則 → 一定要在 `selftest.mjs` 的第 ③(隔離)/⑧(guest 與劇場模式)區加對應案例,跑到全綠。
|
||||
4. 把 skill 補進上方「Skills 目錄」區塊。
|
||||
5. bump `.claude-plugin/plugin.json`、`.codex-plugin/plugin.json`、`plugin.json` 三處 `version`,commit 後 push。
|
||||
|
||||
## 十四條硬規則
|
||||
|
||||
| 規則 | 怎麼做到 |
|
||||
@@ -775,188 +965,6 @@ room 台詞另外比照短期記憶把**換行壓成空白**(`roomPost()` 寫
|
||||
|
||||
---
|
||||
|
||||
## Skills 目錄
|
||||
|
||||
<!-- JSC-SKILLS:START -->
|
||||
|
||||
### `persona-create`
|
||||
|
||||
建立人格:以 OpenClaw 相同的五個身分欄位與 SOUL 段落訪談使用者,初始化情緒基線、記憶、心智圖與關係圖,並立即取得載入鎖。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-create` **Codex**:`$persona-create`
|
||||
|
||||
### `persona-anime`
|
||||
|
||||
用「動漫作品+角色名」建立人格:上網蒐集角色公開設定 → 映射成 OpenClaw 五欄位與 SOUL → 固化成 `canon` 基礎記憶(附來源)+原作關係圖+情緒基線。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-anime 《作品》 角色名` **Codex**:`$persona-anime`
|
||||
|
||||
### `persona-chat`
|
||||
|
||||
載入人格並對話:取得獨占鎖 → 每輪做語意分析(推導寫進心裡話,不說出口)→ 更新十二情緒 → 回想記憶與關係 → 以人格語氣回覆(1–3 句、不重複說過的話)→ 寫回記憶。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-chat <slug>` **Codex**:`$persona-chat`
|
||||
|
||||
### `persona-invite`
|
||||
|
||||
邀請一個或多個人格透過 `persona-guest` sub agent 加入聊天室,進入**劇場模式**(畫面只留 `名字:內容` 的人格對話);結束後讓它們離場並把見聞留在各自的 inbox。多位 guest 可用 `invite --guests A,B` 同場加入。同場的發言權分**一對一**(`--to <他>`,旁人不該接話)與**全場**(`--to all`),現況查 `room floor`。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-invite <slug>` **Codex**:`$persona-invite`
|
||||
|
||||
### `persona-story`
|
||||
|
||||
把小說(或漫畫、劇本、遊戲文本)匯入既有人格:逐章判斷他在不在場、**只取他在場或知情的部分**、轉成第一人稱記憶,同時累積他自己講過的原句與「事件 → 他做了什麼」的反應對照。三條界線寫死在流程裡——他不知道的事不能變成他的 `event`、整本原文不入倉庫、`SOUL.md` 只有使用者能改。
|
||||
|
||||
正名表不請使用者手打:`novel scan` 從章節抽人名候選(對話歸屬、敬稱結尾、片假名、高頻詞),附出現次數與一兩行上下文,猜關係節點並分四種信心度,使用者只做確認。`persona-anime` 給的是查得到的公開設定,這支給的是原文。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-story` **Codex**:`$persona-story`
|
||||
|
||||
### `persona-transfer`
|
||||
|
||||
人格搬家:把身分、十二情緒、短期/長期記憶、心智圖與關係圖打包成單一 bundle 檔(可 gzip、附 checksum),或從 bundle 還原/換名複製成新人格。
|
||||
|
||||
- **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 區,並處理既有人格遷移與同步衝突。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-sync` **Codex**:`$persona-sync`
|
||||
|
||||
### `persona-memory`
|
||||
|
||||
記憶固化:依 R1–R6 條件把短期記憶轉入長期(一則一檔)、淘汰雜訊、更新心智圖與思維導圖、消化 guest inbox、重建索引。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-memory` **Codex**:`$persona-memory`
|
||||
|
||||
### `persona-relation`
|
||||
|
||||
人際關係圖維護:節點/連線、親近度與信任度調整、輸出 Mermaid 關係圖。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-relation` **Codex**:`$persona-relation`
|
||||
|
||||
### `persona-therapist`
|
||||
|
||||
語氣診療(第三方、不附身、唯讀):由雙方各給姓名/關係/情緒/逐字稿,用「關係、事實、目的」三把尺逐句標記不合理的語氣與用詞(模式表 P1–P16),指出是誰說的,只對出錯的人給保留原意的改寫。出現自傷、暴力或受控訊號時改為安全優先,不做語氣潤飾。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-therapist` **Codex**:`$persona-therapist`
|
||||
|
||||
### `persona-sleep`
|
||||
|
||||
睡眠與收尾:固化該記住的、忘掉該忘的、更新心智圖與關係圖、套用一次 8 小時的情緒衰減、壓縮舊紀錄,最後兩個區都同步到 Gitea 並驗證。也可以由主人格透過 sub agent 請其他人格各自去睡,或一次用 `sleep --personas A,B` 批次收尾多個人格。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-sleep` **Codex**:`$persona-sleep`
|
||||
|
||||
### `persona-status`
|
||||
|
||||
載入狀態與鎖管理:誰被哪個程序鎖住、guest 租約、釋放、接手死鎖、清理殘留,以及**預設人格**(開新 session 要自動載入誰)。
|
||||
|
||||
- **Claude Code / Antigravity**:`/jsc-persona:persona-status` **Codex**:`$persona-status`
|
||||
|
||||
<!-- JSC-SKILLS:END -->
|
||||
|
||||
### Agents
|
||||
|
||||
- `persona-guest`(`agents/persona-guest.md`)— 受邀人格的 sub agent,唯讀、被綁死在自己的人格目錄。
|
||||
- `persona-sleeper`(`agents/persona-sleeper.md`)— 睡眠收尾的 sub agent:**就是那個人格本人在睡**,對自己可寫但被 pin 住,只回傳「睡完了沒、哪一步出錯」。
|
||||
|
||||
### CLI 與自我測試
|
||||
|
||||
所有狀態變更都經過 `scripts/persona.mjs`(**Node.js ≥ 18**,只用內建模組,無 npm 依賴):
|
||||
|
||||
```bash
|
||||
node scripts/persona.mjs --help
|
||||
node scripts/persona.mjs list
|
||||
node scripts/persona.mjs candidates --session <PERSONA_SESSION> # 看哪些短期記憶該固化
|
||||
node scripts/persona.mjs migrate --session <id> --all --dry-run # 長期記憶升格式(冪等;先試跑)
|
||||
node scripts/persona.mjs loop list --session <id> # 現在懸著哪幾件事(上限 5)
|
||||
node scripts/persona.mjs loop add --session <id> --kind promise --text "<他答應要做的事>"
|
||||
node scripts/persona.mjs probe add --session <id> --text "是不是上個月那次?" # 模糊記憶的試探
|
||||
node scripts/persona.mjs probe audit --session <id> # 試探幾次、被否認幾次
|
||||
node scripts/persona.mjs think --session <id> --text "<推導>" # 心裡話(只回報「心想 N 句」)
|
||||
node scripts/persona.mjs said check --session <id> --text "<話>" # 這句是不是又要說一次?
|
||||
node scripts/persona.mjs room script --session <id> --room <room> # 乾淨對話稿(劇場模式用)
|
||||
node scripts/persona.mjs room floor --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/persona.mjs chapter add --session <id> --name "在 SAO 那兩年" --body "<這段是什麼>"
|
||||
node scripts/persona.mjs relation rift --session <id> --name <who> --about "<還沒和好的事>"
|
||||
node scripts/persona.mjs voice add --session <id> --kind idiolect --facet 自稱 --value 我
|
||||
node scripts/selftest.mjs # 773 項驗證:鎖、隔離、情緒(含疲勞/當日底色/抑制與慣性)、固化、回想強度與模糊態、格式遷移、未完事項、說話節制、標點與分段、語域、慣例、自傳章節、未修復裂痕、劇場模式與發言權、匯出匯入、編號與 Gitea、找圖去背合成、高解析輸出與 Wiki 同步、預設人格、睡眠與 sleeper、hooks
|
||||
node scripts/expression-check.mjs # G2/G3 表達驗收(人工看,不判定通過失敗)
|
||||
```
|
||||
|
||||
`selftest` 是機械檢查,它只能守住「不崩」。**「有沒有變成模仿腔」「是不是在用旁白演情緒」
|
||||
機械上驗不出來**,所以另有 `expression-check.mjs`:它把四段情境(誇外表、被說在害羞、
|
||||
被戳穿嘴硬、第三個人在場)× 三檔羞恥度(低/嘴硬/惱羞)的**注入內容**攤開,
|
||||
附一張「人工看什麼」的清單,用完整的暫時 `PERSONA_HOME`,不動真的人格資料。
|
||||
|
||||
檔案結構:`scripts/persona-lib.mjs`(核心:鎖/隔離/情緒/記憶)、`scripts/persona.mjs`(CLI)、
|
||||
`scripts/persona-gitea.mjs`(編號與 Gitea 同步)、`scripts/persona-icon.mjs`(形象圖:SVG + 自寫 PNG 編碼)、`scripts/portrait.py`(選用:照片裁臉)、`hooks/*.mjs`(六個 hook)、`scripts/selftest.mjs`(自我測試)、`scripts/expression-check.mjs`(G2/G3 表達驗收)。
|
||||
|
||||
---
|
||||
|
||||
## 跨助理支援度
|
||||
|
||||
| 助理 | skills | hooks(鎖/隔離強制) | 受邀人格 sub agent |
|
||||
| --- | --- | --- | --- |
|
||||
| Claude Code | ✅ `/jsc-persona:<name>` | ✅ 完整 | ✅ `jsc-persona:persona-guest` |
|
||||
| Codex | ✅ `$<name>` | ❌ | ⚠ 需自行以子任務模擬 |
|
||||
| Antigravity | ✅ `/jsc-persona:<name>` | ❌ | ⚠ |
|
||||
| OpenCode | ✅ 依描述自動觸發 | ❌ | ⚠ |
|
||||
| GitHub Copilot CLI | ✅ 依描述自動觸發 | ❌ | ⚠ |
|
||||
|
||||
> 沒有 hook 的助理仍會遵守 CLI 層的檢查(`--session` 綁定、`require_owner`/`require_member`、
|
||||
> guest 唯讀),但那是**自律**而非強制:真正的 deny 只有 Claude Code 的 `PreToolUse` 做得到。
|
||||
|
||||
---
|
||||
|
||||
## 安裝 / 更新 / 移除(各助理)
|
||||
|
||||
> 本 plugin 的 marketplace 名是 `persona`(= repo 名),plugin 名是 `jsc-persona`,安裝 token 為 `jsc-persona@persona`。
|
||||
>
|
||||
> **⚠ 若本機還留著更早的 `jsc-persona@jsc-plugins` 安裝**,那是舊版命名的殘影,請先移除舊鍵再重裝新 token。
|
||||
>
|
||||
> **人格資料不受影響**:人格倉庫在 `~/.claude/personas/`(或 `PERSONA_HOME`),不在 plugin 目錄裡,移除/重裝 plugin 不會動到情緒、記憶與關係圖。Antigravity/OpenCode 是本地路徑/目錄安裝,沒有 marketplace 名,不受此命名影響。
|
||||
>
|
||||
> 完整的安裝/更新/移除指令(Claude Code、Codex、Antigravity、OpenCode、GitHub Copilot CLI 五種助理),一律以 [`/jsc-shared:spec-plugin-cli`](https://gitea.jsc.idv.tw/plugins/shared/src/branch/master/skills/spec-plugin-cli/SKILL.md) 為唯一權威版本,套用時代入下列佔位符:
|
||||
>
|
||||
> | 佔位符 | 值 |
|
||||
> | --- | --- |
|
||||
> | `<host>` | `gitea.jsc.idv.tw` |
|
||||
> | `<name>` | `persona` |
|
||||
> | `<plugin>` | `jsc-persona` |
|
||||
> | `<marketplace>` | `persona` |
|
||||
> | `<token>`(= `<plugin>@<marketplace>`) | `jsc-persona@persona` |
|
||||
> | `<url>` | `https://gitea.jsc.idv.tw/plugins/persona.git` |
|
||||
|
||||
---
|
||||
|
||||
## 用 CLI 直接執行 skill(headless / 一次性)
|
||||
|
||||
安裝好之後,不必進互動介面,一行指令就能叫某個 skill 跑完並印出結果:
|
||||
|
||||
| 助理 | headless 指令 | 執行 `persona-chat` skill |
|
||||
| --- | --- | --- |
|
||||
| Claude Code | `claude -p "<prompt>"` | `claude -p "/jsc-persona:persona-chat lumi"` |
|
||||
| Codex | `codex exec "<prompt>"` | `codex exec '$persona-chat lumi'` |
|
||||
| Antigravity | `agy -p "<prompt>"` | `agy -p "/jsc-persona:persona-chat lumi"` |
|
||||
| OpenCode | `opencode run "<message>"` | `opencode run "用 lumi 這個人格跟我聊聊"` |
|
||||
| GitHub Copilot CLI | `copilot -p "<message>"` | `copilot -p "用 lumi 這個人格跟我聊聊"` |
|
||||
|
||||
- Claude / Antigravity 支援 `/jsc-persona:` 前綴,直接 `-p "/jsc-persona:<name>"` 即可。
|
||||
- Codex 以 `$<name>` 觸發;在 shell 請用**單引號**避免 `$` 被展開:`codex exec '$persona-chat …'`。
|
||||
- OpenCode 與 Copilot 沒有前綴,用自然語言描述需求;Copilot CLI 會讀取已安裝 plugin 提供的 skills。
|
||||
- 帶引數就接在後面,例如 `claude -p "/jsc-persona:persona-status --json"`。
|
||||
|
||||
---
|
||||
|
||||
## 設計取捨(讀之前先知道)
|
||||
|
||||
- **記憶是被策展的,不是全存**:逐字稿進 `journal/`,但只有經過語意分析、有顯著度的內容才進短期記憶,
|
||||
@@ -971,11 +979,3 @@ node scripts/expression-check.mjs # G2/G3 表達驗收(人工看,不判
|
||||
- **重複用相似度擋、不用語意判斷**:字元層級的比對沒有模型成本、行為可預期,
|
||||
誤判時有 `--allow-repeat` 可救;漏判的代價(人格自我重複)比誤判高。
|
||||
|
||||
## 新增/修改 skill
|
||||
|
||||
1. 複製一個現有 skill 目錄,改 `SKILL.md` 的 `name` 與 `description`(描述要寫清楚何時用、何時不用)。
|
||||
2. 需要新的狀態操作 → 加到 `scripts/persona.mjs` 的子指令,並在 `scripts/selftest.mjs` 補測試。
|
||||
3. 動到隔離規則 → 一定要在 `selftest.mjs` 的第 ③(隔離)/⑧(guest 與劇場模式)區加對應案例,跑到全綠。
|
||||
4. 把 skill 補進上方「Skills 目錄」區塊。
|
||||
5. bump `.claude-plugin/plugin.json`、`.codex-plugin/plugin.json`、`plugin.json` 三處 `version`,commit 後 push。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user