Skip to content

dsh-coding-sidebar 1.0.38

Choose a tag to compare

@kkutysllb kkutysllb released this 04 Oct 13:11
· 3 commits to main since this release

dsh-coding-sidebar 1.0.38

文件页签标题本地化:中文环境下新任务侧栏原本显示英文 Files,现在按当前
语言显示「文件」;同时修掉它背后那个「同一个文件窗口开出两个页签」的去重缺陷。

变更

文件窗口标题跟随语言(src/client/state.ts)

  • 故障(现场 2026-10-02):中文环境下打开一条新任务,右侧栏默认的文件页签
    标题是英文 Files;任务跑一会儿再从「在文件夹中显示」等路径打开同一个窗口,
    标题又变成「文件」——同一块 UI 出现两种文案。
  • 根因:只有两条打开路径把标题写死成英文字面量,其余路径都走
    locales.ts 的 t('files'):
    1. makeDefaultState() 的新会话种子页签(title: 'Files');
    2. sanitizePersistedTab() 的 explorer → editor 迁移(旧持久态里的
      独立 explorer 页签重开为文件窗口)。
  • 为什么切语言/刷新都救不回来:页签标题是存进状态里的字段而不是渲染期
    算出来的字符串——TabBar 只读 tab.title,标题在创建时定稿,整棵面板重渲染
    不会重写它;而这个字段还会落进 localStorage(dsh-sidebar:v1:<sessionId>)
    永久保存。所以旧值必须在加载期自愈,否则已存在的会话永远显示 Files。
  • 修法:
    • 种子与迁移两处改走 t('files');
    • sanitizePersistedTab() 对无 path 的 editor 页签(= 文件窗口本身,
      标题是派生的 UI 文案而非用户数据、且本仓库没有任何页签重命名入口)在每次
      加载时按当前语言重派生标题——旧版本写进去的 Files 因此自愈,
      中↔英(以及 better-locale 的 ja 覆盖)双向都跟随语言;
    • 带 path 的 editor 页签标题保持原样(文件名是数据,不是文案),
      FLOAT 窗口里的文件窗口同样自愈。

文件窗口单实例(editorTabKey,src/client/state.ts + builtins/tabs.tsx)

  • 故障(第二半):revealInExplorer()(「在文件夹中显示」/ 产出文件行)走
    openTab({type:'editor', title: t('files')}),与种子页签的 id(tab:N)不同,
    本该靠 dedupeKey 收敛到同一个文件窗口;但 editor 描述符的键是
    (tab) => tab.path,无 path 时返回 undefined,而 service.applyDedupe()
    在键为 undefined 时整段跳过去重(if (key !== undefined))——于是同一个
    文件窗口被开出两个页签(一个 Files、一个「文件」),与该描述符自己的注释
    「the single files window」相矛盾。
  • 修法:新增导出 editorTabKey(tab): string(tab.path ?? ''),editor
    描述符改用它。语义:按路径去重,但所有无 path 的 editor 页签是同一个
    文件窗口。带路径的 per-path 窗口行为不变。
  • 用户可见的行为变化:+ 菜单里的「文件」在文件窗口已打开时聚焦它
    (而不是再开一个),与「单一文件窗口」的既有设计意图一致。

测试(tests/tab-i18n.mjs,新增 17 条断言,已挂进 pnpm test)

  • 直接 import 真源码 state.ts + locales.ts(unrun 加载 TS,不是孪生副本)。
  • 覆盖:中/英种子标题、seed='none' 回归、无 path 文件窗口的持久态自愈(含
    explorer 迁移、FLOAT)、带 path 页签标题不被改写、无 path 非 editor 页签
    不被改写、结构损坏仍整体拒绝、editorTabKey 的碰撞/区分语义,外加两条
    源码守卫(state.ts 不得再出现 title: 'Files';editor 描述符必须用
    editorTabKey)——防止这两处硬编码回流。

兼容性说明

  • 无 peer/契约变化;dsh 声明、cordis.patch.yml、服务面与 agent 工具均未动。
  • 持久态格式不变(只重写无 path 文件窗口的标题字段),旧状态、旧 FLOAT、
    旧 explorer 页签都按既有迁移路径继续可读。

验证

  • node tests/tab-i18n.mjs:17/17 PASS(TDD:先落测试观察到 5 条干净 RED,
    再实现至全绿)。
  • pnpm test 全量 ALL PASS;pnpm typecheck 0;pnpm smoke 通过;
    pnpm check:artifacts 字节可复现(192 文件)。
  • 产物级核验:lib/client.js 中 title:"Files" 硬编码命中数 2 → 0,
    editorTabKey 在内 2 处。
  • 待实机验证:重启后中文环境下新任务的默认页签显示「文件」,且反复
    「在文件夹中显示」不再新增第二个文件页签。