Files
persona/skills/persona-status/SKILL.md
T
jiantw83andClaude Opus 5 e986686d0e feat: 人格編號(ASUNA-01)與 Gitea 儲存,依更新頻率分檔案區/Wiki 區
1. 人格編號
   - 編號 = 英文名全大寫 + 兩位索引,同名才遞增:ASUNA-01 / YUI-01 / ASUNA-02。
   - 編號同時是新人格的本機目錄名與 Gitea 存取庫名稱(`create` 不給
     --persona 就用編號當目錄名;既有小寫 slug 仍然合法,不會被鎖在門外)。
   - 中文名由 skill 提議羅馬拼音、使用者確認後帶 `--romaji` 進來;
     CLI 只吃拉丁字母,避免拼音在程式裡亂猜。
   - 新增 `code show|assign|next`;`code assign --rename` 可把既有人格的
     目錄名一併改成編號(會轉移鎖與 session 綁定)。

2. Gitea 儲存(scripts/persona-gitea.mjs)
   - 每個人格一個私有存取庫,庫名 = 編號。本機仍是工作副本,hook 每輪
     讀寫本機檔案,**同步失敗永遠不阻斷對話**。
   - 依更新頻率分區:
       檔案區(高頻)emotion / short-term / inner / said / inbox /
                     mindmap threads / journal → 每輪由 Stop hook 背景 push
       Wiki 區(低頻)IDENTITY SOUL AGENTS USER / 長期記憶 / INDEX /
                     心智圖 / 關係圖 → 固化、改身分關係、release 時 push
   - Gitea 的 wiki 只有根目錄 .md 會變成頁面(1.27 實測子目錄頁面 404),
     所以 Wiki 區攤平成 `Memory-xxx.md`,原始路徑記在 `_paths.json`,
     pull 時還原;Home 頁自動列出所有長期記憶連結。
   - 新增 `sync status|init|push|pull`;載入時先 pull,兩邊都改過同一個
     檔案就停下來不覆蓋本機,交由使用者決定。
   - push 遇到 non-fast-forward 會對齊遠端後把工作副本重新疊上去再推。
   - 認證走 http.extraHeader(GIT_CONFIG_* 環境變數),token 不寫進
     .git/config 也不進 process 參數。

3. 順帶修正
   - guard 的 `--persona` 解析原本只吃小寫,大寫編號會漏掉整個跨人格檢查。
   - pull 原本會無差別覆蓋本機檔案,本機較新但還沒 push 的內容會被蓋掉;
     改成只寫回「遠端真的改過的」與「本機缺少的」。
   - `create` 原本吞掉 Gitea 首次推送的結果,失敗是靜默的。

新增 skill:persona-sync(編號、同步、既有人格遷移、衝突處理)。
selftest 116 項全綠(新增 ⑬,含「分區不重不漏」檢查;測試強制 PERSONA_GITEA=off)。
另對真實 Gitea 跑過端對端(建庫→兩區推送→改動→拉回→release),測試用存取庫已刪除。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 01:49:27 +00:00

66 lines
3.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: persona-status
description: 查看與管理人格的載入狀態:列出所有人格、誰被哪個程序(session/cwd)鎖住、guest 租約、情緒與記憶量,並處理釋放鎖、接手死鎖、清理過期租約。當使用者問哪些人格可用、為什麼載入失敗、人格被誰佔用、想釋放或切換人格、或要清理殘留鎖時觸發。不適用於:建立人格(persona-create)、對話(persona-chat)。
---
# 🔐 persona-status — 載入狀態與鎖管理
**CLI**`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`
---
## 鎖的規則(設計上的硬約束)
1. **一個人格同時只能被一個程序 exclusive 載入**(鎖 = `state/lock.json`,以 `session_id` 為主鍵)。
2. **sub agent 不受限**:同一個 session 的 sub agent 沿用同一把鎖;
受邀人格(`jsc-persona:persona-guest`)走 guest 唯讀租約,不佔 exclusive 鎖。
3. 鎖有 **15 分鐘租約**`heartbeat_at`),每輪對話由 hook 自動續租;程序被 kill 後租約到期 → 可被接手。
鎖的擁有者是 session 而不是 process:CLI 跑完就結束,所以判定只看心跳,不看 pid。
4. 一個 session 也**只能載入一個** host 人格(要換人先 release)。
## 常用指令
```bash
# 全部人格 + 編號 + 鎖狀態 + 記憶量(`⚠ 尚無編號` 表示還沒同步到 Gitea)
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" list
# 這個人格的編號與 Gitea 存取庫
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" code show --session <PERSONA_SESSION>
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sync status --session <PERSONA_SESSION>
# 單一人格的鎖細節(owner session/cwd/心跳、guest 名單、情緒)
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" status --persona <slug>
# 本 session 載入了什麼
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" status --session <PERSONA_SESSION>
# 釋放(含所有 guest 租約)
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" release --session <PERSONA_SESSION>
# 清理死鎖與過期 guest 租約
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" gc
```
## 載入失敗怎麼判斷
| 訊息 | 意義 | 處理 |
| --- | --- | --- |
| `已被另一個程序載入` + 心跳在 15 分鐘內 | 真的有人在用 | **不要 takeover**。回報 owner 的 session/cwd 與最後心跳,請使用者決定 |
| 租約已過期(心跳超過 15 分) | 程序異常結束 | `load` 會**自動接手**並回報 `⚠ 這把鎖是接手來的`;請把這句話轉達使用者 |
| 想強行接手心跳還活著的鎖 | 兩邊會互相覆蓋記憶 | 只有使用者明確要求才加 `--takeover`,並先說明風險 |
| `正以 guest 身分參與另一個 session` | 它正在別人的聊天室裡當客人 | 請那邊先 `leave`,或等 30 分鐘租約過期 |
| `本 session 已載入人格 X` | 一程序一人格 | 先 `release` 再載入 |
| `CLI 的 --session 與本 session 不符` | 帶錯 session_id | 用上下文 `<persona-runtime>` 裡的 `PERSONA_SESSION=` 值 |
| `禁止跨人格操作` / `跨人格資料隔離` | 想碰別的人格 | 改用 `/jsc-persona:persona-invite` |
## 回報格式
```
人格倉庫:~/.claude/personas
- 🔒 `lumi` Lumisession 4f2a…, cwd ~/work,心跳 12 秒前)|長期記憶 34|短期 12
- 🔓 `shen` Shen 平靜 50/信任 38|長期記憶 8
- ⚠ `nox` 死鎖可接手(最後心跳 42 分鐘前)
```
所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。