感谢伟大的 AI 工具,Code 功能还真的被我搞出来了!
深色主题如下:

浅色主题如下:

修改代码情况如下:

我本来只是想测试一下大模型的 UI 复刻能力。没想到直接把 Claude 桌面版软件给复刻出来了。
既然 UI 有了,我就把对话(Chat)功能也实现了。
既然能对话了,那必须能写代码啊,所以把Code功能也搞出来了。
现在的情况,就是相当于我做了一个界面版的Claude Code,而这个界面其实就是官方版的界面😄!
闭环了!
我不光要抄它,还要超越它了。
毕竟我们的克隆版拥有官方永远都不具备的功能:纯的不能再纯的纯中文界面;可以外接任意模型,国内国外都可以。
中文界面如下:

第三方模型配置如下:

把 Anthropic 的 API 配到这里,这不就是官方纯血版了。
理论上,你甚至可以把 OpenAI 的 GPT5.5 接入这个 Claude 桌面版。(我必须实现这个功能!)
下面我就来跟大家汇报一下,具体修改了什么东西。
我主要是分两个部分来讲,一个是界面上的修改,一个是实现的技术方案!
界面修改
这次的修改核心,就是为了跟上 Claude Desktop 的新版布局。我第一次克隆它到现在,它的界面细节已经有了很多变化。
最明显的就是三个 tab 的切换:

它的左侧区域中,把聊天 Chat、工作 Cowork、代码 Code 做了区分。它的思路也很清晰了,它这个桌面版包含了三大功能,针对三种重要场景。另外它这个左侧框也变了,把菜单、搜索、展开的图标放到了最顶上。
为了与时俱进,我也给加上了!

另外有一个细节,它的 Code 模式,在右下角添加了一个开关图标,可以快速切换字体和主题。我也加上了,现在已经可以快速切换主题了,字体功能没加,目前还没有专注字体优化。
也就是说,现在我们这个"山寨版"的Claude也有三个大功能了。
第一个是聊天 Chat 功能。

这个功能的特点,就是纯聊,就是直接跟 AI 聊天。
缺点是不能控制电脑和读写文件。
优点是省 tokens 啊,快啊。知识问答的最佳选择。
第二个是办公 Cowork。

因为我很少用这个功能,所以现在还只是做了个界面,并没有实现。等我以打工人视角切入的时候,再来更新这个功能,把它搞成"办公的效率神器"。官方这个功能,主要是可以分配任务,然后执行定时任务,以及手机远程操控电脑等功能。
第三个是编程 Code。

写代码是我的高频场景,也是目前的模型真正能落地的能力。所以我要先完善这个功能。今天就是重点讲这个!
其实这个 Code 功能,不仅仅限于编程,任何工作都可以使用。
目前我们的克隆版主要是实现了 token 预览、模型选择、项目选择,以及权限控制等界面效果。

其中的 tokens 消耗统计,目前这个还是摆设,并不是真实数据。我已经在 JCode 中实现过这个功能,不会很难。
文件夹选择,这个是必备功能,所以制作了 UI 并已经实现了功能。
模型选择,也是必备功能,已经制作了 UI 并实现了功能。
而且最近更新的 Opus 4.7 fast mode 都有哦~ 虽然对第三方模型来说没啥用,但是也得有!
做界面嘛,怕什么,先加上!

授权选择,也是必备功能,已经制作了UI,并实现了功能。
这些UI的内容、描述、布局还原度还是比较高的。
很多时候,我自己都有错觉,我到底是在用 Claude 还是在用克隆版的 Claude。
还好,具体的对话界面和官方版是有差别的。
官方版的输出有点"太平了"!

就是文字内容和工具调用混在一起,没有很好的区分,有种密密麻麻的感觉。这一点 Codex 的 UI 会好一点。
Claude本身的UI是非常有特色,这几个月疯狂更新,有些设计变得很潦草了。
比如,用户输入这个蓝色框和内容,与整体的软件风格完全是格格不入,不知道它们怎么想的!
我在实现这部分的时候,我希望能比较好的来观察整个执行过程。
目前还在优化中,当前的效果大致如下:

