lanhu-design について
Lanhu Design は、Lanhu の UI デザインを読み込み、仕様を確認して素材をプロジェクトに保存するスキルです。`lanhu` CLI を優先し、ない場合は付属の Node.js スクリプトを使えます。
主な機能
- 01Lanhu プロジェクトのデザイン一覧
- 02HTML・CSS 仕様の取得
- 03デザイン画像とスライス素材のダウンロード
- 04CLI と Node.js スクリプトのワークフロー
- 05UI 実装と再現度チェックのガイド
活用シーン
- 01実装前の Lanhu 画面確認
- 02スライス素材のプロジェクト資産への保存
- 03デザイン情報と画像に基づく UI 再現
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ oyjt/ lanhu-design --skill lanhu-designインストール後、Claude Code で/lanhu-designを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSE.txtagents/openai.yamlevals/evals.jsonreferences/design-implementation-rules.mdlanhu-design-tools.mdscripts/design-converter.mjsdownload_design_images.mjsdownload_slices.mjsget_design_slices.mjsget_design_specs.mjsget_designs.mjslanhu-client.mjs詳細
Lanhu Design
概要
UI デザインを読み取り、デザイン仕様を分析し、画像アセット情報を取得して、画像アセットを現在のプロジェクトのリソースディレクトリに配置する際は、lanhu CLI を優先して使用します。CLI がインストールされていない場合は、組み込みスクリプトを引き続き使用します。Skill は単独でも実行できます。
実行方法の選択
作業を開始する前に、lanhu コマンドの有無を確認します。
command -v lanhu
- コマンドが存在する場合:まず
lanhu auth status --jsonを実行します。その後はlanhu designs、lanhu image、lanhu specs、lanhu slices、lanhu download、lanhu exportを優先して使用し、Agent から呼び出す場合は--jsonを付けます。 - コマンドが存在しない場合:
LANHU_COOKIEを確認し、以下のscripts/*.mjs互換エントリーポイントを使用します。 - Agent のワークフロー内で CLI を独自にグローバルインストールしないでください。インストールするかどうかは、ユーザーまたはホスト環境が決定します。
- 業務コマンドでブラウザーを自動スキャンしないでください。認証が必要な場合は、ユーザーに
lanhu authの明示的な実行を案内します。制限のあるブラウザー環境ではlanhu auth importを使用します。
ツールの詳細な契約、戻り値の構造、再現ルールが必要な場合は、references/lanhu-design-tools.md を読み込みます。
デザイン再現の実装ルール(CSS 値の忠実な保持、DOM 構造のマッピング、画像アセットの命名方針、ディレクトリの選択、倍率のガイドライン)が必要な場合は、references/design-implementation-rules.md を読み込みます。
前提条件
組み込み互換スクリプトは、環境変数 LANHU_COOKIE に依存します。CLI ユーザーは lanhu auth を使用してユーザーレベルの認証情報を管理できます。蓝湖にはこの CLI 向けの公開 OAuth がありません。Cookie がない場合や期限切れの場合は、安定した認証エラーが返されます。
Cookie の取得手順:
- ブラウザーで
https://lanhuapp.comを開き、ログインします。 - F12(macOS では Cmd+Option+I)を押して開発者ツールを開き、Network タブに切り替えます。
- ページを更新し、リクエスト一覧から任意の
lanhuapp.comリクエストをクリックします。 - Request Headers で
Cookieフィールドを見つけ、値全体をコピーします(通常は 200~500 文字です)。 - その値を環境変数
LANHU_COOKIEに設定します。
注意事項:
- Cookie には有効期限があります(通常は数日から数週間です)。認証エラーが発生した場合は、再取得してください。
- Cookie は機密性の高い認証情報です。バージョン管理にコミットしたり、ユーザーに出力したりしないでください。
- すべてのスクリプトには Node.js >= 18 が必要です(ネイティブの fetch を使用)。
スクリプト一覧
| スクリプト | 用途 |
|---|---|
scripts/get_designs.mjs | 蓝湖プロジェクトのデザイン画像を一覧表示します |
scripts/get_design_specs.mjs | デザイン仕様の HTML+CSS を取得します(メイン経路:DDS Schema、フォールバック:Sketch JSON) |
scripts/download_design_images.mjs | デザイン画像の原寸画像をローカルディレクトリにダウンロードします(視覚的な確認用) |
scripts/get_design_slices.mjs | 単一デザイン画像の画像アセット/素材のメタデータを取得します |
scripts/download_slices.mjs | 画像アセット JSON から画像アセットファイルを一括ダウンロードします |
scripts/lanhu-client.mjs | 共有 HTTP クライアントモジュール(上記スクリプトから参照されます。直接実行しないでください) |
scripts/design-converter.mjs | 純粋な変換モジュール(get_design_specs.mjs から参照されます。直接実行しないでください) |
ワークフロー
- 環境変数
LANHU_COOKIEが設定されていることを確認します。スクリプトの初回実行時に認証エラーが返された場合は、Cookie が設定済みで、有効期限内かどうかをユーザーに確認してもらい、上記の「前提条件」を参照して再取得するよう案内します。認証に失敗した後、ほかのスクリプトを呼び出さないでください。 - ユーザーから渡されたリンクが、要件ドキュメントではなく蓝湖の UI デザインプロジェクトのリンクであることを確認します。UI デザインプロジェクトのリンクは通常
https://lanhuapp.com/web/#/item/project/stage?tid=xxx&pid=xxxの形式で、pidが必須、tidは任意です。docIdを含む PRD リンクをデザイン画像として扱わないでください。 node scripts/get_designs.mjs <url>を実行してデザイン画像の一覧を取得します。以降の分析と画像アセットの取得では、この一覧にあるindex、name、idを基準にします。- デザイン画像が多い場合は、まずユーザーに範囲を指定してもらいます。ユーザーがすでに「すべて」と明示している場合にのみ
allを使用します。デフォルトで一度に大量のデザイン画像を分析しないでください。 4.5. デザイン仕様の HTML+CSS を取得:node scripts/get_design_specs.mjs <url> --design <name_or_index>を実行して仕様を取得します。戻り値のsourceフィールドによってデータの信頼性が決まるため、必ず最初に確認します:source="dds":DDS Schema から生成された高精度な flex レイアウトの HTML+CSS です。htmlフィールドは、色、フォントサイズ、間隔、グラデーション、角丸、レイアウトなど、すべてのパラメーターの信頼できる情報源です。そのまま再利用し、独自の判断で変更しないでください。原寸画像はレイアウトのずれを確認するために使用します。source="sketch":フォールバック経路です。htmlは絶対配置された要素の一覧にすぎず、レイアウトの信頼できる情報源として扱えません。この場合、レイアウトの主な参考資料には原寸画像を使用し、正確な数値の情報源にはdesign_tokens/sketch_annotationsの元の値を使用します。source="sketch"の場合、HTML 要素にはdata-cssが付与され、戻り値にはdesign_scaleとlayer_css_annotationsも含まれます。これらを使用して、各レイヤーのパス、テキスト、画像アセット、CSS 注釈を照合します。image_url_mappingには、ダウンロードが必要な画像リソースのマッピング一覧が記載されています。dds_errorが返された場合は Sketch にフォールバックしたことを意味するため、原寸画像をより重視してください。source_guidanceフィールドには、現在のsourceに応じたデータの信頼性に関する指針が記載されています。指針に従ってください。--output <dir> --download-imagesを付けると、HTML を保存すると同時に、参照されている画像を<dir>/assets/slices/に自動ダウンロードできます。保存された HTML をブラウザーで直接レンダリングして照合できるようになります。
- 画像アセット、アイコン、画像素材をダウンロードする場合は、
node scripts/get_design_slices.mjs <url> --design <name>を実行して画像アセット JSON を取得します。一度に指定するデザイン画像名または番号は 1 つだけにしてください。 - ダウンロード前に、プラットフォームと倍率の希望を確認します。ユーザーが指定しない場合は Web 2x を推奨しますが、選択したことは明確に伝えてください。よく使うキーは
1x、2x、3x、ios_1x、ios_2x、ios_3x、android_mdpi、android_hdpi、android_xhdpi、android_xxhdpi、android_xxxhdpiです。2xはdownload_urlにフォールバックできますが、それ以外の倍率は画像アセット JSON のscale_urlsで提供されている必要があります。同じファイルを複製して複数倍率のリソースに見せかけないでください。 - 手順 5 の画像アセット JSON の出力をファイルに保存し、
node scripts/download_slices.mjs <json_file> --output <dir> --scale <scale>を実行して一括ダウンロードします。現在のプロジェクトのリソースディレクトリと命名規則を確認し、実行後にファイル数と失敗一覧を照合します。
デザイン再現ルール
完全なルールは references/design-implementation-rules.md を参照してください。以下は必須の主要要件です。
数据来源优先级(按 get_design_specs.mjs 返回的 source 分级)
还原前必须先看 source 字段,不同来源的权威性完全不同:
source="dds"(高保真,HTML 权威):
html字段:颜色、尺寸、间距、字体、圆角、渐变、定位、布局结构的权威来源。直接复制精确的 CSS 属性值,不得修改。design_tokens字段:补充 HTML 中可能被合并的高风险视觉信息(复合渐变、非均匀圆角、阴影、opacity<100)。- 设计图原图:用于核对布局是否错位、元素是否齐全,不覆盖 HTML 数值。
- 切图元数据(
get_design_slices.mjs):补充fills、borders、opacity、rotation、text_style、shadows、border_radius。
source="sketch"(降级,原图为布局主力):
- 设计图原图:布局结构、层级关系、视觉效果的主力参考。
html是扁平的绝对定位元素清单,不能当作布局权威,仅用于核对元素是否齐全。 design_tokens/sketch_annotations字段:颜色、字号、间距、圆角、阴影等精确数值的权威来源。html字段:仅作元素清单和绝对定位参考,布局意图需结合原图重建。- 切图元数据:同上,补充视觉细节。
禁止修改 CSS 值
- 不要转换色值格式(
rgba()↔ hex 保持原样)。 - 不要四舍五入或简化数值(如
0.30000001192092896保持原样)。 - 不要把
linear-gradient简化成纯色。 - 不要调整
font-family顺序或删除 fallback 字体。 - 不要把 margin/padding 取整为"干净"的数字。
- 不要用 SVG、CSS shape、emoji 或占位图替换切图。
- 不要省略任何可见的设计元素。
- 不要在最终代码中保留蓝湖远程 CDN URL。
DOM 结构映射
HTML 的 class 名称表达布局意图,需转译为目标框架组件,同时保持 CSS 值不变:
flex-row→ 水平排列(React:display:flex,Flutter:Row(),SwiftUI:HStack)flex-col→ 垂直排列(React:flex-direction:column,Flutter:Column(),SwiftUI:VStack)justify-between→ 两端对齐(space-between/MainAxisAlignment.spaceBetween)relative/absolute→ 定位层叠(Flutter:Stack+Positioned,SwiftUI:ZStack)
详细映射表见 references/design-implementation-rules.md。
框架检测与代码生成
实现 UI 前先检测项目类型(读取 package.json、pubspec.yaml、build.gradle、Podfile 等),生成匹配框架的代码(React JSX、Vue SFC、Flutter Widget、SwiftUI View、Android Compose 等)。CSS 属性需按平台做单位映射(px→dp/pt),但不能改变数值精度。未检测到框架时默认生成纯 HTML。各框架的 CSS 属性映射表和资源引用方式见 references/design-implementation-rules.md。
若项目根目录存在 DESIGN.md(或同等职责的设计系统文档),解析规格与落盘代码前必须先读取并遵守其令牌、排版、组件与命名约定;图层级具体数值仍以规格数据为准,冲突时以规格数值保证当前屏还原度并向用户说明取舍。详见 references/design-implementation-rules.md。
生成后保真审计
代码生成后必须逐属性对照设计规格 HTML+CSS 执行保真检查,覆盖 10 项:尺寸约束、裁剪、色值、渐变、绝对定位、字体、间距、图片资源、元素完整性、无远程 URL。对每个差异标注是平台适配还是错误,错误必须修正后交付。完整清单见 references/design-implementation-rules.md。
切图下载
从 get_design_slices.mjs 保存返回结果为 JSON 后,可运行:
node scripts/download_slices.mjs slices.json --output ./src/assets/images/slices/home --scale 2x
常用参数:
--scale 2x:下载 Web 2x,文件名后缀默认@2x。--scale ios-all:下载 iOS1x/@2x/@3x。--scale android-all:下载 Android 全套并放入mipmap-*子目录。--name-map names.json:提供{slice_id_or_name_or_layer_path: "semantic_name"},覆盖自动文件名。--referer https://lanhuapp.com/:需要带 Referer 时使用。
脚本只负责稳定下载和基础去重。语义化命名应优先结合当前项目已有命名规范处理。
全套倍率依赖 scale_urls 中的真实多倍率地址;缺失时脚本会报错而不是复制 download_url。
Photoshop 稿(设计 JSON 根节点 type=ps)的切图登记在 assets[],脚本会自动按图层 id 提取 png_xxxhd/svg 地址并推导多倍率(PS 稿图层像素尺寸为 @2x 基准)。
切图下载前置步骤
下载切图前,按以下顺序准备:
- 识别项目类型:检查
package.json、pubspec.yaml、*.xcodeproj、build.gradle等标志文件,判断 React/Vue/Flutter/iOS/Android。 - 确定输出目录:用户指定 > 项目已有资源目录 > 通用默认路径。详细规则见
references/design-implementation-rules.md。 - 确认倍率:用户不指定时推荐 Web 2x,但必须明确告知选择。
- 准备命名映射:根据切图的
layer_path、parent_name生成语义化英文文件名(icon_、bg_、btn_等前缀),沿用项目已有命名风格。命名策略详见references/design-implementation-rules.md。
完成检查
交付前确认:
- 已先运行
get_designs.mjs并基于列表匹配目标设计图。 - 还原 UI 前已下载并用 Read 工具实际查看过设计图原图。
- UI 实现已按
source分级核对:dds以 HTML+CSS 为权威,sketch以原图布局 +design_tokens数值为主,没有用设计截图主观改 DDS 的精确值。 - 已执行生成后保真审计(10 项清单),所有错误已修正,仅保留合理的平台适配差异。
- 生成代码匹配检测到的项目框架,遵循项目已有约定(命名、目录、样式方案)。
- 所有远程图片/切图已下载为本地资源,代码中没有蓝湖 CDN URL。
- 图片资源使用目标框架约定的引用方式(如 React
import、FlutterAssetImage)。 - 切图下载数量、失败数量、输出目录已向用户说明。
- 中间产物已按
references/design-implementation-rules.md的「临时文件清理规则」处理:先列出候选路径并检查引用,取得用户明确确认后再删除;仅保留被代码引用的切图文件。用户未确认时保留文件并报告路径。 - 工作流中未出现认证错误。如果出现过,已引导用户刷新 Cookie 并重试。
交付输出
最终回复简要列出:处理的设计图和 source、新增或修改的代码/资源路径、切图下载成功与失败数量、执行的验证及结果、仍需用户处理的认证或平台适配事项。不要输出 Cookie、带认证参数的完整请求头或不必要的远程资源 URL。