从零打造CyberClaw:首日踩坑与突破
【从0开发类OpenClaw】Day 1:架子搭起来了,被GitHub上一课
从零写一个类 OpenClaw 的 AI 助手框架,全程记录踩坑。今天第一天:monorepo + WebUI + 推送地狱。
起因没什么高大上的。就是一直想要个完全属于自己的 AI 助手——数据自己管、模型自己接、工具自己加。OpenClaw 这东西看着确实馋,但直接拿来用总差点意思,而且我攒的那些工程化知识也没地方练手。干脆,从零自己写一个,代号 CyberClaw。
今天第一天,目标就一个:把架子立起来,能跑、能看、能推到 GitHub。
先定结构:monorepo
一开始纠结要不要上来就搞 monorepo,万一项目黄了岂不是白搭。后来想想,后面 WebUI、CLI、核心库、各种消息平台适配器是明摆着的事,拆开是早晚的,不如第一天就分清楚:
apps/ 可部署的应用(webui,将来的 cli)
packages/ 可复用的库(core、adapters)
npm-workspaces 一把梭,根目录一个 package.json,npm install 全搞定。
WebUI 直接白嫖 antd-pro
这块纠结得最久,差点一上头决定从零写 UI。冷静下来算了笔账:自己写一套管理后台,以我的水平,一周后大概率得到一坨又丑又不完整的半成品,还耽误核心业务。
最后拍板:管理界面用 ant-design-pro 模板,精力全部留给核心业务——智能体配置、模型配置、工具管理,这些才是这项目的灵魂。
antd-pro 模板的质量是真没得说,路由、权限、国际化、CI 全配好了,改起来也不费劲。不过中间还是走了一段弯路:一开始想把 antd-pro 作为独立仓库塞进 apps/webui,后来又觉得既然都是自己的代码,直接并进 monorepo 统一管理不香吗?于是就有了 commit 里那个低调的 “plan B”。没错,走了 A 方案又推翻,B 方案才是最终答案。
三个配置页
WebUI 的核心就三块,老老实实写了三个页面:
- Agents:智能体管理。起名字、写 system prompt、绑定模型、勾选工具
- Models:大模型配置。provider、baseUrl、apiKey、模型名,支持设默认模型
- Tools:8 个内置工具的开关(web-search、browser、file-ops、shell、memory、code-interpreter、image-gen、translate)
这里藏了个小设计:配置持久化先走 localStorage。因为后端连影子都没有,但前端得先能跑起来给人看。接口先按 GET/POST /api/claw/config 的约定写好,前端请求失败自动回退本地缓存,等后端出生了无缝切换,两边都不用改。
GitHub 推送:今天的最大坑
代码写完,推 GitHub。好家伙,这一推推掉我将近一个小时。
先是这个:
fatal: unable to access '...': schannel: failed to receive handshake, SSL/TLS connection failed
schannel 握手失败?换 OpenSSL 后端试试,结果变成:
TLS connect error: error:0A000126:SSL routines::unexpected eof while reading
行吧,怀疑是本地代理的问题,测试了一下,10 次请求成功 3 次,确实是代理在抽风。那把代理关了吧,直连 github.com —— 直接超时,连都连不上。熟悉的配方,熟悉的味道。
折腾到这儿已经有点想摔键盘了。冷静下来搜了一圈,发现还有条路:SSH 走 443 端口。ssh.github.com:443 这个口子在国内居然是通的。赶紧配好:
Host github.com
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519
生成 ed25519 密钥,公钥挂到 GitHub 上,git push 一把过。回头看看前面白折腾的那一个小时,只能说:早知道有这条路,鬼才去跟 schannel 较劲。
开源项目该有的体面
仓库建好后,把开源项目该有的东西一样样补齐:
- LICENSE:根目录加 MIT。webui 里那个 LICENSE 是 antd-pro 自己的,跟咱没关系,必须有自己的
- README:重写了一版,简介、特性、目录结构、Roadmap,该有的都有
- 分支管理:main 管稳定版,dev 管日常开发,合并一律
--no-ff,历史线看着舒服 - commit 规范:全程 Conventional Commits,
feat(webui): xxx、docs: xxx,规矩从第一天立好
顺带把仓库 description 和 topics 配了,GitHub 首页不至于光秃秃的。
今天的成果
* d612f07 Merge branch 'dev': add dev handoff notes
* 7ef77e5 Merge branch 'dev': rewrite README
* a00fa9a Merge branch 'dev': add MIT LICENSE
* a40500b feat(webui): remove save-all button...
* 2941882 feat(webui): rebrand to CyberClaw...
WebUI 跑得起来,三个配置页能增删改查,代码推上去了,GitHub 上能看到了。第一天的 KPI 完成。
明天干点啥
Phase 2 打算实现后端接口,技术选型使用nestjs,主要基于其一下几点特性:1. 架构规范与模块化设计 2. 深度集成 TypeScript 与类型安全 3. 企业级功能开箱即用
今天就到这。
仓库地址:https://github.com/Li-Esquire-codeverse/CyberClaw(欢迎 star 监督进度)
更多推荐



所有评论(0)