From ed4092bb3d69517f43f64d3a3e98763b600d6f99 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Mon, 31 Aug 2026 13:35:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(deploy):=20=E7=9B=B8=E4=BE=9D=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=B8=8D=E7=AC=A6=E6=94=B9=E6=88=90=E7=85=A7=E6=A8=A3?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=A6=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What:check_requires() 對 check-requires.sh 的四種結束碼重新分流。0 照常更新。1 改印一行 warn,該 domain 照樣更新,訊息寫出還缺哪一版。4 印一行 note,也照樣更新。2 或其他代碼維持印 skip、跳過該 domain,並記成失敗。 Why:跳過會讓落後的 domain 永遠等不到它要的相依版本,也就永遠更新不到,兩個 domain 互相等就形成死鎖。阻擋移到技能叫用那一層,由 jsc-hooks 的 version-guard.sh 執行,更新照跑不會壞事。判不出結論跟版本落後要講不同的話,混成一句會把環境問題誤導成版本問題。檢查腳本自己出錯是另一回事,讀不到結論就不能當成通過。 How:結束碼 1 的分支從印 skip、回傳 1 改成印 warn、回傳 0,結束碼 4 新增一個印 note、回傳 0 的分支,其餘代碼維持原本的 skip 與 FAILED。函式上方與檔頭補上這四條分流的理由。檔頭的輸出格式表補進 warn 與 compat 兩欄,結束碼說明也把 warn 列為不算失敗但要據實回報。 Who:相依版本不符的處置。 --- tools/deploy.sh | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/tools/deploy.sh b/tools/deploy.sh index f155550..6af0d68 100755 --- a/tools/deploy.sh +++ b/tools/deploy.sh @@ -9,11 +9,20 @@ # cmd{指令} 即將執行的指令 # exit{結束碼}{指令} 該指令的結束碼;dry-run 時結束碼印「-」 # skip{domain}{原因} 本地 clone 是開發中的樹,略過 git pull +# warn{domain}{原因} 相依版本不符,仍照樣更新的提醒 +# compatcodex{舊路徑}{新路徑} codex 舊版快取路徑補成指向新版的相容連結 # note{cli}{原因} 非逐指令的說明(例:kiro 整批改走複製退路的理由) # restart{路徑} 這次寫下的重啟狀態檔 # requires{domain}{檢查結果} update 前的 jsc.requires 檢查 # result{cli}{mode}{domain 清單}{ok|fail} -# 結束碼:全部指令成功 0;任一指令失敗 1;參數錯誤 2。skip、note 不算失敗,但呼叫端要據實回報。 +# 結束碼:全部指令成功 0;任一指令失敗 1;參數錯誤 2。skip、warn、note 不算失敗,但呼叫端要據實回報。 +# update 前每個 domain 都先跑一次同目錄的 check-requires.sh,它的四種結束碼分流如下: +# 0 相依符合,或沒有宣告相依 → 照常更新這個 domain +# 1 相依版本不符或缺相依 plugin +# → 印一行 warn,這個 domain 照樣更新(跳過會讓落後的 domain 永遠更新不到) +# 4 判不出結論(manifest 讀不到、不是有效 JSON、缺 python3) +# → 印一行 note,這個 domain 照樣更新。沒有證據不等於落後,話要跟 warn 分開講 +# 2 或其他 檢查腳本自己出錯(用法錯誤或腳本壞掉)→ 印一行 skip,跳過這個 domain 並記為失敗 # marketplace 指令一輪只跑一次:install 與 update 先跑,uninstall 最後跑。 # 各 CLI 的細節都收在這裡,SKILL.md 只描述何時呼叫與參數: # antigravity 不接受 gitea URL,先 clone 到本地再從路徑安裝,更新時 pull 同一份。 @@ -134,7 +143,12 @@ restart_gate_sh() { return 1 } -check_requires() { # $1=domain;0=可更新,1=略過這個 domain +# 相依版本不符只回報、不跳過。跳過的話,落後的 domain 永遠等不到那一版相依, +# 也就永遠更新不到,兩個 domain 互相等就形成死鎖。阻擋改放在技能呼叫那一層: +# jsc-hooks 的 version-guard.sh 會在版本不足時擋下該 domain 的技能,更新照跑不會壞事。 +# 檢查腳本自己出錯(退出碼 2 以上:用法錯誤或腳本壞掉)是另一回事,那不是相依不符, +# 讀不到結論就不能當成通過,照舊記 FAILED 並跳過這個 domain。 +check_requires() { # $1=domain;0=繼續更新,1=略過這個 domain(只有檢查腳本自己出錯才會回 1) [ "$MODE" = update ] || return 0 sync_local "$1" manifest="$LOCAL_DIR/$1/plugin.json" @@ -145,8 +159,15 @@ check_requires() { # $1=domain;0=可更新,1=略過這個 domain return 0 fi if [ "$code" -eq 1 ]; then - printf 'skip\t%s\t%s\n' "$1" "相依版本不符,未更新:$out" - return 1 + printf 'warn\t%s\t%s\n' "$1" "相依版本不符,這次照樣更新;補齊相依版本以前,叫用這個 domain 的技能會被 jsc-hooks 的 version-guard.sh 擋下。要補的版本:$out" + return 0 + fi + # 判不出結論跟版本落後要講不同的話。把兩者混成同一句,環境壞掉會被說成版本落後, + # 操作者照著去補版本永遠補不到問題點。照樣更新的理由與 version-guard.sh 一致: + # 沒有證據不等於落後,缺基礎設施就停掉更新,等於讓環境永遠修不好。 + if [ "$code" -eq 4 ]; then + printf 'note\t%s\t%s\n' "$1" "判不出相依版本,這次照樣更新;成因不是版本落後,先修環境再重跑檢查:$out" + return 0 fi FAILED=1 printf 'skip\t%s\t%s\n' "$1" "相依版本檢查失敗,未更新:$out"