diff --git a/README.md b/README.md index a6d19df..af00a4a 100644 --- a/README.md +++ b/README.md @@ -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) 為唯一權威版本,套用時代入下列佔位符: +> +> | 佔位符 | 值 | +> | --- | --- | +> | `` | `gitea.jsc.idv.tw` | +> | `` | `persona` | +> | `` | `jsc-persona` | +> | `` | `persona` | +> | ``(= `@`) | `jsc-persona@persona` | +> | `` | `https://gitea.jsc.idv.tw/plugins/persona.git` | + +--- + +## 用 CLI 直接執行 skill(headless / 一次性) + +安裝好之後,不必進互動介面,一行指令就能叫某個 skill 跑完並印出結果: + +| 助理 | headless 指令 | 執行 `persona-chat` skill | +| --- | --- | --- | +| Claude Code | `claude -p ""` | `claude -p "/jsc-persona:persona-chat lumi"` | +| Codex | `codex exec ""` | `codex exec '$persona-chat lumi'` | +| Antigravity | `agy -p ""` | `agy -p "/jsc-persona:persona-chat lumi"` | +| OpenCode | `opencode run ""` | `opencode run "用 lumi 這個人格跟我聊聊"` | +| GitHub Copilot CLI | `copilot -p ""` | `copilot -p "用 lumi 這個人格跟我聊聊"` | + +- Claude / Antigravity 支援 `/jsc-persona:` 前綴,直接 `-p "/jsc-persona:"` 即可。 +- Codex 以 `$` 觸發;在 shell 請用**單引號**避免 `$` 被展開:`codex exec '$persona-chat …'`。 +- OpenCode 與 Copilot 沒有前綴,用自然語言描述需求;Copilot CLI 會讀取已安裝 plugin 提供的 skills。 +- 帶引數就接在後面,例如 `claude -p "/jsc-persona:persona-status --json"`。 + +--- + +## Skills 目錄 + + + +### `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 ` **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 ` **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` + + + +### 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 # 看哪些短期記憶該固化 +node scripts/persona.mjs migrate --session --all --dry-run # 長期記憶升格式(冪等;先試跑) +node scripts/persona.mjs loop list --session # 現在懸著哪幾件事(上限 5) +node scripts/persona.mjs loop add --session --kind promise --text "<他答應要做的事>" +node scripts/persona.mjs probe add --session --text "是不是上個月那次?" # 模糊記憶的試探 +node scripts/persona.mjs probe audit --session # 試探幾次、被否認幾次 +node scripts/persona.mjs think --session --text "<推導>" # 心裡話(只回報「心想 N 句」) +node scripts/persona.mjs said check --session --text "<話>" # 這句是不是又要說一次? +node scripts/persona.mjs room script --session --room # 乾淨對話稿(劇場模式用) +node scripts/persona.mjs room floor --session --room # 發言權:誰對誰在講、該誰接話 +node scripts/persona.mjs export --session --out lumi.json # 離線搬家(單檔) +node scripts/persona.mjs sync status --session # Gitea 同步狀態 +node scripts/persona.mjs chapter add --session --name "在 SAO 那兩年" --body "<這段是什麼>" +node scripts/persona.mjs relation rift --session --name --about "<還沒和好的事>" +node scripts/persona.mjs voice add --session --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:` | ✅ 完整 | ✅ `jsc-persona:persona-guest` | +| Codex | ✅ `$` | ❌ | ⚠ 需自行以子任務模擬 | +| Antigravity | ✅ `/jsc-persona:` | ❌ | ⚠ | +| 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 目錄 - - - -### `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 ` **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 ` **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` - - - -### 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 # 看哪些短期記憶該固化 -node scripts/persona.mjs migrate --session --all --dry-run # 長期記憶升格式(冪等;先試跑) -node scripts/persona.mjs loop list --session # 現在懸著哪幾件事(上限 5) -node scripts/persona.mjs loop add --session --kind promise --text "<他答應要做的事>" -node scripts/persona.mjs probe add --session --text "是不是上個月那次?" # 模糊記憶的試探 -node scripts/persona.mjs probe audit --session # 試探幾次、被否認幾次 -node scripts/persona.mjs think --session --text "<推導>" # 心裡話(只回報「心想 N 句」) -node scripts/persona.mjs said check --session --text "<話>" # 這句是不是又要說一次? -node scripts/persona.mjs room script --session --room # 乾淨對話稿(劇場模式用) -node scripts/persona.mjs room floor --session --room # 發言權:誰對誰在講、該誰接話 -node scripts/persona.mjs export --session --out lumi.json # 離線搬家(單檔) -node scripts/persona.mjs sync status --session # Gitea 同步狀態 -node scripts/persona.mjs chapter add --session --name "在 SAO 那兩年" --body "<這段是什麼>" -node scripts/persona.mjs relation rift --session --name --about "<還沒和好的事>" -node scripts/persona.mjs voice add --session --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:` | ✅ 完整 | ✅ `jsc-persona:persona-guest` | -| Codex | ✅ `$` | ❌ | ⚠ 需自行以子任務模擬 | -| Antigravity | ✅ `/jsc-persona:` | ❌ | ⚠ | -| 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) 為唯一權威版本,套用時代入下列佔位符: -> -> | 佔位符 | 值 | -> | --- | --- | -> | `` | `gitea.jsc.idv.tw` | -> | `` | `persona` | -> | `` | `jsc-persona` | -> | `` | `persona` | -> | ``(= `@`) | `jsc-persona@persona` | -> | `` | `https://gitea.jsc.idv.tw/plugins/persona.git` | - ---- - -## 用 CLI 直接執行 skill(headless / 一次性) - -安裝好之後,不必進互動介面,一行指令就能叫某個 skill 跑完並印出結果: - -| 助理 | headless 指令 | 執行 `persona-chat` skill | -| --- | --- | --- | -| Claude Code | `claude -p ""` | `claude -p "/jsc-persona:persona-chat lumi"` | -| Codex | `codex exec ""` | `codex exec '$persona-chat lumi'` | -| Antigravity | `agy -p ""` | `agy -p "/jsc-persona:persona-chat lumi"` | -| OpenCode | `opencode run ""` | `opencode run "用 lumi 這個人格跟我聊聊"` | -| GitHub Copilot CLI | `copilot -p ""` | `copilot -p "用 lumi 這個人格跟我聊聊"` | - -- Claude / Antigravity 支援 `/jsc-persona:` 前綴,直接 `-p "/jsc-persona:"` 即可。 -- Codex 以 `$` 觸發;在 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。 -