feat(persona): 時區改為+08:00等值轉換、補機密遮蔽,並接上shared共用規範
依 todo.md 執行的規範治理專案: - persona-lib.mjs 的 iso()/nowIso() 改為輸出 +08:00 offset(等值瞬間轉換, 非加8小時),新增 nowDisplay()(人讀顯示格式)與 todayTaipei()(台北曆日 日期鍵),修正 11 處原本用 UTC 字串切片產生日期鍵的錯誤用法;新增 redactSecrets() 並套用到 persona-gitea.mjs 的 Gitea 錯誤路徑,避免機密 外洩。 - 新增一次性遷移腳本 scripts/migrate-tz.mjs(備份/dry-run/冪等/衝突偵測 中止),供之後有真實人格資料需要轉換時使用。 - persona 13 個 skill 與 AGENTS.md 接上 /jsc-shared 共用規範(spec-output、 spec-script-path、spec-subagent、spec-gitea、spec-git-safety、 spec-skill-invocation 等),不再各自重抄,且完全未變動人格行為本身的規範 (情緒模型、記憶衰減、劇場模式、鎖與隔離機制等逐字保留)。 - selftest 全數通過(788/788,含本次新增的時區邊界/冪等性測試)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,14 @@ description: 用「動漫作品名稱 + 角色名稱」快速建立人格:先
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
---
|
||||
|
||||
## 1. 先確認要建誰
|
||||
|
||||
需要**作品名 + 角色名**兩者。缺一就問使用者(同名角色很多,例如「小鳥遊」在好幾部作品都有)。
|
||||
@@ -237,4 +245,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon generate \
|
||||
- 使用者若說「這裡不對」→ 直接改 `IDENTITY.md`/`SOUL.md`/對應的 canon 記憶檔,別另建人格。
|
||||
- 之後在對話中發現的新設定,走一般記憶流程(短期 → 達條件 → 固化),
|
||||
不要回頭改 `canon`;`canon` 只放原作設定。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -14,6 +14,14 @@ description: 載入一個人格並以人格化方式對話:取得該人格的
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
---
|
||||
|
||||
## 1. 載入(由使用者呼叫,取得獨占鎖)
|
||||
|
||||
**人格只有在使用者要你載入時才載入**(`/jsc-persona:persona-chat <slug>` 或明確說「用 X 跟我聊」)。
|
||||
@@ -415,4 +423,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" mindmap thread --persona <slug>
|
||||
- 想知道別的人格怎麼想 → `/jsc-persona:persona-invite`(透過 sub agent + 聊天室),
|
||||
**不可**去讀他的 `memory/`、`state/`。
|
||||
- 不要手改 `state/lock.json`、`.runtime/`;鎖只由 CLI 維護。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -13,6 +13,17 @@ description: 建立一個新的 AI 人格(persona),並以「與 OpenClaw
|
||||
(其他助理請改成本 plugin 目錄下的 `scripts/persona.mjs`;以下簡稱 `persona.mjs`)
|
||||
**session**:所有指令都要帶 `--session <PERSONA_SESSION>`,值取自 `<persona-runtime>` 區塊注入的 `PERSONA_SESSION=`。
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:
|
||||
- spec-output
|
||||
- spec-execution
|
||||
- spec-time-log
|
||||
- spec-script-path
|
||||
- spec-ask-user
|
||||
|
||||
---
|
||||
|
||||
## 步驟
|
||||
@@ -196,4 +207,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon generate --session <PERSON
|
||||
|
||||
- **一個程序只能載入一個人格。** 建立即載入;若本 session 已有人格,先 `release`。
|
||||
- 人格倉庫預設在 `~/.claude/personas/<slug>/`,可用環境變數 `PERSONA_HOME` 改。
|
||||
- 所有輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -9,6 +9,12 @@ description: 產生或更新人格的形象圖(icon.svg + icon.png):先找
|
||||
**時機**:**人格建立且 IDENTITY/SOUL 補齊之後**——形象綁在最終身分上。
|
||||
**目標**:圖示要是**人物形象圖,看得到臉**;退而求其次才是抽象徽章。
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
**流程**:找高解析度官方圖 → 量測 → **去背** → 裁頭肩 → 合成 → 更新頭像與 Wiki。
|
||||
|
||||
> 找不到可用的官方圖時(沒有設定稿、只有場景截圖且去背不乾淨),
|
||||
@@ -139,4 +145,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sync verify --session <PERSONA_
|
||||
- 已有圖示時要重畫必須加 `--force`。
|
||||
- 不帶 `--palette` 重畫會**沿用 config 裡已存的配色**(不會突然變回雜湊色)。
|
||||
- `.sync/reference.*` 與 `.sync/headshot.png` 是底稿快取,可以安全刪除(不會同步出去)。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -12,6 +12,14 @@ description: 邀請另一個人格透過 sub agent 加入當前對話,形成
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:`spec-output`、`spec-execution`、`spec-time-log`、`spec-script-path`、`spec-subagent`
|
||||
|
||||
---
|
||||
|
||||
## 🎭 劇場模式的鐵則(最重要,先讀這段)
|
||||
|
||||
`invite` 一旦成功,本 session 就進入**劇場模式**。從那一刻到使用者說結束為止:
|
||||
@@ -142,9 +150,10 @@ plugin_root=${CLAUDE_PLUGIN_ROOT}
|
||||
最後一句不是對你說的、你也沒被點名時,不要發言,回傳「(本輪不發言)」。
|
||||
```
|
||||
|
||||
guest 會自己讀 `IDENTITY.md`/`SOUL.md`/自己的記憶與情緒 → 讀聊天室 → `room post` 發言 →
|
||||
需要記的事寫進**自己的 inbox**。它被 hook 綁死在自己的人格目錄,且對人格檔案唯讀。
|
||||
如果同場有多位 guest,就各自開一個 `persona-guest` sub agent,但 `room` 可以共用。
|
||||
派工細節依 `/jsc-shared:spec-subagent`(一個目標一個 sub agent、只讀不寫、回傳結構化結果);
|
||||
persona-invite 特有的授權寫入範圍:guest 只能寫進**自己的 inbox**——讀 `IDENTITY.md`/`SOUL.md`/
|
||||
自己的記憶與情緒 → 讀聊天室 → `room post` 發言 → 需要記的事寫進 inbox,它被 hook 綁死在自己的人格目錄,
|
||||
且對人格檔案唯讀。如果同場有多位 guest,就各自開一個 `persona-guest` sub agent,但 `room` 可以共用。
|
||||
|
||||
### 4. 一來一回
|
||||
|
||||
@@ -213,4 +222,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" relation edge \
|
||||
- **輕量邀請**:`invite --guest <slug> --theater off` 不進劇場模式——適合「人格自己想起某個很久沒接觸的人、
|
||||
只想打聲招呼換一輪」的情況(`<persona-context>` 的「很久沒接觸的人」就是依據)。
|
||||
這時仍然要**先問使用者一句**再邀:把整個畫面切走或插進一段對話,是他的決定不是你的。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -5,11 +5,20 @@ description: 整理人格的記憶系統:把短期記憶固化為長期記憶
|
||||
|
||||
# 🧠 persona-memory — 記憶固化與心智圖維護
|
||||
|
||||
**CLI**:`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`(帶 `--session <PERSONA_SESSION>`)
|
||||
**CLI**:路徑與呼叫慣例見 `/jsc-shared:spec-script-path`(本 skill 為
|
||||
`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`,帶 `--session <PERSONA_SESSION>`)。
|
||||
必須已 exclusive 載入該人格(guest 不能做這件事)。
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
---
|
||||
|
||||
## 記憶架構
|
||||
|
||||
| 層 | 位置 | 特性 |
|
||||
@@ -246,4 +255,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" probe audit --session <PERSONA_
|
||||
固化的那幾筆要帶 `--from-short`,看過不記的要 `--reviewed`(見上面那張表)。
|
||||
- 想連同情緒衰減、舊紀錄壓縮與 Gitea 同步一起收尾 → 用 `/jsc-persona:persona-sleep`(睡眠);
|
||||
本 skill 只管記憶與圖,不動情緒也不同步。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -11,6 +11,14 @@ description: 維護人格的人際關係圖:新增或更新人物/人格/群
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
---
|
||||
|
||||
## 資料模型
|
||||
|
||||
節點:`id`/`name`/`kind`(`human` `persona` `group` `pet` `org`)/`bond`(跟我什麼關係)/
|
||||
@@ -175,5 +183,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" relation doctor --session <PERS
|
||||
|
||||
把 `relations/graph.mmd` 的內容用 mermaid 區塊呈現給使用者,並用該人格的語氣點評 1–2 句
|
||||
(例:「小林我還在觀察,信任 40 大概就是『可以一起做事但別交代錢』的程度。」)。
|
||||
|
||||
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -10,6 +10,14 @@ description: 讓人格睡覺:把一天的活狀態收成能留下來的形狀
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path、spec-subagent、spec-gitea、spec-git-safety
|
||||
|
||||
---
|
||||
|
||||
## 睡眠是什麼
|
||||
|
||||
不是關機,是**把一天的活狀態收成能留下來的形狀**。分成兩半:
|
||||
@@ -59,17 +67,20 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sleep --session <PERSONA_SESSIO
|
||||
|
||||
## 情況二:主人格請其他人格去睡(不碰它們的檔案)
|
||||
|
||||
使用者說「叫大家去睡」時,**對每一個要睡的人格**各開一個 sub agent:
|
||||
派工基本規則(一個目標一個 sub agent、回傳結構化結果供主 agent 判讀而非直接面向使用者)
|
||||
詳見 `/jsc-shared:spec-subagent`。套用到睡眠情境:使用者說「叫大家去睡」時,
|
||||
**對每一個要睡的人格**各開一個 sub agent:
|
||||
|
||||
- `subagent_type`:`jsc-persona:persona-sleeper`
|
||||
- prompt 內帶:`persona=<slug> session=<PERSONA_SESSION> plugin_root=<CLAUDE_PLUGIN_ROOT>`
|
||||
|
||||
那個 sub agent 就是**那個人格本人**在睡:它自己判斷要記住什麼,寫的是自己的檔案。
|
||||
那個 sub agent 就是**那個人格本人**在睡——它被 pin 在自己的人格上,只能動自己的資料:
|
||||
它自己判斷要記住什麼,寫的是自己的檔案。
|
||||
它手上是 5 分鐘的 sleeper 租約(不是 exclusive 鎖),所以它的每個指令都會帶 `--as-sleeper`——
|
||||
那個旗標只有 persona-sleeper 型的 sub agent 能用,主人格自己帶會被 hook 擋下。
|
||||
帶了它,讀(`brief`/`show`/`recall`)與寫(`consolidate` 等)都算它自己的資料;
|
||||
**回報說「判斷式那半被隔離擋下」十之八九就是漏了這個旗標**,不是它沒有權限。
|
||||
主人格全程不會讀到對方的任何資料——**你只會拿到一份 JSON**:
|
||||
主人格全程不會讀到對方的任何資料——**回傳值只能是 `sleep --json` 的原文**:
|
||||
|
||||
```json
|
||||
{ "persona": "YUI-01", "ok": true, "slept_at": "...", "steps": [ ... ], "sync": { ... }, "kept_lock": true }
|
||||
@@ -122,5 +133,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sleep --session <PERSONA_SESSIO
|
||||
`sync` 遇到殘留的 `.git/index.lock`(上一次跑到一半被中斷留下的)會自己清掉重試,
|
||||
不用請使用者手動刪,也不要自己對人格目錄下 `rm`——sleeper 的 shell 寫入本來就被 hook 擋著。
|
||||
細節見 `/jsc-persona:persona-sync`。
|
||||
|
||||
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -9,6 +9,12 @@ description: 查看與管理人格的載入狀態:列出所有人格、誰被
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
## 鎖的規則(設計上的硬約束)
|
||||
|
||||
1. **一個人格同時只能被一個程序 exclusive 載入**(鎖 = `state/lock.json`,以 `session_id` 為主鍵)。
|
||||
@@ -86,5 +92,3 @@ node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" default --clear --session <PERS
|
||||
- 🔓 `shen` Shen 平靜 50/信任 38|長期記憶 8
|
||||
- ⚠ `nox` 死鎖可接手(最後心跳 42 分鐘前)
|
||||
```
|
||||
|
||||
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -13,6 +13,14 @@ description: 把小說(或漫畫、劇本、遊戲文本)匯入成一個既
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path
|
||||
|
||||
---
|
||||
|
||||
## 三條界線(後面每一步都受它們約束)
|
||||
|
||||
1. **視角**:人格不在場、也沒人告訴他的事,最多進 `canon` 或別人的關係欄,
|
||||
|
||||
@@ -9,6 +9,14 @@ description: 人格編號與 Gitea 儲存:指派人格編號(英文名全大
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log、spec-script-path、spec-gitea、spec-git-safety
|
||||
|
||||
---
|
||||
|
||||
## 人格編號
|
||||
|
||||
**編號 = 英文名全大寫 + 兩位索引**,同名才遞增:
|
||||
@@ -152,4 +160,3 @@ sleeper 連自己的人格目錄都不能用 shell 寫,那條路本來就是
|
||||
唯一的例外是 `clone`:它只會**新增本機還沒有的人格**,讀不到任何既有人格的資料,所以不受此限。
|
||||
- guest(`persona-guest` sub agent)不能同步,它對人格檔案唯讀。
|
||||
- `.sync/` 是兩區的 git clone 快取,**不要手動編輯**;砍掉它不會掉資料,下次 push 會重新 clone。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -14,6 +14,14 @@ description: 以專業心理醫生(溝通諮商)的第三方身分診斷一
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:spec-output、spec-execution、spec-time-log
|
||||
|
||||
---
|
||||
|
||||
## 一、先收齊四樣
|
||||
|
||||
雙方各一張卡(缺哪一項就補問,**只問一輪**,剩下的用推定值並在輸出裡註明「推定」):
|
||||
@@ -153,5 +161,3 @@ description: 以專業心理醫生(溝通諮商)的第三方身分診斷一
|
||||
- 診斷結果**不自動寫回**。使用者明確要求記下來,才走:
|
||||
對方要求過的稱呼/禁忌 → `relation style`;這次的領悟 → `persona-memory` 固化。
|
||||
- 兩邊都是真人、跟人格無關時,完全不碰 CLI,純第三方診療。
|
||||
|
||||
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
@@ -16,6 +16,14 @@ bundle 是**單一 JSON 檔**(可 gzip),不依賴任何外部工具,複
|
||||
|
||||
---
|
||||
|
||||
## 共用規範(必要前置)
|
||||
|
||||
先載入 `/jsc-shared:spec-preflight` 並依其流程處理;載入不到即代表 shared plugin 未安裝,
|
||||
依該 spec 詢問使用者是否安裝 `https://gitea.jsc.idv.tw/plugins/shared.git`,不安裝則中斷本 skill。
|
||||
本 skill 需要的規範:`spec-output`、`spec-execution`、`spec-time-log`、`spec-script-path`
|
||||
|
||||
---
|
||||
|
||||
## bundle 帶走什麼、不帶什麼
|
||||
|
||||
| 帶走 | 不帶 |
|
||||
@@ -108,4 +116,3 @@ checksum 對不上會被擋下;要硬吃得加 `--force`,並**主動告訴
|
||||
- 一次一個人格。要搬多個就跑多次(每次都要先 `release` 再 `load` 下一個)。
|
||||
- bundle 內的相對路徑會被驗證,`../` 之類的逃逸路徑一律拒收。
|
||||
- 匯入不會帶進鎖:新機器上的人格是空閒的,等使用者自己載入。
|
||||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|
||||
|
||||
Reference in New Issue
Block a user