1. 项目概述与核心定位
1.1 这个工具到底解决什么问题
第一次看到 "impeccable" 这个词,很多人会以为是某个新出的代码格式化工具或者 lint 规则集。实际上,它瞄准的是一个更前置、也更让人头疼的环节:AI coding agents 生成的前端界面,为什么总是差那么一口气。
你肯定有过这种体验——用 AI 帮你写一个登录页、一个数据看板、一个卡片列表,代码能跑,功能也对,但打开浏览器一看,就是"不对劲"。间距忽大忽小,颜色搭配说不出的别扭,字体层级混乱,hover 效果要么没有要么用力过猛。你让 AI 改,它改了一版,可能更糟。来回几轮之后,你干脆自己手动调 CSS,调完发现还不如一开始就自己写。
impeccable 就是冲着这个痛点来的。它不是一个 UI 组件库,也不是一个设计系统,而是一套面向 AI coding agents 的前端设计约束层。你可以把它理解成给 AI 戴上一副"设计眼镜"——在它生成代码之前、之中、之后,用一套明确的规则和检查机制,把那些"差一口气"的地方提前拦住。
它的核心能力可以拆成三块:
- 设计规则注入:把间距体系、色彩体系、字体层级、圆角规范、阴影层级这些"设计常识"变成 AI 能理解的约束条件,在 prompt 层面就告诉它什么能做、什么不能做。
- 生成后校验:AI 写完代码后,自动扫描生成的 HTML/CSS/JSX,找出违反规则的硬编码值、不一致的间距、缺失的交互状态。
- CLI 与浏览器扩展双通道:既可以在命令行里跑,也可以装一个浏览器扩展,在页面上直接看到问题标注。
适合谁来用?如果你是用 AI 辅助写前端的人——不管是独立开发者、小团队的全栈工程师,还是在大公司里用 AI 提效的前端——只要你经历过"AI 写的界面能跑但不好看"的折磨,这个工具就值得花时间研究。
1.2 为什么现在需要这样一个工具
AI coding agents 在过去一年里进步飞快。Claude、GPT、Gemini 这些模型写 React 组件、写 Tailwind 类名、写 CSS 动画,语法层面已经很少出错。但"语法正确"和"设计正确"之间有一条巨大的鸿沟。
这条鸿沟的根源在于:设计决策是上下文相关的,而 AI 默认没有上下文。一个按钮的 padding 应该是 12px 还是 16px,取决于它所在的容器、周围的元素、整体的密度。AI 在没有约束的情况下,每次都会"随机"选一个看起来合理的值。一个页面里十个按钮,可能有五种不同的 padding。
impeccable 的思路不是让 AI 变得更聪明,而是把设计决策从 AI 手里拿走,交给一套明确的规则。这听起来有点反直觉——我们不是希望 AI 更智能吗?但在设计一致性这件事上,规则比智能更可靠。一个设计系统不需要"创造力",它需要的是"纪律"。
这也是为什么 impeccable 选择同时提供 CLI 和浏览器扩展。CLI 适合在 CI/CD 流程里做自动化检查,浏览器扩展适合在开发过程中实时反馈。两条路径覆盖了"写代码时"和"代码写完后"两个关键节点。
2. 核心机制拆解:规则、校验与反馈闭环
2.1 设计规则是怎么变成 AI 能理解的约束的
impeccable 的规则体系不是凭空发明的,它借鉴了成熟设计系统(比如 Material Design、Ant Design、Tailwind 的默认尺度)的底层逻辑,但做了大幅简化。核心规则围绕五个维度展开:
| 维度 | 规则内容 | 常见违规示例 |
|---|---|---|
| 间距 | 只允许使用 4px 的倍数,且限定在 4/8/12/16/24/32/48/64 这几档 | margin: 13px、padding: 7px |
| 色彩 | 限定调色板,禁止随意 hex 值,语义色需对应 | #3a7bd5不在调色板中 |
| 字体 | 字号限定档位,行高与字号绑定 | font-size: 15px、行高 1.2 配 14px |
| 圆角 | 限定 0/4/8/12/16/9999 几档 | border-radius: 6px |
| 阴影 | 限定三档:sm/md/lg,对应固定参数 | 自定义box-shadow值 |
这些规则在 impeccable 内部以配置文件的形式存在。当你用 CLI 初始化一个项目时,它会生成一个impeccable.config.json,里面定义了你的项目采用的具体尺度。你可以改,但改了之后所有校验都会按新尺度来。
关键点在于:这套规则会被注入到 AI 的 prompt 里。impeccable 提供了一个impeccable prompt命令,它会输出一段结构化的文本,你可以直接粘贴到 Claude Code、Codex CLI、Cursor 或者其他 AI coding agent 的对话开头。这段文本告诉 AI:"你在生成前端代码时,必须遵守以下约束……"
我实测下来,这段 prompt 的效果比单纯说"请保持设计一致性"要好得多。因为 AI 对具体数字的遵守程度远高于对抽象要求的遵守程度。你说"间距要一致",它可能给你五个不同的值;你说"间距只能用 4/8/12/16/24/32/48/64",它基本不会跑偏。
2.2 生成后校验:怎么找出那些"差一口气"的地方
Prompt 注入能拦住大部分问题,但拦不住全部。AI 有时候会"忘记"约束,或者在复杂场景下做出妥协。所以 impeccable 的第二道防线是生成后校验。
校验的逻辑不复杂:解析生成的代码,提取所有与设计相关的值(CSS 属性、Tailwind 类名、内联样式),然后跟规则配置做比对。但实现上有几个细节值得注意:
- Tailwind 类名的解析:Tailwind 的类名是缩写形式,
p-4对应padding: 1rem,mt-6对应margin-top: 1.5rem。impeccable 需要把类名还原成实际值,再跟规则比对。它内置了一个 Tailwind 映射表,覆盖了默认配置下的所有间距、颜色、字号类名。 - CSS 变量的处理:如果项目用了 CSS 变量,校验器会尝试解析变量值。如果变量值本身就不在规则范围内,会直接报错;如果变量值合法,但使用方式有问题(比如在应该用间距变量的地方硬编码了值),会给出警告。
- JSX 内联样式的提取:React 项目里经常有
style={{ marginTop: 13 }}这种写法。校验器会解析 JSX 的 style 对象,提取数值和单位。
校验结果会以列表形式输出,每条包含:文件路径、行号、违规值、期望值、严重级别(error/warning)。error 级别的违规会导致 CI 失败,warning 级别只是提示。
2.3 CLI 与浏览器扩展的分工
CLI 和浏览器扩展不是简单的"同一功能两个入口",它们的设计目标不同:
CLI 的定位是"守门员"。它适合在代码提交前、CI 流程中运行。impeccable check命令会扫描指定目录下的所有前端文件,输出违规报告。如果配置了--strict模式,任何 error 级别的违规都会返回非零退出码,阻断 CI 流程。
浏览器扩展的定位是"教练"。它在你开发时实时运行,在页面上用彩色边框标注出违规元素。鼠标悬停可以看到具体问题和建议值。它的优势是所见即所得——你不需要去读报告,直接看页面就知道哪里有问题。
两者共享同一套规则配置。你在impeccable.config.json里改的规则,CLI 和扩展都会生效。这种一致性很重要,否则你会陷入"CLI 说没问题但扩展说有问题"的混乱。
注意:浏览器扩展目前只支持 Chrome 和 Edge。如果你用 Firefox 或 Safari,只能用 CLI。另外扩展在 localhost 和 file:// 协议下工作正常,但在某些有严格 CSP 的页面上可能无法注入脚本。
3. 实操全流程:从安装到跑通第一个项目
3.1 环境准备与安装
impeccable 是一个 Node.js 工具,所以第一步是确保你的 Node 环境没问题。它要求 Node 18 或更高版本。如果你还在用 Node 16,建议先升级——很多新的 CLI 工具都已经放弃对 16 的支持了。
node -v # 应该输出 v18.x.x 或更高安装方式有两种:全局安装和项目内安装。我建议项目内安装,因为 impeccable 的规则配置是跟项目走的,全局安装容易在不同项目之间产生混淆。
# 在项目根目录下 npm install -D impeccable # 或者用 pnpm pnpm add -D impeccable # 或者用 yarn yarn add -D impeccable安装完成后,运行初始化命令:
npx impeccable init这个命令会做几件事:
- 在项目根目录生成
impeccable.config.json,包含默认的规则配置。 - 检测你的项目类型(React/Vue/纯 HTML),生成对应的校验规则。
- 如果你用了 Tailwind,它会读取你的
tailwind.config.js,把自定义的间距、颜色值合并到规则里。 - 在
package.json里添加impeccable check脚本。
初始化过程中会问你几个问题:项目使用什么框架、是否使用 Tailwind、是否启用严格模式。如实回答就行,这些答案会影响后续的校验精度。
实操心得:如果你在初始化时选错了框架,不用重新来。直接编辑
impeccable.config.json里的framework字段即可。这个文件就是普通的 JSON,改完保存就生效。
3.2 配置文件的详细解读
impeccable.config.json是整个工具的核心。默认生成的配置大概长这样:
{ "framework": "react", "tailwind": true, "strict": false, "rules": { "spacing": { "allowed": [4, 8, 12, 16, 24, 32, 48, 64], "unit": "px" }, "color": { "palette": ["#000000", "#ffffff", "#f5f5f5", "#e5e5e5", "#737373", "#404040", "#171717"], "allowOpacity": true }, "fontSize": { "allowed": [12, 14, 16, 18, 20, 24, 30, 36, 48], "unit": "px" }, "borderRadius": { "allowed": [0, 4, 8, 12, 16, 9999], "unit": "px" }, "shadow": { "allowed": ["sm", "md", "lg"], "custom": {} } }, "ignore": ["node_modules/**", "dist/**", "*.test.*"] }几个关键字段的解释:
strict:设为true时,warning 也会导致 CI 失败。建议新项目直接开严格模式,老项目先关着,逐步修。spacing.allowed:这是最常改的字段。如果你的设计系统用的是 5px 基准,就把数组改成[5, 10, 15, 20, 30, 40]。但我不建议这么做——4px 基准是行业事实标准,改成 5px 会让你在跟其他工具、其他设计师协作时产生摩擦。color.palette:默认调色板是灰阶的,因为 impeccable 不想替你做品牌色决策。你需要把项目的品牌色加进去。加的时候注意,只加实际用到的颜色,不要一股脑把整个色板都塞进去,否则校验会形同虚设。ignore:这个字段很重要。默认忽略了node_modules和dist,但如果你有自动生成的代码目录(比如 GraphQL 生成的类型文件),也要加进去,否则校验会报一堆无意义的错误。
3.3 跑通第一次校验
配置好之后,运行:
npx impeccable check src/它会扫描src/目录下的所有前端文件,输出类似这样的报告:
src/components/Button.tsx 12:5 error spacing margin: 13px is not in allowed spacing scale 18:3 error color #3a7bd5 is not in palette 24:7 warn fontSize font-size: 15px is not in allowed scale src/pages/Dashboard.tsx 45:9 error spacing padding: 7px is not in allowed spacing scale 67:2 warn shadow custom box-shadow value detected每条报告包含文件路径、行号、列号、严重级别、规则类型、具体问题和期望值。error 级别的问题需要修复,warning 级别的问题建议修复但不强制。
如果你想在 CI 里用,加--strict参数:
npx impeccable check src/ --strict这样任何 error 都会导致命令返回退出码 1,CI 流程会中断。
3.4 浏览器扩展的安装与使用
浏览器扩展的安装方式取决于你用的浏览器。以 Chrome 为例:
- 打开 Chrome Web Store,搜索 "impeccable"。
- 点击"添加到 Chrome"。
- 安装完成后,在扩展栏里能看到 impeccable 的图标。
使用前需要配置规则文件。点击扩展图标,选择"Options",把impeccable.config.json的内容粘贴进去,或者直接上传文件。配置保存后,扩展会在你访问的页面上自动运行。
打开一个你正在开发的前端页面,如果页面上有违规元素,你会看到:
- 违规元素被红色(error)或黄色(warning)边框标注。
- 鼠标悬停在标注上,会弹出提示框,显示具体问题和建议值。
- 点击扩展图标,可以看到当前页面的违规统计。
注意:扩展默认只在 localhost 和 127.0.0.1 上运行。如果你想在测试环境的域名上使用,需要在 Options 里手动添加域名白名单。这是为了避免在生产环境上误触发。
4. 常见问题与排查技巧实录
4.1 安装与初始化阶段的坑
问题一:npx impeccable init卡住不动
这种情况通常是因为 npm 在下载包的时候网络慢。如果你在国内,可以试试切换 npm 镜像源:
npm config set registry https://registry.npmmirror.com然后再运行初始化命令。如果还是慢,可以先用npm install -D impeccable把包装到本地,再运行npx impeccable init,这样 npx 会直接用本地的包,不需要重新下载。
问题二:初始化时检测不到 Tailwind 配置
impeccable 默认会在项目根目录找tailwind.config.js或tailwind.config.ts。如果你的 Tailwind 配置在别的路径(比如config/tailwind.config.js),它找不到。解决办法是在初始化时选择"手动配置",然后自己把 Tailwind 的间距和颜色值填到impeccable.config.json里。
问题三:Node 版本不兼容
impeccable 用了 Node 18 的一些新 API(比如structuredClone)。如果你在 Node 16 上运行,会报structuredClone is not defined。升级 Node 是最简单的解决办法。如果因为项目原因不能升级,可以试试用nvm或fnm在项目目录下切换 Node 版本。
4.2 校验过程中的误报与漏报
误报:Tailwind 的任意值语法被标记为违规
Tailwind 支持p-[13px]这种任意值语法。impeccable 默认会把这种写法标记为违规,因为 13px 不在允许的间距尺度里。但有时候你确实需要任意值——比如跟第三方组件对齐时。
解决办法是在配置里加例外规则:
{ "exceptions": { "spacing": { "allowArbitrary": ["p-[13px]", "m-[7px]"] } } }或者更简单的方式:在代码里加注释/* impeccable-ignore-next-line */,校验器会跳过下一行。
漏报:CSS-in-JS 的动态值没被检测到
如果你用了 styled-components 或 emotion,并且样式值是动态计算的(比如padding: ${props => props.size}px),impeccable 无法在静态分析阶段确定实际值,会跳过这些样式。这是静态分析工具的固有局限,不是 impeccable 的 bug。
应对方式是:在动态值的地方加注释说明,然后在代码审查时人工检查。或者把动态值限制在几个预设档位里,比如size只能是'sm' | 'md' | 'lg',每个档位对应一个合法的间距值。
漏报:内联样式里的简写属性
style={{ margin: '13px 7px' }}这种简写形式,impeccable 能解析出两个值,但有时候会因为解析逻辑的边界情况漏掉第二个值。如果你发现某个违规没被报出来,可以试试把它拆成marginTop和marginBottom分别写,这样校验器更容易处理。
4.3 与 AI coding agents 配合的实战技巧
技巧一:把 impeccable 的 prompt 放在对话最前面
AI 对 prompt 开头的内容注意力最集中。如果你把设计约束放在对话末尾,AI 可能会"忘记"。正确的做法是:新建一个对话,第一段就粘贴npx impeccable prompt的输出,然后再描述你的需求。
技巧二:用--fix模式让 AI 自己修
impeccable 提供了一个--fix参数,它会尝试自动修复违规。但自动修复的能力有限——它只能处理那些"确定性的"问题,比如把13px改成12px或16px。对于需要设计判断的问题(比如颜色不在调色板里,应该换成哪个颜色),它不会自动改,而是给出建议。
我的做法是:先跑impeccable check --fix,让它自动修掉能修的。然后把剩下的违规报告复制给 AI,让它根据报告来修。这样比让 AI 从零开始改要快得多,也更准确。
技巧三:把校验报告作为 AI 的上下文
如果你用 Codex CLI 或 Claude Code,可以在对话里直接引用校验报告:
这是 impeccable 的校验报告: src/components/Card.tsx 15:3 error spacing padding: 10px is not in allowed scale 22:7 error color #2a2a2a is not in palette 请根据报告修复这些问题。AI 看到具体的文件、行号和期望值,修复的准确率会大幅提升。比你说"请检查设计一致性"有效得多。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 安装时卡住 | 网络慢或 npm 源问题 | 切换镜像源或本地安装 |
| 初始化检测不到 Tailwind | 配置文件路径不对 | 手动配置或移动配置文件 |
| Node 版本报错 | Node < 18 | 升级 Node 或用版本管理器切换 |
| 任意值被误报 | Tailwind 任意值语法 | 加例外规则或注释忽略 |
| 动态样式漏报 | CSS-in-JS 动态值 | 限制档位或人工检查 |
| 扩展不生效 | 域名不在白名单 | 在 Options 里添加域名 |
| CI 不阻断 | 没加 --strict | 在 CI 命令里加 --strict |
| 修复后仍有报错 | 自动修复能力有限 | 把报告给 AI 手动修 |
5. 规则定制与团队协作的进阶玩法
5.1 怎么根据项目实际情况调整规则
默认规则是一个起点,不是终点。每个项目都有自己的设计语言,你需要把 impeccable 的规则调整到跟你的设计系统对齐。
调整的原则是:先紧后松。一开始把所有规则都设成最严格的,然后根据实际遇到的误报逐步放宽。反过来做(先松后紧)会导致你永远不知道哪些地方有问题。
具体操作上,我建议按这个顺序调整:
- 间距尺度:先看你的设计稿用的是什么基准。如果是 8px 基准,就把
allowed改成[8, 16, 24, 32, 48, 64]。如果是 4px 基准,保持默认。 - 调色板:把你的品牌色、语义色(成功/警告/错误/信息)加进去。注意要加具体的 hex 值,不要加 CSS 变量名,因为校验器需要实际值来比对。
- 字号:如果你的设计系统用了 15px 这种非标准字号,要么改设计系统,要么把它加进
allowed。我建议改设计系统——15px 和 16px 的视觉差异微乎其微,但维护两套字号尺度的成本很高。 - 圆角:如果你的品牌用了 6px 圆角,加进去。但要注意,圆角档位太多会让界面显得杂乱。理想情况下,一个项目最多用三档圆角。
5.2 在团队中推广 impeccable 的策略
一个人用 impeccable 很简单,一个团队用就复杂了。核心挑战是:怎么让所有人都遵守同一套规则,同时不引起反感。
我的经验是分三步走:
第一步:只做检查,不做阻断。先在 CI 里加impeccable check,但不加--strict。让报告跑一段时间,收集数据,看看团队最常犯的错误是什么。这个阶段的目标是"让大家知道有这个问题",而不是"强迫大家改"。
第二步:针对性培训。根据第一步收集的数据,找出最高频的违规类型。如果 80% 的违规都是间距问题,那就专门做一次关于间距尺度的分享。告诉大家为什么 4px 基准是好的,为什么 13px 是坏的。用具体的例子,不要讲抽象原则。
第三步:逐步收紧。当团队的违规率降到可接受的水平(比如每千行代码少于 5 个 error),再开启--strict。这时候大家已经养成了习惯,不会觉得被突然袭击。
实操心得:在推广过程中,一定要让团队知道 impeccable 的规则是可以改的。如果某个规则确实不合理,大家可以讨论后修改。最怕的是把规则当成"圣旨",那样只会引起抵触。
5.3 跟其他工具链的集成
impeccable 可以跟很多现有工具集成,形成更完整的质量保障链路:
跟 ESLint 集成:impeccable 提供了一个 ESLint 插件,可以把设计规则检查嵌入到 ESLint 流程里。这样你不需要单独跑 impeccable check,ESLint 跑的时候顺便就把设计问题查了。
npm install -D eslint-plugin-impeccable然后在.eslintrc.js里加:
module.exports = { plugins: ['impeccable'], rules: { 'impeccable/spacing': 'error', 'impeccable/color': 'error', 'impeccable/font-size': 'warn' } }跟 Prettier 集成:Prettier 负责代码格式,impeccable 负责设计格式。两者不冲突,可以同时用。但要注意,Prettier 有时候会把 impeccable 的注释忽略标记格式化掉,导致忽略失效。解决办法是在 Prettier 配置里加// impeccable-ignore-next-line到保留注释的列表里。
跟 Storybook 集成:如果你用 Storybook 做组件开发,可以在 Storybook 里加一个 impeccable 的装饰器,让每个 story 都自动跑设计规则检查。这样你在开发组件的时候就能看到设计问题,不用等到页面组装完才发现。
跟 CI/CD 集成:在 GitHub Actions 里加一个 step:
- name: Check design consistency run: npx impeccable check src/ --strict这样每次 PR 都会自动检查设计一致性。如果违规,PR 会被标记为失败,不能合并。
6. 我对这个工具的真实看法与使用边界
6.1 它擅长什么,不擅长什么
用了几个月下来,我对 impeccable 的能力边界有了比较清晰的认识。
它擅长的是"一致性"。间距、颜色、字号、圆角、阴影这五个维度的规则检查,它做得很好。AI 生成的前端代码经过 impeccable 校验和修复后,视觉一致性会有肉眼可见的提升。特别是多人协作的项目,它能有效防止"每个人都有自己的间距习惯"这种问题。
它不擅长的是"审美判断"。一个界面好不好看,不只是间距和颜色的问题。布局的节奏感、信息的层级、视觉的引导,这些 impeccable 管不了。它只能保证"不犯错",不能保证"出彩"。
所以我的使用策略是:用 impeccable 做底线保障,用人工做上限提升。AI 生成代码后,先跑 impeccable 把低级问题修掉,然后我自己再看一遍,调整那些需要审美判断的地方。这样效率最高。
6.2 跟同类工具的对比
市面上做设计一致性检查的工具不多,impeccable 的定位比较独特。我简单对比一下:
| 工具 | 定位 | 跟 impeccable 的区别 |
|---|---|---|
| Stylelint | CSS lint | 更偏语法和兼容性,不检查设计尺度 |
| ESLint | JS/TS lint | 不涉及设计规则,需要插件扩展 |
| Tailwind CSS | 原子化 CSS | 提供尺度,但不强制遵守 |
| Chromatic | 视觉回归测试 | 检查"变了没有",不检查"对不对" |
| impeccable | 设计规则检查 | 专门针对 AI 生成代码的设计一致性 |
impeccable 的独特价值在于它同时面向 AI 和人类。它的 prompt 注入功能是专门为 AI coding agents 设计的,这是其他工具没有的。如果你不用 AI 写代码,impeccable 的价值会打折扣;但如果你用 AI 写代码,它几乎是必备的。
6.3 后续可以怎么扩展
impeccable 目前聚焦在五个设计维度上,但它的架构是开放的。我试过几种扩展方式:
扩展一:加自定义规则。在impeccable.config.json里可以加customRules字段,定义自己的检查逻辑。比如检查所有按钮是否有:focus-visible样式,检查所有图片是否有alt属性。这些规则可以用简单的正则表达式实现,也可以用 JavaScript 函数。
扩展二:跟设计稿比对。如果你用 Figma,可以导出设计稿的间距和颜色值,自动生成 impeccable 的配置。这样规则就跟设计稿完全对齐了。我试过用 Figma 的 API 导出数据,然后写了个脚本转换成 impeccable 配置,效果不错。
扩展三:生成修复建议。impeccable 目前只报告问题,不生成修复代码。但你可以把报告喂给 AI,让它生成修复后的代码。我试过用 Claude 做这件事,准确率挺高。如果 impeccable 官方能加一个--suggest参数,直接输出修复建议,就更方便了。
6.4 一个真实项目的使用记录
最后分享一个我最近用 impeccable 的实际项目。这是一个用 Next.js + Tailwind 做的后台管理系统,大概 40 个页面,200 多个组件。团队三个人,都用 Cursor 辅助开发。
使用前:页面之间的间距不一致,有的用 16px 有的用 20px;颜色有十几种灰色,深浅不一;按钮的圆角有的 4px 有的 6px。整体看起来"能用但粗糙"。
使用后:跑了三遍 impeccable check,修了大概 300 多个违规。间距统一到 4px 基准,灰色收敛到 5 档,圆角统一到 4px 和 8px 两档。视觉一致性明显提升。更重要的是,新写的代码在 AI 生成阶段就被约束住了,不需要事后修。
踩过的坑:一开始开了--strict,结果 CI 天天红,团队怨声载道。后来改成先跑报告不阻断,两周后再开严格模式,就顺畅多了。另外 Tailwind 的任意值语法确实容易误报,加了一批例外规则之后才好。
这个项目之后,我把 impeccable 加到了所有新项目的脚手架里。它不是什么革命性的工具,但它解决了一个真实存在的、而且越来越普遍的问题:AI 写的代码,需要有人管管它的设计。