feat/work-package-pr-gate-hook-enforcement #20
1 Participants
Notifications
Due Date
No due date set.
Blocks
#19 feat/work-package-pr-gate-and-comment-autofix
plugins/sdlc
Reference: plugins/hooks#20
Reference in New Issue
Block a user
工作包 PR 閘門:hook 端
摘要
jsc-sdlc/tools/wp-gate.sh(另一支 PR)。使用者裁決 hook 只擋別的階段技能並注入提醒,不擋提示——擋提示會讓使用者連「去修那支 PR」的對話都送不出去,把自己鎖在門外。變更內容
hooks/sdlc-gate.shwp-lock、wp-unlock、wp-report、wp-check {prompt|skill}四個子命令。狀態檔$JSC_HOME/wp/{owner}-{repo}.pr刻意不綁工作階段:PR 沒合併時換一個 session 照樣要擋,綁 session 等於留一道自動繞過的門。另外把檔頭的read_stdin改成只在需要的子命令才讀。hooks/hooks.jsonUserPromptSubmit接上wp-check prompt,PreToolUse(matcherSkill)接上wp-check skill。tools/wire-cli.shsmoke補上兩個wp-check模式,並在跑冒煙時清空技能名——留著繼承來的JSC_SKILL,有未結清 PR 時wp-check skill會把它當真實呼叫,冒煙就誤報成執行期錯誤。README.mdJSC_WP_GATE。設計重點
wp-check prompt一律 exit 0,只注入提醒。這是刻意的:擋提示等於把使用者鎖在門外,連修 PR 都做不了。wp-check skill對plan、analyze、maintainexit 2,放行implement。結清 PR 正是 implement 步驟 4 要做的事,擋它會形成死鎖。取不到技能名也放行(安靜降級)。wp-gate.sh的事,hook 要快且離線可用。read_stdin改為按子命令決定:lock需要 stdin(模型判定要transcript_path),wp-lock、wp-unlock、wp-report都不需要。原本無條件讀,工具腳本轉呼叫這三個子命令時會整支卡死等輸入——實測踩到過。JSC_WP_GATE=off一律放行,與既有的unlock並存。測試結果
sh -n hooks/sdlc-gate.sh、sh -n tools/wire-cli.sh通過;hooks.json可被json.load解析。JSC_HOME下的完整情境:無鎖時wp-check prompt與wp-check skill都靜默 exit 0;wp-lock plugins/sdlc 42之後wp-report印出該筆、wp-check prompt有提醒且 exit 0、wp-check skill對plan、analyze、maintain都 exit 2、對implement與jsc-git:prexit 0、不帶技能名 exit 0。JSC_WP_GATE=off時上述 exit 2 情境全部變 exit 0。wp-unlock冪等:重複執行仍 exit 0;解鎖只清掉對應那一筆,其他鎖不受影響(實測plugins-hooks.pr被清、plugins-sdlc.pr留著)。checkexit 0;造鎖後report印出階段與標籤、合格模型 exit 0、不在標籤表上的模型 exit 2(訊息不變);lock bogus仍 exit 1。wire-cli.sh smoke claude七個接線模式全 exit 0;刻意帶JSC_SKILL=jsc-sdlc:plan且有未結清 PR 時仍 exit 0,確認清空技能名有效。wp-lock、wp-unlock、wp-report不再需要外部導向 stdin 也不卡。~/.jsc未被寫入任何wp/檔案。meta/tools/ste100-lint.sh hooks通過,無簡體字、中文標點全形。前置 Push Request