目录
执行摘要
Anvil 是一个开源的多仓库 AI 驱动代码生成工具,由 Esan Mohammad 开发并于 2024-2026 年发布。它通过 8 阶段流水线架构,实现了跨多个代码仓库的自动化功能开发、测试和交付。与 GitHub Copilot、Claude Code 等单仓库工具不同,Anvil 专为微服务架构和分布式代码库设计,能够协调多个仓库间的依赖关系,自动生成跨仓库的 Pull Request。
Anvil 的核心创新包括:
- 8 阶段流水线:从需求澄清到代码交付的完整自动化流程
- 6 种 Agent 角色:Clarifier、Architect、Analyst、Engineer、Tester、Lead 分工协作
- 14 种跨仓库依赖检测策略:自动识别 npm 依赖、共享类型、HTTP 端点、gRPC 服务、数据库表等跨仓库关联
- 成本分层模型路由:通过 L1/L2/L3 三级成本策略优化 LLM 调用成本
- 检查点恢复机制:支持断点续传,应对崩溃、预算超支等中断场景
架构分析
2.1 流水线整体架构
Anvil 采用分阶段的流水线架构,每个阶段都有明确的输入输出和职责边界。流水线设计遵循渐进式细化原则,从高层需求逐步分解到具体代码实现[1]。
┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐
│ Clarify │───→│Requirements │───→│ Repo Reqs │───→│ Specs │
│ (澄清) │ │ (需求) │ │ (仓库需求) │ │ (规格) │
└─────────┘ └─────────────┘ └─────────────┘ └─────────┘
│
┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐
│ Ship │←───│ Validate │←───│ Build │←───│ Tasks │
│ (交付) │ │ (验证) │ │ (构建) │ │ (任务) │
└─────────┘ └─────────────┘ └─────────────┘ └─────────┘
2.2 8 个阶段详解
2.2.1 Clarify(澄清阶段)
核心职责:理解用户需求,探索代码库,提出澄清问题
Agent 在此阶段会:
- 扫描项目结构和代码库
- 识别关键文件和架构模式
- 向用户提出针对性问题以澄清需求
- 在 Dashboard 中记录用户的回答
典型问题:
- "这个功能需要修改哪些仓库?"
- "是否有特定的 API 版本要求?"
- "是否需要向后兼容?"
默认超时:5 分钟[2]
2.2.2 Requirements(需求阶段)
核心职责:生成跨仓库的高层架构规划
输出内容包括:
- 跨仓库的架构设计
- 功能范围和边界定义
- 成功标准和验收条件
- 数据流和依赖关系概述
2.2.3 Repo Reqs(仓库需求阶段)
核心职责:为每个仓库生成详细的需求规格
针对每个仓库输出:
- 数据流变更说明
- API 变更影响分析
- 跨服务依赖关系
- 仓库特定的实现约束
2.2.4 Specs(规格阶段)
核心职责:生成技术规格文档
包括:
- API 契约定义(OpenAPI/Swagger)
- 数据模型和 Schema
- 数据库迁移脚本
- 接口签名和类型定义
2.2.5 Tasks(任务阶段)
核心职责:将规格分解为可执行的细粒度任务
任务特性:
- 文件级作用域
- 明确的执行顺序
- 依赖关系标注
- 可分配给不同 Agent 并行执行
2.2.6 Build(构建阶段)
核心职责:Agent 在特性分支上编写代码
执行特点:
- 跨独立仓库并行执行
- 每个 Agent 负责特定任务
- 自动处理文件创建、修改、删除
- 遵循项目约定的代码风格
默认超时:30 分钟[2-1]
2.2.7 Validate(验证阶段)
核心职责:构建、检查、测试和自动修复
验证循环:
- 执行构建命令(如
make build) - 运行代码检查(lint)
- 执行测试套件
- 如失败,自动修复(最多 5 次迭代)
默认超时:20 分钟[2-2]
2.2.8 Ship(交付阶段)
核心职责:提交代码并创建 Pull Request
操作包括:
- 提交代码到特性分支
- 推送分支到远程仓库
- 在 GitHub 上创建 PR
- 跨仓库 PR 之间添加关联链接
默认超时:15 分钟[2-3]
2.3 阶段间数据流转机制
Anvil 使用检查点(Checkpoint)机制实现阶段间数据持久化[3]:
interface Checkpoint {
stageId: number; // 阶段标识
stageName: string; // 阶段名称
artifactPaths: string[]; // 生成的产物文件路径
agentOutputPath?: string; // Agent 输出日志路径
timestamp: string; // 时间戳
checksum: string; // 数据完整性校验
}
interface CheckpointManifest {
runId: string; // 运行实例标识
checkpoints: Checkpoint[]; // 检查点列表
createdAt: string; // 创建时间
updatedAt: string; // 更新时间
}
检查点存储位置:~/.anvil/features/<run-id>/
数据流转采用两阶段提交策略确保一致性[3-1]:
- 阶段 1:Agent 将输出写入 staging 目录
- 验证:检查文件完整性和校验和
- 阶段 2:确认后移动到最终位置
- 清理:删除 staging 目录
技术实现
3.1 Agent 角色与协作机制
3.1.1 6 种 Agent 角色详解
| 角色 | 职责 | 典型任务 | 使用模型 |
|---|---|---|---|
| Clarifier | 需求澄清 | 提问、探索代码库 | 轻量级 (L1) |
| Architect | 架构设计 | 生成高层设计文档 | 中级 (L2) |
| Analyst | 分析依赖 | 跨仓库影响分析 | 中级 (L2) |
| Engineer | 代码实现 | 编写、修改代码 | 强模型 (L3) |
| Tester | 测试验证 | 生成测试、修复失败 | 中级 (L2) |
| Lead | 协调管理 | 任务分配、进度跟踪 | 中级 (L2) |
Agent 通过角色分配策略动态绑定到流水线阶段,每个阶段可以配置使用不同的 Agent 角色组合[1-1]。
3.1.2 模型路由策略(L1 / L2 / L3)
Anvil 采用成本分层策略优化 LLM 调用成本[4]:
| 层级 | 模型类型 | 适用场景 | 成本 |
|---|---|---|---|
| L1 | 轻量模型(Haiku 4.5, GPT-3.5) | 简单任务、快速响应 | 低 |
| L2 | 中等模型(Sonnet 4.6, GPT-4) | 标准开发任务 | 中 |
| L3 | 前沿模型(Opus 4.7, GPT-4o) | 复杂架构、关键代码 | 高 |
配置示例(factory.yaml):
pipeline:
models:
clarify: claude-haiku-4-5 # L1 层级
requirements: claude-sonnet-4-6 # L2 层级
build: claude-opus-4-7 # L3 层级
模型规格通过 model-catalog.ts 统一管理[4-1]:
- 支持环境变量覆盖:
ANVIL_CONTEXT_WINDOW_<MODEL_ID>=<tokens> - 家族规则匹配:按模型系列自动分配上下文窗口
- 默认规格:128K 上下文窗口,16K 最大输出
3.2 检查点(Checkpoint)机制
检查点机制是 Anvil 容错能力的核心,支持多种恢复场景[3-2]:
支持的中断恢复场景:
- 系统崩溃或断电
- 用户手动停止
- 预算限制触发暂停
- LLM 提供商认证过期
- 网络连接中断
恢复流程:
- 检测未完成的检查点(orphaned staging)
- 验证检查点完整性(checksum 校验)
- 从最后一个有效检查点恢复上下文
- 重新启动 Agent 继续执行
两阶段提交实现[3-3]:
// 阶段 1:写入 staging
await writeStagingFiles(stagingPath, files);
await writeCompletionMarker(stagingPath, { files, stageId });
// 阶段 2:验证并提交
for (const file of marker.files) {
await verifyChecksum(file);
await moveToFinal(file);
}
await cleanupStaging(stagingPath);
3.3 会话管理机制
3.3.1 独立会话架构
Anvil 采用完全独立的会话模型——每个 Agent(Thread)拥有独立的 LLM 会话,通过文件系统实现上下文共享,而非共享 LLM 会话上下文。
核心概念:Thread 作为独立会话单元
Anvil 将会话的基本单位定义为 Thread(线程):
export const ThreadMetadataBaseSchema = z.object({
id: z.string().uuid(), // Thread 唯一标识
repoId: z.string().uuid(), // 所属仓库
worktreeId: z.string().uuid(), // 所属工作树
status: z.enum(["idle", "running", "completed", "error", "paused", "cancelled"]),
turns: z.array(ThreadTurnSchema), // 对话轮次
parentThreadId: z.string().uuid().optional(), // 父 Thread ID(子 Agent)
agentType: z.string().optional(), // Agent 类型
// ...
});
关键发现:
- 每个 Thread 对应一个独立的 LLM 会话
- Thread 之间不共享 LLM 上下文窗口
- 通过
parentThreadId建立父子关系,但这是逻辑关系而非会话共享
3.3.2 子 Agent 创建机制
子 Agent 的创建过程揭示了会话隔离的设计:
async spawn(options: SpawnOptions): Promise<string> {
const childThreadId = crypto.randomUUID(); // 全新 Thread ID
const childThreadPath = join(this.context.anvilDir, "threads", childThreadId);
// 1\. 在磁盘上创建全新的 Thread 元数据
this.createThreadOnDisk(childThreadId, childThreadPath, options);
// 2\. 发射事件通知 UI
this.emitThreadCreated(childThreadId);
// 3\. 启动独立的子进程
const child = this.spawnProcess(childThreadId, options);
return this.waitForResult(child, childThreadId, childThreadPath);
}
关键证据:
- 每个子 Agent 获得全新的 UUID (
crypto.randomUUID()) - 创建独立的进程 (
spawnProcess) - 拥有独立的磁盘存储空间 (
threads/{threadId}/)
3.3.3 上下文传递机制
Anvil 的上下文传递采用"显式传递 + 文件系统"模式:
-
初始上下文:父 Agent 通过
anvil.spawn({ prompt: ... })显式传递初始提示词 - 状态共享:通过 git worktree 和文件系统共享代码状态
- 结果返回:子 Agent 完成后,仅返回最后一条 assistant 消息
子 Agent 启动时仅接收 --prompt 参数作为初始输入:
private spawnProcess(childThreadId: string, options: SpawnOptions) {
const args = [
runnerPath,
"--thread-id", childThreadId,
"--parent-id", this.context.threadId,
"--cwd", this.context.workingDir,
"--prompt", options.prompt, // 仅传递初始 prompt
// ...
];
return spawnProcess(executable, args, { stdio: "pipe", env: { ...process.env } });
}
关键发现:
- 子进程仅接收
--prompt参数作为初始输入 -
不传递父 Thread 的
messages历史 - 不共享 LLM 会话状态
3.3.4 Disk-as-Truth 架构模式
Anvil 采用 "磁盘即真理"(Disk-as-Truth) 架构:
"The filesystem (and git state) is the single source of truth. In-memory stores are treated as caches that can become stale at any time."
实现细节:
- Thread 状态持久化到
~/.anvil/threads/{threadId}/metadata.json - 对话历史存储在
~/.anvil/threads/{threadId}/state.json - 多个进程(UI + Agent)通过文件系统协调,而非共享内存
3.4 知识图谱支撑
Anvil 通过 AST 解析构建代码知识图谱[5]:
图谱构建流程:
- 代码解析:使用 Tree-sitter 解析源代码
- 符号提取:提取函数、类、导入、导出等符号
- 关系构建:建立调用关系、继承关系、依赖关系
- 向量化:使用嵌入模型(如 bge-m3)生成语义向量
- 存储:保存到 LanceDB 向量数据库
支持的编程语言:
- TypeScript / JavaScript
- Go
- Python
- Rust
- Java
- PHP
- C/C++
可视化:Dashboard 提供交互式力导向图可视化[1-2]
3.4 跨仓库依赖检测的 14 种策略
Anvil 的 Code Search MCP 实现了 14 种跨仓库依赖检测策略[5-1][6]:
| 策略编号 | 策略名称 | 检测目标 | 置信度 | 实现方式 |
|---|---|---|---|---|
| 1 | Shared npm Dependencies | 共享的 npm 包依赖 | 0.7 | 解析 package.json |
| 2 | Shared TypeScript Types | 共享的 TypeScript 类型定义 | 0.9 | AST 类型导出分析 |
| 3 | Environment Variable Correlation | 环境变量关联 | 0.6 | .env 文件解析 |
| 4 | Event Schema Detection | 事件/消息主题共享 | 0.85 | 事件模式匹配 |
| 5 | API Endpoint Matching | HTTP API 端点匹配 | 0.8 | 路由定义与客户端调用匹配 |
| 6 | Workspace Package Dependencies | Monorepo 工作空间依赖 | 1.0 | 工作空间配置解析 |
| 7 | gRPC/Proto Service Detection | gRPC 服务定义与调用 | 0.9 | .proto 文件与客户端代码匹配 |
| 8 | Database Schema Correlation | 数据库表共享 | 0.85 | SQL/ORM 模式匹配 |
| 9 | Redis Key Patterns | Redis 键模式 | 0.75 | 键名模式匹配 |
| 10 | S3 Bucket References | S3 存储桶引用 | 0.8 | 存储桶名称匹配 |
| 11 | OpenAPI Schema Detection | OpenAPI/Swagger 规范 | 0.9 | API 规范解析 |
| 12 | Docker Compose Links | Docker Compose 服务链接 | 0.85 | depends_on/links 解析 |
| 13 | Kubernetes Service References | K8s 服务引用 | 0.8 | .svc DNS 解析 |
| 14 | Shared Constants & Magic Strings | 共享常量 | 0.7 | 常量值匹配 |
策略实现示例(API Endpoint Matching)[6-1]:
// 路由定义模式
const routeDefPatterns = [
/(?:app|router)\.(get|post|put|patch|delete)\s*\(\s*['"`](\/[a-zA-Z0-9/:._-]+)['"`]/g,
/@(Get|Post|Put|Patch|Delete)\s*\(\s*['"`](\/[a-zA-Z0-9/:._-]+)['"`]/g,
];
// HTTP 客户端调用模式
const httpCallPatterns = [
/(?:axios|fetch|http|client)\.(get|post|put|patch|delete)\s*\(/g,
];
// 匹配逻辑:将服务端路由与客户端调用关联
for (const [routePath, routeFile] of routes) {
const clientFile = clients.get(routePath);
if (clientFile) {
edges.push({
sourceRepo: clientRepo,
targetRepo: routeRepo,
edgeType: 'http',
evidence: `API endpoint: ${routePath}`,
confidence: 0.8,
});
}
}
对比分析
4.1 与 GitHub Copilot 对比
| 特性 | Anvil | GitHub Copilot |
|---|---|---|
| 架构定位 | 多仓库流水线 | 单文件/单仓库补全 |
| 工作模式 | 端到端自动化 | IDE 内联建议 |
| 跨仓库支持 | 原生支持,14 种依赖检测 | 不支持 |
| Agent 协作 | 6 角色协作 | 无 |
| PR 生成 | 自动创建跨仓库 PR | 需手动提交 |
| 成本优化 | L1/L2/L3 分层路由 | 统一模型 |
| 断点续传 | 支持检查点恢复 | 无状态 |
| 开源 | MIT 开源 | 闭源商业产品 |
4.2 与 Devin 对比
| 特性 | Anvil | Devin (Cognition) |
|---|---|---|
| 目标场景 | 多仓库微服务开发 | 全栈独立开发 |
| 自主性 | 人机协作(需用户澄清) | 高度自主 |
| 代码库理解 | AST 知识图谱 + 向量搜索 | 文件浏览 |
| 多仓库 | 核心特性 | 单仓库为主 |
| 成本透明 | 预算控制和分层路由 | 不透明 |
| 部署方式 | 本地运行,零遥测 | 云端 |
| 价格模式 | 免费开源 | 付费订阅 |
4.3 与 Claude Code 对比
| 特性 | Anvil | Claude Code |
|---|---|---|
| 交互模式 | Dashboard + 自动化流水线 | 交互式 CLI |
| 多仓库支持 | 原生多仓库架构 | 单仓库为主 |
| 代码生成 | 8 阶段流水线 | 对话式生成 |
| 知识图谱 | AST 解析 + 向量嵌入 | 文件系统浏览 |
| MCP 集成 | 提供 Code Search MCP Server | 消费 MCP 工具 |
| 自主性 | 高(自动执行 8 阶段) | 中(需用户确认) |
| 适用场景 | 大型微服务架构 | 单仓库快速开发 |
4.4 流水线模式 vs 单轮对话模式
流水线模式优势[1-3]:
- 可预测性:每个阶段有明确输出和验收标准
- 可恢复性:检查点机制支持断点续传
- 可审计性:完整记录每个阶段的决策过程
- 成本可控:L1/L2/L3 分层路由优化成本
- 规模扩展:适合大型多仓库项目
单轮对话模式优势:
- 灵活性:适合探索性任务
- 低延迟:无需等待完整流水线
- 简单性:学习成本低
- 适合:快速原型、小改动
适用场景对比:
| 场景 | 推荐模式 | 原因 |
|---|---|---|
| 微服务新功能开发 | Anvil 流水线 | 跨仓库依赖复杂 |
| Bug 修复 | Claude Code 对话 | 快速定位修复 |
| 代码重构 | Anvil 流水线 | 影响面分析重要 |
| 探索性编程 | 对话模式 | 需要快速迭代 |
| 代码审查 | Anvil MCP | 知识图谱辅助 |
应用场景
5.1 适用场景
最佳适用场景[1-4]:
-
微服务架构项目
- 多个服务仓库需要协调变更
- API 契约需要同步更新
- 数据库 Schema 跨服务共享
-
大型代码库
- 需要深度代码理解
- 变更影响面分析复杂
- 需要遵循严格的代码规范
-
持续集成/交付
- 需要自动化测试和验证
- PR 创建和关联自动化
- 多环境部署协调
-
知识沉淀项目
- 需要学习代码约定
- 团队编码规范传承
- 新人快速上手
5.2 最佳实践
配置建议[1-5]:
# factory.yaml 示例
version: 1
project: my-platform
workspace: ~/workspace/my-platform
repos:
- name: api-gateway
path: ./api-gateway
language: go
github: myorg/api-gateway
commands:
build: make build
test: make test
lint: make lint
- name: user-service
path: ./user-service
language: typescript
github: myorg/user-service
commands:
build: npm run build
test: npm test
lint: npm run lint
# 预算控制
budget:
max_per_run: 50 # 单次运行上限(美元)
max_per_day: 150 # 每日上限(美元)
# 模型路由配置
pipeline:
models:
clarify: claude-haiku-4-5
requirements: claude-sonnet-4-6
build: claude-opus-4-7
使用流程[1-6]:
-
初始化项目:
anvil init -
环境检查:
anvil doctor -
启动 Dashboard:
anvil dashboard - 描述需求:在 Dashboard 中输入功能描述
- 澄清阶段:回答 Agent 提出的问题
- 等待执行:监控流水线进度
- 审查 PR:在 GitHub 上审查生成的 PR
5.3 当前局限性
已知限制[1-7]:
- 语言支持:主要支持 TypeScript/JavaScript、Go、Python、Rust、Java、PHP、C/C++
- LLM 提供商:目前主要支持 Claude CLI 和 Gemini CLI
- 复杂度上限:超大型代码库(>100 个仓库)可能需要分阶段处理
- 网络依赖:需要稳定的 LLM API 连接
- 学习曲线:需要理解流水线概念和配置
潜在改进方向:
- 支持更多 LLM 提供商(OpenAI、本地模型等)
- 增强对非代码文件的支持(文档、配置)
- 优化超大型代码库的处理性能
- 提供更细粒度的成本控制选项
- 增强可视化能力(依赖图、执行流程)
总结与展望
6.1 核心贡献
Anvil 代表了 AI 辅助软件开发工具向多仓库、端到端自动化方向的重要演进:
- 架构创新:8 阶段流水线为 AI 代码生成提供了结构化框架
- 技术整合:将 AST 解析、向量搜索、知识图谱等技术整合到统一平台
- 工程实践:检查点恢复、L1/L2/L3 成本分层、跨仓库依赖检测等机制具有借鉴意义
- 会话管理创新:完全独立的 Thread 会话模型,通过 Disk-as-Truth 架构实现上下文隔离与共享
- 开源生态:MIT 许可证和 MCP 协议支持促进生态发展
6.2 技术趋势洞察
Anvil 的设计反映了 AI 编程工具的演进趋势:
- 从单文件到多仓库:代码库规模扩大要求工具具备全局视野
- 从建议到执行:AI Agent 从辅助角色向执行角色演进
- 从通用到专业:针对特定架构(微服务)的深度优化
- 从黑盒到透明:检查点和知识图谱提供可解释性
6.3 未来展望
短期(1-2 年):
- 支持更多编程语言和框架
- 集成更多 LLM 提供商
- 增强可视化 Dashboard
- 社区插件生态发展
中期(3-5 年):
- 智能架构决策(自动选择设计模式)
- 跨组织代码复用(安全共享组件)
- 实时协作(多人同时与 AI 协作)
- 自适应学习(从团队历史中学习偏好)
长期(5 年以上):
- 完全自主的软件交付
- 跨企业代码市场
- AI 驱动的架构演进
- 零代码/低代码深度融合
参考资料
报告生成时间:2026-04-21
研究工具:OpenClaw Research Agent
数据来源:GitHub 开源代码、官方文档、技术实现分析