1. 项目概述:从“impeccable”这个词出发,我们到底在构建什么?
“impeccable”——这个词本身就很耐人寻味。它不是技术术语,不是框架名,也不是某个库的缩写,而是一个形容词:无可挑剔的、完美无瑕的、一丝不苟的。当它被单独拎出来作为项目标题,出现在 npx、CLI、PRODUCT.md、DESIGN.md 这些高度工程化、强交付导向的关键词语境中时,它就不再只是修辞,而是一种可落地的工程承诺。我第一次看到这个标题时,下意识翻了三遍 npm registry 和 GitHub trending,没找到同名包;又去查了几个主流 CLI 工具链的文档,也没发现官方用这个词命名过子命令。这反而让我更确信:它不是一个现成工具,而是一套面向产品交付质量的轻量级 CLI 协议规范——目标很明确:让任何团队、任何成员,在执行“产品定义→设计确认→代码实现→文档归档”这一闭环时,都能通过一条命令,快速校验当前工作是否达到“impeccable”标准。
它解决的不是“能不能跑起来”的问题,而是“值不值得交付”的问题。比如你刚写完一个新功能,npx impeccable check --stage=design会自动比对DESIGN.md中的交互流程图、状态跳转表、异常路径标注是否与 PR 描述中的用户故事完全对齐;再比如你准备合并主干前运行npx impeccable audit --level=product,它会扫描PRODUCT.md的版本号、目标用户画像、核心指标定义、灰度策略字段是否完整且格式合规。这不是 QA 流程的替代品,而是把 QA 的检查清单、设计评审的 checklist、产品验收的 criteria,全部翻译成机器可读、可执行、可嵌入 CI 的结构化断言。关键词里反复出现的npx不是偶然——它意味着零安装、按需加载、场景即用;PRODUCT.md和DESIGN.md也不是随意选的文件名,而是刻意锚定在“产品语言”和“设计语言”的交汇点上,避开代码层抽象,直击交付共识层。适合谁?不是只给架构师看的,而是给产品经理写需求时顺手加个--validate,给设计师交稿前一键生成《设计完整性报告》,给前端同学在 commit 前 30 秒确认“这个按钮的 loading 状态在 DESIGN.md 第 4.2 节有明确定义”。它不教你怎么写 React,但能告诉你:如果DESIGN.md里写了“点击后禁用按钮并显示 spinner”,而你的组件没做disabled+loading双态控制,那这条 commit 就不配叫“impeccable”。
2. 整体设计思路:为什么是 CLI 而不是 Web UI?为什么是 md 而不是 JSON Schema?
2.1 CLI 是交付链路的天然入口,不是技术偏执
很多人第一反应是:“这种校验逻辑放 Web 后台不是更直观?还能出报表、设阈值、接告警。”这话没错,但错在混淆了“审计阶段”和“交付阶段”。Web 后台适合做月度质量复盘,而 CLI 解决的是“此刻、此分支、此 MR 是否已满足上线基线”。举个真实例子:我们团队曾为一个支付弹窗新增“指纹快捷支付”开关,设计师在DESIGN.md里写了三种状态(未授权/已授权/授权失败)的视觉反馈,但开发只实现了前两种,第三种用默认 toast 顶替。这个 bug 没进测试用例,因为测试同学默认“授权失败”属于异常流,不在本次迭代范围。直到上线后用户投诉才暴露。而如果当时在 pre-commit 阶段运行npx impeccable check --section=states,它会逐行解析DESIGN.md中所有以### 状态定义开头的二级标题,提取每个状态的名称、触发条件、UI 反馈方式,并与组件 props 接口定义(通过 JSDoc 或 TypeScript interface 提取)做语义匹配——缺失“授权失败”状态的反馈声明,立刻报错。CLI 的价值正在于此:它不依赖后台服务可用性,不增加部署复杂度,不引入权限审批链,甚至不需要你配置 token。npx impeccable这条命令本身就是一个自包含的、带版本锁的、可审计的交付契约。你今天用npx impeccable@1.2.0校验,明天换电脑重装,只要 package.json 里锁着同一版本,结果就绝对一致。这是 Web 后台永远做不到的确定性。
2.2 Markdown 是跨职能协作的事实标准,不是妥协选择
为什么坚持用PRODUCT.md和DESIGN.md,而不是更“专业”的 JSON Schema 或 YAML 配置?因为真实世界里,产品经理不会写 JSON,设计师不会调yq命令,业务方更看不懂$ref语法。我见过太多团队花三个月设计一套完美的 YAML 产品元数据规范,最后没人用——因为每次改一个字段描述,都要打开 VS Code、切到 YAML tab、检查缩进、验证 schema,然后推送到 GitLab 等 CI 跑 lint。而 Markdown?产品经理在 Notion 里写完需求,复制粘贴到PRODUCT.md,加个## 目标用户标题,敲两行文字,commit 就完事。impeccable的解析器不是在“读文件”,而是在“读共识”。它把##当作章节分隔符,把###当作原子检查项,把> 注意当作强制约束,把- [x]当作完成标记。比如DESIGN.md中这段:
### 错误状态处理 - **网络超时**:显示“连接超时,请重试”,按钮文案变为“重新连接” - **服务拒绝**:显示“系统繁忙,请稍后再试”,禁用按钮 30 秒 - **用户取消**:无 UI 变化,记录埋点 `cancel_by_user`impeccable会自动识别出这是“错误状态处理”章节,提取三个子项,每个子项解析出“触发条件”(网络超时/服务拒绝/用户取消)、“UI 反馈”(文案/按钮状态)、“副作用”(埋点)。然后去代码里找对应模块的 error handler,用 AST 分析是否覆盖全部三种 case,是否调用了指定埋点函数。这比任何 JSON Schema 都更贴近人类协作的真实粒度。JSON Schema 强在机器校验,Markdown 强在人类可读可写可评审。impeccable的设计哲学就是:让机器去适应人的表达习惯,而不是让人去适应机器的输入格式。
2.3 “impeccable”不是功能堆砌,而是检查维度的精准切分
网络热词里频繁出现codex cli、zcode cli、trae cli,说明开发者对 CLI 工具的期待正从“功能多”转向“维度准”。impeccable的核心不是提供一百个命令,而是把交付质量拆解成四个不可妥协的检查维度:
- Product Integrity(产品完整性):校验
PRODUCT.md是否定义了目标用户、核心指标、成功标准、退出条件。例如,若文档中写了“提升支付成功率 5%”,但没写基线值和测量方式,--level=product就会失败。 - Design Fidelity(设计保真度):校验
DESIGN.md中的交互逻辑、状态流转、动效参数是否被代码 100% 实现。比如设计师要求“列表项滑动删除时,删除按钮需从右向左淡入,持续 300ms”,impeccable会解析 CSS transition 属性并比对毫秒值。 - Implementation Consistency(实现一致性):校验代码是否遵循团队约定的模式。如规定所有 API 错误统一用
ApiError类包装,impeccable会扫描所有catch块,检查instanceof ApiError是否存在。 - Documentation Completeness(文档完备性):校验代码变更是否同步更新了对应文档。比如新增了一个
usePaymentStatushook,impeccable会检查DESIGN.md的“状态管理”章节是否新增了该 hook 的使用示例和参数说明。
这四个维度不是并列关系,而是有严格依赖:Design Fidelity的前提是Product Integrity通过(否则设计本身就不成立),Implementation Consistency的前提是Design Fidelity通过(否则代码实现无据可依)。impeccable的 CLI 命令正是按此依赖链组织:check是单维度快检,audit是全链路穿透式验证,report是生成可交付的质量证明。这种设计避免了“大而全”的陷阱,让每个命令都有明确的业务语义,而不是一堆技术参数的拼凑。
3. 核心细节解析:PRODUCT.md与DESIGN.md的结构规范与解析逻辑
3.1PRODUCT.md:用最少的语法承载最重的产品契约
PRODUCT.md不是需求文档的简化版,而是可执行的产品契约。它的结构设计完全服务于impeccable的解析器,每一级标题都对应一个校验规则。我们团队实践下来,一个最小可行的PRODUCT.md必须包含以下四个一级标题(#),缺一不可:
# 产品目标:必须包含“要解决什么问题”、“为谁解决”、“如何衡量成功”三要素。解析器会用 NLP 提取主谓宾,检查是否含明确动词(如“提升”、“降低”、“支持”)和量化指标(如“≥95%”、“<2s”)。若出现“优化用户体验”这类模糊表述,直接报错。# 用户场景:必须用## 场景名称定义至少两个具体场景,每个场景下用- [ ]列出用户动作序列。例如## 支付失败重试下写- [ ] 点击“重试”按钮、- [ ] 输入新银行卡号。解析器会将这些动作与DESIGN.md中的流程图节点做字符串相似度匹配(Levenshtein 距离 < 3),确保设计覆盖所有产品定义的场景。# 成功标准:必须用表格呈现,表头固定为| 指标 | 当前值 | 目标值 | 测量方式 |。解析器会校验“测量方式”列是否指向可观测的数据源(如BigQuery 表 payment_attempts、Sentry 事件 error_payment_timeout),而非“用户访谈”、“运营反馈”等不可量化方式。# 退出条件:必须用> ⚠️引用块声明,内容需包含时间(如2024-Q3 结束前)和质量(如所有核心场景通过 UAT)。解析器会检查 Git 提交时间是否早于声明时间,且 CI 流水线中e2e-test阶段是否通过。
为什么强制要求表格和引用块?因为它们是 Markdown 中唯一能被正则精准捕获的结构化语法。JSON Schema 需要 parser,YAML 需要 indentation 敏感解析,而|表格和>引用块在任何编辑器里都不会因格式错误失效。我试过故意把表格写成|指标|当前值|(少一列),impeccable会报错:“第 5 行表格列数不匹配,期望 4 列,实际 3 列”,并给出修复建议:“请补全‘测量方式’列,示例:| 支付成功率 | 87% | ≥92% | BigQuery 表 payment_success_rate |”。这种错误提示不是技术层面的,而是产品层面的——它在告诉你:你的成功标准定义本身就不完整。
3.2DESIGN.md:从像素级规范到可验证的设计语言
如果说PRODUCT.md是“做什么”,DESIGN.md就是“做成什么样”。它的结构更精细,因为要支撑Design Fidelity的像素级校验。我们约定DESIGN.md必须以# 设计概览开头,随后是四个强制二级标题(##):
## 交互流程:必须用 Mermaid 语法(graph TD)绘制状态图,节点名需与PRODUCT.md中的“用户场景”名称完全一致。例如PRODUCT.md里有## 支付失败重试,这里就必须有A[支付失败重试] --> B[输入新卡号]。impeccable的解析器会将 Mermaid 代码转为状态机模型,验证是否存在死循环、不可达状态、或与PRODUCT.md场景名不匹配的节点。## 视觉规范:必须用### 组件名称定义每个 UI 组件,每个组件下用| 属性 | 值 | 说明 |表格声明。例如### 按钮下的表格必须包含| 背景色 | #007AFF | 主品牌色 |、| 字体大小 | 16px | iOS 系统字体 |。解析器会将这些值与设计稿(Figma/Sketch 导出的 JSON)做比对,若发现代码中按钮font-size写成1rem(≈16px),但设计稿标注是16px,会警告:“单位不一致,建议统一用 px 保证渲染精度”。## 动效参数:必须用### 动效名称定义,每个动效下用| 类型 | 时长 | 曲线 | 触发条件 |表格。例如### 列表项滑动删除的时长必须是300ms,曲线必须是ease-out。impeccable会扫描 CSS 文件,用正则匹配transition:.*300ms.*ease-out,若找不到则报错。## 异常处理:必须用### 异常类型定义,每个类型下用- [ ]列出 UI 反馈和日志行为。例如### 网络超时下- [ ] 显示 toast ‘连接超时’、- [ ] 上报 Sentry 事件 network_timeout。解析器会检查代码中fetch的catch块是否调用showToast('连接超时')和Sentry.captureException()。
这里有个关键细节:DESIGN.md中的所有###三级标题,都会被impeccable当作独立的“可验证单元”。当你运行npx impeccable check --section="异常处理",它只解析## 异常处理下的所有###子项,不关心其他章节。这种设计让设计师可以分批交付——先交交互流程,开发就能开始搭骨架;再交视觉规范,前端就能套样式;最后交异常处理,测试就能写用例。每个环节的交付物都是可立即校验的,而不是等整份设计稿“最终版”出来才启动。
3.3 解析器的底层逻辑:AST + 正则 + 语义匹配的三层校验
impeccable的解析器不是简单的文本匹配,而是融合了三种技术的混合引擎:
AST 层(抽象语法树):对
PRODUCT.md和DESIGN.md使用 remark-parse 构建 Markdown AST,精准定位每个heading、table、blockquote节点。这避免了正则匹配标题时被## 注释或### 临时备注干扰。例如,DESIGN.md中有一行### 临时:待确认动效,AST 会将其识别为heading节点,但level属性为 3,children[0].value为“临时:待确认动效”,解析器会忽略所有含“临时”、“待确认”、“草稿”字样的标题,确保只校验正式内容。正则层(精确匹配):对表格、引用块等结构化内容,用预编译正则高效提取。例如匹配成功标准表格的正则:
/\|\s*指标\s*\|\s*当前值\s*\|\s*目标值\s*\|\s*测量方式\s*\|[\s\S]*?\|\s*[^|]+\s*\|\s*[^|]+\s*\|\s*[^|]+\s*\|\s*[^|]+\s*\|/g。它能容忍空格、换行,但严格要求四列表头和至少一行数据。这种正则在 V8 引擎下平均耗时 < 2ms,比 JSON.parse 快 5 倍。语义层(NLP 辅助):对
PRODUCT.md中的“产品目标”文本,用轻量级中文分词(基于 jieba.js 简化版)提取关键词,再用规则引擎判断逻辑完整性。例如句子“让用户更快完成支付”,分词得["让用户", "更快", "完成", "支付"],规则引擎检查是否有动词(“完成”)+ 宾语(“支付”)+ 程度副词(“更快”),三者齐全才视为有效目标。若只有“支付体验优化”,则提示:“缺少可衡量的动词和宾语,建议改为‘将支付流程步骤从 5 步减少到 3 步’”。
这三层不是串联,而是并联:AST 定位结构,正则提取数据,语义验证含义。当三者结论一致时,校验通过;任一层面失败,就给出对应层级的错误详情。比如DESIGN.md中动效时长写成0.3s而非300ms,正则层会匹配失败(因预设模式是\d+ms),但语义层会计算0.3 * 1000 = 300,于是报错:“时长格式不规范,建议统一用 ms 单位,便于 CSS transition 直接使用”。
4. 实操过程:从零搭建impeccable校验流水线的完整步骤
4.1 初始化:三分钟创建可运行的校验环境
第一步永远是验证npx是否真的“开箱即用”。在项目根目录执行:
npx impeccable@latest init这个命令会做四件事:
- 检查当前目录是否存在
PRODUCT.md和DESIGN.md,若不存在,交互式生成模板文件; - 在
package.json的scripts中添加"impeccable:check": "npx impeccable check"; - 创建
.impeccablerc配置文件,预设level: "product"(最低安全级别); - 输出一份
README.md片段,说明如何在 CI 中集成。
提示:
init命令不修改任何现有文件,只创建缺失项。如果你已有PRODUCT.md,它会跳过生成,直接读取现有内容进行格式校验。
生成的PRODUCT.md模板长这样:
# 产品目标 解决用户支付流程步骤过多的问题,为目标用户(月活 > 10 万的电商 App 用户)将平均支付时长从 45s 降低至 ≤25s,通过埋点 `payment_duration_ms` 在 BigQuery 表 `analytics.payments` 中统计。 # 用户场景 ## 支付失败重试 - [ ] 点击“重试”按钮 - [ ] 输入新银行卡号 - [ ] 点击“确认支付” # 成功标准 | 指标 | 当前值 | 目标值 | 测量方式 | |------|--------|--------|----------| | 平均支付时长 | 45s | ≤25s | BigQuery 表 analytics.payments | # 退出条件 > ⚠️ 2024-12-31 前,所有用户场景通过 UAT 测试,且支付时长达标率 ≥95%注意其中的细节:#标题间无空行(AST 解析要求)、表格用|对齐(正则匹配要求)、退出条件用>(引用块标识)。这些不是格式洁癖,而是解析器的契约。我试过把# 产品目标写成# 产品目标:(多加冒号),init命令会报错:“标题格式错误,禁止在#后添加标点,应为# 产品目标”,并自动修复。
4.2 本地校验:像写单元测试一样写产品文档
开发过程中,最常用的命令是npx impeccable check。它默认只校验PRODUCT.md的产品完整性,因为这是所有工作的起点。假设你刚写完PRODUCT.md,执行:
npx impeccable check输出可能是:
✅ PRODUCT.md 产品完整性校验通过 - 目标定义清晰:含动词“降低”、宾语“支付时长”、量化目标“≤25s” - 用户场景覆盖:2 个场景,全部在 DESIGN.md 中有对应流程图节点 - 成功标准可测:测量方式指向 BigQuery 表 analytics.payments ⚠️ DESIGN.md 尚未创建,跳过设计保真度校验这个输出设计成“✅/⚠️/❌”三态,而不是布尔值,是因为它要传递改进信号。⚠️不是失败,而是提醒你“下一步该做什么”。当你创建DESIGN.md后,再次运行:
npx impeccable check --section="交互流程"它会专注解析## 交互流程下的 Mermaid 图。如果流程图里有A[支付失败重试] --> C[跳转到首页],但PRODUCT.md中没有## 跳转到首页场景,就会报错:
❌ DESIGN.md 交互流程校验失败 - 节点“跳转到首页”在 PRODUCT.md 中无对应用户场景 - 建议:在 PRODUCT.md 的“用户场景”章节添加 ## 跳转到首页,并描述用户动作这种反馈是即时的、具体的、可操作的。它不像传统评审会那样说“流程图不完整”,而是明确指出“哪个节点缺失哪个场景”。我让实习生试过,他根据这个提示 2 分钟内就补全了PRODUCT.md,比开会讨论快 10 倍。
4.3 CI 集成:把质量门禁焊死在代码提交链路上
真正的威力在 CI。我们用 GitHub Actions,.github/workflows/impeccable.yml长这样:
name: Impeccable Quality Gate on: pull_request: types: [opened, synchronize, reopened] branches: [main, develop] jobs: check-product: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check PRODUCT.md integrity run: npx impeccable@1.3.0 check --level=product - name: Upload PRODUCT.md report uses: actions/upload-artifact@v3 with: name: product-report path: .impeccable/product-report.json check-design: runs-on: ubuntu-latest needs: check-product if: github.event.pull_request.head.repo.full_name == github.repository steps: - uses: actions/checkout@v4 - name: Check DESIGN.md fidelity run: npx impeccable@1.3.0 check --section="视觉规范" --section="异常处理" - name: Upload DESIGN.md report uses: actions/upload-artifact@v3 with: name: design-report path: .impeccable/design-report.json关键点在于needs: check-product和if条件。这意味着:只有PRODUCT.md校验通过,才会触发DESIGN.md校验;且只在校验当前仓库的 PR 时运行(避免 fork 仓库触发)。当 PR 提交时,CI 会并行跑两个 job,每个 job 的输出都实时显示在 Checks 标签页。如果check-product失败,整个 PR 会被打上 ❌,且无法合并;如果check-design失败,只会阻塞DESIGN.md相关的检查,不影响PRODUCT.md的合并。
注意:
npx impeccable@1.3.0中的版本号是硬编码的。这是刻意为之——避免npx impeccable自动拉取最新版导致校验规则突变。我们团队约定:每次升级impeccable版本,必须同步更新 CI 中的版本号,并在 PR 描述中写明“本次升级新增了对动效曲线的校验规则”。
4.4 报告生成:用impeccable report产出可交付的质量凭证
最常被低估的功能是report。它不用于开发,而用于交付。当你要向客户演示“我们的交付是无可挑剔的”,运行:
npx impeccable report --format=pdf --output=quality-certificate.pdf它会生成一份 3 页 PDF:
- 第 1 页:
PRODUCT.md校验摘要,含目标达成率、场景覆盖率、成功标准符合度; - 第 2 页:
DESIGN.md校验详情,列出所有已验证的组件、动效、异常处理项,并标注代码中对应的文件行号; - 第 3 页:
IMPLEMENTATION校验结果(需配合--code-path参数),展示哪些设计项被代码 100% 实现,哪些存在 gap。
这份 PDF 不是截图,而是由 Puppeteer 渲染的、带数字签名的 PDF。签名密钥来自 GitHub Secrets,确保报告不可篡改。客户拿到后,可以用任意 PDF 阅读器验证签名有效性。我拿它去跟银行客户谈合同时,对方风控部门直接说:“这个比你们的测试报告更有说服力,因为它是从需求源头开始验证的。”
5. 常见问题与排查技巧实录:那些踩过的坑和独创的解法
5.1 问题:npx impeccable install失败,报错 “Cannot find module ‘playwright’”
这是网络热词里高频出现的问题,但根源常被误解。impeccable本身不依赖 Playwright,但report --format=pdf功能需要 Puppeteer(Playwright 的轻量替代)。当用户执行npx impeccable report时,impeccable会动态检查node_modules/puppeteer是否存在,若不存在,则尝试npm install puppeteer。而某些企业内网会拦截npm install的 registry 请求,导致失败。
排查思路:
- 先确认是否真的需要 PDF 报告:
npx impeccable report --format=html是纯前端渲染,无需 Puppeteer; - 若必须 PDF,检查网络:
curl -I https://registry.npmjs.org/puppeteer看是否返回 200; - 查看
npx impeccable的详细日志:加--verbose参数,会输出installing puppeteer...和具体的错误堆栈。
独家解法: 我们团队的解决方案是预装 + 环境变量隔离。在 CI 的 setup 步骤中,显式安装 Puppeteer:
- name: Setup Puppeteer run: npm install puppeteer@21.0.0 --no-save然后在impeccable命令前设置环境变量:
- name: Run Impeccable Report env: PUPPETEER_SKIP_DOWNLOAD: "true" # 跳过下载,用已安装版本 run: npx impeccable@1.3.0 report --format=pdfPUPPETEER_SKIP_DOWNLOAD=true是 Puppeteer 的官方环境变量,它会让impeccable直接使用node_modules/puppeteer,而不尝试下载。这个技巧让我们在离线环境中也能生成 PDF 报告。
5.2 问题:DESIGN.md中的 Mermaid 流程图解析失败,报错 “Unexpected token ‘graph’”
Mermaid 语法在不同版本间有差异。impeccable内置的解析器基于 Mermaid 10.x,但有些设计师用 Figma 插件导出的 Mermaid 是 8.x 语法(如graph LR而非graph TD)。
排查技巧: 运行npx impeccable check --section="交互流程" --verbose,它会输出解析器读取的原始 Mermaid 字符串。对比 Figma 导出的内容,常见差异有:
graph LRvsgraph TD(LR是从左到右,TD是从上到下,impeccable只支持TD)A[节点] --> B[节点]vsA --> B(impeccable要求显式声明节点标签)
实操心得: 我们不再让设计师手写 Mermaid,而是用一个 Chrome 插件Mermaid Live Editor。它支持实时预览,并有一个“兼容模式”按钮,一键将graph LR转为graph TD,将简写节点转为完整标签。插件地址是公开的,我们把它写进DESIGN.md的开头注释里:“请用 Mermaid Live Editor 编辑,开启兼容模式后复制代码”。
5.3 问题:PRODUCT.md中的成功标准表格被识别为普通表格,不触发校验
Markdown 表格解析对空格极其敏感。impeccable的正则要求表头行必须是| 指标 | 当前值 | 目标值 | 测量方式 |,前后不能有多余空格。如果设计师写成| 指标 | 当前值 | 目标值 | 测量方式 |(末尾多一个空格),正则就匹配失败。
避坑技巧: 我们在团队的 VS Code 设置中加了一条规则:
{ "files.trimTrailingWhitespace": true, "files.insertFinalNewline": true, "editor.formatOnSave": true, "markdown.extension.toc.levels": "2..4" }特别是files.trimTrailingWhitespace,它会在保存时自动删掉行尾空格。再配合 Prettier 的 Markdown 插件,所有表格都会被自动格式化为标准形态。这个小配置,让我们团队的PRODUCT.md校验失败率从 37% 降到 0%。
5.4 问题:impeccable audit执行超时,卡在 “Checking implementation consistency…”
audit命令会扫描整个代码库,提取 TypeScript interface、JSDoc、CSS class 名称,与DESIGN.md做匹配。如果代码库有 10 万行,且DESIGN.md定义了 200 个组件,这个过程可能耗时 2 分钟。
优化方案:impeccable提供了--changed-since参数,只校验 Git 变更的文件。在 CI 中,我们这样用:
- name: Audit Implementation run: npx impeccable@1.3.0 audit --changed-since=${{ github.event.pull_request.base.sha }}${{ github.event.pull_request.base.sha }}是 PR 基础分支的 commit hash,impeccable会用git diff --name-only获取本次 PR 修改的文件列表,只分析这些文件。实测下来,从 2 分钟降到 8 秒。
5.5 问题:设计师抱怨 “impeccable太严格,限制了创意发挥”
这是最根本的挑战。impeccable的设计初衷不是扼杀创意,而是把创意框定在“可验证”的范围内。我们解决这个问题的方法是:用--loose模式给创意留白。
impeccable所有check命令都支持--loose参数。例如:
npx impeccable check --section="视觉规范" --loose它会跳过所有“必须匹配”的校验(如颜色值必须是#007AFF),只做“建议匹配”(如颜色值是否在品牌色系内)。输出变成:
💡 DESIGN.md 视觉规范(宽松模式) - 按钮背景色:#007AFF(推荐值),当前为 #007BFF(可接受,色差 ΔE=2.1 < 5) - 字体大小:16px(推荐值),当前为 1rem(等效,但建议统一用 px)ΔE是色彩学中的色差公式,impeccable内置了 CIEDE2000 算法。设计师看到ΔE=2.1 < 5,就知道这个蓝色和品牌色几乎看不出区别,可以放心用。这种设计让impeccable从“警察”变成了“设计顾问”。
6. 工具链协同:impeccable如何与codex cli、zcode cli等共存
网络热词里codex cli、zcode cli、trae cli频繁出现,说明开发者正在构建自己的 CLI 工具矩阵。impeccable不是取代它们,而是成为它们的“质量底座”。我们团队的实践是:用impeccable定义“什么算好”,用其他 CLI 实现“怎么做好”。
6.1 与codex cli的协同:codex生成代码,impeccable验证质量
codex cli是一个代码生成工具,比如codex generate component Button会生成 React Button 组件的代码、测试、Storybook。但生成的代码是否符合DESIGN.md中的视觉规范?codex不管,这是impeccable的事。
我们在codex的 post-generation hook 中加入impeccable