[デザイン] 1.(Figma起点)SSOT(tokens/components/context/assets)を生成
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
user-invocable: true
description: "[デザイン] 1.(Figma起点)SSOT(tokens/components/context/assets)を生成"
---
# [デザイン] 1.(Figma起点)SSOT(tokens/components/context/assets)を生成
## コマンド: /design-ssot $FIGMA_REFS
Figma MCPから設計情報を抽出し、AI/人間が参照するSSOTを作る。**実装はしない**。
## いつ使う?(位置づけ)
- Figma(Dev Mode)を根拠に、後続でブレない **SSOT(tokens/components/context/assets)** を確立したいとき
- 会話起点なら `/design-mock`、Figma起点ならこの `/design-ssot` から始める
## 次に何をする?
- 実装に進む → `/design-ui` → `/design-components` → `/design-assemble`
- ドキュメント/共有用の静的HTMLが欲しい → `/design-html`(任意)
## 共通前提(参照)
- 口調・出力規約・差分出力の方針は `CLAUDE.md` に従う。
- `doc/input/rdd.md` を読み、該当する `.claude/skills/*` を適用して判断軸を揃える(例: `ui-designer` / `usability-psychologist`)。
- 詳細運用(サンプル運用/依存評価補助/ADR-lite)は `doc/guide/ai_guidelines.md` を参照。
## 見た目の基準(ビューポート)について
- まず `doc/input/rdd.md` の「ターゲット表示環境(事実)」を参照し、**そのビューポートを基準**にSSOTを作る
- 未記入の場合は、以下を **推奨デフォルト**として仮置きし、出力やレビューの前提に明記する:
- desktop: 1440x900
- mobile: 390x844
- tablet: 834x1194
## 事前チェック(必須):Figma MCPが「使える」状態か
`/design-ssot` は **Figma MCPが利用可能であることが前提**。最初に必ず以下を確認してから進める。
### 1) Claude Code側:MCP登録の確認
- `claude mcp list` を確認し、`figma` が登録されていること
### 2) 接続先:Figma MCP(Dev Mode)の到達確認
- Figma MCPのエンドポイント(通常 `http://localhost:3845/mcp`)に到達できること
- 到達できない場合は、**MCPが未起動/未設定/権限不足**の可能性が高い(推測でSSOT生成を続けない)
### 3) うまくいかないとき(ユーザーにお願いする手順)
AI側で「MCPが無い/設定されていない」など見当違いな推測をしないために、まず以下をユーザーに依頼する:
0. **`/mcp` でFigmaの再接続を確認する(推奨)**
- `/mcp` を実行
- 一覧から **`figma` ツール**を選ぶ
- **Reconnect**(再接続)を実行
- 再度 `figma` ツールを選んだときに **"View tools" が表示されている状態**になっていることを確認する
- 上記が満たせない場合は、以降の手順へ進まず停止(接続/権限/起動状態の問題の可能性が高い)
1. **Figma Desktop アプリで Dev Mode / MCP サーバーを有効化**する(Figma公式手順に従う)
2. それでもダメなら、ユーザーに以下を確認してもらう:
- 3845番ポートが開いているか(Figma側のMCPが起動しているか)
- URLが環境と合っているか(例: `http://localhost:3845/mcp`)
- 必要なら MCP登録をやり直す
### 4) Figma MCPの登録
- **前提**
- Figma Desktop 側で Dev Mode / MCP サーバーが有効で、MCPが起動していること
- Claude Code(CLI)を実行する環境から、そのMCPのHTTPエンドポイントに到達できること
- **手順(最小)**
1. `claude mcp list` を確認し、`figma` が無ければ登録する
- 例: `claude mcp add --transport http figma "http://localhost:3845/mcp"`
2. 到達できない場合は、ユーザーに「Figma側のMCP起動・権限・ポート・URL」を確認してもらう(推測で先に進めない)
### 入力
- $FIGMA_REFS: Figma参照(MCPが認識できる指定)
- **単一**: これまで通り1つのFigma URL/参照を渡す
- **複数(推奨)**: 複数のフレーム/ページURLを「ページキー付き」で羅列する(複数ページでも再現性を落とさないため)
#### 複数指定の書式(固定)
- 1行に1件: `{PageKey}={FIGMA_REF}`
- 例: `HomePage=https://...`
- 例: `PricingPage=https://...`
- **禁止**: URLだけの羅列(ページキーが安定しないため)。複数指定時は必ず `PageKey=` を付ける
#### PageKeyのルール(固定)
- `PascalCase` 推奨(例: `HomePage`, `PricingPage`, `LoginPage`)
- 既存の `doc/input/design/design_context.json` に同名 `pages[].key` がある場合は「追記/更新」扱い
- 同名キーで別画面を指す場合は **衝突**として停止(推測でマージしない)
#### 例
- 単一:
- `/design-ssot https://...`
- 複数:
- `/design-ssot HomePage=https://... PricingPage=https://... LoginPage=https://...`
### 出力(差分のみ)
- doc/input/design/design_context.json # 画面/レイアウト/constraints/resizing
- doc/input/design/design-tokens.json # 色/タイポ/spacing/半径/影/枠線/不透明度/breakpoints(単位明記)
- doc/input/design/components.json # 主要コンポーネント + variants(例: size/tone/state)
- doc/input/design/copy.json # 文字の文言(copyKey→文言)。一字一句固定(言い換え禁止)
- (スタック既定の置き場)/design-assets/ # 画像アセット(Figmaからexportして保存)
- doc/input/design/assets/assets.json # 画像アセットのmanifest(どの要素がどのファイルに対応するか)
### ルール
- JSONは**単位明記**(px/%/unitless)
- tokens は「物理値」と「semantic(意味)」を混ぜない(例: `color.gray.900` と `color.text.primary` を分け、semanticは物理へ参照する)
- variants は **props/属性に落とせる粒度**(例: { size:["sm","md","lg"] })
- **文字の文言は必ずSSOT化**する(`doc/input/design/copy.json`)
- `design_context.json` の text ノードは **必ず `copyKey` で `copy.json` を参照**する(文言の直書き禁止)
- `copy.json` に無い `copyKey` を参照してはいけない(不足時は生成を止め、ユーザーに `FIGMA_REF` 再提示 or 文言提供を依頼する)
- **CSSで指定できる見た目は可能な限りSSOT化する**(後続の再現性を上げる)
- 例: background(塗り/グラデ)/ border(stroke: 色・太さ・style・位置)/ radius / shadow / opacity / blur / blend mode
- blur は **filter(要素自体)** と **backdrop-filter(背景)** を区別してSSOTに残す
- 取りこぼしやすい: 「枠線だけある」「背景だけある」「hoverだけ変わる」など
- `components.json` には、可能な限り `styles`(background/border/radius/shadow/textColor など)を tokens 参照で残す(値の直書き禁止)
- **RDD遵守**(doc/input/rdd.md のスタック/制約に反しない)
- 技術スタックの既定は `doc/input/rdd.md`。このコマンドの出力(SSOT JSON)は可能な限りスタック非依存に保ち、後続(`/design-ui` / `/design-assemble`)が `doc/input/rdd.md` を参照して生成する。
- SSOTの最低限スキーマは `doc/input/design/ssot_schema.md` を参照。
- `doc/input/design/components.json` の variants 命名規約は `doc/input/design/ssot_schema.md` に従い、プロジェクト横断で揃える。
- 画像(アイコン/ロゴ/イラスト/写真など)で **CSSだけでは再現できないもの**は、可能な限りFigmaからexportして「スタック既定の置き場」に保存し、`assets.json` に対応関係を残す
- 動画/アニメ(MP4/GIF/Lottie等)も同様に **assetsとしてmanifest化**する(取得できなければ `status: failed` + `error` を必ず記録し、ユーザーに手順を依頼する)
- **複数入力のマージ規約(固定)**
- `design_context.json.pages` は **入力した PageKey の配列**として統合する
- `copy.json` の `copyKey` は **必ずページキーで名前空間を切る**(例: `homePage.hero.title`)
- `assets.json` の `assetKey` も **ページ横断で一意**にする
- 同じ `assetKey` が複数入力に現れた場合は、同一ファイル(同一内容)であることが確認できる場合のみOK
- 内容が異なる場合は **衝突**として停止し、ユーザーにキー命名の修正を依頼する
- **tokensの整合(固定)**
- 複数入力で tokens が矛盾する場合(例: `semantic.color.text.primary` の参照先がページで違う)は **衝突**として停止
- 推測で片方に寄せたり、別名tokenを勝手に増やさない(必要ならユーザーと命名/設計を合意してから)
- ここで停止
### ゲート
- tokens/variantsに未定義値なし
- design_context.json に constraints/resizing が含まれる
- components.json のvariantsが「実装の分岐」に落とせる粒度になっている
- `copy.json` に未定義文言なし(参照される `copyKey` の不足0件)
- border/background/gradient/blur/blend/strokeAlign が存在する要素について、tokens と components の `styles` 参照に落ちている(取りこぼし0)
- 画像アセットが必要な箇所(ロゴ/アイコン/イラスト/写真)が「スタック既定の置き場」 と `doc/input/design/assets/assets.json` に落ちている(取りこぼし0)
- `assets.json` に `status: "failed"` が1件でもある場合は、**必ずユーザーに失敗理由と次アクション**(Figma Export設定/権限/再提示/手元提供)を明示して停止する
### 再現性(会話コンテキストがクリアでも再現するためのルール)
- 後続のdesign系コマンドは、`doc/input/design/*` のSSOT(tokens/components/context/copy/assets)だけで再現できる状態を目標にする
- もしSSOTが不足/破損している場合は、**推測で補わない**。次のどちらかをユーザーに依頼する:
- `FIGMA_REF`(Figma URL等)を再提示して、`/design-ssot` を再実行する
- 不足しているSSOT(例: `copy.json` / `assets.json`)の差分をユーザーに提供してもらう
### 画像アセットの扱い(重要)
#### アセットの保存先(スタック既定)
`doc/input/rdd.md` の技術スタックに合わせて、アセット実体は以下へ保存する(SSOTのmanifestは `doc/` に残す):
- Next.js / React / Astro: `public/design-assets/`
- SvelteKit: `static/design-assets/`
- (判定できない場合): まず `public/` があれば `public/design-assets/`、なければ `static/design-assets/`
- **優先形式**
- アイコン/ロゴ: SVG(可能なら単色・パス化)
- 写真/ラスタ: WebP または PNG(透過が必要ならPNG)
- 複雑なイラスト: SVG優先、無理ならPNG
- **命名**
- `public/design-assets/{kind}/{name}@{scale}.{ext}` または `static/design-assets/{kind}/{name}@{scale}.{ext}` を基本
- 例: `icons/search@1x.svg`, `images/hero@2x.webp`
- `name` は英小文字 + `-`(kebab-case)で安定させる
### ダウンロードできない場合(ユーザーにお願いする手順)
Figma側の状態によっては、MCPが画像を取り出せないことがあります。次をユーザーに確認・依頼する:
1. **対象レイヤー/フレームを export 可能にする**
- Figma右パネルの **Export** を追加し、形式(SVG/PNG等)と倍率(1x/2x等)を設定する
2. **権限の確認**
- そのFigmaファイルにアクセス権があるか(閲覧のみでexportが制限されていないか)
3. **画像の代替入力**
- どうしてもMCPで取得できない場合は、ユーザーに「SVG/PNG/WebPを手元からアップロード」または「アセットの配布方法(zip等)を提示」してもらい、`doc/input/design/assets/` に配置してもらう
No comments yet. Be the first to comment!