From e47f4873c7c26d94aed2faeddd441a22414049d7 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 31 Jul 2026 08:34:28 +0000 Subject: [PATCH] =?UTF-8?q?feat(skills):=20=E6=96=B0=E5=A2=9E=20plugins-in?= =?UTF-8?q?stall=20=E8=88=87=20plugins-uninstall=EF=BC=8C=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E6=93=8D=E4=BD=9C=E6=89=80=E6=9C=89=20JSC=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `plugins-install` 一次安裝或更新 jsc-code、jsc-doc、jsc-persona:先盤點每個 plugin 已安裝或未安裝,未安裝就安裝、已安裝就更新到最新,最後以表格回報動作、 結果與版本。不含 jsc-generic 自己(它是這兩個 skill 的所在地)。 `plugins-uninstall` 一次移除四個 JSC plugin:動手前先列出將被移除的項目與 不會被碰的資料請使用者確認,移除順序固定把 jsc-generic 放最後。人格倉庫、 ~/.roles、~/.memory 與 Gitea 存取庫一律不刪。 兩個 skill 都涵蓋 Claude Code、Codex、GitHub Copilot CLI、Antigravity 四家 原生 plugin CLI,OpenCode 走複製/逐一刪除 skills 目錄(不用萬用字元,避免 掃到別處裝的 skill)。 同時附帶:README 補上 Skills 目錄與適用範圍、三份 manifest 的 description 補述新能力,並依 spec-plugin-version 把三家 manifest 版號一起升到 0.1.6 (master 現行為 0.1.5)。 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 4 +- .codex-plugin/plugin.json | 4 +- README.md | 17 ++- plugin.json | 4 +- skills/plugins-install/SKILL.md | 184 ++++++++++++++++++++++++++++++ skills/plugins-uninstall/SKILL.md | 167 +++++++++++++++++++++++++++ 7 files changed, 374 insertions(+), 8 deletions(-) create mode 100644 skills/plugins-install/SKILL.md create mode 100644 skills/plugins-uninstall/SKILL.md diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 168e777..ca3dec1 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -8,7 +8,7 @@ { "name": "jsc-generic", "source": "./", - "description": "JSC 共用規範 skills(跨 AI 助理)" + "description": "JSC 共用規範 skills(跨 AI 助理),另含整組 plugin 的安裝管理 plugins-install / plugins-uninstall" } ] } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 123f1ed..0f4cce3 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "jsc-generic", - "version": "0.1.5", - "description": "JSC 跨 AI 助理共用規範 plugin(Claude Code / Codex / Antigravity / OpenCode)。所有 skills 以 SKILL.md 為共通標準,於 Claude Code 以 /jsc-generic: 前綴呼叫。", + "version": "0.1.6", + "description": "JSC 跨 AI 助理共用規範 plugin(Claude Code / Codex / GitHub Copilot CLI / Antigravity / OpenCode),並提供整組 plugin 的安裝管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona,plugins-uninstall 一次移除四個 JSC plugin)。所有 skills 以 SKILL.md 為共通標準,於 Claude Code 以 /jsc-generic: 前綴呼叫。", "skills": "./skills", "author": { "name": "JSC" diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 025664d..b1c9da3 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-generic", - "version": "0.1.5", - "description": "JSC 跨 AI 助理共用規範 plugin。所有 skills 以 SKILL.md 為共通標準。", + "version": "0.1.6", + "description": "JSC 跨 AI 助理共用規範 plugin,並提供整組 plugin 的安裝管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona,plugins-uninstall 一次移除四個 JSC plugin)。所有 skills 以 SKILL.md 為共通標準。", "skills": "./skills" } diff --git a/README.md b/README.md index 63ff451..9534e77 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,16 @@ generic/ │ └── role/ # role skill 的可執行元件(腳本一律不放進 skills/) ├── skills/ # ★ 唯一真實來源:所有 skills │ ├── spec-*/SKILL.md # 共用規範 skills(一規範一目錄) +│ ├── plugins-install/ # 一次安裝/更新 jsc-code、jsc-doc、jsc-persona +│ ├── plugins-uninstall/ # 一次移除 jsc-code、jsc-doc、jsc-persona、jsc-generic │ └── role/SKILL.md # 角色人格與長期記憶 ├── AGENTS.md # 跨助理共用指引 └── README.md ``` > generic 的定位是「**共用規範**」:`skills/spec-*` 是 code/doc plugins 共用的流程與安全規範。工作紀錄自動化 `worklog` 已移到 `doc` plugin。 -> 例外是 `role`:它是跨助理共用的**角色與記憶**能力,帶 `hooks/` 與 `scripts/`,適用範圍見下方「元件對各助理的適用範圍」。 +> 例外有兩類:`role` 是跨助理共用的**角色與記憶**能力,帶 `hooks/` 與 `scripts/`,適用範圍見下方「元件對各助理的適用範圍」; +> `plugins-install`/`plugins-uninstall` 是**整組 plugin 的安裝管理**,一次處理所有 JSC plugin,不必逐個 repo 翻 README。 --- @@ -210,6 +213,17 @@ copilot plugin marketplace remove generic | `spec-doc-funcs-handoff` | 文件化串接 | code 類 skill 完成後完整執行 /jsc-doc:funcs 的標準流程與統一時間戳 | | `spec-plugin-version` | 版號規則 | 三 manifest 同步 bump、以 master 為基準計算同一 PR 的最終版本、新 plugin 首發 0.0.1、patch 到 9 後進位 minor、chore(plugin 版本) commit | +### 整組 plugin 安裝管理 + +一次操作所有 JSC plugin,不必逐個 repo 翻 README 的安裝章節。四家原生 plugin CLI(`claude`/`codex`/`copilot`/`agy`)都支援,OpenCode 走複製/刪除 skills 目錄。 + +| Skill | 用途 | 使用方法 | +| --- | --- | --- | +| `plugins-install` | 一次**安裝或更新** `jsc-code`、`jsc-doc`、`jsc-persona`:先盤點每個 plugin 已安裝或未安裝,未安裝就安裝、已安裝就更新到最新,最後以表格回報動作、結果與版本。Antigravity 走「clone + 本地路徑」,OpenCode 走複製 `skills/` | `/jsc-generic:plugins-install`;可帶 `--assistant claude\|codex\|copilot\|agy\|opencode`、`--plugins code,doc,persona`、`--host `、`--clone-dir <目錄>`、`--yes` | +| `plugins-uninstall` | 一次**移除** `jsc-code`、`jsc-doc`、`jsc-persona`、`jsc-generic`:動手前先列出將被移除的項目與不會被碰的資料請使用者確認,移除順序固定把 `jsc-generic` 放最後(本 skill 就住在裡面)。人格倉庫與記憶目錄一律不刪 | `/jsc-generic:plugins-uninstall`;可帶 `--assistant …`、`--plugins code,doc,persona,generic`、`--keep-marketplace`、`--keep-clone`、`--yes` | + +> `plugins-install` **不處理 `jsc-generic` 自己**(它是這兩個 skill 的所在地);`plugins-uninstall` 則會,而且放在最後一步。 + ### 角色與記憶 | Skill | 用途 | 使用方法 | @@ -229,6 +243,7 @@ copilot plugin marketplace remove generic | 元件 | Claude Code | Codex | Antigravity | OpenCode | GitHub Copilot | | --- | --- | --- | --- | --- | --- | | `skills/spec-*`(純規範) | ✅ | ✅ | ✅ | ✅ | ✅ | +| `skills/plugins-install`、`plugins-uninstall` | ✅ | ✅ | ✅ | ⚠️ 只能操作 OpenCode 自己 | ✅ | | `skills/role` 的手動模式 | ✅ | ⚠️ 需保留 `scripts/` | ⚠️ 同左 | ❌ 只複製 `skills/` | ⚠️ 同左 | | `hooks/hooks.json`:`SessionStart` 載入角色 | ✅ | ⚠️ 需該版本支援 | ❌ | ❌ | ❌ | | `hooks/hooks.json`:`UserPromptSubmit` 點名載入 | ✅ | ⚠️ 需該版本支援 | ❌ | ❌ | ❌ | diff --git a/plugin.json b/plugin.json index b19573e..310f54e 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-generic", - "version": "0.1.5", - "description": "JSC 跨 AI 助理共用規範 plugin。所有 skills 以 SKILL.md 為共通標準;於 Antigravity 以 /jsc-generic: 前綴呼叫。", + "version": "0.1.6", + "description": "JSC 跨 AI 助理共用規範 plugin,並提供整組 plugin 的安裝管理(plugins-install 一次安裝或更新 jsc-code/jsc-doc/jsc-persona,plugins-uninstall 一次移除四個 JSC plugin)。所有 skills 以 SKILL.md 為共通標準;於 Antigravity 以 /jsc-generic: 前綴呼叫。", "skills": "./skills/" } diff --git a/skills/plugins-install/SKILL.md b/skills/plugins-install/SKILL.md new file mode 100644 index 0000000..8172d4a --- /dev/null +++ b/skills/plugins-install/SKILL.md @@ -0,0 +1,184 @@ +--- +name: plugins-install +description: 一次把 JSC 的三個 plugin(jsc-code/jsc-doc/jsc-persona)安裝或更新到目前的 AI 助理,支援 Claude Code、Codex、GitHub Copilot CLI、Antigravity 四家原生 plugin CLI,OpenCode 則以複製 skills 目錄處理;每個 plugin 先判斷已安裝或未安裝,未安裝就安裝、已安裝就更新到最新,最後以表格回報每個 plugin 的結果與版本。當使用者說要安裝所有 jsc plugin、一次更新全部 skill 套件、把 code/doc/persona 都裝起來、換新機器要把 plugin 都補齊、或問怎麼一次更新所有 plugin 時觸發。不適用於:移除 plugin(用 /jsc-generic:plugins-uninstall)、只處理單一 plugin(直接照該 plugin README 的安裝章節)、安裝非 JSC 的第三方 plugin。 +argument-hint: "[--assistant claude|codex|copilot|agy|opencode] [--plugins code,doc,persona] [--host ] [--clone-dir <目錄>] [--yes]" +--- + +# plugins-install — 一次安裝/更新所有 JSC plugin + +四階段 skill:先**決定助理與目標清單**,再**逐一判斷已安裝或未安裝**,接著**安裝或更新**,最後**回報結果並提醒重啟工作階段**。 + +| 階段 | 動作 | +| --- | --- | +| A. 前置設定 | 決定要操作哪個助理(`--assistant`/偵測目前執行環境/詢問)→ 決定 gitea 主機 → 決定 plugin 清單(預設 code、doc、persona) | +| B. 現況盤點 | 對每個 plugin 查詢 marketplace 與 plugin 是否已存在,決定「安裝」或「更新」 | +| C. 安裝/更新 | 依助理的原生指令逐一執行;Antigravity 與 OpenCode 走 clone/複製路徑 | +| D. 回報 | 以表格列出每個 plugin 的動作、結果與版本,並提醒重啟工作階段 | + +--- + +## 共用規範(generic plugin,必要前置) + +執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守: + +- `/jsc-generic:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼、表格呈現。 +- `/jsc-generic:spec-execution`:自動執行原則(必要決策才中斷)、不臆測/需人工確認。 +- `/jsc-generic:spec-git-safety`:Antigravity/OpenCode 路徑會動到本機 clone,**工作區有未提交變更時不得強制更新**。 + +本 skill 特有補充: + +- **不移除任何東西**。更新時就算需要「先移除再安裝」(Antigravity 沒有 update 子指令),也只針對該 plugin 自己,且移除後必須立刻重裝成功。 +- **必要決策**(會中斷詢問):無法判斷目前是哪個助理、指定的助理 CLI 不存在、本機 clone 有未提交變更、安裝失敗且原因需要使用者裁示。 +- **本 skill 不處理 `jsc-generic` 自己**:它是本 skill 的所在地,安裝它請直接照 generic 的 README。 + +--- + +## 參數 + +- `--assistant claude|codex|copilot|agy|opencode`:指定要操作的助理。**省略時**依階段 A1 判斷。 +- `--plugins code,doc,persona`:要處理的 plugin(以逗號分隔,用 repo 短名)。**省略時預設三個全做**。 +- `--host `:gitea 主機,省略時預設 `gitea.jsc.idv.tw`。 +- `--clone-dir <目錄>`:Antigravity/OpenCode 的本機 clone 根目錄,**省略時預設 `~/plugins`**。 +- `--yes`:全自動,不做確認式詢問(必要決策仍會中斷)。 + +--- + +## plugin 對照表(安裝識別的唯一依據) + +| repo 短名 | plugin 名 | marketplace 名 | 安裝 token | repo 網址 | +| --- | --- | --- | --- | --- | +| `code` | `jsc-code` | `code` | `jsc-code@code` | `https:///plugins/code.git` | +| `doc` | `jsc-doc` | `doc` | `jsc-doc@doc` | `https:///plugins/doc.git` | +| `persona` | `jsc-persona` | `jsc-plugins` | `jsc-persona@jsc-plugins` | `https:///plugins/persona.git` | + +> **`persona` 的 marketplace 名不是 repo 名**(是 `jsc-plugins`)。指令一律照這張表帶,不要用 repo 短名去猜。 + +各 plugin 帶入的 skill 目錄(OpenCode 路徑會用到): + +| repo 短名 | skill 目錄 | +| --- | --- | +| `code` | `action-composite`、`action-docker`、`action-node`、`image`、`issues`、`nuget`、`review-resolve`、`sync` | +| `doc` | `docker`、`funcs`、`issues-analyze`、`issues-analyze-to-file`、`issues-sync`、`worklog` | +| `persona` | `persona-anime`、`persona-chat`、`persona-create`、`persona-icon`、`persona-invite`、`persona-memory`、`persona-relation`、`persona-sleep`、`persona-status`、`persona-sync`、`persona-therapist`、`persona-transfer` | + +--- + +## 階段 A:前置設定 + +### A1. 決定助理 + +依序判斷,**第一個成立的就採用**: + +1. 有帶 `--assistant` → 直接採用。 +2. 目前正在執行本 skill 的助理可自我辨識(例如 Claude Code 的 `/plugin` 指令可用)→ 採用自己。 +3. 逐一檢查哪些 CLI 存在(`command -v claude codex copilot agy opencode`)→ 只有一個就採用;**有多個就列出來問使用者**。 +4. 一個都沒有 → 回報「找不到任何支援的助理 CLI」並停止。 + +### A2. 決定 gitea 主機與 clone 根目錄 + +- 主機:`--host` → `$GITEA_HOST` → 預設 `gitea.jsc.idv.tw`。 +- clone 根目錄(只有 `agy`/`opencode` 用得到):`--clone-dir` → 預設 `~/plugins`。目錄不存在就建立。 + +### A3. 決定 plugin 清單 + +`--plugins` 指定則照它,否則 `code,doc,persona` 三個都做。清單中出現對照表以外的名稱 → 回報並略過該項,其餘照做。 + +--- + +## 階段 B:現況盤點 + +對清單中每個 plugin,先查現況再決定動作(**先查再做,不要盲目重裝**): + +| 助理 | 查詢指令 | 判定 | +| --- | --- | --- | +| Claude Code | `claude plugin marketplace list`、`claude plugin list` | 兩者都有 → 更新;缺 marketplace → 先 add;缺 plugin → install | +| Codex | `codex plugin marketplace list`、`codex plugin list` | 同上 | +| GitHub Copilot CLI | `copilot plugin marketplace list`、`copilot plugin list` | 同上 | +| Antigravity | `agy plugin list`,並看 `/` 是否存在 | 目錄在且已安裝 → 更新;否則安裝 | +| OpenCode | 看 `~/.config/opencode/skills/` 底下是否已有該 plugin 的 skill 目錄 | 有 → 更新(覆蓋複製);沒有 → 安裝 | + +指令不存在或子指令不被支援(舊版 CLI)時,**不要中斷整批**:記下該 plugin 為「跳過(CLI 不支援)」,繼續下一個,最後在階段 D 一起回報。 + +--- + +## 階段 C:安裝/更新 + +以下 ``、``、``、`` 一律取自對照表。 + +### Claude Code + +```bash +# 安裝(marketplace 尚未加入) +claude plugin marketplace add +claude plugin install + +# 更新(已安裝) +claude plugin marketplace update +claude plugin update +``` + +### Codex + +```bash +# 安裝 +codex plugin marketplace add +codex plugin add + +# 更新(重新抓取 marketplace 的 git 快照) +codex plugin marketplace upgrade +``` + +### GitHub Copilot CLI + +```bash +# 安裝 +copilot plugin marketplace add +copilot plugin install + +# 更新 +copilot plugin marketplace update +copilot plugin update +``` + +### Antigravity(`agy`) + +> `agy plugin install ` 目前只支援 github.com;gitea 一律走「clone + 本地路徑」。`agy` 沒有 update 子指令,更新=`git pull` 後重裝。 + +```bash +# 安裝 +git clone / +agy plugin install / + +# 更新 +git -C / pull --ff-only +agy plugin uninstall +agy plugin install / +``` + +- `git pull --ff-only` 失敗(本機有未提交變更或分支分岔)→ **停在該 plugin**,回報現況讓使用者裁示,不得 `reset --hard`/`clean`,其餘 plugin 照常繼續。 + +### OpenCode + +> OpenCode 的 plugin 是 npm 套件,不適用 skill 包;改用目錄安裝。**只會帶入 `skills/`,`scripts/` 與 `hooks/` 不會進去**——`jsc-persona` 依賴 `scripts/persona.mjs`,以此方式安裝等於只有說明書、沒有工具,安裝前要先告知使用者。 + +```bash +git clone / # 已存在則 git -C / pull --ff-only +mkdir -p ~/.config/opencode/skills +cp -r //skills/* ~/.config/opencode/skills/ +``` + +> **Windows PowerShell**:`cp -r A B` → `Copy-Item A B -Recurse -Force`、`~` → `$HOME`。 + +--- + +## 階段 D:回報 + +以表格回報,一個 plugin 一列: + +| plugin | 動作 | 結果 | 版本 | +| --- | --- | --- | --- | +| `jsc-code` | 安裝/更新/跳過 | ✅ 成功/⚠ 需處理/❌ 失敗 | 例 `0.0.2` | + +- 版本取自該 plugin 的 `plugin.json`;拿不到就寫「未知」。 +- 有任何一列不是 ✅ → 在表格下方逐項說明原因與建議動作。 +- 最後固定提醒:**安裝或更新後要重啟工作階段**才會生效;`jsc-persona` 在 Claude Code 還要用 `/hooks` 確認六個 hook 都在。 diff --git a/skills/plugins-uninstall/SKILL.md b/skills/plugins-uninstall/SKILL.md new file mode 100644 index 0000000..93ea0d8 --- /dev/null +++ b/skills/plugins-uninstall/SKILL.md @@ -0,0 +1,167 @@ +--- +name: plugins-uninstall +description: 一次把 JSC 的四個 plugin(jsc-code/jsc-doc/jsc-persona/jsc-generic)從目前的 AI 助理移除,支援 Claude Code、Codex、GitHub Copilot CLI、Antigravity 四家原生 plugin CLI,OpenCode 則刪除先前複製進去的 skill 目錄;移除順序固定把 jsc-generic 放到最後(本 skill 就住在裡面,移除後即失效),並在動手前列出將被移除的項目與會受影響的本機資料讓使用者確認。當使用者說要移除所有 jsc plugin、把 skill 套件整組解除安裝、清掉 code/doc/persona/generic、重灌前先卸載、或問怎麼一次移除全部 plugin 時觸發。不適用於:安裝或更新(用 /jsc-generic:plugins-install)、只移除單一 plugin(直接照該 plugin README 的移除章節)、刪除人格資料或 Gitea 上的存取庫。 +argument-hint: "[--assistant claude|codex|copilot|agy|opencode] [--plugins code,doc,persona,generic] [--keep-marketplace] [--keep-clone] [--yes]" +--- + +# plugins-uninstall — 一次移除所有 JSC plugin + +四階段 skill:先**決定助理與目標清單**,再**列出將被移除的項目並確認**,接著**依固定順序移除**,最後**回報結果與殘留物**。 + +| 階段 | 動作 | +| --- | --- | +| A. 前置設定 | 決定要操作哪個助理(`--assistant`/偵測目前執行環境/詢問)→ 決定 plugin 清單(預設四個全移) | +| B. 盤點與確認 | 列出實際已安裝的項目、會一併移除的 marketplace 與本機 clone、以及**不會**被碰的資料,請使用者確認 | +| C. 移除 | 依 `code` → `doc` → `persona` → `generic` 的順序逐一移除 | +| D. 回報 | 表格回報每個 plugin 的結果,並列出刻意保留的殘留物 | + +--- + +## 共用規範(generic plugin,必要前置) + +執行本 skill 前,先以 Skill 工具載入下列共用規範並全程遵守: + +- `/jsc-generic:spec-output`:繁體中文(台灣用語)、UTF-8(不含 BOM)無亂碼、表格呈現。 +- `/jsc-generic:spec-execution`:自動執行原則(必要決策才中斷)、不臆測/需人工確認。 +- `/jsc-generic:spec-git-safety`:不破壞既有工作——本機 clone 只在使用者明確同意時刪除,且**有未提交變更就一律保留**。 + +本 skill 特有補充: + +- **移除是不可逆的動作**:階段 B 的確認是**必要決策**,除非帶 `--yes`,否則一定要問過才動手。 +- **絕不刪除使用者資料**:`~/.claude/personas/`(人格倉庫)、`~/.roles/`、`~/.memory/`(角色與記憶)一律不動,Gitea 上的存取庫也不動。要清這些請使用者自己來。 +- **順序不可調換**:`jsc-generic` 一定最後移除。它是本 skill 的所在地,移除後本 skill 隨之失效,後面的步驟會執行不到。 + +--- + +## 參數 + +- `--assistant claude|codex|copilot|agy|opencode`:指定要操作的助理。**省略時**依階段 A1 判斷。 +- `--plugins code,doc,persona,generic`:要移除的 plugin(以逗號分隔,用 repo 短名)。**省略時預設四個全移**。 +- `--keep-marketplace`:只移除 plugin,保留 marketplace 登錄(之後要重裝比較快)。 +- `--keep-clone`:保留 Antigravity/OpenCode 用的本機 clone 目錄(**預設就是保留**,此旗標僅用於明示)。要刪除本機 clone 必須由使用者在階段 B 明確同意。 +- `--yes`:跳過階段 B 的確認(其他必要決策仍會中斷)。 + +--- + +## plugin 對照表(移除識別的唯一依據) + +| repo 短名 | plugin 名 | marketplace 名 | 移除 token | +| --- | --- | --- | --- | +| `code` | `jsc-code` | `code` | `jsc-code@code` | +| `doc` | `jsc-doc` | `doc` | `jsc-doc@doc` | +| `persona` | `jsc-persona` | `jsc-plugins` | `jsc-persona@jsc-plugins` | +| `generic` | `jsc-generic` | `generic` | `jsc-generic@generic` | + +> **`persona` 的 marketplace 名不是 repo 名**(是 `jsc-plugins`)。移除 marketplace 時特別注意別誤刪別的登錄。 + +各 plugin 帶入的 skill 目錄(OpenCode 路徑會用到): + +| repo 短名 | skill 目錄 | +| --- | --- | +| `code` | `action-composite`、`action-docker`、`action-node`、`image`、`issues`、`nuget`、`review-resolve`、`sync` | +| `doc` | `docker`、`funcs`、`issues-analyze`、`issues-analyze-to-file`、`issues-sync`、`worklog` | +| `persona` | `persona-anime`、`persona-chat`、`persona-create`、`persona-icon`、`persona-invite`、`persona-memory`、`persona-relation`、`persona-sleep`、`persona-status`、`persona-sync`、`persona-therapist`、`persona-transfer` | +| `generic` | `role`、`plugins-install`、`plugins-uninstall`、`spec-action-params`、`spec-doc-funcs-handoff`、`spec-dockerfile`、`spec-execution`、`spec-gitea`、`spec-git-safety`、`spec-output`、`spec-plugin-version`、`spec-project-board`、`spec-time-log` | + +> OpenCode 是**逐一刪除上表的 skill 目錄**,不可用萬用字元一次掃掉整個 `skills/`——那裡可能還有別處裝進去的 skill。 + +--- + +## 階段 A:前置設定 + +### A1. 決定助理 + +依序判斷,**第一個成立的就採用**: + +1. 有帶 `--assistant` → 直接採用。 +2. 目前正在執行本 skill 的助理可自我辨識 → 採用自己。 +3. 逐一檢查哪些 CLI 存在(`command -v claude codex copilot agy opencode`)→ 只有一個就採用;**有多個就列出來問使用者**。 +4. 一個都沒有 → 回報「找不到任何支援的助理 CLI」並停止。 + +### A2. 決定 plugin 清單 + +`--plugins` 指定則照它,否則四個全做。無論使用者怎麼排,**實際執行順序一律重排為 `code` → `doc` → `persona` → `generic`**。 + +--- + +## 階段 B:盤點與確認 + +先查出實際狀態(`claude plugin list`/`codex plugin list`/`copilot plugin list`/`agy plugin list`,或 OpenCode 的 skills 目錄),再列出三張清單給使用者看: + +1. **會被移除**:已安裝的 plugin、以及(未帶 `--keep-marketplace` 時)對應的 marketplace 登錄。 +2. **本機 clone**:`agy`/`opencode` 用的 clone 目錄路徑與是否有未提交變更;**預設保留**,要刪請使用者明確說。 +3. **不會被碰**:`~/.claude/personas/`(人格:身分、情緒、記憶、關係圖)、`~/.roles/`、`~/.memory/`、Gitea 上的所有存取庫。 + +清單裡沒有任何已安裝項目 → 直接回報「沒有可移除的項目」並結束。 + +未帶 `--yes` 時,**在這裡停下來等使用者確認**再進入階段 C。 + +--- + +## 階段 C:移除 + +以下 ``、``、`` 一律取自對照表;帶 `--keep-marketplace` 時略過 `marketplace remove` 那行。 + +### Claude Code + +```bash +claude plugin uninstall +claude plugin marketplace remove +``` + +- 移除後檢查 `~/.claude/settings.json` 的 `enabledPlugins`,**清掉該 plugin 的殘留鍵**(留著會讓下次安裝的狀態對不上)。 + +### Codex + +```bash +codex plugin remove +codex plugin marketplace remove +``` + +### GitHub Copilot CLI + +```bash +copilot plugin uninstall +copilot plugin marketplace remove +``` + +### Antigravity(`agy`) + +```bash +agy plugin uninstall +``` + +- 本機 clone(`~/plugins/` 之類)**預設保留**;使用者在階段 B 明確同意才刪,且該目錄有未提交變更時一律保留並回報。 + +### OpenCode + +逐一刪除該 plugin 帶入的 skill 目錄(照上表,不用萬用字元): + +```bash +rm -rf ~/.config/opencode/skills/{<該 plugin 的 skill 目錄,以逗號分隔>} +``` + +> **Windows PowerShell**:`rm -rf X` → `Remove-Item X -Recurse -Force`、`~` → `$HOME`。 + +### `jsc-generic` 的收尾 + +移除 `jsc-generic` 是**最後一步**。動手前先在輸出裡寫清楚: + +- 本 skill 與所有 `spec-*` 共用規範會一起消失;`jsc-code`/`jsc-doc` 的 skill 內文都會引用 `spec-*`,若它們還留著,之後執行會載入不到共用規範。 +- 要重新安裝,得直接照 generic 的 README(那時已經沒有 `/jsc-generic:plugins-install` 可用了): + `claude plugin marketplace add https://gitea.jsc.idv.tw/plugins/generic.git` → `claude plugin install jsc-generic@generic`。 + +--- + +## 階段 D:回報 + +以表格回報,一個 plugin 一列: + +| plugin | 動作 | 結果 | 備註 | +| --- | --- | --- | --- | +| `jsc-code` | 移除/跳過(未安裝) | ✅ 成功/⚠ 需處理/❌ 失敗 | 例:marketplace 已保留 | + +表格下方固定列出: + +- **刻意保留的殘留物**:本機 clone 路徑、marketplace 登錄(若帶了 `--keep-marketplace`)、人格倉庫與記憶目錄。 +- **重啟提醒**:移除後要重啟工作階段,指令與 skill 才會真正消失。 -- 2.53.0