🔀 HOOP → LOOP 分代码方案(2026-09-26,Sora Master)

HOOP 系统设计图纸 · 正文唯一真相是 docs/LOOP分代码方案.md;改 md 再跑 ./tools/deploy_docs.sh,这页是生成的

版本 d3c617183
2026-09-27 19:49

这份回答一个问题:HOOP 的核心(聊天、通话、工作房、AI)怎么一块块给 LOOP 商业版用,而且以后两边都改、不会分成两套对不上的代码。

起因:Jeff 2026-09-26 15:49 在 Source Code 房的语音:「我们这个代码,我想从 HOOP 搬到 LOOP,就是我们的商业版……他不需要我们的游戏,但是聊天、工作房、AI、哨兵,我要一块一块搬过去……他改的东西我也改,但是在 LOOP 软件层面我不管,核心的核心……你跟我设计一下。」

读取时刻与基线:origin/master eeb3234c1(2026-09-26)。§3 的依赖表是 git grep 每个包的 import 数出来的,行数是 wc -l,不是估的。

状态:方案,还没动一行代码。 动手前要 Jeff 定的三件事在 §7。


0. 一句话

不复制,拆核心。 把两边都要的那一块抽成独立仓库 hoop-core,HOOP 和 LOOP 都依赖它;各自的产品层随便改,核心只在一个地方改。


1. 为什么不直接复制一份

复制那天两边一模一样,一个月后就是两套代码:

  • LOOP 修了一个聊天的 bug,HOOP 里还在;HOOP 修的,LOOP 也没有。
  • 每修一次都要手抄两遍,漏抄一次两边就开始对不上,而屏幕上看不出谁是新的。

这正是铁律 23 说的「同一件事只能有一个出处」。复制 = 两个出处。


2. 推荐的结构:三个仓库

仓库 里面是什么 谁能看 谁能改
hoop-core 登录、用户、好友、会话、消息、通话、在线状态、通知、工作房、AI —— 两边共用的那一块 HOOP + LOOP 两边都能提合并请求,HOOP 这边审过才合
hoop(现在这个) 依赖 core + 游戏、城堡、音乐、钱包、羁绊、温度…… 只有 HOOP 有的 只有 HOOP HOOP
loop(新的) 依赖 core + LOOP 自己的界面和功能 LOOP(+ HOOP) LOOP 随便改
  • 核心改动只能在 hoop-core 里改。 两边各自升级 core 的版本号拿到新核心 —— 谁什么时候升,自己定,不会被对方突然改坏。
  • 后端 core 是一个独立的 Go 模块(现在的模块名是 github.com/jeffchoong/hoop/backend,core 要有自己的模块名);App core 是一个 Dart 包。
  • LOOP 那边永远只拿得到 hoop-core 和 loop,拿不到 HOOP 主仓。 游戏、经济、城堡这些不出门。

3. 难点:核心现在不是干净独立的(实查)

后端每个候选核心包 import 了哪些别的包:

核心包 行数 它牵着的(非核心的加粗)
auth 6057 —(干净)
user 1764 auth · bond(羁绊)
friend 2160 auth · block · notification · bond · warmth(温度)
conversation 6218 auth · notification
message 14851 auth · block · callkeys · calls · conversation · presence · post(帖子)· room(房间)· risk(风控)
calls 10735 auth · callkeys · notification
presence 474 auth · friend
notification 742 auth
workroom 9413 ai · assistant · auth · contrib · developer(开发者平台)
assistant 4291 ai · auth · block · conversation · message · wallet(钱包,扣 Sparks)
ai 1875 auth

另外 auth / conversation / message 还 import 了 internal/ops(管理后台那一层),搬之前也要看清是拿它做什么。

所以搬之前要先「剪线」:核心里只留一个接口(比如「给这句话算温度」「扣这个人的额度」),HOOP 把温度、钱包接上去,LOOP 接自己的,或者不接(空实现)。

App 这边更缠:聊天页 app/lib/screens/chat_screen.dart 一个文件 13906 行,里面混着 HOOP 独有的东西(grep 数的:提到 game 27 处、warmth 38 处、sticker 205 处)。这块要最后、最小心地切。

这是真工作量,不是复制粘贴。 所以要一块一块来,每一块都能单独验。


4. 顺序

块 搬什么 为什么排这里
第 1 块 登录 + 用户 + 好友 + 文字聊天(会话、消息、通知、在线状态) 最小能跑的一版,先让 LOOP 部署起来、有人能登录、能聊
第 2 块 通话 本身比较独立(只牵 auth / callkeys / notification)
第 3 块 工作房 要先把「开发者平台」那根线剪开
第 4 块 AI 助手 要先把「钱包扣额度」那根线剪开;LOOP 用不用 Sparks 由 LOOP 定
以后 哨兵 Jeff 说新做,不从 HOOP 搬

