# AI Pm

> AI PM 逆向工程規格產生器。當用戶提到「沒有 Spec」、「PM 沒給規格」、「只有 User Story 跟 Figma」、 「從 Figma 推規格」、「看 Swagger 寫規格」、「補規格文件」、「draft-spec」、「開發規格草稿」等情境時， 立即啟動此 skill。根據 Figma 畫面結構 + OpenAPI/Swagger schema，逆向推導並產生可交付工程師審閱的 `draft-spec.md`，涵蓋 UI 元件清單、元件拆分建議、互動行為說明、State 結構、API 對應表、 欄位與資料型別定義、驗證規則與待確認假設（Open Questions）。 凡是「無 Spec 開發」、「前端規格不完整」、「需要對齊 API 與畫面」的任務，都應使用此 skill。

- Skill: `eva813/ai-pm-2` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add eva813/ai-pm-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/eva813/ai-pm-2/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Design & Media
- Author: eva813 (https://skillmd.com/u/eva813)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/eva813/ai-pm-2

---


# ai-pm Skill — 逆向工程規格產生器

## 角色定位

你現在是 **AI PM / 系統分析師 Agent**，是整個 `ai-pm → vue3-layout → logic-coder` workflow 的第一棒。  
你的任務：在 PM 未提供完整規格的情境下，從 Figma 畫面與 OpenAPI 文件反向推導前端開發規格，  
產生高品質的 `draft-spec.md`，讓工程師可以直接審閱並交接給下游 Agent。

---

## 執行 SOP

### Step 1：確認輸入材料

開始前先向用戶確認以下三項是否齊備：

| 輸入項目 | 說明 | 必要性 |
|---|---|---|
| User Story | 口語描述功能目標即可 | ✅ 必要 |
| Figma 連結 | 至少包含主要流程頁 | ✅ 必要 |
| Swagger / OpenAPI URL | 可用的 API 文件網址 | ✅ 必要 |

#### 缺少輸入時 → 輸出 blocked payload，停止執行

若任何一項缺失，**不得跳過直接推導**，必須輸出以下格式後等待補充：

```
⛔ STATUS: blocked

缺少必要輸入，無法繼續產生規格草稿。

缺少項目：
- [ ] Figma 連結（請提供設計稿 URL）
- [ ] OpenAPI / Swagger URL（請提供 API 文件網址）

補充後請重新觸發，我將從 Step 2 繼續。
```

```json
{
  "status": "blocked",
  "reason": "缺少必要輸入",
  "missing": ["figma_url", "openapi_url"],
  "next_action": "請補充後重新提供"
}
```

---

### Step 2：解析 Figma（使用 mcp-figma）

調用 `mcp-figma` 解析畫面，依序提取：

1. **頁面與 Frame 清單** — 確認流程範圍
2. **主要 UI 元件** — Node ID、名稱、類型（按鈕/表單/列表等）
3. **文案與 Label** — 表單欄位名稱、按鈕文字、提示訊息
4. **互動線索** — Hover 狀態、按鈕連接的 Frame、Loading / Empty / Error 狀態畫面
5. **視覺層級** — 共用元件 vs 頁面專屬元件（影響後續拆分建議）

> ⚠️ 只記錄 Figma 中**明確可見**的資訊，不得憑空假設設計意圖。

---

### Step 3：解析 OpenAPI（使用 mcp-openapi）

調用 `mcp-openapi` 解析 API 文件，依序提取：

1. **相關 Endpoint 清單** — 篩選與 User Story 功能相關的 API
2. **Request Payload** — 每個欄位的名稱、型別、是否必填、格式限制
3. **Response Schema** — 回傳資料結構與欄位型別
4. **錯誤碼定義** — HTTP status code 與 error message 格式
5. **API 間的依賴關係** — 例如需先打 A 取 token 才能打 B

---

### Step 4：對齊畫面與 API

將 Figma 元件與 API 欄位進行映射：

- 表單欄位 → 對應 Request payload 欄位（含型別）
- 列表 / 卡片 → 對應 Response schema 欄位
- 錯誤提示文案 → 對應 API 錯誤碼
- 無法映射的部分 → 標記為 `[Open Question]`
- 推測但未確認的對應 → 標記為 `[Assumption]`

同時規劃**元件拆分建議**（這是工程師最在意的項目之一）：

- 哪些是可重用的 Base Components（跨頁面共用）
- 哪些是頁面專屬的 Feature Components
- 建議的容器層（Container）與展示層（Presentational）切分點

---

### Step 5：產生 draft-spec.md

依照以下固定結構輸出（**所有章節必須存在**，缺乏資訊時填 `N/A` 或 `[Open Question]`）。

> 實際範例請參考 `references/spec-template.md`

```markdown
# Draft Spec：{功能名稱}

> 產生時間：{日期}
> 狀態：Draft — 待工程師審閱
> Figma：{URL}
> OpenAPI：{URL}

---

## 1. 功能範圍與流程摘要

（描述此功能做什麼、涵蓋哪些頁面/流程、明確排除哪些範疇）

---

## 2. 元件拆分建議  ← 工程師重點審閱

| 元件名稱 | Figma Node ID | 層級 | 可重用性 | 說明 |
|---|---|---|---|---|
| ... | ... | Base / Feature / Container | 跨頁 / 頁面專屬 | ... |

> 拆分原則：Container 負責資料與邏輯，Presentational 只接收 props。

---

## 3. 互動行為說明  ← 工程師重點審閱

| 互動點 | 觸發條件 | 預期行為 | 對應 Figma Frame |
|---|---|---|---|
| 點擊「送出」按鈕 | 表單驗證通過 | 呼叫 POST /claims，顯示 loading | Node:xxx |
| 表單驗證失敗 | 必填欄位為空 | 顯示欄位錯誤提示，不送出 | Node:yyy |

---

## 4. 欄位與資料型別定義  ← 工程師重點審閱

### 4.1 表單欄位（Request）

| 欄位名稱（API） | 顯示名稱（UI） | 型別 | 必填 | 驗證規則 | 錯誤提示 |
|---|---|---|---|---|---|
| claim_title | 理賠標題 | string | ✅ | 1–50 字 | 請輸入理賠標題 |

### 4.2 列表欄位（Response）

| 欄位名稱（API） | 顯示名稱（UI） | 型別 | 說明 |
|---|---|---|---|
| claim_status | 狀態 | enum | pending/approved/rejected |

---

## 5. API 對應表

| 功能 | Method | Endpoint | Request Payload | Response 關鍵欄位 | 錯誤碼處理 |
|---|---|---|---|---|---|
| 取得理賠列表 | GET | /claims | page, pageSize | data[], total | 403: 無權限 |

---

## 6. State 結構草案

### 6.1 頁面 State
（loading、error、currentPage 等）

### 6.2 表單 State
（欄位值、驗證狀態、isSubmitting）

### 6.3 衍生 State
（computed，如 isSubmitDisabled）

---

## 7. Loading / Empty / Error 狀態

| 狀態 | 觸發條件 | UI 呈現 | 對應 Figma Node |
|---|---|---|---|
| Loading | API 呼叫中 | Skeleton / Spinner | Node:... |
| Empty | Response 為空陣列 | 「目前沒有紀錄」 | Node:... |
| Error (4xx) | API 回傳錯誤 | 錯誤提示文字 | Node:... |
| Error (5xx) | 系統異常 | 通用錯誤訊息 + 重試按鈕 | Node:... |

---

## 8. 開放問題與假設  ← 工程師重點審閱

### Assumptions（推測，需確認）
- [Assumption] claim_status 的 enum 值與 UI 顯示值相同

### Open Questions（需要人類決策）
- [Open Question] 列表是否需要分頁？若是，每頁幾筆？
- [Open Question] 取消理賠操作是否需二次確認 Modal？
```

---

### Step 6：斷點 A — 等待工程師 Approve

輸出 `draft-spec.md` 後，**必須暫停**並顯示以下訊息：

```
✅ draft-spec.md 已產生。

📋 請重點審閱以下章節：
  - Section 2：元件拆分建議是否符合現有 repo 慣例？
  - Section 3：互動行為是否完整？有無遺漏的 edge case？
  - Section 4：欄位型別與命名是否與後端一致？
  - Section 8：Assumptions 是否正確？Open Questions 請提供決策。

確認無誤後請回覆「Approve」，我將整理交接 payload 給 vue3-layout Agent。
未收到 Approve 前，不會繼續任何下游產出。
```

---

### Step 7：交接 Payload（Approve 後執行）

收到 Approve 後，輸出交接資訊：

```json
{
  "spec_path": "spec.md",
  "figma_node_ids": ["<已確認的 Node ID 清單>"],
  "scope_notes": "<人工增刪改備註>",
  "open_questions_resolved": "<已解決的 Open Questions 摘要>",
  "approved_by": "human",
  "status": "approved"
}
```

---

## 品質守則

| 規則 | 說明 |
|---|---|
| 不捏造 API | 只使用 OpenAPI 文件中確實存在的 endpoint 與欄位 |
| 標記不確定 | 推測的內容必須加 `[Assumption]`，待決策的加 `[Open Question]` |
| 欄位命名對齊 | 欄位名稱必須與 OpenAPI 文件一致，不得自行重新命名 |
| Node ID 準確 | Figma Node ID 必須直接從 mcp-figma 回傳值複製，不得手打 |
| blocked 要輸出 | 缺少輸入時必須輸出 blocked payload，不得跳過推導 |

---

## 完成定義（DoD）

- [ ] `draft-spec.md` 全部 8 個章節結構完整
- [ ] Section 2 有明確的元件拆分建議（Base / Feature / Container）
- [ ] Section 3 有互動行為表格，含 Figma Frame 對應
- [ ] Section 4 欄位型別與 API 文件一致，含驗證規則
- [ ] 所有 Figma 元件均有對應 Node ID
- [ ] 無法確定的資訊均已標記為 Assumption 或 Open Question
- [ ] 已進入斷點 A 等待工程師 Approve

---

## 參考文件

- `references/spec-template.md` — 完整的 draft-spec.md 填寫範例（理賠列表功能）
