AgentSkillsCN

mapping-html-to-api

将 HTML 内容元素映射至 API 响应字段,并生成数据绑定规范。更新 screen spec.md 中的“API 映射”章节。

SKILL.md
--- frontmatter
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を呼ぶか

動作モード

このスキルは2つのモードで動作します:

モード条件用途
確定モードOpenAPI/Contract仕様書が存在既存APIとのマッピング整理
提案モードAPI未確定(仕様書なし)HTML要素からAPI要件を提案

モード判定フロー

code
1. contract/ フォルダにAPI検証ファイルがあるか確認
   ├─ あり → 確定モード(実データ優先)
   └─ なし → 2へ

2. OpenAPI/Contract仕様書を探す
   ├─ 見つかった → 確定モード(仕様書ベース)
   └─ 見つからない → 提案モード

ワークフロー上の位置づけ

code
1. converting-figma-to-html
   └─> Figmaから静的/動的を推測 → spec.md「コンテンツ分析」に仮決定

2. executing-api-from-openapi(オプション)
   └─> OpenAPIからAPIを実行してレスポンス形式を取得
   └─> contract/{endpoint-name}.json に検証結果を保存

3. mapping-html-to-api(このスキル)
   └─> contract/ フォルダのAPI検証ファイルを参照(あれば)
   └─> 全コンテンツ要素をAPI仕様書/実データと照合
   └─> 動的要素の確定 + 静的→動的への再分類
   └─> spec.md「APIマッピング」に確定結果を記載

API検証ファイルの判定

このスキル実行時、以下の順序でAPI情報を探す:

code
1. contract/{endpoint-name}.json を確認
   ├─ 存在する → 実際のレスポンスデータを使用(高精度)
   └─ 存在しない → OpenAPI仕様書のみを使用

contract ファイル形式:

json
{
  "endpoint": "/api/v1/messages",
  "method": "GET",
  "executed_at": "2024-01-15T10:30:00Z",
  "request": { ... },
  "response": { ... },
  "schema_diff": [ ... ]
}

再分類の例

仮決定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マッピング」セクションを更新します。

code
.agents/tmp/{screen-id}/
├── spec.md                 # ← このスキルが「APIマッピング」セクションを更新
├── index.html              # ← APIマッピング属性を追加
├── contract/               # API検証結果(executing-api-from-openapiで生成)
│   ├── get-messages.json   # 例: GET /api/v1/messages の検証結果
│   └── post-feedback.json  # 例: POST /api/v1/feedback の検証結果
└── assets/

HTML APIマッピング属性

動的要素にAPIマッピング情報を埋め込む。converting-figma-to-html で付与された data-figma-content-classification="dynamic" の要素が対象。

属性一覧

属性用途必須
data-api-endpointAPIエンドポイント"GET /student_api/ask_ai/submission/{id}"
data-api-response-fieldレスポンスのフィールドパス"is_bookmarked"
data-api-request-bodyリクエストボディテンプレート'{"rating": 1}'
data-api-contract契約ファイル名"get_submission.md"

※ △ = GETは data-api-response-field、POSTは data-api-request-body を使用

埋め込み例

html
<!-- GET: データ表示 -->
<img data-figma-content-id="question_image"
     data-figma-content-classification="dynamic"
     data-api-endpoint="GET /student_api/ask_ai/submission/{id}/info"
     data-api-response-field="image_uri"
     data-api-contract="get_submission_info.md"
     src="placeholder.png">

<!-- POST: アクション送信 -->
<button data-figma-content-id="feedback_positive"
        data-figma-content-classification="static"
        data-api-endpoint="POST /student_api/ask_ai/feedback"
        data-api-request-body='{"question_id": "{id}", "rating": 1}'
        data-api-contract="post_feedback.md">
  解決した
</button>

