feat(role): 新增點名載入,對話中叫名字即可切換角色

- `UserPromptSubmit` hook(`role_call.sh`)比對訊息開頭的角色名稱/ID/`aliases` 別名,
  命中即注入該角色人格與記憶並接手本輪;未點名時不輸出內容也不寫檔案。
- 抽出 `role_context.sh` 共用 context 組裝,SessionStart 與點名載入共用同一份人格與操作規則,
  避免兩種載入方式漂移;實測 SessionStart 注入內容與改動前 byte-identical。
- 新增階段角色狀態(`~/.roles/.sessions/<工作階段>.role`),`Stop` hook 改以「本階段實際角色」
  寫記憶,避免點名換人後把跟 A 的對話記進 B 的記憶。
- `SessionEnd` 改為釋放本階段名下所有角色鎖並清掉階段狀態檔。
- 切換時先確認取得目標角色鎖才釋放原角色鎖,避免出現兩個角色都沒有的空窗。
- 睡眠時段、目標角色已被其他活躍階段佔用、點名的是已在場的角色時,一律不切換。
- 新增 `ROLE_CALL_ENABLED`(總開關)與 `ROLE_CALL_MARKER_ONLY`(只認 `@名字`)。
- 順帶修正 `role_capture.sh` 的 `--postcompact` 分支在 `PROJECT` 賦值前就使用它,
  導致壓縮摘要記憶的 `sources` 一直為空。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jeffery
