fix/stdin-json-default-in-shared-lib
develop
hooks/lib.sh
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
hook_trace
emit_event
session_id
set -u
lint-scripts.sh
check-behaviors.sh
ste100-lint.sh
有幾條路徑在收尾時會往標準錯誤吐一行「參數未設定」,掃描結果其實是對的,但那行訊息讓人以為掃描失敗。註解範圍掃描的流程規定「安靜地回 0 才算通過」,這一行正好讓「安靜」這個判準失效。 根因在共用函式庫:hook_trace 裝的 EXIT trap 會在腳本結束時經由 emit_event 呼叫 session_id,而它第一件事就是讀 stdin JSON 那個變數。腳本在讀取標準輸入之前就離開時,那個變數還沒人設過,開了 set -u 的腳本收尾就報錯。 訊息裡的檔名有誤導性:dash 回報行號用被 source 檔的行號、檔名卻用呼叫端的名字,所以看起來像是呼叫端的第 30 行出錯,實際上在函式庫裡。用一支探針腳本確認過行號的來源。 修法是在共用函式庫載入期給那個變數一個預設值,寫在任何讀取它的函式之前。修在共用處而不是各腳本各補一次:讀它的是共用函式,補在共用處才涵蓋每一條離開路徑,也涵蓋往後新增的腳本。用帶預設的展開而不是直接指派空字串,呼叫端已經帶值進來時原樣保留。 這個缺陷不只一處。凡是「有 set -u、裝了 hook_trace、又在讀取標準輸入之前離開」的路徑都會中,實測四條路徑修前都吐、修後都安靜。 驗證三項:掃描回 0 且標準錯誤零位元組;陽性對照仍正確回 2 並印出命中,證明掃描還有作用;事件記錄仍然正常,且事件裡的工作階段欄位取自標準輸入而不是預設值。事件驗證用隔離的環境做,沒有污染正式事件流。
共用函式庫的收尾修正要靠版號才傳得到機器端。 三份 manifest 由 sync-skill-manifest.sh 同步,只動版本欄位。
No dependencies set.
The note is not visible to the blocked user.
摘要
變更內容
hooks/lib.shplugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
hook_trace裝的 EXIT trap 在腳本結束時經由emit_event呼叫session_id,而它第一件事就是讀 stdin JSON 那個變數。腳本在讀取標準輸入之前就離開時,那個變數還沒人設過,開了set -u的腳本收尾就報錯。set -u之後 source 函式庫再直接叫那個函式,它回報同樣的行號配探針自己的檔名。set -u、裝了hook_trace、又在讀取標準輸入之前離開」的路徑都會中。實測四條:註解範圍掃描的整區模式與規則提示模式、語言檢查的規則提示模式、寫入閘門的未知模式。修前都吐,修後都安靜。測試結果
lint-scripts.sh、check-behaviors.sh、ste100-lint.sh對這個存放庫都回結束碼 0。前置 Push Request