Communitygithub.com

oubakkiou/delegate-skills

delegate-skills — 將實作 / 調查 / Git 任務卸載到較便宜的模型。基於檔案的 md2idx 協議讓主要代理的上下文保持精簡。

delegate-skills 是什麼?

此技能組提供一套系統化的委派機制,允許 Claude Code、Codex、Devin 或 Cursor 等 AI 代理將實作、調查或 Git 相關的繁重任務卸載到較便宜的模型(如 Haiku)上執行。其核心是基於檔案的 md2idx 協議,透過標準化的 Markdown 請求/回應交換格式,讓主要代理的上下文更容易保持精簡。技能包含成本門檻評估邏輯,當任務過於簡單(例如單一 sed/find 命令)時,會建議不進行委派以減少開銷。此外,它還支援一次性執行、進階的分段腳本流程、可恢復/追加之工作階段,以及基於觀察值檔案的心跳監控,以實現更精細的控制。對於重複出現的任務,該技能會建議升級為專用技能,或自動化為腳本/鉤子/CI 流程。

相容平台✓Claude Code✓Codex CLI✓Cursor
npx skills add oubakiou/delegate-skills

在你喜歡的 AI 中提問

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

說明文件

delegate-chore

雜務的備援委派目標。task_type=chore,預設模型 haiku(最便宜)。執行系分支(Codex / Devin / Cursor / Claude)由 dispatch.sh 處理。

腳本路徑

  • Claude Code: skill_dir=.claude/skills/delegate-chore
  • Codex: skill_dir=.agents/skills/delegate-chore

後續的命令範例使用 Claude Code 的 .claude/skills/delegate-chore。若在 Codex 中使用,請替換為相同相對結構的 .agents/skills/delegate-chore。

模型價格參考

只有在需要進行成本分析或單價比較時,才讀取 <skill_dir>/model-token-prices.json。此數據僅供參考,不用於判斷是否啟動委派。

委派之前(成本閘門)

委派會產生開銷(工作進程啟動、請求/回應往返、主要端讀取)。如果此 chore 可以透過單一命令(例如 sed / find / chmod 等)撰寫成腳本,且不需要將任務內容載入模型上下文中,那麼委派很可能會造成純粹的損失(開銷超過了上下文衛生與 token 兩方面的收益)。在這種情況下,應由主要端直接執行,無需委派;如果需要重複執行,則轉而使用下述的反饋迴圈自動化提案。委派只有在需要模型讀取並處理內容的大量工作時才划算。依據請參閱 docs/design/delegate-chore.md §5。

執行流程(一次性)

  1. 建立請求: 透過 stdin 傳遞包含 Objective / Scope / Context / Acceptance criteria / Verification / Constraints 的 Markdown。請求應簡潔撰寫:Context 中不要貼上檔案內容,而是讓它透過路徑(必要時加上行號範圍)來引用(為了不增加主要端的輸出=計費 token)。
    • 如果使用者在對話中指定了模型或 effort,請在 run 呼叫前加上行內環境變數(例如: DELEGATE_CHORE_MODEL=gpt-5.5@high bash .../run.sh ...)。如果 exit code 為 6,則直接使用 stderr 中包含允許值列舉的整行作為對使用者的說明。
  2. 執行: out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/run.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID")"(如果是頂層啟動,$PARENT_TASK_TYPE_CHAIN 可以留空)。
    • run 內部會依序執行 prepare → dispatch → read-response,stdout 無論成功或失敗都回傳單一 JSON(包含 exit_code / status / content / content_truncated / response_file / observe_file / run_dir)。
    • selector 省略時的預設值為 auto。第 6 個位置參數是 read-response 的 selector,與 prepare.sh 的第 6 個位置參數 session_mode 意義不同。
    • exit code 會穿透內部腳本。exit 3 = 前提不足 / exit 4 = 委派循環,應中止。
    • run 會在 dispatch 之前先將 observe_file: <path> 輸出到 stderr。強制終止時,可將該路徑作為恢復途徑。
    • 在非互動模式的父進程(例如 claude -p)中,run 必須在前景執行,並設定比委派所需時間更長的 Bash timeout(Claude Code 可使用 BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS 或 Bash tool 的 timeout 參數)。
  3. 消費回應: 讀取 status="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .status)" / content="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .content)"。如果 content_truncated 為 true,則取出 response_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .response_file)",並透過 bash .claude/skills/delegate-chore/scripts/read-response.sh "$response_file" <N> 只分段讀取需要的 sections。讀取完成後,不要重新摘要(echo) worker 的本文。主要端對使用者的回應僅限於指向 Summary 的一行(為了不增加主要端的輸出=計費 token。詳見 spec.md §6)。

