fix(schedule): 條目只帶放得下 CLI 執行檔的那幾個目錄,不快照整條 PATH
上一版把整條 PATH 快照進條目,實測直接裝不起來:crontab 一行有長度上限, 回的是 command too long,結束碼 4。這台機器的 PATH 是 2160 字元,去重又去掉 不存在的那幾段之後還有 1332 字元,仍然超過。 改成只帶放得下 CLI 執行檔的那幾個目錄,這台機器實測兩個、合起來 70 字元, 整行降到 685 字元。夠用的理由是這一條要解決的問題很窄:cron 只給 /usr/bin 與 /bin,而偵測 CLI 那一支靠 PATH 找執行檔,找不到就回結束碼 0 加一份空清單 ——看起來像「這台機器沒裝 CLI」。巡檢要跑的指令本身走字面絕對路徑,不靠它。 收尾接上 cron 本來就會給的那兩段,免得只剩自訂目錄而找不到系統工具。 一個代價寫進註解:有些 CLI 裝在會過期的目錄底下,例如帶行程編號的多殼層 目錄,那種路徑下一次開機就不在了。不特別過濾——過濾要認得每一種安裝方式, 那份名單會過期得比路徑還快。重跑一次 install 就重新拍一份,而條目本來就是 安裝當下的快照。 實測:拿條目會帶的那條 PATH 在清空環境裡跑,五支 CLI 全解得出來;真的裝一次 回結束碼 0,服務在跑,連結檢查通過。 三份 manifest 版號 0.2.5 升到 0.2.6。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jsc-assist",
|
||||
"version": "0.2.5",
|
||||
"version": "0.2.6",
|
||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||
"skills": "./skills",
|
||||
"author": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jsc-assist",
|
||||
"version": "0.2.5",
|
||||
"version": "0.2.6",
|
||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||
"skills": "./skills",
|
||||
"jsc": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "jsc-assist",
|
||||
"version": "0.2.5",
|
||||
"version": "0.2.6",
|
||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||
"skills": "./skills/",
|
||||
"jsc": {
|
||||
|
||||
File diff suppressed because one or more lines are too long
+30
-3
@@ -344,7 +344,7 @@ snapshot_names() {
|
||||
# 巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 PATH;靠 PATH 的是那幾支腳本自己
|
||||
# 呼叫的外部程式,所以修在條目這一層,不是逐支腳本各自去猜安裝路徑——猜就要維護一份
|
||||
# 路徑清單,而清單會過期。
|
||||
printf '%s\n' PATH GITEA_HOST GITEA_TOKEN JSC_HOME JSC_ASSISTANT_HEARTBEAT_TTL
|
||||
printf '%s\n' GITEA_HOST GITEA_TOKEN JSC_HOME JSC_ASSISTANT_HEARTBEAT_TTL
|
||||
env 2>/dev/null \
|
||||
| sed -n 's/^\(JSC_WIKI_REPO\)=.*/\1/p; s/^\(JSC_WIKI_REPO_[A-Za-z0-9_]*\)=.*/\1/p' \
|
||||
| sort -u
|
||||
@@ -354,6 +354,33 @@ snapshot_names() {
|
||||
# 整條 cron 指令切斷。
|
||||
shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
||||
|
||||
# 條目要帶的 PATH。不是整條照抄——這台機器實測 2160 字元,去重又去掉不存在的那幾段之後
|
||||
# 還有 1332 字元,而 crontab 一行有長度上限,照抄會直接回「command too long」而裝不起來。
|
||||
# 實測踩過:加上整條 PATH 之後 install 回 4,錯誤訊息是 crontab 自己吐的。
|
||||
#
|
||||
# 只帶放得下 CLI 執行檔的那幾個目錄,這台機器實測是兩個、合起來 70 字元。這樣夠用的理由是
|
||||
# 這一條要解決的問題很窄:cron 只給 /usr/bin 與 /bin,而偵測 CLI 那一支靠 PATH 找執行檔,
|
||||
# 找不到就回結束碼 0 加一份空清單——看起來像「這台機器沒裝 CLI」。巡檢要跑的指令本身走的是
|
||||
# 字面絕對路徑,不靠這一條。
|
||||
#
|
||||
# 一個代價要講白:有些 CLI 裝在會過期的目錄底下(例如帶行程編號的多殼層目錄),那種路徑
|
||||
# 下一次開機就不在了。這裡不特別過濾——過濾要認得每一種安裝方式,那份名單會過期得比路徑
|
||||
# 還快。重跑一次 install 就會重新拍一份,而條目本來就是安裝當下的快照。
|
||||
cli_path() {
|
||||
_dirs=''
|
||||
for _c in claude codex copilot agy kiro-cli; do
|
||||
_abs=$(command -v "$_c" 2>/dev/null) || continue
|
||||
case "$_abs" in /*) ;; *) continue ;; esac
|
||||
_d=$(dirname -- "$_abs")
|
||||
case ":$_dirs:" in
|
||||
*":$_d:"*) ;;
|
||||
*) _dirs="${_dirs:+$_dirs:}$_d" ;;
|
||||
esac
|
||||
done
|
||||
# 收尾接上 cron 本來就會給的那兩段,免得只剩自訂目錄而找不到系統工具。
|
||||
printf '%s' "${_dirs:+$_dirs:}/usr/bin:/bin"
|
||||
}
|
||||
|
||||
# 條目的指令前綴:固定三個旗標,加上這一刻的環境快照。沒設定的變數直接跳過,不寫空值——
|
||||
# 寫 NAME='' 進去,讀的人分不出是「刻意設成空」還是「安裝時忘了設」。
|
||||
# JSC_GITEA_CONFIRM=yes 是必要的:寫入確認只認 tty,排程那一輪沒有 tty,不帶這個旗標監控頁
|
||||
@@ -365,7 +392,7 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
||||
# 中止的唯一證據」。不設這個變數,兩半就都落在 CLI 自己給的代號上。
|
||||
# 2026-09-04 實測:一台機器累積了 91 筆假中止,其中 90 筆是同一支被每輪叫用的技能。
|
||||
env_prefix() { # 順便把快照到的變數名稱寫進 $1,供輸出列出名稱(只有名稱,不含值)
|
||||
_p='JSC_CLI=cron JSC_GITEA_CONFIRM=yes'
|
||||
_p="PATH=$(shq "$(cli_path)") JSC_CLI=cron JSC_GITEA_CONFIRM=yes"
|
||||
_names=''
|
||||
for _n in $(snapshot_names); do
|
||||
eval "_v=\${$_n:-}"
|
||||
@@ -467,7 +494,7 @@ trap 'rm -rf "$TMPD"' EXIT
|
||||
# 巡檢指令與環境快照在這裡就解出來。放進 cron_entry 再解的話,那支是在命令替換的子行程裡
|
||||
# 跑,判不出 CLI 時 die 只結束子行程,主流程會帶著空指令繼續往下裝。
|
||||
PATROL_RESOLVED=''
|
||||
ENV_PREFIX='JSC_CLI=cron JSC_GITEA_CONFIRM=yes'
|
||||
ENV_PREFIX="PATH=$(shq "$(cli_path)") JSC_CLI=cron JSC_GITEA_CONFIRM=yes"
|
||||
SNAPSHOT_NAMES=''
|
||||
case "$CMD:$JOBS" in
|
||||
install:*patrol*)
|
||||
|
||||
Reference in New Issue
Block a user