feat/work-package-pr-gate-and-comment-autofix #19

Merged
admin merged 3 commits from feat/work-package-pr-gate-and-comment-autofix into develop 2026-08-25 11:03:27 +00:00
Member

工作包 PR 硬閘門與留言自動修正

摘要

  • 需求描述:jsc-sdlc:implement 的 PR 檢查要成為強制規則——工作包的 PR 沒合併就禁止進入下一包,而且每次檢查都讀取該 PR 的全部留言並自動嘗試修正。原本這條規則只寫在 SKILL.md 內文,屬 prompt 層,模型可以無視;現在判定搬到 tools/wp-gate.sh。使用者另外裁決:修不動或純討論的留言直接忽略(不在 PR 回覆、不停下流程,但回報要逐筆列出),已處理的留言記時間戳不重複處理。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/wp-gate.sh 新檔。check 走 gitea.sh pr-status 判斷合併狀態:已合併就呼叫 sdlc-gate.sh wp-unlock 解鎖並 exit 0,未合併就印出全部留言並 exit 1 擋住。lock 在開完 PR 後上鎖,讓閘門跨工作階段有效。--since 過濾已處理過的留言。
skills/implement/SKILL.md 步驟 4 改成呼叫閘門、不再問「要修還是等」,留言修正一律以 sub agent 在原 worktree 進行並推同一條工作分支;步驟 6 明講閘門 exit 1 時不得挑任何工作包;步驟 11 補上 lock 子步驟。description 帶進硬閘門與留言自動修正。
references/branch.md 「PR 未合併就不開下一個工作包」那一節改為兩層閘門的分工表(工具閘門對 hook 閘門),程序細節仍歸 SKILL.md,維持單一真實來源。
README.md 新增「工具」段落收 wp-gate.sh(三個用法、exit code、狀態檔歸 jsc-hooks 管),implement 技能說明補上新行為。
三份 plugin.json 同步升版 0.1.4 → 0.1.5。

設計重點

  • 閘門查不到就不放行。gitea.sh pr-status 對不存在的 PR 會印 ? none none 並 exit 0,第一版把它當成 open,打錯 PR 編號就會派 sub agent 去追不存在的留言。現在加了欄位白名單,查不到一律 status=missing-dep exit 3——查不到的閘門若放行,等於沒有閘門。
  • closed 但未合併單獨回報 status=closed-unmerged,它不算完成。
  • latest= 取全部留言的最大時間戳,不是這次過濾後的。安靜的一輪不會讓時間戳倒退,避免舊留言被重複處理。
  • 相依腳本(gitea.sh、sdlc-gate.sh)的路徑同時支援並排存取庫與已安裝 plugin 兩種版面,找不到就 exit 3 並講明缺哪一支。
  • 呼叫 sdlc-gate.sh 一律關掉 stdin:hook 模式會讀標準輸入,管線沒人關閉時整支卡死(實測踩到過,hook 端也一併修)。
  • 已處理留言的時間戳寫回既有的 PR 欄位,不新增分析頁欄位——欄位定義歸 analyze 技能,這裡不越界。

測試結果

  • sh -n tools/wp-gate.sh 通過。
  • 用法護欄:無參數、缺 index、錯誤子命令、錯誤存取庫格式、--since 缺值都 exit 2 並印用法。
  • 真實 Gitea 實測(沙箱 JSC_HOME):已合併的 plugins/hooks#18 → status=merged、解鎖、exit 0;未合併的 plugins/hooks#19 → status=open、印出留言區塊與 latest=、exit 1;不存在的 #99999 → status=missing-dep、exit 3。
  • --since 過濾以注入的假 gitea.sh 驗過三筆留言:不給旗標 3 筆、--since 2026-08-24 2 筆、--since 2099-01-01 0 筆但 latest= 仍是最新那筆、三種情境都 exit 1。
  • 相依工具缺失:隔離環境下 status=missing-dep、exit 3,不會靜靜放行。
  • lock plugins/sdlc 42 產生 $JSC_HOME/wp/plugins-sdlc.pr;接著 check plugins/hooks 18 只清掉 plugins-hooks.pr,plugins-sdlc.pr 留著。
  • lock 與解鎖在不外部導向 stdin 的情況下都不再卡住。
  • 真實 ~/.jsc 未被寫入。
  • meta/tools/ste100-lint.sh sdlc 通過;SKILL.md 整份英文,僅保留要原樣輸出的繁中字面(含新增的「已處理留言」)。

前置 Push Request

  • plugins/hooks#20 — wp-gate.sh 執行期要呼叫 sdlc-gate.sh wp-lock 與 wp-unlock,那兩個子命令在該 PR 裡。已用 gitea.sh pr-depend 掛上依賴,前置未關閉前 Gitea 會阻擋本 PR 合併。
