当设计系统有了自己的执行官:Agent 化设计系统,让 AI 理解并执行设计约束规则
一、深度引言与场景痛点
设计系统的规范像一本法律条文——每个组件有接口约束(Props 类型与默认值),每个 Token 有使用约束(只能用在语义层级而非原始层级),每个交互有行为约束(按钮的 loading 状态禁止重复点击)。条文写得再清楚,执行仍然依赖人的自觉——开发者可能忽略约束直接引用原始 Token,设计师可能违反间距规则手动调整。
Agent 化设计系统给法律条文配了一位执行官——AI Agent 不仅能理解规范条文,还能在开发流程中主动执行约束规则。当开发者提交一段代码,Agent 自动检查是否符合设计系统约束;当设计师修改一个 Token,Agent 自动验证修改是否影响下游组件的合规性。从被动查阅规范到主动执行约束,设计系统的治理方式从"人自觉遵守"升级为"Agent 自动检查"。
二、底层机制与原理深度剖析
flowchart TD A[设计系统约束规则库] --> B[规则解析层] B --> B1[接口约束:Props 类型与默认值] B --> B2[使用约束:Token 语义层级引用] B --> B3[行为约束:交互状态转移规则] B --> B4[视觉约束:间距和颜色 Token 白名单] B1 & B2 & B3 & B4 --> C[Agent 执行层] C --> C1[代码提交时自动检查约束合规] C --> C2[设计修改时自动验证下游影响] C --> C3[组件开发时自动生成合规代码] C --> C4[异常时自动生成修复建议] C1 & C2 & C3 & C4 --> D[执行报告层] D --> D1[合规报告:哪些约束被违反] D --> D2[影响分析:修改会影响哪些组件] D --> D3[修复补丁:自动生成合规代码]Agent 的三种执行模式:
- 拦截模式:代码提交前检查,违规则阻断合并
- 通知模式:设计修改后分析,通知受影响的组件维护者
- 生成模式:组件开发时辅助,自动生成符合约束的代码
三、生产级代码实现与最佳实践
约束规则定义格式:
# design-system-constraints.yaml constraints: # Token 使用约束:组件必须引用语义 Token token_hierarchy: rule: "组件样式必须引用语义级 Token(--color-primary),禁止直接引用原始级 Token(--blue-500)" check: "scan all component CSS for hardcoded color values not in token whitelist" severity: critical fix: "replace hardcoded value with semantic token reference" # 间距 Token 白名单约束 spacing_whitelist: rule: "间距值只能使用定义的 Token 值:4/8/12/16/24/32/48/64px" check: "scan CSS for spacing values not in whitelist" severity: moderate fix: "replace with closest token value" # 交互状态约束 button_states: rule: "Button 组件必须覆盖 idle/hover/active/loading/disabled 五个状态" check: "verify Button component covers all 5 states" severity: critical fix: "add missing state definitions" # 无障碍约束 aria_required: rule: "所有交互元素必须有 aria-label 或文字内容" check: "scan for interactive elements without aria-label or text content" severity: critical fix: "add aria-label attribute"Agent 执行引擎:
// scripts/design-agent/constraint-executor.ts import { OpenAI } from 'openai'; import fs from 'fs'; interface ConstraintResult { rule: string; violations: Violation[]; severity: string; fixSuggestions: string[]; } interface Violation { file: string; line: number; description: string; currentValue: string; expectedValue: string; } async function executeConstraints( constraintsPath: string, componentDir: string ): Promise<ConstraintResult[]> { const constraints = parseConstraints(constraintsPath); const results: ConstraintResult[] = []; for (const constraint of constraints) { // 执行规则检查 const violations = await checkConstraint(constraint, componentDir); // 生成修复建议 const fixes = violations.length > 0 ? await generateFixes(constraint, violations) : []; results.push({ rule: constraint.rule, violations, severity: constraint.severity, fixSuggestions: fixes }); } return results; } async function checkConstraint( constraint: Constraint, dir: string ): Promise<Violation[]> { const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); // 收集组件代码 const files = fs.readdirSync(dir, { recursive: true }) .filter(f => f.endsWith('.tsx') || f.endsWith('.css')); const codeSnippets = files.map(f => { const content = fs.readFileSync(fs.join(dir, f), 'utf-8'); return `${f}:\n${content.substring(0, 2000)}`; }).join('\n---\n'); const response = await openai.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'system', content: `你是设计系统约束检查 Agent。根据规则检查代码违规。` }, { role: 'user', content: `规则:${constraint.rule}\n检查方法:${constraint.check}\n代码:${codeSnippets}` } ], response_format: { type: 'json_object' }, max_tokens: 4000 }); return JSON.parse(response.choices[0].message.content || '{}').violations || []; } async function generateFixes(constraint: Constraint, violations: Violation[]): Promise<string[]> { const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); const violationSummary = violations.map(v => `${v.file}:${v.line} — ${v.description}(当前:${v.currentValue},期望:${v.expectedValue})` ).join('\n'); const response = await openai.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'system', content: '生成修复代码补丁。' }, { role: 'user', content: `规则:${constraint.rule}\n修复方向:${constraint.fix}\n违规项:${violationSummary}` } ], max_tokens: 3000 }); return [response.choices[0].message.content || '']; }CI 集成:
# .github/workflows/design-agent.yml name: Design Agent Constraint Check on: pull_request: paths: ['src/components/**', 'src/styles/**'] jobs: constraint-check: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: node scripts/design-agent/constraint-executor.ts # 有 critical 违规时阻断合并 - run: node scripts/design-agent/block-if-critical.ts四、边界分析与架构权衡
Agent 检查的不确定性。大模型对约束规则的检查可能遗漏某些违规——比如 Token 层级约束的检查,模型可能只扫描了部分文件。确定性规则(白名单检查)应该用代码扫描而非大模型,大模型只处理需要语义理解的规则(比如"间距值是否在语义上应该使用 Token")。
修复建议的验证成本。Agent 生成的修复补丁需要开发者验证——自动修复可能引入新的违规或改变组件的意图行为。修复建议只作为参考而非自动执行,开发者确认后才合并。
约束规则的维护成本。规则库需要随设计系统演进持续更新——新 Token 加入后白名单要扩展,新交互规范发布后状态约束要调整。规则库的维护是设计决策而非技术决策,需要设计师参与定义而非开发者自行添加。
Agent 的执行频率。拦截模式在每次 PR 合并前执行,执行频率可控。通知模式在设计修改后执行,可能触发大量下游影响分析——一个基础 Token 的修改可能影响 50+ 个组件,每个组件的影响分析需要一次大模型调用。成本控制:只对关键 Token(primary color、spacing-4)触发影响分析,次要 Token 修改只在合并时检查。
五、总结
Agent 化设计系统从被动规范查阅升级为主动约束执行——AI Agent 不仅理解规范条文,还在开发流程中自动检查合规性、分析修改影响、生成修复建议。三种执行模式——拦截、通知、生成——覆盖了规范执行的不同场景。
Agent 的核心价值是"让约束不只是条文,而是执行力量"——规范写得再清楚,没有执行机制就只是建议而非约束。Agent 的自动检查让约束成为 CI 的一部分,违规的代码无法合并,违规的修改自动通知受影响方,合规的代码自动生成。
执行不是万能的——大模型的检查有不确定性,修复建议需要验证,约束规则需要维护。Agent 是治理的辅助而非替代——它加速检查、减少遗漏、提供修复方向,但决策权始终在人。Agent 执行 + 人工决策,才是设计系统治理的正确节奏。