·10 分鐘閱讀

DESIGN.md 進 CI:用 lint 驗證設計規範

DESIGN.md 的工程化指南:YAML 值與 Markdown 意圖的雙層結構、官方 lint/diff/export/spec 四命令、WCAG AA 驗證邊界、exit code 陷阱與完整 CI 接入範例。

S
Stitch Prompt Team
Content Team
StitchAI教學GitHub

過去一年,「讓 Agent 寫出風格一致的 UI」成為一個真實存在的工程問題。答案正在收斂到一個樸素的方案:用純文字檔案把設計規範寫下來,讓 Agent 在動手前先讀它。

DESIGN.md 是這個方案裡最受關注的一個。它來自 Google Labs 官方開源儲存庫(Apache-2.0 授權,目前處於 alpha 階段),並且配套一個可以獨立執行的官方 CLI:支援 lint、diff、export、spec 四個命令,最新的 v0.4.0 已在 10 月上旬被社群反覆實測。

更重要的是它的定位變化:DESIGN.md 不再只是「給 Agent 看的說明文件」,而是可以 lint、可以 diff、可以進 CI 攔截的工程製品。設計 token 的治理,第一次有了官方可執行的工具鏈。

注意:DESIGN.md 格式目前仍是 alpha,規範未來會變化;接入 CI 時請鎖定 CLI 版本。本文以 v0.4.0 的行為為準。

一、從「給 Agent 看的文件」到「可驗證的工程製品」

Agent 時代正在形成一套約定:不同職責交給不同的純文字規範檔案。

檔案管什麼核心作用
CLAUDE.md行為告訴 Agent 如何完成任務、遵循哪些流程
DESIGN.md視覺定義顏色、字型、間距、元件規則等設計意圖
AGENTS.md協作定義多個 Agent 或工具之間的協作約定

社群裡流傳的一句總結很準確:CLAUDE.md 管行為,DESIGN.md 管視覺,AGENTS.md 管協作。

DESIGN.md 真正的價值在於可驗證:你的顏色對比度、token 引用、章節完整性,都可以用一條命令檢查,並且把檢查接入 CI,讓不合規的設計規範無法合併進主分支。

二、DESIGN.md 格式速覽:YAML 值 + Markdown 意圖

DESIGN.md 採用雙層結構:

  • YAML frontmatter:放規範值(token),例如色值、字型名、字級比例。
  • Markdown 內文:放設計意圖,解釋這些值為什麼這樣定義、該如何使用。

這樣分工的意義是:機器讀 YAML 做驗證和匯出,人和 Agent 讀 Markdown 理解脈絡。

固定章節順序

官方規範要求章節按固定順序組織,lint 工具依賴這個順序做完整性檢查:

  1. Overview
  2. Colors
  3. Typography
  4. Layout
  5. Elevation & Depth
  6. Shapes
  7. Components
  8. Do's and Don'ts

寫 Prompt 型設計規範、或讓 Agent 生成 DESIGN.md 草稿時,按照這個順序組織,才能順利通過驗證。

結構示意

下面是一個最小結構示意(欄位以實際規範為準):

---
colors:
  primary: "#1a1a1a"
  background: "#ffffff"
  accent: "#2563eb"
typography:
  base: "Inter"
  scale: "1.25"
---

## Overview

這是一個文件型產品,強調可讀性與克制的強調色……

## Colors

primary 用於內文與主按鈕,accent 只用於連結與焦點態……

三、官方 CLI 四命令:lint / diff / export / spec

四個命令覆蓋了設計規範的完整生命週期:

命令作用
lint按規則驗證 DESIGN.md,包含 WCAG AA 對比度檢查
diff比較兩份規範或兩個版本之間的差異
export匯出為 Tailwind config 或 W3C DTCG 設計 token
spec輸出規範化說明,便於團隊對齊格式

本機跑一次驗證:

npx @google/design.md lint DESIGN.md

