我非常生气,必须曝光它。GPT 5.6 Sol 这个浓眉大眼的,看起来那么靠谱,一上来就挖了一个坑,让它改又牛头不对马嘴!
让它分析为什么改错了,它就说是上家 Opus 自己写的也不行。直到我精准指出问题点之后,它才说是它重构的时候写错代码了......卧槽,我感觉现在我的代码不干净了。
我现在想直接铲掉它改的代码,但是我已经消耗了一周的配额......沉默的时间成本和 tokens 成本啊。这个项目 K3 重构都没出问题,你 TM 给我挖了这么多坑,浪费一天时间,只能拿来当写作素材了。
下面给大家分享一下脉络,让大家充分理解整个过程,高手和看似高手,其实还是有很大差别的!
1、核心需求
我先从核心需求说起。我之前套壳 Claude Code,并抄袭 Claude Desktop 的界面,做了一个高度还原 Claude 的中文版 Claude 桌面版,而且完全切割了官方的登录,可以轻松配置第三方模型。 
这个项目本身挺好的。但是最近做了一些 fork 版本,以及要做功能更新,发现了一个隐藏问题。就是单文件代码量太大了,快要上万行了。所以我希望重构一下这个项目,其实也不算重构,只是重新做模块化设计。
这个任务,其实 Opus 4.8 和 K3 已经在 fork 中做过一次了。这次 Opus 配额用完了,我就决定让 GPT 5.6 推进我的主项目。
2、分析问题
按照我们的惯例,有需求,先要分享需求和项目的情况。
所以我的第一轮对话是这样的:
帮我分析一下这个项目,当初这只是一个测试项目,没有做任何代码规划,所以代码结构和模块设计得不是很好,有些文件特别大,你帮我分析一下。看是否要重构一下
他的结论是:
结论:建议重构,而且已经到了"继续堆功能会明显增加回归风险"的阶段。但不建议重写,也不建议立刻迁移 React;最适合的是保持现有功能不变,按模块渐进拆分。
然后他列出了当前结构判断:
| 文件 | 规模 | 主要问题 |
|---|---|---|
| desktop/src/main.js (line 1) | 8035 行 | 305 个函数、228 处事件监听、354 处 DOM 查询,聊天、项目、设置、浏览器、终端、Claude Code 会话全部集中 |
| desktop/src/styles.css (line 1) | 4093 行 | 基础样式、主题、布局和各业务功能混在一起 |
| desktop/src-tauri/src/lib.rs (line 1) | 3179 行 | 41 个 Tauri Command、进程管理、PTY、浏览器、Skills、统计和托盘集中在一个模块 |
| desktop/src/index.html (line 1) | 1249 行 | 177 个 ID、93 个内嵌 SVG,承担了几乎全部界面结构 |
这么一看,这个项目功能点也挺多了,确实要好好整理一下了。
然后它上了经典的不是......而是。
真正的问题不是单纯"行数多",而是:
less
- 全局 `state` 同时管理设置、会话、项目、专家和 Code 状态,[定义在这里 (line 409)](E:/Jarvis_github/JClaude/desktop/src/main.js:409)。
- 模块通过 `window.__jclaude*` 临时接口通信,例如面板桥接和 Code 会话桥接,[见这里 (line 3912)](E:/Jarvis_github/JClaude/desktop/src/main.js:3912)及[这里 (line 7055)](E:/Jarvis_github/JClaude/desktop/src/main.js:7055)。
- 很多功能依赖脚本执行顺序、DOM 是否已经存在、某个全局函数是否已经声明。
- 最大的 Code CLI IIFE 单独就有约 2046 行,[从这里开始 (line 5518)](E:/Jarvis_github/JClaude/desktop/src/main.js:5518)。
- Rust 的 Claude Code CLI 和持久会话部分合计约 1400 行,仍在一个 `lib.rs` 中。
并且做了清晰的规划
P0:先补安全边界
P1:统一状态和存储
P1:建立最小测试网
推荐的目标结构:
css
desktop/src/
├── main.js # 只做启动和模块装配
├── core/
│ ├── tauri.js # 唯一 IPC 入口
│ ├── storage.js
│ ├── store.js
│ ├── events.js
│ └── markdown.js
├── domain/
│ ├── models.js
│ ├── experts.js
│ ├── system-prompt.js
│ └── i18n.js
├── features/
│ ├── chat/
│ ├── projects/
│ ├── settings/
│ ├── code-session/
│ ├── code-panels/
│ ├── experts-skills/
│ └── browser/
├── ui/
│ ├── dialogs.js
│ ├── menus.js
│ └── tooltip.js
└── styles/
├── tokens.css
├── base.css
├── layout.css
├── components/
└── features/
Rust 可以按命令领域拆分:
vbnet
src-tauri/src/
├── lib.rs
├── error.rs
├── chat.rs
├── claude/
│ ├── mod.rs
│ ├── binary.rs
│ └── session.rs
├── terminal.rs
├── browser.rs
├── skills.rs
├── git.rs
├── stats.rs
└── tray.rs
还有建议的实施顺序!
1、2、3、4、5、6......
这就是它第一轮的反馈,我贴这么多,就为了体现一点,看他这么说,我是很放心的,都说得这么专业了,感觉就是手拿把掐了。
3、重构过程
既然问题都已经清晰了,就直接干活吧。
然后它就开始干活燃 tokens 了,大概花了 40 分钟。
它信心十足的改完了第一轮,但我还是有点不放心。所以我加了第二轮的需求:
改完之后列一下单文件代码行数,另外
AGENTS.md添加一些规范和约束,防止代码单文件代码膨胀,适度模块化设计,不要太细,但是也不要全部写在一起。要便于升级维护。
好家伙,大部分确实拆得不错,然后核心的 main.js 还是有 4,000 多行,这个拆分肯定是不达标的。之前它的同行,都是把这个文件拆到只有几百行了。
我就问它为什么还是那么多,它就顺杆爬,你说得对。然后又搞了 25 分钟。
这次终于清清爽爽了!
我让它启动一下 DEV,大致看了一下没啥问题。
因为我之前用 Opus 都是这个节奏,只要它改完,我大致看了一下修改的功能,没问题就下一个问题了,基本上不会有啥问题。
我觉得 GPT 5.6 Sol,OpenAI 最强的模型,肯定也是没问题的。平时我让它打杂,它也干得特别仔细,而且它最早就是做 Codex Review 的,不可能会有啥问题的。
4、抄袭新功能
我在另外一个 fork 版本中其实已经实现了语音输入,所以让它帮我抄一下代码,顺带让它帮我把模型映射功能修改一下,把 Fable 5、Opus 5、Sonnet 5 这些新模型名字加上。

