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,然後對該條目本身執行。
執行
- 在每次呼叫此技能時,首先執行
f10-load-project.sh,並根據輸入內容命名所需的步驟:描述需要capture fetch plan,任務 ID 需要fetch plan,計畫檔案則不需要。流程在其輸出的project.md中宣告;無計畫的流程會載入plan但從不執行它。 - 按照引數項目中給定的順序執行這些步驟。
- 在每個流程條目即將執行前載入它,一次呼叫並帶有其徽章:
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> 會執行的步驟路徑,但不會進行任何實際的提取、規劃或執行。