这样可以清晰的查看每一个环节发生了什么。
比如写入工具,到底写了什么文件,写了什么内容。
授权工具,到底是授予了什么权限,做了什么。
这些工具调用,全部可以展开和收起,默认收起状态不占空间。如有需要可以手动展开查看细节。
每一次问答和授权都会有明确的交互界面。
目前这个风格,感觉分块还是有点多,还有很大优化空间。
界面大概就是这些,虽然看起来很简单,但是要搞成这样,没有奇怪的样式,也不是很简单。
把一个界面做到简单又好用是非常难的,仅仅是看起来不讨厌已经很难了。
技术方案
刚开始动手之前,我其实没啥信心。因为我知道实践总是比想象中的要复杂很多倍。
为了少走弯路,我也是做了一些功课。
方案对比
大概有这么几种方案:
第一种,直接spawn本地的Claude Code
优点,Claude Code全套能力零成本拿到,我的UI功能基本可以一对一实现。
缺点,用户电脑要有 Claude Code,拿不到 agent loop 的内部内容,只能通过 JSON 事件观察
这些缺点还是可以接受的。
没有装的话提示安装就行了,或者直接使用sidecar打包。
agent loop的内部内容我也不关心啊~~能通过JSON交互就够了!
第二种,嵌入Claude Agent SDK
这个也是 Claude 官方产品,专门为专业开发者提供的专业智能体开发套件。
优点是可控性更强:tool 定义、system prompt、hooks、上下文压缩都可以自己来控制。
缺点是我怕我搞不定~~哈!因为 Opus 告诉我这个方案"等于把 Claude Code 重写一遍"!
不是不能写,实力不允许啊,主要是 tokens 不允许啊!
第三种,接入类似 Pi Agent 这种第三方智能体。
Pi 是 OpenClaw 的智能体实现部分。
我咨询了所有的AI,它们都没有把这个作为首选方案,我就不讲了!
确实,有条件上Claude Code,没理由去用Pi,谁用Pi写代码啊!
我已经卸载了所有龙虾,对我而言龙虾只是玩具,没有任何其它意义,Claude 和 Codex 才是干活的!
所以,最终我毫不犹豫地选择了第一种方案。
而第一种方案的关键,就在下面一行命令之中:
css
claude --print --input-format stream-json --output-format stream-json --verbose --permission-prompt-tool stdio --permission-mode acceptEdits --model GLM-5.1
为了探索出这一行命令,我也是花了不少时间,看了很多资料,并且进行了多轮实践。
开发目标
大的方案选完之后,还要问一下自己,有哪些核心目标。
1、全方位复用Claude Code
2、和官方模型解绑,接入任意第三方模型提供商。
3、界面操作体验要和Claude桌面版对齐,模型选择,权限控制等。
4、可以管理session和对话。
代码结构
这个是Opus总结的调用结构。
lua
┌─ Tauri front-end (vanilla JS) ─────────────────────────────────────┐
│ Code workspace UI │
│ • cwd 选择 / model / mode / send │
│ • 三种特化权限卡:AskUserQuestion / ExitPlanMode / 通用工具 │
│ • 折叠工具块、思考中胶囊、markdown 渲染、Recents 持久化 │
│ ▼ │
│ invoke('claude_code_session_*') │
└──────┬──────────────────────────────────────────────────────────────┘
│ Tauri IPC
┌──────▼──────────────────────────────────────────────────────────────┐
│ Rust commands (desktop/src-tauri/src/lib.rs) │
│ claude_code_check 探测 CLI 是否可用 │
│ claude_code_config_dir 暴露隔离的 CLAUDE_CONFIG_DIR │
│ claude_code_session_start spawn CLI、起 stdin writer + init │
│ claude_code_session_send 写一条 user message 到 stdin │
│ claude_code_session_respond 写 control_response 到 stdin │
│ claude_code_session_set_mode 中途切 plan/acceptEdits/... │
│ claude_code_session_end kill 子进程 │
│ │
│ emit "claude-code-event" ◄── stdout JSON lines │
└──────┬──────────────────────────────────────────────────────────────┘
│ stdio
┌──────▼──────────────────────────────────────────────────────────────┐
│ claude --print --input-format stream-json │
│ --output-format stream-json --verbose │
│ --permission-prompt-tool stdio ← 关键 flag │
│ env: ANTHROPIC_BASE_URL / ANTHROPIC_API_KEY / │
│ ANTHROPIC_MODEL / CLAUDE_CONFIG_DIR / CI=1 │
└─────────────────────────────────────────────────────────────────────┘
因为涉及到一些内部的代码,可能有点难懂。可以看个大概!
业务流程
1、启动检测,需要看看有没有 Claude Code。
2、选择目录,所有开发必须先选择工作目录。
3、发送第一条消息,要跳过官方权限检测,同时要隔离官方 Claude Code 配置。
4、后续轮询,同一个session不重启进程。
核心协议
整个调用比较困难,或者说比较花时间摸索的是 JSON 格式,也可以称为"核心协议"。
我们得摸清楚 Claude Code 返回的信息格式是什么样,工具调用、授权、Ask 这些交互都是如何返回和如何发送的。
比如一开始就遇到了Ask模式里面无法回答Ask的问题。
然后,Plan模式无法选择选项,以及无法退出Plan的问题。
还有各种授权被挂起来的问题。
这里细节非常多,关键是 --permission-prompt-tool stdio 和 can_use_tool!
跑通这个协议的步骤大概是这样的。
1、传上面的关键参数:
css
--permission-prompt-tool stdio
2、初次握手(host->CLI)
json
{"type":"control_request","request_id":"init-<sid>","request":{"subtype":"initialize","hooks":{}}}
3、接收返回(CLI->host)
json
{"type":"control_request","request_id":"...","request":{"subtype":"can_use_tool","tool_name":"<name>","input":{...}}}
然后根据具体的信息,处理 AskUserQuestion、ExitPlanMode、Bash、Write、Edit、Read、WebFetch、WebSearch、Glob、Grep、Task 这些类型,弹出对应的确认卡片给用户选择。
4、下发反馈(host->CLI)
json
{
"type": "control_response",
"response": {
"subtype": "success",
"request_id": "<原 control_request 的 id>",
"response": {
"behavior": "allow"|"deny",
"updatedInput": {...}|null,
"message": "..."|null
}
}
}
注意control_response有两层response嵌套。
5、中途切换权限模式
json
{"type":"control_request","request_id":"set-mode-...","request":{"subtype":"set_permission_mode","mode":"plan|acceptEdits|default|bypassPermissions"}}
主要的操作都在这里了。
作为一篇公众号文章,好像讲得有点多了,我要收一下。
技术细节就不展开了。
我这次开发主要遇到了以下几个问题:
go
问题 1:UI 卡死,发送按钮无法点击取消
问题 2:响应只到第一条,无法继续
问题 3:"Not logged in · Please run /login"
问题 4:Overview 卡片在会话开始后还占位
问题 5:cwd 默认指到了 `src-tauri`
问题 6:Ask permissions 模式下工具被静默拒绝
问题 7:AskUserQuestion 提交答复后 CLI 没反应,超时报 "stream closed"
最后补充下遗留问题和后续改进方向:
scss
1、Worktree 复选框尚未联动
2、未对接 `--add-dir`:cwd 之外的额外参考目录还没 UI。
3、MCP server 配置
4、`--resume <session-id>` 续接
5、真实 token 计费
6、权限协议字段兼容性,这是个持续性的事情
7、AskUserQuestion 题数限制,现在默认官方遵守规则,我就不做校验了。
8、Always allow 颗粒度的问题
这里面的 resume 是比较关键的。其他部分不是很紧迫。
哪个孙子骗我说调用一下Claude Code很简单的?!
一大堆问题,一个头两个大,写代码,就是个无底洞。
万幸,核心功能已经搞定了,简单测试,非常丝滑。
万事开头难,最难的部分已经过去了。
这次文章的主要内容就是这些了。
说点题外话!
上次发布第一个版本之后,很多人给了鼓励和支持,也有很多人默默获取了软件。
我还是挺开心的!
但是也有一些人表达了一些比较负面的评论。
比如套壳有什么用,重复造轮子毫无意义,搞个界面有什么,有种把Claude Code也给加上!
这就让我有点不开心了
其实,这些问题,我也早就问过自己。
但是当别人怼脸批评的时候,我还是要反驳一下,仅针对发表相关评论的人。
有没有用关你什么事情?我觉得有意义就行了;我又不是给你打工的,我又不收你的钱,爱用不用;Claude Code 已经加上了,别哔哔了!
因为有人觉得没啥用,那我就自己用吧,不更新了!
开玩笑的~~ 既然我写出来了,就证明我的气早就放完了!
暂时不更新的主要原因是:我的Claude Code 周配额已经耗尽!
实测,Claude 的周配额还是很少。
同时我不想让其它模型插手我的软件,我要坚持用 Claude 克隆 Claude! 
目前,有些软件细节还没改完,没法打包,所以我先把界面、进展、关键技术记录一下,稍后更新。
日子很长,不差这几天!
最近没啥牛逼的闭源更新,我都要跑去玩开源了,有啥好玩的开源项目没?
开源自己的项目?!
Claude的第一个克隆版,可以看这篇文章,文末有获取方式!