feat(gitea): PR 盯場輪詢與 PR 讀取編修子指令 #22

Merged
admin merged 4 commits from feat/sdlc-flow-rules/pr-watch-and-edit into feat/sdlc-flow-rules/main 2026-08-27 03:26:03 +00:00
Member

摘要

  • 需求描述:落實「SDLC 執行流程」規則群裡由 jsc-gitea 提供的兩項能力。等待 PR 合併一律改用 pr-watch.sh 輪詢,預設 60 秒,不自動退場;分支已有 PR 時,每次認可後要比對標題、描述、上層 PR 依賴三項,有差才更新,所以本庫要先讀得到 PR 現況、也改得動 PR。決策紀錄在 wiki 存取庫 knowledges/QUESTION 的 QUESTION_FB8DF0B5,2026-08-27 那一節。
  • 計畫名稱:無
  • 計畫頁:無
  • 分析頁:無

變更內容

檔案 為什麼改
tools/gitea.sh 原本只有 pr-create 與 pr-status,讀不到既有 PR 的標題與描述,比不了就只能重開一支 PR 或整支蓋掉。新增 pr-get 讀出標題、base 與描述,pr-edit 一次更新標題與描述
tools/pr-watch.sh 新增。等 PR 合併原本各技能自己寫輪詢迴圈,間隔與退場條件每支都不同,還會自動逾時退場,PR 還開著就被當成收尾
README.md 指令清單補上三項新指令與退出碼,另補一段說明退出碼 10 的設計意圖;環境變數表補 JSC_HOME 與 JSC_PR_WATCH_INTERVAL
AGENTS.md 新增一條規則:盯 PR 等合併用 tools/pr-watch.sh,不要自己寫輪詢迴圈;收到 10 就把留言接回決策樹處理完再重新盯
plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json 行為變更要 bump 版本,安裝端才拿得到新版;三份同步升到 0.1.5

設計重點

  • pr-watch.sh 只偵測、不決策。退出碼 10 是交棒訊號而不是錯誤:有新留言就原樣印出來交還呼叫端跑決策樹,處理完再重新盯一次。輪詢與判斷分家,等待行為才只有一種。
  • 不自動逾時退場,盯到 PR 合併或關閉為止。JSC_PR_WATCH_INTERVAL 只調間隔,不調退場條件。
  • 已回報過的留言記在狀態檔(預設 $JSC_HOME/pr-watch/{owner}-{repo}-{編號}.seen),同一則不重複回報;狀態檔還不存在時把既有留言整批回報一次,寧可重複也不漏掉開始盯之前留下的審查意見。
  • PR 收尾那一輪若還有沒回報的留言,照樣印出來再退出,退出碼仍是 0:留言不會因為 PR 剛好合併就消失。
  • 打錯的 PR 編號用白名單擋下:pr-status 對不存在的 PR 會印「? none none」並正常結束,所以 state 只認 open 與 closed、merged 只認 true 與 false,對不上就回 3。少了這道白名單,編號打錯會變成永遠輪詢一支不存在的 PR。
  • 第一輪查詢失敗算環境沒接好,直接回 2;之後才失敗算連線抖動,警告一句繼續輪詢。
  • pr-get 把唯一會多行的描述放在輸出最後一段,呼叫端用 head -n1、sed -n 2p、tail -n +4 就取得到三個欄位,不必解析 JSON;pr-edit 的描述走檔案而不走參數,多行內容與全形標點才裝得下。

測試結果

  • sh -n tools/gitea.sh、sh -n tools/pr-watch.sh:兩支語法檢查都通過。
  • tools/pr-watch.sh 參數護欄四種情境各跑一次:不帶參數、存取庫沒寫成 {owner}/{repo}、PR 編號不是數字、JSC_PR_WATCH_INTERVAL 不是正整數。四種都印繁中錯誤訊息並回 2。
  • ste100-lint.sh .:全庫零命中。
  • 三份 manifest 以 JSON 解析器讀過,格式正確且版本一致為 0.1.5。
  • 未測:實際連上 Gitea 輪詢一支 PR,以及 pr-get、pr-edit 的 API 往返。本次在沒有 Gitea 存取的環境進行,需要可連線的主機與有效 token 才驗得到,請在審查時一併確認。

前置 Push Request

  • 無
