Skip to content

Claude Code Haha v0.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 27 Jul 00:52

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_keyx-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/ 下整块硬编码的中文和多处硬编码英文。TranslationKeyen.ts 推导,缺键是编译错误而不是运行时空白。
  • 终端配色从硬编码的 20 个十六进制值改为读取按主题定义的 --color-terminal-* token。
  • 下拉菜单获得 listbox 语义、方向键导航和焦点返回;21 处手写的外部点击处理统一为 useDismissable,默认使用 pointerdown——mousedown 在触屏上不可靠,这正是 H5 上「点外面菜单不关」的成因。
  • 新增仅开发环境可用的组件画廊(/gallery.html),在三套主题下渲染全部原语。单元测试无法判断 token 是否解析成可读的颜色、浮层是否盖在该盖的东西上方、入场动画是否真的播放——画廊本身就发现了三个测试全绿却存在的缺陷。
  • 文档站用 React 重建,落地页文案重写。
  • 组件库的使用规则、分层依据与审计证据记录在 desktop/src/components/AGENTS.mddocs/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 Desktop workflow 不运行该门禁,pr-quality workflow 会运行。
  • 未执行项,不计为通过:6 条 baseline case 与 1 条 provider live/proxy smoke 需要真实 provider 凭据,本机未运行;desktop-package-smoke 需要已签名的本机 release 产物,由 CI 的 Verify packaged app structureVerify macOS launch policy 覆盖;本轮 UI 重构未做真机逐屏走查;v0.4.11 -> v0.5.0 的真实自动更新链路需在 Release 发布后验证。
  • 上述证据只覆盖本机候选构建与测试,不等同于正式签名、公证或跨平台安装的端到端验证。

Notes

  • GitHub Release 正文以 release-notes/v0.5.0.md 作为唯一来源。
  • 桌面端发布版本号来源是 desktop/package.json;root package.json 继续保留本地开发用的 999.0.0-local。发布时必须确保版本号、Git tag v0.5.0 和本文件严格一致。
  • 版本号从 0.4.11 跳到 0.5.0 不影响自动更新。electron-updater 使用 semver 比较(semver.gt)而非字符串比较,且更新元数据取自仓库最新 Release,与版本号是否连续无关。0.5.0 不带 prerelease 后缀,仍走稳定通道,元数据文件名不变。
  • Release Desktop workflow 会构建 macOS、Windows 和 Linux 的 x64 / ARM64 安装包,并在完整资产和 updater metadata 校验通过后公开 Release。
  • 自动更新验证路径是正式 v0.4.11 -> v0.5.0。发布完成后需核对 latest-mac.ymllatest.ymllatest-linux.ymllatest-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.AppImageClaude-Code-Haha-0.5.0-linux-amd64.deb
Linux ARM64 Claude-Code-Haha-0.5.0-linux-arm64.AppImageClaude-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.AppImage

deb:

sudo apt install ./Claude-Code-Haha-0.5.0-linux-amd64.deb

ARM64 机器请换用对应的 linux-arm64 文件。