跳到正文
claudemods

Mission Control:实时查看 Claude Code 子代理和工具调用

在一个实时面板中查看 Claude Code 的主代理、子代理和每一次工具调用,并附带它们涉及文件的代码地图。

权限

  • 读取文件可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
  • 写入文件可以在你的电脑上创建或覆盖文件($.fs.write)。
  • 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
  • 调用模型(消耗你的额度)可以自行向 Claude 发送请求,这些请求计入你套餐的用量($.model.* / $.agent.spawn)。
  • 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
  • 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
  • 添加命令/工具注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
实测版本
v2.1.296
最近实测
需要
Claude Code ≥ 2.1.287
显示位置
面板、输入框上方

在 Claude Code 中安装:

/plugin install mission-control --marketplace hamzafer/claude-code-mods
全部安装方式 ↓

这个插件能做什么?

Mission Control 是一款实时显示 Claude Code 子代理和工具调用的社区插件,作者是 Hamza Zafar(hamzafer),属于他的 claude-code-mods 合集。它把 Claude Code 正在做的事集中到一处:主代理、它的子代理,以及它们发起的每一次工具调用。运行 /mission,聊天旁边就会打开一个显示树结构的面板。主循环在最上方,每个 Claude Code 子代理挂在它下面,工具调用则位于发起它们的代理之下。连续的同一工具调用会折叠成一行,例如 read: README.md → src/login.js ×2,每一行都会显示耗时。

在 Claude 工作期间以及之后的 30 秒内,输入框上方会有一行文字做出汇总:◈ mission: 2 tools,如果有代理或改动过的文件,也会显示它们的数量。第二个视图 /mission code 会绘制一张 Claude 读取或编辑过的文件地图,用箭头表示它们之间的相对导入,正在被处理的文件会发光,每处改动都附有一行说明。作者的 README 要求该合集使用 Claude Code 2.1.287 或更高版本;我们在 2.1.296 上做了测试。

演示

录屏中,我们在小型演示项目里启动加载了该插件的 Claude Code,并让 Claude 读取 README.md 和 src/login.js,用一句话说明它们的作用。Claude 读取这两个文件,工作期间输入框上方的状态行会统计工具调用次数。回答结束后,录屏输入 /mission。面板在输入框上方打开,带有 Who、Code 和 Close 按钮,显示汇总 0 agents (0 running) · 2 tool calls、带有提示词文本的绿色主线,以及其下折叠后的 read: demo-app/README.md → src/login.js ×2 一行。录屏中没有展示代码地图。

安装

使用安装区块中的任意一种方式;它们都直接从作者自己的插件市场安装。然后在会话中运行 /mission。如果是安装到已经打开的会话中,请先运行 /reload-plugins。

$ install mission-control

需要 Claude Code ≥ 2.1.287

从作者自己的 marketplace 安装: hamzafer/claude-code-mods

  1. 1.在 Claude Code 中一行安装

    /plugin install mission-control --marketplace hamzafer/claude-code-mods

    粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。

  2. 2.从终端安装

    claude plugin marketplace add hamzafer/claude-code-mods
    claude plugin install mission-control@claude-code-mods

    然后在所有已打开的会话中运行 /reload-plugins。

  3. 3.免安装试用

    git clone https://github.com/hamzafer/claude-code-mods
    claude --plugin-dir ./claude-code-mods/mods/mission-control

    仅在当前会话中加载该插件,不会写入你的设置。

工作原理

插件把树、文件列表和当前视图保存在由宿主持有的 $.state 原子中,因此热重载后画面依然保留。每一次工具调用都被包裹在一个 tool.call 钩子中:先添加一个节点,让调用运行,然后把它标记为完成或失败。以下代码来自 hooks/register.tsx:

let failed = true
let r: Awaited<ReturnType<typeof next>>
try {
  r = await next(e)
  failed = r.deny !== undefined || r.isError === true
} finally {
  await update($, nodes, list => list.map(n => (n.id === id ? { ...n, status: failed ? 'failed' : 'done', end: Date.now() } : n)))
}

agent.spawn 会添加子代理,turn.start 会重置树,turn.complete 会关闭仍标记为运行中的节点。对 Agent 的调用以及 Claude Code 自身的记录类工具(ToolSearch、TaskCreate 等)不会出现在树中。一个每秒触发的时钟只在有任务运行时更新显示;树最多保留 300 个节点。对于代码地图,hooks/map.ts 会构建一个 SVG:它通过 $.fs.read 读取每个被涉及的源文件,用正则表达式找出相对导入,并按导入深度把文件分列排布。SVG 由无头 Chrome 转换为 PNG,再通过面板的 Image 元素显示出来。

自定义

/config 中没有任何选项。唯一的控制方式是 /mission、/mission who 和 /mission code,以及面板按钮 w、c 和 q。若要改变行为,请编辑 register.tsx 顶部的常量:MAX_NODES(树的大小)、MAX_FILES(地图上的文件数)、BAND_AFTER_MS(状态行保留多久)、INTERNAL(不进入树的工具)以及 CODE_FILE(会出现在地图上的文件类型)。

权限与安全

