Skip to content

AIO 落地方案(第二版)

配套:AIO-ARCHITECTURE.mdPLUGIN-AUTHORING.mdCONSTRAINTS.md

每个阶段独立可用。上游 10 个仓库各自在演进,AIO 不能是「全做完才有用」的工程。


Phase 0 — 框架内核 ✅ 已完成

交付状态
@magireco/core:ref 语法(强制 universe 前缀)、能力/意图、事件总线
@magireco/registry:交叉表,拒绝跨作品关联与编号猜测
@magireco/resource:清单、多源回退、https 强制、sha256 校验
@magireco/kernel:插件注册、意图派发、surface 生命周期、WebGL 上下文治理、iframe RPC 桥
@magireco/plugin-sdkdefinePlugin + 无头测试宿主
契约与守卫改为插件模型,16 个坏样本自测

验收(已通过):npm run check —— 69 个单元与整合测试 + 16 个守卫坏样本,strict 模式 typecheck 全绿; 三个整合场景端到端跑通(剧情→ADV→进度回流、档案→iframe 精灵、插件互发意图)。


Phase 1 — 第一个真插件 + 宿主外壳

先挑一个 ESM、inline 隔离的上游打头阵(最简单);再挑一个靠全局变量活着的, 用来验证 iframe 桥在真浏览器里成立。

步骤说明
1.1已完成 apps/station:Next.js + React 19 宿主外壳,output: 'export' 静态导出到 EdgeOne Pages 单项目。含 React↔内核的 surface 桥、能力驱动的 UI、插件装卸后台。现在装着四个真实现,一个占位都不剩,见 apps/station/README.md
1.2已完成 packages/plugin-model-3d:把 example-model-viewer 包成插件,模型走资源面。上游一行未改(它的构造函数本来就是 Record<路径, URL> 注入式),10 个测试全在 node 上跑——上游两个类是注入的,不需要 three.js 与 GPU。尚未接进 apps/station:要等上游那个 three.js 子包可安装(发包或 git 依赖)
1.3已完成,但换了做法sprite.show 不再等 cocos2d 子帧,而是 @magireco/plugin-sprite 从零实现(骨骼 + 图集解析、父子合成、canvas2d 舞台),已装进 station。上游 cocos2d 那个候选仍登记在册(contracts/capabilities.jsonsprite-viewer),接不接都不影响能用
1.4交叉表首批数据:先做 810 个精灵 unit ↔ charaId 的人工核对
1.5已完成 apps/station 的资料页:角色档案 → 点一下出精灵、出 3D、播剧情、看身高对比。每个按钮画不画都由 kernel.can() 决定

为什么 1.3 换了做法:维护者的约束是不改上游(开源仓库直接改别人的项目, 既是越界也牵出许可证问题)。ADR 0002 因此把顺序倒过来——先有不依赖任何 上游的实现,上游愿意接时它是同一契约的又一个实现。于是「接上游」从 前置条件变成可选项,路线图上多个阶段的依赖关系随之松开。

验收

  • ✅ 拔掉一个插件,档案页对应的按钮消失,其余功能不受影响 (apps/station/test/catalog.test.ts 逐个插件钉住;这条是框架是否成立的判据);
  • 同一个页面上先后打开 3D 与精灵,两个运行时互不干扰;
  • 开够 5 个 WebGL surface,最早的被 suspend 而不是变黑;
  • 断掉主 base,资源自动回退到备用 base。

后三条要等真 WebGL 舞台与真资源面,本地判不了。

工作量:6–9 人日。


Phase 2 — 资源面搬迁

把 20 GiB 资源迁到 COS + EdgeOne CDN,生成清单。这是最大的一块, 也是所有后续阶段的公共前提。

步骤说明
2.1COS 桶 + EdgeOne 回源,绑 assets.<域>
2.2已完成 tools/build-manifest.py:扫目录出 {path, role, bytes, sha256}不需要域名/账号/桶权限,所以先做了——清单能离线生成、离线校验,等桶开好直接上传。15 条自测覆盖失败路径与 --role 强制指定
2.3sprite/ 4,025 组 → 2.4 sp/ 48,964 张 → 2.5 live2d/ → 2.6 3d/
2.7下架能力:清单去条目 → UI 降级提示,不白屏

