用 Facet 构建一次性工作区解决 Claude Code 多仓库协作的索引混乱
git worktree 来隔离不同的任务分支,但在实际操作中,这种方式在面对 AI Agent 时会暴露出严重的缺陷。我之前在公司尝试用 git worktree 方案,结果陷入了某种“认知混乱”:我个人经常忘记当前终端处于哪个分支,而当 Claude Code agent 进入工作区后情况更糟糕。由于多个会话在抢夺同一个 Git 索引,Agent 经常在错误的分支上提交代码,导致工作区乱成一团。
为了彻底解决这个问题,我开发了一个名为 facet 的小工具。它的核心逻辑是为终端引入一套类似 VS Code Workspace 的机制,但关键区别在于,facet 创建的是“临时性且可丢弃”的工作区。
具体的操作链路是这样的:首先,通过 facet spawn [Issue URL] 绑定一个 GitHub Issue,工具会自动分析该 Issue 涉及的所有仓库。接着,它会将相关代码克隆到一套完全独立的临时工作区中,并自动将 Issue 的具体描述写入到 CLAUDE.md 文件里。这一步至关重要,因为 CLAUDE.md 相当于给 Claude Code 提供了精准的上下文注入,让 Agent 在启动瞬间就明白当前任务的目标,而不需要我在对话框里重复粘贴需求。
在开发 facet 的过程中,我踩过一个非常深刻的坑:起初我试图将 zellij 集成进来以实现多窗格管理,结果导致会话在切换时频繁跳变,甚至在极端情况下引发崩溃导致代码丢失。为了理顺这套逻辑,我当时不得不删掉 1500 行冗余代码,才最终确定了目前的轻量化架构。
facet 定义工作区的方式非常透明,它依赖于一个简单的 YAML manifest 文件来描述依赖关系,例如:
repositories:
- url: "[email protected]:org/terraform-infra.git"
branch: "feature/update-helm"
- repo: "[email protected]:org/k8s-manifests.git"
branch: "fix/chart-version"
context: "Issue #123: Update helm chart for production"通过这种配置,每个任务都被物理隔离在独立的文件路径中,彻底解决了 Git 索引冲突的问题。最让我惊喜的是,在后期的稳定性优化阶段,我直接将 Bug 报告丢给 Claude Code agent,让它在 facet 创建的隔离环境中自我修复,我只负责最后的 Review 和 Merge。
这验证了一个核心观点:隔离的环境 + 明确的上下文 = Agent 能够独立高效工作且不破坏主分支。当任务合并完成后,直接执行删除指令将整个工作区抹掉,不给系统留下任何垃圾文件。
如果你也经常在多个 Repo 之间来回切换,并且深度依赖 Claude Code 这种 Agent 工具,我建议尝试这种“一次性工作区”的思路。你可以通过以下命令快速启动一个基于特定 Issue 的环境:
```bash
facet spawn https://github.com/org/repo/issues/123
