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 那一組連結叫工具,連結不在就是那一輪一定失敗。這裡只查