注意事項

  • data-figma-content-classification="static" でも、アクションを送信する要素には data-api-endpoint を付与
  • フィールドパスは配列インデックスやフィルタ条件を含めてよい(例: ask_ai_messages[role=ai].content
  • 契約ファイル名は contract/ フォルダ内のファイル名と一致させる

クイックスタート

基本的な使い方

code
以下の画面のAPIマッピングを整理してください:
画面ID: course-list
OpenAPI: openapi/index.yaml

エージェントは自動的に:

  1. 動的データ要素を検出
  2. APIエンドポイントを特定
  3. データバインディングを整理
  4. spec.md の「APIマッピング」セクションを更新

詳細ガイド

詳細な情報は以下のファイルを参照してください:

Workflow

APIマッピング時にこのチェックリストをコピー:

code
API Mapping Progress:
- [ ] Step 0: spec.md の存在確認
- [ ] Step 1: contract/ フォルダのAPI検証ファイルを確認
- [ ] Step 2: 全コンテンツ要素を抽出(静的・動的両方)
- [ ] Step 3: APIエンドポイントを特定
- [ ] Step 4: リクエスト構造を定義
- [ ] Step 5: レスポンス構造を定義
- [ ] Step 6: データバインディングを整理(静的→動的の再分類含む)
- [ ] Step 7: API呼び出しタイミングを決定
- [ ] Step 8: エラーハンドリングを定義
- [ ] Step 9: spec.md の「APIマッピング」セクションを更新
- [ ] Step 10: HTMLにdata-api-*属性を追加
- [ ] Step 11: マッピングオーバーレイ生成(任意)
  - [ ] テンプレートをコピー: ../../templates/mapping-overlay.js
  - [ ] CONTRACT_DATA にGET APIのサンプルJSONを追加
  - [ ] HTMLに <script src="mapping-overlay.js"></script> を追加

Step 0: spec.md の存在確認

bash
ls .agents/tmp/{screen-id}/spec.md

Step 1: contract/ フォルダのAPI検証ファイルを確認

bash
ls .agents/tmp/{screen-id}/contract/*.json 2>/dev/null

ファイルが存在する場合:

  • 実際のAPIレスポンスを使用してマッピング(高精度)
  • response フィールドから実際のデータ構造を取得

ファイルが存在しない場合:

  • OpenAPI仕様書のみを使用してマッピング
  • 仕様と実装の乖離がある可能性を注記

Step 2: 全コンテンツ要素を抽出

spec.md「コンテンツ分析」セクションから全ての要素を抽出:

動的(仮決定):

  • リストで繰り返し表示される要素(dynamic_list
  • ユーザー固有のデータ(dynamic
  • 数値データ(件数、金額等)
  • 日時データ
  • ステータス/状態表示

静的(仮決定)- 再分類対象:

  • ラベル・タイトル(APIから取得する可能性)
  • タブ名・メニュー項目(APIで動的に決まる可能性)
  • ボタンテキスト(状態によって変わる可能性)
  • 説明文(APIから取得する可能性)

Step 3: APIエンドポイントを特定

各データソースに対するAPI:

データエンドポイントメソッド
講座一覧/api/coursesGET
講座詳細/api/courses/:idGET
ユーザー情報/api/users/meGET

Step 4: リクエスト構造を定義

  • パスパラメータ
  • クエリパラメータ
  • リクエストボディ
  • ヘッダー

Step 5: レスポンス構造を定義

  • レスポンスボディの型
  • ページネーション情報
  • メタデータ

Step 6: データバインディングを整理(再分類含む)

全コンテンツ要素とAPIフィールドの対応を整理し、再分類を行う:

マッピングルール(優先度順):

優先度ルール
1完全一致(snake↔kebab)user_iduser-id
2部分一致(接尾辞除去)name_valuename
3意味的一致titlename

再分類条件(static → dynamic):

  • APIフィールドにマッチした
  • APIレスポンスに含まれる値
  • 配列要素の一部

出力例:

UI要素仮決定APIフィールド確定変換
講座タイトルdynamiccourse.titledynamicそのまま
タブ名statictabs[].labeldynamicそのまま
作成日dynamiccourse.created_atdynamicformatDate
「閉じる」ボタンstatic-static-

Step 7: API呼び出しタイミングを決定

タイミングAPIトリガー
画面表示時GET /api/coursesuseEffect / onMounted
検索実行時GET /api/courses?q=xxx検索ボタンクリック
フォーム送信時POST /api/courses送信ボタンクリック

Step 8: エラーハンドリングを定義

エラーHTTPステータスUI対応
認証エラー401ログイン画面へ遷移
権限エラー403エラーメッセージ表示
未検出404空状態表示
サーバーエラー500リトライ促進

Step 9: spec.md の「APIマッピング」セクションを更新

  1. セクションを特定(## APIマッピング
  2. ステータスを「完了 ✓」に更新
  3. {{API_MAPPING_CONTENT}} を内容に置換
  4. 完了チェックリストを更新
  5. 変更履歴に追記

Step 10: マッピングオーバーレイ生成(任意)

ユーザーが要求した場合、HTMLにマッピング可視化オーバーレイを追加:

  1. テンプレートを読み込み: ../../templates/mapping-overlay.js
  2. CONTRACT_DATA にAPIサンプルJSONを追加
  3. HTMLに <script src="mapping-overlay.js"></script> を追加

オーバーレイのタイプ別色分け:

タイプ説明
staticグレー固定ラベル・UI文言
dynamicAPIから取得
dynamic_listAPI配列データ
config設定値
asset画像・アイコン
user_assetオレンジユーザーアップロード画像

インタラクション:

タイプ説明
navigateピンク画面遷移
modalオレンジモーダル表示

API連携:

タイプ説明
api_getGET API
api_postオレンジPOST API

CONTRACT_DATA 設定

mapping-overlay.js の CONTRACT_DATA オブジェクトに、GET APIのサンプルJSONを登録:

javascript
const CONTRACT_DATA = {
  'get_api_endpoint_name.md': {
    endpoint: 'GET /api/path/{id}',
    json: {
      "field1": "value1",
      "field2": {
        "nested": "value"
      }
    }
  }
};

ファイル名: contract/ フォルダ内のファイル名と一致させる

JSONプレビュー機能

GET APIの要素にホバーすると:

  1. 凡例の下にJSONプレビューパネルが表示
  2. フィールド自動検出: 要素の data-figma-content-valuetextContent からJSONフィールドを自動検出
  3. パスハイライト: 該当フィールドとその親パスが黄色/水色でハイライト

ハイライト表示:

説明
黄色背景ターゲットのkey/value
水色テキストターゲットへのパス上の親キー
緑色 (🔍)自動検出されたパス
黄色 (→)data-api-response-field で指定されたパス

Contract未登録警告

data-api-contract で参照しているファイルが CONTRACT_DATA に登録されていない場合:

  1. 凡例に警告セクションが表示(オレンジ色)
  2. コンソールに警告と追加方法のテンプレートを出力
  3. ホバー時に警告パネルを表示

出力形式

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連携がありません。

完了チェックリスト

生成後、以下を確認:

code
- [ ] spec.md の「APIマッピング」セクションが更新されている
- [ ] ステータスが「完了 ✓」になっている
- [ ] 使用API一覧が網羅されている
- [ ] リクエスト/レスポンス構造が定義されている
- [ ] UIマッピングが整理されている
- [ ] API呼び出しタイミングが明確
- [ ] エラーハンドリングが定義されている
- [ ] 完了チェックリストが更新されている
- [ ] 変更履歴に記録が追加されている

注意事項

他のセクションを変更しない

このスキルは「APIマッピング」セクションのみを更新します。

OpenAPI仕様書との連携

OpenAPI仕様書がある場合:

  1. Read: openapi/index.yaml
  2. スキーマ定義からレスポンス構造を抽出
  3. 自動マッピングを実施

defining-form-specs との連携

フォーム仕様がある場合、フォームフィールドとAPIリクエストの対応を整理。

参照

mapping-overlay.js の機能

テンプレート assets/mapping-overlay.js には以下の機能が含まれます:

1. データタイプ可視化

  • data-figma-content-classification に基づく要素のハイライト
  • 破線アウトラインでタイプ別に色分け

2. インタラクション可視化

  • data-figma-interaction, data-figma-navigate の要素をハイライト
  • 実線アウトラインで画面遷移/モーダルを表示

3. APIマッピング可視化

  • data-api-endpoint, data-api-contract の要素を検出
  • GET/POST/LOCAL別の色分け表示
  • ツールチップにAPI詳細を表示

4. JSONプレビューパネル

GET API要素ホバー時にJSONプレビューを表示:

パネル機能:

機能説明
ヘッダー常時表示Mappingオン時は常にヘッダー(📋 JSON Preview)を表示
ドラッグ移動ヘッダーをドラッグしてパネル位置を自由に移動
ホールド(📌)ボタンクリックでピン留め、マウスアウトしてもコンテンツ維持
自動検出要素の値からJSONフィールドを自動特定(🔍 緑色で表示)
パス指定data-api-response-field で明示指定(→ 黄色で表示)

ハイライト表示:

説明
黄色背景ターゲットのkey/value
水色テキストターゲットへのパス上の親キー
緑色 (🔍)自動検出されたパス
黄色 (→)data-api-response-field で指定されたパス

パネル状態:

状態表示
通常マウスオーバーでコンテンツ表示、マウスアウトで非表示
ホールド中緑枠線、マウスアウトしてもコンテンツ維持
Mappingオフパネル全体が非表示

5. Contract未登録警告

  • CONTRACT_DATA に登録されていないcontractを検出
  • 凡例に警告セクション表示(オレンジ色)
  • コンソールに追加方法を出力
  • ホバー時に警告パネル表示

6. フィルタリング機能

  • 凡例のバッジクリックでタイプ別フィルタリング
  • 複数タイプの同時選択可能
  • マッチしない要素は半透明表示
  • [リセット]ボタンでフィルター解除

7. Mappingトグル

  • 右上の「Mapping (N)」ボタンでオン/オフ切り替え
  • オフ時: 全ハイライト解除、凡例・JSONプレビュー非表示