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