per-agent、roster、plugin:三种安装机制决定了你能不能只装一个

2026-08-09

很多人接触 agency-agents 的第一个念头都一样:这个仓库里 agent 太多了,我只想挑一两个装进自己的工具,别把配置目录搞成垃圾场。这个念头完全合理,但能不能实现,取决于你用的是哪个工具——不是取决于命令行怎么写。

答案藏在仓库 tools.json 的一个字段里:installKind。它只有三个取值:per-agentrosterplugin。这三个词看着像分类标签,实际上是三种完全不同的产物形态,直接决定了「只装一个」这件事在你的工具里是否成立。

先分清两条链路:转换和安装是两回事

agency-agents 的核心资产是一批 markdown:每个 agent 一个 .md 文件,YAML frontmatter 加提示词正文,一共 255 个(核对日 2026-08-09),分布在 17 个 division 目录下。这些 markdown 本身不是任何工具能直接吃的格式。

所以链路是两段:源 agent markdown 先经 scripts/convert.sh 渲染成各工具认识的格式,落进 integrations/ 目录;再由 scripts/install.shintegrations/ 拷贝到每个工具对应的配置目录。install.sh 头部注释写得很清楚:它读的是已转换的文件,如果 integrations/ 缺失或过期,会先去跑 convert.sh——这个自动行为可以用 --no-convert 关掉。

这里有个新手常犯的误会:integrations/ 是产物目录,不是源目录。divisions.json_note 明确把它和 strategy/examples/scripts/ 一起排除在 division 之外。你在 integrations/ 里改东西,下次 convert 就冲掉了。

installKind 属于第一段——它描述的是 convert 这一步渲染出什么形态的产物。理解这一点,后面的事就顺了。

三种 installKind 分别意味着什么

tools.json_noteinstallKind 定义为「安装机制」,并且强调它是上游真相,对每个消费方都成立。也就是说这不是某个脚本的实现细节,而是这批 agent 面向下游工具时的固有契约。

per-agent——每个 agent 渲染出一个文件或一个目录。装 255 个 agent 就是 255 份产物。16 种工具里有 13 种走这条路:Claude Code、Codex、Gemini CLI、GitHub Copilot、Qwen Code、Cursor、opencode、Osaurus、Antigravity、Kimi、OpenClaw、Mistral Vibe、ZCode。

roster——所有 agent 合并成一个文件。只有两个:Aider 的 CONVENTIONS.md,Windsurf 的 .windsurfrules

plugin——一个构建出来的产物,_note 的说法是它不能按 agent 渲染成字符串,在所有消费方都只能走 CLI。全表只有 Hermes 一个,目标是 .hermes/plugins/agency-agents-router

installKind工具产物形态
per-agent13 种(Claude Code、Cursor、Codex、opencode 等)一 agent 一文件或一目录
rosterAider、Windsurf全部 agent 合并成单一文件
pluginHermes构建产物,只能走 CLI

判断依据:你的问题该往哪边归

把上面这张表当查询表用就行,但真正省事的是反过来读它——从你的困惑倒推。

「我在 Aider 里没法只装某一个 agent。」 这不是你命令写错了。Aider 的 installKindroster,它的产物形态就不是一 agent 一文件,而是一个 CONVENTIONS.md--agent 这类选择器本身没有失效——它们是安装环节的筛选,产物形态却是转换环节定死的,两件事不在同一层。所以无论你怎么收窄,落到 Aider 那边拿到的终究是一个文件,不是一份可以单独启停的 agent 清单。Windsurf 的 .windsurfrules 同理。

「Hermes 我在官方 app 里找不到入口。」 plugin 意味着连官方桌面 app 都装不了,只能命令行。README 里提到的那个原生 app 能一键装进 Claude Code、Cursor、Codex、Gemini、Osaurus 这些工具(我们没有下载或运行过它,只能转述 README 的说法),但按 _note 的定义,plugin 类产物在所有消费方都只有 CLI 一条路。

「我想按 division 批量装。」 这个诉求跟 installKind 无关,是选择器的事。--division <a,b>--agent <slug,slug>--agents-file <path> 三个选择器可以自由组合,全空就是全装。走 per-agent 的工具会按你的收窄产出对应数量的文件。

format 的字节级契约,以及它不承诺什么

tools.json 里跟 installKind 并列的还有一个 format 字段,两者常被混着理解,其实分工很清楚:installKind 管产物形态format 管产物内容长什么样

_noteformat 的契约含义是:同一个 format 名保证渲染出字节级相同的输出。所以两个工具能共用一个 format,前提就是它们渲染出来的文件完全一样。这解释了表里两组看着奇怪的搭配——claude-codecopilot 都用 identity(顾名思义就是原样输出,不做格式改写),osaurusantigravity 都用 skill-md。它们落点不同,但文件内容是同一份字节。

_note 最后一句更要如实带出:渲染器的覆盖面是消费方自己的事(由 format 推导),目录本身不携带任何 app 发布状态。翻译成人话——tools.json 里有某个工具,不等于官方 app 已经支持它,也不等于那个工具当前版本一定能正常识别这份产物。这一列是仓库对格式的声明,不是对下游生态的背书。

