Claude Code 自定义 subagent 实例:测试员、调试员、只读调研员、只读数据库员怎么写

四个可直接改的 subagent 实例:跑测试的 test-runner、找根因的 debugger、只读调研员、用 PreToolUse hook 限成只读 SQL 的 db-reader;讲 tools、disallowedTools、model、maxTurns 怎么配,怎么点名调用。

NNathaniel bigo··原创首发·AI 辅助撰写
8 分钟读完
资料核对于 2026-11-05 · 依据官方文档与公开资料整理 Plus 账号
本文根据 Claude Code 官方《Create custom subagents》整理,资料核对于 2026-11-05。配图为本站整理的示意图,不是界面截图。测试员和调试员的提示词是本站自己拟的示例。本站(bigolab.com)不是 Anthropic 官方网站。

适用于谁

  • 已经看过 /guides/claude-code-subagents,知道子代理是什么,但不知道具体怎么写的人;
  • 想让「跑测试、查报错」这类输出很啰嗦的工作留在独立上下文里,不污染主对话的人;
  • 想给子代理加上硬性限制(比如只能读数据库)的人。

结论先说

  1. 子代理就是一个带前置字段的 Markdown 文件,放在 .claude/agents/(当前项目)或 ~/.claude/agents/(你所有项目)。只有 name 和 description 是必填。
  2. description 决定会不会被自动调用:官方说 Claude 按它来判断是否委派,加上「use proactively」这类措辞能促进自动调用。
  3. 权限靠 tools 收窄:只读的角色只给 Read、Grep、Glob;官方写明省略 tools 就继承所有可用工具。
  4. 想拦截具体命令,用 hook 而不是 tools:官方明确说 disallowedTools: Bash(git push *) 这种带参数的写法会把整个 Bash 去掉,要拦具体命令需要 permissions.deny 规则或 PreToolUse hook。
  5. 子代理用的是同一份额度:官方写明子代理请求计入与主对话相同的用量限制,所以别建太多、别让它们跑太久。

四个示例的工具与用途

图:本站根据 Claude Code 官方《Create custom subagents》 整理的示意图

代码审查员的写法已经在 /guides/claude-code-subagents 里给过,本文不重复,只补它没有的角色。

一、测试员:test-runner

适用场景:跑完整测试输出几百行,你只想知道哪几个失败、为什么。让子代理去跑,只把摘要带回主对话,这正是官方说子代理能「把冗长输出留在主对话之外」的用法。

.claude/agents/test-runner.md:

markdown
---
name: test-runner
description: 运行测试并汇报结果。修改代码后或用户要求跑测试时主动使用(use proactively)。
tools: Read, Grep, Glob, Bash
model: sonnet
maxTurns: 15
---

你是测试执行员。被调用时:
1. 先用 Glob 和 Grep 找出与改动相关的测试文件
2. 运行相关测试(优先单个文件,其次全量),命令见项目的 CLAUDE.md
3. 只汇报:通过数、失败数;每个失败用例的名字、断言信息、最可能的原因
4. 不要修改任何文件,不要自己修复

输出格式:先给一行总结,再列失败项。

几点说明:

  • tools 里没有 Edit 和 Write,所以它只能跑命令和读文件,改不了代码,这个「不要修改」就有了硬保证;
  • maxTurns: 15 是官方字段,限制它最多走多少个回合,到上限时输出会被标记为部分结果,可以继续;
  • model: sonnet 用别名固定模型。官方给出的解析顺序是:调用时传入的别名、frontmatter 的 model、环境变量 CLAUDE_CODE_SUBAGENT_MODEL、最后才是主对话的模型。

二、调试员:debugger

调试员要能改代码,所以不写 tools,让它继承全部工具:

markdown
---
name: debugger
description: 排查报错和测试失败的专家。遇到异常、堆栈或失败的测试时主动使用。
---

你是调试专家。被调用时:
1. 先复现问题:读报错信息和堆栈,找到出错位置
2. 提出最多三个可能的原因,逐个用代码或日志验证
3. 找到根因后做最小改动修复,再重新运行相关测试确认
4. 汇报:根因是什么、改了哪里、如何验证

官方文档里有一个最简的 debugger 示例用于 --agents 参数,只写了说明和一句提示词;上面这份更详细的版本是本站拟的。什么时候用它:问题需要「读—猜—改—验」反复多轮,主对话的上下文不想被中间过程占满。如果只是想让它给建议不改代码,就改成只读版本,见下一节。

三、只读调研员

官方的 safe-researcher 示例原样如下:

