本节看 Claude Code 这一侧:为什么需要 slash command 和 subagent 两级,而不是一个命令文件直接把所有事情做完。

Claude 入口层负责什么?

Claude 入口层只负责三件事:

  1. 接收 /codex:rescue 用户命令。
  2. 把原始请求交给指定 subagent。
  3. 避免在命令文件里塞复杂逻辑。
    用图表示:
sequenceDiagram
  participant U as User
  participant Cmd as commands/rescue.md
  participant Agent as codex:codex-rescue
  participant Bash as Bash Tool
  U->>Cmd: /codex:rescue fix failing tests
  Cmd->>Agent: Agent tool 调用 subagent_type
  Agent->>Bash: node codex-companion.mjs task ...

为什么要多一个 subagent?

因为 Claude Code 的 slash command 更适合作为入口声明,不适合作为复杂任务控制器。多一层 subagent 有几个好处:

  • 可以把命令入口和执行策略分开。
  • 可以限制 subagent 的行为,让它只做转发。
  • 可以复用 Claude Code 的 Agent tool 管理机制。
  • 可以避免命令文件递归调用自己。

subagent 为什么要“薄”?

如果 subagent 自己开始分析代码、调用工具、修改文件,它就会和 Codex runtime 抢职责。codex-plugin-cc 的设计目标是让 Codex 干活,所以 subagent 应该非常薄:

flowchart LR
  A[收到用户任务] --> B[保留原始 intent]
  B --> C[拼接 flags]
  C --> D[调用 Node companion]
  D --> E[等待或返回 jobId]

这里的设计原则是:转发层不要解释太多,否则原始任务会在 Claude 层被二次加工,Codex 收到的任务就不再纯净。

为什么避免调用 Skill?

这类插件命令通常会强调不要调用同名 Skill,因为 slash command 如果再触发同名 Skill,很容易形成循环:

flowchart TD
  A["/codex:rescue"] --> B{错误地调用 Skill(codex:rescue)?}
  B -->|是| A
  B -->|否| C[调用 codex:codex-rescue subagent]

所以它选择 Agent tool + subagent,而不是 Skill。

对你有什么启发?

如果你以后设计类似桥接插件,可以把入口层写得非常克制:

  • command 文件只做路由和说明
  • agent 文件只做受控转发
  • 复杂逻辑放到脚本里。
  • 脚本再去接真正的 runtime 或服务。

相关笔记