feat(執行): 拿排程條目記下的 CLI 清單比對,少跑一支就點名
偵測 CLI 那一支純看 PATH,分不出「裝了但執行檔不在 PATH 上」。而條目帶的 PATH 是安裝當下拍的,其中某些 CLI 裝在會過期的目錄底下——這台機器實測就有 一支裝在帶行程編號的多殼層目錄,重開機之後那條路徑就不在了。 少了基準的後果不是報錯,是安靜地少做一支。那一輪照樣把偵測到的每一支都跑 過、照樣全部成功、照樣回報「都跑過了」,因為它不知道該有幾支。實測那一輪報 「對 4 支 CLI 都跑過,全部成功」,而機器上裝了 5 支——報告讀起來完全正常。 所以條目多記一個變數,記下安裝當下偵測到哪幾支,作為往後每一輪的參照基準。 判法照組 PATH 那一套逐支 command -v,不另叫外部腳本:install 那一刻本來就用 同一套判過一次,再叫一支等於同一件事兩套實作,而那一支拿得到的資訊跟這裡 一樣多,多繞一層沒有換到任何東西。 讀的那一邊比對之後印 cli_missing= 並點名少了哪一支,同時明說「全部成功不代表 全部跑過」。只報不修:那條路徑本質上是暫時的,真正的解法是那支 CLI 該裝在 穩定位置,或者重跑一次排程安裝重新拍快照——兩件都不是這一支該替人決定的。 舊條目沒有那個變數時安靜通過,不誤報:那一種情況分不出「沒少」與「沒基準」, 而拿「沒基準」當缺失會讓每一台還沒重裝的機器每輪亮一次紅。 實測三種情況:基準與實際一致時不出聲;基準多一支不存在的會點名那一支;完全 沒設基準時印減號、不警告。另外拿條目實際帶的那條 PATH 在清空環境裡重現真機 情境,確實抓到少了那一支。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+20
-2
@@ -169,6 +169,23 @@ if _det=$(find_tool cli tools/detect-clis.sh); then
|
||||
fi
|
||||
N_CLI=$(awk 'END{print NR+0}' "$CLIS")
|
||||
|
||||
# 跟排程條目安裝當下記下的那一份比對。少了哪一支要點名,不是只印個數字。
|
||||
#
|
||||
# 為什麼要比:偵測那一支純看 PATH,分不出「裝了但執行檔不在 PATH 上」。而條目帶的 PATH 是
|
||||
# 安裝當下拍的,其中某些 CLI 裝在會過期的目錄底下——實測有一支裝在帶行程編號的多殼層目錄,
|
||||
# 重開機之後那條路徑就不在了。
|
||||
# 沒有基準的後果不是報錯,是安靜地少做一支:這一輪照樣把偵測到的每一支都跑過、照樣全部
|
||||
# 成功、照樣回報「都跑過了」。實測那一輪報「對 4 支 CLI 都跑過,全部成功」,而機器上裝了
|
||||
# 5 支——報告讀起來完全正常。
|
||||
# 只報不修:那條路徑本質上是暫時的,真正的解法是那支 CLI 該裝在穩定位置,或者重跑一次
|
||||
# 排程安裝重新拍一份快照。兩件都不是這一支該替人決定的。
|
||||
CLI_MISSING=''
|
||||
if [ -n "${JSC_ASSIST_CLIS:-}" ]; then
|
||||
for _want in $JSC_ASSIST_CLIS; do
|
||||
grep -qxF "$_want" "$CLIS" 2>/dev/null || CLI_MISSING="${CLI_MISSING:+$CLI_MISSING、}$_want"
|
||||
done
|
||||
fi
|
||||
|
||||
# {repo} 的代入來源還沒做出來。這裡不猜一個掃描規則頂替:猜錯就是在整台機器上跑指令,
|
||||
# 而那一輪沒有人看得到它跑到哪裡去了。
|
||||
REPO_READY=0
|
||||
@@ -345,10 +362,11 @@ while IFS="$TAB" read -r c_id c_verdict c_state c_kind c_action c_trigger c_recu
|
||||
fi
|
||||
done <"$ROWS"
|
||||
|
||||
printf 'mode=%s rows=%s root=%s due=%s ran=%s ok=%s failed=%s held=%s skipped=%s write_failed=%s clis=%s\n' \
|
||||
printf 'mode=%s rows=%s root=%s due=%s ran=%s ok=%s failed=%s held=%s skipped=%s write_failed=%s clis=%s cli_missing=%s\n' \
|
||||
"$([ "$DRYRUN" -eq 1 ] && echo plan || echo run)" "$ROWS" "${ROOT:--}" \
|
||||
"$N_DUE" "$N_RUN" "$N_OK" "$N_FAIL" "$N_HELD" "$N_SKIP" "$N_WRITE_BAD" "$N_CLI"
|
||||
"$N_DUE" "$N_RUN" "$N_OK" "$N_FAIL" "$N_HELD" "$N_SKIP" "$N_WRITE_BAD" "$N_CLI" "${CLI_MISSING:--}"
|
||||
|
||||
[ -n "$CLI_MISSING" ] && warn "排程條目記著這台機器有 $JSC_ASSIST_CLIS,但這一輪只偵測到 $N_CLI 支,少了:$CLI_MISSING。帶 {cli} 代入點的那幾筆這一輪少跑了那幾支,而且**全部成功也不代表全部跑過**。成因通常是那支 CLI 裝在會過期的目錄底下(例如帶行程編號的多殼層目錄),條目帶的 PATH 是安裝當下拍的,那條路徑現在不在了。重跑一次 schedule.sh install patrol 會重新拍一份快照;那支 CLI 反覆消失就要考慮把它裝到穩定位置。"
|
||||
[ "$N_HELD" -gt 0 ] && note "有 $N_HELD 筆代不出目標或指令形狀不對,這一輪跳過,逐筆印在上面的 held= 那幾行。**那幾筆的執行紀錄與失敗次數一個字都沒動**——代不出目標不是那一筆做錯了什麼,記成失敗會讓一個沒有人修得動的計數一路往上爬。"
|
||||
[ "$N_SKIP" -gt 0 ] && note "有 $N_SKIP 筆這一批不跑:動作是只提醒的、動作是技能名的、還有不是內建項的,逐筆印在上面的 skip= 那幾行。"
|
||||
[ "$RC_WRITE" -ne 0 ] && warn "有 $N_WRITE_BAD 筆的回寫失敗。指令跑過了,但待辦簿沒記到,下一輪會再跑一次同一筆,逐筆印在上面的 write_failed= 那幾行,各自帶了 tasks.sh 的結束碼。"
|
||||
|
||||
Reference in New Issue
Block a user