这一步做的还是不错的,很稳,没出现啥问题。
然后后面还让它改了不少功能,比如给软件添加一个默认的 workspace,然后调整主界面的布局,把 Code 放到左边,Chat 放到右边,以及剔除掉 Cowork 相关的功能(终于等到这一天了,官方已经去掉这个大的 Tab 了)。
另外呢,让它帮我根据软件工程相关的内容,设计了一批助手。

整体来说干得挺不错,我当时就在想,Opus 也不是唯一,你不干有的是人干。你看人家也干得挺好的。
5、问题来了
我大概让它改了三四个问题,周配额也消耗完了。我就想着打开软件随便点点看。首先我发现一个小问题:

它虽然把代码 Tab 放到了左边,但是它默认选中的还是聊天。这一点就不是很智能。但凡智商正常的人,我让它把 Code 放到了左边,就应该知道,我希望默认选中的是 Code 了。
当然,这个问题不大。既然它默认还是聊天,我就看一下聊天功能。
然后问题来了:

上图是正确的状态。它改成了其他样子。
我点击右上角内嵌浏览器图片,我就可以快速打开 Claude、GPT、Gemini、DeepSeek 等官网。之前这个功能是好的,为了设计这个功能,也是花了一点时间的,包含了很多控制逻辑,也踩过好几个坑。
然后,这次发现不对了!
问题在于,我点击浏览器之后,内嵌浏览器是打开了,但是上面的返回按钮和 Tab 都没有了,我根本就没法用。到这里我就有点慌了,因为我不知道它哪个环节引入的问题。
然后我就赶紧给它描述这个现象,告诉它正确的做法,为了让它能理解,我描述得非常清晰。它也成功地解决了这个问题。
但是,我又发现了另外的问题。
你瞎改的吧!
现在用了内嵌浏览器之后,我聊天和代码都无法切换了,另外我点击浏览器里的某个网页,现在 Tab 是显示出来了,但是并没有打开对应的网页,只是显示默认内容。
这里面已经不是一个 Bug 了,而是好几个!
为了让他纠正这些问题,我又写了几百字。我以为我写的很清楚了,但是它还是改错了。

