yunti-browser-runtime 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,820 @@
1
+ # 0.2.0 发布清单
2
+
3
+ 本文档说明 `yunti-browser-runtime@0.2.0` 相比首个公开版本 `0.1.0`
4
+ 新增了什么、改善了什么、保留了什么,以及发布前后需要检查什么。
5
+
6
+ 这份清单故意写得比较细。目标是让后续发布、对外介绍、Agent 接力开发和上下文压缩恢复时,
7
+ 都能清楚看到 `0.2.0` 的真实价值,而不是只看到一串 commit。
8
+
9
+ ## 一句话总结
10
+
11
+ `0.1.0` 证明了 Yunti Browser Runtime 的本地 MCP 浏览器运行时架构:
12
+
13
+ - MCP stdio server 给 Agent 暴露 `yunti_*` 工具;
14
+ - 本地 bridge 连接 MCP server 和浏览器扩展;
15
+ - Chrome/Edge unpacked extension 在用户真实浏览器里执行动作;
16
+ - CLI 提供 `mcp`、`bridge`、`doctor`、`print-config`、`package-extension`;
17
+ - 发布脚本覆盖 metadata、npm package、extension zip、CLI smoke、doctor smoke
18
+ 和 npm publish 流程。
19
+
20
+ `0.2.0` 则把这个 MVP 推进成更像“可稳定使用的浏览器自动化操作层”:
21
+
22
+ ```text
23
+ 列出页面 -> 观察页面 -> 使用新鲜 uid 执行动作 -> 读取结构化结果
24
+ -> 等待或再次观察 -> 验证结果
25
+ ```
26
+
27
+ 这次版本的核心不是单个新工具,而是完整的 Agent 浏览器操作闭环。
28
+
29
+ ## 方向没有偏移
30
+
31
+ `0.2.0` 吸收了 Page Agent / browser-use 这类项目里值得学习的“观察、定位、动作、验证”
32
+ 思想,但没有把 Yunti 改成另一个项目。
33
+
34
+ Yunti 继续坚持自己的特色:
35
+
36
+ - MCP-native,优先服务已经支持 MCP 的 Agent;
37
+ - local-first,默认跑在用户本机;
38
+ - 操作用户自己的 Chrome/Edge,而不是远端托管浏览器;
39
+ - 保留细粒度 `yunti_*` 工具,而不是只暴露一个黑盒 task runner;
40
+ - 保留 CDP、截图、网络、控制台、文件上传、tab/page 管理等底层能力;
41
+ - 不要求远程服务器、平台账号或强制 hub 页面;
42
+ - npm/unpacked extension 路径保持可用,浏览器商店权限 UX 单独后置。
43
+
44
+ ## 0.1.0 基线
45
+
46
+ `0.1.0` 已经具备这些能力:
47
+
48
+ - 发布到官方 npm registry;
49
+ - 项目具备 npm package metadata;
50
+ - 具备 `yunti-browser-runtime` CLI;
51
+ - MCP server 可以注册浏览器工具;
52
+ - local bridge 可以和扩展通信;
53
+ - extension 可以注册 `http` / `https` 页面;
54
+ - 可以读取浏览器 target、页面 snapshot、网络日志、控制台日志;
55
+ - 可以执行点击、输入、滚动、拖拽、文件上传、CDP 等基础操作;
56
+ - `doctor` 可以输出 JSON 和人类可读诊断;
57
+ - `print-config` 可以输出 Codex、Claude Code、Cursor、Cline 的 MCP 配置;
58
+ - release gate 可以检查公开文档残留、JS 语法、测试、npm pack、extension zip;
59
+ - 可选真实浏览器 E2E 存在,但不是默认测试必跑项;
60
+ - extension popup 可以保存 bridge URL、token 和页面匹配配置。
61
+
62
+ `0.2.0` 的工作是在这个基础上增强易用性、动作可靠性、恢复能力、安全边界、文档和发布门禁。
63
+
64
+ ## 用户安装体验改善
65
+
66
+ ### 默认本地不再需要 token
67
+
68
+ `0.1.0` 的正常本地路径里,bridge token 的存在感比较强,用户容易误以为必须配置 token
69
+ 才能使用。
70
+
71
+ `0.2.0` 调整为:
72
+
73
+ - 默认 bridge 地址仍是 `http://127.0.0.1:48887`;
74
+ - 默认 loopback 本地访问不需要 token;
75
+ - 仍支持显式配置 `YUNTI_BROWSER_BRIDGE_TOKEN` 做本机加固;
76
+ - 绑定非 loopback host 时仍强制要求 token;
77
+ - `doctor`、README、INSTALL、skill 文案都强调默认本地安装无需 token。
78
+
79
+ 实际效果:
80
+
81
+ - 用户不需要理解 token 才能开始使用;
82
+ - Agent 不应该在默认本地安装路径里反复要求用户填 token;
83
+ - 安全加固路径没有被删除,只是从默认路径里移出。
84
+
85
+ ### MCP 启动路径更自然
86
+
87
+ `0.2.0` 强调通过 MCP server 进入:
88
+
89
+ - Agent 接入 MCP 后通常会自动启动或复用本地 bridge;
90
+ - 用户一般不需要先手动运行 `yunti-browser-runtime bridge`;
91
+ - 只有 `doctor` 明确提示 bridge 未运行时,才引导用户单独启动 bridge;
92
+ - README 里的复制给 Agent 的安装引导已经按这个逻辑更新。
93
+
94
+ 这减少了“先开 bridge、再配 extension、再填 token”的心智负担。
95
+
96
+ ### Extension popup 从配置页变成状态面板
97
+
98
+ `0.1.0` 的 extension popup 更像配置入口。
99
+
100
+ `0.2.0` 改善为:
101
+
102
+ - popup 首屏是零配置状态面板;
103
+ - bridge URL、page match、optional token 放入高级设置;
104
+ - 默认加载扩展、刷新任意 `http` / `https` 页面即可连接;
105
+ - 不需要打开 popup、不需要保存设置、不需要填 token;
106
+ - popup 仍可用于高级调试和自定义配置。
107
+
108
+ ### 可复制给 Agent 的安装提示词
109
+
110
+ `0.2.0` 在 README 中沉淀了一段可直接复制给 Agent 的安装引导,要求 Agent:
111
+
112
+ - 检查 Node.js 22+;
113
+ - 安装 `npm install -g yunti-browser-runtime`;
114
+ - 执行 `print-config`;
115
+ - 把 MCP 配置加入当前 Agent;
116
+ - 明确说明 MCP 通常自动启动 bridge;
117
+ - 引导用户手动加载 Chrome/Edge unpacked extension;
118
+ - 明确默认 bridge URL 和默认无需 token;
119
+ - 执行 `doctor`;
120
+ - 调用 `yunti_list_browser_targets` 或 `yunti_get_tool_usage_hints` 验证。
121
+
122
+ 这对传播非常关键:用户可以把一段话给任意 Agent,让 Agent 带着他完成安装。
123
+
124
+ ## Agent 配置增强
125
+
126
+ `0.1.0` 已经支持多 Agent 配置输出。
127
+
128
+ `0.2.0` 继续强化:
129
+
130
+ - `print-config` 支持 Codex、Claude Code、Cursor、Cline;
131
+ - `release:check` 对 4 个 Agent 的配置输出做 smoke check;
132
+ - 文档明确 MCP server 是默认入口;
133
+ - skill 安装路径和使用方式更清楚;
134
+ - 安装文档避免把 bridge token 误导成必填项。
135
+
136
+ ## 浏览器操作层增强
137
+
138
+ ### 新增 `yunti_observe_page`
139
+
140
+ 这是 `0.2.0` 最重要的新能力。
141
+
142
+ `0.1.0` 有 snapshot 和直接动作,但缺少一个稳定的“先观察页面再行动”的工具契约。
143
+
144
+ `0.2.0` 新增 `yunti_observe_page`,给 Agent 返回:
145
+
146
+ - 当前页面可操作元素;
147
+ - 新鲜 uid;
148
+ - 紧凑 text tree;
149
+ - 页面滚动状态;
150
+ - nested scrollable containers;
151
+ - input / textarea / select / contenteditable 的字段状态;
152
+ - select 当前选项和可选项摘要;
153
+ - DOM 脱敏元数据;
154
+ - 足够让 Agent 决策下一步动作的结构化页面状态。
155
+
156
+ 这让 Agent 不再只靠猜 selector、猜坐标或看截图,而是可以先理解页面,再行动。
157
+
158
+ ### Fresh uid 操作闭环
159
+
160
+ `0.2.0` 把 observe 产生的 uid 接入动作工具:
161
+
162
+ - `yunti_click` 支持 observe uid;
163
+ - `yunti_hover` 支持 observe uid;
164
+ - `yunti_fill` 支持 observe uid;
165
+ - `yunti_select` 支持 observe uid;
166
+ - `yunti_scroll` 支持 scrollable container uid;
167
+ - `yunti_type_text`、`yunti_press_key`、`yunti_upload_file` 等动作遵循结构化结果契约;
168
+ - stale uid / missing uid 会引导 Agent 重新 observe 或 snapshot。
169
+
170
+ 推荐流程变成:
171
+
172
+ ```text
173
+ yunti_observe_page
174
+ -> 选择新鲜 uid
175
+ -> yunti_click / yunti_fill / yunti_select / yunti_scroll
176
+ -> 读取 ok/code/recoveryHint/nextStepHint
177
+ -> yunti_observe_page
178
+ -> 验证结果
179
+ ```
180
+
181
+ 这就是 `0.2.0` 从“能操作浏览器”到“更稳定地操作浏览器”的关键跃迁。
182
+
183
+ ### 新增 `yunti_select`
184
+
185
+ `0.1.0` 没有一等的 select 操作路径。
186
+
187
+ `0.2.0` 增加:
188
+
189
+ - 通过 uid + value 选择;
190
+ - 通过 uid + visible text 选择;
191
+ - selector fallback;
192
+ - 返回 selected index/value/text;
193
+ - option miss 时返回可用 value/text 摘要;
194
+ - disabled option 有明确诊断;
195
+ - 非 select 目标有明确诊断。
196
+
197
+ 这对真实表单、动态下拉框、配置页面非常有用。
198
+
199
+ ### 新增 `yunti_fill_form`
200
+
201
+ `0.2.0` 增加批量填表能力:
202
+
203
+ - 返回整体 filled / failed;
204
+ - 每个字段都有独立 result;
205
+ - 失败字段携带结构化诊断;
206
+ - 保留已有兼容字段;
207
+ - 适合多字段表单一次性填写后再检查失败项。
208
+
209
+ ### 新增 `yunti_wait_for`
210
+
211
+ `0.1.0` 对异步 UI 的处理更多依赖 Agent 自己猜时机。
212
+
213
+ `0.2.0` 增加 `yunti_wait_for`:
214
+
215
+ - 等待 text;
216
+ - 等待 selector;
217
+ - 等待 URL 包含某段内容;
218
+ - 成功时返回结构化成功结果;
219
+ - 超时时返回 `WAIT_TIMEOUT`;
220
+ - 超时被标记为 recoverable;
221
+ - 明确提示 Agent 先 observe 当前状态,再调整条件或重试。
222
+
223
+ 适用场景:
224
+
225
+ - 前端异步渲染;
226
+ - 表单校验;
227
+ - loading 后出现结果;
228
+ - 动态 option 加载;
229
+ - 页面跳转;
230
+ - infinite scroll。
231
+
232
+ ### 页面和 tab 工作流增强
233
+
234
+ `0.2.0` 强化页面路由:
235
+
236
+ - `yunti_list_pages` 作为 live target inventory 的兼容别名保留;
237
+ - `yunti_select_page` 可切换当前注册页面路由;
238
+ - `yunti_navigate_page` 支持 reload/back 等导航;
239
+ - stale session 错误包含恢复提示;
240
+ - 文档明确 `browserSessionId` 与 raw `targetId` / `tabId` 的区别;
241
+ - CDP 操作继续通过 `yunti_cdp_send_command`。
242
+
243
+ 这样可以减少 Agent 把 raw tab id 当成 Yunti page route 的错误。
244
+
245
+ ## 结构化动作结果
246
+
247
+ ### 新增统一结果字段
248
+
249
+ `0.1.0` 的动作结果更多是动作特定字段,例如:
250
+
251
+ - `clicked`;
252
+ - `filled`;
253
+ - `scrolled`;
254
+ - `browserSessionId`;
255
+ - `selector`;
256
+ - `uid`;
257
+ - `before`;
258
+ - `after`。
259
+
260
+ `0.2.0` 在保留这些兼容字段的基础上,新增结构化字段:
261
+
262
+ - `action`;
263
+ - `target`;
264
+ - `ok`;
265
+ - `code`;
266
+ - `recoverable`;
267
+ - `recoveryHint`;
268
+ - `nextStepHint`;
269
+ - 更具体的 before/after 摘要。
270
+
271
+ 这让 Agent 可以按统一方式判断:
272
+
273
+ - 动作是否真正成功;
274
+ - 失败是否可恢复;
275
+ - 下一步该 observe、wait、scroll、换 uid、换 selector,还是询问用户。
276
+
277
+ ### 覆盖的动作矩阵
278
+
279
+ `0.2.0` 的动作结果覆盖矩阵包括 11 类工具:
280
+
281
+ - `yunti_click`;
282
+ - `yunti_hover`;
283
+ - `yunti_fill`;
284
+ - `yunti_select`;
285
+ - `yunti_fill_form`;
286
+ - `yunti_wait_for`;
287
+ - `yunti_scroll`;
288
+ - `yunti_type_text`;
289
+ - `yunti_press_key`;
290
+ - `yunti_upload_file`;
291
+ - `yunti_drag`。
292
+
293
+ 新增 `docs/ACTION_RESULT_COVERAGE.md`,并通过
294
+ `npm run check:action-results` 加入 release gate,避免以后改动时无意破坏结果契约。
295
+
296
+ ### 点击和 hover 的改善
297
+
298
+ `0.2.0` 改善:
299
+
300
+ - uid click;
301
+ - coordinate click;
302
+ - selector click;
303
+ - uid hover;
304
+ - coordinate hover;
305
+ - selector hover;
306
+ - stale uid 诊断;
307
+ - missing uid 诊断;
308
+ - selector/content-script 失败诊断。
309
+
310
+ Agent 不再只知道“失败了”,还能知道下一步应该重新 observe、换定位方式或检查页面状态。
311
+
312
+ ### fill 的改善
313
+
314
+ `0.2.0` 对 fill 做了大量实际网页场景增强:
315
+
316
+ - uid keyboard fill;
317
+ - uid select fill;
318
+ - uid contenteditable fill;
319
+ - selector fill;
320
+ - non-editable target 诊断;
321
+ - hidden/disabled/readonly 诊断;
322
+ - option miss 诊断;
323
+ - value not applied 诊断;
324
+ - contenteditable 返回 method 和文本长度摘要;
325
+ - `yunti_fill_form` 内部保留每个字段的结构化失败结果。
326
+
327
+ 重要诊断包括:
328
+
329
+ - `TARGET_NOT_EDITABLE`;
330
+ - `VALUE_NOT_APPLIED`;
331
+ - stale uid;
332
+ - missing uid;
333
+ - option miss;
334
+ - disabled option;
335
+ - readonly/disabled/hidden field。
336
+
337
+ 这对 React/Vue 受控输入、masked input、contenteditable 编辑器、带校验的表单很关键。
338
+
339
+ ### select 的改善
340
+
341
+ `0.2.0` 支持:
342
+
343
+ - uid value path;
344
+ - uid visible text path;
345
+ - selector path;
346
+ - option miss recovery;
347
+ - disabled option recovery;
348
+ - non-select target recovery;
349
+ - 返回可用 option 摘要。
350
+
351
+ Agent 可以先看 observe 里的 options,再用正确 value/text 选择,而不是乱猜。
352
+
353
+ ### scroll 的改善
354
+
355
+ `0.2.0` 把滚动从“发起滚动”升级成“可诊断滚动”:
356
+
357
+ - document scroll;
358
+ - uid container scroll;
359
+ - coordinate container scroll;
360
+ - coordinate document fallback;
361
+ - `moved` 状态;
362
+ - no movement 诊断;
363
+ - edge hint;
364
+ - partial movement;
365
+ - nested panel recovery;
366
+ - observe 提供 `scrollableContainers[]`。
367
+
368
+ 这解决很多真实页面问题:
369
+
370
+ - 弹窗内部滚动;
371
+ - 侧边栏滚动;
372
+ - 表格容器滚动;
373
+ - 无限列表;
374
+ - document 不动但内部 panel 能滚的页面。
375
+
376
+ ### wait 的改善
377
+
378
+ `0.2.0` 让等待结果可恢复:
379
+
380
+ - 成功保留兼容字段;
381
+ - 超时返回 `ok: false`;
382
+ - 超时返回 `code: "WAIT_TIMEOUT"`;
383
+ - 超时标记为 recoverable;
384
+ - 提醒 Agent observe 当前状态后再调整条件。
385
+
386
+ 这比盲目 sleep 或重复同一个 wait 更可靠。
387
+
388
+ ## DOM 观察和脱敏
389
+
390
+ ### 新增 DOM observer
391
+
392
+ `0.2.0` 新增 `extension/dom-observer.js`。
393
+
394
+ 它负责:
395
+
396
+ - 提取可见元素;
397
+ - 分配 fresh uid;
398
+ - 生成 compact text tree;
399
+ - 过滤 hidden/offscreen 元素;
400
+ - 识别滚动元数据;
401
+ - 识别 scrollable containers;
402
+ - 提取 field state;
403
+ - 提取 select option 摘要;
404
+ - 执行 balanced / strict 脱敏。
405
+
406
+ ### 字段状态提示
407
+
408
+ observe 结果现在能告诉 Agent:
409
+
410
+ - 是否 editable;
411
+ - 是否 fillable;
412
+ - 是否 readOnly;
413
+ - 是否 disabled;
414
+ - 为什么不能 fill;
415
+ - 当前值或摘要;
416
+ - placeholder 或 label 摘要。
417
+
418
+ 这样 Agent 可以判断是应该填写、等待、先点击解锁、换控件,还是询问用户。
419
+
420
+ ### select 状态提示
421
+
422
+ observe 结果现在能告诉 Agent:
423
+
424
+ - selected index;
425
+ - selected value;
426
+ - selected text;
427
+ - options 摘要。
428
+
429
+ 这直接支持 `yunti_select` 的 value/text 路径。
430
+
431
+ ### 更强 DOM 脱敏
432
+
433
+ `0.2.0` 加强 DOM 观察脱敏:
434
+
435
+ - balanced 默认隐藏 credential-like values;
436
+ - strict 进一步隐藏可能的邮箱、手机号、Luhn-valid 卡号、地址类文本、标题、label、
437
+ name、visible text、placeholder、value、select option text;
438
+ - DOM observer 测试覆盖脱敏边界;
439
+ - 文档提醒截图像素不属于 DOM 脱敏范围,Agent 需要谨慎处理 screenshot。
440
+
441
+ ## 网络、控制台、CDP、记忆安全
442
+
443
+ ### 网络诊断改善
444
+
445
+ `0.2.0` 保留并增强网络诊断:
446
+
447
+ - list network requests;
448
+ - get single network request by id;
449
+ - clear network observations;
450
+ - 按 session/user scope 隔离;
451
+ - 网络观察缓存前脱敏;
452
+ - raw CDP events 与 sanitized network observations 分开。
453
+
454
+ ### 控制台诊断改善
455
+
456
+ `0.2.0` 改善 console 工具:
457
+
458
+ - list console messages;
459
+ - get console message by msgid;
460
+ - clear console messages;
461
+ - console messages 按 session/user scope 隔离;
462
+ - 缓存前脱敏;
463
+ - allSessions 诊断不越权暴露其它用户。
464
+
465
+ ### CDP 边界更清楚
466
+
467
+ `0.2.0` 文档和 tool hints 强调:
468
+
469
+ - CDP method 不能当 shell 命令执行;
470
+ - 必须通过 `yunti_cdp_send_command`;
471
+ - `params` 必须是 object;
472
+ - `Target.activateTarget`、`Target.closeTarget` 等要区分 raw target/tab 和
473
+ Yunti `browserSessionId`;
474
+ - raw CDP diagnostics 属于调试面,使用后应清理。
475
+
476
+ ### learning memory 更安全
477
+
478
+ `0.2.0` 保留本地学习记忆,并加强边界:
479
+
480
+ - 默认使用 local user scope;
481
+ - 默认存放在 Yunti agent home;
482
+ - 写入前脱敏 likely secrets 和 PII-like values;
483
+ - 文档提醒不要存储 raw payload、cookie、auth header、private key、payment data、
484
+ personal contact details。
485
+
486
+ ## 可选本地运行时控制台
487
+
488
+ ### 新增 `yunti-browser-runtime console`
489
+
490
+ `0.2.0` 新增可选本地控制台:
491
+
492
+ ```bash
493
+ yunti-browser-runtime console
494
+ ```
495
+
496
+ 访问:
497
+
498
+ ```text
499
+ http://127.0.0.1:48887/console
500
+ ```
501
+
502
+ 它不是必需的 hub,也不会改变 Agent 的 MCP 使用路径。
503
+
504
+ ### 控制台能看到什么
505
+
506
+ 控制台展示脱敏摘要:
507
+
508
+ - runtime version;
509
+ - expected extension version;
510
+ - bridge 状态;
511
+ - connected sessions;
512
+ - 当前页面;
513
+ - pending requests;
514
+ - queued requests;
515
+ - recent activity;
516
+ - diagnostic counts;
517
+ - 脱敏后的 title / URL。
518
+
519
+ ### 控制台诊断能力
520
+
521
+ `0.2.0` 还加入:
522
+
523
+ - extension/runtime version mismatch warning;
524
+ - empty state guidance;
525
+ - `/console/state` JSON;
526
+ - `HEAD /console`;
527
+ - doctor 人类可读摘要打印 console URL;
528
+ - bridge auth 启用时保护 console state;
529
+ - pending/queued browser requests cancel;
530
+ - 控制台状态脱敏测试。
531
+
532
+ 这让用户在“Agent 好像卡住了”时,有地方看 runtime 是否连上、请求是否堆积、版本是否不匹配。
533
+
534
+ ## Agent 文档和 skill 增强
535
+
536
+ ### 新增 Agent Workflow Contract
537
+
538
+ `0.2.0` 新增 `docs/AGENT_WORKFLOW_CONTRACT.md`。
539
+
540
+ 它定义默认操作循环:
541
+
542
+ 1. 不确定工具规则时先调用 `yunti_get_tool_usage_hints`;
543
+ 2. 调用 `yunti_list_browser_targets`;
544
+ 3. 选择目标 `browserSessionId`;
545
+ 4. 调用 `yunti_observe_page`;
546
+ 5. 使用 fresh uid 执行动作;
547
+ 6. 异步 UI 使用 `yunti_wait_for`;
548
+ 7. 每次动作或等待后再次 observe;
549
+ 8. 用 observe/snapshot/evaluate/screenshot/network/console 验证;
550
+ 9. 失败时按 `code`、`recoveryHint`、`nextStepHint` 恢复。
551
+
552
+ ### 明确危险操作确认边界
553
+
554
+ 文档要求 Agent 在这些场景前询问用户:
555
+
556
+ - 提交会改变生产数据的表单;
557
+ - 删除、审批、购买、发布、发送消息;
558
+ - 上传敏感文件;
559
+ - 暴露或复制 secrets、credentials、cookies、auth headers、tokens、private keys;
560
+ - 做无法从页面状态验证影响的动作。
561
+
562
+ ### Minimal Use Cases
563
+
564
+ `0.2.0` 在 Tool Guide 和 skill 中沉淀 5 个最小可用场景:
565
+
566
+ - Click;
567
+ - Fill Form;
568
+ - Scroll To Find;
569
+ - Switch Tab;
570
+ - Wait For Async Result。
571
+
572
+ 这让 Agent 不只是知道工具列表,还知道完成常见浏览器任务的正确顺序。
573
+
574
+ ### Tool usage hints 更完整
575
+
576
+ `yunti_get_tool_usage_hints` 现在包括:
577
+
578
+ - observe-first 操作规则;
579
+ - fresh uid 使用规则;
580
+ - action result contract;
581
+ - wait timeout recovery;
582
+ - select value/text path;
583
+ - raw CDP 和 screenshot 安全边界;
584
+ - default agent workflow;
585
+ - minimal use cases;
586
+ - action recovery guidance。
587
+
588
+ 这对上下文压缩很重要:即使 Agent 忘了前文,也能通过工具重新读到操作规则。
589
+
590
+ ### Skill 同步更新
591
+
592
+ `skills/yunti-browser-runtime/SKILL.md` 同步了:
593
+
594
+ - observe-first;
595
+ - fresh uid;
596
+ - action 后验证;
597
+ - wait + observe;
598
+ - structured recovery;
599
+ - secret safety;
600
+ - risky action confirmation;
601
+ - minimal use cases。
602
+
603
+ ## Extension 分发和商店准备
604
+
605
+ ### Extension zip 继续可验证
606
+
607
+ `0.2.0` 保留 `npm run package:extension`:
608
+
609
+ - 输出 `dist/yunti-browser-runtime-extension-0.2.0.zip`;
610
+ - release gate 会解析 zip 内容;
611
+ - 当前 zip 预期包含 13 个扩展运行文件;
612
+ - 新增 DOM observer 文件被纳入包内容检查。
613
+
614
+ ### 新增分发文档
615
+
616
+ `0.2.0` 新增或完善:
617
+
618
+ - `docs/EXTENSION_DISTRIBUTION.md`;
619
+ - `docs/EXTENSION_STORE_COPY.md`;
620
+ - `docs/EXTENSION_PERMISSION_STRATEGY.md`。
621
+
622
+ 覆盖:
623
+
624
+ - npm/unpacked extension 当前分发路径;
625
+ - Chrome/Edge 商店描述草案;
626
+ - 权限解释;
627
+ - 隐私和 data disclosure 草案;
628
+ - reviewer notes;
629
+ - broad host permissions 风险;
630
+ - store-candidate 权限 UX 后置策略。
631
+
632
+ ### Store candidate 明确后置
633
+
634
+ `0.2.0` 不声称浏览器商店版本已经完成。
635
+
636
+ 后置项包括:
637
+
638
+ - optional host access UX;
639
+ - missing-permission recovery;
640
+ - optional network diagnostics;
641
+ - store-candidate manifest;
642
+ - 商店权限相关测试。
643
+
644
+ 当前发布目标是 npm/unpacked release candidate,而不是浏览器商店提交版。
645
+
646
+ ## 发布门禁增强
647
+
648
+ ### release gate 覆盖更广
649
+
650
+ `0.2.0` 发布前检查包括:
651
+
652
+ - public documentation residue;
653
+ - public Markdown links;
654
+ - package/extension version consistency;
655
+ - CLI `--help` / `--version` smoke;
656
+ - print-config 4 个 Agent smoke;
657
+ - doctor smoke;
658
+ - action result coverage;
659
+ - JavaScript syntax checks;
660
+ - unit tests;
661
+ - npm package contents;
662
+ - extension zip contents。
663
+
664
+ ### 测试覆盖增长
665
+
666
+ `0.2.0` 新增测试覆盖:
667
+
668
+ - DOM observer;
669
+ - DOM redaction;
670
+ - stale observe uid;
671
+ - observe uid action path;
672
+ - structured action results;
673
+ - fill/select/scroll/wait diagnostics;
674
+ - content scroll container/coordinate 行为;
675
+ - console diagnostics;
676
+ - network request detail scoping;
677
+ - optional local runtime console;
678
+ - action result coverage gate。
679
+
680
+ ### 当前 0.2.0 RC 验证结果
681
+
682
+ 已跑过并通过:
683
+
684
+ - `git diff --check`;
685
+ - token 残留 grep;
686
+ - package/extension version consistency;
687
+ - `npm run release:check`;
688
+ - `npm run check:metadata`;
689
+ - `npm run release:prepublish`;
690
+ - `npm run release:dry-run`;
691
+ - `YUNTI_E2E=1 npm run test:e2e`。
692
+
693
+ 最新验证摘要:
694
+
695
+ - package version:`0.2.0`;
696
+ - extension version:`0.2.0`;
697
+ - public Markdown link check:17 files;
698
+ - action result coverage:11 rows;
699
+ - normal Node test suite:126 tests,125 passed,1 skipped;
700
+ - real-browser E2E:1 passed;
701
+ - npm dry-run package:48 files;
702
+ - extension zip:13 files。
703
+
704
+ ## 兼容性说明
705
+
706
+ ### 工具面保持兼容
707
+
708
+ `0.2.0` 是 additive release,不删除核心能力。
709
+
710
+ 保留:
711
+
712
+ - MCP stdio server;
713
+ - local bridge;
714
+ - Chrome/Edge unpacked extension;
715
+ - `yunti_*` 工具前缀;
716
+ - CDP;
717
+ - screenshot;
718
+ - network diagnostics;
719
+ - console diagnostics;
720
+ - learning memory;
721
+ - file upload;
722
+ - tab/page operations;
723
+ - extension packaging;
724
+ - 现有兼容字段。
725
+
726
+ ### 结果字段保持兼容
727
+
728
+ 结构化字段是新增,不替换已有字段。
729
+
730
+ 继续保留:
731
+
732
+ - `clicked`;
733
+ - `hovered`;
734
+ - `filled`;
735
+ - `selected`;
736
+ - `scrolled`;
737
+ - `typed`;
738
+ - `pressed`;
739
+ - `uploaded`;
740
+ - `dragged`;
741
+ - `found`;
742
+ - `uid`;
743
+ - `selector`;
744
+ - `x`;
745
+ - `y`;
746
+ - `method`;
747
+ - `before`;
748
+ - `after`;
749
+ - `browserSessionId`。
750
+
751
+ ### token 行为是有意变化
752
+
753
+ 变化点:
754
+
755
+ - 默认本地 loopback 不再需要 token;
756
+ - optional token 仍可用;
757
+ - 非 loopback host 仍要求 token;
758
+ - docs 和 skill 要求 Agent 不要在默认本地路径里强迫用户填 token。
759
+
760
+ 这是为了减少安装心智,而不是移除安全能力。
761
+
762
+ ## 0.2.0 不包含什么
763
+
764
+ `0.2.0` 不是最终形态,也没有假装已经完成所有浏览器自动化愿景。
765
+
766
+ 暂不包含:
767
+
768
+ - 内置 LLM 自主任务规划循环;
769
+ - 跨刷新/跨会话的历史元素 fingerprint 匹配;
770
+ - 长程 action replay;
771
+ - browser-store-ready optional host permission UX;
772
+ - npm 静默安装 Chrome/Edge extension;
773
+ - 远程多用户云服务;
774
+ - 强制视觉 hub 或 side panel。
775
+
776
+ 这些边界是主动选择。当前重点是把 Yunti 做成可靠的本地浏览器操作层。
777
+
778
+ ## 发布前清单
779
+
780
+ 正式发布 `0.2.0` 前确认:
781
+
782
+ - 工作区干净;
783
+ - `package.json` 是 `0.2.0`;
784
+ - `extension/manifest.json` 是 `0.2.0`;
785
+ - README 在发布前仍说明稳定版为 `0.1.3`,发布后再改成 `0.2.0`;
786
+ - browser store 工作明确为 post-0.2;
787
+ - public files 没有 npm/GitHub 凭据或 registry auth 配置片段;
788
+ - `npm run check:metadata` 通过;
789
+ - `npm run release:prepublish` 通过;
790
+ - `npm run release:dry-run` 通过;
791
+ - 本机真实浏览器 E2E 通过;
792
+ - 用户明确确认正式发布。
793
+
794
+ 正式发布命令:
795
+
796
+ ```bash
797
+ npm run release:publish
798
+ ```
799
+
800
+ 发布后验证:
801
+
802
+ ```bash
803
+ npm run release:verify-published
804
+ ```
805
+
806
+ 发布后还需要把 README 和状态文档从 release candidate 更新为已经发布的 `0.2.0`。
807
+
808
+ ## 对外 changelog 短版
809
+
810
+ 可以用于 npm/GitHub release notes:
811
+
812
+ ```text
813
+ 0.2.0 将 Yunti Browser Runtime 从本地 MCP bridge MVP 升级为 observe-first
814
+ 浏览器自动化操作层。新版本新增 yunti_observe_page、fresh uid 操作闭环、
815
+ 结构化动作结果、click/fill/select/scroll/wait 恢复提示、DOM/network/console/
816
+ memory 脱敏增强、Agent workflow contract、最小浏览器用例、可选本地运行时控制台、
817
+ extension 分发文档和更强 release gates。版本继续保持 local-first、MCP-native、
818
+ npm/unpacked extension 路径,并保留细粒度 yunti_* 工具、CDP、截图、网络、
819
+ 控制台、上传、memory 和 tab/page 能力。
820
+ ```