设计协议
把视觉品牌/设计系统结构化喂给编码 Agent 的 DESIGN.md 规范格式
用于向编码代理描述视觉标识的格式规范。DESIGN.md 让代理能够持久、结构化地理解设计系统。
格式
DESIGN.md 文件将机器可读的设计令牌(YAML 前言)与人类可读的设计原理(Markdown 散文)结合在一起。令牌为代理提供精确的值。散文则告诉代理这些值存在的原因以及如何应用它们。
---
name: Heritage
colors:
primary: "#1A1C1E"
secondary: "#6C7278"
tertiary: "#B8422E"
neutral: "#F7F5F2"
typography:
h1:
fontFamily: Public Sans
fontSize: 3rem
body-md:
fontFamily: Public Sans
fontSize: 1rem
label-caps:
fontFamily: Space Grotesk
fontSize: 0.75rem
rounded:
sm: 4px
md: 8px
spacing:
sm: 8px
md: 16px
---
## 概述
建筑极简主义与新闻庄重感交融。UI 呈现出高级哑光质感——恰如高端大报或当代画廊。
## 色彩
色板以高对比度中性色和单一强调色为基础。
- **Primary (#1A1C1E):** 用于标题和核心文本的深墨色。
- **Secondary (#6C7278):** 用于边框、说明文字、元数据的精致石板色。
- **Tertiary (#B8422E):** “波士顿黏土”——交互的唯一驱动色。
- **Neutral (#F7F5F2):** 温暖的石灰岩底色,比纯白更柔和。
读取该文件的代理将生成一个 UI,其中包含用 Public Sans 呈现的深墨色标题、温暖的石灰岩背景以及波士顿黏土色的行动号召按钮。
快速入门
验证 DESIGN.md 是否符合规范,捕获断裂的令牌引用,检查 WCAG 对比度,并展现结构化发现——全部以代理可操作的 JSON 形式输出。
npx @google/design.md lint DESIGN.md
{
"findings": [
{
"severity": "warning",
"path": "components.button-primary",
"message": "textColor (#ffffff) on backgroundColor (#1A1C1E) has contrast ratio 15.42:1 — passes WCAG AA."
}
],
"summary": { "errors": 0, "warnings": 1, "info": 1 }
}
比较两个版本的设计系统,以检测令牌级别和散文层面的回归:
npx @google/design.md diff DESIGN.md DESIGN-v2.md
{
"tokens": {
"colors": { "added": ["accent"], "removed": [], "modified": ["tertiary"] },
"typography": { "added": [], "removed": [], "modified": [] }
},
"regression": false
}
规范
完整的 DESIGN.md 规范位于 docs/spec.md。以下是一个简化的参考。
文件结构
DESIGN.md 文件包含两个层次:
- YAML 前言 — 机器可读的设计令牌,由文件顶部的
---分隔符界定。 - Markdown 正文 — 按
##章节组织的人类可读设计原理。
令牌是规范性值。散文则提供如何应用它们的上下文。
令牌模式
version: <string> # 可选,当前版本: "alpha"
name: <string>
description: <string> # 可选
colors:
<token-name>: <Color>
typography:
<token-name>: <Typography>
rounded:
<scale-level>: <Dimension>
spacing:
<scale-level>: <Dimension | number>
components:
<component-name>:
<token-name>: <string | token reference>
令牌类型
| 类型 | 格式 | 示例 |
|---|---|---|
| 颜色 | 任意 CSS 颜色(hex、rgb()、oklch()、命名颜色等) | "#1A1C1E"、"oklch(62% 0.18 250)" |
| 尺寸 | 数值 + 单位(px、em、rem) | 48px、-0.02em |
| 令牌引用 | {path.to.token} | {colors.primary} |
| 排版 | 包含 fontFamily、fontSize、fontWeight、lineHeight、letterSpacing、fontFeature、fontVariation 的对象 | 见上方示例 |
章节顺序
章节使用 ## 标题。它们可以省略,但存在的章节必须按此顺序出现:
| # | 章节 | 别名 |
|---|---|---|
| 1 | 概述 | 品牌与风格 |
| 2 | 色彩 | |
| 3 | 排版 | |
| 4 | 布局 | 布局与间距 |
| 5 | 层级与深度 | 层级 |
| 6 | 形状 | |
| 7 | 组件 | |
| 8 | 注意事项 |
组件令牌
组件将名称映射为一组子令牌属性:
components:
button-primary:
backgroundColor: "{colors.tertiary}"
textColor: "{colors.on-tertiary}"
rounded: "{rounded.sm}"
padding: 12px
button-primary-hover:
backgroundColor: "{colors.tertiary-container}"
有效的组件属性:backgroundColor、textColor、typography、rounded、padding、size、height、width。
变体(hover、active、pressed)通过相关键名作为单独的组件条目表示。
对未知内容的消费行为
| 场景 | 行为 |
|---|---|
| 未知章节标题 | 保留;不要报错 |
| 未知颜色令牌名称 | 如果值有效则接受 |
| 未知排版令牌名称 | 接受为有效排版 |
| 未知组件属性 | 接受并给出警告 |
| 重复的章节标题 | 报错;拒绝该文件 |
CLI 参考
安装
npm install @google/design.md
在 Windows 上,如果 shell 对 @ 有特殊处理(PowerShell、某些终端),请用引号包裹包名:
npm install "@google/design.md"
或者直接运行(始终从公共 npm 注册表解析):
npx @google/design.md lint DESIGN.md
在 Windows/PowerShell 上,这种直接形式可能不产生任何输出(或在 Markdown 编辑器中打开 DESIGN.md),因为 design.md bin 名中的 .md 后缀在命令解析期间与 Windows Markdown 文件关联冲突。请改用不带点的别名 designmd——使用 -p 将 npx 指向包,然后调用 designmd:
npx -p @google/design.md designmd lint DESIGN.md
designmd 垫片解析到相同的入口点,并在所有平台上以相同方式工作。
npm error ENOVERSIONS(“@google/design.md 无可用版本”)
该 CLI 在 npm 上以 @google/design.md 发布。ENOVERSIONS 几乎总是意味着 npm 没有查询公共注册表(自定义 .npmrc 中的 registry=、未同步此包的企业镜像,或 @google 作用域的 @google:registry 配置错误)。
检查当前注册表:
npm config get registry
正常情况下从互联网安装,应为 https://registry.npmjs.org/。修复配置后,如果缓存了过期的 404,请使用 npm cache clean --force 重试。
所有命令都接受文件路径或 - 表示标准输入。输出默认为 JSON。
Windows 提示:当从
package.json脚本(而非通过npx)直接调用 CLI 时,请使用designmd别名而不是design.md。原始 bin 名称中的.md后缀会与 Markdown 文件关联混淆 Windows 命令解析。designmd垫片解析到相同的入口点,并在所有平台上以相同方式工作。// package.json { "scripts": { "design:lint": "designmd lint DESIGN.md" } }
lint
验证 DESIGN.md 文件的结构正确性。
npx @google/design.md lint DESIGN.md
npx @google/design.md lint --format json DESIGN.md
cat DESIGN.md | npx @google/design.md lint -
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
file | positional | required | 指向 DESIGN.md 的路径(或 - 表示标准输入) |
--format | json | json | 输出格式 |
若发现错误,退出码为 1,否则为 0。
diff
比较两个 DESIGN.md 文件,并报告令牌级别的变更。
npx @google/design.md diff DESIGN.md DESIGN-v2.md
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
before | positional | required | “变更前”的 DESIGN.md 文件路径 |
after | positional | required | “变更后”的 DESIGN.md 文件路径 |
--format | json | json | 输出格式 |
若检测到回归(“变更后”文件中出现更多错误或警告),退出码为 1。
export
将 DESIGN.md 令牌导出为其他格式。
npx @google/design.md export --format json-tailwind DESIGN.md > tailwind.theme.json
npx @google/design.md export --format css-tailwind DESIGN.md > theme.css
npx @google/design.md export --format dtcg DESIGN.md > tokens.json
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
file | positional | required | 指向 DESIGN.md 的路径(或 - 表示标准输入) |
--format | json-tailwind | css-tailwind | tailwind | dtcg | required | 输出格式 |
| 格式 | 输出 | 描述 |
|---|---|---|
json-tailwind | JSON | Tailwind v3 的 theme.extend 配置对象 |
css-tailwind | CSS | 带有 CSS 自定义属性的 Tailwind v4 @theme { ... } 代码块 |
tailwind | JSON | 与 json-tailwind 相同(别名) |
dtcg | JSON | W3C Design Tokens Format Module(设计令牌格式模块) |
spec
输出 DESIGN.md 格式规范(可用于将规范上下文注入到智能体提示中)。
npx @google/design.md spec
npx @google/design.md spec --rules
npx @google/design.md spec --rules-only --format json
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
--rules | boolean | false | 附加当前启用的 lint 规则表 |
--rules-only | boolean | false | 仅输出 lint 规则表 |
--format | markdown | json | markdown | 输出格式 |
Linting 规则
linter 会对解析后的 DESIGN.md 运行九条规则。每条规则都会以固定的严重级别输出检查结果。
| 规则 | 严重级别 | 检查内容 |
|---|---|---|
broken-ref | error | 令牌引用({colors.primary})无法解析到任何已定义的令牌 |
missing-primary | warning | 颜色已定义但缺少 primary 颜色——智能体会自动生成一个 |
contrast-ratio | warning | 组件 backgroundColor/textColor 对低于 WCAG AA 最低对比度(4.5:1) |
orphaned-tokens | warning | 颜色令牌已定义但未被任何组件引用 |
token-summary | info | 每个部分中定义的令牌数量汇总 |
missing-sections | info | 当存在其他令牌时,可选部分(spacing、rounded)缺失 |
missing-typography | warning | 颜色已定义但缺少排版令牌——智能体会使用默认字体 |
section-order | warning | 各部分的顺序不符合规范定义的规范顺序 |
unknown-key | warning | 顶层 YAML 键看起来是已知模式键的拼写错误(例如 colours: → colors:);自定义扩展键不会触发警告 |
程序化 API
linter 也作为库提供:
import { lint } from '@google/design.md/linter';
const report = lint(markdownString);
console.log(report.findings); // Finding[]
console.log(report.summary); // { errors, warnings, info }
console.log(report.designSystem); // Parsed DesignSystemState
设计令牌互操作性
DESIGN.md 令牌的灵感来源于 W3C Design Token Format。export 命令将令牌转换到其他格式:
- Tailwind v3 配置 (JSON) —
npx @google/design.md export --format json-tailwind DESIGN.md— 生成一个theme.extendJSON 对象,用于tailwind.config.js。--format tailwind是向后兼容的别名。 - Tailwind v4 主题 (CSS) —
npx @google/design.md export --format css-tailwind DESIGN.md— 生成一个使用 Tailwind v4 CSS 变量令牌命名空间(--color-*、--font-*、--text-*、--leading-*、--tracking-*、--font-weight-*、--radius-*、--spacing-*)的 CSS@theme { ... }代码块。 - DTCG tokens.json(W3C Design Tokens Format Module) —
npx @google/design.md export --format dtcg DESIGN.md
状态
DESIGN.md 格式当前为 alpha 版本。规范、令牌模式和 CLI 均处于积极开发中。随着格式的成熟,预计会有变动。
免责声明
本项目不符合 Google 开源软件漏洞奖励计划 的条件。