diff --git a/tools/deploy.sh b/tools/deploy.sh index aef581e..d4845f0 100755 --- a/tools/deploy.sh +++ b/tools/deploy.sh @@ -10,6 +10,7 @@ # exit{結束碼}{指令} 該指令的結束碼;dry-run 時結束碼印「-」 # skip{domain}{原因} 本地 clone 是開發中的樹,略過 git pull # note{cli}{原因} 非逐指令的說明(例:kiro 整批改走複製退路的理由) +# restart{路徑} 這次寫下的重啟狀態檔 # result{cli}{mode}{domain 清單}{ok|fail} # 結束碼:全部指令成功 0;任一指令失敗 1;參數錯誤 2。skip、note 不算失敗,但呼叫端要據實回報。 # marketplace 指令一輪只跑一次:install 與 update 先跑,uninstall 最後跑。 @@ -18,7 +19,13 @@ # kiro 的執行檔是 kiro-cli;先探測這個版本認不認得 plugin 子指令(部分版本已經完全 # 移除,例:2.18.1),認得才逐一嘗試、失敗才退回複製,不認得就整批直接走複製, # 不逐一撞一次「unrecognized subcommand」才退回。 +# install 或 update 全數成功時,收尾寫一行進 $JSC_HOME/restart-required,代表這台機器有一輪 +# 部署還沒重啟。擋人邏輯不在這裡:由 jsc-hooks 讀這個檔案提示使用者重啟,逃生門 +# JSC_RESTART_GATE=off 也由那邊判讀。 +# 更新指引與移除指引由同目錄的 write-guides.sh 產生,一輪部署跑一次,不在這支腳本裡: +# 這支腳本的職責是「對單一 CLI 部署」,指引寫的是整台機器的樣貌。 # 環境變數: +# JSC_HOME hook 資料目錄,重啟狀態檔寫在這裡(預設 ~/.jsc) # GITEA_HOST Gitea 站台,可省略 scheme(預設 https://gitea.jsc.idv.tw) # JSC_GITEA_OWNER 存取庫的 owner(預設 plugins) # JSC_LOCAL_PLUGINS antigravity/kiro 用的本地 clone 目錄 @@ -57,6 +64,41 @@ usage() { exit 2 } +# 找 jsc-hooks 的 restart-gate.sh。順序比照 jsc-sdlc 的 wp-gate.sh:環境變數指定優先, +# 再找並排的工作樹,最後找 plugin 快取。找不到就回非零,由呼叫端據實回報。 +restart_gate_sh() { + if [ -n "${JSC_HOOKS_DIR:-}" ] && [ -f "$JSC_HOOKS_DIR/restart-gate.sh" ]; then + printf '%s\n' "$JSC_HOOKS_DIR/restart-gate.sh"; return 0 + fi + _root=$(cd "$(dirname "$0")/.." 2>/dev/null && pwd) || return 1 + for _c in "$_root/../hooks/hooks/restart-gate.sh" "$_root/../jsc-hooks/hooks/restart-gate.sh"; do + [ -f "$_c" ] && { printf '%s\n' "$_c"; return 0; } + done + _c=$(ls -d "$HOME"/.claude/plugins/cache/*/jsc-hooks/*/hooks/restart-gate.sh 2>/dev/null | sort | tail -n1) + [ -n "$_c" ] && [ -f "$_c" ] && { printf '%s\n' "$_c"; return 0; } + return 1 +} + +# 掛上部署後的重啟閘門。狀態檔的路徑、格式與判讀全在 jsc-hooks 的 restart-gate.sh, +# 這裡只轉呼叫它的 require 子命令,比照 jsc-sdlc 轉呼叫 sdlc-gate.sh wp-lock 的慣例。 +# 兩邊各拼一份格式就會對不上:2026-08-27 這裡曾自己寫四欄 TSV,而 hooks 那端讀的是 +# key=value,狀態檔存在卻解不出欄位。格式只能有一個真實來源。 +# 找不到 restart-gate.sh 時不要自己補寫一份:閘門本來就由 jsc-hooks 判讀,它不在就沒有 +# 判定點,寫下去只是留一個沒人讀的檔案,還會讓下一輪誤以為閘門掛上了。 +mark_restart() { + [ "$DRYRUN" = 1 ] && return 0 + case "$MODE" in install|update) ;; *) return 0 ;; esac + if ! rg=$(restart_gate_sh); then + printf 'note\t%s\t%s\n' "$CLI" "找不到 jsc-hooks 的 restart-gate.sh,這次沒有掛上重啟閘門" + return 0 + fi + if JSC_CLI="$CLI" sh "$rg" require "$MODE" $DOMAINS