## 摘要 - 需求描述:落實「SDLC 執行流程」規則群裡由 `jsc-gitea` 提供的兩項能力。等待 PR 合併一律改用 `pr-watch.sh` 輪詢,預設 60 秒,不自動退場;分支已有 PR 時,每次認可後要比對標題、描述、上層 PR 依賴三項,有差才更新,所以本庫要先讀得到 PR 現況、也改得動 PR。決策紀錄在 wiki 存取庫 `knowledges/QUESTION` 的 `QUESTION_FB8DF0B5`,2026-08-27 那一節。 - 計畫名稱:無 - 計畫頁:無 - 分析頁:無 ## 變更內容 | 檔案 | 為什麼改 | | --- | --- | | `tools/gitea.sh` | 原本只有 `pr-create` 與 `pr-status`,讀不到既有 PR 的標題與描述,比不了就只能重開一支 PR 或整支蓋掉。新增 `pr-get` 讀出標題、base 與描述,`pr-edit` 一次更新標題與描述 | | `tools/pr-watch.sh` | 新增。等 PR 合併原本各技能自己寫輪詢迴圈,間隔與退場條件每支都不同,還會自動逾時退場,PR 還開著就被當成收尾 | | `README.md` | 指令清單補上三項新指令與退出碼,另補一段說明退出碼 `10` 的設計意圖;環境變數表補 `JSC_HOME` 與 `JSC_PR_WATCH_INTERVAL` | | `AGENTS.md` | 新增一條規則:盯 PR 等合併用 `tools/pr-watch.sh`,不要自己寫輪詢迴圈;收到 `10` 就把留言接回決策樹處理完再重新盯 | | `plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` | 行為變更要 bump 版本,安裝端才拿得到新版;三份同步升到 0.1.5 | ## 設計重點 - `pr-watch.sh` 只偵測、不決策。退出碼 `10` 是交棒訊號而不是錯誤:有新留言就原樣印出來交還呼叫端跑決策樹,處理完再重新盯一次。輪詢與判斷分家,等待行為才只有一種。 - 不自動逾時退場,盯到 PR 合併或關閉為止。`JSC_PR_WATCH_INTERVAL` 只調間隔,不調退場條件。 - 已回報過的留言記在狀態檔(預設 `$JSC_HOME/pr-watch/{owner}-{repo}-{編號}.seen`),同一則不重複回報;狀態檔還不存在時把既有留言整批回報一次,寧可重複也不漏掉開始盯之前留下的審查意見。 - PR 收尾那一輪若還有沒回報的留言,照樣印出來再退出,退出碼仍是 `0`:留言不會因為 PR 剛好合併就消失。 - 打錯的 PR 編號用白名單擋下:`pr-status` 對不存在的 PR 會印「? none none」並正常結束,所以 state 只認 `open` 與 `closed`、merged 只認 `true` 與 `false`,對不上就回 `3`。少了這道白名單,編號打錯會變成永遠輪詢一支不存在的 PR。 - 第一輪查詢失敗算環境沒接好,直接回 `2`;之後才失敗算連線抖動,警告一句繼續輪詢。 - `pr-get` 把唯一會多行的描述放在輸出最後一段,呼叫端用 `head -n1`、`sed -n 2p`、`tail -n +4` 就取得到三個欄位,不必解析 JSON;`pr-edit` 的描述走檔案而不走參數,多行內容與全形標點才裝得下。 ## 測試結果 - `sh -n tools/gitea.sh`、`sh -n tools/pr-watch.sh`:兩支語法檢查都通過。 - `tools/pr-watch.sh` 參數護欄四種情境各跑一次:不帶參數、存取庫沒寫成 `{owner}/{repo}`、PR 編號不是數字、`JSC_PR_WATCH_INTERVAL` 不是正整數。四種都印繁中錯誤訊息並回 `2`。 - `ste100-lint.sh .`:全庫零命中。 - 三份 manifest 以 JSON 解析器讀過,格式正確且版本一致為 0.1.5。 - 未測:實際連上 Gitea 輪詢一支 PR,以及 `pr-get`、`pr-edit` 的 API 往返。本次在沒有 Gitea 存取的環境進行,需要可連線的主機與有效 token 才驗得到,請在審查時一併確認。 ## 前置 Push Request - 無
jiantw83 added 4 commits 2026-08-27 03:20:54 +00:00
What:`tools/gitea.sh` 新增 `pr-get` 與 `pr-edit`。`pr-get` 印出一支 PR 的標題、base 分支與描述,前三行固定 `title`、`base`、`body` 三個標記,第 4 行起是描述原文;`pr-edit` 從檔案讀描述,一次更新標題與描述。

