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", 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")