main。所以贡献的方式非常简单:
一个仓库、一条主线。 所有源码都在 RakullApp 里,改动只需在本仓走「分支 → PR → 合并到
main」。不再有子模块指针,也不需要自底向上逐仓合并。 合并到 main 之后,被改动的子目录会由 mirror-sync 工作流自动推送到对应的下游镜像仓库(供各微服务独立部署)。仓库模型
RakullApp 曾经是三层 git 子模块,现在已扁平化成单仓库:原先每个子模块的源码,都作为普通目录直接进了主仓,只有一条线性主线main。各微服务仍留着自己的独立仓库,但已经降级成只读的下游镜像——由主仓合并触发的同步单向更新,日常开发不要直接克隆或改动。
全部镜像都在 GitHub 组织 AgentEndeavour 下,推送目标分支均为 main:
| 主仓目录 | 下游镜像(AgentEndeavour/…) | 说明 |
|---|---|---|
rakullapp_core | RakullApp-Core | Flutter 客户端 |
rakullapp_core/thirdparty/UILibrary | UILibrary | 设计系统组件库 |
docs | RakullDoc | 本文档站 |
docs/user-guide | RakullPublicDoc | 公开用户文档 |
Immersivellwebapp | Immersivellwebapp | 旧版 Web 应用 |
rakull_server | RakullServer | 后端聚合仓 |
rakull_server/agent_server | RakullAgentServer | AI 计算(内部) |
rakull_server/collection_server | RakullCollectionServer | 收藏(面向客户端) |
rakull_server/data_server | RakullDataServer | 持久化 / Model(内部) |
rakull_server/immersive_study_server | RakullImmersiveStudyServer | 控制器 / App Server |
rakull_server/manager_server | RakullManagerServer | Admin Server |
rakull_server/user_manager | RakullUserManager | 鉴权 / 管理 |
rakull_server、rakullapp_core、docs 这三个「父目录」镜像现在把各自的子目录也一并装了进去(扁平、自包含),不再是过去那种只挂子模块的壳仓库。所以改动某个叶子目录时,会连它上面每一级的祖先 prefix 一起同步。.github/workflows/);需要被外部单独引用(作为依赖或下游集成)时,镜像也提供一个稳定入口。写入方向永远是「monorepo → 镜像」,任何对镜像 main 的直接改动都会在下次同步时被覆盖。
镜像怎么更新、第一次怎么初始化、令牌怎么配,见仓库镜像同步。
一次性准备
安装 pre-commit 钩子
标准开发流程
无论改动落在哪个子目录(客户端、某个后端服务、文档……),流程都是同一条:切到你自己的分支
永远在分支上开发,不要直接改 分支名必须使用
main:<type>/<短描述>。允许的类型为 feat、fix、docs、refactor、test、chore、build、ci、perf、revert;不要使用开发者姓名作为永久分支。add 与 commit
git commit 会触发 pre-commit:后端跑 ruff-check --fix + ruff-format,客户端跑 dart format + dart analyze。钩子如果自动改了文件,本次提交会中止——把改动 git add 后再次提交即可。提交信息必须遵循 Conventional Commits(约定式提交):<type>(可选范围): 描述。新增功能用 feat,缺陷修复用 fix,文档用 docs;“debug”是过程而不是提交类型,调试产生的修复仍写作 fix(scope): ...。不使用 [feature] 或 [debug] 方括号标签。推送分支并向 main 提 PR,然后等评审合并
main,compare = 你刚推送的分支。PR 描述按下方模板补齐功能文档。然后:- 等待仓库根部的 CI 变绿(按改动路径触发,只跑与你改动相关的那条):
rakull_server/**改动触发.github/workflows/ci-backend.yml,按服务矩阵跑uv run pytest;rakullapp_core/**改动触发.github/workflows/ci-client.yml,跑flutter analyze+flutter test;只改文档等无关子树时两者都会跳过; - 等待评审通过、PR 合并。AI 和自动化脚本不得合并 PR,也不得启用 GitHub auto-merge;必须由人工评审者完成合并。
合并后:镜像自动同步(无需手动操作)
PR 合并到
main 会触发 mirror-sync 工作流,把本次改动涉及的子目录用 git subtree split 推送到对应的下游镜像仓库。你不需要做任何额外操作——不要手动 push 镜像仓库,也不要在镜像仓库里开分支。原理与排障见仓库镜像同步。PR 模板:功能文档
每个 PR 都要随手把对应功能写成文档,沿用vibe-coding-workspace/requirements/functions/<领域>/<功能>.md 的结构(Context / Task / 逻辑)。把下面这段复制进 PR 描述并填写:
提交信息与代码规范
| 类型 | 用途 | 示例 |
|---|---|---|
feat | 新功能 | feat(reader): add paragraph loop |
fix | 缺陷修复 | fix(auth): reject expired token |
docs | 仅文档 | docs(workflow): add recovery guide |
refactor | 不改变行为的重构 | refactor(api): extract error mapper |
test | 测试 | test(progress): cover empty article |
chore / build / ci | 维护、构建、CI | chore(ci): tune mirror-sync trigger |
perf / revert | 性能优化、回退 | perf(search): reduce duplicate queries |
| 关卡 | 工具 | 说明 |
|---|---|---|
| 提交前(本地) | pre-commit | 后端 Ruff check --fix + format;客户端 dart format + dart analyze |
| PR(远端) | 主仓 CI ci-backend.yml / ci-client.yml(路径白名单) | 仅 rakull_server/** 改动:后端 uv run pytest -m "not integration"(各服务矩阵);仅 rakullapp_core/** 改动:客户端 flutter analyze + flutter test |
- 后端规则集中在每个服务的
pyproject.toml的[tool.ruff];详见代码规范。 - 各服务子目录下仍保留自己的
.github/workflows/——这些只在下游镜像仓库里运行,主仓 PR 由根部的ci-backend.yml/ci-client.yml按改动路径分别把关。
流程全貌
常见陷阱
想直接改镜像仓库
想直接改镜像仓库
RakullServer、RakullAgentServer 等现在是只读下游镜像,会被主仓同步覆盖。所有改动都在 RakullApp monorepo 里进行;不要克隆或向镜像仓库 push。提交了密钥
提交了密钥
外部 AI/COS 密钥优先通过管理后台配置;部署级密钥只放环境变量或 gitignored 本地文件(
config.local.yaml、.secrets/ 等)。真实 Key 一旦提交需立刻吊销并轮换。只更新了中文、漏了英文镜像
只更新了中文、漏了英文镜像
文档站是双语镜像:
docs/<page> 与 docs/i18n/en/<page> 必须成对更新,新增页面要同时加进 docs.json 里 zh 与 en 两套导航。还在找 git submodule / gitlink
还在找 git submodule / gitlink
仓库已扁平化,没有子模块了。
git clone 一次拿到全部源码,git status 直接显示所有改动。下一步
仓库镜像同步(运维)
同步脚本、CI 触发、令牌配置与镜像初始化。
代码规范与提交检查
pre-commit + Ruff / dart 的安装与日常使用。
安装与快速开始
安装依赖,一键启动后端并运行本地客户端。
测试
后端 pytest 与客户端 flutter test 的运行方式。