AI 应用Agent 工作流开发工具MCP 服务【免费下载链接】cc-wf-studioCC Workflow Studio项目地址https://gitcode.com/gh_mirrors/cc/cc-wf-studio点击查看免费下载本篇技术指南以 ai-generation-messages.md 为核心文档系统讲解 CC Workflow StudioClaude Code Workflow StudioVSCode 扩展中「AI 辅助工作流生成」功能在 Extension HostNode.js 进程与 Webview浏览器内核之间的 postMessage 通信协议。读者将掌握GENERATE_WORKFLOW/GENERATION_SUCCESS/GENERATION_FAILED/GENERATION_PROGRESS四类消息的载荷结构、校验规则、错误码语义、requestId关联机制以及从自然语言描述到画布渲染的完整调用链并可直接对照本仓库源码验证契约的落地方式。一、契约定位AI 工作流生成的消息传递接口该契约归属于特性 001-ai-workflow-generation2025-11-06其核心使命是用户以自然语言描述工作流意图由本地 Claude Code CLI 一次性生成完整的工作流 JSON并自动落盘到画布。契约文档明确规定协议载体为VSCode Webview postMessage API所有消息均遵循 src/shared/types/messages.ts 中已确立的统一模式。从源码看统一消息基座定义如下messages.tsexport interface MessageT unknown, K extends string string { type: K; payload?: T; requestId?: string; }即每条消息都由type消息类型、payload类型化载荷、requestId请求-响应关联键三要素构成。AI 工作流生成的四种消息类型全部构建在这一基座之上并通过WebviewMessage与ExtensionMessage两个联合类型实现双向类型安全。二、四种消息类型全解2.1GENERATE_WORKFLOWWebview → Extension发起生成请求用途Webview 请求扩展宿主基于用户的自然语言描述生成工作流。载荷GenerateWorkflowPayloadinterface GenerateWorkflowPayload { userDescription: string; // 最大 2000 字符 timeoutMs?: number; // 可选默认 30000 }完整示例{ type: GENERATE_WORKFLOW, requestId: req-1730851200000-0.12345, payload: { userDescription: Create a code review workflow that scans code, asks user for priority level, and generates fix suggestions, timeoutMs: 30000 } }校验规则在发送前由 Webview 侧与扩展宿主侧双重把关userDescription必须为非空字符串userDescription.length必须 ≤ 2000timeoutMs若提供必须介于 1000 与 60000 之间。错误响应校验失败时返回VALIDATION_ERROR例如描述超长。2.2GENERATION_SUCCESSExtension → Webview返回生成结果用途扩展宿主向 Webview 返回成功生成的工作流。载荷GenerationSuccessPayloadinterface GenerationSuccessPayload { workflow: Workflow; // 符合 Workflow 接口的生成结果 executionTimeMs: number; // CLI 执行耗时 timestamp: string; // ISO 8601 时间戳 }完整示例{ type: GENERATION_SUCCESS, requestId: req-1730851200000-0.12345, payload: { workflow: { id: generated-1730851230000, name: Code Review Workflow, nodes: [ { id: start-1, type: start, position: { x: 100, y: 200 }, data: { label: Start } }, { id: scanner-1, type: subAgent, name: code-scanner, position: { x: 300, y: 200 }, data: { description: Scan code, prompt: ... } }, // ... 更多节点 ], connections: [ { id: c1, from: start-1, to: scanner-1, fromPort: output, toPort: input }, // ... 更多连线 ], version: 1.0.0, createdAt: 2025-11-06T10:00:30Z, updatedAt: 2025-11-06T10:00:30Z }, executionTimeMs: 15432, timestamp: 2025-11-06T10:00:30Z } }契约保证扩展宿主在发送前必须验证workflow是可通过全部校验规则的合法Workflow对象workflow.nodes.length≤ 50所有连接合法无环、源/目标有效工作流必须至少包含一个 Start 节点和一个 End 节点。补充说明契约文档将 AI 生成的节点上限设定为 50。从当前仓库源码看workflow-definition.ts 中VALIDATION_RULES.WORKFLOW.MAX_NODES已演进为100集成时节点数上限应以实际运行代码为准并在构造 AI 提示词时与之保持一致。2.3GENERATION_FAILEDExtension → Webview报告失败详情用途扩展宿主以结构化错误信息报告 AI 生成失败。载荷GenerationFailedPayloadinterface GenerationFailedPayload { error: { code: COMMAND_NOT_FOUND | TIMEOUT | PARSE_ERROR | VALIDATION_ERROR | UNKNOWN_ERROR; message: string; // 面向用户的友好错误信息 details?: string; // 调试用技术细节可选 }; executionTimeMs: number; // 出错前已耗时长 timestamp: string; // ISO 8601 时间戳 }错误码语义表Code含义用户消息示例COMMAND_NOT_FOUNDClaude Code CLI 未安装或不在 PATH 中Cannot connect to Claude Code - please ensure it is installed and runningTIMEOUTCLI 执行超过超时上限默认 30sAI generation timed out after 30 seconds. Try simplifying your description.PARSE_ERRORCLI 输出不是合法 JSONGeneration failed - please try again or rephrase your descriptionVALIDATION_ERROR生成的工作流未通过校验如节点 50、连接非法Generated workflow exceeds maximum node limit (50). Please simplify your description.UNKNOWN_ERROR执行过程中的意外错误An unexpected error occurred. Please try again.完整示例{ type: GENERATION_FAILED, requestId: req-1730851200000-0.12345, payload: { error: { code: COMMAND_NOT_FOUND, message: Cannot connect to Claude Code - please ensure it is installed and running, details: spawn claude ENOENT }, executionTimeMs: 125, timestamp: 2025-11-06T10:00:00Z } }错误码的映射逻辑在源码 claude-code-service.ts 中有精确落地ENOENT错误映射为COMMAND_NOT_FOUNDnpx兜底失败stderr 含 could not determine executable to run同样映射为COMMAND_NOT_FOUND超时通过isTerminated signalName SIGTERM或exitCode 143判定并映射为TIMEOUT其余非零退出码与未知异常统一映射为UNKNOWN_ERROR。2.4GENERATION_PROGRESSExtension → Webview预留进度上报用途在长时 AI 生成过程中上报进度未来增强。状态MVP 未实现仅作协议预留。interface GenerationProgressPayload { stage: validating | executing | parsing | validating_output; message: string; percentComplete?: number; }注意契约明确该消息类型为未来增强预留MVP 版本仅使用简单加载指示器不包含分阶段进度。四个stage值恰好对应生成流水线的四个阶段参数校验validating、CLI 执行executing、输出解析parsing、结果复验validating_output。三、端到端消息流从描述输入到画布渲染契约文档给出了完整的双向消息流图这是理解整个功能的关键脉络[User] enters description in AiGenerationDialog ↓ [AiGenerationDialog.tsx] calls aiGenerationService.generateWorkflow(description) ↓ [ai-generation-service.ts] postMessage(GENERATE_WORKFLOW) ↓ [Extension Host] receives message in ai-generation.ts ↓ [claude-code-service.ts] executes CLI: spawn(claude, [-p, prompt]) ↓ ┌─ SUCCESS: CLI returns valid JSON ────────────────┐ │ │ │ [claude-code-service.ts] parses output │ │ ↓ │ │ [validate-workflow.ts] validates workflow │ │ ↓ │ │ postMessage(GENERATION_SUCCESS) │ │ ↓ │ │ [AiGenerationDialog.tsx] receives success │ │ ↓ │ │ [workflow-store.ts] adds workflow to canvas │ │ ↓ │ │ Dialog closes, success notification shown │ │ │ └───────────────────────────────────────────────────┘ ┌─ FAILURE: CLI error or timeout ───────────────────┐ │ │ │ [claude-code-service.ts] catches error │ │ ↓ │ │ Maps error to error code user message │ │ ↓ │ │ postMessage(GENERATION_FAILED) │ │ ↓ │ │ [AiGenerationDialog.tsx] receives failure │ │ ↓ │ │ [ErrorNotification.tsx] displays error │ │ ↓ │ │ User can retry with modified description │ │ │ └───────────────────────────────────────────────────┘3.1 CLI 执行层spawn 与输出解析契约与 research.md 一致CLI 执行选用child_process.spawn()而非exec()理由是可流式输出并精细控制进程生命周期。当前实现演进为基于nano-spawn跨平台兼容见 claude-code-service.ts通过claude -p - --model sonnet参数构建命令提示词经 stdin 传入规避 Windows 命令行长度限制并支持--tools/--allowed-tools白名单约束。3.2 输出解析层四策略容错AI 输出未必是纯净 JSON因此契约要求「先解析再信任」。源码 parseClaudeCodeOutput 实现了四层解析策略Markdown 包裹输出以json开头并以结尾时剥除外层标记后解析裸 JSON以{开头时直接JSON.parse多 JSON 块提取用正则/\json\s*([\s\S]*?)/g提取全部代码块优先选择含status 字段的结构化响应从末尾向前扫描否则回退到最后一个代码块整体兜底直接对原文JSON.parse。任一策略失败即返回null上游据此上报PARSE_ERROR。这一设计有效覆盖了「AI 在 JSON 外附带解释性文字」「一次返回多个代码块」等真实场景。3.3 校验层复用既有验证规则生成结果在上报GENERATION_SUCCESS之前必须通过校验。契约要求复用 validate-workflow.ts 中的既有逻辑VALIDATION_RULES并叠加 AI 专属检查节点数上限、连接合法性无环、源/目标有效、每个节点类型的必填字段齐全。校验失败返回VALIDATION_ERROR对应消息文案 Generated workflow exceeds maximum node limit (50). Please simplify your description.。从源码可确认validateWorkflow 在节点数超限时返回MAX_NODES_EXCEEDED错误码与契约的错误语义一一对应。四、requestId 请求-响应关联机制由于 postMessage 是异步的、双向并发的通道契约要求所有消息用requestId做关联Webview 在发送GENERATE_WORKFLOW时生成唯一requestId扩展宿主在响应GENERATION_SUCCESS或GENERATION_FAILED中携带相同的requestIdWebview 依据requestId将响应匹配到原始请求。请求 ID 格式req-${timestamp}-${random}示例req-1730851200000-0.12345时间戳部分Date.now()随机部分Math.random()该模式在当前仓库的 ai-generation-service.ts 中已有同构实现用于GENERATE_WORKFLOW_NAME注册一次性message事件监听器命中requestId即移除监听并resolve/reject同时在客户端设置timeoutMs 5000的兜底超时。超时处理Webview 侧设置本地超时默认 35 秒比扩展宿主侧超时多 5 秒缓冲若在超时窗口内未收到任何响应显示通用错误消息由于扩展宿主总是发送响应成功或失败本地超时在正常情况下极少触发。五、TypeScript 类型定义落地契约要求新增的类型统一加入src/shared/types/messages.ts并扩展WebviewMessage/ExtensionMessage联合类型// Payloads export interface GenerateWorkflowPayload { userDescription: string; timeoutMs?: number; } export interface GenerationSuccessPayload { workflow: Workflow; executionTimeMs: number; timestamp: string; } export interface GenerationFailedPayload { error: { code: COMMAND_NOT_FOUND | TIMEOUT | PARSE_ERROR | VALIDATION_ERROR | UNKNOWN_ERROR; message: string; details?: string; }; executionTimeMs: number; timestamp: string; } // Message types export type WebviewMessage | MessageGenerateWorkflowPayload, GENERATE_WORKFLOW | // ... 既有消息类型 ; export type ExtensionMessage | MessageGenerationSuccessPayload, GENERATION_SUCCESS | MessageGenerationFailedPayload, GENERATION_FAILED | // ... 既有消息类型 ;从 messages.ts 源码可以看到当前仓库的WebviewMessage联合类型已积累了数十种消息如SAVE_WORKFLOW、REFINE_WORKFLOW、GENERATE_WORKFLOW_NAME等且每种消息都挂载了对应的 Payload 接口——这正是契约「新增消息类型、不改动既有类型」演进策略的直接证据联合类型采用增量追加天然保证向后兼容。消息分发侧open-editor.ts也遵循统一的switch (message.type)if (message.payload)守卫模式非法载荷统一回ERRORVALIDATION_ERROR消息。六、错误处理策略Webview 侧输入校验发送请求前先校验描述长度≤ 2000 字符超长即时拦截超时兜底设置本地超时以捕获无响应的扩展宿主错误展示复用既有ErrorNotification组件展示针对性的错误消息重试允许用户不关闭对话框直接修改描述并重试输入内容不丢失。Extension 侧预检Pre-flight Checks执行 CLI 前先校验请求载荷合法性CLI 错误映射将全部 CLI 错误映射为已定义的错误码结果复验发送成功响应前校验生成的工作流日志记录所有错误写入 VSCode Output 频道便于调试。从源码实现看扩展侧对「预检失败」的统一回应模式是回发type: ERROR、code: VALIDATION_ERROR的消息见 open-editor.ts而 CLI 执行层的完整错误分类已在 claude-code-service.ts 的ClaudeCodeExecutionResult.error.code联合类型中固化为COMMAND_NOT_FOUND | MODEL_NOT_SUPPORTED | COPILOT_NOT_AVAILABLE | TIMEOUT | PARSE_ERROR | UNKNOWN_ERROR。七、测试策略契约测试Contract TestsWebview 发送合法GENERATE_WORKFLOW校验载荷结构符合GenerateWorkflowPayloadrequestId唯一且格式良好Extension 响应合法GENERATION_SUCCESS校验载荷结构符合GenerationSuccessPayload工作流通过验证requestId与原始请求一致Extension 响应合法GENERATION_FAILED校验载荷结构符合GenerationFailedPayload错误码必须是已定义五码之一错误消息对用户友好。集成测试Integration Tests往返测试发送GENERATE_WORKFLOW→ 接收GENERATION_SUCCESS→ 验证工作流出现在画布上错误场景矩阵CLI 未安装 →COMMAND_NOT_FOUNDCLI 超时 →TIMEOUT非法 JSON →PARSE_ERROR工作流节点 50 →VALIDATION_ERROR。这一测试矩阵与 quickstart.md 中给出的测试骨架claude-code-service.test.ts、validate-workflow.test.ts、ai-generation-service.test.ts一一对应可据此编写 Vitest 单元测试与vscode/test-electron集成测试。八、兼容性、安全与性能设计向后兼容四个新消息类型GENERATE_WORKFLOW、GENERATION_SUCCESS、GENERATION_FAILED、GENERATION_PROGRESS均为增量追加不修改任何既有消息类型无消息结构破坏性变更扩展宿主对未知消息类型予以忽略优雅降级。安全考量输入净化用户描述传给本地 CLI 执行无 XSS 风险命令注入防护使用spawn()的数组参数形式而非 shell 字符串拼接从机制上阻止注入——源码中args [-p, -, --model, modelName]正是这一原则的体现输出验证解析与校验 CLI 输出后才信任数据超时保护30 秒超时防止无限等待。性能考量非阻塞 UI扩展宿主异步执行 CLIWebview 保持响应单请求串行同一时刻只允许一个 AI 生成请求对话框模态强制串行化Schema 缓存工作流 Schema 只加载一次全部请求复用超时可控30 秒超时限制最长等待用户可随时重试。九、未来增强方向MVP 之外契约明确列出的演进路线进度上报实现GENERATION_PROGRESS消息支撑长时请求的进度展示取消能力允许用户取消进行中的生成历史记录保存历史生成请求以便复用/重试批量生成支持并行生成多个工作流流式输出在 Claude Code CLI 支持的前提下流式推送部分工作流更新。值得注意的是取消能力与流式输出的雏形在现行源码中已部分出现claude-code-service.ts提供了 cancelGeneration通过activeProcessesMap 追踪进程并按requestId终止以及基于--output-format stream-json的流式执行与onProgress回调executeClaudeCodeCLIStreaming可为后续实现GENERATION_PROGRESS与取消语义提供直接复用基础。十、与当前仓库实现的对照观察综合契约文档与源码结构可以得出以下对照结论统一消息模式已确立messages.ts 的MessageT, K基座与联合类型扩展方式与契约的演进策略完全一致错误映射已工程化契约定义的五个错误码在 claude-code-service.ts 中有完整、可测试的落地含ENOENT、SIGTERM/exit code 143、npx 兜底等边界分支requestId 关联模式有同构参照ai-generation-service.ts 中generateWorkflowName的「一次性监听器 客户端超时 Promise 化」正是契约中generateWorkflow的既有范式UI 组件就绪AiGenerateButton.tsx 已实现 Sparkles 常态图标、生成中 Loader2 X 取消按钮的双态交互与契约要求的「加载指示器 可取消」一致节点上限存在演进契约早期设定 50 节点上限当前 workflow-definition.ts 中MAX_NODES为 100提示词构造与校验逻辑需与运行时规则保持同步此点亦被 spec.md 的 SC-006「Schema 文档与实际 Schema 零偏差」列为成功标准。若需深入可继续阅读同目录下的 spec.md需求与验收标准、data-model.mdWorkflowSchemaDocumentation/AiGenerationRequest/AiGenerationResponse实体建模、research.md技术选型决策以及 quickstart.md按 Phase 0–7 的落地路径与调试技巧。赞分享AI 应用Agent 工作流开发工具MCP 服务【免费下载链接】cc-wf-studioCC Workflow Studio项目地址https://gitcode.com/gh_mirrors/cc/cc-wf-studio点击查看免费下载相关推荐CC Workflow Studio 工作流引导导览Workflow Tour的 AI 生成机制与实战指南CC Workflow Studio 工作流引导导览Workflow Tour的 AI 生成机制与实战指南 CC Workflow Studio 为画布上的AI 应用Agent 工作流开发工具MCP 服务如何每天 20 分钟答完 31 道前端面试题把前端面试每日 31 题库fe-interview用起来如何每天 20 分钟答完 31 道前端面试题把前端面试每日 31 题库fe interview用起来 fe interview 是一个前端题库开源项目前端知识库教程highlight.io 服务端集成指南在 Ruby 与 Ruby on Rails 中接入错误监控、日志与分布式追踪highlight.io 服务端集成指南在 Ruby 与 Ruby on Rails 中接入错误监控、日志与分布式追踪 导读 本文面向 Ruby 后端开发者AI 应用Agent 工作流开发工具MCP 服务上一篇3分钟快速上手跨平台资源下载神器res-downloader终极指南下一篇Node.js CORS中间件10个常见问题与解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?