这几个月我在不同项目间频繁切换时发现一个尴尬的问题:每个项目需要的 skill、MCP 服务器、agent 配置都不一样。给项目 A 装了某个 skill,项目 B 不兼容;在 Claude Code 里配好的 MCP 服务器,切到 OpenCode 又要重新来一遍。我管这个叫「AI 智能体的依赖地狱」。
AgentEnv 就是为了解决这个问题而生的。
问题的本质
AI 编码工具的生态正在爆炸式增长。Claude Code、OpenCode、Cursor、Codex 各有各的配置格式和路径。skill、MCP 服务器、agent 定义、hook、prompt 模板——这些「智能体依赖」混在一起,没有隔离、没有版本管理、没有可重现性。
Python 社区有 conda 和 virtualenv 来解决环境隔离;Node.js 有 npm workspace;Go 有 go modules。但 AI 智能体的环境管理,一直是一个手工拷贝配置文件的原始状态。
AgentEnv 要做的就是这件事:像 conda 管理 Python 环境一样,管理 AI 智能体的依赖环境。
设计哲学
声明式,不拼凑
AgentEnv 的核心是 agent.yaml —— 一个声明式的环境定义文件:
name: my-ai-env
description: "我的 AI 开发环境"
skills:
code-reviewer:
source: github:myorg/code-review-skill
version: ">=0.5"
mcps:
filesystem:
source: npm:@modelcontextprotocol/server-filesystem
version: "0.6.0"
config:
root: /home/user/projects你只需要声明想要什么,AgentEnv 负责找到、下载、安装、激活。这跟 package.json + npm install 的思路一脉相承,但适配的是 AI 编码工具的生态。
可重现,版本锁定
声明之后执行 agentenv lock,它会跑一个 PubGrub CDCL 解析器——就是 Dart/Flutter 用那个算法——来求解依赖图:
- 自动发现传递依赖(skill A 依赖 skill B,B 又依赖 C)
- 处理语义化版本约束(
^1.0、>=2.0、~3.5.1) - 检测冲突并给出精确的冲突报告
error: conflict detected
code-reviewer@>=1.0 requires lint-helper@^2.0
my-other-skill@>=0.5 requires lint-helper@^1.0
lint-helper@^2.0 and lint-helper@^1.0 are incompatible解析完成后生成 agent.lock,包含每个包的 SHA-256 校验、解析版本、来源——这是你在另一台机器上得到完全相同环境的保证。
六种源,不分来源
AgentEnv 支持 6 种包来源协议:
| 协议 | 示例 |
|---|---|
github: | github:myorg/code-review-skill |
npm: | npm:@modelcontextprotocol/server-filesystem |
local: | local:./vendor/my-tool |
git: | git:https://github.com/org/repo.git |
file: | file:/home/user/packages/skill.tar.gz |
url: | url:https://example.com/pkg.tar.gz |
也就是说,你可以把一个 GitHub 上的 skill、一个 npm 上的 MCP 服务器、一个本地开发中的 hook 脚本,扔进同一个环境管理。这对「正在开发 skill 同时又在用别人的 MCP」这种常见场景极其友好。
六种包,各司其职
AgentEnv 中,「包」(package)是一个抽象概念,覆盖了 AI 智能体生态中所有需要版本管理和环境隔离的东西。目前支持六种包类型:
| 类型 | 含义 | 典型场景 |
|---|---|---|
skill | 可安装的技能 | 代码审查 skill、文档生成 skill、Git 操作 skill |
mcp | MCP 服务器配置 | 文件系统访问、浏览器自动化、数据库查询 |
agent | 智能体定义 | 自定义 agent 的行为描述和系统提示词 |
tool | 工具包 | 代码格式化工具、lint 工具配置 |
hook | 生命周期钩子 | 激活前校验脚本、停用后清理脚本 |
prompt | 提示词模板 | 代码审查提示词、提交信息生成模板 |
每种包在 agent.yaml 中的声明格式完全一致,只需要三个字段:
# 必填:source —— 从哪里获取这个包
source: github:owner/repo
# 可选:version —— 语义化版本约束(默认 *,即任意版本)
version: ">=0.5"
# 可选:config —— 包专属的配置项,由包的消费者自行解读
config:
root: /home/user/projects一个包含所有六种类型的完整 agent.yaml 长这样:
name: my-ai-env
description: "我的全栈 AI 开发环境"
# 技能(skill):可复用的智能体能力模块
skills:
code-reviewer:
source: github:myorg/code-review-skill
version: ">=0.5"
# MCP 服务器:连接外部工具的桥梁
mcps:
filesystem:
source: npm:@modelcontextprotocol/server-filesystem
version: "0.6.0"
config:
root: /home/user/projects
# 智能体(agent):自定义 agent 的完整规格
agents:
senior-dev:
source: github:myorg/agents
version: "~1.2"
# 工具(tool):辅助工具和配置
tools:
formatter:
source: url:https://example.com/tools/formatter.tar.gz
# 钩子(hook):生命周期事件触发脚本
hooks:
pre-activate:
source: file:/home/user/hooks/check-env.sh
post-deactivate:
source: local:./hooks/cleanup.sh
# 提示词(prompt):可复用的提示词模板
prompts:
code-review:
source: git:https://github.com/myorg/prompts.git
version: ">=2.0"同一个环境可以混用任意类型的包,不限制种类和数量。同一个类型下包名必须唯一,但不同类型之间可以重名(比如可以同时有一个叫 code-reviewer 的 skill 和一个叫 code-reviewer 的 prompt)。
这种设计的妙处在于——不论是 GitHub 上的开源 skill、npm 上的 MCP 包、还是本地开发中的 hook 脚本,对 AgentEnv 来说都是「包」,都走同一套解析、下载、安装、激活的流水线。 你不用为不同种类的东西学不同的命令,也不用操心它们的存储路径和配置格式。
四个框架,一套流程
不管你用的是 Claude Code、OpenCode、Cursor 还是 Codex,AgentEnv 的命令都一样:
agentenv create --agent opencode my-env
agentenv add skill code-reviewer --source github:myorg/reviewer
agentenv lock
agentenv install
agentenv activate my-env框架切换只是一个 --agent 参数的区别。每个框架适配器知道自己的配置路径、格式(JSON、JSONC、TOML)、以及如何正确地读写而不破坏已有配置。
特别值得一提的是 OpenCode 适配器的 JSONC 支持:OpenCode 的配置文件是带注释的 JSON(JSONC),AgentEnv 用了 tailscale/hujson 来做注释保留的读写,不会像 encoding/json 那样把注释全部吃光。
事务性激活,不留下残局
激活环境时,AgentEnv 做的不是简单「往配置文件里塞几行」:
备份(backup)→ 校验(validate)→ 应用(apply)→ 失败回滚(rollback)如果校验失败或者任何步骤出错,它会自动恢复到变更前的状态。不会出现「配置改了一半 agent 跑不起来了」的情况。
内容寻址存储
所有下载的包存在一个内容寻址的本地仓库里。两个环境都用到 lint-helper@1.2.0?只存一份。某个包不再被任何环境引用?垃圾回收可以清理。跨文件系统的话,symlink 降级为文件复制。
快速上手
# 一行安装
curl -fsSL https://raw.githubusercontent.com/7emotions/agentenv/main/install.sh | sh
# 创建一个环境
agentenv create --agent opencode my-ai-setup
# 加几个包
agentenv add skill code-reviewer --source github:myorg/code-review-skill
agentenv add mcp filesystem \
--source npm:@modelcontextprotocol/server-filesystem \
--command npx --arg -y \
--arg @modelcontextprotocol/server-filesystem \
--arg /tmp
# 解析依赖
agentenv lock
# 下载并激活
agentenv install
agentenv activate my-ai-setup
# 搞定——你的 agent 现在有完整的运行环境了所有命令都支持 --json 输出,方便脚本化集成。
技术栈
AgentEnv 本身是一个 Go 项目(Go 1.26),单二进制发布,支持 macOS / Linux(amd64 / arm64)。核心依赖:
- CLI 框架:cobra(14 条命令)
- 依赖解析:
contriboss/pubgrub-go(CDCL 算法) - Git 操作:
go-git - 版本约束:
Masterminds/semver - 配置格式:YAML(
gopkg.in/yaml.v3)、TOML(BurntSushi/toml)、JSONC(tailscale/hujson)
28 个测试文件覆盖所有包,CI 跑 go test -race 在 ubuntu 和 macOS 上。
几条设计红线
做这个项目时我给自己画了几条硬线:
- 零遥测——不上报、不追踪、不联网发 ping。环境管理器碰触的是最敏感的本地配置文件,信任是第一位的。
- 无插件系统——所有适配器在编译时注册(
init()),不搞运行时动态加载。 - 无 Windows 支持——AI 编码工具的生态集中在 macOS 和 Linux,Windows 不在范围内。
- 不破坏 JSONC——这点值得再强调一遍:OpenCode 用户的配置文件里的注释一个字都不会丢。
在生态中的位置
AI agent 环境管理 / 配置管理这个方向,已经有不少开发者在探索。这里介绍几个我关注的代表性项目——它们和 AgentEnv 解决的问题各有侧重,不存在谁更「好」,更像是在同一个大方向上填补不同的空白。
agenv(combinatrix-ai) 定位为「nvm for AI agents」——管理的是 agent 二进制本身的版本和 profile 隔离。你可以用 agenv install claude 安装 Claude Code,再用 agenv run 启动,不同 profile 之间二进制、配置、权限完全隔离。这是一个非常实用的运行时版本管理工具,和 AgentEnv 的「包依赖管理」是问题的上下游——可以先用 agenv 管理 agent 本身的版本,再用 AgentEnv 管理 agent 内部的环境依赖。
agenv-cli(npm) 走的是配置生成路线:从一个 ai-workspace.json manifest 出发,自动检测项目类型、框架、已有配置,然后生成 Claude Code、Copilot、Codex、Cursor、Windsurf 等多个工具的配置文件。交互式的 agenv init 和自动化的 agenv generate,对于「想让多个工具共享一套配置规则」的场景是一个简洁高效的选择。
agentctl(OrgLoop) 是 agent session 监控面板,提供启动、监控、恢复、终止、对比 agent 会话的完整运维能力。它带有守护进程、目录锁、webhook 和 Prometheus 指标,做得非常专业——关注的是「同时跑多个 agent 会话怎么可靠管理」这一运维层面的问题。
agentctl(iheanyi) 的定位和 AgentEnv 最接近——跨框架配置管理,覆盖了 Claude Code、Codex、OpenCode、Cursor、Cline、Windsurf、Zed、Continue、Gemini 等 10 个框架。它可以从各框架的原生配置目录中发现已有资源(MCP 服务器、rules、commands、skills),再同步到其他框架,还提供一个交互式 TUI,使用体验很流畅。
这些项目从不同角度推动着同一件事:让 AI 智能体的配置管理从「手工拷贝文件」走向「工具化、自动化」。AgentEnv 选择的角度是声明式包管理与依赖解析——把 PubGrub 求解器、确定性锁文件、内容寻址存储这套成熟的包管理范式,带到 AI 智能体的世界。没有哪个项目是「唯一正确答案」,每个都解决了一类真实的痛点,也在互相启发。
下一步
AgentEnv 还远没有完成。接下来计划:
- 依赖图可视化:
agentenv graph画依赖关系 - 环境对比:
agentenv diff env-a env-b - 远程锁文件共享:团队里一份
agent.lock就能复现全队环境 - 更多的适配器:Windsurf、Aider、Continue
如果你每天在多个 AI 编码工具之间切换,或者在维护多个项目的不同配置,欢迎试试 AgentEnv。
git clone https://github.com/7emotions/agentenv.git
cd agentenv
make build && ./dist/agentenv --helpStar、Issue、PR 都欢迎。让 AI 智能体的环境管理,走上正轨。