# Claude Code Haha v0.5.0 这是 `v0.4.11` 之后的界面重做版本。桌面端整体视觉按「纸·墨·印」设计稿重构,底层抽出一套组件库替换散落各处的原生控件,品牌标记从位图改为随主题重绘的矢量,并新增跟随系统深色/浅色外观。同时修复了工具拒绝中断整轮、流式传输中断不重试、MCP 父级配置无法删除、用量统计重复计数等一批问题。 版本号从 `0.4.11` 直接跳到 `0.5.0`:本轮改动的主体是表现层的整体替换而不是逐点修补,用 patch 号继续累加会低估变更范围。跳号不影响应用内自动更新,`electron-updater` 按 semver 比较版本,`0.5.0` 对任何 `0.4.x` 都是更新版本。 ## Highlights - **「纸·墨·印」全量 UI 重设计**:6 套主题(纯白、纸墨、经典暖色、青瓷、墨夜、墨夜蓝),采用源色块加单一语义映射层的两层 token 结构;标题改用自托管的 Noto Serif SC 衬线拉丁分片,中文回退系统衬线;圆角、阴影、动效阶梯统一定稿。外壳、零态、活跃会话、composer 全部弹层、技能市场、定时任务、设置全分区、Trace、终端和 ⌘K 均已重做。只换表现层,功能、数据契约与交互逻辑不变;旧的 `light` 主题设置会自动迁移到 `warm-classic`。 - **桌面端组件库**:新增 `components/ui` 原语层(24 个组件)与 `components/composite` 共享部件层,替换此前散落的原生控件——362 个原生 button 只有 22% 复用率,图标按钮存在 15 种圆角、12 种尺寸,41% 没有焦点环,10 个没有可访问名称。组件复用率现为 75%,剩余部分是 `role="tab"`、`menuitem`、整行整卡点击目标等不应组件化的元素。四道守门测试分别校验分层依赖、token 可解析、对比度达 AA 和调用方数量。 - **品牌标记矢量重建**:应用图标从 120KB 位图重建为矢量几何,可以随主题重新着色——两个 C 取墨色,印章条、光标和星芒取朱色。所有消费点按尺寸减件:星芒在 40px 以上、光标在 24px 以上,C 与印章条始终保留。应用图标本身保持一份固定艺术稿(Dock 与任务栏由系统绘制,不感知应用内主题),应用内的标记则是跟随主题重绘的矢量。 - **跟随系统深色/浅色外观**(#1106):设置 → 通用新增开关。系统只报告 dark/light 而应用有 6 套主题,因此调色板选择器按底色分为「浅色模式使用」和「深色模式使用」两组,各自记住偏好。同时修掉了每次启动先刷白屏的问题——`index.html` 此前硬编码 `data-theme="white"`,而读取已存主题的代码要等应用包动态导入完成才运行;现在有一段同步内联脚本在任何样式表解析前解析主题,Electron 也从缓存的外观预置窗口背景色。新装默认跟随系统,已有安装保持原有固定主题直到用户主动开启。 - **侧边栏宽度可调**:右边缘 8px 拖拽手柄,宽度在 240–480px 之间,持久化到 localStorage,双击回到 300px,方向键可微调。向左拖过 240px 会停住,越过 180px 才收起为窄栏,回来时越过 200px 才展开——20px 的滞回区间避免手抖时反复开合。设置侧栏从 260px 收到 220px(200px 会让日语「コンピューター操作」截断,实测阈值在 210px)。 - **运行位置收敛为单个 pill**:目录、分支、worktree 原本是 composer 下方独立条上的三个按钮,现在合并为工具栏行内的一个 pill,与「+」和模型选择器同行。会话草稿阶段可编辑,发出首条消息后转为只读,位置不变。分支名截断保留尾部(`…use-native-on-main` 而非 `feature/comp…`),因为尾部才是区分度所在。 - **技能市场改为滚动加载**:翻页从「加载更多」按钮改为提前 400px 触发的滚动观察,加载中显示占位卡片;首屏骨架卡数量按可用空间测算而不是固定 6 张。加载失败有独立的内联提示和重试,不再整块清空目录,也不会自动重试撞进同一个失败。 - **宠物动作表放宽为任意尺寸**:导入动画宠物此前要求文件精确为 1536×2288、88 格无缝排布,没有图像模型会输出这个尺寸,所以这条路每次都终止在尺寸校验上;而「AI 生成完整动画」那张卡是硬编码 `disabled` 的死入口。现在任意尺寸的 8×9 动作表都会在浏览器端自动切格、缩放、镜像生成向左跑,并复用行补齐 11 组动作。已经是 1536×2288 的图集原样通过,不做重采样。新增白底检测:透明像素低于 5% 的图集会被拒绝并说明原因,此前这类图会安静地导入并在桌面上渲染成一个矩形。 - **`.agents/skills` 跨客户端约定**(#1093):识别多个 AI 客户端共用的 `.agents/skills` 目录约定。 ## Fixes - 修复对话框背景可以直接看穿的问题。`.glass-panel` 把半透明填充和模糊写在同一条规则里,只有两者都生效才呈现毛玻璃;而 `backdrop-filter` 不生效时 CSS 不会报错,只是跳过声明,留下 0.84 的填充独自承担,导致 16% 的页面内容清晰透出。对话框现在使用按构造不透明的 `--color-surface-dialog`,完全不依赖模糊。 - 修复拒绝工具权限后整轮对话静默结束的问题(#1051)。桌面端的拒绝以 `interrupt: true` 回给 CLI,触发 abort,拒绝虽然写进了 transcript 却再没有发起后续请求,模型既不知道被拒绝也没机会回应。现在发送 CLI 自己使用的拒绝文案,模型会被再次询问并给出回复。ExitPlanMode 的语义相反——拒绝计划意味着「继续规划」——因此使用单独的文案。 - 修复流式传输被中断后不重试的问题。Grok 上出现的 `The socket connection was closed unexpectedly` 是 Bun 在读取被对端 RST 的响应体时抛的裸 Error,三条恢复路径全部漏过:`withRetry` 只包裹建流不包裹消费,`isRetryableStreamError` 要求 SSE body 里带 `api_error` 的 APIError,而桌面端注入了禁用非流式回退的开关。现在按传输层错误码(ECONNRESET/EPIPE 等)沿 cause 链判定并重建流。重试受与看门狗相同的副作用边界约束:一旦有 tool_use 块完成或服务端工具活动开始,断连会如实上报而不是重放。 - 修复 Grok Responses 请求的四处偏差(对照官方 CLI 逐条用实际请求验证)。指定工具的 `tool_choice` 此前被翻译成 Chat Completions 语法,Responses 端点直接返回 422,导致所有指定工具的请求整体失败;另外补上 `prompt_cache_key` 与 `x-grok-conv-id` 的会话级身份复用,避免每轮重复计费整个前缀。 - 修复父目录 `.mcp.json` 中声明的服务器无法删除的问题(#1107)。读取会从当前目录向上遍历继承所有 `.mcp.json`,删除却只看当前目录自己的文件,于是这类服务器显示为可删除、点删除后报「发生未知错误」。同时修掉一个凭据泄露:新增服务器时会重建整个配置文件,把 `${VAR}` 展开后的值写回磁盘——实测 `"Bearer ${MY_MCP_TOKEN}"` 被写成了明文密钥,而这个文件通常是要提交的。 - 修复后台 agent 工作时思考块被切成多段的问题(#1108)。后台 agent 的工具活动会以带 `parentToolUseId` 的普通事件重新发出并落在消息数组末尾,而流式思考块的合并判断看的是数组尾部是不是思考块——尾部变成了子工具调用,于是之后每个分片都另起一个气泡。现在合并时跳过这些冒泡的子消息。 - 修复 `TaskUpdate` 删除的任务仍留在活动面板的问题(#1101)。`deleted` 是删除动作而不是状态,CLI 会直接删掉任务文件;活动面板把它当状态解析,落到 `pending` 兜底并一直挂在面板上。 - 修复用量统计把一条助手回复重复计算的问题。Claude Code 按 content block 逐行写 JSONL,每行都重复完整的 `usage` 对象,两条统计路径都在累加——本仓库里一条跨 52 行的真实消息带 50.8K token,被统计成 2.65M。同时修掉:成本字段此前是从未赋值的死代码;未知模型不再按 Claude 价格计费(12.7% 的 token 来自第三方 provider);「最长任务」此前用首尾时间差衡量,跨夜恢复的会话会把整晚算进去,实测出现过 436 小时和 1137 小时的读数,现在按 30 分钟以内的间隔累计有效工作时间;workflow 子 agent 的 transcript 此前从未被索引。 - 修复会话头部占用过高的问题。重设计后的头部把不截断的 22px 标题叠在元信息行上方,长标题会折行把正文推下去;现在标题单行截断、元信息移到标题下方一行,实测从 123.5px 收到 66.75px,完整标题保留在悬停提示里。 - 修复被拖动的宠物无法贴到 macOS 菜单栏的问题。macOS 会把已显示窗口的 frame 交给 `constrainFrameRect:toScreen:` 改写,任何高于工作区的 y 都被静默拉回顶边——实测只有顶边受约束,左右和下边一直正常。`enableLargerThanScreen` 是唯一能跳过该方法的开关。同时修复了重启后位置漂移:窗口在渲染进程报告吉祥物区域之前就已创建,恢复时按整窗裁剪会低开一个内边距的高度。 - 修复 Windows 上被拖动的宠物被裁切、无法贴到显示器边缘、重启后不保持位置的问题(#1099、#1104)。 - 修复粘贴的图片渲染成通用文件卡的问题。粘贴文件统一走原生路径后,所有附件都被标为 `type: 'file'` 且没有预览源,而重开标签页时又能从 transcript 的内联图片块正确显示——实时显示与恢复显示出现分歧。现在按扩展名解析图片附件的显示源,WebSocket 负载仍保持只传路径。 - 修复 Skill frontmatter 被当作 Markdown 渲染的问题。YAML 块的收尾 `---` 被解析成 setext 标题标记,整块 frontmatter 渲染成一个巨大的加粗 `