lint 的規則與 WCAG AA 邊界

lint 內建 8 條驗證規則,其中最有存在感的是對比度檢查:按 WCAG AA 的 4.5:1 標準核對文字與背景的組合。

需要明確它的邊界:lint 不檢查焦點態、不檢查語意結構、也不檢查動效。它能擋住的是「硬傷」,不能替代設計評審。

exit code 陷阱:為什麼對比度問題不會讓 CI 失敗

這是最容易踩的坑:lint 發現對比度問題時只告警、不報錯,行程仍然以 exit 0 結束。也就是說,直接把 lint 掛進 CI,對比度不合格的規範依然會通過。

要在 CI 裡嚴格攔截,需要讀取 lint 的 JSON 輸出,自行判斷並回傳非零退出碼。下面的檢查邏輯是示意(以實際輸出格式為準):

# 示意:把 lint 結果儲存下來,出現對比度告警時手動讓 CI 失敗
npx @google/design.md lint DESIGN.md > lint-result.json
if grep -qi "contrast" lint-result.json; then
  echo "對比度驗證未通過"
  exit 1
fi

四、實戰:把 DESIGN.md 驗證接入 CI 管線

一個可直接參考的 GitHub Actions 設定。注意兩點:使用官方 workaround 中的 designmd 命令名,並鎖定版本:

name: design-lint

on: [pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Lint DESIGN.md
        run: npx -p @google/design.md@0.4.0 designmd lint DESIGN.md

嚴格模式:解析 JSON 輸出

如果團隊要求「對比度不達標必須阻塞合併」,在上面基礎上增加一步:儲存 JSON 輸出、檢查是否存在對比度告警、命中則以非零退出碼結束。思路與上一節的示意一致,關鍵是把「告警」翻譯成 CI 語意裡的「失敗」。

五、匯出到 Tailwind config 與 DTCG:設計 token 的落地路徑

lint 保證規範「寫得對」,export 解決規範「用得起來」:

  • 匯出為 Tailwind config:讓前端工程直接取用設計 token,配色和字型不再散落在元件裡。
  • 匯出為 W3C DTCG 格式:與更廣泛的設計工具鏈互通。

值得一提的是:DESIGN.md 的 CLI 是獨立執行的,不需要 Stitch 帳號。即使團隊不打算使用 Stitch 生成介面,也可以單獨把它當作設計規範的驗證與匯出工具。

六、故障排除:三類常見問題

現象原因處理
ENOVERSIONS依賴或版本解析失敗鎖定 CLI 版本,清理快取後重裝
Windows 下無輸出design.md 命令與檔案關聯衝突使用 workaround 命令
broken-ref規範內引用了不存在的 token 或章節按報錯行號修正引用

Windows / PowerShell 使用者遇到命令衝突時,改用:

npx -p @google/design.md designmd lint DESIGN.md

七、常見問題(FAQ)

Q1:不用 Stitch 帳號,能單獨使用 DESIGN.md 和這個 CLI 嗎?

可以。格式規範與 CLI 都是獨立專案,本機執行、進 CI 都不依賴 Stitch 雲端服務。

Q2:為什麼對比度問題不會讓 CI 失敗?

lint 對對比度問題只輸出告警並以 exit 0 結束;嚴格攔截需要解析 JSON 輸出並自行回傳非零退出碼。

Q3:團隊剛開始用,最小可行的做法是什麼?

兩步:在 AGENTS.md 裡加一行「任何 UI 工作前先讀 DESIGN.md」,然後給儲存庫加一條 lint 的 CI 檢查。規範內容可以邊用邊補。

八、總結

DESIGN.md 把「設計規範」從口頭約定變成了工程製品:可寫、可驗證、可匯出、可攔截。對於已經有 CI 習慣的團隊,它幾乎是零成本導入——一條命令檢查,一條流水線守住底線。

繼續閱讀: