AREX Feed Article
Anthropic 为 ant CLI 新增 ant apply:Claude Managed Agents 资源可按仓库文件同步到 API
Anthropic 官方 Claude 开发者账号 @ClaudeDevs(账号简介为 "Official updates for developers building with @ClaudeAI")在 UTC 时间 9 月 3 日 23 时 12 分(北京时间 9 月 4 日 7 时 12 分):ant CLI 新增 ant apply 子命令。开发者可以把 Claude Managed Agents 的 environments(运行环境)、agents(代理)、skills(技能)、memory stores(记忆存储)与 deployments(部署)五类资源声明为代码仓库里的文件,再执行 ant apply,让 API(应用编程接口)上的资源与仓库声明保持同步。公告附演示视频,并指向,标题为 "Manage resources as code with ant apply"。
与逐条调用 API 或在控制台里点选不同,ant apply 走的是「声明、预览、批准」流程:命令先打印一份将创建或更新哪些资源的计划,交互式终端里等开发者输入 y 确认、n 拒绝、d 查看逐字段差异;执行后把状态写进 claude-lock.json,文档要求从仓库根目录运行。下一次运行读这份锁文件,更新的是同一批资源,而不是再建一套新的。
五类资源各自长什么样,ant apply 怎么认出它们
文档给出的:agent 放在 agents/ 目录下,写成 Markdown 文件,YAML frontmatter(文件头部的元数据区)里是配置(name、model、tools 等字段),正文就是它的 system prompt(系统提示词)。environment 是 environments/ 下的 YAML 文件;memory store 是 memory_stores/ 下的 YAML,存放 agent 在运行之间记录的内容。deployment 是 deployments/ 下的 Markdown,frontmatter 是请求体,正文会成为每次会话开场的第一条消息,还可以带 cron 定时(示例为 0 3 * * *)。
skill 特殊一些,是一个以 SKILL.md 为入口的目录,作为单个 bundle(整包)上传;除 skill 外,其余资源都可用 YAML、JSON 或 Markdown 三种格式书写。
ant apply 按三条线索判断文件属于哪类资源:文件顶层的 type 字段、文件所在目录(agents/、environments/、memory_stores/、deployments/)、或以 kind 开头的文件名(如 environment_staging.md)。README、CI 配置这类匹配不上的文件会被跳过,除非在命令行里点名。单个文件也能应用,例如 ant apply agents/summarizer.md,文档的入门示例就是这样一个名为 Summarizer、模型为 claude-opus-5 的 agent。
资源之间用相对路径互相引用:deployment 文件里写 agent: ../agents/reviewer.md,而不是资源 ID。ant apply 会按依赖顺序创建资源并把真实 ID 填回,同一运行里改了被引用的 agent 或 skill,引用方会一并更新;agent 的 roster 也可以这样声明,协调者 agent 通过 ./reviewer.md 这样的路径列出它要调度的下属 agent。skill 引用还支持 GitHub URL,ant apply 会把该目录下载并上传,锁定到解析出的 commit,直到加 --upgrade 才重新解析。
claude-lock.json 与两份哈希:外部改动会让计划拒跑
claude-lock.json 记录每个文件创建出的资源 ID、所在 organization 与 workspace、版本号,以及一对哈希:hash 是上次发送给 API 的内容指纹,remote_hash 是 API 返回状态的指纹。文件被编辑,或资源在仓库之外被改动,后续运行靠这两份指纹识别出来。
如果某个资源在仓库之外被编辑、归档或删除(例如在 Claude Console 里),计划会在结尾显示 This plan cannot be applied 并给出原因,命令拒绝执行,加 --force 才会覆盖改动或重建。删除声明文件不会删除资源,只会给出警告,--prune 才会移除,skill 是直接删除,其余资源是归档。改名一个文件等于声明一个新资源,旧资源会留在原地直到被 prune。
ant apply 因此不接管已经存在的资源:它只管理锁文件里登记的内容,apply 一个描述了已有 agent 的文件会创建出第二个 agent;在 Console 或 ant beta:agents create 里建过的资源同样不在管理范围内。例外是 Console 的 "Export as code" 导出,下载包里自带 claude-lock.json,apply 可以更新这些资源。
三个月:ant 从 beta 命令逐条更新走到整栈声明
Claude Managed Agents 是 Anthropic 面向长时程任务的托管 agent 服务。官方把它拆成 agent、environment、session、events 四个概念:agent 是模型、system prompt、工具、MCP servers(MCP 服务器)与 skills 的组合;environment 决定会话跑在 Anthropic 托管的云沙箱还是自托管的沙箱里;这类服务适合需要运行几分钟到几小时、包含多次工具调用的长任务。
在 4 月 8 日介绍过它的设计:把 session(会话)、harness(执行循环)与 sandbox(沙箱)虚拟化成互相独立的接口。
ant CLI 是 ,官方当时的说法是让 Claude Platform 的每个 API endpoint 都能从终端调用,Claude Code 通过内置的 /claude-api skill 直接使用它;同一天里给的管理方式是:把 agent 以 YAML 存进 Git,让 CI(持续集成)跑 ant beta:agents update 把变更同步到 Claude Platform,命令带 beta 前缀,同步的是单个 agent 的配置。
此后 CLI 的覆盖范围逐月扩大。,官方称 Claude Code 可以用内置 /claude-api skill 直接搭建 Managed Agent deployment;,Admin API 进入 SDK 与 ant CLI,成员、workspace、API key 和 org 的速率限制都能在终端里管。
9 月 3 日的 ant apply 把覆盖范围推到整栈:environments、memory stores、deployments 与 skills 同 agents 一起进入「文件声明、apply 同步」这一套流程,配上一份记录资源 ID 与指纹的状态锁;一次 apply 能按依赖顺序处理整棵资源树,运行环境、记忆与定时部署也随之进入代码评审。
没有终端的 CI 怎么跑:合并后 apply --yes,PR 上只 --dry-run
ant apply 的 CI 语义按「没有终端」设计。无终端环境下它打印计划后停下,提示无法请求确认,要求改用 --yes 直接应用,或 --dry-run 只看计划。
文档给出的:默认分支合并后跑 ant apply --yes .,把整个项目目录应用到 API;pull request 里跑 ant apply --dry-run .,把计划打印给评审者看,它只做展示,即使计划被阻塞也以 0 退出,不会拦 CI。
任务结束时要把更新过的 claude-lock.json 提交回仓库,即使 apply 中途失败也要提交,因为部分执行仍然记录了它创建的资源;一次只跑一个 apply,因为锁文件没有锁。认证上文档推荐 Workload Identity Federation 而不是长期 API key,ant apply 会拒绝任何解析到其他 organization 或 workspace 的凭据,锁文件里记的 org 和 workspace 必须与凭据一致。
「给 agents 的 Terraform」:评论区读法与两个边界问题
官方推文发出约三分钟后,网友 Hüseyin Örskaya(@orskyai)在里写道:「给 agents 做 Terraform。用不了多久,我们就会在 git 仓库里对员工队伍的人格做版本管理。」类似的读法在回复里反复出现:网友 Kyvenev(@kyvenev)「终于把 agent 配置当代码处理了。给 agents 用的 GitOps,而不是在仪表盘上点来点去」。另一类回复把类比直接变成了需求:网友 DanT(@uyintans)「有没有 Terraform 集成,这样我们就不必专门为它另造一套」。
两个技术问题戳向机制边界。网友 MEHI(@mehiEth)「ant apply 会检测状态漂移,还是直接覆盖?」文档给出的机制对应前文 claude-lock.json 那套哈希比对:外部改动默认拒跑,--force 才覆盖。9 月 4 日 0 时 27 分 UTC,网友 MayaX(@mayaaa0x)「如果 apply 在同步 agents、skills 和 memory stores 的过程中失败,会留下部分状态,还是完整回滚?」文档给出的处理是:部分执行会把已创建的资源记入 claude-lock.json,CI 照常提交这份记录。
整套机制都依赖 claude-lock.json 被提交
ant apply 的保护措施都依赖同一个动作:把锁文件提交回仓库。写得很直白:「把它和你的文件一起提交,下一次运行(无论在你机器上还是在 CI 里)才能找到这些资源,而不是重新创建。」不提交 claude-lock.json,下一次 apply 就认不出已建好的资源,同一份声明会再创建出一套。文档因此要求从仓库根目录运行,并让锁文件随资源文件一起走代码评审。