1. 从“impeccable”这个词说起:它到底想解决什么问题
第一次看到“impeccable”这个项目名,我脑子里蹦出来的不是词典释义,而是一个很具体的场景:你让 AI 帮你写一段前端代码,它给你吐出来一坨能跑但丑得离谱的东西——间距忽大忽小、颜色搭配像打翻了调色盘、响应式断点全靠猜。你改了三遍,它还是那个德行。这时候你需要的不是更强的模型,而是一套能让 AI 输出变得“无可挑剔”的约束机制。
impeccable 就是冲着这个痛点来的。它本质上是一个围绕AI coding agents的前端设计质量层,通过CLI工具和browser extension两种形态,把设计规范、代码审查和实时反馈塞进 AI 写代码的流程里。你可以把它理解成一个“设计品味外挂”:AI 负责生成,impeccable 负责告诉它哪里不够好、为什么不够好、怎么改才够好。
这个项目适合谁?三类人最该关注。第一类是天天用 AI 写前端但总在收尾阶段抓狂的开发者,你已经有基本的工程能力,缺的是让 AI 输出稳定达到可交付标准的抓手。第二类是想把 AI 编码引入团队但担心代码质量失控的技术负责人,你需要一套可配置、可审计的质量门禁。第三类是独立开发者或小团队,没有专职设计师,但又不想让产品看起来像半成品,impeccable 能帮你把设计底线拉高一个档次。
我花了大概两周时间把它的 CLI 和浏览器扩展都跑了一遍,踩了一些坑,也摸出了一些门道。下面把我理解的架构思路、实操细节和避坑经验完整拆开讲。
2. 整体设计思路:为什么是 CLI 加浏览器扩展的组合
2.1 核心架构拆解:两个入口,一套规则
impeccable 的产品形态很有意思,它没有做成一个 IDE 插件,也没有做成纯云端服务,而是选择了CLI + browser extension的双入口策略。这个选择背后有很实际的考量。
CLI 负责的是“批量”和“自动化”场景。你在终端里跑一条命令,它就能扫描整个项目的组件文件,把不符合设计规范的地方标出来,甚至直接给出修改建议。这个形态天然适合接入 CI/CD 流程,也适合在 AI agent 生成代码之后自动触发一轮质量检查。我实测下来,它的 CLI 响应速度很快,一个中等规模的前端项目(大概 200 多个组件文件)全量扫描在几秒内就能完成。
浏览器扩展负责的是“实时”和“可视化”场景。你打开本地开发服务器,扩展会在页面上叠加一层标注,把间距问题、对比度不足、对齐偏移这些视觉缺陷直接圈出来。这个形态的价值在于,它把抽象的设计规则变成了肉眼可见的标记,你不需要去读报告,扫一眼页面就知道哪里有问题。
两者共享同一套规则引擎,这意味着你在 CLI 里配置的规则,浏览器扩展会自动继承。这个设计省去了重复配置的麻烦,也保证了检查标准的一致性。
2.2 为什么不做成 IDE 插件
我一开始也纳闷,为什么不直接做个 VS Code 插件,那样不是更方便吗?后来想明白了:IDE 插件的问题在于它绑定了特定的编辑器,而 AI coding agents 的工作流是跨工具的。你可能在终端里用 codex cli 生成代码,在浏览器里预览效果,在另一个终端里跑测试。如果质量检查只存在于 IDE 里,那它就覆盖不了完整的工作流。
CLI 的好处是它是通用的,任何能调用命令行的环节都能接入。浏览器扩展的好处是它直接作用于最终渲染结果,不受源码组织方式的影响。这两个入口加起来,基本覆盖了前端开发从编码到预览的主要环节。
2.3 规则引擎的设计哲学:约束而非替代
impeccable 的规则引擎有一个很关键的设计取向:它不试图替代设计师,也不试图生成设计,它只做约束。什么意思?它不会告诉你“这个按钮应该用 #3B82F6 而不是 #2563EB”,它会告诉你“这个按钮和背景的对比度低于 WCAG AA 标准,需要调整”。前者是设计决策,后者是质量底线。
这个取向决定了它的规则集是围绕“可量化、可验证”的维度来组织的。间距是否遵循了 4px 或 8px 的网格、颜色对比度是否达标、字体大小是否在合理范围内、响应式断点是否有覆盖、交互状态是否有定义——这些都是有明确判断标准的东西。至于“这个圆角好不好看”这种主观判断,它不碰。
我觉得这个边界划得很聪明。因为 AI 生成代码最大的问题不是“没有创意”,而是“缺乏纪律”。impeccable 补的正是纪律这一环。
3. 核心细节解析:CLI 和浏览器扩展各自怎么用
3.1 CLI 的安装与初始化配置
CLI 的安装方式很直接,通过 npm 全局安装即可。我用的 Node 版本是 18.x,实测 16.x 也能跑,但建议至少 18 以上,避免一些依赖的兼容性问题。
npm install -g impeccable-cli安装完成后,在你的前端项目根目录执行初始化命令:
impeccable init这个命令会做几件事:生成一个impeccable.config.js配置文件、创建一个.impeccablerc缓存目录、检测你的项目类型(React、Vue、Svelte 等)并加载对应的解析器。
配置文件是整个工具的核心,我建议你花时间把它读一遍。默认配置大概长这样:
module.exports = { rules: { spacing: { scale: [4, 8, 16, 24, 32, 48, 64], strict: true }, color: { contrastStandard: 'AA', allowCustomPalette: false }, typography: { minSize: 12, maxSize: 72, lineHeightRange: [1.2, 2.0] }, responsive: { requiredBreakpoints: [375, 768, 1024, 1440] }, interaction: { requireHover: true, requireFocus: true, requireActive: false } }, ignore: ['**/node_modules/**', '**/*.test.*', '**/dist/**'], output: { format: 'table', verbose: false } }这里有几个参数值得展开说。spacing.scale定义了你项目允许的间距值集合,strict: true意味着任何不在这个集合里的间距都会被标记。我一开始觉得这太严格了,后来发现正是这种严格让 AI 生成的代码变得可预测——它不再随机选一个margin: 13px这种值,而是被迫从预设的刻度里挑。
color.contrastStandard我建议保持AA,如果你的产品有无障碍合规要求,可以调到AAA。responsive.requiredBreakpoints这个配置很实用,它会检查你的组件是否在这些断点下都有合理的样式覆盖,避免出现“桌面端好看、移动端崩坏”的情况。
3.2 扫描命令的实操与输出解读
配置好之后,跑一次全量扫描:
impeccable scan ./src输出是一张表格,每行对应一个文件,列出违规类型、严重程度和具体位置。我截取一段实际输出给你看:
FILE RULE SEVERITY LINE MESSAGE src/components/Button.tsx spacing warning 24 margin: 13px not in scale src/components/Card.tsx color error 56 contrast ratio 3.2:1 below AA src/components/Modal.tsx responsive warning -- no styles for breakpoint 375 src/components/Input.tsx interaction warning 78 no focus state defined严重程度分三档:error是必须修的,warning是建议修的,info是提示性的。我一般会把error设为 CI 的阻断条件,warning只在本地开发时看。
这里有个实操心得:第一次跑全量扫描,输出可能会非常多,容易让人崩溃。我的做法是先跑一次,把error级别的全部修掉,然后针对warning做一轮筛选,把那些确实不合理的规则在配置里关掉。比如我们项目用的是 Tailwind,间距体系跟默认的 4/8 网格不完全一致,我就在配置里把spacing.scale改成了 Tailwind 的默认刻度。工具是死的,配置是活的,别被默认值绑架。
3.3 浏览器扩展的安装与实时标注
浏览器扩展的安装方式取决于你用的浏览器。Chrome 和 Edge 可以直接从扩展商店装,Firefox 需要手动加载。装好之后,扩展图标会出现在工具栏,点击它会弹出一个小面板,显示当前页面的检查结果。
扩展的工作机制是这样的:它注入一个内容脚本到页面里,读取渲染后的 DOM 和计算样式,然后跟规则引擎做比对。因为是基于渲染结果的,所以它不关心你用的是 CSS Modules、Styled Components 还是 Tailwind,只要最终渲染出来就行。
我实测下来,扩展最实用的功能是“悬停高亮”。你把鼠标移到某个元素上,如果它有间距问题,扩展会在元素周围画一个红色虚线框,并在旁边显示实际值和期望值。这个反馈非常直观,比读报告快得多。
还有一个功能是“对比度检查器”。你选中任意两个元素,扩展会计算它们之间的对比度,并告诉你是否达标。这个在调色阶段特别好用,不用反复去在线工具里粘贴色值。
注意:浏览器扩展默认只在
localhost和127.0.0.1上激活,避免在生产环境误触发。如果你想在 staging 环境也用,需要在扩展设置里手动添加域名。
3.4 与 AI coding agents 的集成方式
这是 impeccable 最有价值的部分。它提供了几种跟 AI coding agents 集成的方式,我逐个试过。
第一种是“生成后检查”。你在 AI agent 生成代码之后,手动跑一次impeccable scan,把结果反馈给 agent,让它根据报告修改。这个方式最简单,但需要人工介入。
第二种是“钩子集成”。impeccable 提供了 Git hooks 和文件监听两种钩子。你可以配置成每次保存文件时自动扫描,或者每次 commit 前自动扫描。我配的是文件监听模式,改完代码保存,终端里立刻出结果,反馈延迟大概在 1 秒以内。
第三种是“agent 工具调用”。如果你用的 AI agent 支持工具调用(比如某些支持 function calling 的 CLI 工具),你可以把 impeccable 注册成一个工具,让 agent 在生成代码后自动调用它做检查。这个方式最自动化,但需要 agent 端支持。
我目前用的是第二种加第三种混合:日常开发用文件监听,CI 流程里用 agent 工具调用做最终把关。
4. 实操过程:从零搭建一套 AI 前端质量门禁
4.1 环境准备与依赖确认
在开始之前,确认你的环境满足以下条件:
- Node.js 18 或更高版本
- npm 或 yarn 或 pnpm(我用的是 pnpm,速度更快)
- 一个前端项目,React/Vue/Svelte/Angular 都行
- 如果要用浏览器扩展,需要一个 Chromium 内核的浏览器
我建议先在个人项目上试,别一上来就在团队核心项目里搞。因为规则配置需要根据项目实际情况调,直接上生产项目容易引发“这也不让那也不让”的抵触情绪。
4.2 配置文件的分层策略
impeccable 支持配置分层,这个特性很实用。你可以在项目根目录放一个基础配置,然后在子目录放覆盖配置。比如:
project/ ├── impeccable.config.js # 基础配置 ├── src/ │ ├── components/ │ │ └── impeccable.config.js # 组件目录的覆盖配置 │ └── pages/ │ └── impeccable.config.js # 页面目录的覆盖配置组件目录的配置可以更严格,因为组件是复用的,质量要求更高。页面目录的配置可以稍微宽松,因为页面往往有一些一次性的布局代码。
我实际用的分层策略是这样的:基础配置定义全局底线,组件目录把spacing.strict设为true,页面目录设为false。这样既保证了组件的规范性,又给了页面一定的灵活性。
4.3 规则调优的实操记录
默认规则跑下来,我们项目大概有 300 多个 warning。我花了两个下午做规则调优,过程记录如下。
第一步,把error级别的全部修掉。这部分大概有 40 多个,主要是颜色对比度不达标和缺少 focus 状态。修完之后,无障碍评分从 72 分涨到了 91 分,算是意外收获。
第二步,分析warning的分布。我发现 60% 的 warning 集中在 spacing 规则上,而且大部分是因为我们用了 Tailwind 的space-x-*和gap-*工具类,这些类的实际值不在默认的 scale 里。解决方案是在配置里把 Tailwind 的间距刻度加进去:
spacing: { scale: [0, 1, 2, 4, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64], strict: true }第三步,把剩下的 warning 分类。有些是历史遗留代码,短期内不打算改,就在配置里用ignore排除掉。有些是规则本身太严格,比如typography.maxSize: 72把一些大标题误判了,就调到 96。有些是确实需要修的,就排进迭代计划。
调优完之后,warning 数量降到了 50 左右,而且都是真正值得关注的问题。这个数量级是可持续的,不会让人产生“狼来了”的疲劳感。
4.4 接入 CI 流程的具体配置
CI 接入我用的是 GitHub Actions,配置如下:
name: Design Quality Check on: [pull_request] jobs: impeccable: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18 - run: npm install -g impeccable-cli - run: impeccable scan ./src --fail-on error关键参数是--fail-on error,意思是只要出现error级别的违规,CI 就失败,PR 无法合并。这个门禁设上之后,新提交的代码基本不会再引入严重的质量问题。
我建议初期先用--fail-on error,等团队适应了再考虑升级到--fail-on warning。一步到位容易引起反弹。
4.5 浏览器扩展的日常使用技巧
浏览器扩展我主要用在两个场景。一个是开发新组件时,边写边看标注,及时调整。另一个是 code review 时,打开预览页面,用扩展快速扫一遍视觉问题,比逐行读代码快得多。
有个小技巧:扩展支持“只显示当前视口内的标注”,这个在长页面上特别有用,避免标注太多看不过来。还有一个“导出报告”功能,可以把当前页面的检查结果导出成 JSON,方便存档或分享给同事。
提示:扩展的标注层可能会影响某些交互测试,比如点击事件被标注层拦截。遇到这种情况,可以在扩展面板里临时关闭标注。
5. 常见问题与排查技巧实录
5.1 扫描结果为空或明显不完整
这是最常见的问题,通常有三个原因。第一是ignore配置把目标文件排除了,检查一下配置里的 glob 模式是否写得太宽。第二是文件解析器没匹配上,比如你用的是 Vue 但配置里只加载了 React 解析器,需要在配置里显式指定parser: 'vue'。第三是文件编码问题,某些非 UTF-8 编码的文件可能被跳过,用--verbose参数可以看到详细的跳过原因。
5.2 误报太多导致规则形同虚设
误报是规则引擎的宿命,关键是怎么管理。我的经验是分三步走:先统计误报的类型分布,找出占比最高的那几类;然后针对这些类型调整规则参数或添加例外;最后把无法通过配置解决的误报用// impeccable-disable-next-line注释单独标记。这个注释语法跟 ESLint 类似,可以精确到行。
5.3 浏览器扩展不生效
先确认你访问的是localhost或127.0.0.1,扩展默认只在这些域名激活。如果域名没问题,检查扩展是否被其他扩展冲突了,特别是那些也会注入内容脚本的扩展(比如某些广告拦截器)。还有一个容易忽略的点:如果你的页面用了 CSP(内容安全策略),可能会阻止扩展注入脚本,需要在 CSP 里放行扩展的来源。
5.4 与现有 lint 工具的冲突处理
impeccable 跟 ESLint、Stylelint 的职责有重叠但不完全相同。ESLint 管的是代码逻辑和语法,Stylelint 管的是 CSS 语法和部分规范,impeccable 管的是设计质量和视觉一致性。三者可以共存,但需要协调规则,避免同一个问题被报三次。
我的做法是把 Stylelint 里跟设计质量相关的规则关掉,交给 impeccable 管。ESLint 保持不动,因为它管的东西 impeccable 不碰。这样分工清晰,各司其职。
5.5 性能问题的排查
全量扫描大项目时,如果感觉慢,可以先看--verbose输出里哪个环节耗时最长。常见瓶颈是文件解析和规则匹配。文件解析慢通常是因为项目里有大量非目标文件被扫描了,优化ignore配置即可。规则匹配慢通常是因为启用了太多复杂规则,可以按需关闭一些。
我实测下来,一个 500 文件左右的项目,全量扫描在 8 秒左右,增量扫描(只扫改动文件)在 1 秒以内。这个性能是可以接受的。
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 扫描结果为空 | ignore 配置过宽 | 检查 glob 模式 | 缩小 ignore 范围 |
| 误报率高 | 规则参数不匹配项目 | 统计误报类型分布 | 调整参数或添加例外 |
| 扩展不生效 | 域名不在白名单 | 检查扩展设置 | 添加域名或改用 localhost |
| 扫描速度慢 | 扫描了非目标文件 | 用 --verbose 看耗时 | 优化 ignore 配置 |
| 与 lint 冲突 | 规则职责重叠 | 对比两边规则集 | 关闭重叠规则 |
6. 我踩过的坑和最后分享的几个技巧
第一个坑是配置文件的位置。我一开始把impeccable.config.js放在了src目录下,结果 CLI 在项目根目录跑的时候找不到配置,用的是默认值。后来才知道配置文件必须放在执行命令的目录或者它的父级目录。这个设计跟大多数工具一致,但第一次用容易忽略。
第二个坑是浏览器扩展的缓存。我改了配置之后,扩展还是按旧规则检查,折腾了半天才发现需要手动刷新扩展。后来养成了习惯:改完配置先刷新扩展,再刷新页面。
第三个坑是 CI 里的 Node 版本。我用的是 18,但 CI 默认可能是 16,导致一些依赖装不上。显式指定node-version: 18之后就稳了。
最后分享几个我觉得特别有用的技巧。一是用impeccable scan --diff只扫描 Git 改动过的文件,这个在大型项目里能省很多时间。二是把impeccable.config.js里的规则集导出成文档,放在团队 wiki 里,让所有人都知道质量底线在哪。三是定期回顾ignore列表,把那些“临时排除”的条目清理掉,避免技术债越积越多。
这套工具用下来,最大的感受是它把“设计质量”从一个模糊的概念变成了可量化、可执行、可追踪的指标。AI 生成代码的速度已经够快了,现在缺的是让速度不牺牲质量的机制。impeccable 补的就是这一环。