一键导入
specflow-start
啟動完整的 specflow 專案流程。使用者只需與 spec agent 對話確認需求和架構,之後 tech-lead → (engineer + qa 並行) → verify → release 全部自動背景執行。觸發關鍵字:"start", "開始", "啟動專案", "新專案"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
啟動完整的 specflow 專案流程。使用者只需與 spec agent 對話確認需求和架構,之後 tech-lead → (engineer + qa 並行) → verify → release 全部自動背景執行。觸發關鍵字:"start", "開始", "啟動專案", "新專案"。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
啟動實作流程(Lane 制:每個類型同時最多 1 個 agent)。Backend / Frontend / Pipeline 各自 1 個 engineer,加 1 個 QA、1 個 UI Designer,共最多 5 個 background agent。觸發關鍵字:"implement", "實作", "開發"。
從 .specflow/state.json 讀取 SpecFlow 流程進度,重建狀態後繼續執行。在 /clear context 之後、或重開 session 時用來接續工作。觸發關鍵字:"resume", "繼續", "接續"。
啟動 QA 撰寫 Playwright e2e tests。根據 spec .md 中的 acceptance criteria 撰寫 Playwright 測試,與 engineer 同時進行。觸發關鍵字:"qa", "測試", "test", "e2e"。
對當前 sprint 進行三維度驗證:Completeness(完整性)、Correctness(正確性)、Coherence(一致性)。在 QA 通過後、release 前執行。觸發關鍵字:"verify", "驗證", "檢查"。
為已完成的專案新增需求變更(Change Request)。spec-writer 評估影響範圍 → 建立 CR 文件 + 新 Sprint milestone → 走原本的 tech-lead → engineer + qa → verify 流程。觸發關鍵字:"change", "新需求", "需求變更", "CR", "後續功能", "新增功能"。
更新本機 SpecFlow 安裝到 upstream 最新版。Fetch 最新 .claude/ 與 CLAUDE.md,顯示變更摘要,保留本地自訂後套用。觸發關鍵字:"update", "升級", "更新 specflow"。
| name | specflow:start |
| description | 啟動完整的 specflow 專案流程。使用者只需與 spec agent 對話確認需求和架構,之後 tech-lead → (engineer + qa 並行) → verify → release 全部自動背景執行。觸發關鍵字:"start", "開始", "啟動專案", "新專案"。 |
| user-invocable | true |
| allowed-tools | Read, Write, Edit, Grep, Glob, Bash, Agent, AskUserQuestion |
| argument-hint | [專案主題] |
使用者只需做兩件事:
bash .claude/scripts/doctor.sh
如果 exit code != 0:呼叫 specflow:doctor skill 用 AskUserQuestion 引導使用者安裝缺失工具,不要繼續往下跑。
LABEL_COUNT=$(gh label list --json name --jq 'length')
if [ "$LABEL_COUNT" -lt 7 ]; then
bash .claude/scripts/init-github.sh
fi
mkdir -p specs/features specs/changes specs/changes/archive
bash .claude/scripts/state.sh init
bash .claude/scripts/state.sh phase "phase-1-init" "spec-writer 開始討論需求"
State 紀錄原則:每進入新 phase / 啟動 background agent / 收到 agent 回報時,呼叫
state.sh phase或state.sh agent-add/done寫入.specflow/state.json,讓/specflow:resume可以接續。
新流程:UI 先在 Claude design 完成。orchestrator 啟動 spec-writer 前先確認設計稿狀態:
AskUserQuestion({
questions: [{
question: "UI 設計準備好了嗎?",
header: "Design",
multiSelect: false,
options: [
{ label: "有 Claude design 網址", description: "貼上 https://claude.ai/design/... 或 https://claude.com/...,從設計稿出發反推 spec(Recommended)" },
{ label: "純 backend / API 專案", description: "沒有 UI,跳過 design 直接討論需求" },
{ label: "我先去做 design", description: "暫停,我去 Claude design 完成 UI 後回來執行 /specflow:resume" }
]
}]
})
sync-design.sh 下載 HTML + 截圖到 specs/design-source/,然後從本地快照反推 spec(後續所有 agent 只讀本地,不再上網 fetch)phase=phase-2-await-design啟動 spec-writer agent(前景,需使用者互動):
subagent_type: "spec-writer"run_in_background: falsespec-writer 產出:
specs/design-source.md — Claude design URL 的 fetch 快照(如有)specs/ 目錄下的 spec 檔案(source of truth)specs/features/*.md 中的 acceptance criteria(QA 轉成 Playwright e2e tests)啟動 tech-lead agent(背景):
subagent_type: "tech-lead"run_in_background: truetech-lead:
specs/tech-survey.mdspecs/contracts/api.md + dom.md + ux-text.md + specs/contracts.ts,作為 lane 之間的 single source of truthspecs/ 目錄,自動分析依賴圖譜,產出 specs/dependencies.md(含 contract owner 標記)specs/design-source.md 存在時建:要求 ui-designer 從 design URL 抽 tokens / 元件 / 字串到 design/,產出 handoff 給 tech-lead 在 contract phase 吸進 contracts/。純 backend 專案則不開 design issue。Contract 沒寫完不開 issue — 否則 engineer 開始寫程式碼時 contract 還沒對齊,會出現 hardcoded literal 滿天飛。
Design-led 順序提示:理想上 ui-designer 應先於 tech-lead 完成 contract phase(因為 dom.md / ux-text.md 要吸 ui-designer 的 handoff)。orchestrator 可以先開 design issue → ui-designer 完成 handoff → tech-lead 才產 contracts → 才開 feature/qa issues。
spec-writer 與 tech-lead 寫的 specs/(overview / features / sprints / contracts / contracts.ts / dependencies)若還停在 working tree 未進版控,worktree-isolated 的 engineer/qa/ui-designer 從 origin clone 後完全讀不到 spec 與 contract,整個 sprint 會憑空亂寫。spawn lane 前必須確認 specs/ 已在 main:
cd <project-root>
if [ -n "$(git status --porcelain specs/)" ]; then
git add specs/
git commit -q -m "docs(spec): sprint 規劃產出(spec + contracts)納入版控"
git push -q origin main || {
# main 受保護無法直推 → 開 PR 合併
git checkout -b "chore/sprint-specs" && git push -u -q origin chore/sprint-specs
PR=$(gh pr create --title "docs(spec): sprint specs + contracts" --body "spec-writer + tech-lead 產出" --json number --jq .number)
gh pr merge "$PR" --squash --delete-branch && git checkout main && git pull -q
}
fi
# 確認 contract 三件套 + contracts.ts 確實在 main 上(讀不到就 short-circuit)
git cat-file -e "main:specs/contracts.ts" 2>/dev/null || { echo "🔴 specs/contracts.ts 不在 main,lane agent 會讀不到,停"; exit 1; }
在啟動 lane 前先把當前 main HEAD 紀錄起來,這是 sprint review 的 diff 起點(須在 Phase 3.8 commit 之後):
SPRINT_BASE=$(git rev-parse main)
bash .claude/scripts/state.sh set sprint_base_sha "\"$SPRINT_BASE\""
echo "Sprint base SHA: $SPRINT_BASE"
Lane 制度:每種類型的 agent 同時只跑一個,避免 worktree 衝突、token 浪費、merge race condition。每個 agent 在自己 lane 內 loop 認領未完成的 issue。
| Lane | Agent | 認領條件 |
|---|---|---|
| backend | engineer | label feature,backend 或 bug,backend,未 assigned |
| frontend | engineer | label feature,frontend 或 bug,frontend,未 assigned |
| pipeline | engineer | label feature,pipeline 或 bug,pipeline,未 assigned |
| qa | qa-engineer | label qa,當前 sprint |
| ui | ui-designer | label design,當前 sprint |
先檢查當前 sprint 各 lane 是否有 issue,只啟動有工作的 lane:
SPRINT="{current_sprint_milestone}"
for LANE in backend frontend pipeline; do
COUNT=$(gh issue list --milestone "$SPRINT" --label "$LANE" --state open --json number --jq 'length')
if [ "$COUNT" -gt 0 ]; then
echo "啟動 engineer lane=$LANE($COUNT 個 issue 待認領)"
bash .claude/scripts/state.sh agent-add "engineer-$LANE" 0 null "" "running"
# Agent(subagent_type="engineer", run_in_background=true, isolation="worktree",
# prompt="lane=$LANE, sprint=$SPRINT")
fi
done
# QA 與 UI 各最多 1 個
Agent(subagent_type="qa-engineer", run_in_background=true, isolation="worktree",
prompt="sprint=$SPRINT")
if [ "$(gh issue list --milestone "$SPRINT" --label "design" --state open --json number --jq 'length')" -gt 0 ]; then
Agent(subagent_type="ui-designer", run_in_background=true, isolation="worktree",
prompt="sprint=$SPRINT")
fi
最多 5 個 background agent 同時跑(backend / frontend / pipeline / qa / ui-designer),各自循序處理 lane 內所有 issue。
Code review 改成 sprint-end 一次性執行(見 Phase 5.5),這裡的 PR 只要:
local-checks.sh 通過(engineer / qa agent 自己會跑)就可以直接 merge。Engineer / QA agent 在自己的 loop 裡發完 PR 就走 ready-and-merge.sh 自行 merge(ready→等 CI→squash merge 三合一)。
Branch protection 配合改成只要 build-and-lint 過、不再要求 approval(見 init-github.sh)。理由見 docs/DESIGN-RATIONALE.md。
所有 PR 通過 code review 並合併後,在執行測試前向使用者確認 infra 狀態。
使用 AskUserQuestion 提供一致的 UI 介面:
// Step 1: 確認測試環境
AskUserQuestion({
questions: [
{
question: "Sprint {N} 的 e2e 測試準備開始,測試環境怎麼處理?",
header: "Infra",
multiSelect: false,
options: [
{
label: "自動部署 (Recommended)",
description: "使用 docker compose up 自動啟動所有服務(根據 specs/infra.md 設定)",
preview: "cd dev\ncp docker-compose.example.yml docker-compose.yml\ncp .env.example .env\ndocker compose up -d --build\n\n# 等待 health check 通過後自動執行測試"
},
{
label: "服務已在運行",
description: "我的本機服務已經在跑了,直接執行測試就好"
},
{
label: "需要調整設定",
description: "port 或設定有衝突,我先處理完再開始"
}
]
},
{
question: "App 的測試 URL 是?",
header: "URL",
multiSelect: false,
options: [
{ label: "http://localhost:3000 (Recommended)", description: "Docker Compose 預設(見 specs/infra.md)" },
{ label: "http://localhost:8000", description: "Python/FastAPI 預設" },
{ label: "http://localhost:8080", description: "Go/Java 預設" }
]
}
]
})
根據使用者回答:
cd dev && docker compose up -d --build,等待 health check,自動進入 Phase 5如果使用者選了自訂 URL(Other),將 BASE_URL 傳入 QA agent。
e2e 在 CI 上跑 — 4 lane 全關後 .github/workflows/sprint-test.yml 自動觸發。orchestrator 此 phase 只需輪詢 workflow 結果。
SPRINT="{current_sprint}"
SPRINT_NUM=$(echo "$SPRINT" | grep -oE '[0-9]+' | head -1)
# 1. 確認 4 lane 全關(feature/design/qa/bug)
for LABEL in feature design qa bug; do
OPEN=$(gh issue list --milestone "$SPRINT" --label "$LABEL" --state open --json number --jq 'length')
if [ "$OPEN" != "0" ]; then
echo "Lane $LABEL 還有 $OPEN 個 open issue,等 engineer/qa drain"
bash .claude/scripts/state.sh phase "phase-4-impl" "wait lane $LABEL"
exit 0
fi
done
# 2. Workflow 已被最後一個 issue close 自動觸發了;orchestrator 輪詢結果
echo "4 lane 全關,等 Sprint E2E Test workflow..."
for i in $(seq 1 80); do # 最多等 40 分鐘(每次 30s)
RUN=$(gh run list --workflow "Sprint E2E Test" --limit 1 \
--json conclusion,status,databaseId --jq '.[0]')
STATUS=$(echo "$RUN" | jq -r '.status')
CONCLUSION=$(echo "$RUN" | jq -r '.conclusion')
RUN_ID=$(echo "$RUN" | jq -r '.databaseId')
[ "$STATUS" = "completed" ] && break
echo "[$i] workflow status: $STATUS"
sleep 30
done
# 3. 寫結果到 state.json
if [ "$CONCLUSION" = "success" ]; then
bash .claude/scripts/state.sh set sprint_test_outcome '"success"'
bash .claude/scripts/state.sh phase "phase-5.5-review" "啟動 sprint code review"
else
bash .claude/scripts/state.sh set sprint_test_outcome "\"$CONCLUSION\""
bash .claude/scripts/state.sh phase "phase-5-e2e" "e2e workflow 未通過"
# workflow 已自動建 bug issue + lane 重新打開(見 sprint-test.yml)
# orchestrator 不用做事,等 engineer 修完 bug 關掉 → workflow 自動再次觸發 → 回到此 phase 輪詢
fi
success → 進入 Phase 5.5 sprint code review → Phase 5.6 verifierfailure → workflow 已自動建 bug issue(lane label 從失敗推測)→ engineer lane 重啟修復 → bug close 自動觸發新 workflow run → orchestrator 重新進入 Phase 5 輪詢e2e 上 CI 的 5 點理由(可重現 / 可見性 / artifacts 集中 / verifier 信任源 / 解放本機)見
docs/DESIGN-RATIONALE.md。
e2e 全綠後啟動 code-review agent 對整個 sprint diff 做一次全面 review:
Agent(subagent_type="code-review", run_in_background=true,
prompt="sprint=$SPRINT, sprint_base=$SPRINT_BASE_SHA")
Code reviewer 檢查:
結果:
specs/logs/sprint-{N}-review.mdAgent(subagent_type="verifier", run_in_background=true)
Verifier 檢查:
結果:
QA 完整測試通過 + 三維度驗證通過後自動執行,不需使用者介入。
specs/logs/sprint-{N}-log.md✅ Sprint {N} 完成!
📊 摘要:
Features: X | PRs: X | Bugs fixed: X
🧪 E2E 測試結果(docker compose 環境):
Unit Tests: X passed
E2E Tests: X/Y passed (Playwright)
✅ Verify: PASS(Completeness + Correctness + Coherence)
📋 工作日誌:specs/logs/sprint-{N}-log.md
驗證報告:specs/verify-sprint-{N}.md
如果有下一個 sprint milestone,向使用者確認後啟動:
AskUserQuestion({
questions: [{
question: "Sprint {N} 完成!要自動開始 Sprint {N+1} 嗎?",
header: "下一步",
multiSelect: false,
options: [
{ label: "開始 Sprint {N+1} (Recommended)", description: "自動啟動 tech-lead → engineer + qa 流程" },
{ label: "暫停", description: "我想先 review Sprint {N} 的成果,之後再開始" },
{ label: "直接 Release", description: "目前功能已夠用,直接進入部署流程" }
]
}]
})
如果所有 sprint 都完成:
AskUserQuestion({
questions: [{
question: "所有 Sprint 完成!下一步?",
header: "完成",
multiSelect: false,
options: [
{ label: "部署 Production", description: "執行 /specflow:release 部署流程" },
{ label: "先 Review", description: "我想先檢查完整專案再部署" }
]
}]
})
/specflow:release 僅用於 production 部署確認specs/ 目錄是 source of truth,所有 agent 從這裡讀取規格如果 context 滿了被 /clear,或關閉 session 後想接著做:執行 /specflow:resume 從 .specflow/state.json 重建狀態並繼續。所有持久狀態都在 GitHub Issues + state.json,不在對話裡。