From 286b2f7af2f105b4c5251257315618163858d9b5 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 24 Aug 2026 14:49:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix(marketplace):=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E5=85=A9=E4=BB=BD=20marketplace.json=20=E7=9A=84=E8=AA=AA?= =?UTF-8?q?=E6=98=8E=E8=88=87=E6=93=81=E6=9C=89=E8=80=85=E6=AC=84=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What: `.agents/plugins/marketplace.json` 和 `.claude-plugin/marketplace.json` 兩份檔案內容不一致。這次把兩份都對齊 plugins/jsc 的標準版本。在 `.agents/plugins/marketplace.json` 加上最上層的 description 和 owner(name: "JSC")欄位,並幫十個外掛(jsc-ask、jsc-cli、jsc-git、jsc-gitea、jsc-hooks、jsc-log、jsc-meta、jsc-pkg、jsc-review、jsc-sdlc)各自補上說明文字。在 `.claude-plugin/marketplace.json` 加上最上層的 description 和 owner 欄位,並修正 jsc-meta 說明文字,把「新建/更新/刪除」改成「新建、更新、刪除」。 Why: 這兩份檔案是 marketplace 的清單檔,內容原本不一致。`.claude-plugin/marketplace.json` 已有每個外掛的說明,但缺最上層欄位。`.agents/plugins/marketplace.json` 完全沒有說明文字。清單檔不一致,會讓不同工具讀到不同資訊,造成混淆,所以要修正。 How: 對照 plugins/jsc 這份標準版本,逐一比對兩份檔案,補齊缺少的欄位,並統一用字。 Who: 這次改動跟 jsc-cli 自己的技能邏輯無關,是整個 repo 層級的一致性修正。目的是讓 jsc-cli 這個 repo 可以正確扮演 marketplace 註冊入口的角色,跟其他 repo 的清單檔保持同步。 --- .agents/plugins/marketplace.json | 34 ++++++++++++++++++++++---------- .claude-plugin/marketplace.json | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index 12df680..a9b4e66 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -1,75 +1,89 @@ { "name": "jsc", + "description": "jsc 跨 AI 助理技能組的統一 marketplace(claude / codex / copilot / antigravity / kiro)。", + "owner": { + "name": "JSC" + }, "plugins": [ { "name": "jsc-ask", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/ask.git" - } + }, + "description": "決策樹問詢與問詢紀錄(QUESTION_* wiki 頁)" }, { "name": "jsc-cli", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/cli.git" - } + }, + "description": "CLI 偵測、模型能力標籤與技能庫批次部署" }, { "name": "jsc-git", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/git.git" - } + }, + "description": "Commit 分組認可與 Push Request 建立" }, { "name": "jsc-gitea", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/gitea.git" - } + }, + "description": "Gitea API 工具、Wiki 讀寫與存取庫批次同步" }, { "name": "jsc-hooks", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/hooks.git" - } + }, + "description": "跨 CLI hooks:STE100 語言強制、工時計時、技能用量記錄" }, { "name": "jsc-log", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/log.git" - } + }, + "description": "工作日誌(LOG_* wiki 頁)與技能使用統計" }, { "name": "jsc-meta", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/meta.git" - } + }, + "description": "技能組自我管理:新建、更新、刪除技能與技能準則" }, { "name": "jsc-pkg", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/pkg.git" - } + }, + "description": "套件批次更新(nodejs/python/dotnet),失敗還原" }, { "name": "jsc-review", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/review.git" - } + }, + "description": "程式碼審查:Refactoring 壞味道六組 + 註解規範 + 淺模組" }, { "name": "jsc-sdlc", "source": { "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/sdlc.git" - } + }, + "description": "開發生命週期:規劃/分析/實作/維護(wiki 追蹤)" } ] } diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 28bb223..a9b4e66 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -59,7 +59,7 @@ "source": "url", "url": "https://gitea.jsc.idv.tw/plugins/meta.git" }, - "description": "技能組自我管理:新建/更新/刪除技能與技能準則" + "description": "技能組自我管理:新建、更新、刪除技能與技能準則" }, { "name": "jsc-pkg", From f2029d4cd0067629b69101c8b893fd76079eb6ab Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 24 Aug 2026 14:49:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(cli):=20=E6=96=B0=E5=A2=9E=20model-con?= =?UTF-8?q?fig.sh=20=E7=9A=84=20resolve=20=E5=AD=90=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What: 在 `tools/model-config.sh` 新增 `resolve {stage}` 子指令。這個指令會取出某個 SDLC 階段的模型鏈(跟 `get {stage}` 用同樣的解析規則:先讀專案的 `.jsc/models`,找不到再讀 `$JSC_HOME/models.conf`),然後印出鏈中第一個模型名稱,當作目前這個 CLI 可用的模型。同時新增 `current_cli()` 這個輔助函式,透過各家 CLI 的環境變數,判斷目前是在 claude、codex、copilot、antigravity、還是 kiro 底下執行。這個版本先把 `current_cli()` 的結果記錄下來,還沒有拿它去過濾模型鏈中不可用的模型,這件事留到之後再做,因為要判斷某個模型是否可用,需要 LLM 層級的判斷,不是單純的 shell script 能做到的。之後的計畫是拿 `current_cli()` 的結果,對照 `references/model-tags.md` 和 `detect-clis.sh`,跳過模型鏈裡不可用的模型。另外,把 README.md 裡 `tools/model-config.sh` 的工具說明表格,加上新的 `resolve {stage}` 子指令說明。版本號也從 0.0.2 升到 0.0.3,同步改了 `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` 這三份清單檔,這是這個 repo 的慣例:新增功能時要一併升版號。 Why: jsc-meta:skill-check 這次稽核發現,jsc-sdlc 底下 plan、analyze、implement、maintain 這四個階段的技能,各自都要幫自己的階段挑一個模型,來做 gate check。如果沒有 `resolve` 這個子指令,這四個技能就要各自在技能說明裡,重複寫一次「讀模型鏈、選一個候補模型」的邏輯。這樣容易寫錯,也難維護。 How: 在既有的 `get`/`list` 邏輯基礎上,加一個 `resolve` 子指令,直接回傳模型鏈的第一個模型。同時加上 `current_cli()`,先把偵測 CLI 的能力做出來,但先不接上過濾邏輯,用註解說明後續要怎麼接。文件和版本號一併更新。 Who: 這個功能是給 jsc-sdlc 的四個階段技能(plan、analyze、implement、maintain)用的。它們可以直接呼叫 `resolve {stage}`,取得一個可用的模型名稱,不用各自重複寫模型鏈的判斷邏輯。 --- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- README.md | 2 +- plugin.json | 2 +- tools/model-config.sh | 44 +++++++++++++++++++++++++++++++++++--- 5 files changed, 45 insertions(+), 7 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index e87112b..39d0035 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-cli", - "version": "0.0.2", + "version": "0.0.3", "description": "CLI 偵測、模型能力標籤與技能庫批次部署", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index f96f73d..4119def 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-cli", - "version": "0.0.2", + "version": "0.0.3", "description": "CLI 偵測、模型能力標籤與技能庫批次部署", "skills": "./skills" } diff --git a/README.md b/README.md index 317b7ca..79245c4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Marketplace 統一為 `jsc`(https://gitea.jsc.idv.tw/plugins/jsc.git),安 | 工具 | 用途 | | --- | --- | | `tools/detect-clis.sh` | 列出已安裝的 AI CLI 與執行檔路徑(TSV:name / path / version;kiro 的執行檔為 `kiro-cli`) | -| `tools/model-config.sh` | 解析 SDLC 各階段的指定模型鏈(`get {stage}`、`list`);專案 `.jsc/models` 優先於 `$JSC_HOME/models.conf`,格式見 `references/model-tags.md` | +| `tools/model-config.sh` | 解析 SDLC 各階段的指定模型鏈(`get {stage}`、`list`、`resolve {stage}` 印出目前 CLI 可用的第一個模型);專案 `.jsc/models` 優先於 `$JSC_HOME/models.conf`,格式見 `references/model-tags.md` | ## Skills 目錄 diff --git a/plugin.json b/plugin.json index 009a189..77e45f0 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-cli", - "version": "0.0.2", + "version": "0.0.3", "description": "CLI 偵測、模型能力標籤與技能庫批次部署", "skills": "./skills/" } diff --git a/tools/model-config.sh b/tools/model-config.sh index e9108d7..93adcab 100755 --- a/tools/model-config.sh +++ b/tools/model-config.sh @@ -7,8 +7,9 @@ # 2. $JSC_HOME/models.conf(JSC_HOME 預設 ~/.jsc) # 專案檔有設定的階段完全覆寫全域設定;其餘階段仍讀全域檔。 # 用法: -# model-config.sh get {stage} 印出該階段解析後的模型鏈(逗號分隔);未設定不印。兩種情況都 exit 0。 -# model-config.sh list 每階段一行:stagechainsource(project 或 global);未設定的 chain 與 source 印「-」。 +# model-config.sh get {stage} 印出該階段解析後的模型鏈(逗號分隔);未設定不印。兩種情況都 exit 0。 +# model-config.sh list 每階段一行:stagechainsource(project 或 global);未設定的 chain 與 source 印「-」。 +# model-config.sh resolve {stage} 印出該階段「目前 CLI 可用的第一個模型」單一名稱;鏈為空或無法判定時不印,exit 0。 set -u JSC_HOME="${JSC_HOME:-$HOME/.jsc}" @@ -52,8 +53,36 @@ resolve() { # $1=階段 return 0 } +# 判斷目前是哪個 CLI 在跑(盡量而為,非必要)。 +# 依 CLI 官方常見環境變數判斷;偵測不到就回傳 unknown。 +current_cli() { + [ -n "${CLAUDECODE:-}" ] && { echo claude; return 0; } + [ -n "${CODEX_SANDBOX:-}${CODEX_HOME:-}" ] && { echo codex; return 0; } + [ -n "${COPILOT_AGENT:-}" ] && { echo copilot; return 0; } + [ -n "${ANTIGRAVITY_SESSION:-}" ] && { echo antigravity; return 0; } + [ -n "${KIRO_SESSION:-}" ] && { echo kiro; return 0; } + echo unknown +} + +# resolve 子指令:印出「目前 CLI 可用的第一個模型」單一名稱。 +# 簡化說明:這個 repo 目前沒有「列出某 CLI 實際安裝/可用模型」的 shell 級機制 +# ——現有的 skills/models 是靠 sub agent 讀各 CLI 的設定檔(~/.claude/settings.json、 +# ~/.codex/config.toml 等),屬於 LLM 才能做的判讀,沒辦法在這支 POSIX sh 腳本裡重現。 +# 因此這裡只用 current_cli() 抓到的「目前 CLI 名稱」這個既有訊號做記錄, +# 實際判斷可用性一律簡化為「直接取模型鏈的第一個模型」,不逐一檢查該模型是否真的能用。 +# 之後若要做到依 CLI 實際可用模型過濾,可以在這裡比對 current_cli 的結果與 +# references/model-tags.md/detect-clis.sh 的輸出,逐一嘗試鏈上模型直到找到可用的。 +resolve_first_usable() { # $1=階段 + chain=$(resolve "$1" | cut -f1) + [ -n "$chain" ] || return 0 + cli=$(current_cli) + : "目前偵測到的 CLI:$cli(本版本尚未用來篩選模型,見上方簡化說明)" + printf '%s\n' "$chain" | cut -d, -f1 + return 0 +} + usage() { - echo "用法:model-config.sh get {plan|analyze|implement|maintain} | list" >&2 + echo "用法:model-config.sh get {plan|analyze|implement|maintain} | list | resolve {plan|analyze|implement|maintain}" >&2 exit 1 } @@ -67,6 +96,15 @@ case "${1:-}" in resolve "$stage" | cut -f1 exit 0 ;; + resolve) + stage="${2:-}" + case " $STAGES " in + *" $stage "*) ;; + *) usage ;; + esac + resolve_first_usable "$stage" + exit 0 + ;; list) for stage in $STAGES; do line=$(resolve "$stage")