The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Melta UI listing page.
AI 向けデザインガイドラインを、違反を止める実行可能な契約へ。
🇬🇧 English: README.en.md · Showcase: https://melta.tsubotax.com (ドキュメント・契約の正本はこのリポジトリ)
AI にガイドラインを読ませることはできる。守るかどうかは AI 任せになる。melta UI は、その「任せ」を機械に置き換える。生成の前(MCP で契約を参照させる)・直後(lint / hook が違反を突き返す)・マージ前(CI が止める)・その後(drift 検査がドキュメントと実装の腐りを検知し続ける)の 4 点で機械が関与する。読ませるだけでなく、守らせる。
境界: melta UI は完成済みの CSS コンポーネント集ではない。配るのは値(tokens)・規則(rules)・仕様(contracts)・検証器(lint / MCP)で、import して貼れば動く UI ライブラリではない。web の実装は HTML + Tailwind クラスの参照実装として同梱している。
向いている
向いていない
automationStatus で分類・可視化する(rules.json / 内訳は制約と正直な範囲)npm run test:reset-vrt)io.github.tsubotax/melta-ui)npm run design:compat が publish 前に検査)| パッケージ | 役割 | 使い方 |
|---|---|---|
melta-contracts | 契約データ(tokens / rules / component contracts / recipes の JSON)。ビルド不要・フレームワーク非依存 | npm install melta-contracts |
melta-ds-mcp | MCP サーバー + lint エンジン(このリポジトリ)。check_html は CI / hook と同一ロジック | npx -y melta-ds-mcp / melta-ds-mcp/lint-core |
melta-app | React Native 実装。消費者プロジェクト向け eslint plugin を同梱 | npm install melta-app |
melta-ds-mcp自体の bare import(import "melta-ds-mcp")は非サポート。entry は import しただけで stdio サーバーが起動する CLI なので、npx melta-ds-mcpか subpath 経由で使う。entry 規約・deep import 互換・パッケージ分割の予定は docs/distribution.md。
自分のデザインシステムで検査したい場合(BYO-DS):
melta-ds-mcpは起動時に読み込むアセット root を自分の DS bundle へ切り替えられる(melta のルールとは混在しない)。4 ファイルの最小構成から始める手順と限界は docs/distribution.md の BYO-DS 節。
| 項目 | 値 |
|---|---|
| Node | 22 以上(CI は 22 で検証) |
| MCP クライアント | stdio MCP に対応したもの(Claude Code で検証。Cursor は同梱の .cursor/mcp.json をプロジェクト設定として読む(有効化は Cursor 側の操作に従う)。Codex は同じ stdio コマンドで登録) |
| スタイリング | Tailwind CSS の class ベース前提。静的 lint は class 属性 / HTML 属性 / DOM 構造を読む |
| 生成物の表示 | プロトタイプは Tailwind CDN + DESIGN.md の tailwind.config、プロダクションは foundations/theme.md の v4 @theme |
| JSX / Vue | class 属性と HTML 属性の lint は効く。composition lint(ネスト構造・a11y DOM)は HTML のみ。JSX の変数経由 class・spread は静的には追えない |
| ライセンス | MIT |
clone せずに、契約参照と自己検証だけを既存プロジェクトへ足す経路。
成功判定 — claude mcp list にこの行が出る:
接続時に MCP instructions が渡るので、「melta は完成 CSS ライブラリではない」「先に melta://design-constitution を読む」「生成後は check_html で自己検証する」を利用側が毎回プロンプトに書く必要はない。あとは UI を指示するだけ:
ユーザー一覧のテーブルを作って
成功判定 — AI が生成 HTML を check_html に通し、この形の応答を得る(違反があれば修正して再検証する):
生成された HTML をブラウザで表示するには Tailwind と melta のトークン設定が要る。プロトタイプなら CDN でよい:
hook / CI / lint CLI まで含めた強制層が要る場合。npm install した消費者にはこの 3 層は届かない(制約と正直な範囲)。
npm install で有効になるもの: .mcp.json(Claude Code へ MCP 自動接続)/ .cursor/mcp.json(Cursor 向けに同じ MCP サーバーの設定を同梱。有効化は Cursor 側の操作に従う。作業指示は AGENTS.md を読ませ、.cursor/rules/melta-ui.mdc は所在ポインタだけを置く)/ .claude/settings.json の PostToolUse hook / lint CLI。
成功判定 1 — 違反ファイルに lint CLI をかけると exit 1 で落ちる:
成功判定 2 — Claude Code が .html / .tsx / .jsx / .vue を Write / Edit した直後、hook がこの JSON を返して修正ループに乗せる(warn のみなら additionalContext で助言注入):
MCP が公開するツール:
| ツール | 説明 | 入力例 |
|---|---|---|
get_token | トークン検索 | { "path": "color.primary.600" } |
get_component | コンポーネント仕様取得(variants / sizes / stateSpecs / anatomy / a11y) | { "id": "button" } |
check_rule | クラス文字列の禁止パターン検査(34パターン自動検出)。文脈依存は conditional 付き | { "classes": "text-black shadow-2xl" } |
check_html | 生成 HTML / JSX 全体を CI / hook と同一ロジックで lint | { "source": "<div class=...>" } |
get_rules | 107 禁止ルール参照(manual 含む全件、filter 対応) | { "category": "accessibility" } |
search | 全文検索(最大 20 件 + truncated 通知) | { "query": "card" } |
Resource は melta://design-constitution(DESIGN.md 全文)/ melta://tokens / melta://components / melta://components/{id} / melta://rules / melta://rules/auto-detectable。
web の実装対象は 28 コンポーネント + 13 ファウンデーション + 5 パターン。設計原則は Content First / WCAG 2.1 AA / Semantic Color / 3-Color Rule / 4px Grid / Minimal Elevation / No AI-ish Decoration の 7 つ(DESIGN.md)。
同じ契約パッケージ(melta-contracts)を web(このリポジトリ / HTML + Tailwind)と APP(melta-app / React Native)の両実装が購読する。トークンを各実装にコピーして持つ経路は存在しない(二重化の物理防止)。
契約は規範と具象の 2 層。規範(components/*.contract.json)は variant の語彙・states・tokenRefs・a11y で、全プラットフォーム共通。分岐が正当な箇所(hover→pressed、elevation の表現差、タッチターゲット 44pt 等)は platformSemantics で意味論だけを宣言する。具象(recipes/)は web が契約の Tailwind からの導出ミラー(鮮度を CI が担保)、app が RN の styleRefs(色は 100% token 参照)を手書きする authoring source。
守らせる仕組みも双方向:
npm run design:compat): npm 公開版と HEAD の golden diff。token 削除・variant 削除・rule の意味変更を breaking 分類し、semver bump を機械強制するmelta-app は消費者プロジェクト向けの eslint plugin も npm で配っており、使う側のコードで生値の直書きが止まる。RN カタログの live showcase は https://app.melta.tsubotax.com。
49 / 107 の意味。「107 禁止ルールを強制する」とは言えない。静的に自動検出できるのは 49 件で、残りは検証経路を automationStatus で分類して可視化している(宣言だけのルールをゼロにするための棚卸し)。
| 経路 | 件数 | 内容 |
|---|---|---|
| 静的自動検証 | 49 / 107 | class マッチ 34(MCP check_rule 同経路)+ html-attr 7 + composition 8(ネスト + a11y DOM) |
| interaction test | 3 | tests/modal.spec.ts が focus trap / Escape / focus 復帰を実機検証 |
| 静的検出 不能 | 3(うち error 3) | impossible-static(active/selected/current の特定が意味依存) |
| LLM 審査候補 | 43(うち error 31) | llm-judge-candidate(shadow judge 導入までは自動検証なし) |
| human-only | 9(うち error 9) | 人間レビューでのみ守る。get_rules で AI に提示 |
| 未分類 | 0(うち error 0) | 棚卸し未了(automationStatus 未宣言) |
この表は npm run design:coverage が contracts から生成し、鮮度を npm run design:drift が守る。数字は改善のたびに動く。各ルールの状態の SSOT は rules.json の automationStatus。
その他の制約:
npm install した消費者には届かない。npm 経路の強制層は melta-ds-mcp/lint-core(class / html-attr lint のみ。composition lint は含まない)と MCP の check_html(composition 込み)の 2 つで、これを各プロジェクトのフック / CI に自前で組み込むmanual は自動検査しない宣言)。新しい検査ロジックはエンジン側の変更が要るcheck_html.passed は完成承認ではない。lint-clean draft であってブランド適合の判定ではなく、最終判断は人間に渡すMCP サーバーも lint エンジンもローカルプロセスで完結する。生成コード・プロンプト・検査結果を外部へ送信する経路はなく、telemetry も持たない。ネットワークに出るのは npx によるパッケージ取得と、npm run design:compat / npm run check:pack が npm registry の公開バージョンを照会するときだけ。
melta-contracts は 0.x で、破壊的変更は minor bump で入りうる。ただし破壊的変更の分類は人手ではなく npm run design:compat の機械判定で、semver bump を強制する| ドキュメント | 内容 |
|---|---|
| DESIGN.md | デザイン憲法 + Quick Reference。これだけで基本 UI を生成できる |
| AGENTS.md | AI エージェント共通の作業ガイド(読み込みモード・タスク別ガイド・npm scripts) |
| design/authority.md | SSOT 宣言と値競合時の優先順位 |
| docs/melta-loop-playbook.md | loop / pipeline 自動化の統治原則(自動化 3 Level 分類・SSOT write-protect・Human Gate の Hard / Soft 2 層化・監査ログ)。現状 W2 drift repair が稼働 |
| docs/benchmarks.md | ベンチマークのプロトコル(5 条件 × N トライアルで DS 準拠スコアの lift を測る)と既知の限界 |
| docs/distribution.md | npm entry 規約・deep import 互換・BYO-DS(自分の DS を持ち込む)・パッケージ分割の予定 |
| docs/ai-ready-ds-maturity-model.md | AI-Ready 成熟度モデル(Lv0 None → Lv4 Verified)。任意のプロジェクトに当てられる |
| melta-screendiff | UI 変更 PR の Before/After を実キャプチャで比較する Claude Code plugin(別リポジトリ)。このリポジトリの .claude/screendiff.json がその設定ファイルで、常設のデモ PR も置いてある。lint が検知できない「見た目の意図」を人間がレビューする側を担う |
| design/compat/google-designmd.md | Google Labs design.md spec との対応表。melta の DESIGN.md は spec 互換の front matter を含み、npx @google/design.md lint が errors: 0 で通る。守備範囲の違いは「spec は DESIGN.md ファイル自体の検証まで、melta は生成コードの検証・CI・hook まで」 |
MIT License — LICENSE。同梱アイコンのライセンスは THIRD_PARTY_LICENSES.md を参照。
Acknowledgments: Charcoal Icons(pixiv Inc., Apache License 2.0)/ Lucide Icons(ISC License)/ Tailwind CSS