Command → Agent → Skill 是 Claude Code 处理复杂任务的结构化编排模式,它通过清晰的职责分层将工作流模块化:Command 作为入口负责交互与调度,Agent 加载专用技能(Skill)并执行数据获取,独立的 Skill 负责生成可视化输出。这种模式实现了关注点分离,提升了工作流的可维护性与复用性。

Claude Code 编排工作流实战:Command → Agent → Skill 架构模式详解

当使用 Claude Code 处理多步骤、跨工具的复杂任务时,将整个流程拆分为职责清晰的组件是管理复杂性的关键。Command → Agent → Skill 架构模式正是为此设计的编排方案。本文将通过一个完整的天气数据获取与可视化实例,详细拆解此架构的每个环节,包括组件定义、执行流程与核心设计原则。

架构概览:三层组件与职责

这个编排模式由三个核心组件构成,它们协同工作,将用户请求转化为结构化的输出。下图展示了其完整的执行流程与数据流:

╔══════════════════════════════════════════════════════════════════╗
║              ORCHESTRATION WORKFLOW                              ║
║           Command  →  Agent  →  Skill                            ║
╚══════════════════════════════════════════════════════════════════╝

                         ┌───────────────────┐
                         │  User Interaction │
                         └─────────┬─────────┘


         ┌─────────────────────────────────────────────────────┐
         │  /weather-orchestrator — Command (Entry Point)      │
         └─────────────────────────┬───────────────────────────┘

                              Step 1


                      ┌────────────────────────┐
                      │  AskUser — C° or F°?   │
                      └────────────┬───────────┘

                         Step 2 — Agent tool


         ┌─────────────────────────────────────────────────────┐
         │  weather-agent — Agent ● skill: weather-fetcher     │
         └─────────────────────────┬───────────────────────────┘

                          Returns: temp + unit

                         Step 3 — Skill tool


         ┌─────────────────────────────────────────────────────┐
         │  weather-svg-creator — Skill ● SVG card + output    │
         └─────────────────────────┬───────────────────────────┘

                          ┌────────┴────────┐
                          │                 │
                          ▼                 ▼
                   ┌────────────┐    ┌────────────┐
                   │weather.svg │    │ output.md  │
                   └────────────┘    └────────────┘

下表概述了每个组件的定位与在本示例中的对应实现:

组件 角色 示例
Command 入口,处理用户交互 .claude/commands/weather-orchestrator.md
Agent 使用预加载的技能(Agent Skill)获取数据 .claude/agents/weather-agent.md 及其预加载的 weather-fetcher
Skill 独立执行并创建输出 .claude/skills/weather-svg-creator/SKILL.md

组件详解与文件定义

1. Command:工作流的入口与调度中心

Command 是整个编排的起点,它定义了工作流的初始步骤和用户交互。在本例中,它是一个斜杠命令。

  • 文件路径.claude/commands/weather-orchestrator.md
  • 职责
    1. 处理用户交互:首先询问用户偏好的温度单位(摄氏度或华氏度)。
    2. 调度子代理:将获取到的单位作为上下文,调用 Agent 组件来执行数据获取。
    3. 调用独立技能:待 Agent 返回数据后,调用 Skill 组件来生成最终的可视化输出。
  • 关键约束(执行合同):在其定义中,该 Command 严格禁止自身直接通过 WebFetch 等工具获取天气数据,必须将此任务委托给 weather-agent。它还设置了失败保护:如果 Agent 未能返回有效的温度和单位,则流程终止,不会调用后续的 Skill。

2. Agent:搭载专用技能的执行单元

Agent 是一个具备特定领域知识的子代理,它可以被预加载一个或多个技能(Agent Skill)。这些技能的内容会在 Agent 启动时注入其上下文,作为其知识库的一部分。

  • 文件路径.claude/agents/weather-agent.md
  • 核心配置
    name: weather-agent
    skills:
      - weather-fetcher  # 在启动时预加载为领域知识
    allowedTools:
      - "Read"
      - "Skill"
  • 职责
    1. 调用预加载技能:通过 Skill 工具显式调用其预加载的 weather-fetcher 技能来执行实际的网络请求。
    2. 返回结构化数据:将从技能获取的温度值和单位返回给调用它的 Command。
  • 关键约束:同样,该 Agent 的工具列表中刻意排除了 WebFetchWebSearch 等网络工具,强制其必须通过 Skill 工具来执行数据获取,确保了行为的可预测性。

3. Skill:可组合的功能模块

