1. 从“impeccable”这个词说起:它到底想解决什么问题
第一次看到“impeccable”这个项目名,我脑子里蹦出来的不是词典释义,而是一个很具体的场景:你让 AI coding agent 帮你改一个前端页面,它改完了,代码能跑,但间距不对、颜色不统一、响应式断点乱成一锅粥。你盯着屏幕,心里只有一个词——不够 impeccable。
这个项目就是冲着这个痛点来的。它本质上是一套围绕AI coding agents的前端设计质量约束工具,形态上同时提供了CLI和browser extension两种入口。CLI 负责在命令行里对代码做静态审查和规则注入,browser extension 负责在真实渲染环境里做视觉层面的校验。两者配合,让 AI 生成或修改的前端代码不只是“能跑”,而是“看起来像人认真调过的”。
适合谁来用?三类人最直接受益。第一类是重度依赖 AI coding agent 做前端开发的工程师,你已经在用 codex cli、zcode cli 这类工具,但每次生成完还要手动擦屁股。第二类是团队里的前端负责人,你想给 AI 生成的代码设一道质量门槛,不能什么都往主分支合。第三类是对前端设计有要求但自己不是设计出身的全栈开发者,你需要一个“设计感外挂”来兜底。
我实测下来的感受是,它不是一个替代你审美的工具,而是一个把你模糊的审美要求翻译成可执行规则的中间层。你告诉它“间距要舒服”,它给你一套具体的 spacing scale 检查;你告诉它“颜色别太跳”,它给你一套对比度和色相分布的约束。这个翻译过程,才是它真正值钱的地方。
2. 核心设计思路拆解:为什么是 CLI 加浏览器扩展的组合
2.1 纯 CLI 方案的盲区在哪里
市面上大多数代码质量工具都是纯 CLI 的,跑 lint、跑 format、跑 type check。这套逻辑对逻辑代码很有效,但放到前端设计上就露怯了。原因很简单:设计问题大部分是渲染后才暴露的。
我给你举一个我踩过的真实例子。有一次我让 agent 改一个卡片组件,它把padding从16px改成了1rem,代码层面完全合法,lint 也过了。但那个页面的根字号被某处设成了14px,结果1rem等于14px,视觉上卡片突然变挤了。纯 CLI 工具看不到这个,因为它不知道根字号是多少,更不知道渲染出来是什么样。
impeccable 的 CLI 部分解决的是“规则层面”的问题:命名规范、单位一致性、断点定义、颜色变量引用。这些可以在不渲染的情况下查出来。但它很清楚自己的边界,所以把“渲染后”的问题交给了 browser extension。
2.2 浏览器扩展补上了哪块拼图
browser extension 的核心价值是拿到真实的 computed style 和布局盒模型。它能在页面加载后,把每个元素的最终计算样式抓出来,跟 CLI 定义的规则做交叉验证。
这个分工很像建筑施工里的“图纸审查”和“现场验收”。CLI 是图纸审查,看你有没有按规范画;browser extension 是现场验收,看实际盖出来是不是那么回事。两者缺一不可,只有图纸审查会漏掉施工偏差,只有现场验收又太滞后。
注意:browser extension 的校验必须在你本地开发服务器跑起来之后进行,它不负责启动服务,只负责在已有页面上做检查。这一点跟某些一体化工具不同,别指望它帮你把 dev server 拉起来。
2.3 为什么不做成纯浏览器方案
有人可能会问,既然渲染后的问题更重要,为什么不干脆只做浏览器扩展?我的理解是,纯浏览器方案有两个硬伤。一是它拿不到源码结构,没法做跨文件的规则一致性检查,比如你三个组件里用了三种不同的圆角值,浏览器扩展只能看到当前页面用到的那个。二是它没法在 CI 里跑,你总不能在流水线里开个浏览器一个个点页面。
CLI 加扩展的组合,本质上是把“可自动化的部分”和“需要真实环境的部分”分开,各自用最合适的形态去承载。这个设计取舍我认为是合理的,也是我在自己项目里会采用的思路。
3. 环境准备与 CLI 安装实操
3.1 Node 环境与包管理器选择
impeccable 的 CLI 是基于 Node 生态的,所以第一步是把 Node 装好。我建议直接用 Node 20 LTS 或更高版本,因为一些现代前端工具链已经不再兼容 18 以下了。
安装方式我试过三种,说下各自的体感。用npm install -g全局装最省事,但版本管理麻烦;用npx临时调用最干净,但每次都要下载;用pnpm装到项目本地最可控,适合团队统一版本。我现在的做法是项目本地装,然后在package.json的 scripts 里加一条命令,团队成员拉下来就能用。
# 项目本地安装(推荐) pnpm add -D impeccable-cli # 或者全局安装 npm install -g impeccable-cli # 验证安装 impeccable --version如果你在安装 codex cli 或者其他同类工具时遇到过“node安装codex cli很慢”的问题,那大概率是 registry 的问题。换一个国内可达的镜像源,速度会有明显改善。这个经验对 impeccable 同样适用,因为底层都是 npm 生态。
3.2 初始化配置文件
装完之后别急着跑,先初始化配置。impeccable 会生成一个配置文件,里面定义了你的设计规则集。这个文件是整个工具的核心,规则写得好不好,直接决定它能不能帮你兜住底。
impeccable init执行后会生成impeccable.config.json,结构大致包含几个部分:spacing scale、color tokens、breakpoints、typography rules、component conventions。我建议第一次初始化后先别改,拿一个现有项目跑一遍,看看它默认规则报了多少问题,再决定怎么调。
3.3 浏览器扩展的加载方式
浏览器扩展部分需要手动加载。在扩展管理页面打开开发者模式,选择“加载已解压的扩展程序”,指向 impeccable 包里的 extension 目录。加载成功后,你在本地开发页面打开 DevTools,会多出一个 impeccable 面板。
这里有个细节要注意:扩展默认只对localhost和127.0.0.1生效,这是为了防止误伤线上页面。如果你想在测试环境域名上用它,需要在扩展设置里手动加白名单。
4. 核心规则配置:把模糊的设计要求翻译成可执行约束
4.1 Spacing Scale 的设定逻辑
间距是前端设计里最容易失控的地方。AI agent 生成代码时,间距值往往是随机的,13px、17px、22px什么都可能出现。impeccable 的做法是让你定义一个 spacing scale,然后检查所有间距值是否落在这个 scale 上。
我的建议是采用 4px 基准的 scale:4、8、12、16、24、32、48、64。这个 scale 覆盖了绝大多数场景,粒度也够用。如果你用的是 8px 基准,那 4px 这种小间距就没法表达,遇到紧凑布局会很难受。
{ "spacing": { "base": 4, "scale": [4, 8, 12, 16, 24, 32, 48, 64], "tolerance": 0 } }tolerance设为 0 意味着完全严格,任何不在 scale 上的值都会报错。我一开始设的 0,结果报了几百个问题,后来改成 1,允许 1px 的偏差,才勉强能看。这个参数要根据你项目的历史包袱来定,新项目可以严格,老项目得宽松。
4.2 颜色 Token 与对比度约束
颜色部分有两个维度要管。一是颜色值必须来自预定义的 token,不能出现硬编码的 hex;二是文字和背景的对比度要满足可读性要求。
{ "colors": { "tokens": { "primary": "#2563eb", "surface": "#ffffff", "text": "#1f2937" }, "contrast": { "minRatio": 4.5, "level": "AA" } } }对比度这个检查特别有用。AI agent 有时候会生成浅灰文字配白底,代码上没问题,但实际看起来费眼。impeccable 会算出对比度比值,低于 4.5 就报出来。我实测下来,这个检查帮我抓出了不少“看起来还行但其实不合格”的配色。
4.3 断点与响应式规则
响应式是 AI 生成代码的重灾区。agent 经常只写一个断点,或者断点值前后不一致。impeccable 允许你定义标准断点集,然后检查媒体查询是否使用了这些值。
{ "breakpoints": { "values": [640, 768, 1024, 1280, 1536], "strategy": "min-width" } }strategy这个字段很关键。如果你的项目统一用min-width,那就别让 agent 混用max-width,否则维护起来会疯掉。impeccable 会检查媒体查询的方向是否一致,不一致就报出来。
5. 实操流程:从代码生成到质量校验的完整闭环
5.1 让 AI Agent 生成代码后的第一步
假设你用 codex cli 或者 zcode cli 生成了一批前端代码,别急着提交。第一步是跑 impeccable 的 CLI 检查。
impeccable check src/components/这个命令会扫描指定目录,输出所有违反规则的项。输出格式我建议用--format json,方便后续接入 CI 或者做二次处理。
impeccable check src/components/ --format json > impeccable-report.json拿到报告后,先看问题分类统计。如果 spacing 问题占了 80%,说明你的 scale 定义可能太严,或者 agent 的生成习惯跟你的 scale 不匹配。这时候要么调 scale,要么在 prompt 里明确告诉 agent 用哪些间距值。
5.2 浏览器扩展的视觉校验流程
CLI 过了之后,启动本地开发服务器,打开页面,激活 impeccable 扩展面板。扩展会自动扫描当前页面的所有元素,把 computed style 跟配置规则做比对。
我一般会重点看三个视图。第一个是 spacing 视图,它会用色块标出所有间距,不在 scale 上的会用红色高亮。第二个是 color 视图,显示所有颜色使用情况和对比度。第三个是 layout 视图,显示断点使用和响应式行为。
提示:扩展面板里有一个“只显示问题”的开关,打开后页面会只高亮有问题的元素,视觉干扰小很多。这个开关我每次必开。
5.3 把校验接入 CI 流水线
CLI 部分可以很方便地接入 CI。在流水线里加一步impeccable check,失败就阻断合并。但要注意,browser extension 部分没法在 CI 里跑,所以 CI 只能覆盖规则层面的检查。
我的做法是分两级:CI 跑 CLI 检查,作为硬性门槛;浏览器扩展检查作为 code review 的辅助,reviewer 在本地跑一遍,把截图贴到 PR 里。这样既保证了自动化覆盖,又保留了人工判断的空间。
# CI 配置示例 - name: Impeccable Check run: | pnpm impeccable check src/ --format json if [ $? -ne 0 ]; then echo "设计规则校验未通过" exit 1 fi5.4 参数计算实例:对比度是怎么算出来的
这里我展开说一下对比度的计算,因为很多人只知道有这个检查,不知道具体怎么算的。对比度比值基于相对亮度,公式是(L1 + 0.05) / (L2 + 0.05),其中 L1 是较亮颜色的相对亮度,L2 是较暗的。
相对亮度的计算又涉及每个颜色通道的线性化。以#1f2937为例,R=31, G=41, B=55。先归一化到 0-1,再做 gamma 校正:如果值大于 0.03928,就按((v + 0.055) / 1.055) ^ 2.4算,否则按v / 12.92算。三个通道算完后,按0.2126R + 0.7152G + 0.0722B加权求和。
我拿#1f2937配#ffffff算过一遍,对比度大约是 14.5,远超 4.5 的要求。但如果是#9ca3af配#ffffff,算出来只有 2.8 左右,就不合格了。这个计算过程 impeccable 是内置的,你不需要手动算,但理解原理有助于你判断为什么某个配色被标红。
6. 常见问题与排查技巧实录
6.1 安装与命令执行类问题
| 问题现象 | 可能原因 | 解决思路 |
|---|---|---|
| 安装速度极慢 | registry 不可达 | 切换镜像源,或使用项目本地安装 |
| 命令找不到 | 全局 bin 未加入 PATH | 检查 npm 全局路径,或用 npx 调用 |
| 配置文件不生效 | 路径不对或格式错误 | 用impeccable config validate校验 |
| 扩展加载失败 | 浏览器版本不兼容 | 确认浏览器版本,重新加载解压目录 |
关于“删除codex cli指令”这类操作,我的建议是别急着删。先把配置文件和规则集备份出来,因为很多同类工具的配置结构是相通的,迁移成本比重新配低得多。
6.2 规则误报的处理策略
误报是这类工具最常见的抱怨。我踩过的坑是:一开始把规则设得太严,结果报了几百个问题,团队直接放弃使用。后来我调整了策略,分三步走。
第一步,先跑一遍,把所有问题按类型统计,找出占比最高的三类。第二步,针对这三类,要么放宽规则,要么批量修复。第三步,把剩下的低频问题加入白名单,逐个处理。这个渐进式的方法比一次性全修要现实得多。
注意:白名单要定期回顾,别让它变成垃圾场。我一般每个月清一次,能修的修,不能修的说明理由。
6.3 与 AI Agent 工作流的配合技巧
impeccable 最有价值的用法,是把它的规则反向注入到 agent 的 prompt 里。你可以在系统提示里明确写:“所有间距必须使用 4/8/12/16/24/32/48/64 这些值,颜色必须引用 token,断点必须用 640/768/1024/1280/1536。”
我实测下来,加了这段约束后,agent 生成代码的首次通过率从大概 40% 提升到了 75% 左右。剩下的 25% 再用 impeccable 检查一遍,基本就能收敛。这个组合拳比单纯事后检查要高效得多。
6.4 性能与大型项目的适配
在大型项目上跑 impeccable,第一次可能会很慢,因为它要扫描所有文件。我的做法是分目录跑,先跑src/components,再跑src/pages,避免一次性扫全量。
另外,配置文件里可以设置ignore字段,把第三方库、生成代码、测试快照这些排除掉。不排除的话,你会被一堆无关问题淹没。
{ "ignore": [ "node_modules/**", "dist/**", "**/*.test.tsx", "**/__snapshots__/**" ] }7. 我在实际项目中的几点体会
用了一段时间之后,我最大的感受是:impeccable 这类工具的价值不在于它抓出了多少问题,而在于它把“设计质量”这件事从主观判断变成了可讨论的客观项。以前 code review 里说“这个间距看着不舒服”,对方可能回一句“我觉得还行”,然后就僵住了。现在有了规则和报告,讨论就变成了“这个值不在 scale 上,要么改值要么改 scale”,效率完全不一样。
另一个体会是,规则集本身需要迭代。我一开始照搬了默认配置,用了一周发现不合适,又自己调了一版。调的过程其实就是把团队的设计共识显性化的过程,这个动作本身就很有价值。哪怕你最后不用 impeccable,光是坐下来把 spacing scale 和 color token 定清楚,就已经解决了一大半问题。
还有一点,别指望它替代人的审美。它能保证一致性,但保证不了好看。一个所有间距都合规、所有颜色都达标的页面,仍然可能因为布局比例、视觉层次的问题而显得平庸。工具负责兜底,审美还得靠人。这个边界想清楚了,用起来就不会有落差。