第二个变量:装到家目录还是当前目录

选完 installKind 还有一脚容易踩空。install.sh 注释里列的各工具落点,绝大多数指向家目录,但有四个写的是当前目录:opencode、Cursor、Aider、Windsurf。

claude-code  -- ~/.claude/agents/
cursor       -- 当前目录的 .cursor/rules/
aider        -- 当前目录的 CONVENTIONS.md
windsurf     -- 当前目录的 .windsurfrules

这个差别决定了你是给某个项目装还是给整个账户装。在错误的目录里敲下这条命令,后果是两个方向的:要么你以为装到项目里、结果落进了家目录被所有项目共享;要么你以为全局生效、结果只在当时那个目录下有。

还有一处更细的坑值得单独点出来:tools.json 里 opencode 的用户级路径是 .config/opencode/agents/{slug}.md,而 install.sh 注释写的是「当前目录的 .opencode/agents/」——这两处分别对应不同 scope,不是矛盾。要断言某个具体路径,回源文件按当前 scope 现查,别混着说,也别从一个工具的路径类推另一个。类似地,Claude Code 的用户级与项目级模板都是 .claude/agents/{slug}.md,区别只在落到家目录还是当前项目目录。

如果默认落点不合你的目录规划,install.sh 支持用环境变量在硬编码默认值之前覆盖,注释里列出的包括 CLAUDE_CONFIG_DIRCURSOR_RULES_DIRCODEX_AGENTS_DIROPENCODE_AGENTS_DIRGEMINI_AGENTS_DIRHERMES_PLUGIN_DIR 等,也可以用 --path <dir> 直接覆盖单一目标。

落盘之前先看一眼计划

理清了机制,实操上最该养成的习惯只有一个:--dry-run。它只打印安装计划、不写任何东西。往 ~/.claude/agents/ 这类共享目录一次性写进两百多个文件之前,先把计划打出来看看,比事后清理便宜太多。

# 先看计划,不落盘
./scripts/install.sh --tool claude-code --division engineering --dry-run

# 只要指定的几个 agent
./scripts/install.sh --tool claude-code \
  --agent engineering-code-reviewer,design-ux-architect --dry-run

以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 ./scripts/install.sh --help 的实际输出为准。

配套的还有几个开关:--list [tools|teams|agents] 列出后退出,适合先摸清可选项;--link 用符号链接代替拷贝,改动会自动传播,适合你打算跟着上游更新或自己改 agent 正文;--parallel--jobs N 并行装多个工具,默认并行数取 nproc 或 4;--interactive / --no-interactive 控制交互向导,在终端里默认是开的。

至于要不要一口气把 255 个 agent 全塞进全局配置目录——上下文占用、工具启动时的加载、命名冲突,这些代价客观存在,用 --division--agent 收窄是更稳的做法。具体影响有多大我们没有测过,不给数字。

平台方面,脚本注释写的支持范围是 Linux、macOS(需要 bash 3.2 以上)、以及 Windows 的 Git Bash 或 WSL。Windows 用户注意这一条:这些是 shell 脚本,在 PowerShell 或 cmd 里直接跑是不行的,得开 Git Bash 或进 WSL。

一个反直觉的收尾:Cursor 装完像没装

最后补一个跟 installKind 不直接相关、但同一批人一定会撞上的设计。convert.sh 渲染 Cursor 的 .mdc 文件时,frontmatter 是写死的:

## 延伸阅读

- [同名 format 保证字节级相同输出:一条被写进注释的契约](/learn/agency-agents-format-qiyue/)
- [给 agent 章节起标题其实是在写路由:agency-agents 的 SOUL.md / AGENTS.md 分流机制](/learn/agency-agents-zhangjie-biaoti-luyou/)
- [16 种工具、16 个落点:一张表搞清装到哪去了](/learn/agency-agents-16zhong-gongju-luodian/)

---
description: ${description}
globs: ""
alwaysApply: false
---
${body}

globs: ""alwaysApply: false 都是硬编码的。意味着转换出来的 Cursor 规则默认不会自动生效,需要你在 Cursor 里按需引用。装完发现「没反应」,多半就是这里,而不是路径装错了。

把这三层理顺,你的决策路径其实很短:先查目标工具的 installKind,确定「只装一个」在它那儿成不成立;再确认落点是家目录还是当前目录,决定在哪敲命令;最后用 --dry-run 把计划打出来核一遍。三步走完,剩下的才是这批 agent 本身好不好用的问题——那是另一个话题,也不是一份目录清单能替你回答的。


本文依据 agency-agents 官方仓库(github.com/msitarzewski/agency-agents)的 README、 tools.jsondivisions.jsonscripts/ 下的安装与校验脚本整理,核对日 2026-08-09。 本文内容为仓库源码与文档口径,我们没有安装或运行过其中任何 agent。 目录、脚本与安装路径随上游更新而变动,请以仓库最新内容与 ./scripts/install.sh --help 的实际输出为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。