release: v0.2.3 develop 到 master #32

Merged
admin merged 6 commits from develop into master 2026-08-27 04:14:15 +00:00
Member

摘要

  • 需求描述:把 jsc-hooks 0.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.sh 新增 wp-claim(領包當下登錄歸屬)與 wp-unclaim(交回工作包,檔案不存在也算成功);wp-lock 多收第四個參數,把 PR 掛到工作包名下,沒帶就印警告並在之後一律放行;wp-check 加上歸屬比對,判定不是自己這一包的就擋,並在錯誤訊息裡指出 JSC_WP_GATE=off 這道逃生門。狀態檔一律由本檔寫,jsc-sdlc 的 wp-gate.sh 只讀不寫——兩邊各拼各的檔案格式,一改就對不上,而且誰寫壞了看不出來。
tools/wire-cli.sh smoke 補驗工作包歸屬的四條判定路徑:狀態檔不存在、PR 屬於領取中的工作包、PR 屬於別的工作包(分 plan 與 implement 兩個技能各跑一次)、逃生門 JSC_WP_GATE=off。自備一份暫時的 $JSC_HOME 狀態檔,不動使用者真正的 $JSC_HOME/wp/;驗的是結束碼本身,不只是腳本跑得完。
README.md 補上工作包歸屬狀態檔的欄位格式。
plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 三份 manifest 版本同步升到 0.2.3。

設計重點

  • 這一段才會讓已安裝的 CLI 抓到新內容。 marketplace 與本存取庫自己的 hooks/version-guard.sh 都讀存取庫的預設分支 master——version-guard.sh 取 raw plugin.json 時刻意不指定 ref,拿到的就是預設分支那一份。內容留在 develop 上再完整,已經安裝的 CLI 一律抓不到,版本檢查也照舊回報舊版本。階梯的前三級都已走完,這是最後一級,也是唯一會讓使用者端真的拿到新內容的一級。
  • 行為變更清單。
    1. 新增子指令 wp-claim、wp-unclaim。
    2. wp-lock 多收第四個參數,就是工作包代號;沒帶時歸屬比對查不到來源,之後一律放行並印警告。
    3. wp-check skill 在原本的「未結清期間擋掉別的階段技能」之上,多一段歸屬比對。
    4. 狀態檔是純文字 key=value:領取檔 $JSC_HOME/wp/{owner}-{repo}.claim、鎖檔 $JSC_HOME/wp/{owner}-{repo}-{index}.pr。工作包代號 WP-03、WP-3、3 視為同一包,比對前先正規化。
    5. 歸屬一律以分析頁的工作包代號為準,不看分支名、不看目錄名——那兩個都可能被改,改了也沒有徵兆。
  • 查無歸屬放行只提醒。 沒有分析頁、查不到工作包代號、領取檔不存在、工作包還沒掛上 PR,一律回 status=unowned 並 exit 0。這與「查不到就擋」不衝突:那條講的是查得到卻查失敗,這條講的是根本還沒有歸屬可查;拿不存在的歸屬擋人,會讓沒登錄過的工作包全部動不了。
  • 升級後使用者會立刻感受到的差異。
    • R4 工作包隔離:同一份分析常有好幾包平行進行,各有各的 worktree 與 PR。升級後動一支 PR 之前先比對歸屬,不是自己領的那一包就擋,並指出是哪一包持有它,交給那一包自己的工作階段處理。狀態檔不綁 session,開新對話照樣擋。
    • R3 分支階梯(jsc-git 0.0.8):越級的 PR 會被擋下來,base 一律由 jsc-git/tools/base-branch.sh --derive 推導。
    • 逃生門是 JSC_WP_GATE=off,由 hook 這一層認:設了就整體放行,wp-check 直接 exit 0。
  • 相關紀錄:工作日誌在 https://gitea.jsc.idv.tw/knowledges/LOG/wiki/LOG_FB8DF0B5,決策紀錄在 https://gitea.jsc.idv.tw/knowledges/QUESTION/wiki/QUESTION_FB8DF0B5 的 2026-08-27 一節。

測試結果

  • 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

  • 無
