【从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): xxxdocs: 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 监督进度)

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