ANNOTAI
让 AI 看见你
在说哪个元素
在浏览器里框选元素,复制带 file:line:col 的 Markdown 交给 AI,或按住 Alt+Shift 点击跳转到编辑器中的源码
快速开始
npm install -D annotai
为什么用 annotai
把「那个蓝色的按钮」翻译成 AI 和编辑器都能精确定位的源码坐标
框选标注
拖拽即选,自动解析到组件源码位置,不用手写选择器
明文位置
每个元素带 data-annotai-path,DevTools 里直接可读
复制 Markdown
把标注整理成结构化问题清单,粘贴给任何 AI 工具即可
编辑器跳转
Alt+Shift 点击直达编辑器中的源码行列
快速开始
三步接入,dev 服务即开即用
1
安装
npm install -D annotai
2
接入 Vite
// pnpm add -D @vitejs/plugin-react
import react from '@vitejs/plugin-react'
import { annotate } from 'annotai/vite'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [annotate(), react()],
})3
框选、复制、跳转
pnpm dev
# 页面右下角打开面板 → 框选元素 → 备注问题
# 复制 Markdown 交给 AI,或 Alt+Shift 点击跳转到编辑器全部配置
均可省略,默认值开箱即用;按需覆盖即可
| 配置 | 默认 | 说明 |
|---|---|---|
| editor | 自动发现 | 跳转编辑器:默认自动发现 Neovim,无实例时回退运行中的 IDE;open 钩子可接任意编辑器 |
| hotKeys | ['altKey', 'shiftKey'] | 打开编辑器的修饰键组合,可选 altKey / shiftKey / ctrlKey / metaKey;空数组关闭 |
| hoverPreview | true | 悬停源码预览;对象形式可调卡片宽度与行数 |
| locale | 'en' | 界面与 Markdown 导出语言 |
| surroundingLines | 4 | 源码片段上下各附带的行数(0–100) |
| context | 4 开 1 关 | Markdown 字段开关:位置、片段、类名、文本默认开启,DOM 路径关闭 |
| animation | true | 面板与高亮交互动画;系统减少动态效果偏好优先 |
| theme | 内置 | 面板淡出透明度与任意 --sn-* CSS 变量覆盖 |
| formatCopy | 内置 | 浏览器端自定义剪贴板内容;函数以源码内联,须自包含 |
| onCopy | — | Node 侧复制钩子:收到最终 Markdown 与全部标注,可派发给 agent 改代码;异步执行不阻塞浏览器 |
| maxBodyBytes | 2 MB | 源码服务单个请求体上限(字节) |
| projectRoot | workspace root | Markdown 相对路径基准,不扩大可读取目录 |
| allowedRoots | [vite.root] | 可处理源码的目录,符号链接按真实路径校验 |
| transforms | [reactTransform] | 语法适配器,按顺序取第一个支持当前文件的;Vue / Solid 换内置对应转换器 |
| client | true | 是否注入浏览器工具栏 |
两个复制钩子
浏览器端改写剪贴板内容,Node 端接住每次复制
annotate({
// 浏览器端:自定义剪贴板内容(函数以源码内联,须自包含)
formatCopy: ({ annotations, fields }) => annotations.map((a) => a.question).join('\n'),
// Node 端:复制后把上下文派发给 agent 改代码
onCopy: ({ markdown }) => {
spawn('pi', ['-p', markdown], { stdio: 'inherit' })
},
})常见问题
支持哪些前端框架?
React、Vue 3、Solid
生产构建会注入标注属性吗?
不会。属性注入与源码服务仅在 dev / preview 启用,build 产物零残留
HMR 之后旧标注还能用吗?
文件变动后,旧标注会提示重新框选,不会指向错误的源码