Merge pull request '補印執行那一支的允許規則,並回頭比對本文叫得到的每一支' (#28) from fix/schedule-prints-run-due-rule-and-self-checks into develop

Reviewed-on: #28
This commit was merged in pull request #28.
This commit is contained in:
2026-09-04 06:22:18 +00:00
4 changed files with 37 additions and 3 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-assist", "name": "jsc-assist",
"version": "0.2.3", "version": "0.2.4",
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
"skills": "./skills", "skills": "./skills",
"author": { "author": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-assist", "name": "jsc-assist",
"version": "0.2.3", "version": "0.2.4",
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
"skills": "./skills", "skills": "./skills",
"jsc": { "jsc": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-assist", "name": "jsc-assist",
"version": "0.2.3", "version": "0.2.4",
"description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)", "description": "助理:事件收攏、健康巡檢與待辦簿(MONITOR_{HASH} wiki 頁)",
"skills": "./skills/", "skills": "./skills/",
"jsc": { "jsc": {
+34
View File
@@ -498,8 +498,12 @@ print_allow_rules() {
# 代跑(那是已放行指令的子行程,不會再問一次),但收尾那一筆 skill-end 是技能自己用 Bash 叫的, # 代跑(那是已放行指令的子行程,不會再問一次),但收尾那一筆 skill-end 是技能自己用 Bash 叫的,
# 那一次就要這一條規則。少了它,那一輪會停在最後一步的權限詢問,而排程那一輪沒有人可以按 # 那一次就要這一條規則。少了它,那一輪會停在最後一步的權限詢問,而排程那一輪沒有人可以按
# 同意:那一輪的收尾事件寫不出去,start 永遠配不到 end,下一輪就把一輪其實做完的巡檢報成中止。 # 同意:那一輪的收尾事件寫不出去,start 永遠配不到 end,下一輪就把一輪其實做完的巡檢報成中止。
# run-due.sh 是巡檢那一輪真的執行到期內建項的那一支,技能自己用 Bash 叫它。少了這一條,
# 那一輪會停在那一步的權限詢問,而鎖已經握在手上:下一輪跟著讓開,一直到鎖逾時為止。
# 它自己跑的那幾支盤點指令是它的子行程,不會再問一次,所以只要放行它自己這一條。
for _s in "$ROOT/jsc-assist/tools/schedule.sh" \ for _s in "$ROOT/jsc-assist/tools/schedule.sh" \
"$ROOT/jsc-assist/tools/patrol.sh" \ "$ROOT/jsc-assist/tools/patrol.sh" \
"$ROOT/jsc-assist/tools/run-due.sh" \
"$ROOT/jsc-hooks/hooks/heartbeat.sh" \ "$ROOT/jsc-hooks/hooks/heartbeat.sh" \
"$ROOT/jsc-hooks/tools/report-status.sh" \ "$ROOT/jsc-hooks/tools/report-status.sh" \
"$ROOT/jsc-gitea/tools/gitea.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(%s:*)\n' "$_s"
printf 'allow_rule=Bash(sh %s:*)\n' "$_s" printf 'allow_rule=Bash(sh %s:*)\n' "$_s"
printf 'allow_rule=Bash(bash %s:*)\n' "$_s" printf 'allow_rule=Bash(bash %s:*)\n' "$_s"
_printed="${_printed:-} ${_s#"$ROOT/"}"
done done
# 檔案規則寫的是解出來的絕對路徑,不是 $JSC_HOME/assistant:設定檔不展開變數,寫變數名 # 檔案規則寫的是解出來的絕對路徑,不是 $JSC_HOME/assistant:設定檔不展開變數,寫變數名
# 等於這條規則永遠比對不到。 # 等於這條規則永遠比對不到。
printf 'allow_rule=Read(%s/**)\n' "$STATE_DIR" printf 'allow_rule=Read(%s/**)\n' "$STATE_DIR"
printf 'allow_rule=Edit(%s/**)\n' "$STATE_DIR" printf 'allow_rule=Edit(%s/**)\n' "$STATE_DIR"
printf 'allow_rule=Skill(jsc-gitea:wiki)\n' 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 那一組連結叫工具,連結不在就是那一輪一定失敗。這裡只查 # 巡檢那一輪只用 $JSC_HOME/current 那一組連結叫工具,連結不在就是那一輪一定失敗。這裡只查