## 摘要 - 需求描述:把 `jsc-hooks` 0.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.sh` | 新增 `wp-claim`(領包當下登錄歸屬)與 `wp-unclaim`(交回工作包,檔案不存在也算成功);`wp-lock` 多收第四個參數,把 PR 掛到工作包名下,沒帶就印警告並在之後一律放行;`wp-check` 加上歸屬比對,判定不是自己這一包的就擋,並在錯誤訊息裡指出 `JSC_WP_GATE=off` 這道逃生門。狀態檔一律由本檔寫,`jsc-sdlc` 的 `wp-gate.sh` 只讀不寫——兩邊各拼各的檔案格式,一改就對不上,而且誰寫壞了看不出來。 | | `tools/wire-cli.sh` | `smoke` 補驗工作包歸屬的四條判定路徑:狀態檔不存在、PR 屬於領取中的工作包、PR 屬於別的工作包(分 `plan` 與 `implement` 兩個技能各跑一次)、逃生門 `JSC_WP_GATE=off`。自備一份暫時的 `$JSC_HOME` 狀態檔,不動使用者真正的 `$JSC_HOME/wp/`;驗的是結束碼本身,不只是腳本跑得完。 | | `README.md` | 補上工作包歸屬狀態檔的欄位格式。 | | `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` | 三份 manifest 版本同步升到 0.2.3。 | ## 設計重點 - **這一段才會讓已安裝的 CLI 抓到新內容。** marketplace 與本存取庫自己的 `hooks/version-guard.sh` 都讀存取庫的**預設分支** `master`——`version-guard.sh` 取 raw `plugin.json` 時刻意不指定 ref,拿到的就是預設分支那一份。內容留在 `develop` 上再完整,已經安裝的 CLI 一律抓不到,版本檢查也照舊回報舊版本。階梯的前三級都已走完,這是最後一級,也是唯一會讓使用者端真的拿到新內容的一級。 - **行為變更清單。** 1. 新增子指令 `wp-claim`、`wp-unclaim`。 2. `wp-lock` 多收第四個參數,就是工作包代號;沒帶時歸屬比對查不到來源,之後一律放行並印警告。 3. `wp-check skill` 在原本的「未結清期間擋掉別的階段技能」之上,多一段歸屬比對。 4. 狀態檔是純文字 key=value:領取檔 `$JSC_HOME/wp/{owner}-{repo}.claim`、鎖檔 `$JSC_HOME/wp/{owner}-{repo}-{index}.pr`。工作包代號 `WP-03`、`WP-3`、`3` 視為同一包,比對前先正規化。 5. 歸屬一律以分析頁的工作包代號為準,**不看分支名、不看目錄名**——那兩個都可能被改,改了也沒有徵兆。 - **查無歸屬放行只提醒。** 沒有分析頁、查不到工作包代號、領取檔不存在、工作包還沒掛上 PR,一律回 `status=unowned` 並 exit 0。這與「查不到就擋」不衝突:那條講的是查得到卻查失敗,這條講的是根本還沒有歸屬可查;拿不存在的歸屬擋人,會讓沒登錄過的工作包全部動不了。 - **升級後使用者會立刻感受到的差異。** - R4 工作包隔離:同一份分析常有好幾包平行進行,各有各的 worktree 與 PR。升級後**動一支 PR 之前先比對歸屬,不是自己領的那一包就擋**,並指出是哪一包持有它,交給那一包自己的工作階段處理。狀態檔不綁 session,開新對話照樣擋。 - R3 分支階梯(`jsc-git` 0.0.8):**越級的 PR 會被擋下來**,base 一律由 `jsc-git/tools/base-branch.sh --derive` 推導。 - 逃生門是 `JSC_WP_GATE=off`,由 hook 這一層認:設了就整體放行,`wp-check` 直接 exit 0。 - 相關紀錄:工作日誌在 <https://gitea.jsc.idv.tw/knowledges/LOG/wiki/LOG_FB8DF0B5>,決策紀錄在 <https://gitea.jsc.idv.tw/knowledges/QUESTION/wiki/QUESTION_FB8DF0B5> 的 2026-08-27 一節。 ## 測試結果 - `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 - 無
jiantw83 added 6 commits 2026-08-27 04:00:45 +00:00
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
admin approved these changes 2026-08-27 04:14:12 +00:00
admin merged commit 6a19dd483b into master 2026-08-27 04:14:15 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: plugins/hooks#32