因为我提到了,内嵌浏览器打开之后再隐藏掉,左边的 Code 和 Chat 的 Tab 就无法点击了。它理解成,内嵌浏览器打开之后,不占据左边区域,只占据右侧区域。
傻逼,说话怎么就这么累呢!
我一看它改的不对,立马刹车,强调了一下,终于改对了。
然后又出现了,内置浏览器切换 Tab 自动刷新的问题......你这是想逼 Anthropic 给我封号么?
到这一步我就不淡定了!
为了定位这个问题,我让它自己去对比重构之前的代码,确认当前这个功能相关的代码是否和之前一致!
然后它给我列了一个时间线:
markdown
- `58bf96b`,项目版本 `0.5.5`:首次加入内置浏览器。
- `a6bea67`,项目版本 `0.5.5`:建立"关闭浏览器不销毁 Tab、重新打开恢复"的预期逻辑。
- `627e98a`,项目版本 `0.5.5`:加入切换工作区时停放和恢复。
- `v0.6.0`:第一个正式包含内置浏览器的 Git 发布版本。
- `61881dc`:Chat 加入项目页面后,浏览器只在 Chat 首页恢复;这发生在重构之前。
- `ab63a49`,项目版本 `0.8.0`:拆分重构,同时引入
`document.document.body` 回归。
- `515d3a8`:修复顶部栏并加强弹层停放顺序。
- `71d6069`:我错误理解需求,临时改成打开浏览器仍保留侧栏;这是一次错误的中间提交。
- `26bad8c`:恢复全窗口覆盖和关闭后交互。
- `311c477`:停放时不再缩成 1×1,避免页面表现得像刷新。
除了这个列表之外,它还特别强调了之前的代码有什么什么问题,它帮我做了优化。
我实在不想看这个,我关心的是,这个内嵌浏览器的功能为什么出错,是不是你搞出来的?
然后它告诉我确实是它重构的时候搞出来的。
dart
你问得对,我之前没有把"根因"和"暴露时间"讲清楚。
结论是:后面那批语音、模型、助手等功能,本身不应该需要"修复顶栏"。顶栏出问题的真正原因,是更早拆分 main.js 时,我把:
document.body.classList.toggle('web-mode', on);
误写成了:
document.document.body.classList.toggle('web-mode', on);
这个错误从重构提交 ab63a49 开始就已经存在。
卧槽,你是正经写代码的么? 这都能误写!
另外还有一个细节它也自作聪明给我改掉了,这个坑我和 Opus 已经踩过了,应该是写了注释的,它又踩回去了,心累!
这个问题改完之后,我始终不太放心,又点了点其他功能。又被我轻松抓到一个 Bug。

软件主界面关闭之后,点击托盘不显示主窗口。这个功能之前绝对是好的。但是现在又坏了。
我就质问他:
为什么我现在双击托盘又打不开主窗口?帮我检查并修复
它花了 7 分钟修好了。
它说根因是:Windows 双击托盘会产生两次左键事件,原逻辑每次都切换窗口显示状态,导致"显示后立即隐藏"。
修复:
- 托盘左键改为只显示、还原并聚焦主窗口:lib.rs (line 111)
- 右键菜单的
Show / Hide继续保留切换能力。 - 更新托盘行为说明:tray.rs (line 5)
验证结果:
- 实测"隐藏主窗口 → 双击托盘 JClaude → 主窗口恢复"通过。
- 32 个前端测试、10 个 Rust 测试、结构检查、ESLint、前端构建及 Rust 格式检查全部通过。
- 已独立提交:
a251b17 fix(desktop): 修复托盘双击无法打开主窗口
你看它写的都是挺专业的,而且还做了实测,确实功能也改好了。
但是......它又自作聪明动我需求了。我要求的就是点一下显示,点一下关闭。我就是这种癖好,我就是需要能打开就能关闭。
我批评它,它就说:
你说得对,我上一轮把原本明确的"单击切换"交互改成了"只打开",这是规避现象,不是恢复原设计。
然后它又告诉我这是本来就存在的 Bug,只不过是偶发,这次到它手里才显现出来。它又说了一堆很专业的话。我已经相信它了,但是按它改完的版本就有点卡顿,就是没有之前版本流畅。GPT 大部分时候还是很靠谱的,只是你们也看到了,该出问题的时候,还是出问题。
哎,说得好听,写得也专业,情绪价值给到位。最后问题也算是修复了,但是很多问题就不应该产生。我还是心有余悸。还是乖乖找我 O 哥去了!
递烟捶背:"O 哥这活还得你来,其他人我不放心。 "
说一千道一万,还是 O 哥省心,现在 5 代 O 哥更牛逼了,只要是代码榜单,都是第一!
本来我都可以发布新版本给大家玩了,现在还得折腾一下,等 O 哥配额恢复,再复查一遍!