Why:分支已經有 PR 時,每次認可之後都要比對標題、描述與前置 PR 依賴三項,有差才更新。原本只有 `pr-create` 與 `pr-status`,讀不到既有 PR 的標題與描述,比不了就只能重開一支 PR 或整支蓋掉,兩種都會把審查中的討論打斷。

How:`pr-get` 把唯一會多行的描述放在輸出最後一段,呼叫端用 `head -n1`、`sed -n 2p`、`tail -n +4` 就取得到三個欄位,全程不必解析 JSON。`pr-edit` 的描述走檔案而不走參數,多行內容與全形標點才裝得下;描述檔不存在回 `2`,API 呼叫失敗回 `4`,成功印 `OK {owner}/{repo}#{編號}`。

Who:`jsc-git:pr` 的既有 PR 校準步驟,以及任何要先比對 PR 現況再決定改不改的呼叫端。
What:新增 `tools/pr-watch.sh`,盯一支 PR 直到它合併或關閉。退出碼 `0` 是已合併或已關閉、`10` 是有新留言要呼叫端接手、`2` 是參數錯誤或第一輪就連不上 Gitea、`3` 是查不到該 PR。輪詢間隔預設 60 秒,`JSC_PR_WATCH_INTERVAL` 可覆寫。

Why:等 PR 合併原本靠各技能自己寫輪詢迴圈,間隔與退場條件每支都不一樣,還常常自動逾時退場,PR 明明還開著就被當成收尾。改用一支共用腳本之後,等待行為只有一種,而且盯到 PR 收尾為止。

How:資料一律經同目錄的 `gitea.sh`(`pr-status`、`pr-comments`),不自行拼 API。已回報過的留言把最後一筆時間戳寫進狀態檔,預設 `$JSC_HOME/pr-watch/{owner}-{repo}-{編號}.seen`,同一則不重複回報;狀態檔還不存在時把既有留言整批回報一次,寧可重複也不漏掉開始盯之前的審查意見。PR 收尾那一輪若還有沒回報的留言,照樣印出來再退出,退出碼仍是 `0`。`pr-status` 對不存在的 PR 會印「? none none」並正常結束,所以 state 只認 `open` 與 `closed`、merged 只認 `true` 與 `false`,對不上就回 `3`,PR 編號打錯不會變成永遠輪詢一支不存在的 PR。

Who:`jsc-sdlc:implement` 開完工作包 PR 之後的等待合併,以及任何要盯 PR 的技能。
What:README 的指令清單補上 `pr-get`、`pr-edit` 與 `pr-watch.sh` 三項與各自的退出碼,環境變數表補 `JSC_HOME` 與 `JSC_PR_WATCH_INTERVAL`;AGENTS.md 新增一條規則,盯 PR 等合併一律用 `tools/pr-watch.sh`,不要自己寫輪詢迴圈。

Why:新指令沒寫進 README,呼叫端就只能翻腳本原始碼。`pr-watch.sh` 的退出碼 `10` 更要講清楚:它不是錯誤,是「有新留言,換你處理」的交棒訊號,看成錯誤就會把留言吞掉。

How:README 依既有版面把三項排進指令區塊,另補一段說明退出碼 `10` 的設計意圖。AGENTS.md 把新規則插進第 5 條,原第 5 條順延為第 6 條。

Who:讀 `jsc-gitea` 說明的人,以及依 AGENTS.md 行事的代理。
What:`plugin.json`、`.claude-plugin/plugin.json`、`.codex-plugin/plugin.json` 的 `version` 由 0.1.4 改為 0.1.5。

Why:本次新增 `pr-get`、`pr-edit` 與 `pr-watch.sh`,屬於行為變更,版本要跟著往上走,各 CLI 才知道要更新。

How:三份只改 `version` 一個欄位,其餘內容不動,三份保持同一版號。

Who:`jsc-gitea` 外掛的套件描述檔。
admin merged commit 6a8fd95a2c into feat/sdlc-flow-rules/main 2026-08-27 03:26:03 +00:00
admin deleted branch feat/sdlc-flow-rules/pr-watch-and-edit 2026-08-27 03:26:03 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Reference: plugins/gitea#22