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 渲染成一个巨大的加粗<h2>压在文档上方。现在拆出来按结构化行排版。 - 修复插件重载失败仍报告成功的问题。变更已落盘但运行时重载失败的那一半此前完全静默,与正常成功的提示无法区分。
- 修复 loopback 请求在桌面进程令牌存在时全部被拒的问题。此前一旦桌面外壳注入令牌,loopback 地址就不再构成信任依据,而系统浏览器永远拿不到这个令牌——Grok OAuth 成功页、
/preview-fs链接和普通 curl 全部返回 401。现在 loopback 恢复为独立可信,令牌只在/api/h5-access控制面强制要求(同一台机器上的其他程序不得把用户会话发布到网络)。同时补上一个更早就存在的 CSRF 漏洞:if (!origin) return true也接受跨站子资源加载,现在用 Fetch Metadata 区分真实导航与子资源。 - 修复 Windows 上
taskkill缺失时的处理(#1091),以及electron:dev启动器在 Windows 上不可用的问题。 - 修复同名 skill 在多个根目录下解析不一致的问题,以及
.agents来源标记、doctor 检查和列表安全性的若干偏差。
Features and Improvements
- 会话元信息、附件画廊、图片灯箱、页内查找的控件补齐可访问名称与键盘操作;灯箱支持方向键和首尾循环,单图时不显示箭头。
- 48 个此前硬编码的用户可见字符串补齐 5 个语言的翻译键(en / zh / zh-TW / jp / kr),包括
browser/下整块硬编码的中文和多处硬编码英文。TranslationKey由en.ts推导,缺键是编译错误而不是运行时空白。 - 终端配色从硬编码的 20 个十六进制值改为读取按主题定义的
--color-terminal-*token。 - 下拉菜单获得 listbox 语义、方向键导航和焦点返回;21 处手写的外部点击处理统一为
useDismissable,默认使用pointerdown——mousedown在触屏上不可靠,这正是 H5 上「点外面菜单不关」的成因。 - 新增仅开发环境可用的组件画廊(
/gallery.html),在三套主题下渲染全部原语。单元测试无法判断 token 是否解析成可读的颜色、浮层是否盖在该盖的东西上方、入场动画是否真的播放——画廊本身就发现了三个测试全绿却存在的缺陷。 - 文档站用 React 重建,落地页文案重写。
- 组件库的使用规则、分层依据与审计证据记录在
desktop/src/components/AGENTS.md和docs/component-library-plan.md。
Issue 对照
- #1051:拒绝工具权限后把拒绝结果交回模型,而不是中断整轮。
- #1086:支持粘贴文件附件。
- #1091:处理 Windows 上缺失的 taskkill。
- #1093:识别跨客户端的
.agents/skills目录约定。 - #1099 / #1104:修复 Windows 上宠物被裁切与无法贴边。
- #1101:从活动面板移除已被 TaskUpdate 删除的任务。
- #1106:跟随系统深色/浅色外观,并消除启动白闪。
- #1107:删除父级
.mcp.json中声明的 MCP 服务器。 - #1108:后台 agent 工作期间保持思考块完整。
Verification
- 本机以 release 模式跑完质量门禁,13 条非 live lane 全部通过:Policy 127 项、Desktop 271 文件 / 3331 项通过 1 项跳过、Server 227 文件 / 2447 项、Adapters 406 项、Provider contract 18 组、Chat contract 全组、Native(sidecar 编译 + Electron 检查 + 目录打包 smoke)、Docs 80 页 / 302 处链接与图片、Persistence upgrade、Quarantine(0 条)、Baseline case catalog。
- Coverage 门禁 5/5 套件通过,Desktop React 行覆盖 90.19%。首次运行时该门禁失败,根因是
nativeAppearance.test.ts的用例未传隔离 env:check:coverage在设有CLAUDE_CONFIG_DIR的沙箱环境中运行,而该变量的优先级高于app.getPath('home'),使各用例本应独立的缓存路径塌缩成同一个文件,一个用例因此读到另一个用例写入的值。已修复为显式传入隔离 env,与windows.test.ts既有写法一致,并在设与不设该变量的两种环境下各验证一次。这是测试隔离缺陷,不影响产品行为;Release Desktopworkflow 不运行该门禁,pr-qualityworkflow 会运行。 - 未执行项,不计为通过:6 条 baseline case 与 1 条 provider live/proxy smoke 需要真实 provider 凭据,本机未运行;
desktop-package-smoke需要已签名的本机 release 产物,由 CI 的Verify packaged app structure与Verify macOS launch policy覆盖;本轮 UI 重构未做真机逐屏走查;v0.4.11 -> v0.5.0的真实自动更新链路需在 Release 发布后验证。 - 上述证据只覆盖本机候选构建与测试,不等同于正式签名、公证或跨平台安装的端到端验证。
Notes
- GitHub Release 正文以
release-notes/v0.5.0.md作为唯一来源。 - 桌面端发布版本号来源是
desktop/package.json;rootpackage.json继续保留本地开发用的999.0.0-local。发布时必须确保版本号、Git tagv0.5.0和本文件严格一致。 - 版本号从
0.4.11跳到0.5.0不影响自动更新。electron-updater使用 semver 比较(semver.gt)而非字符串比较,且更新元数据取自仓库最新 Release,与版本号是否连续无关。0.5.0不带 prerelease 后缀,仍走稳定通道,元数据文件名不变。 Release Desktopworkflow 会构建 macOS、Windows 和 Linux 的 x64 / ARM64 安装包,并在完整资产和 updater metadata 校验通过后公开 Release。- 自动更新验证路径是正式
v0.4.11 -> v0.5.0。发布完成后需核对latest-mac.yml、latest.yml、latest-linux.yml和latest-linux-arm64.yml。 - macOS 正式公开发布依赖签名和公证 secrets;Windows 未配置签名时仍可安装和自动更新,但可能显示 SmartScreen 提示。
- 本次是表现层的整体替换,功能与数据契约未变更,已有会话、服务商配置、Skills、Agents、记忆和自定义数据目录不需要迁移。旧的
light主题设置会自动迁移到warm-classic。 - 组件画廊(
/gallery.html)只在bun run dev下可达,不进入生产包——Vite 的构建入口只有index.html。
安装
在本页面底部 Assets 中按系统和 CPU 架构下载:
| 平台 | 文件 |
|---|---|
| macOS Apple Silicon(M 系列) | Claude-Code-Haha-0.5.0-mac-arm64.dmg |
| macOS Intel | Claude-Code-Haha-0.5.0-mac-x64.dmg |
| Windows x64 | Claude-Code-Haha-0.5.0-win-x64.exe |
| Windows ARM64 | Claude-Code-Haha-0.5.0-win-arm64.exe |
| Linux x64 | Claude-Code-Haha-0.5.0-linux-x86_64.AppImage 或 Claude-Code-Haha-0.5.0-linux-amd64.deb |
| Linux ARM64 | Claude-Code-Haha-0.5.0-linux-arm64.AppImage 或 Claude-Code-Haha-0.5.0-linux-arm64.deb |
macOS
双击 DMG,把应用拖入「应用程序」。正式签名和公证产物应直接通过正常 Gatekeeper 流程。
Windows
双击 .exe 安装。建议直接以当前用户运行,不要使用「以管理员身份运行」。覆盖升级前先完全退出应用;如果安装器报告相关进程仍在运行,请根据提示关闭对应进程后重试。未签名构建出现 SmartScreen 时可选择「更多信息」→「仍要运行」。
Linux
AppImage:
chmod +x Claude-Code-Haha-0.5.0-linux-x86_64.AppImage
./Claude-Code-Haha-0.5.0-linux-x86_64.AppImagedeb:
sudo apt install ./Claude-Code-Haha-0.5.0-linux-amd64.debARM64 机器请换用对应的 linux-arm64 文件。