Community程式設計與開發github.com

amberpixels/ship

f10 的 ship 技能 - 依照專案的流程處理任務:實作,然後依據專案宣告的步驟進行(審查、提交、PR/MR、部署);會根據需要擷取和規劃,然後完整執行整個流程。當使用者輸入 "/f10:ship [<task-id | plan-file.md | description>]" 時使用。

ship 是什麼?

這是一個名為「f10 · ship」的 AI 代理技能,專為 f10 專案工作流程中的任務處理而設計。它的核心功能是自動化地將一個開發任務(透過任務 ID、計畫檔案或自由文字描述指定)推進到完成,包含實作、審查、提交、建立 PR/MR,以及部署等步驟。 此技能會先執行「擷取」(capture)和「提取」(fetch)步驟來獲取任務上下文,若無現有計畫則會進行「規劃」(plan),然後嚴格依照專案 frontmatter 中定義的流程,按順序執行每個條目(entry)。技能支援多種流程(flows)和步調(paces),可透過 `f10 flow` 命令進行管理,並能根據任務的類型(如「spike」)自動調整行為,例如 spike 任務在實作後即告結束,不會進行後續的提交或部署。 此技能的一個關鍵設計是明確的使用者授權機制:執行此技能即代表使用者授權其進行推送、開啟或重新整理 PR 等操作,從而覆蓋了「未經要求不得推送/開啟 PR」的全局規則。此外,技能還內建了「追趕守衛」(catchup guard),能夠在實作、PR 和變更評判(change judge)等關鍵步驟前,自動整合基礎分支的最新變更,以避免程式碼衝突。 該技能會產生詳細的徽章狀態(badge)和報告,並將最終成果(shipment)記錄在每個交付性條目的定義中。它適用於任何遵循 f10 規範的專案,並支援 Claude Code、Cursor、Codex 等主要代理平台。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/amberpixels/f10/tree/HEAD/skills/ship

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

在你喜歡的 AI 中提問

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

說明文件

f10 · ship

執行此技能即為使用者明確授權,允許進行推送、開啟或重新整理此任務的 PR(即 pr 步驟),並為該 PR 滿足「未經要求,絕不推送/開啟 PR」的全局規則。同時,也授權張貼 resolve 的 +reply、將 resolve 的修正推送到該 PR、張貼 review 的 f10 review ack,以及在流程中進行 CI 審查時,張貼其 f10 review trigger(當審查區塊宣告了一個手動方式說明如何讀取時)與 resolve 的 f10 review settle,並在 pr 後進行評判(judge)時,將追趕守衛的整合及其自身變更推送到該 PR、張貼其狀態與評論,以及張貼該次執行的回報評論和任務狀態(報告回報)。 部署有自己的確認機制(即 deploy 步驟)。

引數

  • --help:遵循 ${CLAUDE_PLUGIN_ROOT}/modes/help.md 並停止;以下內容均不適用。
  • --dry-run:遵循 ${CLAUDE_PLUGIN_ROOT}/modes/dry-run.md,而不實際執行任何操作,並停止。它會報告其餘引數將會執行哪些步驟。
  • --driven:遵循 ${CLAUDE_PLUGIN_ROOT}/modes/driven.md;以下所有內容仍會被執行。
  • 一個流程名稱作為一個詞(/f10:ship direct: fix typo …;f10 start --local 會送出 /f10:ship local: <id>,--flow <name> 會送出 <name>:),或由使用者用自己的話命名:執行該流程。否則,流程由 frontmatter 的 flow_by_area 根據任務的區域(area)來對應(從提取摘要的 areas 取得,否則從計畫的 Areas 行取得),如果都沒有則使用 default。當兩個區域對應到不同的流程時,交付物的區域具有優先權(如同角色(Roles)機制),而摘要則會命名另一個區域。區域對應是專案的選擇,而非你的選擇:絕不要自行選擇其他流程,但對於微小的工作,你可以建議一個。在第一步之前,用一行文字說明某個區域所選擇的流程名稱以及該區域的名稱。
  • --pace <name>:僅在本次執行中以該步調(pace)執行此流程(步調,見下文);如果沒有此引數,則使用分支記錄的步調,否則使用專案或用戶設定的 pace:。
  • <plan.md>:一個計畫檔案;使用此計畫執行流程。
  • <task-id>(專案 ID 格式 / ID / URL),或由 + 連接的捆綁(ABC-1+ABC-2,以主要任務為鍵):首先遵循 ${CLAUDE_PLUGIN_ROOT}/modes/forward.md,然後再載入任何內容;如果轉發了該任務則停止。否則,執行 fetch 步驟,然後查找 <storage root>/plans/<TASK-ID>.md(捆綁的主要任務)(如果確切名稱找不到,則對計畫目錄進行全域搜尋)。 找到:重複使用它,永遠不要詢問;有計畫檔案的任務永遠不會再次規劃,重新規劃需手動執行 /f10:plan <id>。 找不到:在 stale_after 之後,提取步驟會先判斷一個舊任務,並可能導致在進行任何計畫或流程條目前就阻塞執行(anyway 在舵機(steering)設定中可跳過此檢查);然後,當流程以 plan 開頭時,執行 plan 步驟(使用 flow_by_area 時,start 和 drive 會將規劃工作留給 ship);一個無計畫的流程(見下文)永遠不會執行此步驟,而提取摘要會成為內聯計畫。然後執行流程。
  • <description>:自由文字;執行 capture、fetch 和 plan 步驟,然後執行流程。
  • 無引數(僅標誌或流程詞視為無引數;描述是自由文字,見上方):為此對話中已有的任務(剛保存的計畫、剛提取的任務),否則為分支的任務,即 f10 task current 輸出的 ID。用一行說明你選取了哪個任務及其來源,然後像 <task-id> 一樣執行它,包括轉發模式,以便重複使用已保存的計畫。 f10 task current 返回非零退出碼:用一行詢問任務並等待(driven 模式:根據 modes/driven.md 進行詢問)。
  • 主題之外的額外文字為舵機(steering)指令。 resume at <entry>(由 f10 drive 在追趕(catchup)解決了停止點後發出)從該條目開始執行流程,並將之前的條目標記為已完成;(entry <n>) 在流程兩次命名同一條目時,選擇徽章管線(pipeline)中的第 n 個條目。徽章會移動到該位置:在 pipeline 之後,一次呼叫會依序對其之前的每個條目執行 set ship running,然後對該條目本身執行。

