#1 — Untitled session can't be deleted src/server/services/sessionService.ts:deleteSession is now idempotent. Previously placeholder sessions whose JSONL file hadn't been flushed yet would 404 the delete and stay stuck in the sidebar list. Now we succeed silently if the file's gone (and treat ENOENT during unlink the same way), matching how the frontend already optimistically removes the row. #2 — Run button turns red 「stop」 on idle when switching model desktop/src/components/chat/ChatInput.tsx — gate isActive on hasMessages. ModelSelector / runtime config changes briefly flip chatState off-idle (CLI reconnect / startup). Without messages there's nothing to stop, so the button should stay disabled gradient, not turn into a red stop affordance. #3 — Draft input bleeds across session switches desktop/src/components/chat/ChatInput.tsx — ChatInput is mounted once at app shell level; switching tabs doesn't re-mount it, so the local `input` useState carried over. Add a useEffect keyed on activeTabId that resets input + attachments + open menus + filter buffers. composerPrefill path (rewind) keeps owning its own reset via the existing prefill effect. #4 — Close (×) minimized to tray instead of quitting desktop/src-tauri/src/lib.rs — drop the prevent_close + hide pathway on the main window's CloseRequested. Close now actually quits; users who want to keep the app running can minimize via the existing window controls. Tray icon stays available for re-open + explicit quit. #5 — Tray menu hardcoded "Claude Code Haha" desktop/src-tauri/src/lib.rs — rename tray menu items, tray tooltip, and macOS app submenu to "Heicode" / "显示 Heicode" / "退出 Heicode" / "关于 Heicode". #6 — Skills page silently empty when one source crashes src/server/api/skills.ts:listSkills uses Promise.allSettled so a single failed source (user / project / plugin) returns a partial list + structured errors[] instead of tanking the whole response. desktop/src/api/skills.ts + stores/skillStore.ts thread the errors through; SkillList only shows the hard-error wall when skills.length === 0. Verification: bunx tsc -b --noEmit (desktop) — clean bunx tsc --noEmit (cc-haha root) — clean cargo check (src-tauri) — clean Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Claude Code Haha Desktop
基于 Tauri 2 + React 的桌面客户端。
开发
bun install
bun run tauri dev
构建
# macOS (Apple Silicon)
./scripts/build-macos-arm64.sh
# Windows (x64, MSI only)
.\scripts\build-windows-x64.ps1
构建产物位于 build-artifacts/ 目录,文件名会显式包含平台、架构和包类型。
常见问题
macOS 提示"已损坏,无法打开"
xattr -cr /Applications/Claude\ Code\ Haha.app