同名 subagent 的作用域冲突解析方法详解(用户家目录配置与项目内配置的优先级与嵌套规则)

当多个同名 subagent 同时存在于用户家目录的 .claude/agents 与项目内的 .claude/agents,Claude Code 按”位置优先级”解决冲突;嵌套项目结构里,从工作目录向上逐层扫描的每一级 .claude/agents 都参与解析,离工作目录最近的同名定义覆盖更外层。理解这两条规则,就能预判同一条 subagent 在不同目录下被加载到的版本。

一、subagent 是什么:一句话定位

subagent 是拥有独立上下文窗口、自有系统提示、工具白名单和权限模式的 AI 实例,主对话通过 Task 工具把任务委派给它,子代理跑完把摘要回传。子代理只拿到自己的系统提示加基础环境信息,不会继承完整的 Claude Code 系统提示——这条边界决定了 subagent 文件既能定义”角色”,也能定义”能调什么工具、能进什么权限”。

定义 subagent 的文件是带 YAML frontmatter 的 Markdown,frontmatter 存配置,Markdown 正文是系统提示:

---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---

You are a code reviewer. Analyze the code and provide specific, actionable feedback.

name 字段是 subagent 的唯一标识,subagent 文件放在哪个目录、文件名怎么取,都不影响它的身份——只跟 name 有关。

二、作用域的五个层级与优先级

subagent 文件可以放在五种位置,Claude Code 启动时按优先级合并,同名时高优先级覆盖低优先级。

优先级 位置 作用域 创建方式
1(最高) 托管设置 组织范围 管理员下发
2 --agents CLI 标志 当前会话 启动时传 JSON
3 项目内的 .claude/agents 当前项目 询问 Claude 或手动建
4 用户家目录的 .claude/agents 当前用户所有项目 询问 Claude 或手动建
5(最低) 外挂的 agents 目录 启用外挂的范围 随外挂安装

把它读三遍:”项目内配置”优先级高于”用户家目录配置”——这与很多开发者直觉相反的”项目覆盖用户”恰好一致;项目级 subagent 通常要进版本控制,团队共用;用户级 subagent 是个人跨项目习惯。

三、同名冲突的解析步骤

当多个 subagent 共享同一 name,Claude Code 走完整解析流程如下:

  1. 把”项目内的 .claude/agents”(含子目录)作为最高优先项目级来源;
  2. 把”用户家目录的 .claude/agents”(含子目录)作为个人级来源;
  3. 把当前会话通过 --agents 传入的 JSON 作为会话级来源(最高优先);
  4. 把当前启用的外挂的 agents/ 目录作为外挂级来源(最低优先);
  5. 同名时按优先级表选胜出者;同层冲突则按文件系统读取顺序加载其中之一。

CLI 会话级之所以高于项目级,是为了支持临时测试和自动化脚本:”我想这次跑一个临时版本,但不动项目文件”,传 --agents 即可。

四、嵌套项目结构的加载规则

仓库里嵌套目录的情况非常多:monorepo 里 apps/web/.claude/agents/ 和 apps/api/.claude/agents/ 同时存在,仓库根还有 .claude/agents/。从 v2.1.178 起,Claude Code 从”当前工作目录”向上逐层扫描,每一级 .claude/agents 都会被加载,最靠近工作目录的同名定义胜出。

当前工作目录 扫描路径 同名 code-reviewer 胜出者
apps/web/ apps/web → 仓库根 apps/web/.claude/agents/code-reviewer.md
仓库根 仅仓库根 .claude/agents/code-reviewer.md
apps/web/src/ apps/web/src → apps/web → 仓库根 apps/web/.claude/agents/code-reviewer.md

最后这一行是新规则的精髓:把工作目录切到 apps/web/src/ 时,Claude Code 仍然从 src/ 向上找到 apps/web 的定义,而不是仓库根的版本。这意味着”我在哪个子目录工作,就用哪个 subagent 配置”,对 monorepo 来说非常顺手。

通过 --add-dir 显式添加的目录也会被纳入扫描,其内部的 .claude/agents 与项目级 subagent 一起加载,便于跨目录协作。

五、目录子树内的重名陷阱

subagent 的身份只看 name,不看文件路径。因此”两个子目录下各有一个同 name 的 subagent 文件”也是冲突。/doctor 自检会报这种重复:同一目录下两个同名文件只会有一个被加载,由文件系统读取顺序决定,没有文档化的优先级。修复方式是改名或合并。

外挂 agents 目录的子目录结构会进入 scoped identifier:my-plugin/agents/review/security.md 注册为 my-plugin:review:security,与项目级和用户级的扁平命名空间分开。这避免了外挂和项目内 subagent 重名时的误覆盖。

六、把规则落到一次发布

按下面五步把”项目内 subagent 覆盖同名用户级 subagent”这件事确认下来:

  1. 在用户家目录的 .claude/agents/code-reviewer.md 写一份个人版(用 sonnet 跑代码评审);
  2. 在仓库根的 .claude/agents/code-reviewer.md 写一份项目版(用 opus 跑、禁用 Bash 工具);
  3. 在仓库根跑 claude,让默认工作目录触发解析——/agents 应显示项目版生效、用户版被覆盖;
  4. 在仓库根的子目录里 cd apps/web 再跑,验证仍是项目版(因为仓库根和子目录没新增 .claude/agents);
  5. 在 apps/web/.claude/agents/code-reviewer.md 写一份更窄的子项目版,验证在 apps/web 下解析到子项目版,回仓库根解析到根项目版。

效果:subagent 配置随工作目录自动切换,不必手动切换。注意点:同名 subagent 在同一目录的子目录里重名会触发 /doctor 警告,文件名仍要保持唯一;通过 --add-dir 加入的目录会与项目级 subagent 一起参与解析,注意这些”动态目录”也可能引入冲突。

七、易混淆对照

场景 期望胜出 实际胜出
项目内与用户家目录同名 项目内 项目内
嵌套工作目录与仓库根同名 嵌套目录 嵌套目录(离 cwd 最近)
同目录子文件夹下同名 看路径 文件系统读取顺序
CLI --agents 与项目内同名 CLI CLI
外挂与项目内同名 外挂看配置 项目内(项目级优先)

最后一行的”反直觉”是文档原话——同名 subagent 在项目内定义时,会压过外挂同 name 里的定义。如果想保留外挂版本,要么改名,要么不把同名文件放进项目内。

常见问题(FAQ)

Q1:subagent 文件名重要吗?

不重要。name 字段才是身份,文件名仅决定加载顺序;同名冲突按文件读取顺序,没有文档化优先级。

Q2:在 monorepo 子目录跑会用到哪个 subagent?

从工作目录向上逐层找 .claude/agents,找到的第一个同名定义胜出;未命中则继续向上,直到仓库根。

Q3:托管设置能压过项目内配置吗?

能。组织托管设置优先级最高,可被企业管理员用来强制覆盖用户/项目级 subagent。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qiqicto@qq.com 举报,一经查实,本站将立刻删除。
赞 (0)
其AI的头像其AI普通用户

相关推荐

返回顶部