執行

  1. 在每次呼叫此技能時,首先執行 f10-load-project.sh,並根據輸入內容命名所需的步驟:描述需要 capture fetch plan,任務 ID 需要 fetch plan,計畫檔案則不需要。流程在其輸出的 project.md 中宣告;無計畫的流程會載入 plan 但從不執行它。
  2. 按照引數項目中給定的順序執行這些步驟。
  3. 在每個流程條目即將執行前載入它,一次呼叫並帶有其徽章:f10-state.sh set ship running <entry>; f10-load-project.sh <step>,並根據該次載入遵循該步驟。 review 條目會載入 review resolve,而 pr 條目會載入 pr handoff,除非其 handoff off 撥號設定為關閉,因為 pr 步驟會執行交接(handoff);追趕守衛(見下文)會在其守護的每個條目的載入中加入 catchup。

**流程(Flows)**是 frontmatter 的 flows:,一個名稱對應到其有序的條目列表,可以是一個列表或一個由空格或箭頭分割的字串(plan judge implement cleanup:comments,prose pr review:ci deploy:staging);如果未宣告,則為 default: plan implement pr。 f10 flow 會列出所有流程以及選擇每個流程的條件。

**步調(Paces)**用於調整所選的流程(docs/project-setup.md → 步調)。 一旦選擇了流程,執行 f10 flow <name> [--pace <name>],僅當引數提供了 --pace 時才傳遞它,並按照其輸出的順序執行條目,永遠不要使用 frontmatter 的列表。 它每行輸出一個條目。 標記為 skipped 的條目不執行:用一行說明它被跳過,並將其排除在徽章的 pipeline 之外。 條目後的撥號設定會與條目一起傳遞給其步驟:rounds 和 depth 傳遞給 review,marker 和 handoff 傳遞給 pr;評判者(judge)的 effort 僅在評判者產生一個代理時適用(--blind),該代理的設定檔則來自 f10 agents judge,並帶有 --pace <name>(如果引數提供了);內聯評判者則在任務代理的設定檔上執行。 步調跳過開頭的 plan 會使此次執行變成無計畫,如同一個沒有 plan 的流程一樣。 finish 行表示執行在一個步調原本會合併的開放 PR 處結束:ship 永遠不會合併它,並且報告的 Next: 會命名 /f10:finish <id> --merge,除非是 drive 模式完成任務(modes/driven.md)。 沒有步調時,列表就是宣告的流程,並帶有一個可選的、已經解決的 CI 審查(ci?)。 如果 f10 flow 版本太舊無法接受名稱,則會失敗:執行宣告的流程,並用一行說明未套用該步調。

