--- 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 都在。