每一块都走同样四步:

  1. 在 HOOP 里把这块的线剪开(换成接口),不改任何行为
  2. HOOP 自己跑一遍:编译、全部测试、真机看过 —— 确认 HOOP 没被剪坏
  3. 把这块搬进 hoop-core,HOOP 改成从 core 拿
  4. LOOP 接上这一块,在 LOOP 自己的服务器上跑起来

第 1、2 步只动 HOOP,随时可以停;到第 3 步才出现新仓库。


5. 数据库

  • HOOP 现在有 398 个迁移,大半是游戏、经济、城堡的表。LOOP 不继承这一串。
  • core 带自己的一套迁移,只建核心那几张表;LOOP 从零建库,只跑 core 的迁移 + LOOP 自己的。
  • HOOP 这边已经有的核心表,表名和字段不改(改了要迁移,还会让装在用户手机上的旧包炸)。core 的迁移要写成「表已存在就跳过」,这样同一套迁移在 HOOP 的老库和 LOOP 的新库上都能跑。

6. 必须守住的几条

  1. LOOP 永远看不到 HOOP 主仓。 只给 hoop-core 和 loop 的权限。
  2. 密钥一个都不带过去。 每一块搬之前扫一遍:钥匙、证书、服务器地址、api.hoopcomm.com 这类写死的域名,全部换成配置。扫的命令和结果写进那一块的提交说明。
  3. LOOP 用自己的服务器、自己的数据库、自己的推送证书、自己的 App ID。 不和 HOOP 生产共用任何一样 —— 共用的话,LOOP 一次误操作会动到 HOOP 的真用户。
  4. 核心归谁、改了算谁的,写一张简单的约定。 就算是自己人,以后团队会换人;没写下来的东西,换一个人就没人记得。
  5. 往外部仓库推代码,每一次都要 Jeff 给的仓库地址。 不自己建外部仓库、不往没确认过的地址推(铁律 30)。

  6. 历史记录也算「带出去」。 如果搬的时候连 git 历史一起带(方便追「这行谁改的」),历史里曾经提交过又删掉的钥匙也会跟着出门。所以:要么不带历史、从干净的一版开始;要么带之前把历史整段扫一遍。第 1 块默认不带历史。(Cora Master 09-26 提的)

  7. 第三方依赖的许可证要核一遍:给另一家公司用,和自己用不是一回事。

6½. 核心怎么管(Cora Master 09-26 补的,我同意)

  1. 核心边界清单跟核心代码放在同一个仓库。 每块写清:包含什么、对外接口、两边负责人、测试要求。按目录划,不逐个文件登记(逐个登记 = 一改就漏)。
  2. 谁同意才能改: · 核心的接口、数据结构、行为变了 → 两边各一名负责人同意才合 · 核心内部修 bug、不改接口 → 按约定的维护权限处理,不用两家全员点头 · LOOP 自己的界面和业务规则 → LOOP 自己定
  3. 两边各自钉版本。 比如 HOOP 用 core 1.2、LOOP 用 1.1;core 发 1.3 后,两边分别测、分别升。不会一合代码就同时改动两个线上产品。
  4. 合进核心之前,两边的兼容测试都要过。 数据库升级也各自在自己的环境跑,一边先升不能逼另一边当天跟。
  5. 抽哪块,那块就要两边真的引用同一份代码。 只给 LOOP 拷一份、HOOP 还留着旧实现 = 还是两套。第 1 块(登录 + 聊天)就是用来验证这条路走得通的。

7. 动手前要 Jeff 定的三件事

  1. 新的 GitHub 仓库:建好了吗?地址是什么?(hoop-core 和 loop 两个,还是 LOOP 那边已经有一个?)
  2. LOOP 的后端:是自己一台服务器吧?谁管?
  3. 第一块先搬「登录 + 聊天」,同意吗?

8. 我没做的 / 不确定的

  • App 端的依赖我还没逐文件数,只量了聊天页的大小。App 第 1 块真动手前要先出一张和 §3 一样的表。
  • 工作量没估天数。 第 1 块剪完线、HOOP 跑通之前,估出来的天数都是猜的。
  • internal/ops 被核心 import 的那几处具体用途还没看。
  • 这份方案还没给 LOOP 那边的人看过。他们的技术栈、要不要用我们的 App 壳、界面要改多少,都会影响 §4 的顺序。