# 工作包 PR 硬閘門與留言自動修正 ## 摘要 - 需求描述:`jsc-sdlc:implement` 的 PR 檢查要成為強制規則——工作包的 PR 沒合併就禁止進入下一包,而且每次檢查都讀取該 PR 的**全部**留言並自動嘗試修正。原本這條規則只寫在 SKILL.md 內文,屬 prompt 層,模型可以無視;現在判定搬到 `tools/wp-gate.sh`。使用者另外裁決:修不動或純討論的留言直接忽略(不在 PR 回覆、不停下流程,但回報要逐筆列出),已處理的留言記時間戳不重複處理。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/wp-gate.sh` | 新檔。`check` 走 `gitea.sh pr-status` 判斷合併狀態:已合併就呼叫 `sdlc-gate.sh wp-unlock` 解鎖並 exit 0,未合併就印出全部留言並 exit 1 擋住。`lock` 在開完 PR 後上鎖,讓閘門跨工作階段有效。`--since` 過濾已處理過的留言。 | | `skills/implement/SKILL.md` | 步驟 4 改成呼叫閘門、**不再問「要修還是等」**,留言修正一律以 sub agent 在原 worktree 進行並推同一條工作分支;步驟 6 明講閘門 exit 1 時不得挑任何工作包;步驟 11 補上 `lock` 子步驟。`description` 帶進硬閘門與留言自動修正。 | | `references/branch.md` | 「PR 未合併就不開下一個工作包」那一節改為兩層閘門的分工表(工具閘門對 hook 閘門),程序細節仍歸 SKILL.md,維持單一真實來源。 | | `README.md` | 新增「工具」段落收 `wp-gate.sh`(三個用法、exit code、狀態檔歸 jsc-hooks 管),`implement` 技能說明補上新行為。 | | 三份 plugin.json | 同步升版 0.1.4 → 0.1.5。 | ## 設計重點 - 閘門查不到就**不放行**。`gitea.sh pr-status` 對不存在的 PR 會印 `? none none` 並 exit 0,第一版把它當成 open,打錯 PR 編號就會派 sub agent 去追不存在的留言。現在加了欄位白名單,查不到一律 `status=missing-dep` exit 3——查不到的閘門若放行,等於沒有閘門。 - `closed` 但未合併單獨回報 `status=closed-unmerged`,它不算完成。 - `latest=` 取**全部**留言的最大時間戳,不是這次過濾後的。安靜的一輪不會讓時間戳倒退,避免舊留言被重複處理。 - 相依腳本(`gitea.sh`、`sdlc-gate.sh`)的路徑同時支援並排存取庫與已安裝 plugin 兩種版面,找不到就 exit 3 並講明缺哪一支。 - 呼叫 `sdlc-gate.sh` 一律關掉 stdin:hook 模式會讀標準輸入,管線沒人關閉時整支卡死(實測踩到過,hook 端也一併修)。 - 已處理留言的時間戳寫回**既有**的 PR 欄位,不新增分析頁欄位——欄位定義歸 `analyze` 技能,這裡不越界。 ## 測試結果 - `sh -n tools/wp-gate.sh` 通過。 - 用法護欄:無參數、缺 index、錯誤子命令、錯誤存取庫格式、`--since` 缺值都 exit 2 並印用法。 - 真實 Gitea 實測(沙箱 `JSC_HOME`):已合併的 `plugins/hooks#18` → `status=merged`、解鎖、exit 0;未合併的 `plugins/hooks#19` → `status=open`、印出留言區塊與 `latest=`、exit 1;不存在的 `#99999` → `status=missing-dep`、exit 3。 - `--since` 過濾以注入的假 `gitea.sh` 驗過三筆留言:不給旗標 3 筆、`--since 2026-08-24` 2 筆、`--since 2099-01-01` 0 筆但 `latest=` 仍是最新那筆、三種情境都 exit 1。 - 相依工具缺失:隔離環境下 `status=missing-dep`、exit 3,不會靜靜放行。 - `lock plugins/sdlc 42` 產生 `$JSC_HOME/wp/plugins-sdlc.pr`;接著 `check plugins/hooks 18` 只清掉 `plugins-hooks.pr`,`plugins-sdlc.pr` 留著。 - `lock` 與解鎖在不外部導向 stdin 的情況下都不再卡住。 - 真實 `~/.jsc` 未被寫入。 - `meta/tools/ste100-lint.sh sdlc` 通過;SKILL.md 整份英文,僅保留要原樣輸出的繁中字面(含新增的「已處理留言」)。 ## 前置 Push Request - https://gitea.jsc.idv.tw/plugins/hooks/pulls/20 — `wp-gate.sh` 執行期要呼叫 `sdlc-gate.sh wp-lock` 與 `wp-unlock`,那兩個子命令在該 PR 裡。已用 `gitea.sh pr-depend` 掛上依賴,前置未關閉前 Gitea 會阻擋本 PR 合併。
jiantw83 added 3 commits 2026-08-25 11:00:54 +00:00
jiantw83 added a new dependency 2026-08-25 11:01:08 +00:00
admin merged commit 4a309a571d into develop 2026-08-25 11:03:27 +00:00
admin deleted branch feat/work-package-pr-gate-and-comment-autofix 2026-08-25 11:03:27 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: plugins/sdlc#19