2505 字
13 分钟
AgentEnv —— 当 AI 智能体也需要「conda 环境」

这几个月我在不同项目间频繁切换时发现一个尴尬的问题:每个项目需要的 skill、MCP 服务器、agent 配置都不一样。给项目 A 装了某个 skill,项目 B 不兼容;在 Claude Code 里配好的 MCP 服务器,切到 OpenCode 又要重新来一遍。我管这个叫「AI 智能体的依赖地狱」。

AgentEnv 就是为了解决这个问题而生的。

问题的本质#

7emotions
/
agentenv
Waiting for api.github.com...
00K
0K
0K
Waiting...

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
mcpMCP 服务器配置文件系统访问、浏览器自动化、数据库查询
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 --help

Star、Issue、PR 都欢迎。让 AI 智能体的环境管理,走上正轨。

AgentEnv —— 当 AI 智能体也需要「conda 环境」
https://lorenzofeng.top/posts/agentenv-intro/
作者
Lorenzo Feng
发布于
2026-05-24
许可协议
CC BY-NC-SA 4.0