---
name: mapping-html-to-api
description: Maps HTML content elements to API response fields and generates data binding specifications. Updates the "APIマッピング" section in screen spec.md.
allowed-tools: [Read, Write, Glob, Grep]
---
# HTML to API Mapping Skill
HTML要素・UIコンポーネントとAPIエンドポイントの対応関係を整理するスキルです。
## 目次
1. [概要](#概要)
2. [適用条件](#適用条件)
3. [クイックスタート](#クイックスタート)
4. [詳細ガイド](#詳細ガイド)
5. [出力形式](#出力形式)
## 概要
このスキルは以下のタスクをサポートします:
1. **全コンテンツ要素の確認**: 静的・動的を問わず全要素をAPI仕様書と照合
2. **再分類**: 静的と仮決定された要素でもAPIから取得する場合は動的に変更
3. **データソースの特定**: 各UI要素が表示するデータの出所
4. **APIエンドポイントの整理**: 必要なAPIとそのパラメータ
5. **リクエスト/レスポンス構造**: APIの入出力形式
6. **データバインディング**: UIフィールドとAPIフィールドの対応
7. **API呼び出しタイミング**: いつAPIを呼ぶか
## ワークフロー上の位置づけ
```
1. converting-figma-to-html
└─> Figmaから静的/動的を推測 → spec.md「コンテンツ分析」に仮決定
2. mapping-html-to-api(このスキル)
└─> 全コンテンツ要素をAPI仕様書と照合
└─> 動的要素の確定 + 静的→動的への再分類
└─> spec.md「APIマッピング」に確定結果を記載
```
### 再分類の例
| 仮決定 | API仕様書 | 確定 |
|--------|----------|------|
| static(タブラベル) | APIレスポンスに含まれる | **dynamic** |
| static(固定テキスト) | APIに該当なし | static(確定) |
| dynamic(ユーザー名) | APIレスポンスに含まれる | dynamic(確定) |
## 禁止事項
**以下は絶対に行わないこと:**
- 実装コードの生成(fetch/axios等)
- 特定のHTTPライブラリの提案
- バックエンド実装の詳細
このスキルの目的は「どのUIがどのAPIとつながるか」の**情報整理のみ**です。
## 適用条件
このスキルは**動的データを表示/送信する画面**に適用します。
### 適用する画面の例
- データ一覧の表示(API取得)
- 詳細情報の表示(API取得)
- フォーム送信(API送信)
- 検索/フィルター(API取得)
- ユーザー情報の表示(API取得)
### 適用しない画面の例
- 完全に静的なページ
- ローカルデータのみの画面
- APIとの連携がない画面
**API連携がない場合**、spec.md のAPIマッピングセクションに「該当なし」と記載します。
## 出力先
このスキルは**画面仕様書(spec.md)の「APIマッピング」セクション**を更新します。
```
.agents/tmp/{screen-id}/
├── spec.md # ← このスキルが「APIマッピング」セクションを更新
├── index.html # 参照用HTML
└── assets/
```
## クイックスタート
### 基本的な使い方
```
以下の画面のAPIマッピングを整理してください:
画面ID: course-list
OpenAPI: openapi/index.yaml
```
エージェントは自動的に:
1. 動的データ要素を検出
2. APIエンドポイントを特定
3. データバインディングを整理
4. **spec.md の「APIマッピング」セクションを更新**
## 詳細ガイド
詳細な情報は以下のファイルを参照してください:
- **[workflow.md](references/workflow.md)**: APIマッピングのワークフロー
- **[api-patterns.md](references/api-patterns.md)**: 一般的なAPIパターン
- **[section-template.md](references/section-template.md)**: セクション出力テンプレート
## Workflow
APIマッピング時にこのチェックリストをコピー:
```
API Mapping Progress:
- [ ] Step 0: spec.md の存在確認
- [ ] Step 1: 全コンテンツ要素を抽出(静的・動的両方)
- [ ] Step 2: APIエンドポイントを特定
- [ ] Step 3: リクエスト構造を定義
- [ ] Step 4: レスポンス構造を定義
- [ ] Step 5: データバインディングを整理(静的→動的の再分類含む)
- [ ] Step 6: API呼び出しタイミングを決定
- [ ] Step 7: エラーハンドリングを定義
- [ ] Step 8: spec.md の「APIマッピング」セクションを更新
- [ ] Step 9: マッピングオーバーレイ生成(任意)
```
### Step 0: spec.md の存在確認
```bash
ls .agents/tmp/{screen-id}/spec.md
```
### Step 1: 全コンテンツ要素を抽出
spec.md「コンテンツ分析」セクションから**全ての要素**を抽出:
**動的(仮決定):**
- リストで繰り返し表示される要素(`dynamic_list`)
- ユーザー固有のデータ(`dynamic`)
- 数値データ(件数、金額等)
- 日時データ
- ステータス/状態表示
**静的(仮決定)- 再分類対象:**
- ラベル・タイトル(APIから取得する可能性)
- タブ名・メニュー項目(APIで動的に決まる可能性)
- ボタンテキスト(状態によって変わる可能性)
- 説明文(APIから取得する可能性)
### Step 2: APIエンドポイントを特定
各データソースに対するAPI:
| データ | エンドポイント | メソッド |
|--------|--------------|---------|
| 講座一覧 | /api/courses | GET |
| 講座詳細 | /api/courses/:id | GET |
| ユーザー情報 | /api/users/me | GET |
### Step 3: リクエスト構造を定義
- パスパラメータ
- クエリパラメータ
- リクエストボディ
- ヘッダー
### Step 4: レスポンス構造を定義
- レスポンスボディの型
- ページネーション情報
- メタデータ
### Step 5: データバインディングを整理(再分類含む)
全コンテンツ要素とAPIフィールドの対応を整理し、再分類を行う:
**マッピングルール(優先度順):**
| 優先度 | ルール | 例 |
|--------|--------|-----|
| 1 | 完全一致(snake↔kebab) | `user_id` ↔ `user-id` |
| 2 | 部分一致(接尾辞除去) | `name_value` → `name` |
| 3 | 意味的一致 | `title` ↔ `name` |
**再分類条件(static → dynamic):**
- APIフィールドにマッチした
- APIレスポンスに含まれる値
- 配列要素の一部
**出力例:**
| UI要素 | 仮決定 | APIフィールド | 確定 | 変換 |
|--------|--------|-------------|------|------|
| 講座タイトル | dynamic | course.title | dynamic | そのまま |
| タブ名 | static | tabs[].label | **dynamic** | そのまま |
| 作成日 | dynamic | course.created_at | dynamic | formatDate |
| 「閉じる」ボタン | static | - | static | - |
### Step 6: API呼び出しタイミングを決定
| タイミング | API | トリガー |
|----------|-----|---------|
| 画面表示時 | GET /api/courses | useEffect / onMounted |
| 検索実行時 | GET /api/courses?q=xxx | 検索ボタンクリック |
| フォーム送信時 | POST /api/courses | 送信ボタンクリック |
### Step 7: エラーハンドリングを定義
| エラー | HTTPステータス | UI対応 |
|--------|--------------|--------|
| 認証エラー | 401 | ログイン画面へ遷移 |
| 権限エラー | 403 | エラーメッセージ表示 |
| 未検出 | 404 | 空状態表示 |
| サーバーエラー | 500 | リトライ促進 |
### Step 8: spec.md の「APIマッピング」セクションを更新
1. セクションを特定(`## APIマッピング`)
2. ステータスを「完了 ✓」に更新
3. `{{API_MAPPING_CONTENT}}` を内容に置換
4. 完了チェックリストを更新
5. 変更履歴に追記
### Step 9: マッピングオーバーレイ生成(任意)
ユーザーが要求した場合、HTMLにマッピング可視化オーバーレイを追加:
1. テンプレートを読み込み: `templates/mapping-overlay.js`
2. マッピングデータを挿入
3. HTMLに `` を追加
**オーバーレイのタイプ別色分け:**
| タイプ | 色 | 説明 |
|--------|-----|------|
| static | グレー | 固定ラベル・UI文言 |
| dynamic | 緑 | APIから取得 |
| dynamic_list | 青 | API配列データ |
| local | 紫 | ローカルステート |
| asset | 黄 | 画像・アイコン |
## 出力形式
### spec.md「APIマッピング」セクションの内容
```markdown
## APIマッピング
> **ステータス**: 完了 ✓
> **生成スキル**: mapping-html-to-api
> **更新日**: 2024-01-15
### 使用API一覧
| エンドポイント | メソッド | 用途 | 呼び出しタイミング |
|---------------|---------|------|------------------|
| /api/courses | GET | 講座一覧取得 | 画面表示時 |
| /api/courses/:id | GET | 講座詳細取得 | カードクリック時 |
| /api/courses | POST | 講座作成 | フォーム送信時 |
### データバインディング
#### GET /api/courses
**リクエスト**
| パラメータ | 型 | 必須 | 説明 |
|-----------|-----|:----:|------|
| page | number | - | ページ番号 |
| limit | number | - | 取得件数 |
| q | string | - | 検索キーワード |
| category | string | - | カテゴリフィルター |
**レスポンス**
\`\`\`typescript
interface CoursesResponse {
courses: Course[];
total: number;
page: number;
limit: number;
}
interface Course {
id: string;
title: string;
description: string;
category: string;
duration: number;
created_at: string;
}
\`\`\`
**UIマッピング**
| UI要素 | data-figma-content | APIフィールド | 変換 |
|--------|-------------------|--------------|------|
| 講座タイトル | course-title | course.title | そのまま |
| 講座説明 | course-description | course.description | 100文字で切り詰め |
| カテゴリ | course-category | course.category | カテゴリ名に変換 |
| 所要時間 | course-duration | course.duration | \`${value}分\` |
| 作成日 | course-created-at | course.created_at | formatDate |
#### POST /api/courses
**リクエスト**
\`\`\`typescript
interface CreateCourseRequest {
title: string;
description: string;
category: string;
duration: number;
}
\`\`\`
**フォームマッピング**
| フォームフィールド | APIフィールド | バリデーション |
|------------------|--------------|---------------|
| タイトル入力 | title | 必須、100文字以内 |
| 説明入力 | description | 任意、1000文字以内 |
| カテゴリ選択 | category | 必須 |
| 所要時間入力 | duration | 必須、1-480 |
### API呼び出しタイミング
| タイミング | API | トリガー | 備考 |
|----------|-----|---------|------|
| 画面表示時 | GET /api/courses | マウント時 | 初回データ取得 |
| 検索実行時 | GET /api/courses?q=xxx | 検索フォーム送信 | デバウンス300ms |
| ページ遷移時 | GET /api/courses?page=N | ページネーションクリック | - |
| 作成実行時 | POST /api/courses | フォーム送信 | バリデーション後 |
### エラーハンドリング
| HTTPステータス | エラー種別 | UI対応 |
|--------------|----------|--------|
| 401 | 認証エラー | ログイン画面へリダイレクト |
| 403 | 権限エラー | 権限エラーメッセージ表示 |
| 404 | データ未検出 | Empty状態表示 |
| 422 | バリデーションエラー | フォームエラー表示 |
| 500 | サーバーエラー | リトライボタン表示 |
### 特記事項
- 講座一覧は無限スクロールまたはページネーションで対応
- 検索は300msのデバウンスを適用
- カテゴリは事前にマスタデータを取得してキャッシュ
```
## API連携がない場合
API連携がない画面の場合、以下のように記載:
```markdown
## APIマッピング
> **ステータス**: 該当なし
> **生成スキル**: mapping-html-to-api
> **更新日**: 2024-01-15
この画面にはAPI連携がありません。
```
## 完了チェックリスト
生成後、以下を確認:
```
- [ ] spec.md の「APIマッピング」セクションが更新されている
- [ ] ステータスが「完了 ✓」になっている
- [ ] 使用API一覧が網羅されている
- [ ] リクエスト/レスポンス構造が定義されている
- [ ] UIマッピングが整理されている
- [ ] API呼び出しタイミングが明確
- [ ] エラーハンドリングが定義されている
- [ ] 完了チェックリストが更新されている
- [ ] 変更履歴に記録が追加されている
```
## 注意事項
### 他のセクションを変更しない
このスキルは「APIマッピング」セクションのみを更新します。
### OpenAPI仕様書との連携
OpenAPI仕様書がある場合:
1. `Read: openapi/index.yaml`
2. スキーマ定義からレスポンス構造を抽出
3. 自動マッピングを実施
### defining-form-specs との連携
フォーム仕様がある場合、フォームフィールドとAPIリクエストの対応を整理。
## 参照
- **[workflow.md](references/workflow.md)**: 詳細なワークフロー
- **[api-patterns.md](references/api-patterns.md)**: APIパターン集
- **[section-template.md](references/section-template.md)**: セクション出力テンプレート
- **[mapping-overlay.js](templates/mapping-overlay.js)**: オーバーレイテンプレート
- **[managing-screen-specs](../managing-screen-specs/SKILL.md)**: 仕様書管理スキル