风险:48,964 张图不是「传 5.8 G」,是发 48,964 次请求。用批量工具 + 并发, 预留一整天。

验收:四个插件的部署产物都掉到几 MB 量级;任取 20 个文件核对 sha256; 从清单删一条,前端显示「已下架」。

工作量:8–12 人日。


Phase 3 — 剩下三个插件 + Story 宿主

与 Phase 1.3 同一个变化:这三个能力现在各自已有不碰上游的实现plugin-adv / plugin-live2d / plugin-search + plugin-chart), 全部过一致性套件。所以 3.1–3.3 不再是「能不能用」,而是「要不要多一个实现」。 全貌见 contracts/capabilities.json

步骤说明
3.1adv.play ✅ 已有从零实现(@magireco/plugin-adv,含 progress 上报)装在 station 里。把上游 Exedra ADV 包成 iframe 插件仍是可选的第二个实现
3.2live2d.show ✅ 已有从零实现(@magireco/plugin-live2d)。example-live2d-viewer 同上,可选
3.3search.querychart.height ✅ 均已有从零实现(plugin-search / plugin-chart)。example-search-site 同上,可选
3.4example-reader 装插件:它作为独立宿主 kernel.register(advPlayer),剧情页多出「实机播放」
3.5/story/ 反代进统一域名

3.4 现在是这个阶段唯一的硬骨头,也仍是最有说服力的一步:example-reader 不被吸收、主权不变,只是多了能力;它装的可以是我们那个从零实现, 于是「未授予任何开源许可」这条约束连碰都不用碰。

验收:在 example-reader 上读剧情,点「实机播放」,ADV 起播并把行号回传高亮。 这正是你举的第一个例子。

工作量:10–14 人日。


Phase 4 — 交叉表补全

Phase 1 只做了首批。这一步把 241 个角色、1,404 条记忆结晶、10,511 条语音字幕、 725 篇剧情的关联关系补齐并人工核对。

这是整个项目里价值最高、也最没法自动化的一块——编号规律不成立 (见架构文档 §二 的证据),只能靠数据。

工具做「候选生成 + 差异报告」,人做判定: tools/propose-links.py 出候选,registry/data/*.json 存人工确认的结果, 守卫检查跨作品关联与孤儿条目。

工作量:工具 3–5 人日;人工核对按角色数摊,可增量做。


Phase 5 — Client 工位 + 鉴权后台

步骤说明
5.1边缘函数探测线上 config.jsonmirrors[],结果写 KV
5.2线路看板、branch_versions 停止支持开关看板、APK 下载
5.3鉴权后台(noindex):/codex/ 资料、/lab/ API 规格

5.3 的前提是待拍板事项 1。默认按「不公开」实现。

工作量:5–8 人日。


Phase 6 — AI 能力

优先级:客户端诊断 Agent > 剧情语义检索 > 资料问答

诊断 Agent 排第一是因为知识库现成(客户端 README 的启动链表 + 34 个 native hook + 调试开关三分类),解决的是维护者每天真在处理的事。

不得成为前面任何阶段的依赖。


总览

阶段工作量停在这里能交付吗
0 框架内核✅ 已完成✅ 五个包可独立发布使用
1 首个插件 + 外壳只剩 1.4(交叉表首批)✅ 可演示的整合站已经跑起来了
2 资源面搬迁8–12 人日✅ 四个查看器全上线
3 剩余插件 + Story只剩 3.4 / 3.5✅ 六个能力各有一个不碰上游的实现
4 交叉表补全3–5 人日 + 增量人工✅ 可增量
5 Client + 后台5–8 人日
6 AI待估

关键路径是 Phase 2。 它不做完,其余全部卡在资源上。 2.2(清单工具)已完成——它不依赖任何凭据。剩下的 2.1(桶 + 回源)需要 维护者的域名、账号与桶权限,见「先决条件」。

ADR 0002 之后,1 与 3 里「把上游包成插件」的那些步骤不再是任何东西的前置 条件:六个能力各自已有从零写的实现并过一致性套件,接上游只是多一个可选 实现。剩下的硬骨头是 1.4(交叉表人工核对)、2.1(桶)、3.4(example-reader 装 插件)与 3.5(反代),前两个等凭据与人力,后两个要跨仓库协作。

先决条件

GPLv3。素材版权归各自的版权方所有,本站与本仓库不含任何素材。