技能是独立、可复用的功能单元。它们可以被 Command 直接调用,也可以被 Agent 预加载。

  • 预加载技能 (Agent Skill)weather-fetcher

    • 文件路径.claude/skills/weather-fetcher/SKILL.md
    • 职责:提供从 Open-Meteo API 获取迪拜实时温度的详细指令。它定义了 API 的 URL、所需提取的字段以及输出格式。
    • 数据源细节
      • API: https://api.open-meteo.com/v1/forecast
      • 参数:latitude=25.2048, longitude=55.2708 (迪拜坐标)
      • 关键响应字段:current.temperature_2m, current_units.temperature_2m
    • 调用方式:由 weather-agent 通过 Skill 工具调用。
  • 独立技能weather-svg-creator

    • 文件路径.claude/skills/weather-svg-creator/SKILL.md
    • 职责:接收来自当前上下文的温度数据,创建一个 SVG 天气卡片,并编写一个 Markdown 摘要。
    • 输出文件
      • orchestration-workflow/weather.svg:生成的 SVG 可视化卡片。
      • orchestration-workflow/output.md:包含温度摘要的 Markdown 文件。
    • 调用方式:由 Command 直接通过 Skill 工具调用。

执行流程与数据传递

一次完整的编排执行遵循以下严格顺序:

  1. 用户发起:用户在 Claude Code 中执行 /weather-orchestrator 命令。
  2. 用户交互:Command 使用 AskUser 工具询问温度单位,获得用户选择(如“摄氏度”)。
  3. Agent 数据获取:Command 通过 Agent 工具调用 weather-agent,并将单位偏好作为提示传递。
  4. 技能执行weather-agent 启动,其上下文中已包含 weather-fetcher 技能的指令。它随后通过 Skill 工具调用 weather-fetcher,后者执行 API 调用并返回结果(例如,26°C)。
  5. 数据返回weather-agent 将解析后的温度值和单位(26, Celsius)返回给 Command。
  6. 生成输出:Command 拿到数据后,通过 Skill 工具调用 weather-svg-creator。该技能在当前对话上下文中即可获得温度数据,因此直接生成 weather.svgoutput.md 两个文件。
  7. 结果呈现:Command 最终向用户展示一个摘要,包含请求的单位、获取到的温度、SVG 文件位置以及输出文件路径。

核心设计原则

该架构模式体现了几个关键的软件工程原则:

  1. 单一职责:Command 负责编排和交互;Agent 负责调用专业技能获取数据;Skill 负责特定的转换或输出任务(如 API 调用、文件生成)。
  2. 关注点分离:数据获取(由 Agent + 其预加载 Skill 完成)与数据展示(由独立 Skill 完成)被清晰地分开。
  3. 强制委托:通过工具列表限制和明确的“执行合同”,强制 Command 和 Agent 不去执行它们职责之外的核心操作(如直接网络请求),确保流程的可控性。
  4. 技能复用weather-fetcher 这样的技能可以被不同的 Agent 预加载,甚至可能被其他工作流直接调用,实现了知识的复用。
  5. 失败处理:在每个关键步骤(如 Agent 调用、技能调用)都内置了失败保护机制,避免在缺少必要数据时继续执行后续步骤。

通过这种结构化的 Command → Agent → Skill 模式,你可以将复杂的、多步骤的任务拆解为易于理解、测试和维护的模块化组件,从而构建出健壮的 Claude Code 编排工作流。关于更多组件如 子代理(Subagents)技能(Skills) 的详细配置,可以参考相应的深度指南。

FAQ

Q: 这个架构和直接使用技能(Skill)有什么根本区别? A: 区别在于分工与上下文。直接使用技能时,技能在当前对话的上下文中执行。而在此架构中,Agent 作为一个拥有独立上下文(包含预加载技能知识)的专用执行单元存在。Command 通过调度 Agent 来隔离复杂任务,并利用独立的 Skill 来处理最终输出,实现了更清晰的工作流控制。

Q: 为什么 weather-agent 被禁止直接调用 API? A: 这是为了确保行为的确定性和可维护性。通过将 API 调用的详细指令封装在 weather-fetcher 技能中,并强制 Agent 通过 Skill 工具调用它,而不是自己内联执行指令,可以将“获取天气数据”这一知识固化在技能里。这样,如果未来 API 端点或逻辑需要变更,只需修改 weather-fetcher/SKILL.md 文件即可,无需改动 Agent 的定义。

Q: Hook 在编排工作流中扮演什么角色? A: 在 weather-agent 的定义中可以看到 PreToolUsePostToolUseHooks 配置。这些钩子允许你在 Agent 使用任何工具的前后插入自定义脚本(例如,进行日志记录、发送通知或执行预检查),为编排流程增加了可观察性和扩展点,而不破坏核心的工作流逻辑。