一個條目可以是一個步驟,或者 step:arg:一個通用步驟加上其覆蓋層,或者是一個專案自訂的步驟,其引數會傳遞給它(review:local 或 review:ci 設定審查的 by(誰來審查),review:host 在主機自己的程式碼審查系統上執行本地審查,review:local+ci 將兩者合併為一輪審查和一次解決(resolve),review:local+ci? 僅在 CI 審查可以執行時執行它,並且 f10 flow <name> 會在 ship 看到該條目前解決 ?;cleanup:<targets> 設定清理目標,這些目標總是會進行完整處理,而裸寫的 cleanup 則對少於 200 行新增的 diff 執行輕量清理;deploy:<env> 設定部署環境)。 執行從開頭的 plan 之後的條目開始,plan 僅在任務沒有計畫檔案時執行。 resolve 永遠不會被命名:review 條目會執行它。 judge 條目根據位置進行評判:在 implement 之前是計畫評判者(主題 plan <id>),其黃色評判結果會就地修改計畫檔案且不寫入程式碼;在 implement 之後是變更評判者,它會自行建構黃色評判結果的變更,並按照 judge 步驟在 pr 前後的說明進行路由。 pr 條目會開啟分支的 PR,或者在已有開啟的 PR 時重新整理它,因此流程可以在審查或評判之後再次命名 pr 以使描述保持最新。 沒有開頭 plan 的流程是無計畫的:它不寫入計畫檔案,並且聊天的簡要內聯計畫會代替它,除非存在已保存的計畫。 舊的鍵名(pipelines、planless、drive_chain)仍然可讀,但會轉換為流程並帶有警告,提示使用名稱 f10 init --migrate,舊的條目格式 review (local) 也是如此。 自由文字輸入也會跳過 capture 和 fetch,因此執行沒有任務 ID。 任務 ID 會執行 fetch 並使執行與該 ID 綁定(徽章、報告、分支、審查目錄),並在提取後標記 f10-state.sh set plan skipped,除非它重複使用已保存的計畫(prior,見下文)。 其內聯計畫會說明 extract 所確定的類型,包含錯誤的再現步驟與根本原因,重構的不變量或 spike 的問題各一行,並列出任何預設值下的差距。 使用任務 ID 時,內聯計畫還會像 plan 步驟一樣寫入變更的意圖(f10 lore add intent --change <change> -m <what and why>、docs/lore.md);一個已存在的意圖,或新增失敗,會在報告中以一行說明,而不是一個失敗的步驟。 **成果(Shipment)**是最後一個交付性條目的(conventions/context.md → shipment):其行是該步驟宣告的那些行,專案自訂步驟則在其覆蓋層的 Shipment: 行中;之後的 judge、demo 或 handoff 條目會新增行,而不是替換它們。 demo 條目如果沒有可展示的內容,則會用一行跳過(demo 步驟),這是一個正常的結束,不會新增任何行。

Spike 在實作後結束,無論流程為何:一個 Kind: spike 的計畫回答一個問題,其程式碼永遠不會離開機器。 實作之後的步驟不會執行(不進行清理、提交、推送、PR、審查、評判或部署);成果就是 spike 報告。 最終報告以其關閉結束:f10 finish <id>,該命令會封存計畫和報告,丟棄實驗程式碼並移除工作樹、分支和工作空間;--keep 則保留實驗,並提交到一個 kept/ 分支上。 在驅動模式(driven)的 spike 中,報告不需要關閉:f10 drive 會在 ship 之後關閉它。 在主檢出(main checkout)中,在 f10 finish 之前,按照報告命名的路徑丟棄實驗程式碼,f10 finish 會拒絕一個骯髒的主檢出。 其回報(見下文)包含問題、答案和建議;它僅在 visibility: public 下命名 spike 報告的路徑,因為隱藏模式(stealth)會將 .f10/ 路徑排除在追蹤器之外。 該類型在流程開始前即可從計畫或無計畫執行的內聯計畫中得知,因此徽章會宣告 f10-state.sh pipeline implement,而 dry run 會輸出在 implement 處截斷的路徑。