2026-07-29 13:38:25 +08:00
co-authored by Claude Opus 5
parent 4a06d770b6
commit 46caabe4d8
9 changed files with 884 additions and 346 deletions
+74 -13
View File
@@ -1,6 +1,6 @@
---
name: role
description: 角色人格與長期記憶系統的建立與維護 skill。讓 CLI 工具以固定角色(namenature/vibe/簽名 emoji)回覆,並把每輪對話累積成長期記憶:搭配相容的 SessionStart hook 於啟動時依字元預算載入高價值記憶、Stop hook 先本地過濾再輕量記錄對話,睡眠時段(預設 22:00 至隔天 06:00)由排程整理記憶(NREM 鞏固:分類/去噪/去重/合併/優先度;REM 整合:跨記憶連結/抽象化/提取線索;再依 semanticepisodicproceduralemotionalpreferencerule 與 explicitimplicit 標記長期記憶型態,壓縮歸檔並適當遺忘)。提供 --new(新建或更新角色;可只給角色名稱,必要時詢問來源/作品並推斷 name/naturevibeemoji 四欄)、--use(以角色 ID 切換啟用角色)、--list(列出角色與 ID)、--export(匯出角色壓縮檔)、--sleep(立即整理)、--status--diagnose、--install-cron--remove-cron、--forget-preview、--brief(晨間狀態檢查)、--agent(匯出成 sub agent 供多角色協作)、--migrate(舊格式角色檔拆成身分與人格兩檔)等模式。當使用者說建立角色、新增人格、切換角色、匯出角色、備份角色、讓回覆更有特色、角色記憶、記憶整理、睡覺整理記憶、忘記舊記憶、角色沒有載入、hook 沒載入角色、角色被鎖住、角色鎖沒有自動解除、關掉 CLI 後角色叫不回來、角色說已在另一個工作階段、晨間狀態檢查、早上主動回報狀態,或提到 .roles.memoryROLE_NAMEROLE_ENABLEDROLE_SLEEP_STARTROLE_MEMORY_HOMEROLE_LOAD_LIMITROLE_LOAD_INBOX_LIMITROLE_LOAD_DIALOG_TURNSROLE_CAPTURE_ENABLEDROLE_SINGLE_INSTANCEROLE_INSTANCE_IDLE_MINUTES 時觸發。不適用於:工作紀錄寫入 Gitea wiki(用 /jsc-doc:worklog)、專案文件化(用 /jsc-doc:funcs)。
description: 角色人格與長期記憶系統的建立與維護 skill。讓 CLI 工具以固定角色(namenature/vibe/簽名 emoji)回覆,並把每輪對話累積成長期記憶:搭配相容的 SessionStart hook 於啟動時依字元預算載入高價值記憶、Stop hook 先本地過濾再輕量記錄對話,睡眠時段(預設 22:00 至隔天 06:00)由排程整理記憶(NREM 鞏固:分類/去噪/去重/合併/優先度;REM 整合:跨記憶連結/抽象化/提取線索;再依 semanticepisodicproceduralemotionalpreferencerule 與 explicitimplicit 標記長期記憶型態,壓縮歸檔並適當遺忘)。提供 --new(新建或更新角色;可只給角色名稱,必要時詢問來源/作品並推斷 name/naturevibeemoji 四欄)、--use(以角色 ID 切換啟用角色)、--list(列出角色與 ID)、--export(匯出角色壓縮檔)、--sleep(立即整理)、--status--diagnose、--install-cron--remove-cron、--forget-preview、--brief(晨間狀態檢查)、--agent(匯出成 sub agent 供多角色協作)、--migrate(舊格式角色檔拆成身分與人格兩檔)等模式。當使用者說建立角色、新增人格、切換角色、匯出角色、備份角色、讓回覆更有特色、角色記憶、記憶整理、睡覺整理記憶、忘記舊記憶、角色沒有載入、hook 沒載入角色、角色被鎖住、角色鎖沒有自動解除、關掉 CLI 後角色叫不回來、角色說已在另一個工作階段、晨間狀態檢查、早上主動回報狀態、在同一個終端換角色、叫名字就換人、點名載入、呼叫角色名稱、對話中途切換人格、同時跟兩個角色聊天、角色別名,或提到 .roles.memoryROLE_NAMEROLE_ENABLEDROLE_SLEEP_STARTROLE_MEMORY_HOMEROLE_LOAD_LIMITROLE_LOAD_INBOX_LIMITROLE_LOAD_DIALOG_TURNSROLE_CAPTURE_ENABLEDROLE_SINGLE_INSTANCEROLE_INSTANCE_IDLE_MINUTESROLE_CALL_ENABLEDROLE_CALL_MARKER_ONLY 時觸發。不適用於:工作紀錄寫入 Gitea wiki(用 /jsc-doc:worklog)、專案文件化(用 /jsc-doc:funcs)。
---
# role — 角色人格與長期記憶
@@ -11,15 +11,18 @@ description: 角色人格與長期記憶系統的建立與維護 skill。讓 CLI
| 元件 | 觸發者 | 職責 |
| --- | --- | --- |
| `hooks/hooks.json``SessionStart` hook | harness 自動 | 啟動 CLI 時依字元預算載入角色定義+高價值記憶,另以獨立預算載入近期逐字對話與未整理工作記憶做工作階段交接,並要求角色在本工作階段第一則回覆主動問候;睡眠時段只回報「角色睡覺中」不載入 |
| `hooks/hooks.json``Stop` hook | harness 自動 | 每輪結束先記錄最後互動時間 → 用本地規則過濾低價值短回合 → 值得保存時才濃縮成一則輕量 inbox 記憶 → 遮蔽 → 寫入 `inbox/` |
| `hooks/hooks.json``UserPromptSubmit` hook | harness 自動 | **點名載入**:訊息開頭出現角色名稱/ID/別名時,即時注入該角色的人格與記憶並接手本輪,同時記下本階段實際角色;未點名時完全不作用 |
| `hooks/hooks.json``Stop` hook | harness 自動 | 每輪結束先記錄最後互動時間 → 用本地規則過濾低價值短回合 → 值得保存時才濃縮成一則輕量 inbox 記憶 → 遮蔽 → 寫入 `inbox/`;記給**本階段實際角色**(點名換人後不會寫錯人) |
| `hooks/hooks.json``PreCompact` hook | harness 自動 | 對話壓縮**前**強制記錄一次(**跳過長度門檻**):壓縮會讓尚未寫入的內容永久蒸發,此時寧可多記 |
| `hooks/hooks.json``PostCompact` hook | harness 自動 | 壓縮**後**把 harness 產生的摘要存成一則 `daily` 記憶,作為該段落的濃縮備份 |
| `hooks/hooks.json``SessionEnd` hook | harness 自動 | 工作階段結束時釋放本階段持有的角色單一載入鎖,讓關掉 CLI 後可立刻重開叫回同一角色;鎖不屬於自己時不動作 |
| `hooks/hooks.json``SessionEnd` hook | harness 自動 | 工作階段結束時釋放**本階段名下所有**角色單一載入鎖(點名換過人時可能不只一個),並清掉階段角色狀態;鎖不屬於自己時不動作 |
| cron 排程(本 skill 安裝) | 系統排程 | 睡眠時段每小時檢查一次:**有 AI 在運行就不睡**;另可依 CLI 閒置時間自動小睡整理 |
| 本 skill `/jsc-generic:role` | 使用者/助理手動 | `--new``--use``--list``--export``--agent``--migrate``--sleep``--brief``--status``--install-cron``--forget-preview` |
| `scripts/role/role_load.sh` | SessionStart hook | 角色與記憶載入;參考 OpenClaw 的 SOULAGENTSUSERMEMORY 分層,把人格、操作邊界、使用者記憶分開注入,並提供第一則回覆問候提示(單一實作,避免漂移) |
| `scripts/role/role_capture.sh` | Stop hook | 對話 → 記憶(固定欄位格式) |
| `scripts/role/role_unload.sh` | SessionEnd hook | 釋放本階段的角色單一載入鎖(比對 transcript 確認鎖屬於自己才釋放 |
| `scripts/role/role_call.sh` | UserPromptSubmit hook | 點名比對與即時角色切換;睡眠時段、目標角色被別的階段佔用、點的是目前已在的角色時都不切換 |
| `scripts/role/role_context.sh` | role_loadrole_call 共用 | 人格+操作規則+記憶+同伴清單+近期對話的注入內容組裝(單一實作,兩種載入方式不會漂移 |
| `scripts/role/role_capture.sh` | Stop hook | 對話 → 記憶(固定欄位格式),寫給本階段實際角色 |
| `scripts/role/role_unload.sh` | SessionEnd hook | 釋放本階段名下的角色單一載入鎖(比對 transcript 確認鎖屬於自己才釋放) |
| `scripts/role/role_sleep.sh` | cron/小睡/補跑/手動 | 睡眠與小睡判斷、記憶整理、角色匯出、sub agent 定義匯出、晨間狀態檢查、排程安裝、狀態輸出 |
| `scripts/role/memory.js` | 上述共用 | 記憶檔讀寫、分類、去重合併、優先度、心理學記憶型態與關聯 metadata、壓縮歸檔、遺忘、載入組裝 |
| `scripts/role/transcript.js` | 上述共用 | 抽本輪對話片段、抽最近數輪純對話供工作階段交接、機密與個資遮蔽 |
@@ -31,6 +34,7 @@ description: 角色人格與長期記憶系統的建立與維護 skill。讓 CLI
| 功能 | Claude Code | Codex | Antigravity | OpenCode | GitHub Copilot |
| --- | --- | --- | --- | --- | --- |
| `SessionStart` 載入角色 | ✅ | ⚠️ 需該版本支援 SessionStart hook | ❌ | ❌ | ❌ |
| `UserPromptSubmit` 點名載入 | ✅ | ⚠️ 需該版本支援 UserPromptSubmit hook | ❌ | ❌ | ❌ |
| `Stop` 記錄記憶 | ✅ | ✅ 需可讀 Codex session JSONL | ❌ | ❌ | ❌ |
| `SessionEnd` 釋放角色鎖 | ✅ | ⚠️ 需該版本支援 SessionEnd hook | ❌ | ❌ | ❌ |
| cron 睡眠整理 | ✅ 與助理無關(系統排程) | ✅ | ✅ | ✅ | ✅ |
@@ -43,7 +47,7 @@ description: 角色人格與長期記憶系統的建立與維護 skill。讓 CLI
| plugin | hooks.json 內容 | 擁有的腳本 |
| --- | --- | --- |
| `jsc-generic` | `SessionStart`role_load)+ `Stop``PreCompact``PostCompact`role_capture)+ `SessionEnd`role_unload | `scripts/role/` |
| `jsc-generic` | `SessionStart`role_load)+ `UserPromptSubmit`role_call)+ `Stop``PreCompact``PostCompact`role_capture)+ `SessionEnd`role_unload | `scripts/role/` |
| `jsc-doc` | `Stop`worklog | `scripts/worklog/` |
| `jsc-code` | 無 `hooks/hooks.json` | 無 hook 腳本 |
@@ -125,10 +129,62 @@ ROLE_DIR="<skill base directory>/../../scripts/role" # 其他助理
| `ROLE_SINGLE_INSTANCE` | | 單一載入實例限制:同一角色同時只被一個工作階段載入。設 `0` 可停用 | `1` |
| `ROLE_INSTANCE_IDLE_MINUTES` | | 前一個工作階段的 transcript 閒置多久後自動釋放角色鎖 | `30` |
| `ROLE_SKIP_INSTANCE_LOCK` | | 設 `1` 時跳過單一載入鎖且**不寫鎖**,供 sub agent 等非對話情境使用 | `0` |
| `ROLE_CALL_ENABLED` | | 點名載入總開關:訊息開頭出現角色名稱時即時切換角色。設 `0` 可停用(回到「只有 SessionStart 會載入角色」) | `1` |
| `ROLE_CALL_MARKER_ONLY` | | 設 `1` 時點名只認 `@名字` 這種明確標記,句子開頭單純提到名字不算;角色名稱剛好是常用詞開頭時用它避免誤切 | `0` |
| `ROLE_SCOPE` | | 冒號分隔的路徑前綴,僅這些路徑下的 session 載入/記錄 | 全部 session |
| `ROLE_ERRLOG` | | 錯誤訊息額外寫入的檔案路徑 | 只走 stderr |
> 角色切換用 `/jsc-generic:role --use <角色 ID>`(寫 `.active`)即可,一般不需要設 `ROLE_NAME``ROLE_NAME` 適合「單一專案固定用某角色」時寫進該環境。角色 ID 是英文大寫語意前綴加數字索引,例如 `ENGINEER01`、`MUSE02`。若很在意額度,優先調低 `ROLE_LOAD_LIMIT` 或設 `ROLE_CAPTURE_ENABLED=0`。
> 角色切換用 `/jsc-generic:role --use <角色 ID>`(寫 `.active`)即可,一般不需要設 `ROLE_NAME``ROLE_NAME` 適合「單一專案固定用某角色」時寫進該環境,也是**同時跟多個角色對話**的做法(每個終端一個 `ROLE_NAME`。角色 ID 是英文大寫語意前綴加數字索引,例如 `ENGINEER01`、`MUSE02`。對話進行中要臨時換人則用下一節的點名載入。若很在意額度,優先調低 `ROLE_LOAD_LIMIT` 或設 `ROLE_CAPTURE_ENABLED=0`。
---
## 點名載入(在對話中呼叫角色名稱切換)
`.active``ROLE_NAME` 決定「開新工作階段時是誰」;**點名載入**讓使用者在對話進行中直接叫另一個角色接手,不必改設定、不必重開 CLI。由 `UserPromptSubmit` hook`role_call.sh`)處理,未點名時不輸出任何內容也不寫任何檔案。
### 怎麼觸發
| 寫法 | 結果 |
| --- | --- |
| `西莉卡,幫我看這段` | 顯示名稱在訊息開頭 → 切換 |
| `西莉卡在嗎` | 中文名稱後面不需要分隔符(中文本來就不用空格斷詞) |
| `@SILICA01 幫我看` | `@` 標記+角色 ID,大小寫不分 |
| `@小珪 ...` | identity frontmatter 的 `aliases` 別名 |
| `剛剛西莉卡說的方法不錯` | **不切換** —— 只認訊息開頭;句中提到名字是在談論那個角色 |
| `silica01x 是什麼` | **不切換** —— 半形名稱後面接英數字視為別的詞 |
比對時名稱較長者優先,避免不同角色的名稱互相包含時判給錯的人。角色名稱剛好是常用詞開頭(例如「結衣」對上「結衣服」)時,設 `ROLE_CALL_MARKER_ONLY=1` 只認 `@名字`
### 什麼情況不會切換
| 情況 | 行為 |
| --- | --- |
| 點的是本階段目前已在的角色 | 完全不注入 —— 每輪重灌一份人格只是白燒 context |
| 睡眠時段 | 不載入,注入一句說明並要求以目前身分回應、不得模仿該角色 |
| 目標角色已被另一個仍活躍的工作階段載入 | 不載入,注入說明與三種解法(`--unlock`/等閒置逾時/`ROLE_SINGLE_INSTANCE=0` |
| `ROLE_CALL_ENABLED=0``ROLE_ENABLED=0`、cwd 不在 `ROLE_SCOPE` 內、`~/.roles` 不存在 | hook 直接結束 |
### 記憶歸屬(重要)
點名成功後,`~/.roles/.sessions/<工作階段>.role` 記下「這個工作階段目前實際是誰」,`Stop` hook 一律以它為準:
- 點名**之後**的對話記進新角色的記憶;點名**之前**的內容屬於先前那個身分,不回頭改寫。
- 狀態檔取不到時(沒點名過、或 SessionStart 因睡眠/佔用而未載入人格)退回 `ROLE_NAME``.active`,維持原本「不載入人格但仍記錄記憶」的行為。
- `SessionEnd` 會清掉狀態檔,並釋放本階段名下**所有**角色鎖(點名換過人時可能不只一個)。
- 狀態檔以 `session_id` 命名(取不到時退回 transcript 檔名),7 天未更新者自動清除。
沒有這層歸屬,跟 A 聊的內容會被寫進 B 的記憶,兩份記憶一起髒掉 —— 這是點名載入必須連同 `Stop``SessionEnd` 一起改的原因。
### 鎖的交接順序
本階段的「現任人格」只有一個:切換時**先確認目標角色取得鎖,才釋放原角色的鎖**。順序顛倒會出現「原角色已放掉、新角色又取不到」的空窗,本階段變成沒有任何角色。原角色因此會即時讓出名額,其他終端可以馬上叫它。
### 與另開終端的取捨
| 做法 | 適合 | 代價 |
| --- | --- | --- |
| 另開終端 `ROLE_NAME=<角色 ID> claude` | 真的要**同時**跟兩個角色對話 | 多一個視窗 |
| 同一終端點名 | 臨時換人、或原角色被別的視窗佔用時改叫別人 | 同一時間只有一個角色在場;每次切換注入一份人格與記憶(數千字元 context) |
---
@@ -147,6 +203,7 @@ ROLE_DIR="<skill base directory>/../../scripts/role" # 其他助理
| `vibe` | 氛圍:語氣、句長、稱呼、幽默感、禁忌 | 簡潔直白、偶爾吐槽,不用客套開場白 |
| `emoji` | 簽名 emoji,一到二個;若後續成功建立心情 emoji 圖表,這個值作為不支援圖片時的 fallback | 🐆 |
| `appearance_reference` | 選填;角色形象圖來源、作品名稱、圖片 URL 或本機檔案路徑,用來產生心情 emoji | `Sword Art Online 結衣``https://.../yui.jpg``/path/avatar.png` |
| `aliases` | 選填;點名載入時可用的其他叫法(暱稱、本名、英文名),以逗號分隔。**只用於點名比對,不注入 context**;名稱太短或是常用詞開頭時不要加,否則容易誤切 | `小珪, 珪子, silica` |
流程:
@@ -178,7 +235,7 @@ ROLE_DIR="<skill base directory>/../../scripts/role" # 其他助理
8. 寫入 `~/.roles/<id>.identity.md``~/.roles/<id>.soul.md`(UTF-8 無 BOM,格式見「角色檔標準格式」)。
身分檔需填**來源**與**關係定位**,並可在標題下以條目寫存在本質、角色原型、主要稱呼等摘要;
人格檔除必要的本質與氛圍外,可依角色特性增加核心信念、語氣與風格、邊界與規範等章節。
共用行為**不寫入角色檔**(由 `role_load.sh` 注入)。
共用行為**不寫入角色檔**(由 `role_context.sh` 注入)。
9. 建立記憶目錄:`node "${ROLE_DIR}/memory.js" stats --role "<id>"`(會順帶建好 `inbox/`、六個分類與 `archive/`)。
10. 若使用者同意網路搜尋且已取得可保存內容,將搜尋摘要寫成已整理記憶,不進 inbox:
@@ -305,7 +362,7 @@ Stop hook 只做「編碼前處理」,輸出粗分類、summary、tags、prior
| 本質與氛圍 | 逐字搬進 `soul` 檔 |
| ID/顯示名稱/emoji/簽名 emoji 段落 | 逐字搬進 `identity` 檔;`created` 沿用原值 |
| **來源與關係定位** | 產生待填空白,需人工補上(舊格式沒有這兩個概念) |
| 共用行為區塊 | **不搬進角色檔**,由 `role_load.sh` 注入 |
| 共用行為區塊 | **不搬進角色檔**,由 `role_context.sh` 注入 |
| 舊檔 | **保留不動**,確認新格式正常後可自行移除或備份 |
| 新檔已存在時 | 直接中止並提示,不覆寫 |
@@ -338,7 +395,7 @@ Stop hook 只做「編碼前處理」,輸出粗分類、summary、tags、prior
### `--unlock`(解除角色載入鎖)
同一角色同時只會被一個工作階段載入,避免使用者同時與兩個相同人格對話。第二個工作階段啟動時不載入人格,改以一般助理身分回應並說明原因。
同一角色同時只會被一個工作階段載入,避免使用者同時與兩個相同人格對話。第二個工作階段啟動時不載入人格,改以一般助理身分回應並說明原因。該階段仍可**點名其他未被佔用的角色**接手(見「點名載入」),不必等鎖釋放。
```bash
"${ROLE_DIR}/role_sleep.sh" --unlock
@@ -437,7 +494,7 @@ ls -d "$HOME"/.claude/plugins/cache/*/jsc-generic/*/scripts/role/role_sleep.sh |
| `~/.roles/<角色 ID>.identity.md` | 角色 ID、顯示名稱、**來源作品**、**與使用者的關係定位**、簽名 emoji | `SessionStart` 注入 SOUL 區塊的身分部分 |
| `~/.roles/<角色 ID>.soul.md` | 本質(nature)、氛圍(vibe) | 同上的人格部分 |
**共用行為規則不寫入角色檔**:它由 `role_load.sh` 直接注入(實際生效處),完整內容見本文件的「共用行為」章節。過去角色檔裡也放一份,但 `role_load.sh` 從不讀它 —— 那是冗余副本,只會多一個漏同步的機會。
**共用行為規則不寫入角色檔**:它由 `role_context.sh` 直接注入(實際生效處SessionStart 載入與點名載入共用),完整內容見本文件的「共用行為」章節。過去角色檔裡也放一份,但載入腳本從不讀它 —— 那是冗余副本,只會多一個漏同步的機會。
**舊格式仍完整支援**:單一 `~/.roles/<角色 ID>.md` 可繼續使用,解析時新格式優先、找不到才退回舊檔。要拆成新格式用 `--migrate`。
@@ -448,6 +505,7 @@ ls -d "$HOME"/.claude/plugins/cache/*/jsc-generic/*/scripts/role/role_sleep.sh |
id: <角色 ID>
name: <角色顯示名稱>
emoji: <簽名 emoji>
aliases: <選填;點名用的其他叫法,以逗號分隔>
created: <yyyy/MM/dd HH:mm:ss>
updated: <yyyy/MM/dd HH:mm:ss>
---
@@ -503,6 +561,7 @@ updated: <yyyy/MM/dd HH:mm:ss>
| 來源 | 是否注入 |
| --- | --- |
| `identity` 的 frontmatter`id``name``emoji` | ✅ |
| `identity` 的 frontmatter `aliases` | ❌ 只供點名載入比對名稱,不進 context |
| `identity` 標題後、第一個 `##` 之前的**前言段落** | ✅ 常用來寫存在本質、角色原型等摘要條目 |
| `identity` 的 `## 來源``## 關係定位``## 簽名 emoji` | ✅ |
| `soul` 的 `## 本質``## 氛圍` | ✅ |
@@ -510,13 +569,13 @@ updated: <yyyy/MM/dd HH:mm:ss>
寫進角色檔的內容若未被注入就等於白寫,因此上述兩處(前言段落與自由章節)都會完整帶入 —— 曾發生使用者在人格檔補寫章節卻被靜默丟棄的情況。
**角色專屬邊界不得放寬共用行為的限制**:共用行為(由 `role_load.sh` 注入)永遠優先,角色檔只能加嚴不能放寬。
**角色專屬邊界不得放寬共用行為的限制**:共用行為(由 `role_context.sh` 注入)永遠優先,角色檔只能加嚴不能放寬。
`~/.roles/.active` 只放一行角色 ID,代表目前啟用的角色。
## 共用行為(所有角色一致,由 /jsc-generic:role 維護,請勿手動修改)
以下規則**不寫入角色檔** —— 由 `role_load.sh` 直接注入 context(實際生效處)。
以下規則**不寫入角色檔** —— 由 `role_context.sh` 直接注入 context(實際生效處SessionStart 載入與點名載入共用同一份)。
本節是它的唯一文件來源,修改注入內容時必須同步更新這裡。
<!-- JSC-ROLE-COMMON:START -->
@@ -720,3 +779,5 @@ Stop hook 會在本輪對話明確包含個人記憶保存同意或拒絕時,
| Claude Code / Antigravity | `/jsc-generic:role --new`、`/jsc-generic:role --use ENGINEER01`、`/jsc-generic:role --list`、`/jsc-generic:role --sleep`、`/jsc-generic:role --status` |
| Codex | `$role --status`,或用 `/skills` 選單;匯出可用 `$role --export /path/to/exports/` |
| OpenCode / GitHub Copilot | 需完整 plugin 目錄保留 `scripts/`OpenCode 以複製 `skills/` 安裝時不可用 |
> **切換角色不必透過本 skill**:對話中直接以名字點名(例如「西莉卡,…」或「@SILICA01 …」)即可即時換人,見「點名載入」;`--use` 只用來改「開新工作階段時的預設角色」。