设置界面全页 Codex 化:分组侧栏 + 白卡细边 + 子页统一 - #1
Conversation
5987441 to
5b42f79
Compare
rinDBeans
left a comment
There was a problem hiding this comment.
验收结论:不通过(3 项阻塞),请返工后再合
验收方式:本机实跑,不是纸面复核。
- 环境:Node v24.16.0 / git 2.54.0;夹具宿主用 npm
@deepseek-ai/dsh@0.1.7-rc.2经本仓scripts/pack-host-asar.mjs打成app.asar(53 包 / 1288 文件);真 GUI 跑在一次性 verify profile 上(make-verify-profile.mjs+install-plugin.mjs --profile verify --write),未触碰任何现有 profile;Chromium 用 Playwrightchromium-1234。 - 基线对照:同一环境先跑
origin/main→npm run check23/23 PASS、build.mjs --checkOK。所以下面的失败不是「环境整体坏了」。
✅ 先说通过的部分
npm run check → PASS 全部通过(23 条,含 4 条设置模态框断言)
node scripts/build.mjs --check → OK theme.css(95826 B) / OK client.js(157512 B)
node scripts/hero-verify.mjs → ALL PASS (17)
在你自己的 head 上,构建与静态契约是自洽的。问题出在真 GUI 结构层与脚本自身。
❌ 阻塞 A:与 main 冲突(GitHub 已标 CONFLICTING / DIRTY)
本 PR 的 base 是 88cee2a,而 main 已经前进到 53fe14d(composer 0.5.0–0.5.10),现在更是 1cbd6e8(PR #2 已合入)。
git merge pr1(对合入 #2 后的 main)冲突 8 个文件 / 14 个 hunk:
CHANGELOG.md(1) CHANGELOG.zh-CN.md(1) client.js(2)
scripts/check-repo.mjs(1) scripts/hero-verify.mjs(1)
scripts/settings-page-verify.mjs(2) src/build.mjs(5) src/client.template.js(1)
好消息:14 个 hunk 全部是「双方各自新增」,没有互相改写,属加性兼容(详见文末 dry-run 结果)。请 rebase 到最新 main 重放。
❌ 阻塞 B:scripts/settings-page-verify.mjs 存在确定性崩溃(任何环境必崩)
ReferenceError: Cannot access 'selectedSegment' before initialization
at file:///…/scripts/settings-page-verify.mjs:257:33
根因是 TDZ:
- 第 257 行:
const segWait = await waitFor(selectedSegment, (v) => v === '亮色', '起始态回亮色'); - 第 322 行才声明:
const selectedSegment = () => evaluate('(() => {'
也就是本次新增的「RESET 起始态回亮色」轮询,用了一个尚未初始化的 const。这条同时说明:该脚本在这次改动之后没有被完整跑通过一次(它会在 BUNDLE 配置卡就绪 之后立刻抛错退出)。
❌ 阻塞 C:面板锚点依赖未声明,且扫掠脚本空跑假绿
同环境、同宿主,把本 PR 的插件装进 verify profile 后:
$ node scripts/settings-modal-verify.mjs --url …
FAIL 设置面板或侧栏列表没找到:结构层可能整体没生效(看下面 console 里的 [codex-ui] warn)
exit=1
用 CDP 直连真页面取证(关掉引导弹层、点开设置后):
data-dsh-surface="settings": 0
surface attrs: ["DIV data-dockkit-surface=true"] ← 全页只有第三方 dockkit 的 surface 属性
nav count: 1 ← 设置面板确实开了(class …_panelList)
codex-ui root: true ← 插件本身已激活,设置卡也正常渲染
即:插件是活的,但本 PR 的整层设置模态改造一条都没命中。
原因是面板锚点:
// src/settings-modal.js:52
const PANEL_SELECTOR = '[data-dsh-surface="settings"]';data-dsh-surface 不是宿主属性,实测检索证据:
| 检索对象 | 结果 |
|---|---|
@deepseek-ai/dsh@0.1.7-rc.1 全部 dsh-client-ui-* 包 |
0 命中 |
@deepseek-ai/dsh@0.1.7-rc.2 全部 dsh-client-ui-* 包 |
0 命中 |
rc.1 实际下发的前端 bundle /assets/index-3dwByubT.js(612 KB) |
0 命中 |
桌面壳 DeepSeek Harness/resources/app.asar(117 MB) |
0 命中(同法检索 dsh-client-ui-settings 可命中,说明检索方法有效) |
它是第三方 skin-center 的 compat adapter 补打的:
@linxin666/dsh-client-ui-skin-center/contracts/semantic-attrs-v1.md:「两个产出通道:compat adapter(皮肤中心的合并 MutationObserver,为官方 DOM 与未 opt-in 插件补打属性;非永久公共契约)…」并且settings那一行写明锚定方式是「[role="dialog"]内含[data-slot="settings.section"]组合判定」skin-center/lib/client.js:3895:attrs: [["data-dsh-surface", "settings"]]
在本次验收的 profile 里,连 composer 的 surface 都没被打上 → 适配器未生效 → 锚点全部落空。
PR 描述把该锚点写成「稳定锚点」,但没有声明它依赖第三方 skin-center 适配器。 这不是「环境差异」,而是「依赖没写出来 + 缺失时静默失效」这两件事叠加。
更需要注意的是扫掠脚本:
$ node scripts/settings-pages-sweep.mjs --url … --out docs/recon --prefix c1
侧栏共 0 项:[]
截图 0 张
硬故障 0 项;需人眼复核 0 页
PASS:全部页面打开且内容区正常 ← exit 0
docs/recon/c1-sweep-report.json 内容 = []
描述里「13 页 × 亮/暗扫掠 0 硬故障」这条证据,在本机是一页没扫却报 PASS。脚本把「找不到侧栏项」当成了成功路径,属真空通过(vacuous pass),不能作为合并依据。
对照:同一环境下 PR #2 的 settings-page-verify 29/29 全过、live-gui-probe B 面 14/14 全过 —— 排除「环境整体不可用」的解释。
返工清单
- rebase 到最新 main(含刚合入的
1cbd6e8),重放冲突; - 修
scripts/settings-page-verify.mjs:257的 TDZ:把selectedSegment提到使用点之前,或把该处改为waitFor的内联表达式; - 把面板锚点的来源说清楚:写进 PR 描述与
skins/codex-ink/README。若确实以 skin-center 适配器为前提,请把「锚点不存在」从静默 inert 改成显式告警/失败(现在的表现是设置界面毫无变化、console 只有一句泛泛的 warn,很难反查);若不打算依赖它,请改用宿主真实锚点([data-slot="settings.section"]所在容器 /role="dialog"); - 修
settings-pages-sweep.mjs:扫到 0 项必须非零退出,不许报 PASS; - 重新取证并贴出:
settings-modal-verify、settings-pages-sweep(要求页数 > 0)、settings-page-verify; - 版本号与 CHANGELOG 决策:本 PR 未升版(仍是
0.4.0,main 已是0.6.0),rebase 后请一并确定版本与条目排序。
附:合并可行性已 dry-run 验证(说明返工量可控)
在一次性克隆里做了合并候选(未推送),顺序 main → #2 → #1,逐 hunk 取并集后重生成产物:
node scripts/build.mjs → 源样式 112669 B → theme.css 117541 B / client.js 220032 B
npm run check → PASS:全部通过(26 条,两边断言并集)
audit 36/36 · elevation 19/19 · composer-shadow 23/23 · model-picker 20/20 · power-rail 47/47
rightbar 42/42 · hero 27/27 · sidebar-align 6/6 · sidebar-surface 13/13
结论:两边在代码层面是加性兼容的,返工主要是 rebase + 修上面两个脚本 + 补锚点声明,不需要重做实现。但请注意:并集解冲突时有两处不能机械合并(check-repo.mjs 被切掉的 });、settings-page-verify.mjs 里 const restored 重复声明),需要人工判断。
另外,dry-run 合并树里阻塞 B 的 TDZ 依然存在(静态检查查不出,只有跑起来才炸),所以第 2 条不能省。
—— 以上结论均可在本机用报告里给出的命令复现。
5b42f79 to
593c2a8
Compare
|
二审修复已完成并强推(v2, 一审 6 项
二审要点
过程中新发现并顺手修掉(都有实测证据):基线对 modelPicker 行为字段的盲区(属性只反映视觉字段);设置文档慢往返(1.5–8s)下固定 sleep 的连锁失败(saving 禁用态吞点击);悬浮保存栏吞贴底行坐标点击(40 轮零效果,改合成点击)。 |
593c2a8 to
0989339
Compare
|
跟进:upstream main 在本轮返修期间推进到 |
结构层 src/client/settings-modal.js + 视觉层 skins/codex-ink/settings-modal.css 原样搬入, 装配方式改为模块化打包器的一条 import(PR rinDBeans#1 的 __CODEX_UI_MODAL__ 占位符在打包器下不再需要)。 - scripts/build.mjs:SKIN_PARTS 增加 settings-modal.css(第九份样式)。 - scripts/check.mjs:新增 6 条设置模态框契约(源文件存在 / 装配到 apply / 视觉层作用域化 / 自有锚点 [data-cx-sm-panel] / PANEL_SELECTOR 宿主优先 / 无残留占位符),60 → 67 条。 - scripts/specs/composer.mjs:徽标配色与圆角改读令牌计算值(不硬编码 rgb / 6px)。 - scripts/live/settings-modal.mjs、scripts/live/settings-sweep.mjs:PR rinDBeans#1 的两个真 GUI 验收搬进新结构。 - 视觉层三处 html[data-windows-titlebar][data-codex-ui] 改成 data-codex-ui 在前的等价写法, 以进「全部作用域化」体检(同一复合选择器、同特异性)。 - README / CHANGELOG 双语更新到 0.7.0。 验证:npm run check 67/67;node scripts/verify.mjs 208/208。
PowerShell 写出的四个新文件是 CRLF,会把 CRLF 带进 theme.css / client.js —— 在 LF 检出的干净克隆上 build.mjs --check 会判「产物过期」。现统一 LF 后重跑: npm run check 67/67、node scripts/verify.mjs 208/208、build --check OK。
main 的 scripts/sidebar-color-verify.mjs(自带 CDP + 自写 PNG 解码)改写为 scripts/specs/sidebar-color.mjs,走 PR rinDBeans#3 的夹具 harness(t.page / page.pixels / t.shot): 同一页并排渲染新值与旧值两组,亮暗各截一次,采样点与判据不变。 验证:node scripts/verify.mjs sidebar-color → 16/16;全套 224/224;npm run check 67/67。
0989339 to
43e87dc
Compare
范围
只包含设置界面相关的样式与结构改造:设置模态全页 Codex 化(结构层 + 视觉层)、设置子页统一白卡、组合包配置卡终稿。不含调色板等其它本地工作。
v2(2026-09-28,二审驱动的返修)
rebase 到 upstream/main
39ec999(0.6.4)之上,版本定为 0.7.0(不再改动已发布的 0.6.0 段)。修复清单:[data-dsh-surface="settings"]」(其契约自声明非永久,未装适配器环境不存在)改为三层:宿主data-shortcut-modal="settings"(Dialog 原语跨包约定)优先 → JS 盖印自有data-cx-sm-panel作 CSS 唯一挂载点 → 适配器属性仅兜底。设置界面开着而锚点全失配时warnOnce显式降级(此前整层静默失效)。--min-pages(默认 1)即非零退出。--dsw-alias-settings-card-fill(并非硬编码 #f3f3f3),皮肤重定义为 layer-1 后自动生效;原规则是同值重复且[class$=…]覆盖面随宿主 class 顺序漂移(选中卡仅靠以 _cardActive 结尾侥幸逃逸)。新增 3 条回归断言把守唯一着色路径。环境依赖声明
验证证据(DSH 0.1.7-rc.2,verify profile)
npm run checkbuild --checksurface:null+shortcutModal:"settings"(纯宿主锚点)剩余风险(诚实声明)