feat(hooks): 工作包歸屬比對與狀態檔格式 #30
1 Participants
Notifications
Due Date
No due date set.
Blocks
#29 feat(sdlc): 工作包隔離、留言取得共識後再修、盯 PR 到合併與每任務一筆日誌
plugins/sdlc
Reference: plugins/hooks#30
Reference in New Issue
Block a user
摘要
jsc-hooks這一側要提供的是狀態檔與 hook 端的比對:領取紀錄、鎖檔的工作包欄位、以及wp-check兩種模式的點名。決策紀錄在 wiki 存取庫knowledges/QUESTION的QUESTION_FB8DF0B5,2026-08-27 那一節。變更內容
hooks/sdlc-gate.shwp-claim、wp-unclaim,wp-lock收工作包代號,鎖檔改key=value,wp-check逐筆判歸屬並點名tools/wire-cli.shwp-check冒煙都把技能名清空,只走得到兩條捷徑,歸屬比對整段沒跑到。補一段用暫時$JSC_HOME把四條判定路徑各跑一次並比對結束碼README.mdjsc-hooks與jsc-sdlc的介面,只寫在腳本註解裡另一邊看不到。新增「工作包歸屬狀態檔」一節,兩支腳本的說明同步更新plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
wp與同一個存取庫領取檔的wp取數字比一次,兩邊都有值且不相等,那支 PR 就不是這裡該處理的。WP-03、WP-3、3先正規化再比。wp沒寫、領取檔不存在三種都算這一類。理由與version-guard.sh一致:只擋確定違規,不然會把技能組維護自己鎖死。implement一律放行,連別包的 PR 未結清也放行,只多印一則歸屬提醒。結清 PR 正是implement要做的事,擋它就沒有任何路徑能解除這道鎖;領取檔又不綁工作階段,擋下去連領那一包的工作階段都會被自己的舊紀錄擋住。jsc-sdlc,經由wp-claim與wp-lock進來。兩邊各拼各的檔案,格式一改就對不上,而且誰寫壞了看不出來。read_stdin在標準輸入是管線又沒人關閉時會一直等,工具腳本轉呼叫時會整支卡死。測試結果
sh -n hooks/sdlc-gate.sh、sh -n tools/wire-cli.sh:兩支語法檢查都通過。tools/wire-cli.sh smoke claude(用暫時的$JSC_HOME):status=ok,退出碼0。七支 hook 的每個接線模式都跑得完,新增的四條歸屬判定路徑逐條印出「與預期相同」——狀態檔不存在0、PR 屬於領取中的工作包且技能是implement為0、PR 屬於別的工作包且技能是plan為2、同情境技能是implement為0、逃生門JSC_WP_GATE=off為0。$JSC_HOME手動走過一輪完整情境:wp-claim jsc/demo WP-03之後wp-lock jsc/demo 12 WP-03與wp-lock jsc/demo 9 WP-01,wp-report印出兩列並帶第四欄工作包代號;wp-check prompt退出碼0並多印一行點名第 9 號不屬於領取中的工作包;wp-check skill對plan回2且訊息一併點名,對implement回0只印提醒。wp-report照樣讀得出來,第四欄留白。ste100-lint.sh .:全庫零命中。smoke,本機沒有安裝那些 CLI。前置 Push Request
What:`hooks/sdlc-gate.sh` 新增 `wp-claim {owner}/{repo} {工作包代號} [{PR 編號}] [{分析頁}]` 與 `wp-unclaim {owner}/{repo}` 兩個子命令,`wp-lock` 新增第四個參數收工作包代號,鎖檔改為純文字 `key=value`,`wp-report` 多印第四欄工作包代號。`wp-check` 逐筆判歸屬:`prompt` 多注入一行點名不屬於這裡的 PR,`skill` 擋下 `plan`、`analyze`、`maintain` 時一併點名,`implement` 仍放行但收到同一則提醒。 Why:同一份分析常有好幾包平行進行,每包各自的 worktree 與 PR。原本的鎖檔只記存取庫與 PR 編號,看不出那支 PR 是誰的,於是任何一個工作階段都可能去改別包的程式碼、回別包的留言。 How:歸屬只比一件事——鎖檔的 `wp` 與同一個存取庫領取檔的 `wp` 取數字比一次,兩邊都有值且不相等就是別包的。`WP-03`、`WP-3`、`3` 先正規化再比,不然同一包的幾種寫法會被當成不同包。任何一邊查不到(沒有分析頁、沒寫代號、領取檔不存在)一律當查無歸屬並放行,理由與 `version-guard.sh` 一致:只擋確定違規,否則會把技能組維護自己鎖死。舊版單行 TSV 鎖檔照樣讀得動,讀出來是查無歸屬,換格式不會讓既有的鎖失效。`implement` 一律放行,連別包的 PR 未結清也放行——結清 PR 正是 `implement` 的步驟,擋它會把流程鎖死。分類迴圈用 here-document 餵資料而不用管線,管線右邊是子 shell,判到的違規會在迴圈結束時全部消失。 Who:跑 SDLC 實作階段的每個工作階段,以及 `jsc-sdlc/tools/wp-gate.sh` 的 `claim`、`lock` 與 `owns`。