运行时依赖
安装命令
点击复制技能文档
Redline 将 AI 生成的网页转换为"可批注文档",允许用户直接在网页元素上提反馈,就像在 Google Docs 上添加评论一样。核心架构:浏览器 ←(HTTP)→ 本地 server → 写 inbox 文件 → UserPromptSubmit hook 自动注入 → 模型 apply。用户只需点击一次"提交反馈",无需复制粘贴。
触发场景:用户已经生成了一个 HTML 文件,想要对其中某些元素提具体修改意见,用户明确说"标注 xxx.html"、"给这个网页加批注"、"/annotate"。注意:apply 阶段是 hook 自动触发的,模型不需要等用户说"应用反馈"。
主要流程:注入(Inject) 何时执行:用户要求"标注 <文件名>"或"给 <文件> 加批注"。 步骤: 确认目标 HTML 文件路径(默认就是最近生成的那个) 调用 injector.sh ,它会: 启动本地 server(127.0.0.1:7893,复用已有进程) 把 inject.css / inject.js / __RL_CONFIG__ 注入到 前 输出到 <原文件名>.annotated.html(不动原文件) 用 open 在默认浏览器打开 告诉用户:「已打开标注页面。点右上角"✏️ 标注模式"开始,标完点"📤 提交反馈",回来随便说一句话即可应用」 绝对不要: 改写原 HTML 文件 主动模拟 apply 阶段——它由 hook 自动触发
阶段 2:应用(Apply) 何时执行:hook 自动触发——当 cwd 下存在 .redline-inbox.json 时,UserPromptSubmit hook 会把它的内容塞进 additionalContext,并附带 apply 指令。模型不需要等用户显式说"应用"。 步骤: 读取 hook 注入的 inbox JSON 内容 读取 feedback-template.md 的渲染规则 用 Edit 修改 inbox.file 对应的源 HTML(不是 .annotated.html) 必须用 rm 删掉 inbox 文件,否则下一次 prompt 会重复触发
简明汇报:每条标注 ✓/✗/⚠ + 一行说明 冲突处理: 如果用户当前 prompt 和反馈无关,先问「检测到 N 条挂起反馈,先处理还是继续当前话题?」 多条反馈对同一元素冲突 → 以最后一条为准,但在汇报里指出
文件清单: injector.sh — 注入脚本,启 server + 注入资源 + 开浏览器 inject.js — 标注层逻辑(toolbar/popover/sidebar/fetch 提交) inject.css — 标注层样式 server.py — 本地 HTTP 接收端(POST /feedback → 写 inbox 文件) hook.sh — UserPromptSubmit hook(检测 inbox → 注入 additionalContext) feedback-template.md — JSON → 模型 prompt 的转换规则
安装 / 卸载 安装(自动配置软链接 + hook) cd /redline ./install.sh 卸载(移除软链接 + hook + 停 server) ./uninstall.sh install.sh 会自动完成: 创建 ~/.claude/skills/redline 软链接 向 ~/.claude/settings.json 添加 UserPromptSubmit hook 设置 脚本可执行权限 首次使用时 server 自动启动,无需手动运行。
标注 JSON 形态(inbox 内容) { "file": "output.html", "timestamp": "2026-05-21T10:30:00Z", "annotations": [ { "id": 1, "selector": "main > .hero > button.cta", "elementHTML": "立即购买", "elementText": "立即购买", "boundingBox": {"x": 480, "y": 320, "w": 120, "h": 40}, "comment": "颜色改成红的,再大 1.5 倍" } ] }
调试 看 server 日志:tail -f ~/.claude/redline/server.log 手动起 server:python3 server.py 7893 手动测 hook:CLAUDE_PROJECT_DIR=/path/to/project ./hook.sh(需先在该目录放一份 inbox) 杀 server:kill $(cat ~/.claude/redline/server.pid)