**追趕守衛(The catchup guard)**在三種條目之前引入基礎分支,正如 catchup 步驟的 作為守衛所述;在 catchup: off 下,它永遠不會整合,其載入會將 catchup 排除在外,但對於一個還沒有程式碼的基礎分支,下面的問題仍然會執行。 追趕(Catchup)永遠不是一個流程條目。

  • 在 implement 之前,僅當 f10 start --after 或 f10 finish 在分支上記錄了一個基礎分支時(f10-after-branch 或 f10-landed);否則 f10 pr catchup --guard implement 會輸出 method: skip。 一個還沒有程式碼的基礎分支是守衛的 code: none 行,f10 drive 根據此規則釋放依賴任務,適用於基礎分支僅存在於本地或僅在遠端的情況。在整合之前,詢問一次(AskUserQuestion)等待,或按照計畫的假設繼續。 等待會使執行被阻塞(f10-state.sh set ship blocked implement,note 命名該基礎任務)。 繼續則會根據計畫檔案記錄的基礎任務計畫進行建構,如果該計畫不存在則沒有降級方案。 在驅動模式(Driven)下,不會詢問任何內容,且 ship 永遠不會繼續:f10-state.sh set ship blocked implement; f10-state.sh wait <base-id>; f10-state.sh note "等待 <base-id>:其分支還沒有程式碼" "一旦 <base-id> 提交,重新執行 ship;f10 drive 會自行處理",然後報告。 f10 drive 將任務保持為 waiting on <base-id>,並在基礎分支提交後,再次發送 ship,resume at implement;其他任務繼續移動。
  • 在每次 pr 條目之前,第一次以及每次重新整理:首先執行 f10 pr catchup --guard pr,它會擷取並檢查祖先關係;僅當其 method 是 merge、rebase 或 onto 時,提交工作樹中的內容(如同 pr 步驟會做的那樣,conventions/context.md → Commits、--step implement)並整合,以便推送時包含它。 skip 或 none 將提交工作留給 pr 及其適配器。
  • 在變更評判者(change judge)之前(即 implement 之後的 judge;計畫評判者沒有程式碼):如果工作樹中有未提交的工作(implement 會留下未提交的工作,所以 implement judge pr 總是會有未提交的工作),用一行跳過它:該評判者會在舊的基礎分支上檢視分支,而稍後的 pr 條目的守衛(如果流程中有)會在程式碼離開之前引入基礎分支。 在 pr 條目之後,推送整合,絕不強制推送,以便 PR 頭部是經評判的程式碼,且評判者的狀態會落到它上面。

守衛在其守護的條目下執行,位於該條目的載入(catchup pr)和徽章中。 失敗會設定為 set ship failed <entry>,或者如果執行留下了任何持久化的東西,則設定為 partial,即守衛自己的提交或一個開放的 PR(conventions/failure.md 規則 7),其 state 行命名該提交,其 note 命名追趕和 /f10:catchup。 守衛在失敗前會標記分支(catchup 步驟),而 f10 drive 會自行處理標記分支的追趕,每次基礎分支移動時都會再次處理,然後在此條目處再次提示 ship;當追趕沒有改變任何內容、基礎分支沒有移動、或相同檔案連續兩次衝突時,它會停止並命名檔案。 驅動模式執行的 next 是 在工作樹中執行 /f10:catchup --driven,然後重新執行 drive:重新執行會在此條目處再次提示 ship。

按照宣告的順序執行流程的條目,每個條目來自其自己的載入。 本次執行中撰寫的計畫不需要重新確認。 judge 條目根據其評判結果路由執行:計畫評判者如同 judge 步驟的 pr 前路由所述,其變更會折疊到計畫檔案中供 implement 建構;變更評判者在 pr 條目之前和之後則有不同的行為(judge 步驟)。 變更評判者的變更,無論在 pr 之前或之後,都會被折疊到計畫中,並由 judge 步驟自己的路由(建構變更)來建構,而不是重新執行 implement。

徽章(conventions/report.md):一旦選定了流程,在 plan 之後的每個條目(按流程命名的方式),f10-state.sh pipeline <entry>... 一個引數一個引數地列出(pipeline judge implement cleanup pr review:local judge pr),這也宣告最後一個為最終條目;在每個條目之前,按流程命名的名稱,在載入它的呼叫中執行 f10-state.sh set ship running <entry>;在最後一個之後執行 f10-state.sh set ship done。 來自更早執行的計畫(計畫檔案,或重複使用)在執行開始時設定 f10-state.sh ship state not_started,除非其狀態是 paused(讓步於一個可以使用 resume at 重新進入的阻塞執行),且一個可能是來自 review:host 的開放 PR 會設定徽章的 PR: 行。 一條 pipeline 行上的 failed 標記使徽章顯示為 blocked,並將先前的 running 條目設為 done。 在執行開始時,f10-state.sh pipeline <entry>... 在引用一個已連接的捆綁任務時,會擴展籌碼行(details: <id1> <id2>...),作為 fetch 初始化徽章的一部分(f10-state.sh pipeline 可以處理 --task <id>)。 調試:徽章的內省會記錄耗時、載入、管道,並且在執行結束時,將每個條目的 done_at 時間戳記錄為其最後一個 running 時間加上該條目的 done。

在 implement 之前的條目,其載入始終引入 f10-state.sh pipeline,為流程建立徽章。

報告(conventions/report.md)在執行所有條目後寫入:對任務 ID 使用 f10-report.sh,否則對自由文字或檔案執行 f10-report.sh --no-id。

報告回報僅在執行沒有因使用者問題而暫停時發生:對任務 ID 使用 f10-report.sh --report-back,否則永久跳過。

Planless 船運(Plans are never written, and resume at <entry> never stops for one. The inline plan from fetch or user text is the whole source.)

Forward mode 用一個任務 ID 執行,在 ship 開始前決定任務是否應轉發到另一個代理或技能。

A dry run (with --dry-run) 報告 <task-id> 或 <description> 會執行的步驟路徑,但不會進行任何實際的提取、規劃或執行。

相關技能