组件源检查(可选择加入)
恢复原始的HTML/CSS/GSAP上下文 编辑前的已知元素。这不是视频检查、屏幕截图、diff或受影响组件验证器。它将I002运行时/编译器来源方法与I003 hf拥有的服务边界结合起来。代理适配器不持有DOM或动画状态。
出版 @hyperframes/inspector。它不会修改共享安装,也不会在线束中注册自己。
开始
从这个结帐,与Bun和安装Chrome/无头外壳:
bun install --ignore-scripts
bun run --filter '@hyperframes/{parsers,lint,studio-server}' build
bun run build:hyperframes-runtime
# Optional when Chrome is not already under ~/.cache/hyperframes/chrome:
export HF_INSPECT_CHROME=/absolute/path/to/chrome
bun packages/inspector/src/server.ts /absolute/video/project
服务打印它的环回URL。开始时确实如此 不 启动浏览器。第一次检查加载项目一次。
包提供功能,而不是代理工具:一个工具定义它自己的工具名称、描述和模式,以及调用 POST /inspect 使用下面的JSON。该服务在启动时绑定到一个项目,因此不需要每个调用的项目路径。 GET /info 返回项目标识和启动/查询计数器。Stop with SIGINT/SIGTERM;服务处理自己的页面/浏览器。
输入
{
"targets": [
{ "selector": "#title" },
{ "selector": ".subtitle", "within": "#chapter-flow" },
{ "hfId": "hf-8e8x" },
{ "ref": "hfi:GENERATION:NUMBER" }
]
}
within是可选的。只有一个匹配成功;多个匹配返回候选项,而不是默默地返回第一个匹配。坏目标不会丢弃同一批中的有效目标。- Refs标识实际的元素,包括没有id的子元素,并在源更改、空闲释放或处置时过期。HF id可以跨组件实例重复;这些也会返回歧义。
- 默认情况下包括后代(最多1000个,带有显式截断标志)。
- 普通请求不查找、拍照、渲染帧或编码视频。
- 可选
time请求一个精确的HF搜索并报告玩家的时间/持续时间。它是用于故意的运行时探索,而不需要检查预定的动画代码。
输出
默认JSON的上限为12,000 UTF-8字节,包括元数据。每个片段的 id 命名它的文件及其开始和结束行(file:start-end); 一个片段也有它的种类, 未修改的完整源代码行,以及该块是否在文件中只出现一次。当查询指定多个目标时, targets 给出它所服务的输入目标索引。代码中不插入漂亮的打印或省略号。相邻/重叠块跨目标合并。
{
"generation": "...",
"results": [{ "target": 0, "status": "found", "animations": 4 }],
"snippets": [
{
"id": "scene.html:20-24",
"kind": ["animation creation"],
"targets": [0, 1],
"code": "the exact original source lines, including whitespace",
"uniqueInFile": true
}
]
}
本例省略了元数据。实现报告中的实际文件显示了完整的输出。
共享的助手只出现一次 查询 使用它们的目标。 coTargets 命名最多三个观察到的同一间间的附加DOM目标,优先考虑查询之外的元素,以及 coTargetsOmitted 计算剩下的;它不要求枚举对helper的所有单独调用。创建语句和授权调用方语句被映射;小的命名帮助函数是完整返回的。变量赋值不是堆栈/数据流历史记录。一个缺失的源源增量 unmappedAnimations,而不是猜测一个可编辑的位置。
HTML片段是唯一标识的授权开始标记(它们的完整源代码行);动态生成的标记可能没有生成的标记匹配。CSS是一种授权选择器候选扫描,而不是活动级联、媒体查询状态或继承样式的证明。特别是,在不同作用域场景样式中重用的类可以有多个候选源规则。
更大的结果
代码块是原子的。 omitted, omittedCount, nextOffset 描述丢失的积木。重复相同的目标与返回 generation 和 offset: nextOffset,或请求选定的id:
{ "targets": [], "generation": "RETURNED_GENERATION", "snippets": ["scene.html:20-24"] }
maxBytes 可以显式提高(2,048-256,000)。大于预算的块不会被切成两半:请求具有更大预算的ID或读取其文件/范围。因此,在预算增加之前,分页可以保持相同的偏移量。老一代的延续被拒绝。
的显式HTTP请求才能获得完整的运行时证据 debug: true;它故意不作为默认请求或其输出预算的一部分。
时间轴
POST /timeline 回答在同一浏览器、页面和生成时调度哪些动画 /inspect。它从不查找、渲染或编辑文件。
{ "component": { "selector": "#title" }, "boundary": 7.9 }
component 是可选的,并且像 /inspect 目标;对于每一个已注册的HF时间轴忽略它。最多给一个 at, range: [start, end] 或者 boundary,以全球秒为单位;在进度概述中省略这三个部分。结果是按组件分组的短文本,包含事件时间、目标、属性和源位置; generation 和 offset 浏览它们。覆盖范围仅为注册dom -目标GSAP动画和显式HF项目;任何超出这一范围或超过扩张限制的内容都将被报告为不完整覆盖,而不是猜测。
元素映射
POST /element-map 返回来自同一页面的组合元素映射。它不读取查询字段。一个没有 index.html 答案 404 { "error": "no-composition", "code": "no-composition" }.
错误
每次拒绝都是JSON { "error", "code" }. code 是稳定令牌(no-composition, stale_generation, source_changed_during_query, request_too_large); 没有标记的句子是 invalid_request。缺少的浏览器是 503 browser_unavailable,而意外的失败是 500 internal_error。导入模块不会监听; createInspectorServer(project) 构建一个。一条未知的路线是 404 { "error": "not_found", "code": "not_found" }. GET /info 增加了 version,此软件包的版本。进程监听 127.0.0.1 并拒绝 Host 这不是环回,因此重新绑定请求不能读取项目路径。使用以下包安装服务器: hyperframes-inspector <project> [port],或者 node dist/server.js.
生命周期和开销
一个懒惰的浏览器,每个项目服务一个不可变的绑定页面。Warm查询重用这两者。源HTML/JS/CSS/JSON是内容散列的;更改会关闭旧页面并创建一个新页面,从而重用浏览器。业务对请求进行序列化,查询完成后重新检查源指纹。没有工作室的热补丁或旧的时间线对象在重建中幸存下来。两分钟空闲时间释放页面和浏览器。仅更改媒体字节不属于源上下文无效机制的一部分。
GSAP钩子是在编写页面脚本之前安装的。它们只存在于检查页面中,而不是正常的Studio、检查或呈现路径中。运行时记录的上限为20,000条。正常高频输出中不注入记录仪。未执行的回调创建的动画,原始构造函数,其他动画系统,iframe内容和删除的动画不在覆盖范围内。显式时间查询可以执行回调;它不能证明所有未来的道路都被覆盖了。
验证
bun run --filter @hyperframes/inspector test
bunx tsc -p packages/inspector/tsconfig.json --noEmit
bun packages/inspector/tests/browser.ts /absolute/path/to/gsap.min.js
bun packages/inspector/tests/lifecycle.ts /absolute/path/to/gsap.min.js
bun packages/inspector/tests/transport.ts /absolute/path/to/Rowan-film
bun packages/inspector/tests/film.ts /absolute/path/to/Rowan-film /tmp/film-inspection.json
浏览器测试生成一次性固定装置。电影审计在剪辑前将源/资产复制到临时项目中;它从不编辑提供的原件。它检查固定帧奇偶性、精确源片段、页面替换、浏览器重用和播放器时间/持续时间。这是工程验证,而不是额外的付费代理A/B或证明的令牌/成本效益。