视觉差异检测工具

DiffLens是一款为AI编程代理提供视觉差异检测的MCP服务器,通过比较UI更改前后的截图生成结构化差异报告。

  • by byzkhan
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 byzkhan/difflens

使用说明

DiffLens

MCP服务器,为AI编码代理提供UI工作的“眼睛”。它在代码更改前后对本地主机页面进行截图,直观地进行比较,并返回带有叠加图像的结构化差异报告。

快速开始

npm install -g difflens-cli
cd your-project
difflens setup
# Restart Claude Code — DiffLens is now active

DiffLens自动工作——只需正常发出UI请求。Claude将在更改前进行快照,并在更改后进行验证,无需您询问。

无需安装即可使用

添加到您的项目 .mcp.json:

{
  "mcpServers": {
    "difflens": {
      "command": "npx",
      "args": ["-y", "difflens-cli"]
    }
  }
}

运作原理

  1. 快照 保存基线屏幕截图的页面
  2. 对代码进行更改
  3. 检查 该页面--DiffLens获取一个新的屏幕截图,根据基线运行像素级差异,对更改的区域进行聚类,并返回一个带有注释的覆盖图像的报告

覆盖会使未更改的区域变暗,用红色突出显示更改的像素,在检测到的区域周围绘制边框,并包含一个带有更改百分比的图例栏。

从源代码安装

git clone https://github.com/byzkhan/difflens.git
cd difflens
npm install
npm run build

工具

快照

截取屏幕截图并将其保存为基线。

参数 类型 默认值 说明
url string 必填 截图URL
width 数字 1280 视口宽度
height 数字 720 视口高度
fullPage boolean true 捕获完整的可滚动页面
waitForSelector string -- 捕获前要等待的CSS选择器
waitForTimeout number -- 额外等待时间(毫秒)

检查

拍摄一张新的屏幕截图,并将其与最新基线(或特定快照)进行比较。返回结构化报告和叠加图像。

参数 类型 默认值 说明
url string 必填 要检查的URL
baselineId string latest 要比较的特定快照ID
width 数字 1280 视口宽度
height 数字 720 视口高度
fullPage boolean true 捕获完整的可滚动页面
waitForSelector string -- 要等待的CSS选择器
waitForTimeout number -- 额外等待时间(毫秒)

报告包括:

  • 状态: no_changes, minor (<1%), significant (<10%),或 major (>10%)
  • 百分比已更改:精确的像素变化百分比
  • 区域:带有位置描述和像素数的更改区域列表
  • 覆盖图像:带注释的复合显示了更改的内容

检查响应

在多个视口宽度下运行视觉差异,以捕捉响应式设计回归。

参数 类型 默认值 说明
url string 必填 要检查的URL
widths number[] [375、768、1024、1440] 要测试的视口宽度
height 数字 720 视口高度
fullPage boolean true 捕获完整的可滚动页面
waitForSelector string -- 要等待的CSS选择器
waitForTimeout number -- 额外等待时间(毫秒)

快照元素

通过CSS选择器对特定DOM元素进行截图。内联返回图像。

参数 类型 默认值 说明
url string 必填 包含元素的URL
selector string 必需 要捕获的CSS选择器
width 数字 1280 视口宽度
height 数字 720 视口高度
waitForSelector string -- 要等待的CSS选择器
waitForTimeout number -- 额外等待时间(毫秒)

list_snapshots

列出具有可选筛选功能的存储快照。

参数 类型 默认值 说明
url string -- 按URL筛选
limit number 20 最大结果

清理

按年龄或计数删除旧快照。

参数 类型 默认值 说明
maxAgeHours number -- 删除早于此的快照
maxCount number -- 最多保留这么多(最新的优先)
dryRun boolean false 预览而不删除

自动工作流

DiffLens包括 CLAUDE.md 文件和Claude Code挂钩,使视觉验证完全自动化。你不需要提到DiffLens——Claude自己就这么做了:

You:    Move the login button to the right side of the header
Agent:  [calls snapshot on localhost:3000 — saves baseline]
        [edits header CSS]
        [calls check — compares before/after]

        Done. Moved the login button to the right side of the header.
        Visual check confirmed: only the button position changed,
        no unintended layout shifts or regressions.

如果Claude检测到差异中的意外变化,它会自动修复这些变化并重新检查,直到结果干净为止。

引擎盖下的工作原理

  1. CLAUDE.md 指示Claude始终在UI编辑之前进行快照,并在编辑之后进行检查
  2. 克劳德代码挂钩 每次文件编辑时触发——如果文件是UI文件(.html、.css、.jsx、.tsx、.vue、.svelte、.scs),它们会提醒Claude进行快照/检查
  3. Claude阅读差异报告,修复任何回归,只有在验证了视觉输出后才会做出响应

手动使用

您还可以明确地使用DiffLens:

You:    Take a snapshot of http://localhost:3000
Agent:  [calls snapshot] Saved baseline abc123

You:    Check localhost:3000 for visual changes
Agent:  [calls check] 4.2% pixels changed — 2 regions detected
        [shows overlay image]

存储

所有数据都存储在本地 .difflens/:

  • .difflens/snapshots/ --PNG截图+JSON元数据
  • .difflens/diffs/ --差分图像和叠加合成

添加 .difflens/ 到你的 .gitignore.

实现细节

  • 浏览器重用剧作家Chromium推出一次并保持活力。每个屏幕截图都会创建一个独立的 BrowserContext (约200毫秒,而新浏览器约3秒)。
  • 确定性捕捉:在页面JS运行之前注入反动画CSS。动画、过渡和插入符号闪烁被禁用。时区锁定为UTC,区域设置为en-US。
  • 区域聚类:更改的像素被分组到10x10px的网格中,然后在50px的范围内合并附近的单元格。这将原始像素噪声转化为有意义的“标题更改”区域。
  • 原子写入:快照将写入 .tmp 然后重命名文件,防止并发访问造成损坏。
  • stdio安全:所有日志记录都会进入stderr。stdout保留用于MCP协议消息。

技术栈

许可证

麻省理工学院