建立日期:2026-05-13 接續:Phase C(FE Banner 元件 / composable / service)已完成 預估規模:5 commits(D.1~D.4 各 1 + D.6 1) 跨 repo:compliance-manager-fe 為主、BE / test repo 無變更
我要在新 FE session 接 Spec 2「階段抽象整合」Phase D — 4 個 view 掛 FlowPhaseBanner + 拆既有推進按鈕。 保持 BE 主導模式(與 Phase B / C 同 pattern;本 phase 是純 FE,BE 無新增)。
| Phase | Repo | Branch | 領先 origin |
|---|---|---|---|
| B.1~B.6(5 commits) | compliance-manager-be | feature/project-flow-engine-integrate |
5 個 commits(user 未 push,視 smoke test 結果決定) |
C(1 commit 313e1ed) |
compliance-manager-fe | feature/project-flow-engine-integrate |
1 個 commit(user 未 push) |
Import 與使用:
<template>
<!-- 掛在 view 頂部(如 header 區下、主內容上)-->
<FlowPhaseBanner
:project-uid="projectUid"
:ap-uid="apUid"
@stage-advanced="onStageAdvanced"
/>
</template>
<script setup>
import FlowPhaseBanner from '@/components/grc/FlowPhaseBanner.vue'
function onStageAdvanced(newStageInfo) {
// BE 已推進,refresh 自己頁面的資料(如 AP status、tree、任務清單等)
fetchProject()
// 部分 view 可能需要 router.push 到下一階段對應頁
}
</script>
Props(required):
projectUid: String — 從 route param / store 取apUid: String — 從 store / parent 取(或 fetch AP list 後挑 active 的)Emit:
stage-advanced (newStageInfo) — 推進成功觸發,parent 應 refresh 資料Banner 內部自己處理(parent 不需管):
zh_Hant_TW ↔︎ FE tw locale 映射)Banner 不負責:
@stage-advanced event 通知 parent 自做| Sub | View | 拆掉的按鈕 | 替代行為 | Plan §參照 |
|---|---|---|---|---|
| D.1 | src/views/project/ProjectPlanningView.vue(plan 寫錯位置:不是 ProjectSettingsView) |
handleLaunch / doLaunch(line 1229-1285):「啟動專案」按鈕 + ConfirmDialog |
Banner 內建 confirm + force 路徑 | §D.1(位置需修正) |
| D.2 | src/views/project/ProjectAuditorOverview.vue |
handleLaunchAudit(line 974-1019):「啟動稽核」按鈕(4 個導航按鈕不動:專案規劃 / 進入稽核 / 查看稽核 / 改善計畫) |
Banner 內建 | §D.2 |
| D.3 | src/views/project/AuditReviewView.vue |
handleConfirmAudit(line 266+,template line 377):「提交稽核」按鈕 |
Banner 內建 | §D.3 |
| D.4 | src/views/project/PoamView.vue |
handleCloseRound(line 189+):「完成改善」按鈕 |
Banner 內建 | §D.4 |
| D.5 | src/views/project/MyTasksView.vue |
不掛 Banner(spec 明確) | – | §D.5 |
| D.6 | i18n + cheatsheet | – | i18n 補齊已在 Phase C 完成;BE repo 的 docs/claude/frontend-overview.md 加 Banner 條目 |
§D.6 |
D.5 注意:MyTasksView 完全不動。它是任務執行頁,不是階段推進頁。
E2E BDD scenarios(在 ~/Projects/Billows/Audit-Manager/compliance-manager-test/):
Banner 元件本體 — 對 contract 細節有疑問時直接讀 source:
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/components/grc/FlowPhaseBanner.vue
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/composables/useStageInfo.js
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/service/StageService.jsPhase C changelog(Phase C 落地細節):
~/Projects/Billows/Audit-Manager/compliance-manager-fe/docs/changelog/
2026-05-13-feat-spec2-phase-c-flow-phase-banner.mdPhase B Stage Advance route 規格(API 行為,BE 端會回什麼):
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/changelog/
2026-05-12-feat-spec2-phase-b4-stage-advance-route.md整體 spec design(為何拆按鈕、Banner 設計理由):
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/
project-flow-engine-integrate/02-stage-integration/design.md
特別 §四 Banner 元件 + §五 互動規格 + §九 決議
整體 Plan(Phase D 詳細任務):
~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/
project-flow-engine-integrate/02-stage-integration/implementation-plan.md
§六 全段(注意 D.1 位置 plan 寫錯,以本 handoff 為準)
Phase C handoff prompt(前一輪起手語,有 Phase B 接口 + reconciliation 累積):
同上目錄 / handoff-prompt-phase-c.md讀檔:line 1-100(imports / setup)+ 1200-1290(launch 區塊 + onMounted)+ template 找出 launch 按鈕的 DOM 位置
改動:
<FlowPhaseBanner :project-uid="projectId" :ap-uid="currentApUid" @stage-advanced="onStageAdvanced" />(在現有 header / breadcrumb 區之後)handleLaunch / doLaunch function(line 1229-1285)+ launchLoading ref + 相關 i18n key 引用(不需要刪 i18n key 本身,留著 D.6 統一處理)API.GRC_AP_ACTIVATE import(若無其他地方用)onStageAdvanced(newStageInfo) handler — 內容:await fetchApStatus()(apStatus = newStageInfo.handler_result?.status ?? 'active')+ 可選 toastPhase C smoke(在 D.1 commit 前用 BE dev DB 跑一輪):
pkill -9 + python main_socketio.py 在 BE repo)npm run dev(port 5180)⚠ 保留 4 個導航按鈕(line 約 1180~ 區塊:專案規劃 / 進入稽核 / 查看稽核 / 改善計畫)— 這些是路由跳轉按鈕,不是推進按鈕。
改動:
selectedApUid 取)handleLaunchAudit(line 974-1019)+ launchAuditLoading refAPI.GRC_LAUNCH_AUDIT import(grep 確認無其他用處)onStageAdvanced — 推 audit 階段時跳轉到 AuditReviewView 或 refresh apList改動:
handleConfirmAudit(line 266+)+ confirmAuditLoading ref + 412 error 邏輯(GRC_412003 已由 BE Phase B precondition all_controls_verdict_filled 取代)onStageAdvanced — 推進後 router push 到 PoamView(若 handler_result.outcome='remediation')或顯示「已結案」(若 outcome='closed')改動:
handleCloseRound(line 189+)+ closeRoundLoading refonStageAdvanced — 推進後 toast 結案訊息不動。grep 確認 FlowPhaseBanner 未 import,留為 D.7 完成定義驗收項。
改動:
docs/claude/frontend-overview.md → 在「可重用元件總覽」段加:
FlowPhaseBanner.vue(Spec 2)— props / emit / 掛點規範StageProgressBar.vue(Spec 2)— 4-dot 進度條useStageInfo.js composable — fetch / advance 雙 method前置:BE 已重啟 + migration 已跑 + 至少一個 AP 已 backfill ext(既有 AP 之 ext.workflow_execution_uid 應為 NULL,需新建 AP 才會走 Step 22 自動建 workflow)。
activate_project 等(無前綴);FE 不用做判斷,看 stage_code + i18n label 就好(沿用 Phase B 對齊)zh_Hant_TW,不是 zh-tw — Banner 內部已處理 LOCALE_TO_BE_KEY 映射,Phase D 不需重做complete_job 不適合 main workflow — BE 已加 complete_main_workflow_job 平行 method,FE 無感flow_templates 沒 stable code 欄位 — BE Step 22 用 hardcode "完整稽核流程" 找預設範本;FE 無感ProjectPlanningView.vue:1229(不是 ProjectSettingsView.vue)。Phase D 須以本 handoff 為準,ProjectSettingsView.vue 是基本資料編輯頁,沒有 launch 按鈕。~/Projects/Billows/Audit-Manager/compliance-manager-be/log/app.log — FE BE call 異常都先 grep 這個192.168.50.188:25432 / guidant_ai_dev,cmmgr 帳號(密碼 jedi@123!)npm run dev 起 dev server(port 5180)handoff-prompt-phase-e.md 給下個 session 做 E2E(在 test repo)依 ~/Projects/Billows/Audit-Manager/compliance-manager-fe/CLAUDE.md 規範。重點:
| Commit | 範圍 |
|---|---|
| 1 | D.1 ProjectPlanningView |
| 2 | D.2 ProjectAuditorOverview |
| 3 | D.3 AuditReviewView |
| 4 | D.4 PoamView |
| 5 | D.6 frontend-overview cheatsheet + 最後驗收 |
5 commits 全在 feature/project-flow-engine-integrate branch。不 push — 整個 Phase D 完成 + 4-stage smoke 通過後,user 決定整批 push 時機。
zh_Hant_TW(非 zh-tw)— Phase C 已處理 LOCALE_TO_BE_KEY 映射complete_main_workflow_job 平行 method — Phase B.3 已落地flow_templates 無 code 欄位 → hardcode "完整稽核流程" — Phase B.5 已落地ProjectSettingsView.vue 修正為 ProjectPlanningView.vue(line 1229-1285 launch logic)Phase D 結束若有新發現,補進 design.md §十段(mirror Spec 1 §九 pattern)。
| 檔案 | 用途 | 行數 |
|---|---|---|
src/service/StageService.js |
2 個 API method(getStageInfo / advanceStage) | 51 |
src/composables/useStageInfo.js |
reactive composable,advance 偵測 warning → needsConfirmation | 84 |
src/components/grc/FlowPhaseBanner.vue |
主 Banner 元件(含 ConfirmDialog + force 邏輯) | 230 |
src/components/grc/StageProgressBar.vue |
4-dot progress bar | 102 |
src/config/locales/i18n/zh-tw/flow-engine-banner.json |
中文 i18n(6 條 precondition + banner 文案) | 27 |
src/config/locales/i18n/en/flow-engine-banner.json |
英文 i18n | 27 |
src/config/api/api.js |
加 STAGE_API 基底 + 註解 |
+3 lines |
src/config/locales/index.js |
register flow-engine-banner i18n |
+4 lines |
docs/changelog/2026-05-13-feat-spec2-phase-c-flow-phase-banner.md |
Phase C changelog | 100 |
FE Commit:313e1ed feat(spec2): Phase C — FE Banner 元件 + composable + service(領先 origin 1 commit)
| 角色 | precondition.passed | user_can_advance | 按鈕行為 |
|---|---|---|---|
| 任何 | true | true | enabled,點直接 advance |
| 非 manager | false | true | disabled + tooltip(顯示 reason) |
| manager | false | true | enabled + tooltip,點開 ConfirmDialog → accept → force=true |
| 任何 | — | false | 按鈕不顯示 |
若 advance 成功但 BE handler 回 {warning:true, message}(launch_audit 有未完成 task 等):開 ConfirmDialog 顯示 BE message,accept → 再次 advance({force:true})。
180be60 B.1+B.2 OSCAL Stage Handlers + Preconditions
6a3eea5 B.3 StageAdvanceService + complete_main_workflow_job
a7fd578 B.4 Stage Advance Route + Schemas
186828e B.5 start_oscal_project Step 22 — main workflow binding
4646b4c B.6 delete legacy ExtAssessmentPlanRepo + EndEvent reconciliation
npx vite build --mode development 7.28s 綠stage-advanced 觸發 parent refresh| 版本 | 日期 | 變更 |
|---|---|---|
| v1 | 2026-05-13 | 初版,覆蓋 D.1~D.6;含 Phase C 已交付摘要 + 5 條累積 reconciliation |