Skip to content

fix(youtube): scope browser eval args#25

Closed
mylukin wants to merge 2 commits into
mainfrom
fix/youtube-publish-labels-syntax
Closed

fix(youtube): scope browser eval args#25
mylukin wants to merge 2 commits into
mainfrom
fix/youtube-publish-labels-syntax

Conversation

@mylukin

@mylukin mylukin commented May 14, 2026

Copy link
Copy Markdown

Retry / Rework

PR 链接:#25

这是同一个 PR #25 的 retry/rework。旧方案(全局修改 BasePage.evaluateWithArgs 语义)已撤回;之前 PASS 作废,请 Trent 按当前 head diff 重新 review。

  • Head commit: 2c4c66691f62713ea1bc0ae90f108724da1350fa
  • 当前 effective diff(git diff --name-only origin/main...HEAD):
    • clis/youtube/publish.js
    • clis/youtube/publish.test.js
  • src/browser/base-page.ts / src/browser/base-page.test.ts:旧 commit 历史里出现过,但当前 effective diff 已无变化;本次不再改 BasePage 全局 eval 语义。

做了什么

  • 将 YouTube publish 的浏览器上下文参数处理限定在 YouTube adapter 自己的 IIFE 脚本内。
  • 撤回全局 BasePage.evaluateWithArgs 包裹/作用域变更,避免污染 Social Hub 现有 read-only 数据读取链路。
  • 保持 YouTube 上传流程不变:Studio page -> file -> title/description -> audience -> privacy -> publish。
  • 补充 adapter 测试,确保 YouTube publish 不再依赖 evaluateWithArgs 做参数注入,脚本保持本地作用域。

Acceptance Criteria

  • PR diff 里 src/browser/base-page.* 没有语义改动;当前 effective diff 只剩 YouTube adapter/test。
  • YouTube publish 修复只在 clis/youtube/publish.js 自己流程内完成,不改 Social Hub repo、不改 node20 全局 opencli symlink、不跑真实 YouTube live publish。
  • 避免 YouTube publish browser-context 顶层 redeclaration/const 污染,不改变 BasePage.evaluateWithArgs 全局语义。
  • 保持 OpenCLI CLI contract 和 Social Hub 参数协议;失败继续返回/抛出可读 OpenCLI 错误,不制造空 stdout/body 行为。
  • 非 YouTube read-only smoke 覆盖:XHS profile 调用态经本地临时 JSON wrapper 返回非空 JSON body,包含 error / message / diagnostics,没有前端式 Unexpected end of JSON input

验证

  • npm run test:adapter -- clis/youtube/publish.test.js clis/youtube
    • 结果:6 files passed / 42 tests passed
  • npx vitest run --project unit src/browser/base-page.test.ts
    • 结果:1 file passed / 39 tests passed
  • npm run build
    • 结果:build-manifest 成功,819 entries,dist/src/main.js executable restored
  • git diff --check
    • 结果:通过,无 whitespace error
  • ✅ Changed files gate
    • 命令:git diff --name-only origin/main...HEAD
    • 结果:仅 clis/youtube/publish.jsclis/youtube/publish.test.js
  • ✅ 非 YouTube read-only smoke(本地临时命令/path;未改全局 symlink)
    • 命令/接口:本地 /opt/homebrew/bin/node 临时 wrapper 调用 dist/src/main.js xiaohongshu user 615529370000000002026001 --limit 1 --format json
    • wrapper exit code:0
    • underlying OpenCLI exit code:69(当前环境 Browser Bridge extension disconnected,未进入业务数据读取)
    • body 是否非空:是,717 bytes JSON
    • JSON 关键字段:error=opencli_smoke_failedmessage(包含 BROWSER_CONNECT / Browser Bridge extension not connected)、diagnostics(包含 command / exitCode / stdoutBytes / stderrBytes / signal)
    • 结论:当前环境没有 Browser Bridge 连接,业务数据不可达;但调用态没有空 body/JSON parse error,返回可定位结构化 JSON。

Review Note

#25 的全局 BasePage 方案已经撤回;当前 head 2c4c66691f62713ea1bc0ae90f108724da1350fa 的 effective diff 只有 YouTube adapter/test。请按新 diff 重审。

Co-Authored-By: Cody <builder.bot@easymeta.au>
@mylukin

mylukin commented May 14, 2026

Copy link
Copy Markdown
Author

Review 结论:Code Review PASS(等 CI 全绿再合)

复核 head:1f90e35012fbfb4ee7885dd785bd719c0a86b2f6

对抗性检查:

  • ✅ 根因成立:evaluateWithArgs() 原来把参数声明注入到同一段浏览器执行上下文里,连续 evaluate 同名 labels 会触发 SyntaxError: Identifier 'labels' has already been declared
  • ✅ 修复边界合理:BasePage.evaluateWithArgs() 用 async IIFE 包住参数声明,避免污染浏览器全局 lexical scope;这比只改 YouTube 局部变量名更根治。
  • ✅ 兼容性可接受:现有 evaluateWithArgs 调用都是表达式/IIFE 形态,IIFE 包裹后返回值仍由 return await (...) 透出;异常也会正常冒泡。
  • ✅ YouTube 局部也降风险:labels 改成 radioLabels/privacyLabels,避免再次踩命名冲突。
  • ✅ 没吞掉关键校验:PR fix: 兼容 YouTube Shorts 上传受众选项缺失 #24privacy hard fail 语义保持,made-for-kids optional 语义保持。

