釋出:條目只帶放得下 CLI 執行檔的那幾個目錄,不快照整條 PATH #33
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-assist",
|
"name": "jsc-assist",
|
||||||
"version": "0.2.5",
|
"version": "0.2.6",
|
||||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||||
"skills": "./skills",
|
"skills": "./skills",
|
||||||
"author": {
|
"author": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-assist",
|
"name": "jsc-assist",
|
||||||
"version": "0.2.5",
|
"version": "0.2.6",
|
||||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||||
"skills": "./skills",
|
"skills": "./skills",
|
||||||
"jsc": {
|
"jsc": {
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "jsc-assist",
|
"name": "jsc-assist",
|
||||||
"version": "0.2.5",
|
"version": "0.2.6",
|
||||||
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
|
||||||
"skills": "./skills/",
|
"skills": "./skills/",
|
||||||
"jsc": {
|
"jsc": {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
+30
-3
@@ -344,7 +344,7 @@ snapshot_names() {
|
|||||||
# 巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 PATH;靠 PATH 的是那幾支腳本自己
|
# 巡檢那一輪要跑的指令本身走的是字面絕對路徑、不靠 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 \
|
env 2>/dev/null \
|
||||||
| sed -n 's/^\(JSC_WIKI_REPO\)=.*/\1/p; s/^\(JSC_WIKI_REPO_[A-Za-z0-9_]*\)=.*/\1/p' \
|
| sed -n 's/^\(JSC_WIKI_REPO\)=.*/\1/p; s/^\(JSC_WIKI_REPO_[A-Za-z0-9_]*\)=.*/\1/p' \
|
||||||
| sort -u
|
| sort -u
|
||||||
@@ -354,6 +354,33 @@ snapshot_names() {
|
|||||||
# 整條 cron 指令切斷。
|
# 整條 cron 指令切斷。
|
||||||
shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
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='' 進去,讀的人分不出是「刻意設成空」還是「安裝時忘了設」。
|
# 寫 NAME='' 進去,讀的人分不出是「刻意設成空」還是「安裝時忘了設」。
|
||||||
# JSC_GITEA_CONFIRM=yes 是必要的:寫入確認只認 tty,排程那一輪沒有 tty,不帶這個旗標監控頁
|
# JSC_GITEA_CONFIRM=yes 是必要的:寫入確認只認 tty,排程那一輪沒有 tty,不帶這個旗標監控頁
|
||||||
@@ -365,7 +392,7 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
|
|||||||
# 中止的唯一證據」。不設這個變數,兩半就都落在 CLI 自己給的代號上。
|
# 中止的唯一證據」。不設這個變數,兩半就都落在 CLI 自己給的代號上。
|
||||||
# 2026-09-04 實測:一台機器累積了 91 筆假中止,其中 90 筆是同一支被每輪叫用的技能。
|
# 2026-09-04 實測:一台機器累積了 91 筆假中止,其中 90 筆是同一支被每輪叫用的技能。
|
||||||
env_prefix() { # 順便把快照到的變數名稱寫進 $1,供輸出列出名稱(只有名稱,不含值)
|
env_prefix() { # 順便把快照到的變數名稱寫進 $1,供輸出列出名稱(只有名稱,不含值)
|
||||||
_p='JSC_CLI=cron JSC_GITEA_CONFIRM=yes'
|
_p="PATH=$(shq "$(cli_path)") JSC_CLI=cron JSC_GITEA_CONFIRM=yes"
|
||||||
_names=''
|
_names=''
|
||||||
for _n in $(snapshot_names); do
|
for _n in $(snapshot_names); do
|
||||||
eval "_v=\${$_n:-}"
|
eval "_v=\${$_n:-}"
|
||||||
@@ -467,7 +494,7 @@ trap 'rm -rf "$TMPD"' EXIT
|
|||||||
# 巡檢指令與環境快照在這裡就解出來。放進 cron_entry 再解的話,那支是在命令替換的子行程裡
|
# 巡檢指令與環境快照在這裡就解出來。放進 cron_entry 再解的話,那支是在命令替換的子行程裡
|
||||||
# 跑,判不出 CLI 時 die 只結束子行程,主流程會帶著空指令繼續往下裝。
|
# 跑,判不出 CLI 時 die 只結束子行程,主流程會帶著空指令繼續往下裝。
|
||||||
PATROL_RESOLVED=''
|
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=''
|
SNAPSHOT_NAMES=''
|
||||||
case "$CMD:$JOBS" in
|
case "$CMD:$JOBS" in
|
||||||
install:*patrol*)
|
install:*patrol*)
|
||||||
|
|||||||
Reference in New Issue
Block a user