diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index b6e732d..1541059 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-persona", - "version": "0.0.8", + "version": "0.0.9", "description": "AI 人格化記憶聊天 plugin:以 OpenClaw 相同的身分描述(IDENTITY/SOUL)建立人格(可用動漫作品+角色名上網蒐集設定),結合 hook 強制的人格載入鎖與跨人格隔離、六正向+六負向十二情緒、語意分析、短期/長期記憶與固化條件、心智圖、思維導圖與人際關係圖;可用 sub agent 邀請其他人格同場對話(劇場模式只顯示人格對話)。於 Claude Code 以 /jsc-persona: 前綴呼叫。", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 13d84c1..6cdfeb2 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-persona", - "version": "0.0.8", + "version": "0.0.9", "description": "AI 人格化記憶聊天 skills:OpenClaw 相同的人格描述 + 十二情緒 + 語意分析 + 短期/長期記憶 + 心智圖 + 人際關係圖。(人格鎖與跨人格隔離的 hook 僅在 Claude Code 生效)", "skills": "./skills" } diff --git a/README.md b/README.md index 6d623b6..2dae01e 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,49 @@ 再用 **hook 強制**的人格鎖與跨人格隔離,把 **十二情緒**、**語意分析**、 **短期/長期記憶**、**心智圖/思維導圖**、**人際關係圖** 綁在一起。 -可同時安裝於 **Claude Code、Codex、Antigravity、OpenCode**; +可同時安裝於 **Claude Code、Codex、Antigravity、OpenCode、GitHub Copilot**; skills 是共通標準,**鎖與隔離的強制執行需要 hook,目前只有 Claude Code 支援**(見「跨助理支援度」)。 +在 Claude Code 與 Antigravity 中,skill 以 **`/jsc-persona:` 前綴**呼叫(例如 `/jsc-persona:persona-chat`)。 + +--- + +## 前綴與呼叫方式 + +| 助理 | 安裝方式 | 呼叫 | `/jsc-persona:` 前綴 | +| --- | --- | --- | --- | +| Claude Code | `claude plugin`(marketplace) | `/jsc-persona:` 或自動觸發 | ✅ | +| Codex | `codex plugin`(marketplace) | `$` 或 `/skills` 選單 | ❌(用 `$name`) | +| Antigravity | `agy plugin install` | `/jsc-persona:` 或自動觸發 | ✅ | +| OpenCode | skills 目錄(複製/clone) | 描述需求自動觸發 | ❌(依名稱) | +| GitHub Copilot CLI | `copilot plugin`(marketplace) | 自然語言或 plugin skills | ❌(無 `/jsc-persona:` 前綴) | + +> Codex 不支援自訂前綴(skill 以 `$name` 呼叫);OpenCode 由模型依描述自動呼叫;Copilot CLI 透過原生 plugin 安裝後以自然語言或 plugin skills 使用。三者皆**不強制**前綴。 + +--- + +## 目錄結構 + +同一個 repo 同時帶四種 manifest,彼此以路徑隔離、互不干擾;各助理都讀同一份 `skills/`。 + +``` +persona/ +├── .claude-plugin/ +│ ├── plugin.json # Claude 外掛定義(name: "jsc-persona") +│ └── marketplace.json # Claude marketplace(name: "jsc-plugins",source 指向本 repo) +├── .codex-plugin/ +│ └── plugin.json # Codex 外掛定義(name: "jsc-persona",skills: "./skills") +├── .agents/plugins/ +│ └── marketplace.json # Codex marketplace(name: "jsc-plugins",url source 指向本 repo) +├── plugin.json # Antigravity 外掛定義(name: "jsc-persona",skills: "./skills") +├── skills/ # ★ 唯一真實來源:所有 skills(十二個 persona-*) +├── scripts/ # persona.mjs / persona-gitea.mjs / persona-icon.mjs / selftest.mjs +├── hooks/ # 六個 hook:鎖、隔離、上下文注入(只有 Claude Code 會執行) +├── agents/ # persona-guest(受邀人格)、persona-sleeper(睡眠收尾) +├── AGENTS.md # 跨助理共用指引 +└── README.md +``` + +> `scripts/` 與 `hooks/` 只有「整個 repo 安裝」的助理拿得到;OpenCode 的目錄安裝只會複製 `skills/`。 --- @@ -73,7 +114,7 @@ flowchart TB / ├── IDENTITY.md # 身分卡:Name / Creature / Gender / Vibe / Emoji / Avatar(Gender 是本 plugin 加的) ├── SOUL.md # 靈魂:Core Truths / Boundaries / Vibe / Continuity + 情緒傾向 -├── AGENTS.md # 操作規則(與個性分離) +├── AGENTS.md # 操作規則(與個性分離);SessionStart 全文注入一次,也是放「這個人格的工具箱」的地方 ├── icon.svg / icon.png # 人格圖示(由編號/名字/emoji 決定,也是 Gitea 存取庫頭像) ├── USER.md # 對使用者的畫像(事實/推測分開) ├── state/ @@ -420,7 +461,7 @@ node scripts/persona.mjs sleep --session --release # 收工 | Hook | 做什麼 | | --- | --- | -| `SessionStart` | 清死鎖、接續人格、**有設預設人格就自動載入它**(沒設就只列出可用人格)、把 `PERSONA_SESSION=` 與規則注入上下文 | +| `SessionStart` | 清死鎖、接續人格、**有設預設人格就自動載入它**(沒設就只列出可用人格)、把 `PERSONA_SESSION=` 與規則注入上下文;載入到人格時追加 ``=該人格 `AGENTS.md` 全文(開機一次,不進每輪的 ``) | | `UserPromptSubmit` | 注入 ``:身分、情緒、短期記憶、關鍵詞命中的長期記憶、相關人際關係;劇場模式時追加「只輸出人格對話」的強制規則;並記原始逐字 | | `PreToolUse` | **人格隔離與鎖驗證的唯一強制點**(deny 帶原因) | | `Stop` | 情緒隨時間衰減、續租、記錄回覆、達固化條件時提醒(劇場模式時完全靜音) | @@ -545,20 +586,27 @@ node scripts/selftest.mjs # 248 項驗證:鎖、隔離、情緒、固化 | Codex | ✅ `$` | ❌ | ⚠ 需自行以子任務模擬 | | Antigravity | ✅ `/jsc-persona:` | ❌ | ⚠ | | OpenCode | ✅ 依描述自動觸發 | ❌ | ⚠ | +| GitHub Copilot CLI | ✅ 依描述自動觸發 | ❌ | ⚠ | > 沒有 hook 的助理仍會遵守 CLI 層的檢查(`--session` 綁定、`require_owner`/`require_member`、 > guest 唯讀),但那是**自律**而非強制:真正的 deny 只有 Claude Code 的 `PreToolUse` 做得到。 --- -## 安裝 / 更新 / 移除 +## 安裝 / 更新 / 移除(各助理) > 指令中的 repo 網址換成你的:`https://gitea.jsc.idv.tw/plugins/persona.git` +> > **Claude / Codex 從 git URL 安裝(會 clone 遠端),請先把本 repo `push` 到 gitea。** +> **Antigravity 的 `agy plugin install ` 目前只支援 github.com**;gitea 請改用「clone + 本地路徑」(見 Antigravity 節)。 +> 本機/離線:Claude 可用本地路徑加 marketplace;Antigravity 用本地路徑安裝。 +> +> 本 plugin 的 marketplace 名是 **`jsc-plugins`**(不是 repo 名 `persona`),安裝 token 為 `jsc-persona@jsc-plugins`。 ### Claude Code ```bash +# 安裝 claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/persona.git claude plugin install jsc-persona@jsc-plugins @@ -568,49 +616,121 @@ claude plugin update jsc-persona@jsc-plugins # 移除 claude plugin uninstall jsc-persona@jsc-plugins +claude plugin marketplace remove jsc-plugins ``` - 工作階段內 slash 版(等價):把 `claude plugin` 換成 `/plugin`。 -- 本機開發(免 push):`claude plugin marketplace add /home/coder/plugins/persona` 後再 install。 +- 本機開發(免 push):`claude plugin marketplace add /home/coder/plugins/persona`(本地路徑)後再 install。 - 安裝後**重啟工作階段**讓 hooks 生效;用 `/hooks` 確認六個 hook 都在。 +- **呼叫**:`/jsc-persona:`(例 `/jsc-persona:persona-chat`)。 ### Codex ```bash +# 安裝 codex plugin marketplace add https://gitea.jsc.idv.tw/plugins/persona.git codex plugin add jsc-persona@jsc-plugins -codex plugin marketplace upgrade jsc-plugins # 更新 -codex plugin remove jsc-persona@jsc-plugins # 移除 + +# 更新(重新抓取 marketplace 的 git 快照) +codex plugin marketplace upgrade jsc-plugins + +# 移除 +codex plugin remove jsc-persona@jsc-plugins +codex plugin marketplace remove jsc-plugins ``` +- 安裝 token `jsc-persona@jsc-plugins` = plugin 名(`.codex-plugin/plugin.json` 的 `name`)@ marketplace 名(`.agents/plugins/marketplace.json` 的 `name`)。 +- 本 repo 的 Codex marketplace 以 `url` 來源指向自己,故 Codex **一律從 gitea 安裝**(需先 push);安裝後重啟 Codex。 +- **呼叫**:`$`(例 `$persona-chat`),或用 `/skills` 選單。 +- Codex 沒有 hook:鎖與隔離只剩 CLI 層的自律檢查。 + ### Antigravity(`agy`) -> `agy plugin install ` 目前只支援 github.com;gitea 請 clone 後用本地路徑。 +> `agy plugin install ` 目前**只支援 github.com**;gitea 等自架 git 不支援 URL 安裝,請先 `git clone` 再用**本地路徑**安裝。 ```bash +# 安裝:clone 後用本地路徑 git clone https://gitea.jsc.idv.tw/plugins/persona.git ~/plugins/persona agy plugin install ~/plugins/persona -# 更新:git -C ~/plugins/persona pull && agy plugin uninstall jsc-persona && agy plugin install ~/plugins/persona + +# 更新(agy 無 update 子指令 → git pull 後重裝) +git -C ~/plugins/persona pull +agy plugin uninstall jsc-persona +agy plugin install ~/plugins/persona + +# 移除 +agy plugin uninstall jsc-persona ``` +- 若把 skills 放到 GitHub,則可直接 `agy plugin install https://github.com//`。 +- 其他:`agy plugin list`、`agy plugin enable jsc-persona` / `disable jsc-persona`、`agy plugin validate `。安裝後重啟工作階段。 +- **呼叫**:`/jsc-persona:`(例 `/jsc-persona:persona-chat`)或依描述自動觸發。 + ### OpenCode +OpenCode 的「plugin」是 TypeScript/npm 套件,不適用於 skill 包;skills 改用**目錄安裝**。 +OpenCode 會讀 `~/.config/opencode/skills/`(也會讀 `~/.claude/skills/`、`~/.agents/skills/`)。 + ```bash +# 安裝 git clone https://gitea.jsc.idv.tw/plugins/persona.git ~/plugins/persona mkdir -p ~/.config/opencode/skills cp -r ~/plugins/persona/skills/* ~/.config/opencode/skills/ + +# 更新 +git -C ~/plugins/persona pull +cp -r ~/plugins/persona/skills/* ~/.config/opencode/skills/ + +# 移除 +rm -rf ~/.config/opencode/skills/{persona-anime,persona-chat,persona-create,persona-icon,persona-invite,persona-memory,persona-relation,persona-sleep,persona-status,persona-sync,persona-therapist,persona-transfer} ``` -> **Windows PowerShell**:`cp -r A B` → `Copy-Item A B -Recurse -Force`、`~` → `$HOME`。 +> **Windows PowerShell**:`cp -r A B` → `Copy-Item A B -Recurse -Force`、`rm -rf X` → `Remove-Item X -Recurse -Force`、`~` → `$HOME`。 -### headless 一次性執行 +- 目錄安裝**不會帶入 `scripts/` 與 `hooks/`**;`persona.mjs` 不在,等於整套狀態操作都不可用。要在 OpenCode 用本 plugin,請另外 clone 本 repo 並自行呼叫 `scripts/persona.mjs`。 +- **呼叫**:直接描述需求,模型會依 skill 描述自動透過 skill 工具呼叫。 -| 助理 | 指令 | -| --- | --- | -| Claude Code | `claude -p "/jsc-persona:persona-chat lumi"` | -| Codex | `codex exec '$persona-chat lumi'` | -| Antigravity | `agy -p "/jsc-persona:persona-chat lumi"` | -| OpenCode | `opencode run "用 lumi 這個人格跟我聊聊"` | +### GitHub Copilot CLI + +Copilot CLI 支援與 Claude Code 類似的原生 plugin / marketplace 指令,可直接從 marketplace 安裝、更新與移除本 plugin。 + +```bash +# 安裝 +copilot plugin marketplace add https://gitea.jsc.idv.tw/plugins/persona.git +copilot plugin install jsc-persona@jsc-plugins + +# 更新 +copilot plugin marketplace update jsc-plugins +copilot plugin update jsc-persona@jsc-plugins + +# 移除 +copilot plugin uninstall jsc-persona@jsc-plugins +copilot plugin marketplace remove jsc-plugins +``` + +- 安裝 token `jsc-persona@jsc-plugins` = plugin 名(plugin manifest 的 `name`)@ marketplace 名。 +- `copilot plugin marketplace add` 支援 GitHub `owner/repo`、git URL 與本地路徑;Gitea repo 可用上方 HTTPS URL。 +- Copilot CLI 沒有 hook:鎖與隔離同樣只剩 CLI 層的自律檢查。 +- **呼叫**:在 Copilot CLI 中用自然語言描述需求,例如 `copilot -i "用 lumi 這個人格跟我聊聊"`。 + +--- + +## 用 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"`。 --- diff --git a/plugin.json b/plugin.json index 264303c..14c0864 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-persona", - "version": "0.0.8", + "version": "0.0.9", "description": "AI 人格化記憶聊天 plugin:OpenClaw 相同的人格描述 + 十二情緒 + 語意分析 + 短期/長期記憶 + 心智圖 + 人際關係圖。於 Antigravity 以 /jsc-persona: 前綴呼叫。", "skills": "./skills" }