feat(gitea): PR 盯場輪詢與 PR 讀取編修子指令 #22
1 Participants
Notifications
Due Date
No due date set.
Blocks
#22 feat(cli): 設定規格登錄 PR 盯場輪詢間隔
plugins/cli
#29 feat(sdlc): 工作包隔離、留言取得共識後再修、盯 PR 到合併與每任務一筆日誌
plugins/sdlc
#11 feat(git): PR 分支階梯推導與既有 PR 校準
plugins/git
Reference: plugins/gitea#22
Reference in New Issue
Block a user
摘要
jsc-gitea提供的兩項能力。等待 PR 合併一律改用pr-watch.sh輪詢,預設 60 秒,不自動退場;分支已有 PR 時,每次認可後要比對標題、描述、上層 PR 依賴三項,有差才更新,所以本庫要先讀得到 PR 現況、也改得動 PR。決策紀錄在 wiki 存取庫knowledges/QUESTION的QUESTION_FB8DF0B5,2026-08-27 那一節。變更內容
tools/gitea.shpr-create與pr-status,讀不到既有 PR 的標題與描述,比不了就只能重開一支 PR 或整支蓋掉。新增pr-get讀出標題、base 與描述,pr-edit一次更新標題與描述tools/pr-watch.shREADME.md10的設計意圖;環境變數表補JSC_HOME與JSC_PR_WATCH_INTERVALAGENTS.mdtools/pr-watch.sh,不要自己寫輪詢迴圈;收到10就把留言接回決策樹處理完再重新盯plugin.json、.claude-plugin/plugin.json、.codex-plugin/plugin.json設計重點
pr-watch.sh只偵測、不決策。退出碼10是交棒訊號而不是錯誤:有新留言就原樣印出來交還呼叫端跑決策樹,處理完再重新盯一次。輪詢與判斷分家,等待行為才只有一種。JSC_PR_WATCH_INTERVAL只調間隔,不調退場條件。$JSC_HOME/pr-watch/{owner}-{repo}-{編號}.seen),同一則不重複回報;狀態檔還不存在時把既有留言整批回報一次,寧可重複也不漏掉開始盯之前留下的審查意見。0:留言不會因為 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 .:全庫零命中。pr-get、pr-edit的 API 往返。本次在沒有 Gitea 存取的環境進行,需要可連線的主機與有效 token 才驗得到,請在審查時一併確認。前置 Push Request
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 的技能。