Why: An interrupted multi-component transition must retain original staged, ignored and external-worktree data after some independent copies have completed. Evidence: SELF scratch fixture interrupts a real nested copy after App is saved and Logging is partially copied; originals and external Git metadata remain identical, recorded partial data persists and retry refuses to discard it. Impact: Add failure-path coverage and clarify reachability checks before component branch cleanup; no transition implementation change. Refs: Dependency-workspace R9/R15 and independent reliability coverage followup.
5.7 KiB
版本依赖、源码编辑与分支过渡
适用:组件版本升级、功能仓编辑、新 clone、旧任务同步和源码候选构建。通用原则见固定 Development-Guidelines 的 multi-repo/collaboration/adoption;本文件只规定项目映射、命令和过渡入口。
版本权威
components.json:逻辑组件、批准的仓库、职责、模块/包身份与消费路径,不存凭据。components.lock.json:应用、规范和过程资料的完整提交;Go/npm 库不另设可竞争的源码锁。- Go:消费方 go.mod 的实际模块图决定版本,go.sum 校验内容。模块路径为
git-ssh.u1680832.nyat.app/weichen/<Repo>.git,子模块追加目录;端口仅属于传输配置。 - npm:消费方 package-lock 固定 Git 提交及包完整性信息;契约由 Core 单一 TS 源码产生,UI 与 Frontend 消费
@agent-system/contracts,Frontend 消费@agent-system/ui。 - 正式产物:隔离固定源码装配 frontend dist/backend embed,自动导出解析清单与摘要。RDM 使用隔离 vendor 构建注入固定前端资产,不改 Go module cache,不写本地路径 replace。
采用的提交在功能仓合入后仍须从批准来源获取。合入方式须保留已锁定的提交对象;回收功能分支前核对这些提交已在主干或受保护归档中可达,不用 squash 或删除唯一引用使现有语言版本失效。发布 tag 与归档删除仍保留原双钥匙边界。
新模式是否存在以该提交的 components.json/锁为准。历史提交没有这两份文件时继续按照其旧 gitlinks 与脚本构建;不能套用最新来源改变历史候选。
从 Dev 按需编辑
- 从普通 clone 开始,按项目启动门禁执行 precheck/task-start;新布局由固定清单准备应用和规范,普通库按语言依赖下载。
make component-edit NAME=Agent-Native取得消费方实际使用的源版本,创建所属功能仓的独立编辑分支并接入本地 go.work。- 在返回的目录修改、局部验证、提交及创建功能仓 PR;Dev 不提交复制的功能仓源码。
make component-unlink NAME=Agent-Native解除开发覆盖,保留源码和分支;采用新版本由消费方依赖 PR 决定。
make test-backend LOCAL_OVERLAY=1 可明确使用已登记 Go 开发覆盖做局部检查,默认局部入口 GOWORK=off;结果仍为开发对象,不能代替固定组合。
make workspace-status 是只读状态;make workspace-prepare 准备固定来源。正式 build/test 与局部开发验证分开,不能把存在 go.work/npm 链接的工作树当发布候选。Go 正式消费 GOWORK=off,候选代码执行环境没有 checkout token;源码获取和执行阶段分离。
依赖锁变更后,owner 可用 make workspace-prepare NAME=Agent-System-Backend REFRESH_FIXED=1
显式刷新已登记、干净且处于原基线的 detached 检出,旧提交仍由本地保存引用保留。编辑分支、
未保存或 ignored 唯一文件、Git 操作和共享归属均拒绝刷新;不会切换已编辑组件。
UI 源码编辑从 Frontend 锁中解析实际 Git 提交;其包构建是显式命令。当前工作区工具的源码编辑/版本解析与 Go 覆盖分别验证,不能仅凭 UI 仓被检出就声称 npm 开发链接已生效。
在途分支与迁移
本轮切换不 checkout/reset/stash/clean 其他活动工作区,不批量 rebase,不重写旧提交和 tag,不删除旧物理目录或 Git 管理数据。
- 未同步的旧任务继续用旧提交、旧脚本和固定 gitlinks;新功能分支从最新权威 main 起步。
- 旧任务纳入新 main 前先核对父仓与组件状态;有当前写者、Git 锁、未提交或唯一文件时由 owner 保存并安排安全同步点。文本和 API 冲突分别处理,不把旧 pin/锁批量覆盖新组合。
make workspace-transition默认只报告迁移计划;NAME=<组件>可限定范围。确认归属后显式ARGS=--apply才在新工作区准备独立源码。原仓、refs、reflog、暂存/工作树/未跟踪和 ignored 唯一文件保留。- 已登记嵌套组件独立保存;相同内容的重复来源可去重,但引用仍按来源保存。未知归属、冲突的重复组件、外借对象库、逃逸 symlink 或目标已有他人现场拒绝并报告,不能称迁移成功。
- 组件分支仍是所属仓的代码;来源/命名变化后按已合入接口进行正常合并和审阅。原分支或数据不被自动删除;不能将“已复制保存”解释为语义迁移已完成。
迁移后的库版本以消费方实际解析为准,主干前进时不隐式切换已编辑组件。旧组件目录的 .git common-dir 可能供外部 worktree 使用;task-finish 必须核对依赖及唯一成果,删除被拒就保留现场。
验证与回退
真实 Git/Go fixture 验证固定取源、编辑/解除、嵌套组件、dirty/index/ignored/ref 保留、冲突、锁和越界拒绝。新 clone 的固定产品构建、RDM 完整前端二进制、当前组合和历史组合分别重放;文档检查不能替代这些能力。
回退用普通 PR 恢复已批准依赖、源码锁和构建规则,并重建同一解析组合;不改历史、不推断业务数据库可以逆迁移。正式验收与合入仍按 policy/delivery.md,SELF 不提升为 GATE/REPLAY,发布与共享部署保留原授权边界。
后续项目采纳
通用规则只维护在 Development-Guidelines;新项目固定审阅过的规范来源并填写采纳模板,选择自己的仓库映射、读取目录、编辑命令和正式构建入口。现存项目不会因上游规则合入或新包可用而自动升级、自动移除 submodule 或自动改变审批权限。