進階流程(個別腳本)

對於需要在 dispatch 過程中穿插父進程判斷的流程,例如 observe 監控、背景執行、可恢復 / 後續追加之類的,請使用傳統的個別腳本。

  1. 準備(聚合): 將前提檢查→模型解析→鏈結確認→請求生成濃縮到一個 prepare.sh 腳本中(以減少個別呼叫的 bash 往返及對主要端上下文的輸出)。透過 stdin 傳遞包含 Objective / Scope / Context / Acceptance criteria / Verification / Constraints 的 Markdown。請求應簡潔撰寫:Context 中不要貼上檔案內容,而是讓它透過路徑(必要時加上行號範圍)來引用(為了不增加主要端的輸出=計費 token)。exit 3 = 前提不足 / exit 4 = 委派循環,應中止。
    • 如果使用者在對話中指定了模型或 effort,請在 prepare 呼叫前加上行內環境變數(例如: DELEGATE_CHORE_MODEL=gpt-5.5@high bash .../prepare.sh ...)。如果 prepare 的 exit code 為 6,則直接使用 stderr 中包含允許值列舉的整行作為對使用者的說明。
    • out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID")"(如果是頂層啟動,$PARENT_TASK_TYPE_CHAIN 可以留空)
    • model="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .model)" / request_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .request_file)" / response_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .response_file)" / run_dir="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .run_dir)" / observe_file="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .observe_file)"
  2. 執行: bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file"。模型名稱前綴決定的執行系分支(Codex / Devin / Cursor / Claude)由 dispatch.sh 處理。stdout 僅輸出 response_file 的路徑。在非互動模式的父進程(例如 claude -p)中,dispatch 必須在前景執行,並設定比委派所需時間更長的 Bash timeout(Claude Code 可使用 BASH_DEFAULT_TIMEOUT_MS / BASH_MAX_TIMEOUT_MS 或 Bash tool 的 timeout 參數)。執行期間的常規監控僅透過 read-json.sh 從 observe_file 讀取 state.phase / state.started_at / heartbeat.ts / heartbeat.stdout_bytes / heartbeat.stderr_bytes / heartbeat.last_stream_change_at。state.phase 的值為 prepared | running | superseded | stalled | ended。prepared / superseded 表示未經 dispatch 的 observe(state.started_at == null,usage 未設定,read-json.sh 會回傳 null),因此彙總 usage 時應將其從分母中排除。
  3. 讀取回應: bash .claude/skills/delegate-chore/scripts/read-response.sh "$response_file" auto。auto 模式:如果回應較小(預設小於 10KB),則一次讀取 status 和所有 sections;如果較大,則回傳 status + index + Summary section,之後再根據需要透過 ... "$response_file" <N> 額外取得特定 sections。讀取完成後,不要重新摘要(echo) worker 的本文。主要端對使用者的回應僅限於指向 Summary 的一行(為了不增加主要端的輸出=計費 token。詳見 spec.md §6)。

工作階段重用(可恢復 / 後續追加)

可恢復 / 後續追加不屬於一次性流程的範疇,因此使用個別腳本。

