Merge pull request '釋出:排程條目不再寫死工作階段代號,CLI 判定跟上共用函式' (#25) from develop into master

Reviewed-on: #25
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
This commit was merged in pull request #25.
This commit is contained in:
2026-09-04 04:35:13 +00:00
5 changed files with 22 additions and 8 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jsc-assist", "name": "jsc-assist",
"version": "0.2.1", "version": "0.2.2",
"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.1", "version": "0.2.2",
"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.1", "version": "0.2.2",
"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
+18 -4
View File
@@ -303,7 +303,15 @@ patrol_command() {
[ -n "$PATROL_CMD" ] && { printf '%s' "$PATROL_CMD"; return 0; } [ -n "$PATROL_CMD" ] && { printf '%s' "$PATROL_CMD"; return 0; }
_cli="$CLI" _cli="$CLI"
[ -n "$_cli" ] || _cli="${JSC_CLI:-}" [ -n "$_cli" ] || _cli="${JSC_CLI:-}"
[ -n "$_cli" ] || { [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] && _cli=claude; } # 認得出 claude 的三個標記要跟 jsc-hooks 的 cli_name() 一模一樣。這裡本來只認第一個,
# 而工具腳本被叫用時那一個不會設,於是每一次不帶 --cli 的安裝都回用法錯誤——技能本文
# 的啟動步驟叫的正是不帶 --cli 那一種。同一個判斷寫兩份就是這樣漂走的:共用函式後來
# 補了兩個標記,這一份沒跟上,而漂移的代價是一個看起來像「這台機器沒裝 CLI」的錯誤。
# 共用函式加新標記時,這裡要一起加。
if [ -z "$_cli" ] && { [ -n "${CLAUDE_PLUGIN_ROOT:-}" ] || [ -n "${CLAUDECODE:-}" ] \
|| [ -n "${CLAUDE_CODE_SESSION_ID:-}" ]; }; then
_cli=claude
fi
case "$_cli" in case "$_cli" in
claude) _bin='claude'; _args="-p \"/jsc-assist:assistant 跑一輪巡檢 $ROOT_TOKEN\"" ;; claude) _bin='claude'; _args="-p \"/jsc-assist:assistant 跑一輪巡檢 $ROOT_TOKEN\"" ;;
codex) _bin='codex'; _args="exec '\$assistant 跑一輪巡檢 $ROOT_TOKEN'" ;; codex) _bin='codex'; _args="exec '\$assistant 跑一輪巡檢 $ROOT_TOKEN'" ;;
@@ -342,8 +350,14 @@ shq() { printf "'%s'" "$(printf '%s' "$1" | sed "s/'/'\\\\''/g")"; }
# 寫 NAME='' 進去,讀的人分不出是「刻意設成空」還是「安裝時忘了設」。 # 寫 NAME='' 進去,讀的人分不出是「刻意設成空」還是「安裝時忘了設」。
# JSC_GITEA_CONFIRM=yes 是必要的:寫入確認只認 tty,排程那一輪沒有 tty,不帶這個旗標監控頁 # JSC_GITEA_CONFIRM=yes 是必要的:寫入確認只認 tty,排程那一輪沒有 tty,不帶這個旗標監控頁
# 一定寫不成,而頁寫不成就不寫心跳,排程等於永遠空轉。 # 一定寫不成,而頁寫不成就不寫心跳,排程等於永遠空轉。
# 刻意不寫死工作階段代號。寫死的話那一輪的兩半會落在不同的值上:start 由 hook 寫,它從 hook
# 的標準輸入 JSON 讀得到 CLI 真正的代號;end 由工具腳本寫,沒有那份 JSON,只能讀環境變數,
# 於是讀到寫死的那個字串。兩半的代號不同就永遠配不起來,每一輪都被算成一支中止的技能,
# 而那個數字只增不減,最後把真的中止蓋掉——那一節存在的理由正是「只有 start 沒有 end 是
# 中止的唯一證據」。不設這個變數,兩半就都落在 CLI 自己給的代號上。
# 2026-09-04 實測:一台機器累積了 91 筆假中止,其中 90 筆是同一支被每輪叫用的技能。
env_prefix() { # 順便把快照到的變數名稱寫進 $1,供輸出列出名稱(只有名稱,不含值) env_prefix() { # 順便把快照到的變數名稱寫進 $1,供輸出列出名稱(只有名稱,不含值)
_p='JSC_CLI=cron JSC_SESSION_ID=schedule JSC_GITEA_CONFIRM=yes' _p='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:-}"
@@ -364,7 +378,7 @@ mask_secret() { sed "s/GITEA_TOKEN=[^ ]*/GITEA_TOKEN='***'/g"; }
cron_entry() { # $1=工作代號 cron_entry() { # $1=工作代號
_spec=$(spec_of "$1") _spec=$(spec_of "$1")
case "$1" in case "$1" in
heartbeat) _cmd="JSC_CLI=cron JSC_SESSION_ID=schedule '$HEARTBEAT' write" ;; heartbeat) _cmd="JSC_CLI=cron '$HEARTBEAT' write" ;;
patrol) _cmd="$ENV_PREFIX $PATROL_RESOLVED" ;; patrol) _cmd="$ENV_PREFIX $PATROL_RESOLVED" ;;
esac esac
printf '%s %s </dev/null >>%s 2>&1 %s' \ printf '%s %s </dev/null >>%s 2>&1 %s' \
@@ -445,7 +459,7 @@ trap 'rm -rf "$TMPD"' EXIT
# 巡檢指令與環境快照在這裡就解出來。放進 cron_entry 再解的話,那支是在命令替換的子行程裡 # 巡檢指令與環境快照在這裡就解出來。放進 cron_entry 再解的話,那支是在命令替換的子行程裡
# 跑,判不出 CLI 時 die 只結束子行程,主流程會帶著空指令繼續往下裝。 # 跑,判不出 CLI 時 die 只結束子行程,主流程會帶著空指令繼續往下裝。
PATROL_RESOLVED='' PATROL_RESOLVED=''
ENV_PREFIX='JSC_CLI=cron JSC_SESSION_ID=schedule JSC_GITEA_CONFIRM=yes' ENV_PREFIX='JSC_CLI=cron JSC_GITEA_CONFIRM=yes'
SNAPSHOT_NAMES='' SNAPSHOT_NAMES=''
case "$CMD:$JOBS" in case "$CMD:$JOBS" in
install:*patrol*) install:*patrol*)