Community程式設計與開發github.com

GravionLabs/deliver

逐項交付 PBI、Bug、功能或 Epic,使用子代理(實作、審查、PR、CI、合併)。用於 "/deliver 12" 或 "deliver feature 7"。

deliver 是什麼?

此技能自動化 GitHub 議題(PBI 或 Bug)的端到端交付流程。它使用子代理依次處理每個工作項目:實作變更、執行程式碼審查、建立 Pull Request、等待 CI 成功,然後合併。狀態完全儲存在 GitHub(議題、子議題、分支、PR)中,因此即使會話中斷,執行 `/deliver <nr>` 也能從中斷處繼續。支援互動模式(提問使用者)和無人值守模式(用於 `claude -p`、`opencode run`、`copilot -p`),並在 Claude Code、OpenCode 和 Copilot CLI 上運作。嚴格控管點是 `release/next` 分支上的規則集:如果必要檢查缺失或為紅色,則會封鎖合併。

相容平台✓Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/GravionLabs/skills/tree/HEAD/skills/delivery/deliver

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

交付開放中的 PBI 和 Bug(一個工作項目 = 標記為 pbi 或 bug 的開放議題;Bug 執行相同的循環,分支類型為 fix,Closes #<nr>)逐一處理:一個子代理實作,一個子代理審查,此會話開啟 PR,等待 CI 並合併。所有框架(Claude Code、OpenCode、Copilot CLI)上的步驟相同。狀態僅存在於 GitHub(議題、子議題、分支、PR)中,因此執行可以隨時停止,/deliver <nr> 會從中斷處繼續。嚴格控管點是 release/next 上的規則集:無論此會話做什麼,紅色或缺少的必要檢查都會封鎖合併。

輸入

help(或 --help、-h):不變地列印 references/help.md,不做其他事情。

/deliver status --milestone <name>:列印狀態區塊(## Status block)並停止,不交付任何內容。

/deliver <nr> [<nr> …] [--milestone <name>] [--unattended] [--inline] [--max <n>]:每個數字是一個 PBI、Bug、功能或 Epic;--milestone <name>(一個版本,M<n> 或傳統標題)會添加該里程碑中開放的工作項目(一次性批次讀取里程碑(pwsh <skill-dir>/../github-milestone/scripts/Get-Milestones.ps1 -Mode issues -Name <name> -State open:REST,所有頁面,不含 PR;github-milestone 查詢將 M4 解析為標題 M4,或在 close 之後解析為 M4 (0.2.0);按標籤過濾回傳的清單:pbi、bug),加上其中功能和 Epic 下方的子工作項目。該讀取的 milestone.title 是 gh issue create --milestone 的標題;<key> 是其 M<n> 或子編號 M<n>.<m>(傳統:標題),並命名狀態檔案和提示。缺失:詢問一次。--max <n> 在交付、封鎖或暫停了 n 個 PBI 後停止,並列印報告(scripts/Invoke-DeliverLoop.ps1 每個新會話使用 --max 1,references/loop.md)。

  • 互動(預設):暫停規則在聊天中詢問使用者;被封鎖的 PBI 詢問:重試、跳過或提供指示。
  • 控制會話:當 PBI 數量超過 deliver.loopThreshold(預設 3)時的互動模式,例如每個 --milestone:不要在此處交付它們,啟動 Invoke-DeliverLoop.ps1 並作為一個用於決策的瘦會話、interactive PBI 和步驟 9(references/control.md)。--inline 在此會話中交付所有內容(步驟 1 到 9)。--no-preflight 跳過開始步驟 3。
  • --unattended(claude -p、opencode run、copilot -p):永不詢問。暫停時在議題上留言,添加標籤 needs-decision,並繼續處理下一個不依賴於它的 PBI。

開始

  1. gh auth status 正常運行且儲存庫具有 release/next。
  2. gh api repos/{owner}/{repo}/rules/branches/release/next --jq '.[].type':輸出中沒有 required_status_checks → 警告紅色 CI 在此處可合併(github-release 的規則集),然後繼續。
  3. 預檢(透過 --no-preflight 跳過):pwsh <skill-dir>/scripts/Test-DeliverPreflight.ps1 -Harness <claude|opencode|copilot> [-Unattended] -Text 每項檢查列印一行:ok / fixed / action needed:堆疊技能、允許清單(git、gh、pwsh <skill-dir>/scripts/*、AGENTS.md 的驗證命令;每個框架的條目:references/permissions.md,否則無人值守執行會在提示處掛起)、過時的工作樹;反應在 references/preflight.md 中。編寫不含引號 $(…) 的命令;權限檢查無法看穿它們。
  4. 進度事件:沒有 AGENT_EVENTS_RUN 則執行 pwsh <skill-dir>/scripts/Report-Progress.ps1 -Type run.started -Source session 並保留列印的執行 ID。將 -Run <id> 添加到後續的每次呼叫(step.finished、attention、issue.finished、run.finished):Bash 呼叫不共用 shell 狀態,且 AGENT_EVENTS_RUN 作為前綴將不匹配允許清單。每一行進度、注意原因和結束都透過 Report-Progress.ps1 報告;它會將它們顯示在會話運行的任何終端中(references/terminal-backends.md)。

步驟

在聊天中每個步驟列印一行:#<nr> <step>: <result>(#12 review: 1 blocking → fix 1/2)。報告每一行:pwsh <skill-dir>/scripts/Report-Progress.ps1 -Type step.finished -Issue <nr> -Step <step> -Result "<result>" [-Pr <url>]。還有 -Type attention(-Kind pr_opened 在步驟 6 之後帶有 -Pr <url>,當審查或 CI 輪次開始修復輪次時為 review_fix,當步驟 7 為紅色時為 ci_red;-Reason):循環的通知僅來自這些事件。暫停、被封鎖的 PBI 或需要使用者的點:改用 -Type attention(-Kind paused、blocked 或 needs_you、-Reason)。每個 PBI 之後為 -Type issue.finished -Issue <nr> -Outcome <outcome>。

聊天中提到的每個 PR 和議題都寫為其完整 URL(https://github.com/<owner>/<repo>/pull/<n>、.../issues/<n>),而不是裸的 #<n>:裸數字在終端機中不是連結。這適用於進度行、給使用者的問題和報告,特別是釋出 PR(步驟 9),使用者必須合併它。從 gh(html_url)獲取 URL,永遠不要憑記憶建構。

  1. 選擇。 對每個編號及其子議題(github-issue references/sub-issues.md,遞迴到 PBI 和 Bug)執行 gh api repos/{owner}/{repo}/issues/<nr> --jq '{number,title,state,labels:[.labels[].name],body}'。收集所有編號和里程碑的開放工作項目(pbi 或 bug),移除重複項,保留那些沒有 needs-decision 的(其主體具有 ADR 標準的項目被報告為 #<nr> select: decision, write the ADR with adr);按其跨所有項目的 blocked-by 連結排序,並列保持參數的順序。使用 --milestone 時,透過具有沒有或不同里程碑的里程碑功能或 Epic 達到的 PBI 或 Bug 不被交付(#<nr> select: outside M<n>, skipped,提示:設定里程碑,github-issue references/milestones.md);沒有 --milestone 的 /deliver <feature> 會交付其所有 PBI。其封鎖者仍然開放且不在集合中的 PBI 會等待並被報告(里程碑外部的封鎖者永遠不會被交付)。具有 needs-refinement 的 PBI 或 Bug,或沒有重現步驟或驗收標準的 Bug,將被跳過(#<nr> select: needs refinement, skipped,提示 planner refine <nr>);對這類項目執行 /deliver <nr> 會拒絕它。無人值守時,帶有 interactive 的 PBI 被跳過(#<nr> select: interactive, skipped,提示在會話中 /deliver <nr>);互動模式交付它,也可以透過功能、Epic 或里程碑。帶有 release-test(里程碑的 RC 測試)的開放 PBI 永遠不會被選為工作,不在步驟 1 到 8 中,也不在控制會話中,即使使用 interactive 或作為明確的 <nr>:#<nr> select: release test, left for step 9(在有開放項目之前:release test, waits for <n> open items;等待中,不是 needs you;references/loop.md)。它保持開放以用於步驟 9 和人類(RC 測試在 RC 上執行)。跳過另一個會話已聲明的 PBI(#<nr> select: claimed, skipped),接管陳舊的聲明(references/claim.md);對 PBI 本身執行 /deliver <nr> 無論聲明如何都會繼續它。宣布下一個 PBI 並聲明它:gh issue edit <nr> --add-assignee @me;選擇行命名其層級和模型(#<nr> select: next (tier standard → sonnet/medium);沒有 Tier: 行則為 tier from size M 或 default;references/roles.md)。
    • 沒有 PBI 的功能或 Epic 子項目:在此會話中載入 planner(互動)和 grill-me,創建議題,然後再次選擇。無人值守:改為留言並標記 needs-decision。
  2. 恢復。 分支 <type>/<nr>-<slug>(github-issue)。git ls-remote --heads origin <branch> 和 gh api "repos/{owner}/{repo}/pulls?head=<owner>:<branch>&state=open" --jq '.[].number'(head 需要擁有者前綴):現有分支將被繼續,現有 PR 則跳到步驟 7。
  3. 實作。 一個具有全新上下文的子代理:「載入 implementation,角色 implement。在你的工作樹中實作 PBI #(Bug:先載入 diagnose,然後 implementation)在 <branch> 上,基底為 origin/release/next(現有分支:切換到它並 rebase)。驗收標準:<來自議題>。提交、推送,最多用 10 行報告:已完成或被封鎖,提交,測試執行,以及 notes[](每行一個);匹配的 specMap 條目若沒有規格變更則給出註記 no spec change needed: <spec> — <reason>(implementation references/specs.md)。」
  4. 審查。 一個具有全新上下文的子代理:「載入 code-review,角色 review。根據這些驗收標準審查 git diff origin/release/next...origin/<branch>:<標準>。使用 governance:執行 Get-GovernanceMatches.ps1 -Head origin/<branch>;議題標籤 和實作者 notes[] 。唯讀:在任何現有的檢出中不要 stash、checkout、switch 或 commit;如果你需要檔案,請使用你自己的臨時工作樹。僅回傳 JSON:code-review 的 review.schema.json 結果(blocking[] 包含 file、line、title、why;notes[],最多 5 個)加上 unmet[](未滿足的標準)。」只有阻塞性發現和未滿足的標準才算數。每輪之後,此會話(不是子代理)寫入檔案 <git-common-dir>/.agents/state/review-<nr>.json(git rev-parse --git-common-dir,所有工作樹中的同一個檔案,永不提交),覆蓋上一輪:{ pbi, branch, sha, round, unmet, review },sha = git rev-parse origin/<branch>,round = 基於 1 的審查輪次,review = 子代理的結果;架構 schema/deliver-review.schema.json。還有 pwsh <skill-dir>/../code-review/scripts/ConvertTo-Findings.ps1 -Review <result with unmet> -Sha <sha> -Worktree <pbi-worktree> 寫入 <pbi-worktree>/.agents/state/findings.json 以供 poimen 使用(永不提交,本地排除;references/findings.md)。
  5. 修復。 某些東西算數:一個具有全新上下文的子代理載入 implementation 角色為 fix,將其自己的工作樹切換到 <branch>(git fetch origin <branch>、git switch -C <branch> origin/<branch>),獲取恰好那些發現(blocking[] 和 unmet[]),提交並推送。然後再次執行步驟 4。每個 PBI 最多 2 個修復輪次,由審查和 CI 共享;第三輪是暫停。
  6. PR。 github-pull-request(其標題是沒有層級前綴的議題標題,附加 (#<nr>))使用 issue_number、branch: <branch>(工作從另一個工作樹推送,此檢出保持不變)、review_notes(步驟 4 的 notes[]),使用 governance spec_notes(實作者的 notes[] 行以 no spec change needed: 開頭)以及子代理的測試結果。
  7. CI。 直接執行 gh pr checks <pr> --watch --required --interval 60(每次輪詢是一個 GraphQL 查詢;預設 10 秒會耗盡配額),沒有 pipe 或輸出過濾器(例如 tail、head 或 grep),以便監控進度到達會話。
    • 由此次變更導致的紅色(diff 中檔案的測試、lint 或建置錯誤):修復輪次(步驟 5),然後再次執行步驟 4 和 7。
    • 由於其他原因導致的紅色(flaky、release/next 也是紅色):在 PR 上留言,PBI 被封鎖。
  8. 合併。 無需詢問,在兩種模式下:最後一次審查沒有阻塞性發現或未滿足的標準,且必要檢查為綠色。gh pr merge <pr> --squash --delete-branch,然後 gh issue close <nr> --comment "Delivered in #<pr>"(Closes 不會在 release/next 上觸發);PBI 的開放傳統 [Task] 子議題會隨之關閉(github-issue references/sub-issues.md,「傳統 Task 議題」);然後 gh issue edit <nr> --remove-assignee @me。用此技能的腳本清理子代理的工作樹和分支,scripts/Remove-PbiWorktrees.ps1 在技能目錄中(~/.claude/skills/deliver/ 全域,.claude/skills/deliver/ 專案安裝),從儲存庫執行:pwsh <skill-dir>/scripts/Remove-PbiWorktrees.ps1 -Pr <pr> -Issue <nr>;列印 #<nr> cleanup: <n> removed 並保留其 left 條目(路徑或分支、原因、命令)以供報告。下一個 PBI:步驟 1。
  9. 釋出。 僅在 --milestone 時,在報告之前(也在 --max 之後),當沒有 PBI 可選時。讀取里程碑一次,Get-Milestones.ps1 -Mode issues -Name <name> -State all(開放和關閉);開放工作檢查、標記、輪次計數和關閉議題的標準來自該清單。其中沒有標記為 pbi 或 bug 的開放議題,除了 release-test 議題(沒有被封鎖、暫停、等待或跳過的內容);RC 測試永遠不會封鎖。
    • 里程碑中標記為 needs-decision 的已關閉 PBI 或 Bug 是第 3 輪釋出審查的暫停標記:跳過審查,列印 release: paused in round 3, waits for a decision。
    • 釋出審查(references/release-review.md):一個具有全新上下文的子代理載入 code-review,角色 review,針對 git diff origin/main...origin/release/next,使用里程碑中已關閉 PBI 和 Bug 的驗收標準,重點關注跨 PBI 的一致性,並根據 review.schema.json 回傳 JSON,唯讀(在任何現有的檢出中不要 stash、checkout、switch 或 commit;如果需要檔案,則使用自己的臨時工作樹);此會話寫入 <git-common-dir>/.agents/state/release-review-<key>.json。
    • 阻塞性發現:里程碑中每個發現創建一個 [Bug] fix: … 議題(互動模式:顯示它們並先詢問),沒有釋出 PR;列印 release: <n> blocking → #a, #b。每個里程碑最多 2 個釋出審查輪次;第三輪有阻塞性發現是暫停,用該標記和一個命名兩種繼續方式的留言記錄(references/release-review.md,「暫停標記」)。
    • 乾淨(無阻塞):剪下 RC,在 release-test 議題上發布它並關閉較舊的(references/release-review.md,「RC 測試」);release.test.gate: true 在此處停止,顯示 needs you: RC test <issue URL>,直到議題被關閉。否則載入 github-release 並執行 finish,使用 release_review_notes(notes[],最多 5 個):它從 release/next 開啟一個到 main 的釋出 PR(auto_merge: false)或報告現有的;當 main 不是 release/next 的祖先時停止(先反向合併,github-release),報告該停止。列印 release: PR <URL>。然後是報告。

相關技能