库存 UI 审计
生成器和入门套件界面共享一种可识别的外观:靛蓝或紫罗兰强调色、紫色到蓝色的英雄区渐变、到处是 Inter 字体、磨砂玻璃卡片、导航栏中的表情符号。这些本身都没有错,问题是它们来自于模板而非产品。此技能通过静态扫描器找出这些选择,然后通过判断来分类。扫描器产生候选,只有分类才能产生发现。
此技能移除未被选中的默认值,它不会发明一个品牌。如果产品还没有视觉方向,请说明并询问一个方向,而不是用一种默认替换另一种。
扫描前
- 阅读需求文档、设计 Token 和主题或组件库配置。记录产品要求的所有颜色、字体和组件。即使扫描器标记了它们,这些也要保留。
- 根据请求确定模式:
- 审查(Review):仅报告发现,不编辑任何内容。
- 清理(Cleanup):修复已确认的发现,并且仅在用户指定的范围内(一个页面、一个组件文件夹、整个应用)。注意在范围外发现的问题,只报告而不修复。
- 选择扫描范围:渲染 UI 的源代码文件夹,而不是整个仓库。
运行扫描器
bun <此技能目录>/scripts/scan.mjs [--json] [--fail-on high|medium|low] <路径>...
Node 22 或更高版本也可以。它会遍历目录,跳过依赖、构建和覆盖率输出以及压缩文件,并读取 .html .css .scss .js .ts .jsx .tsx .vue .svelte .astro 文件。它会打印扫描的文件数。退出码 0 表示没有达到失败严重级别的匹配(默认为 high),1 表示有,2 表示用法错误或扫描了零个文件。2 绝不是干净的结果。当紫罗兰强调色、单个系统字体或表情符号图标应该使运行失败时,传递 --fail-on medium。除非被要求,否则不要将扫描器添加为 CI 门禁。
| 规则 | 严重级别 | 捕获的内容 |
|---|---|---|
purple-blue-gradient | high | 所有色阶均为冷色调且至少包含一种紫色的渐变,出现在 CSS 或 Tailwind 的 from-/to- 类中 |
violet-accent | medium | 任何计算出的色相位于靛蓝到紫色范围内的 hex、rgb、hsl、oklch 或裸 HSL 标记,以及 Tailwind 的 indigo/violet/purple 类 |
gradient-text | medium | background-clip: text 和 bg-clip-text |
single-stock-font | medium | 在扫描集的两个或更多声明中,仅有一种库存无衬线字体(Inter、Roboto、Poppins 等)被列为唯一命名字体 |
emoji-icon | medium | 标题、按钮、链接、导航项或 icon/label/title 字段中的表情符号 |
neon-glow | medium | 在饱和颜色上的零偏移宽模糊阴影,以及 Tailwind 有色阴影 |
frosted-glass | low | backdrop-filter: blur() 和 backdrop-blur |
library-default-token | low | 来自 Bootstrap、Material、MUI、Ant Design、Chakra、shadcn/ui 和 Vite 起始模板的未修改默认主色 |
tracked-caps | low | 宽字母间距的大写文本 |
字体规则会在一次运行中检查所有文件,因此请一起扫描整个 UI 范围;一次只扫描一个文件会隐藏它。
分类每个匹配
打开每个标记的行,阅读足够多的上下文以了解元素的作用。为每个匹配给出一个明确的结论:
- 未选择的默认(Unchosen default):需求文档、Token 或历史中没有要求它,并且它看起来像起始模板。这是一个发现。
- 故意选择(Deliberate choice):需求文档、Token 文件、品牌指南或提交信息显示有人选择了它。保留它并说明证据。
- 误报(False positive):匹配并非规则假设的那样,例如语法高亮主题中的紫色调、繁忙内容上的模态背景上的模糊、或用户生成示例数据中的表情符号。保留它并说明原因。
- 未解决(Unresolved):你无法判断是否有人选择了它。这不是一个发现,也不做任何更改。报告缺少什么以及能够解决这个问题的疑问。
修复真正的问题
- 修复原因,而不是代码行。五个紫色十六进制值通常意味着缺少一个强调色 Token;一次性定义产品的调色板和类型,并将组件指向它。
- 选择服务于内容的替换方案:能保持的对比度、能标记唯一重要操作的强调色、适合阅读负荷的类型。
- 永远不要仅仅为了避开扫描器的范围而微调值,例如将色相移动几度或将十六进制值替换为等效的
oklch()。如果颜色错了,就更改它;如果是对的,就保留它并记录原因。 - 永远不要为了通过扫描而更改品牌色、状态色(成功、警告、错误)或焦点指示器。这些带有含义;将它们记录为故意选择。
- 用项目现有的图标集替换表情符号图标。只有在用户同意的情况下才添加新的图标依赖。
扫描器看不到的内容
通过阅读渲染后的页面来检查这些,因为没有模式匹配能找到它们:
- 所有部分都由相同的居中标题、副标题和两个按钮构建而成
- 一个三卡片功能网格,每张卡片包含一个图标、标题和一行文本
- 位于主标题上方的小徽章或药丸形状
- 由粗的彩色左边框标记的卡片
- 包含大数字的统计横幅(如“10k+ 用户”、“99.9% 正常运行时间”)
- 编号为“1、2、3”的步骤部分
- 强制使用的深色主题,但没有需求文档要求的浅色选项
- 每个表面都有相同的大圆角和柔和阴影
- 忽略项目比例缩放的空格和字体大小
- 可以描述任何产品的文案
验证
- 对同一范围重新运行扫描器,并确认每个剩余匹配都有记录的结论。
- 在相关的尺寸(窄手机宽度和至少桌面宽度)下查看渲染后的 UI,以及产品提供的每个主题。
- 干净的扫描结果不说明可访问性、布局或整体质量。在你更改的任何内容上检查对比度和焦点状态。
如果你无法渲染 UI,请说明审查仅是静态的。
报告
按以下顺序编写报告:
- 扫描范围、扫描的文件数、模式以及扫描器的退出码。
- 已修复的发现(或在审查模式下,建议的发现),每个包含
文件:行号、规则以及替换内容。 - 保留为故意选择的匹配,每个附带其证据。
- 未解决的匹配,每个附带缺少的内容以及能够解决它的疑问。
- 误报,每个附带一行原因说明。
- 扫描器无法发现的问题(如果有找到)。
- 你如何验证:重新运行结果、查看的尺寸和主题,或“仅静态”。