預設為一般 run。只有在進行較大規模的跨檔案修改等、主要端審查時很可能退回的情況下,才從第一次開始就明確指定可恢復的初始 run。請勿過度使用。

  • 可恢復初始 run: 將 resumable 作為第 6 個參數傳遞給 prepare.sh。dispatch 則將 resumable 作為第 7 個參數,第 8、9 個參數傳遞空字串。
    • out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID" resumable)"
    • session_mode="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .session_mode)" / lineage_id="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .lineage_id)"
    • bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file" "$session_mode" "" ""
    • 讀取回應後,檢查 bash .claude/skills/delegate-chore/scripts/read-json.sh .backend_session.persistence "$observe_file"。如果不是 resumable,則視為無法後續追加,需立即判斷,不要期待事後的隱含備援。
  • 後續追加 run: 僅在主要端透過差異比對發現錯誤時使用。將 followup=<前次observe_file> 作為第 6 個參數傳遞給 prepare.sh。exit 5 表示驗證失敗,應中止,並以一般 delegate 的形式重新提出。不要進行隱含備援。
    • out="$(printf '%s' "$req_md" | bash .claude/skills/delegate-chore/scripts/prepare.sh chore DELEGATE_CHORE_MODEL haiku "$PARENT_TASK_TYPE_CHAIN" "$REQUESTER_SESSION_ID" "followup=$previous_observe_file")"
    • session_mode="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .session_mode)" / resume_id="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .resume_id)" / backend_session_home="$(printf '%s' "$out" | bash .claude/skills/delegate-chore/scripts/read-json.sh .backend_session_home)"
    • bash .claude/skills/delegate-chore/scripts/dispatch.sh "$model" chore "$request_file" "$response_file" "$run_dir" "$observe_file" "$session_mode" "$resume_id" "$backend_session_home"
    • 後續追加的請求中,必須包含主要端發現的錯誤、最新的 git diff 中應檢視的範圍,以及對前次 response_file 的引用。不要讓 worker 僅依賴其舊的對話上下文。

skill 升級提案(反饋迴圈)

流向 delegate-chore 的任務是「缺少專用 skill 的工作」的信號。消費回應後,如果該工作

  • 反覆出現 / 具有明確邊界且可重複使用的類別

則應透過 AskUserQuestion 向使用者提議建立新的專用 delegate-<name> skill(附帶建議的名稱 / 預設模型 / 工具權限 / 啟動類型)。達成共識後,使用 skill-creator 建立模板並遵循本協議。對於一次性或微不足道的 chore,則不提議。

針對確定性流程的腳本化提案

秉持與 skill 升級提案相同的精神,如果發現相同的多步驟命令序列、驗證步驟或定型編輯反覆出現,且分支固定、不需要 LLM 判斷時,應透過 AskUserQuestion 提議將其腳本化,或整合至 git hook / npm script / CI 等適當的自動化手段中(附帶目標步驟 / 自動化目標 / 預期觸發條件)。對於一次性步驟或需要判斷的步驟,則不提議。

等待時間的隱藏(針對互動式父進程)

在互動式父進程中,可以將 dispatch.sh(或 run.sh)在背景執行,並透過檢查 observe_file 的 state.phase / heartbeat,在 ended 之後再呼叫 read-response.sh,來隱藏使用者感知的等待時間。這僅是改善使用者體驗的優化,總耗時(wall time)並未改變。在非互動模式的父進程中,仍必須如前所述在前景執行。

限制

  • 允許編輯。但不可進行 push(push / PR 由主要代理直接處理)
  • 不可將任務重新委派給 task_type_chain 內已有的類型(可以委派給不同類型的 delegate)
  • 主要端不得 echo / 重新摘要 worker 的輸出。對使用者的回應僅限於指向 Summary 的一行(為了不增加輸出=計費 token。詳見 spec.md §6)

相關技能