Merge pull request 'fix/deploy-domain-prefix-and-kiro-plugin-probe' (#15) from fix/deploy-domain-prefix-and-kiro-plugin-probe into develop
Reviewed-on: #15 Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
This commit was merged in pull request #15.
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-cli",
|
"name": "jsc-cli",
|
||||||
"version": "0.1.2",
|
"version": "0.1.3",
|
||||||
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
||||||
"skills": "./skills",
|
"skills": "./skills",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-cli",
|
"name": "jsc-cli",
|
||||||
"version": "0.1.2",
|
"version": "0.1.3",
|
||||||
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
||||||
"skills": "./skills"
|
"skills": "./skills"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-cli",
|
"name": "jsc-cli",
|
||||||
"version": "0.1.2",
|
"version": "0.1.3",
|
||||||
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
"description": "CLI 偵測、模型能力標籤、子代理派工與技能庫批次部署",
|
||||||
"skills": "./skills/"
|
"skills": "./skills/"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ description: Batch install, update, or uninstall the whole jsc skill set on ever
|
|||||||
3. Ask the user for the mode per the `jsc-ask:ask` rules: `install` / `update` / `uninstall`. Every option states its impact scope: which CLIs it touches and which configs it writes. Done when the user has named exactly one of `install`, `update` or `uninstall`.
|
3. Ask the user for the mode per the `jsc-ask:ask` rules: `install` / `update` / `uninstall`. Every option states its impact scope: which CLIs it touches and which configs it writes. Done when the user has named exactly one of `install`, `update` or `uninstall`.
|
||||||
4. Get the domain list (**never hardcode it**; this skill follows automatically when domains are added or removed): read `plugins[].name` from the unified marketplace via
|
4. Get the domain list (**never hardcode it**; this skill follows automatically when domains are added or removed): read `plugins[].name` from the unified marketplace via
|
||||||
`jsc-gitea/tools/gitea.sh api GET /repos/plugins/meta/raw/.claude-plugin/marketplace.json`.
|
`jsc-gitea/tools/gitea.sh api GET /repos/plugins/meta/raw/.claude-plugin/marketplace.json`.
|
||||||
The marketplace is unified as `jsc`; the install token is `jsc-{domain}@jsc`. Done when the domain list comes from that response and holds at least one name.
|
The marketplace is unified as `jsc`; the install token is `jsc-{domain}@jsc`. Each `plugins[].name` already carries the `jsc-` prefix (e.g. `jsc-ask`) — pass it to `tools/deploy.sh` as-is, prefixed or not; the script normalizes it. Done when the domain list comes from that response and holds at least one name.
|
||||||
5. Run `tools/deploy.sh {mode} {cli} {domain}...` once per detected CLI, passing the whole domain list in one call so the marketplace command runs only once. This step **MUST run as a sub agent** (one sub agent per CLI). The script prints `cmd` and `exit` lines for every command, then one `result` line; `-n` prints the commands without running them. Antigravity cannot install from a Gitea URL, so the script clones each domain into the local plugin directory (`JSC_LOCAL_PLUGINS`, default `$JSC_HOME/plugins`) and installs from that path — keep that clone, because update pulls the same one. That default deliberately avoids a development checkout: when the directory holds uncommitted changes or unpushed commits, the script prints a `skip` line, leaves the tree untouched, and installs the on-disk content. Done when every detected CLI has reported an exit status for every command it ran.
|
5. Run `tools/deploy.sh {mode} {cli} {domain}...` once per detected CLI, passing the whole domain list in one call so the marketplace command runs only once. This step **MUST run as a sub agent** (one sub agent per CLI). The script prints `cmd` and `exit` lines for every command, then one `result` line; `-n` prints the commands without running them. Antigravity cannot install from a Gitea URL, so the script clones each domain into the local plugin directory (`JSC_LOCAL_PLUGINS`, default `$JSC_HOME/plugins`) and installs from that path — keep that clone, because update pulls the same one. That default deliberately avoids a development checkout: when the directory holds uncommitted changes or unpushed commits, the script prints a `skip` line, leaves the tree untouched, and installs the on-disk content. Done when every detected CLI has reported an exit status for every command it ran.
|
||||||
6. After install or update, call `jsc-hooks:hooks-install` to rewire the hooks. Done when hooks-install reports a wiring result for each detected CLI.
|
6. After install or update, call `jsc-hooks:hooks-install` to rewire the hooks. Done when hooks-install reports a wiring result for each detected CLI.
|
||||||
7. Report the result and any failure reason for every CLI × mode, plus every `skip` line and every CLI that could not be version-checked in step 2. Done when every detected CLI appears in the report with its `result` status.
|
7. Report the result and any failure reason for every CLI × mode, plus every `skip` line and every CLI that could not be version-checked in step 2. Done when every detected CLI appears in the report with its `result` status.
|
||||||
|
|||||||
+38
-3
@@ -3,16 +3,21 @@
|
|||||||
# 用法:
|
# 用法:
|
||||||
# deploy.sh [-n] {install|update|uninstall} {claude|codex|copilot|antigravity|kiro} {domain} [domain...]
|
# deploy.sh [-n] {install|update|uninstall} {claude|codex|copilot|antigravity|kiro} {domain} [domain...]
|
||||||
# -n 或 --dry-run(或 JSC_DEPLOY_DRYRUN=1):只印指令,不執行。
|
# -n 或 --dry-run(或 JSC_DEPLOY_DRYRUN=1):只印指令,不執行。
|
||||||
|
# {domain} 裸名或帶 jsc- 前綴皆可(例:ask 或 jsc-ask),腳本會自動去掉前綴再組
|
||||||
|
# jsc-{domain}@jsc;marketplace.json 的 plugins[].name 本身就帶前綴,不必事先剝掉。
|
||||||
# 輸出(TSV,一行一筆):
|
# 輸出(TSV,一行一筆):
|
||||||
# cmd<TAB>{指令} 即將執行的指令
|
# cmd<TAB>{指令} 即將執行的指令
|
||||||
# exit<TAB>{結束碼}<TAB>{指令} 該指令的結束碼;dry-run 時結束碼印「-」
|
# exit<TAB>{結束碼}<TAB>{指令} 該指令的結束碼;dry-run 時結束碼印「-」
|
||||||
# skip<TAB>{domain}<TAB>{原因} 本地 clone 是開發中的樹,略過 git pull
|
# skip<TAB>{domain}<TAB>{原因} 本地 clone 是開發中的樹,略過 git pull
|
||||||
|
# note<TAB>{cli}<TAB>{原因} 非逐指令的說明(例:kiro 整批改走複製退路的理由)
|
||||||
# result<TAB>{cli}<TAB>{mode}<TAB>{domain 清單}<TAB>{ok|fail}
|
# result<TAB>{cli}<TAB>{mode}<TAB>{domain 清單}<TAB>{ok|fail}
|
||||||
# 結束碼:全部指令成功 0;任一指令失敗 1;參數錯誤 2。skip 不算失敗,但呼叫端要據實回報。
|
# 結束碼:全部指令成功 0;任一指令失敗 1;參數錯誤 2。skip、note 不算失敗,但呼叫端要據實回報。
|
||||||
# marketplace 指令一輪只跑一次:install 與 update 先跑,uninstall 最後跑。
|
# marketplace 指令一輪只跑一次:install 與 update 先跑,uninstall 最後跑。
|
||||||
# 各 CLI 的細節都收在這裡,SKILL.md 只描述何時呼叫與參數:
|
# 各 CLI 的細節都收在這裡,SKILL.md 只描述何時呼叫與參數:
|
||||||
# antigravity 不接受 gitea URL,先 clone 到本地再從路徑安裝,更新時 pull 同一份。
|
# antigravity 不接受 gitea URL,先 clone 到本地再從路徑安裝,更新時 pull 同一份。
|
||||||
# kiro 的執行檔是 kiro-cli;plugin 指令失敗時退回複製 skills 目錄。
|
# kiro 的執行檔是 kiro-cli;先探測這個版本認不認得 plugin 子指令(部分版本已經完全
|
||||||
|
# 移除,例:2.18.1),認得才逐一嘗試、失敗才退回複製,不認得就整批直接走複製,
|
||||||
|
# 不逐一撞一次「unrecognized subcommand」才退回。
|
||||||
# 環境變數:
|
# 環境變數:
|
||||||
# GITEA_HOST Gitea 站台,可省略 scheme(預設 https://gitea.jsc.idv.tw)
|
# GITEA_HOST Gitea 站台,可省略 scheme(預設 https://gitea.jsc.idv.tw)
|
||||||
# JSC_GITEA_OWNER 存取庫的 owner(預設 plugins)
|
# JSC_GITEA_OWNER 存取庫的 owner(預設 plugins)
|
||||||
@@ -171,8 +176,16 @@ kiro_copy() { # $1=domain
|
|||||||
run cp -R "$LOCAL_DIR/$1/skills/." "$KIRO_SKILLS/jsc-$1/"
|
run cp -R "$LOCAL_DIR/$1/skills/." "$KIRO_SKILLS/jsc-$1/"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# kiro-cli 是否認得 plugin 子指令:一次性偵測,探測本身不印 cmd/exit(不是部署動作,
|
||||||
|
# 印出來只會讓人誤以為那也是一次失敗的部署嘗試)。部分版本(例:2.18.1)完全沒有這個
|
||||||
|
# 子指令,逐一嘗試再退回複製,會先洗出一長串看似失敗、實則設計內的錯誤訊息。
|
||||||
|
kiro_has_plugin_cmd() {
|
||||||
|
"$bin" --help-all 2>/dev/null | grep -qE '^ plugin( |$)'
|
||||||
|
}
|
||||||
|
|
||||||
deploy_kiro() {
|
deploy_kiro() {
|
||||||
bin=$(cli_bin kiro)
|
bin=$(cli_bin kiro)
|
||||||
|
if kiro_has_plugin_cmd; then
|
||||||
case "$MODE" in
|
case "$MODE" in
|
||||||
install) run_soft "$bin" plugin marketplace add "$MKT" ;;
|
install) run_soft "$bin" plugin marketplace add "$MKT" ;;
|
||||||
update) run_soft "$bin" plugin marketplace update jsc ;;
|
update) run_soft "$bin" plugin marketplace update jsc ;;
|
||||||
@@ -190,6 +203,16 @@ deploy_kiro() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf 'note\tkiro\t%s\n' "此版本 kiro-cli 沒有 plugin 子指令,改走本地複製(git pull 或 clone 後複製 skills 目錄)"
|
||||||
|
for d in $DOMAINS; do
|
||||||
|
case "$MODE" in
|
||||||
|
install|update) kiro_copy "$d" ;;
|
||||||
|
uninstall) run rm -rf "$KIRO_SKILLS/jsc-$d" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
[ "$MODE" = uninstall ] && run_soft "$bin" plugin marketplace remove jsc
|
[ "$MODE" = uninstall ] && run_soft "$bin" plugin marketplace remove jsc
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@@ -202,7 +225,19 @@ esac
|
|||||||
MODE=$1
|
MODE=$1
|
||||||
CLI=$2
|
CLI=$2
|
||||||
shift 2
|
shift 2
|
||||||
DOMAINS="$*"
|
|
||||||
|
# 每個 domain 一律去掉開頭的 jsc-:往下每處都自己組 jsc-$d@jsc,收到已帶前綴的名字
|
||||||
|
# (marketplace.json 的 plugins[].name 就是這樣,例如 jsc-ask)會兜成 jsc-jsc-ask@jsc,
|
||||||
|
# 讓 claude/copilot/antigravity/kiro 全部裝不上、更新不了。這裡正規化一次,
|
||||||
|
# 呼叫端不管傳哪種格式都能正常動作,不必每個呼叫端各自記得先去前綴。
|
||||||
|
_domains=""
|
||||||
|
for _d in "$@"; do
|
||||||
|
case "$_d" in
|
||||||
|
jsc-*) _d="${_d#jsc-}" ;;
|
||||||
|
esac
|
||||||
|
_domains="$_domains $_d"
|
||||||
|
done
|
||||||
|
DOMAINS="${_domains# }"
|
||||||
|
|
||||||
case "$MODE" in
|
case "$MODE" in
|
||||||
install|update|uninstall) ;;
|
install|update|uninstall) ;;
|
||||||
|
|||||||
Reference in New Issue
Block a user