plan-build
從 .spec/{slug}/plan.md 以 Agent Teams leader-delegate 模式產生程式碼,含退出驗證與錨點有效性檢查,Leader 只協調不寫 code。當使用者提到 /plan-build、「從 spec 產生程式碼」、「plan-build 產碼」時觸發此 Skill。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
從 .spec/{slug}/plan.md 以 Agent Teams leader-delegate 模式產生程式碼,含退出驗證與錨點有效性檢查,Leader 只協調不寫 code。當使用者提到 /plan-build、「從 spec 產生程式碼」、「plan-build 產碼」時觸發此 Skill。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
CREW 環境健診 —— 一次性檢查 CREW 所有必要與選配依賴(Node/Git/Notion MCP/Agent Teams/瀏覽器 MCP/config/專案註冊/CLAUDE.md),列出綠黃紅燈與修法。當使用者提到 /crew-doctor、「CREW 環境健診」、「CREW 為什麼不能用」時觸發此 Skill。
瀏覽與探索已有的 .spec/ 規劃文件 —— 深度閱讀、跨任務比較、模式搜尋。當使用者提到 /plan-browse、「瀏覽 .spec 規劃」、「看之前的規劃設計」時觸發此 Skill。
結案前先跑文件漂移硬關卡(FAIL 擋、WARN 需明示放行),通過後蓋章 verified_at_commit、提交 Git、批次同步 plan.md 與 deploy.sql 到 Notion。當使用者提到 /plan-close、「feature 結案」、「同步 spec 到 Notion 並結案」時觸發此 Skill。
智慧推薦 CREW 當前任務下一步 —— 呼叫 crew-state.py 讀 state.json 算出下一個 /plan-* 指令並轉成人話。當使用者提到 /plan-next、「CREW 下一步指令」、「這個 spec 接下來做什麼」時觸發此 Skill。
CREW 規劃 —— spec / db / arch 三個 pass 把決策與驗收條件寫進 .spec/{slug}/plan.md,DB 設計另產 deploy.sql(零 Notion 呼叫)。當使用者提到 /plan、「CREW 完整規劃」、「一次跑完 spec/db/arch」時觸發此 Skill。
列出 .spec/ 目錄中所有活躍與已完成的任務(純本地操作,不呼叫 Notion)。當使用者提到 /plan-status、「.spec 任務狀態」、「CREW 任務列表」時觸發此 Skill。
| name | plan-build |
| description | 從 .spec/{slug}/plan.md 以 Agent Teams leader-delegate 模式產生程式碼,含退出驗證與錨點有效性檢查,Leader 只協調不寫 code。當使用者提到 /plan-build、「從 spec 產生程式碼」、「plan-build 產碼」時觸發此 Skill。 |
| argument-hint | [--with-test|--no-test] [--backend-only] [--dry-run] [--resume] |
從 .spec/{slug}/plan.md(唯一規劃文件)與 deploy.sql(唯一 SQL 事實來源)讀取決策與驗收條件,以 Agent Teams leader-delegate 模式產生程式碼。Leader 只負責協調,不直接寫程式碼。
本 skill 不產生任何新文件檔:變更清單的事實來源是
git diff --name-only,流程狀態一律經crew-state.py寫入state.json,程式碼落點以錨點條目寫進 plan.md 的「指路」節。
v1 舊任務:
.spec/{slug}/plan.md不存在 → 這是 v1 結構,依../../references/legacy-v1.md的相容模式執行,並在開頭提示一次。 過渡期限定,到期本段連同該檔一併刪除。
必須啟用 Agent Teams 實驗功能(擇一設定):
方式 A:加入 shell profile(~/.zshrc 或 ~/.bashrc)
export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1
方式 B:加入 settings.json 的 env 區塊
{
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
}
}
必須已跑過 /plan(至少 arch pass)。判定方式不是看檔案存在,而是看狀態:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/crew-state.py" list --slug {slug} --format json
steps.arch.status 不是 done/skipped → 禁止繼續,告知使用者先執行 /plan arch。
.spec/{slug}/plan.md 的「決策紀錄」查無 D-1 [spec] 範圍判斷 → 同樣禁止繼續,先執行 /plan spec。
前置檢查:參照 plugin 根目錄
references/prerequisites.md(相對 SKILL.md 為../../references/)檢查 CLAUDE.md 是否存在。
紀律護欄:
../../references/discipline-preamble.md(通用紀律)+../../references/anti-rationalizations.md「plan-build 專用」+../../references/boundaries.md「plan-build」段;斷點保險改為進度即寫state.json(每完成一個角色就跑crew-state.py unit,見『更新狀態與指路錨點』一節);有「可以跳過」「應該夠了」的衝動時,停下查表確認是否為已知偏離模式。
/plan-build # 完整產生(後端 + 前端,預設不含測試)
/plan-build --with-test # 包含測試程式碼
/plan-build --no-test # 明確不含測試(同預設)
/plan-build --dry-run # 預覽不建立檔案
/plan-build --backend-only # 只產後端
/plan-build --resume # 從 state.json 的 work_unit 續跑未完成的角色
--resume:先讀 crew-state.py list --slug {slug} --format json 的 work_unit,只 spawn remaining 列出的角色,已完成的不重跑。work_unit 為空 → 視同完整執行。
參照 plugin 根目錄 references/plan-common.md(相對 SKILL.md 為 ../../references/)的「定位活躍任務」(crew-state.py list),流程位置一律以 state.json 為準。
讀取 .spec/{slug}/ 下的兩份產物:
| 產物 | 用途 | 必要性 |
|---|---|---|
plan.md | 目標與範圍、驗收條件(AC-n)、決策紀錄(D-n)、已知取捨、指路錨點 | 必要 |
deploy.sql | 唯一 SQL 事實來源(表結構、索引、初始資料) | DB_REQUIRED=true 時必要 |
🔴 不要再去找 spec/db/arch 三份文件,它們已廢除;plan.md 沒寫的「是什麼」(欄位、簽章、類別清單)一律照「指路」節的錨點去讀程式碼與 deploy.sql 本身,不要憑印象補。
依據 plugin 根目錄 references/team-composition.md(相對 SKILL.md 為 ../../references/)的判斷規則決定團隊配置。
讀取 plan.md 決策紀錄的 D-1 [spec] 範圍判斷 條目,取得 TASK_TYPE、CHANGE_SCOPE、FRONTEND_REQUIRED、DB_REQUIRED 等欄位;DB_MCP_AVAILABLE 用 claude mcp list 現場檢查。
若 D-1 條目缺少 TASK_TYPE / CHANGE_SCOPE → 回退邏輯,只看 FRONTEND_REQUIRED × DB_MCP 兩個欄位判斷。若 D-1 被後續條目 supersede(D-n [階段] 取代 D-1:…)→ 以最新的取代條目為準。
即將啟動 Agent Teams 產生程式碼:
📄 設計來源:.spec/{slug}/plan.md{ + deploy.sql}
🔍 探索官:scout(model: sonnet)— 專案結構/相似功能/風格範本/交叉引用(唯讀)
📊 Teammate 配置(全部 model: opus):
{• db-engineer — DB 遷移/索引/效能優化(需 DB MCP)}
• backend-engineer — 後端核心(POJO/Mapper/Service)
• api-engineer — API 層(Controller/DTO/驗證)
{• frontend-engineer — 前端頁面({FRONTEND_TECH})}
是否產出測試程式碼?
1. 是 — 包含 test-engineer 角色
2. 否(預設)— 跳過測試,節省 token
{--dry-run: 預覽模式,不建立檔案}
確認開始?[Y/n]
--with-test 參數 → 自動選是,不互動--no-test 參數 → 自動選否(同預設),不互動references/team-composition.md(相對 SKILL.md 為 ../../references/)判斷之後操作,不修改判斷表本身依據 plugin 根目錄 references/build-context-layers.md(相對 SKILL.md 為 ../../references/)的四層策略,為每個 Teammate 準備定制化的脈絡。
模型與邊界(硬性規則)——完整政策見 plugin 根目錄
references/model-policy.md(相對 SKILL.md 為../../references/):
- 5a–5d 的掃描與讀取工作,由 Leader 用 Agent tool 啟動唯讀探索官完成,呼叫時必須實際傳入
{"model": "sonnet"}(探索官 prompt 模板見references/build-prompts.md「探索官模式」)。- 探索官只用唯讀工具,🔴 不得修改任何程式碼;產出「實作交接」(模板見
model-policy.md)交給步驟 6 的實作者。- 這一步的目的就是讓 Opus 實作者不必再掃 repository。探索範圍只有 1–2 個已知路徑的檔案時,Leader 可自行讀取,不必派探索官。
從 CLAUDE.md 擷取技術棧、命名慣例、禁止事項,格式化為 5 行以內。
按 Teammate 角色,從 plan.md(與 DB 角色的 deploy.sql)擷取該角色需要的條目(見 build-context-layers.md 的角色分配表):驗收條件 AC-n、相關的 D-n 決策與理由、指路錨點。
從 deploy.sql 與 plan.md 的驗收條件提取跨角色約束(NOT NULL、UNIQUE、必填參數、外鍵、分頁限制)。約束的事實在 deploy.sql,不是在文件敘述裡。
讀取 plugin 根目錄 references/build-prompts.md(相對 SKILL.md 為 ../../references/)取得 Teammate prompt 模板。
根據『判斷團隊組成』一節的團隊組成判斷,選擇對應的模板(Subagent / Agent Teams),將『準備分層脈絡』一節準備的分層脈絡嵌入各 Teammate 的 prompt 中。
模板中的
{placeholder}需替換為實際值。見 build-prompts.md 的變數說明。
每個 Teammate 的最終 prompt = Layer 0 共用核心 + Layer 1 角色脈絡 + Layer 2 範本片段 + Layer 3 交叉引用 + build-prompts.md 的角色模板
Layer 2/Layer 3 來自『準備分層脈絡』一節探索官(
model: sonnet)產出的「實作交接」,四層都要嵌入,不可省略 Layer 3(跨角色約束:NOT NULL/UNIQUE/必填參數/外鍵/分頁限制)。
完整政策見 plugin 根目錄 references/model-policy.md(相對 SKILL.md 為 ../../references/)。
name 給角色名,例如 backend-engineer),呼叫時必須實際傳入 {"model": "opus"}。根據『判斷團隊組成』一節的判斷結果(見 plugin 根目錄 references/team-composition.md,相對 SKILL.md 為 ../../references/):
{"model": "opus"})CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)程式碼產生完成後(🔴 不產生任何清單檔):
git diff --name-only # 尚未 commit 的本次變更
git status --porcelain # 含未追蹤的新檔
需要與規劃基準比對時({prod_branch} 從專案設定讀取;未設定時先取 origin/HEAD 指向的分支,若無則依序嘗試 production → master → main):
git diff --name-only $(git merge-base HEAD {prod_branch})..HEAD
清單只在回報中呈現,🔴 不寫成文件檔 —— 檔案清單改一次程式就過期,git 永遠是對的。
依 references/plan-common.md「寫入紀律」用 Edit 對 <!-- crew:map append-only --> 那一整行插入,格式 @code:<relpath>#<symbol> (L{行號})。
🔴 只補新的落點錨點,不要把類別清單、方法簽章抄進 plan.md;🔴 不得整節取代,不得動別節。
每完成一個角色就寫一次(中斷後 --resume 靠它續跑):
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/crew-state.py" unit --slug {slug} \
--skill plan-build --done {已完成角色數} --total {角色總數} --label 角色 \
--remaining "{未完成角色,逗號分隔}" --evidence "{已產出的檔案或指令輸出}"
全部角色完成後收尾(--clear 清掉工作單元,代表沒有斷點):
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/crew-state.py" unit --slug {slug} --clear
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/crew-state.py" set --slug {slug} \
--step build --status done --phase build --last-commit "$(git rev-parse HEAD 2>/dev/null)"
🔴 禁止在本 skill 寫 plan.md frontmatter 的 verified_at_commit / verified_at —— 剛改完程式碼就自己蓋章等於作廢。蓋章只有 /plan-drift 與 /plan-close 能做。
來源:『更新狀態與指路錨點』一節 7a 的 git diff --name-only 輸出(唯一來源,不再有任何清單檔)。
將收集到的檔案路徑逐一比對設定檔模式清單(13 種常見設定檔模式,如 mapper XML、application.yml、Dockerfile 等)。完整模式表見 plugin 根目錄 references/deploy-sql-guide.md(相對 SKILL.md 為 ../../references/deploy-sql-guide.md)。
命中的設定檔只在對話回報,列成「上線需一併更版」清單(見『回傳結果』一節的 📋 行),供使用者在部署時對照。
deploy.sql 與 git diff 的 derived view,會自己過期)。state.json(由 /plan 的 db pass 以 --deploy-total 登記);本 skill 若發現 deploy.sql 有增修,重新登記一次:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/crew-state.py" set --slug {slug} --deploy-total {Step 數}
API 呼叫:0 次(僅本地操作,Notion 同步交給 /plan-sync 或 /plan-close)
Leader 在回傳結果前,逐項檢查以下退出條件:
| # | 檢查項目 | 驗證方式 | 失敗處理 |
|---|---|---|---|
| E0 | 狀態已更新 | crew-state.py validate --slug {slug} --expect-phase build exit 0 | 依訊息修正後重跑;仍失敗 → crew-state.py rebuild --slug {slug} |
| E1 | 所有 Teammate 都已完成 | 確認每個 Teammate 回報了完成訊息,且 work_unit 已 --clear | 等待或重試未完成的 Teammate(--resume 可續跑) |
| E2 | 變更清單取自 git | git diff --name-only 與 git status --porcelain 有本次產出 | 產出為空 → Teammate 實際沒寫檔,回到 E1 處理 |
| E3 | 產出檔案真的存在 | 對 git 列出的每個路徑用 ls 或 Read 確認 | 列出缺失檔案,要求使用者決定:重試 / 移除 |
| E4 | 無編譯錯誤(若可驗證) | 若專案有 build 指令(mvn compile / gradle build),執行一次 | 顯示錯誤訊息,標記 ⚠️ 但不阻擋 |
| E5 | 錨點有效性(檔案/符號還在) | check-spec-drift.py --spec .spec/{slug}/plan.md --format json,看 D1/D2 | 列出失效錨點,標記 ⚠️ 並建議跑 /plan-drift;不阻擋 |
| E6 | AC-n 驗收條件有對應程式碼 | 讀 plan.md「驗收條件」節的 AC-n,grep 本次產出檔案確認有相關實作 | 列出無對應的 AC-n,標記 ⚠️ |
| E7 | deploy.sql 校驗(若 DB_REQUIRED != false) | 見下方 E7 詳細邏輯 | 見下方 E7 詳細邏輯 |
測試已跳過時:若使用者選否(不含測試),E6 仍執行但不檢查測試檔案,驗證結果中標記「測試已跳過」。
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/check-spec-drift.py" \
--spec .spec/{slug}/plan.md --format json
--strict、不在本 skill 阻擋:剛產完碼時符號正在流動(方法還會改名、檔案還會搬),此刻升級為硬關卡的誤殺率最高。硬關卡在 /plan-close(那時程式碼已穩定)。0 → E5 ✅;exit 1(有 D1/D2 FAIL)或 2(僅 WARN)→ E5 ⚠️,逐條列出 anchor 與 script 給的「修法:」原文,建議跑 /plan-drift。3 是環境問題(非 git 工作區、檔案讀不到)→ 標記「本次未檢查」,🔴 不得說成「有漂移」,也不得說成「檢查通過」。verified_at_commit;--fix 也不在這裡跑(機械修屬 /plan-drift)。deploy.sql 是唯一 SQL 事實來源,由 /plan 的 db pass 產出。本 skill 只校驗,🔴 不得再去掃描任何文件的 SQL 區塊重新組裝(那正是同一份 DDL 出現三四次的根源)。
D-1 [spec] 範圍判斷 的 DB_REQUIREDfalse 或查無 → 跳過(state.json 的 steps.db.status 應為 skipped)true 或 insert-only → 逐項校驗 .spec/{slug}/deploy.sql:
/plan db(不要自己生一份)-- Step N:{描述} 分段,Step 數與 state.json 的 deploy.steps_total 一致 —— 不一致 → 用 crew-state.py set --deploy-total 更正@sql:deploy.sql#{table} 錨點都指得到(由 E5 的 script 一併檢查,對應 D5)deploy.sql 裡都有 —— 缺漏 → ⚠️ 並列出,請使用者決定補 SQL 或改碼檔案格式(Step 分段、驗證 SQL、Rollback 註解段)見 plugin 根目錄 references/deploy-sql-guide.md(相對 SKILL.md 為 ../../references/deploy-sql-guide.md)。
只在對話輸出(🔴 不落檔;事件流由 state.json 的 history 承接):
退出驗證結果:
✅ E0 state.json 驗證通過(phase=build)
✅ E1 所有 Teammate 完成
✅ E2 git 變更清單:12 個檔案
✅ E3 所有檔案存在
⚠️ E4 編譯未驗證(專案無標準 build 指令)
⚠️ E5 錨點 1 筆失效:@code:.../LoginService.java#lock(D2 符號不在檔內)→ 建議 /plan-drift
⚠️ E6 AC-3「支援匯出 Excel」無對應程式碼
✅ E7 deploy.sql 校驗通過(2 個 Step,Rollback 段齊全)
結論:可繼續,但建議處理 E6 後再進 plan-verify
測試相關兩處依使用者選擇填寫:選是(含測試) 用斜線前變體,預設(跳過測試) 用斜線後變體,已於行內以 / 標出。
程式碼產生完成!
📁 變更檔案(git diff --name-only):N 個
📊 統計:N 個後端 + M 個前端{ + K 個測試 / 跳過測試時改為「(測試已跳過)」}
已完成:
{✅ db-engineer — Migration SQL + 索引建議 + 效能報告}
✅ backend-engineer — N 個檔案(POJO/Mapper/Service)
✅ api-engineer — N 個檔案(Controller/DTO)
{✅ frontend-engineer — M 個檔案(JSP/JS/CSS)}
✅ test-engineer — K 個檔案(測試) / 跳過測試時改為「⏭️ test-engineer — 已跳過」
{✅ API 契約確認 — 一致}
{📋 上線需一併更版的設定檔({N} 個):逐檔列出路徑,不落檔}
{🗄️ 部署 SQL:deploy.sql 校驗通過({N} 個 Step)}
{🧭 指路錨點:已在 plan.md 補 {K} 條}
{💡 提示:可用 /plan-sync 同步到 Notion,或等 /plan-close 結案時統一同步}
⚡ 建議執行 /clear 再進行後續步驟(review / verify / close)
原因:build 已消耗大量 context,後續步驟全部從 .spec/ 磁碟讀取,不需要本次對話歷史
後續可使用:
• /plan-verify — 驗收驗證
• /plan-review — Agent Teams 3 人審查
• /plan-close — 結案並同步 Notion
設定檔變更(📋)那行只在『偵測設定檔變更(僅回報,不落檔)』一節命中模式時顯示。
完整的 DB MCP 提示詞模板見 plugin 根目錄
references/build-prompts.md(相對 SKILL.md 為../../references/)的「DB MCP 提示詞模版」段落。
『判斷團隊組成』一節檢查 DB MCP 可用性(claude mcp list 是否有 dbhub)後,根據結果決定是否加入 DB 工程師:
{"model": "opus"});Subagent 模式(同樣 model: opus)嵌入 {db_mcp_instruction}{db_mcp_instruction} 替換為空字串/plan/plan-review;要驗收 → /plan-verify/plan-drift(本 skill 只回報 WARN,不修)git-smart-commit(本 skill 只產碼)CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 不存在時,建立 Team 的指令會靜默失敗(不報錯但不產出),很難 debug。『前置條件』一節就要先檢查。plan-build 中途失敗,可能留下殘留的 Team。在建新 Team 前先用 TeamDelete 清理,否則會報錯「已有活躍 Team」。verified_at_commit 是「文件與程式碼對得上」的承諾。剛動完程式碼的 skill 蓋自己的章,這個欄位就失去意義。本 skill 只回報 E5 的錨點狀態,蓋章交給 /plan-drift 或 /plan-close。/plan-close 會變成硬關卡(D1/D2 FAIL 直接擋結案),順手在 /plan-drift 修掉最省事。/plan db。參考 examples/leader-delegation.md 了解 Leader 如何有效分配任務和協調 Teammate。
state.json 的 steps.arch.status 非 done/skipped):hard block — 停止流程,要求使用者先執行 /plan archdeploy.sql 不存在但 DB_REQUIRED=true:hard block — 要求先跑 /plan db,🔴 不自行組裝 SQLcheck-spec-drift.py 回 exit 3:標「本次未檢查錨點」+原因,不阻擋、不改判為漂移