在运行之前,我们读过了插件可以执行的每一个文件:.claude-plugin/plugin.json、hooks/hooks.json、hooks/register.tsx、hooks/map.ts、hooks/tree.ts、类型声明以及测试。没有 package.json、安装脚本、二进制文件或打包后的代码,我们也没有发现隐藏的 Unicode 字符、eval 或远程代码。

  • 网络: 自身不使用网络。没有 fetch、套接字或主机。
  • 模型调用: 在主代理的某一轮编辑或写入文件之后,register.tsx 中的 explain() 会以 model: 'haiku' 调用 $.model.complete。提示词包含每个 old_string 和 new_string 最多 300 个字符(写入的文件最多 400 个字符),回复会成为地图上最多 80 个字符的说明。回复先按 JSON 解析、截断并转义,然后才进入 SVG。它使用你会话的额度。
  • 进程: 通过 $.process.run 运行一个 sh -c 脚本,用一次性的配置文件启动无头 Chrome,等待截图完成,然后结束这个 Chrome。文件名和文件夹名作为参数传入,而不是拼接进 shell 字符串。只有当面板打开在代码视图时才会启动 Chrome。
  • 文件写入: 仅限 $TMPDIR/mission-control/:map.svg、两个 map-N.png 文件以及一个 Chrome 配置文件夹。不会写入 ~/.claude、设置、shell 配置文件或 LaunchAgents。插件会读取 Claude 涉及的文件以查找导入,并把编辑片段保存在内存中。
  • 守护进程: 没有。每秒触发的时钟随会话结束而停止,Chrome 在每次截图后都会被结束。
  • 密钥与环境变量: 只读取 TMPDIR。
  • 遥测: 没有。
  • 对提示词的影响: 它不添加任何 additionalContext,也不改写提示词或工具结果。
  • 拦截型钩子: tool.call 和 agent.spawn 被包裹,claude plugin validate 把它们列为没有 .catch 的拦截型钩子。它们只做观察;tool.call 原样返回工具结果,也不修改参数。
  • 外部依赖: 代码地图需要位于 /Applications/Google Chrome.app 的 Google Chrome(macOS 路径);Who 视图不需要。
  • 许可证: MIT,附带 LICENSE 文件。

claude plugin validate 没有报告任何错误或警告,作者的 7 个测试在 Claude Code 2.1.296 上全部通过。

读取文件
可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
写入文件
可以在你的电脑上创建或覆盖文件($.fs.write)。
执行命令
可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
调用模型(消耗你的额度)
可以自行向 Claude 发送请求,这些请求计入你套餐的用量($.model.* / $.agent.spawn)。
拦截工具调用
能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
修改界面
在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
添加命令/工具
注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。

兼容性与故障排除

已在 macOS 上使用 Claude Code 2.1.296 检查(validate、测试和录屏)。如果出现问题:

  • /mission 是未知命令。 在 /plugin 中确认插件已加载,全新安装后运行 /reload-plugins。
  • 代码地图提示需要 Google Chrome。 把 Chrome 安装到 /Applications/Google Chrome.app。插件只会查找这个路径。
  • 显示 "Nothing yet"。 树会在一轮对话运行时逐步填充。开始一个任务,各行就会出现。
  • 在终端之外没有地图。 在其他界面中,面板会提示代码地图只在终端中绘制。
  • 状态行没有出现。 它只在 Claude 工作期间及之后的 30 秒内显示,问卷打开时也不会显示。

常见问题

Mission Control 会修改或拦截我的工具调用吗?
不会。它的 tool.call 钩子只记录这次调用,用 next(e) 让它照常运行,并原样返回结果。除了记录所需的开销之外,它从不拒绝、改写或延迟任何调用。
它会调用模型或访问网络吗?
它自身不发出任何网络请求。在某一轮编辑过文件之后,它会请 Claude Code 运行一次小型 haiku 补全,为每个改动过的文件写一行说明。提示词中包含每处编辑最多几百个字符,因此这些文本会发送给你已经在使用的模型提供商。
我需要安装 Google Chrome 吗?
只有代码地图需要。Who 树不需要任何额外依赖。代码地图通过位于 /Applications/Google Chrome.app 的无头 Chrome 渲染 SVG,如果找不到 Chrome,会显示一条提示。
怎样打开和关闭它?
运行 /mission,或运行 /mission code 打开代码地图。在面板内,w 显示树,c 显示代码地图,q 关闭面板。
它和 Agent Radar 有什么区别?
Agent Radar 是另一款用于观察代理的社区插件。Mission Control 还会把每一次工具调用列在发起它的代理下面,把连续的同一工具调用折叠起来,并绘制一张被涉及文件及其相互导入关系的地图。
Agent Radar 在 Claude Code 中运行精选

Agent Radar

在提示词上方为每个运行中的子代理显示一行实时状态:用时、工具数和当前动作,另有 /radar 面板。

  • 输入框上方
  • 面板
  • 弹出通知
  • 拦截工具调用
  • 读取你的提示词
  • 修改界面
  • 添加命令/工具

已在 v2.1.291 实测

工具调用计数器 在 Claude Code 中运行精选

工具调用计数器

统计 Claude 每轮和每个会话的工具调用次数,在加载指示器旁显示计数,并新增 /tally 查看明细。

  • 加载动画
  • 对话记录
  • 状态栏
  • 拦截工具调用
  • 修改界面
  • 添加命令/工具

已在 v2.1.310 实测

更多 面板与仪表盘、计时、待办与站会。