yaml
---
name: safe-researcher
description: Research agent with restricted capabilities
tools: Read, Grep, Glob, Bash
---

想「继承全部工具但禁止写文件」,官方给的另一种写法是用黑名单:

yaml
---
name: no-writes
description: Inherits the available tools except file writes
disallowedTools: Write, Edit
---

两种写法的区别:白名单 tools 只给你列的;黑名单 disallowedTools 是先从继承的全部工具里去掉,如果同一个工具在两处都出现,会被去掉。MCP 工具也一样,官方写法是 disallowedTools: mcp__github 去掉某个 MCP 服务器的全部工具。

四、只读数据库员:用 hook 拦截写操作

只放行 SELECT,是官方《子代理》页给出的完整示例。子代理只给 Bash,再挂一个 PreToolUse hook:

yaml
---
name: db-reader
description: Execute read-only database queries
tools: Bash
hooks:
  PreToolUse:
    - matcher: "Bash"
      hooks:
        - type: command
          command: "./scripts/validate-readonly-query.sh"
---

校验脚本(需要用 chmod +x 设为可执行,官方说明 macOS 和 Linux 上必须如此):

bash
#!/bin/bash
# ./scripts/validate-readonly-query.sh

INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# Block SQL write operations (case-insensitive)
if echo "$COMMAND" | grep -iE '\b(INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE)\b' > /dev/null; then
  echo "Blocked: Only SELECT queries are allowed" >&2
  exit 2
fi

exit 0

关键点:脚本以退出码 2 结束并把原因写到 stderr,就会阻止这次工具调用;退出码 0 放行。frontmatter 里的 hook 只在这个子代理运行期间生效;对于放在项目里的子代理文件,官方还说明需要先接受工作区信任对话框,hook 才会运行。hook 的基础见 /guides/claude-code-hooks。

五、怎么调用它们

写子代理前的检查清单

图:本站根据 Claude Code 官方《Create custom subagents》 整理的示意图

官方列了三种方式,由弱到强:

  1. 自然语言点名:例如「用 test-runner 子代理跑一下失败的测试」,Claude 通常会委派;
  2. @ 提及:输入 @ 选子代理,例如 @"code-reviewer (agent)" 看一下认证相关的改动。你的整条消息仍然交给 Claude,由它来写给子代理的任务提示;
  3. 整个会话换成它:claude --agent code-reviewer,主线程会采用该子代理的工具限制和模型;在 .claude/settings.json 里写 "agent": "code-reviewer" 可设为项目默认,命令行参数优先于设置。

现在的 /agents 命令只提醒你让 Claude 创建或直接编辑目录,交互向导只在 v2.1.197 及更早版本里有。

如果你想让测试员和调试员联动,不必自己写调度逻辑:官方说明子代理默认可以再启动子代理,最多往下三层,可用环境变量 CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH 调整,设为 1 则禁用嵌套。

常见问题

Q:子代理没有被自动调用?

先看 description 是否写清了触发场景;再用「用 xxx 子代理……」明确点名试一次。名字以 name 字段为准,不是文件名。

Q:子代理 vs 技能 vs hook 怎么选?

需要独立上下文、隔离冗长输出用子代理;固定流程用技能;硬性拦截用 hook,对比见 /guides/skill-vs-mcp-vs-subagent-vs-hook。

Q:会不会很费额度?

会。每个子代理都有自己的上下文窗口和调用,并计入同一份用量。需要更多额度可以了解 Claude Code 订阅方案;同时给每个子代理设 maxTurns 和便宜的 model。

参考资料

  • Claude Code 官方:Create custom subagents — https://code.claude.com/docs/en/sub-agents

