From 3784cb51bef94dd006220f81acd6f6a86c23b54c Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 4 Sep 2026 14:15:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(schedule):=20=E8=A3=9C=E5=8D=B0=E5=9F=B7?= =?UTF-8?q?=E8=A1=8C=E9=82=A3=E4=B8=80=E6=94=AF=E7=9A=84=E5=85=81=E8=A8=B1?= =?UTF-8?q?=E8=A6=8F=E5=89=87=EF=BC=8C=E4=B8=A6=E5=9B=9E=E9=A0=AD=E6=AF=94?= =?UTF-8?q?=E5=B0=8D=E6=9C=AC=E6=96=87=E5=8F=AB=E5=BE=97=E5=88=B0=E7=9A=84?= =?UTF-8?q?=E6=AF=8F=E4=B8=80=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 巡檢多了執行到期內建項那一步,而印允許規則的清單是寫死的、沒跟著加。少一條 的代價不是報錯:那一輪停在權限詢問,鎖已經握在手上,接下來每一輪都讓開到鎖 逾時為止,而外面只看得到「心跳過期」。 補上那一條之後順手做掉根因。清單寫死,技能本文哪天多叫一支腳本這裡不會自己 知道,所以印完回頭掃一次本文,把它叫的每一支跟印過的比對,缺的逐支點名。 三個實作決定都是被自己踩出來的: 只掃 patrol 那一節,不掃整份。start 與 status 兩個操作都有人在現場,它們叫的 腳本跳一次權限詢問有人按得掉。整份掃會讓那幾支每次都被報成缺規則,而一份 每次都有雜訊的警告,看的人第二次就會跳過它——那時候真的漏一支就沒有人看得到。 技能本文的目錄名兩種版面都找:安裝版面帶 jsc- 前綴,開發用的並排工作目錄 版面不帶。原本只認一種,於是在另一種版面底下這道檢核被檔案存在檢查靜靜跳過 ——一道「找不到就當通過」的檢核,跟沒有那道檢核是同一件事。找不到就明說這 一次沒有比對過,不要不出聲。 只警告不中止。比對規則有可能跟不上本文的寫法,那時候不該連排程都裝不起來。 三份 manifest 版號 0.2.3 升到 0.2.4。 Co-Authored-By: Claude Opus 5 --- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- plugin.json | 2 +- tools/schedule.sh | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index bf8e177..23e3c38 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-assist", - "version": "0.2.3", + "version": "0.2.4", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "skills": "./skills", "author": { diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index ea94e6b..eeb25c8 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-assist", - "version": "0.2.3", + "version": "0.2.4", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "skills": "./skills", "jsc": { diff --git a/plugin.json b/plugin.json index 4b24fc3..65772c5 100644 --- a/plugin.json +++ b/plugin.json @@ -1,6 +1,6 @@ { "name": "jsc-assist", - "version": "0.2.3", + "version": "0.2.4", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "skills": "./skills/", "jsc": { diff --git a/tools/schedule.sh b/tools/schedule.sh index 16e7279..02fb50b 100755 --- a/tools/schedule.sh +++ b/tools/schedule.sh @@ -498,8 +498,12 @@ print_allow_rules() { # 代跑(那是已放行指令的子行程,不會再問一次),但收尾那一筆 skill-end 是技能自己用 Bash 叫的, # 那一次就要這一條規則。少了它,那一輪會停在最後一步的權限詢問,而排程那一輪沒有人可以按 # 同意:那一輪的收尾事件寫不出去,start 永遠配不到 end,下一輪就把一輪其實做完的巡檢報成中止。 + # run-due.sh 是巡檢那一輪真的執行到期內建項的那一支,技能自己用 Bash 叫它。少了這一條, + # 那一輪會停在那一步的權限詢問,而鎖已經握在手上:下一輪跟著讓開,一直到鎖逾時為止。 + # 它自己跑的那幾支盤點指令是它的子行程,不會再問一次,所以只要放行它自己這一條。 for _s in "$ROOT/jsc-assist/tools/schedule.sh" \ "$ROOT/jsc-assist/tools/patrol.sh" \ + "$ROOT/jsc-assist/tools/run-due.sh" \ "$ROOT/jsc-hooks/hooks/heartbeat.sh" \ "$ROOT/jsc-hooks/tools/report-status.sh" \ "$ROOT/jsc-gitea/tools/gitea.sh" \ @@ -508,12 +512,42 @@ print_allow_rules() { printf 'allow_rule=Bash(%s:*)\n' "$_s" printf 'allow_rule=Bash(sh %s:*)\n' "$_s" printf 'allow_rule=Bash(bash %s:*)\n' "$_s" + _printed="${_printed:-} ${_s#"$ROOT/"}" done # 檔案規則寫的是解出來的絕對路徑,不是 $JSC_HOME/assistant:設定檔不展開變數,寫變數名 # 等於這條規則永遠比對不到。 printf 'allow_rule=Read(%s/**)\n' "$STATE_DIR" printf 'allow_rule=Edit(%s/**)\n' "$STATE_DIR" printf 'allow_rule=Skill(jsc-gitea:wiki)\n' + + # 上面那份清單是寫死的,而技能本文哪天多叫一支腳本,這裡不會自己知道。漏一支的代價不是 + # 報錯,是那一輪停在權限詢問、鎖握在手上,接下來每一輪都讓開到鎖逾時為止——查起來只看得到 + # 「心跳過期」。所以這裡回頭掃一次技能本文,把它叫的每一支腳本跟上面印過的比對。 + # 只警告不中止:本文的寫法可能變,比對規則跟不上時不該連排程都裝不起來。 + # 目錄名以 jsc-assist 為準,找不到才退回不帶前綴的 assist:安裝版面是前者,開發用的並排 + # 工作目錄版面是後者。只認一種的話,在另一種版面底下這道檢核會被 [ -f ] 靜靜跳過—— + # 一道「找不到就當通過」的檢核,跟沒有那道檢核是同一件事。 + _skill='' + for _cand in "$ROOT/jsc-assist/skills/assistant/SKILL.md" \ + "$ROOT/assist/skills/assistant/SKILL.md"; do + [ -f "$_cand" ] && { _skill="$_cand"; break; } + done + if [ -z "$_skill" ]; then + note "找不到技能本文,這一次沒有比對「本文叫得到的腳本有沒有全部放行」。找過 $ROOT/jsc-assist 與 $ROOT/assist 兩處。規則清單照樣印在上面,但少一支就是那一輪停在權限詢問,請自己核對一次。" + else + _missing='' + # 只掃 patrol 那一節。規則防的是無人值守那一輪,而 start 與 status 兩個操作都有人在現場, + # 它們叫的腳本跳一次權限詢問有人按得掉。整份掃的話那幾支會每次都被報成缺規則,而一份 + # 每次都有雜訊的警告,看的人第二次就會跳過它——那時候真的漏一支就沒有人看得到了。 + for _w in $(awk '/^## patrol$/{f=1;next} f && /^## /{exit} f' "$_skill" \ + | sed -n 's|.*{CURRENT}/\(jsc-[a-z-]*/[a-z-]*/[a-z-]*\.sh\).*|\1|p' | sort -u); do + case " $_printed " in + *" $_w "*) ;; + *) _missing="${_missing:+$_missing、}$_w" ;; + esac + done + [ -z "$_missing" ] || note "技能本文叫得到、但上面的規則沒有涵蓋的腳本:$_missing。那一輪叫到它就會停在權限詢問,而鎖已經握在手上,接下來每一輪都會讓開到鎖逾時。請把這幾支補進這一支腳本的規則清單,再重跑一次 install。" + fi } # 巡檢那一輪只用 $JSC_HOME/current 那一組連結叫工具,連結不在就是那一輪一定失敗。這裡只查 -- 2.53.0