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 - 职责:
- 处理用户交互:首先询问用户偏好的温度单位(摄氏度或华氏度)。
- 调度子代理:将获取到的单位作为上下文,调用 Agent 组件来执行数据获取。
- 调用独立技能:待 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" - 职责:
- 调用预加载技能:通过
Skill工具显式调用其预加载的weather-fetcher技能来执行实际的网络请求。 - 返回结构化数据:将从技能获取的温度值和单位返回给调用它的 Command。
- 调用预加载技能:通过
- 关键约束:同样,该 Agent 的工具列表中刻意排除了
WebFetch、WebSearch等网络工具,强制其必须通过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
- API:
- 调用方式:由
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工具调用。
- 文件路径:
执行流程与数据传递
一次完整的编排执行遵循以下严格顺序:
- 用户发起:用户在 Claude Code 中执行
/weather-orchestrator命令。 - 用户交互:Command 使用
AskUser工具询问温度单位,获得用户选择(如“摄氏度”)。 - Agent 数据获取:Command 通过
Agent工具调用weather-agent,并将单位偏好作为提示传递。 - 技能执行:
weather-agent启动,其上下文中已包含weather-fetcher技能的指令。它随后通过Skill工具调用weather-fetcher,后者执行 API 调用并返回结果(例如,26°C)。 - 数据返回:
weather-agent将解析后的温度值和单位(26,Celsius)返回给 Command。 - 生成输出:Command 拿到数据后,通过
Skill工具调用weather-svg-creator。该技能在当前对话上下文中即可获得温度数据,因此直接生成weather.svg和output.md两个文件。 - 结果呈现:Command 最终向用户展示一个摘要,包含请求的单位、获取到的温度、SVG 文件位置以及输出文件路径。
核心设计原则
该架构模式体现了几个关键的软件工程原则:
- 单一职责:Command 负责编排和交互;Agent 负责调用专业技能获取数据;Skill 负责特定的转换或输出任务(如 API 调用、文件生成)。
- 关注点分离:数据获取(由 Agent + 其预加载 Skill 完成)与数据展示(由独立 Skill 完成)被清晰地分开。
- 强制委托:通过工具列表限制和明确的“执行合同”,强制 Command 和 Agent 不去执行它们职责之外的核心操作(如直接网络请求),确保流程的可控性。
- 技能复用:
weather-fetcher这样的技能可以被不同的 Agent 预加载,甚至可能被其他工作流直接调用,实现了知识的复用。 - 失败处理:在每个关键步骤(如 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 的定义中可以看到 PreToolUse、PostToolUse 等 Hooks 配置。这些钩子允许你在 Agent 使用任何工具的前后插入自定义脚本(例如,进行日志记录、发送通知或执行预检查),为编排流程增加了可观察性和扩展点,而不破坏核心的工作流逻辑。