Nathaniel 的更多内容

  1. 01

    Claude Personal Finance 是什么:连银行账户问花销、怎么开、只读权限、谁能用、怎么解除

    Claude 的 Personal Finance(beta)通过 Plaid 只读连接你的银行、信用卡、贷款和投资账户,在一页里看余额和花销并用自然语言提问。本文按官方帮助页讲谁能用(仅美国、Pro/Max/Ultra)、连接与解除步骤、Claude 能看什么,以及它做不到的事。

    Claude0
  2. 02

    Claude Code 离开一小时回来对话被「压缩」了:Idle compaction 是什么、条件、怎么关

    Claude Code 的 idle compaction 会在你离开约一小时后,把 200K token 以上的长对话先压缩成摘要,下一条消息就不用重新处理整段历史。本文按官方文档讲触发条件、看到什么提示、用 /config 或 idleCompaction 关闭、调阈值,以及恢复旧对话的用量警告。

    Claude0
  3. 03

    ChatGPT Computer History 是什么:Mac 桌面端的活动记忆怎么开、怎么暂停和清除、谁能用

    Computer History 是 ChatGPT macOS 桌面应用里默认关闭的可选功能,把你在应用和网站里的活动整理成记忆和时间线,供 ChatGPT 与 Codex 引用。本文按官方文档讲怎么开、记录什么不记录什么、怎么暂停与清除、数据存哪、谁能用,以及提示注入风险。

    ChatGPTCodex0
  4. 04

    Codex 输入框出现灰色建议:Composer predictions 是什么、Tab 接受、怎么关、谁能用

    Codex 桌面 App 的 Composer predictions(beta)会在 Codex 回完后,根据当前对话在输入框里给出下一条消息的建议,按 Tab 接受、不会自动发送。本文按官方帮助页讲谁能用、哪些线程支持、怎么关、算不算额度,以及没出现时怎么查。

    ChatGPTCodex0
  5. 05

    ChatGPT 隐私中心(Privacy Center)在哪里:隐私设置入口、三大分类和哪些套餐有

    ChatGPT 的 Privacy Center 把记忆、广告、位置、临时对话、锁定对话、两步验证、模型改进、数据导出和删号等入口集中到一页。本文按官方帮助页讲怎么打开、三大分类各有什么、哪些套餐有,以及它不会替你改任何设置。

    ChatGPT0
  6. 06

    Claude Code 处理大仓库:怎么让它只看需要的目录(子目录 CLAUDE.md、claudeMdExcludes、deny 规则)

    仓库太大,Claude Code 总在读无关文件、读进别的包的规则?本文按官方大仓库指南讲:从哪个目录启动、子目录 CLAUDE.md、claudeMdExcludes、Read 的 deny 规则、worktree.sparsePaths、additionalDirectories,以及一份合并后的配置示例。

    Claude0

同产品的其他教程

  1. 01

    Claude Code 在 CI 里跑:从本机 claude -p 到 GitHub Actions 的完整例子(自动审 PR、控成本)

    一条线走完 Claude Code 的 CI 用法:先在本机用 claude --bare -p 配 --json-schema 跑通,再写进 GitHub Actions 用 claude-code-action@v1 自动审 PR,最后加上 --max-turns、超时、并发限制来控成本,并附上常见故障的排查顺序。

    Claude0
  2. 02

    Claude Code 的 CLAUDE.md 模板:前端、后端、数据分析各一份,附拆分与自检方法

    直接拿去改的三份 CLAUDE.md 模板(前端、后端、数据分析),每份都控制在官方建议的 200 行以内;再讲怎么用 .claude/rules 的 paths 拆出专属规则、用 @ 导入长文档,以及用 /context all 和 /doctor prompt-audit 检查是否生效。

    Claude0
  3. 03

    Claude Code 自己写一个插件并发布到 marketplace:plugin.json、marketplace.json、validate 到团队安装的完整流程

    想把自己写的 Skill、Hook 打包给团队用?按 Claude Code 官方 Plugins 文档,从目录结构、plugin.json、claude plugin validate,到写 marketplace.json、推到 Git、让同事一条命令安装,再到版本更新,走完一遍完整流程。

    Claude0
  4. 04

    Claude Code 写一个会自动触发的 Skill:从需求到触发,用 description、when_to_use 和 paths 控制它什么时候出场

    写好的 Skill 总是不触发,或者什么都触发?本文按 Claude Code 官方「Extend Claude with skills」走一遍完整实例:把「改数据库迁移前先检查」写成一个会自动出场的 Skill,包含 description、when_to_use、paths、附带脚本、触发测试和评估。

    Claude0
  5. 05

    Claude Code 配 Sentry MCP 排查线上报错:添加命令、浏览器授权、贴 issue 链接修 bug 和插件子智能体

    线上报错只能手动复制堆栈给 Claude Code?Sentry 官方提供 MCP 服务,可以让它直接读 issue、堆栈和 trace。本文按 Claude Code 官方 MCP 文档和 Sentry MCP 官方说明,讲添加命令、/mcp 授权、典型排查流程、插件方式和自托管注意事项。

    Claude0
  6. 06

    Claude Code 配 Context7 MCP 查最新文档:两种安装方式、use context7 怎么写、指定库和版本

    Claude Code 写出来的代码用了旧版 API?Context7 是一个把库的最新文档喂给编程助手的 MCP 服务。本文按 Context7 官方仓库和文档,讲两种安装方式、在 Claude Code 里的添加命令、use context7 与 library ID 的写法,以及使用时的注意事项。

    Claude0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~