# 分支与 Fork 维护指南 ## 结构 **`nanocoai/nanoclaw`**(上游)——核心引擎,包含技能定义(`.claude/skills/`)。`main` 分支上没有频道代码。 **频道 forks**(`nanoclaw-whatsapp`、`nanoclaw-telegram`、`nanoclaw-slack` 等)——每个 fork = 上游 + 一个频道的代码。用户克隆上游,然后将某个 fork 合并到自己的克隆中以添加频道。 **上游的 `skill/*` 和 `feat/*` 分支**——添加与频道无关的功能(例如 `skill/compact`、`skill/apple-container`)。用户将这些分支合并到自己的克隆中以添加能力。与 forks 重复的频道特定技能分支(例如 `skill/whatsapp`、`skill/telegram`)为历史遗留分支。 ## 用户如何添加能力 ``` 用户克隆上游 main ├── 合并 nanoclaw-whatsapp fork → 添加 WhatsApp ├── 合并 skill/compact 分支 → 添加 /compact 命令 └── 合并 skill/apple-container → 切换到 Apple Container ``` ## 合并方向 ``` 上游 main ──→ 频道 forks (向前合并以保持 forks 同步) 上游 main ──→ skill 分支 (向前合并以保持分支同步) ``` Forks 和 skill 分支携带已应用的代码变更。用户将它们合并到自己的克隆/forks 中以添加能力。它们永远不会被合并回上游 `main`。 ## 向前合并流程 ```bash # 在你的本地 nanoclaw 检出中 git checkout main && git pull # 对于一个 fork: git fetch nanoclaw-whatsapp git checkout -B whatsapp-merge nanoclaw-whatsapp/main git merge main # 解决冲突(见下文) # 移除仅上游存在的工作流文件(每次合并都会重新添加,因为 main 上有这些文件): git rm .github/workflows/bump-version.yml .github/workflows/update-tokens.yml 2>/dev/null git push nanoclaw-whatsapp HEAD:main git checkout main && git branch -D whatsapp-merge # 对于一个 skill 分支: git checkout -B skill/compact origin/skill/compact git merge main # 解决冲突(见下文) git push origin skill/compact git checkout main && git branch -D skill/compact ``` ## 冲突解决 每次都会冲突的相同文件: | 文件 | 解决方式 | |------|------------| | `package.json` | 取 main 的版本 + 保留 fork/分支特定的依赖 | | `pnpm-lock.yaml` | `git checkout main -- pnpm-lock.yaml && pnpm install` | | `.env.example` | 合并:main 的条目 + fork/分支特定的条目 | | `repo-tokens/badge.svg` | 取 main 的版本(自动生成) | 源码变更(例如 `src/types.ts`、`src/index.ts`)通常能自动干净合并,但如果双方修改了相同行也可能冲突。**每次向前合并后一定要构建和测试**——即使 git 报告没有冲突,自动合并的代码也可能静默错误(例如引用了一个已重命名的函数或使用了一个已移除的参数)。 ## 何时向前合并 在 main 上任何涉及共享文件的变更之后(`package.json`、`src/index.ts`、`CLAUDE.md` 等)。小而频繁的合并 = 轻松的冲突。大而不频繁的合并 = 痛苦。 ## Fork 设置 创建新的频道 fork 时: 1. Fork `nanoclaw` 为 `nanoclaw-{channel}` 2. 移除仅上游存在的工作流:`bump-version.yml`、`update-tokens.yml` 3. 添加频道代码、依赖、环境变量 4. 立即向前合并 main 以建立干净的基准 ## 依赖 Forks 和分支在上游基础上添加自己的依赖。当上游添加或移除一个依赖时,在下一次向前合并后验证 forks/分支仍能构建——传递依赖的变更可能破坏下游代码。