develop
master
jsc-hooks
hooks/sdlc-gate.sh
wp-claim
wp-unclaim
wp-lock
wp-check
tools/wire-cli.sh smoke
JSC_WP_GATE=off
jsc-sdlc
wp-gate.sh
tools/wire-cli.sh
smoke
plan
implement
$JSC_HOME
$JSC_HOME/wp/
README.md
plugin.json
.claude-plugin/plugin.json
.codex-plugin/plugin.json
hooks/version-guard.sh
version-guard.sh
wp-check skill
$JSC_HOME/wp/{owner}-{repo}.claim
$JSC_HOME/wp/{owner}-{repo}-{index}.pr
WP-03
WP-3
3
status=unowned
jsc-git
jsc-git/tools/base-branch.sh --derive
git log --oneline origin/master..origin/develop
plugins/hooks#31
#30
git diff --stat origin/master origin/develop
plugins/hooks#30
wire-cli.sh smoke
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`。
What:`tools/wire-cli.sh` 的 `smoke` 新增一段,用一份暫時的 `$JSC_HOME` 狀態檔把「狀態檔不存在」「PR 屬於領取中的工作包」「PR 屬於別的工作包」「逃生門 `JSC_WP_GATE=off`」四種情境各跑一次,逐一比對結束碼;收尾那句 `status=ok` 的說明也跟著補上這一段。 Why:原本兩支 `wp-check` 冒煙都把技能名清空,只走得到「沒有未結清 PR」與「取不到技能名」兩條捷徑,歸屬比對整段一次都沒跑到。判定寫了卻沒驗,等於沒寫。 How:驗的是判定結果本身,不只是腳本跑得完——每一種情境都給定預期結束碼,對不上就計入失敗並印出前 200 字的輸出。狀態檔放在暫時目錄,冒煙測試不該在使用者真正的 `$JSC_HOME/wp/` 留下痕跡。每次呼叫都接 `</dev/null`:`wp-check` 會讀標準輸入,管線沒人關閉時整支會卡死。建不出暫存目錄也算失敗,不能靜悄悄跳過。 Who:`jsc-hooks:hooks-install` 接線後跑的冒煙測試,以及改動 `sdlc-gate.sh` 歸屬判定的人。
What:README 新增「工作包歸屬狀態檔」一節,用表列出鎖檔與領取檔的檔名、欄位與範例,寫明誰寫誰讀、查無歸屬一律放行、舊版 TSV 鎖檔照樣讀得動;`sdlc-gate.sh` 與 `wire-cli.sh` 兩列的說明同步補上新子命令與冒煙測試的新內容。 Why:狀態檔的格式是 `jsc-hooks` 與 `jsc-sdlc` 兩邊的介面。介面只寫在腳本註解裡,另一邊改的時候看不到,格式一走鐘歸屬就全部誤判。 How:格式壓到最簡的純文字 `key=value`,一行一欄位,順序不拘,不認得的鍵一律忽略,兩邊各自實作也對得上。表只寫欄位與範例,判定規則寫在表底下的三段短說明。 Who:讀 `jsc-hooks` 說明的人,以及 `jsc-sdlc` 那一側寫 `wp-gate.sh` 的人。
What:`plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` 的 `version` 由 0.2.2 改為 0.2.3。 Why:本次新增 `wp-claim`、`wp-unclaim` 兩個子命令並改了鎖檔格式,屬於行為變更,版本要跟著往上走,各 CLI 才知道要更新。 How:三份只改 `version` 一個欄位,其餘內容不動,三份保持同一版號。 Who:`jsc-hooks` 外掛的套件描述檔。
Reviewed-on: #30
No dependencies set.
The note is not visible to the blocked user.
摘要
jsc-hooks0.2.3 從develop放行到master。內容是使用者 15 條規則第一群「SDLC 執行流程」六條在本存取庫的落實:hooks/sdlc-gate.sh新增wp-claim、wp-unclaim兩個子指令,wp-lock多收一個工作包代號,wp-check加上歸屬比對;tools/wire-cli.sh smoke補驗四條歸屬判定路徑。變更內容
hooks/sdlc-gate.shwp-claim(領包當下登錄歸屬)與wp-unclaim(交回工作包,檔案不存在也算成功);wp-lock多收第四個參數,把 PR 掛到工作包名下,沒帶就印警告並在之後一律放行;wp-check加上歸屬比對,判定不是自己這一包的就擋,並在錯誤訊息裡指出JSC_WP_GATE=off這道逃生門。狀態檔一律由本檔寫,jsc-sdlc的wp-gate.sh只讀不寫——兩邊各拼各的檔案格式,一改就對不上,而且誰寫壞了看不出來。tools/wire-cli.shsmoke補驗工作包歸屬的四條判定路徑:狀態檔不存在、PR 屬於領取中的工作包、PR 屬於別的工作包(分plan與implement兩個技能各跑一次)、逃生門JSC_WP_GATE=off。自備一份暫時的$JSC_HOME狀態檔,不動使用者真正的$JSC_HOME/wp/;驗的是結束碼本身,不只是腳本跑得完。README.mdplugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
hooks/version-guard.sh都讀存取庫的預設分支master——version-guard.sh取 rawplugin.json時刻意不指定 ref,拿到的就是預設分支那一份。內容留在develop上再完整,已經安裝的 CLI 一律抓不到,版本檢查也照舊回報舊版本。階梯的前三級都已走完,這是最後一級,也是唯一會讓使用者端真的拿到新內容的一級。wp-claim、wp-unclaim。wp-lock多收第四個參數,就是工作包代號;沒帶時歸屬比對查不到來源,之後一律放行並印警告。wp-check skill在原本的「未結清期間擋掉別的階段技能」之上,多一段歸屬比對。$JSC_HOME/wp/{owner}-{repo}.claim、鎖檔$JSC_HOME/wp/{owner}-{repo}-{index}.pr。工作包代號WP-03、WP-3、3視為同一包,比對前先正規化。status=unowned並 exit 0。這與「查不到就擋」不衝突:那條講的是查得到卻查失敗,這條講的是根本還沒有歸屬可查;拿不存在的歸屬擋人,會讓沒登錄過的工作包全部動不了。jsc-git0.0.8):越級的 PR 會被擋下來,base 一律由jsc-git/tools/base-branch.sh --derive推導。JSC_WP_GATE=off,由 hook 這一層認:設了就整體放行,wp-check直接 exit 0。測試結果
git log --oneline origin/master..origin/develop:6 個 commit,最上面是已合併的plugins/hooks#31,其下是#30與四個實作提交,沒有夾帶別批的內容。git diff --stat origin/master origin/develop:6 個檔案、196 行新增、21 行刪除,與上表逐項對得上,沒有預期外的檔案。plugins/hooks#30、plugins/hooks#31完全相同。wire-cli.sh smoke的四條歸屬判定路徑在那兩支 PR 已經跑過,這支 PR 沒有重跑。合併之後建議在任一台已安裝的機器跑一次tools/wire-cli.sh smoke收尾。前置 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`。