Skip to content

设置界面全页 Codex 化:分组侧栏 + 白卡细边 + 子页统一 - #1

Merged
rinDBeans merged 3 commits into
rinDBeans:mainfrom
ase-sketch:feat/settings-only
Sep 29, 2026
Merged

rinDBeans merged 3 commits into
rinDBeans:mainfrom
ase-sketch:feat/settings-only

Conversation

@ase-sketch

@ase-sketch ase-sketch commented Sep 27, 2026 •

Copy link
Copy Markdown

范围

只包含设置界面相关的样式与结构改造:设置模态全页 Codex 化(结构层 + 视觉层)、设置子页统一白卡、组合包配置卡终稿。不含调色板等其它本地工作。

v2(2026-09-28,二审驱动的返修)

rebase 到 upstream/main 39ec999(0.6.4)之上,版本定为 0.7.0(不再改动已发布的 0.6.0 段)。修复清单:

  1. 面板锚点迁移:从「仅第三方 skin-center 适配器的 [data-dsh-surface="settings"]」(其契约自声明非永久,未装适配器环境不存在)改为三层:宿主 data-shortcut-modal="settings"(Dialog 原语跨包约定)优先 → JS 盖印自有 data-cx-sm-panel 作 CSS 唯一挂载点 → 适配器属性仅兜底。设置界面开着而锚点全失配时 warnOnce 显式降级(此前整层静默失效)。
  2. settings-page-verify 基线重写:修 TDZ(先使用后声明的 const,暗色起始必崩);显式亮色起始前置(失败即非零退出);亮暗两变体各清一遍重置(重置按钮只清当前变体字段);行为字段盲区修复(modelPicker 不打属性,改由「无残留重置按钮」把守);往返感知等待 + 贴底行合成点击(悬浮保存栏吞坐标点击)。
  3. 扫掠防空通过:0 项或低于 --min-pages(默认 1)即非零退出。
  4. §4.3 后缀锚点规则删除:模型/Agent 预设卡消费宿主主题在 body 上声明的 --dsw-alias-settings-card-fill(并非硬编码 #f3f3f3),皮肤重定义为 layer-1 后自动生效;原规则是同值重复且 [class$=…] 覆盖面随宿主 class 顺序漂移(选中卡仅靠以 _cardActive 结尾侥幸逃逸)。新增 3 条回归断言把守唯一着色路径。
  5. check-repo 19→25:新增锚点迁移两条契约。
  6. 文档订正:CHANGELOG 六处与代码不符的订正(机制 / 236px / 断言数 / 环境相关页数 / 锚点措辞 / 历史段注记);dom-recon 锚点结论改写(data-dsh-surface 是第三方适配器属性,非宿主);毛玻璃条目订正;skins README 双语新增锚点策略章节。

环境依赖声明

  • 设置界面改造不依赖 skin-center 适配器(宿主锚点优先,适配器仅兜底;两者皆无时结构层显式 warn 降级,皮肤不受影响)。
  • 注意:皮肤其它层(patches.css 的 overlay/sidebar/composer 规则)沿用上游既有做法使用适配器语义属性——未装适配器时这些层部分降级,与本 PR 的设置界面无关。
  • settings-page-verify 前置:无(脚本自行建立亮色干净基线,亮/暗起始均可)。

验证证据(DSH 0.1.7-rc.2,verify profile)

项 结果
npm run check 25/25
build --check 产物与源同源
settings-modal-verify 92/92(含 4 条新断言)
settings-modal-verify(禁用 skin-center) 92/92,盖印证据 surface:null + shortcutModal:"settings"(纯宿主锚点)
settings-pages-sweep 两种环境 exit 0(13/12 页)
settings-page-verify 亮色起始 PASS + 暗色起始 PASS
hero-verify 25/25(含徽标圆角宿主原值断言)

剩余风险(诚实声明)

  • 「账号与余额」页在本环境无凭据,其白卡只经无凭据形态验证。
  • <900px 窄布局、hover/press 态、真 Windows 桌面壳标题栏(仅模拟)未逐项验证。
  • install-plugin.mjs 仍用 powershell.exe 5.1 建 junction(二审 L3)——非本 PR 阻塞项,将另开改动处理。

@rinDBeans rinDBeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

验收结论:不通过(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 用 Playwright chromium-1234。
  • 基线对照:同一环境先跑 origin/main → npm run check 23/23 PASS、build.mjs --check OK。所以下面的失败不是「环境整体坏了」。

✅ 先说通过的部分

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 全过 —— 排除「环境整体不可用」的解释。


返工清单

  1. rebase 到最新 main(含刚合入的 1cbd6e8),重放冲突;
  2. 修 scripts/settings-page-verify.mjs:257 的 TDZ:把 selectedSegment 提到使用点之前,或把该处改为 waitFor 的内联表达式;
  3. 把面板锚点的来源说清楚:写进 PR 描述与 skins/codex-ink/README。若确实以 skin-center 适配器为前提,请把「锚点不存在」从静默 inert 改成显式告警/失败(现在的表现是设置界面毫无变化、console 只有一句泛泛的 warn,很难反查);若不打算依赖它,请改用宿主真实锚点([data-slot="settings.section"] 所在容器 / role="dialog");
  4. 修 settings-pages-sweep.mjs:扫到 0 项必须非零退出,不许报 PASS;
  5. 重新取证并贴出:settings-modal-verify、settings-pages-sweep(要求页数 > 0)、settings-page-verify;
  6. 版本号与 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 条不能省。

—— 以上结论均可在本机用报告里给出的命令复现。

@ase-sketch

Copy link
Copy Markdown
Author

二审修复已完成并强推(v2,593c2a8,rebase 到 1cbd6e8)。逐条回应:

一审 6 项

  1. rebase ✅(8+1 提交,冲突全部手工解决,中间断提交已压合)
  2. TDZ ✅(读取器声明上提;另发现声明块被我误删一次,已修正——这类错 node --check 确实抓不住,已按要求亮/暗起始各实跑一遍)
  3. 锚点 ✅ 改宿主 data-shortcut-modal="settings" 优先 + 自有 data-cx-sm-panel 挂载点 + 适配器仅兜底;锚点全失配时 warnOnce 显式降级(一审说的「静默」属实——此前 findPanel()===null 直接 return,且那个 warn 是脚本提示文本而非插件警告)
  4. 扫掠空通过 ✅ 0 项/低于 --min-pages 非零退出
  5. 证据 ✅ 全部重跑,见 PR 描述表格(含无适配器负向复跑 92/92,surface=null)
  6. 版本 ✅ 0.7.0 日期段,置于 0.6.0 之上

二审要点

  • H1/H2 ✅ 亮暗两变体各清一遍 + 显式亮色前置;基线建不出即非零退出(die)
  • M1 六处 ✅ 全部订正(机制/236px/断言数 92/页数环境相关/毛玻璃/锚点措辞)
  • M2 ✅ §4.3 已删(令牌单路径),3 条回归断言把守;选中卡「侥幸逃逸」实锤:[class$="_card"] 连 verify 自己的读取都曾漏掉选中卡,cardState 已改类令牌匹配
  • M3/M4 已知悉(扫掠暗色为属性模拟;非当前变体覆盖 UI 不可见属既有行为)
  • L2 ✅ dom-recon 锚点结论已改写
  • L3 另开改动处理(install-plugin 的 powershell 5.1),不在本 PR

过程中新发现并顺手修掉(都有实测证据):基线对 modelPicker 行为字段的盲区(属性只反映视觉字段);设置文档慢往返(1.5–8s)下固定 sleep 的连锁失败(saving 禁用态吞点击);悬浮保存栏吞贴底行坐标点击(40 轮零效果,改合成点击)。

@ase-sketch

Copy link
Copy Markdown
Author

跟进:upstream main 在本轮返修期间推进到 39ec999(0.6.3–0.6.4,侧栏基准色 #eef4f9→#f6f6f6 / #181818→#0f0f0f 与阴影实测拟合)。分支已二次 rebase 到 0.6.4 并重跑全量:check 25/25 · modal-verify 92/92 · sweep exit 0 · page-verify PASS · hero 25/25(0989339)。侧栏新基准由令牌相对断言自动跟随(这正是当初这么写断言的原因),仅同步了注释里的取值注记。

Agent-Evo RSI added 3 commits September 29, 2026 10:21
结构层 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。
@rinDBeans
rinDBeans merged commit 38435d2 into rinDBeans:main Sep 29, 2026
4 checks passed
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