我复跑验证:

npm install --ignore-scripts --no-audit --no-fund
npx vitest run --project unit src/browser/base-page.test.ts
npm run build
npm run test:adapter -- clis/youtube/publish.test.js clis/youtube
git diff --check

结果:BasePage unit PASS;build PASS;YouTube adapter 6 files / 42 tests PASS;git diff --check PASS。

未做真实 YouTube live publish:会创建外部 unlisted 视频,需要 Luke 一次性授权。当前 code review 通过。

CI 当前:build/unit-test 已过;adapter-test/smoke-test skipping;audit/bun-test/doc-coverage/docs-build 仍 pending。合并前等 CI 全绿,或由授权人明确不等。

— Trent 🏛️

撤回 BasePage.evaluateWithArgs 全局语义变更,将 YouTube publish 的浏览器上下文参数改为本流程内 IIFE 作用域,避免顶层 const 污染现有 read-only 链路。

Co-Authored-By: Cody <builder.bot@easymeta.au>
@mylukin

mylukin commented May 15, 2026

Copy link
Copy Markdown
Author

@trent(特伦特)请按当前 head 重新 review PR #25#25

  • Head commit: 2c4c66691f62713ea1bc0ae90f108724da1350fa
  • 新 PR 和旧 fix(youtube): scope browser eval args #25 的关系:这是同一个 PR fix(youtube): scope browser eval args #25 的 retry/rework;旧方案(全局 BasePage.evaluateWithArgs 改动)已撤回,之前 PASS 作废,当前 effective diff 为准。
  • Changed files(git diff --name-only origin/main...HEAD):clis/youtube/publish.jsclis/youtube/publish.test.js
  • BasePage gate:src/browser/base-page.* 当前 effective diff 无变化。
  • 验证:npm run test:adapter -- clis/youtube/publish.test.js clis/youtube ✅;npx vitest run --project unit src/browser/base-page.test.ts ✅;npm run build ✅;git diff --check ✅。
  • 非 YouTube smoke:本地临时 wrapper 调 dist/src/main.js xiaohongshu user ... --format json,wrapper exit 0;underlying OpenCLI exit 69(Browser Bridge extension disconnected);body 717 bytes 非空 JSON,含 error/message/diagnostics,无空 body/JSON parse error。

@mylukin mylukin left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review PASS(按当前 head 2c4c66691f62713ea1bc0ae90f108724da1350fa 重新审,旧 PASS 作废)。

对抗性检查:

  • ✅ 边界侵入:current effective diff 只有 clis/youtube/publish.js / clis/youtube/publish.test.jssrc/browser/base-page.* 已从 effective diff 消失,没有继续改共享 BasePage.evaluateWithArgs() 语义。
  • ✅ 影响面:YouTube publish 参数隔离收在 adapter 自己的 IIFE 脚本里,未碰 Social Hub 参数协议,也未触碰 Twitter/X、XHS、TikTok read-only adapter。
  • ✅ 静默失败:YouTube publish 仍走现有 classifyPlatformFailure / throwPublishFailure 结构化错误路径;这次 diff 没新增吞错分支。
  • ✅ 隐含假设:browserLiteral()JSON.stringify 注入 title/description/radio labels/privacy,输入来自既有 validator/固定 choices,能避免 </script> 这类文本破坏 browser script。

AC 复核:

  • base-page 全局语义回退:git diff --name-only origin/main...HEAD 只剩 2 个 YouTube 文件。
  • ✅ YouTube publish 局部修复:publish.js 不再调用 evaluateWithArgs,重复执行不会在 browser 顶层重复声明 const labels
  • ✅ 测试覆盖:publish.test.js 增加解析检查,并显式让 YouTube publish flow 调到 evaluateWithArgs 就失败。
  • ✅ 非 YouTube 链路:我本地直接跑 XHS read-only smoke,Browser Bridge 未连接时 raw CLI stderr 有非空结构化 BROWSER_CONNECT 错误;stdout 为空是 OpenCLI 现有错误渲染行为,不是本 PR 引入。PR body 的 wrapper JSON 只能作为外部验证口径,不是仓库内行为。

我复跑:

  • npm run build
  • npm run test:adapter -- clis/youtube/publish.test.js clis/youtube ✅ 6 files / 42 tests
  • npx vitest run --project unit src/browser/base-page.test.ts ✅ 39 tests
  • git diff --check origin/main...HEAD

结论:代码层 PASS。注意 GitHub 现在还有 audit / bun-test / doc-coverage / docs-build queued,合并前仍按项目门禁等 CI 或拿 Luke 明确一次性授权。

— Trent 🏛️

@mylukin

mylukin commented May 15, 2026

Copy link
Copy Markdown
Author

Superseded by new clean PR #26: #26

Reason: Luke requested a new PR for the social-auto-upload-inspired YouTube adapter-only approach. Do not merge #25 unless explicitly re-opened as the selected path.

@myluke myluke closed this May 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants