Phase S 技術債修復 (首席架構師審查 82→完整): - S-01: generate_alert_fingerprint 移至 AlertAnalyzer.generate_fingerprint() staticmethod - S-04: 移除 Pydantic v2 deprecated json_encoders (直接用原生 datetime 序列化) Sentry MCP 整合 (Phase 23): - ADR-048: Sentry→OpenClaw AI Triage 架構決策 - sentry_webhook_service.py: parse/analyze/create_incident/build_message Service 層 - config.py: SENTRY_WEBHOOK_SECRET (Fail-Closed HMAC-SHA256) Playwright MCP 整合 (短期): - smoke.spec.ts: 5 頁面 E2E smoke test (home/dashboard/incidents/approvals/terminal) - cd.yaml: E2E Smoke Test 步驟 + Telegram 🎭 Smoke 狀態通知 長期規劃 ADR: - ADR-049: Figma Code Connect 設計系統同步 - ADR-050: Telegram 互動式 Incident 2.0 (6鍵 Inline Keyboard) - ADR-051: Context7 依賴升級顧問 (Next.js 14→15, FastAPI 0.115→0.128) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
164 lines
5.1 KiB
Markdown
164 lines
5.1 KiB
Markdown
# ADR-049: Figma Code Connect 設計系統同步
|
||
|
||
| 項目 | 內容 |
|
||
|------|------|
|
||
| **狀態** | 📋 已批准,待實作 |
|
||
| **日期** | 2026-04-01 |
|
||
| **決策者** | 首席架構師 + 統帥 |
|
||
| **觸發** | MCP 整合長期計畫 |
|
||
|
||
## 背景
|
||
|
||
前端 UI 元件與 Figma 設計稿可能產生漂移(drift):設計師在 Figma 更新了元件樣式或佈局,但 `apps/web/src/components/` 下的 React 元件未同步更新,導致 QA 發現視覺差異時已累積大量技術債。
|
||
|
||
目前缺乏任何機制能夠:
|
||
1. 讓設計師在 Figma 中直接看到對應的程式碼元件
|
||
2. 在 Code Review 時確認 UI 實作與設計稿的一致性
|
||
3. 系統化追蹤哪些元件存在 design-code drift
|
||
|
||
## 問題
|
||
|
||
| 面向 | 現況 | 目標 |
|
||
|------|------|------|
|
||
| 設計-代碼映射 | 無正式對應關係 | Figma 元件 ↔ React 元件 1:1 映射 |
|
||
| 漂移偵測 | 手動 QA 發現 | 每週自動掃描確認映射狀態 |
|
||
| 設計師工作流 | 不知道對應哪支 component | Figma Dev Mode 直接顯示程式碼 |
|
||
|
||
## 決策
|
||
|
||
使用 **Figma Code Connect** 建立 `.figma.js` 映射文件,將每個 Figma 元件對應到 React 元件的 import 與 props 結構。
|
||
|
||
定期(每週)使用 Figma MCP 掃描設計稿,確認映射是否需要更新。
|
||
|
||
## 架構
|
||
|
||
### 文件結構
|
||
|
||
```
|
||
apps/web/src/components/
|
||
├── ui/
|
||
│ ├── button/
|
||
│ │ ├── Button.tsx
|
||
│ │ └── Button.figma.js ← Code Connect 映射
|
||
│ ├── card/
|
||
│ │ ├── Card.tsx
|
||
│ │ └── Card.figma.js
|
||
│ └── badge/
|
||
│ ├── Badge.tsx
|
||
│ └── Badge.figma.js
|
||
├── incident/
|
||
│ ├── IncidentCard.tsx
|
||
│ └── IncidentCard.figma.js
|
||
└── approval/
|
||
├── ApprovalCard.tsx
|
||
└── ApprovalCard.figma.js
|
||
```
|
||
|
||
### Code Connect 映射格式
|
||
|
||
```js
|
||
// Button.figma.js
|
||
import figma from '@figma/code-connect'
|
||
import { Button } from './Button'
|
||
|
||
figma.connect(Button, 'https://www.figma.com/design/FILEID?node-id=NODE_ID', {
|
||
props: {
|
||
variant: figma.enum('Variant', {
|
||
primary: 'primary',
|
||
secondary: 'secondary',
|
||
destructive: 'destructive',
|
||
}),
|
||
size: figma.enum('Size', {
|
||
sm: 'sm',
|
||
md: 'md',
|
||
lg: 'lg',
|
||
}),
|
||
label: figma.string('Label'),
|
||
disabled: figma.boolean('Disabled'),
|
||
},
|
||
example: ({ variant, size, label, disabled }) => (
|
||
<Button variant={variant} size={size} disabled={disabled}>
|
||
{label}
|
||
</Button>
|
||
),
|
||
})
|
||
```
|
||
|
||
### 每週掃描流程
|
||
|
||
```
|
||
Claude Code + Figma MCP
|
||
→ get_design_context (核心元件節點)
|
||
→ get_code_connect_suggestions
|
||
→ 比對現有 .figma.js 映射
|
||
→ 輸出「drift report」
|
||
→ 若有差異 → 建立 GitHub Issue
|
||
```
|
||
|
||
## 實作計畫
|
||
|
||
### P1:核心 UI 元件(第 1 週)
|
||
|
||
| 元件 | Figma 節點 | React 路徑 |
|
||
|------|------------|------------|
|
||
| Button | TBD | `components/ui/button/Button.tsx` |
|
||
| Card | TBD | `components/ui/card/Card.tsx` |
|
||
| Badge | TBD | `components/ui/badge/Badge.tsx` |
|
||
| Input | TBD | `components/ui/input/Input.tsx` |
|
||
| Modal | TBD | `components/ui/modal/Modal.tsx` |
|
||
|
||
**前置條件**: 確認 Figma 文件 URL 與節點 ID(需統帥提供)
|
||
|
||
### P2:業務元件(第 2-3 週)
|
||
|
||
| 元件 | Figma 節點 | React 路徑 |
|
||
|------|------------|------------|
|
||
| IncidentCard | TBD | `components/incident/IncidentCard.tsx` |
|
||
| ApprovalCard | TBD | `components/approval/ApprovalCard.tsx` |
|
||
| AlertBanner | TBD | `components/alert/AlertBanner.tsx` |
|
||
| StatusBadge | TBD | `components/status/StatusBadge.tsx` |
|
||
|
||
### P3:Storybook 整合(第 4 週,視現況決定)
|
||
|
||
- 確認是否已有 Storybook 設置
|
||
- 若已有:在 Story 中引用 Code Connect 映射
|
||
- 若未有:評估導入成本,記入 INSPIRATION_LAB.md 待批准
|
||
|
||
## 工具需求
|
||
|
||
```json
|
||
// package.json (apps/web)
|
||
{
|
||
"devDependencies": {
|
||
"@figma/code-connect": "^1.x"
|
||
}
|
||
}
|
||
```
|
||
|
||
發布指令(需 Figma Personal Access Token):
|
||
```bash
|
||
npx figma connect publish --token $FIGMA_ACCESS_TOKEN
|
||
```
|
||
|
||
## 注意事項
|
||
|
||
1. **Figma URL 需要統帥提供**:在執行 P1 前,需要確認 Figma 設計稿的文件 ID 和各核心元件的節點 ID
|
||
2. **Token 管理**:`FIGMA_ACCESS_TOKEN` 需存入 K8s Secrets,不得 hardcode
|
||
3. **每週掃描**:由 Claude Code + Figma MCP 執行,不需要新增 CI 步驟
|
||
4. **`.figma.js` 檔案不影響 build**:只在開發環境和 Code Connect 發布時使用
|
||
|
||
## 影響
|
||
|
||
| 面向 | 影響 |
|
||
|------|------|
|
||
| **設計師** | Figma Dev Mode 可直接看到對應元件的 import 和 props |
|
||
| **前端開發** | PR 時有明確參考,減少「我以為設計是這樣」問題 |
|
||
| **QA** | 視覺差異有跡可查,drift report 提前預警 |
|
||
| **Build 時間** | 無影響,`.figma.js` 不參與 webpack/next build |
|
||
|
||
## 相關文件
|
||
|
||
- [feedback_design_system_quickref.md](~/.claude/projects/-Users-ogt-awoooi/memory/feedback_design_system_quickref.md)
|
||
- [feedback_ui_collaboration_protocol.md](~/.claude/projects/-Users-ogt-awoooi/memory/feedback_ui_collaboration_protocol.md)
|
||
- Figma Code Connect 官方文件:https://www.figma.com/developers/code-connect
|