ai-ui-issue-pack:把 UI 问题「说给 AI 听」

04/20/2026

背景

AI coding 这两年最大的变化,不是“AI 会不会写代码”,而是“你能不能把问题描述清楚”。
尤其是前端 UI 问题:它发生在浏览器里,但要改的是代码仓库里的一坨组件/样式/状态/路由。

我们日常提 UI 问题,通常是这样:

  • 截图圈一下:这里不对
  • 说一句:在某某页面右上角
  • 再补一句:按钮样式怪怪的

然后就开始了经典流程:

  • AI/同事追问:哪个路由?哪个环境?哪个元素?有没有多个同名按钮?
  • 你补充 DOM、补充 className、补充样式、补充复现路径
  • 来回几轮之后,终于能开始改

说白了:痛点不在“怎么改”,而在“改哪儿”。

主要目标

既然人类描述 UI 位置这么痛苦,那就别描述了——直接引用它。

ai-ui-issue-pack 做的事情很简单:

  • 在浏览器里做一个插件(实现思路可以参考我之前的 frontend-e2e-test:同样是“在页面上交互 → 生成可消费的数据/脚本”)
  • 让用户在页面上选择某个/些 element,给它们加注释
  • 最后生成一个结构化的数据包,让 AI 可以直接定位并改代码

为什么要做(why)

AI 现在的能力其实够用了,缺的是“上下文输入的颗粒度”。

UI 问题如果只用自然语言描述,会天然丢失三类关键信息:

  • 位置上下文:到底是哪个页面、哪个路由、哪个模块、哪个状态下出现
  • 结构上下文:这个元素在 DOM tree 里是谁的孩子、附近有哪些兄弟节点、它的选择器是什么
  • 样式上下文(可选但很关键):你看到的样式来自哪里(组件自身、CSS Module、全局样式、主题变量、覆盖顺序)

而这三类信息,如果靠人手工写出来……那不就是在写一个半吊子的测试用例/调试日志吗?

所以我干脆让插件帮我把这些信息采出来。

工作流

1)选择元素

进入页面后,打开插件,进入“选择模式”。

  • hover 高亮当前元素
  • 点击选中元素(支持多选)
  • 支持一些快捷操作(比如切到父节点)来避免选到 icon/text 这种不稳定目标

2)添加注释

对每个选中的元素写注释。

注释建议写三件事就够了:

  • 现状是什么(现在看起来怎样)
  • 期望是什么(改成怎样)
  • 约束是什么(不能影响哪些地方/哪些状态)

3)生成 issue pack

插件会打包出一份结构化数据,大致包含:

  • 页面路由(route / url)
  • 完整的 document tree(用于还原上下文与定位)
  • 选中的 element 列表(定位信息 + 注释)
  • element 的样式信息(可选,按需采集)

示意结构如下(仅示意,字段可按你们项目实际调整):

{
  "route": "/settings/profile",
  "url": "https://example.com/settings/profile",
  "documentTree": { "type": "document", "children": [] },
  "elements": [
    {
      "locator": {
        "testid": "profile-page--save-btn",
        "cssPath": "div.xxx > button.yyy",
        "text": "保存"
      },
      "annotation": "按钮在禁用态仍然是主色,期望禁用态变浅灰,并且 hover 不要变色。",
      "styles": {
        "computed": { "color": "rgb(255, 255, 255)", "backgroundColor": "rgb(22, 119, 255)" }
      }
    }
  ]
}

两种使用方式:本地开发 / 线上测试

本地开发

本地开发最爽的点是:这份数据可以直接作为 AI 的输入

你不用再去手工解释:

  • 在哪个页面
  • 点哪个按钮
  • DOM 在哪里
  • 样式为什么长这样

AI 拿到 pack 以后,基本就可以直接进入“修改代码”阶段。

线上测试

线上测试的典型场景是:发现问题的人不是修问题的人。

所以插件支持“提交”:

  • 通知到前端群里(第一时间让相关人看到)
  • 生成飞书任务(多维表格 item)(把问题任务化、可追踪)

这一步的关键不是“又多了个提 bug 的入口”,而是:

提交的不再是“模糊描述 + 一张截图”,而是“可以被 AI/工程师复现与定位的结构化上下文”。

AI 为什么能因此直接改代码

如果只给 AI 一句“这里不对”,AI 就只能用问答把缺失的信息补齐。
而 issue pack 把关键上下文一次性给够之后,AI 的行为会明显变化:

  • 定位更快:通过 route + tree + locator,迅速缩小到具体组件/样式入口
  • 推理更稳:有 DOM 上下文,不容易改错“同名元素/相似按钮”
  • 样式修改更靠谱:有 computed style(可选),更容易判断覆盖来源与优先级

最终效果就是:从“来回描述定位”变成“直接进入修改”。

小结

ai-ui-issue-pack 本质上是在做一件事:把 UI 问题的沟通对象从“人类语言”切换成“机器可消费的数据”。

以前我们和 AI 的主要摩擦是:

  • 你:帮我改一下这个按钮
  • AI:哪个按钮?

现在是:

  • 你:给你这个 pack,里面已经包含 route、tree、element、(可选)样式和注释
  • AI:OK,我直接去改代码

这就是它解决的核心痛点:要去和 AI 描述“在哪个地方”的成本,几乎被降到了 0。