关于 creating-flow
creating-flow 是用于构建 Robomotion RPA 流程的文档索引技能,覆盖 TypeScript SDK 和可视化编辑器。它帮助 Agent 遵守流程声明、验证、节点连线与布局约束,使生成的文件可由 Designer 读取。
主要功能
- 01Robomotion SDK 流程语法
- 02节点 ID 验证规则
- 03节点连线与作用域指引
- 04Designer 可读文件约束
- 05流程布局和分支模式
- 06验证错误的文档索引
适用场景
- 01创建通过 SDK 验证的流程
- 02组织分支和长距离连线
- 03保持流程文件可由 Designer 读取
- 04根据验证错误定位参考文档
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ robomotionio/ agent-skills --skill creating-flow安装后在 Claude Code 中输入/creating-flow确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
config.jsondocs/architecture.mdsdk-grammar.mdworkflow.mddocs/patterns/assistant-migration.mdbranches.mdbrowser.mdcaptcha.mdcomments-and-layout.mdconditions.mdconversational-chat.mdcredentials.mddata-tables.mdexceptions.mdguided-chat.mdimage.mdjava.mdloops.mdsubflows.mdwindows.mddocs/reference/credential-categories.mdfunction-nodes.mdid-format.mdimports.mdnode-naming.mdproject-format.mdsystem-variables.mdevals/.gitignoreevals.jsonevals/fixtures/01-error-handling.ts详细介绍
原文在翻译后有更新,译文可能不是最新。
Robomotion Flow Builder
Robomotion 是一个 RPA 平台,提供 TypeScript SDK 和可视化节点编辑器。本技能是 ./docs/ 中参考文档的简要索引。遇到相关主题时,请阅读对应文档——不要试图从本文件中记住所有内容。
硬性规则(SDK 会在验证时拒绝违规内容)
SDK 会强制执行以下规则。违反规则时,robomotion validate / build 会抛出详细错误消息,因此 Agent 不会悄悄生成有问题的工作流:
- 节点 ID 必须是 6 位小写十六进制数——
/^[0-9a-f]{6}$/。f.node()、.then()、f.edge()会在注册时拒绝非十六进制 ID(如'begin'、'label'、'maps'、大写字符)。随机生成每个 ID(openssl rand -hex 3);切勿复制这些文档中的示例 ID,也不要使用a1b2c3或aa11bb这样的模式。参见./docs/reference/id-format.md。 - 子工作流节点 ID 必须与
subflows/<id>.ts文件名完全一致。 两者都必须是 6 位十六进制数。Designer 的“进入子工作流”交互依赖两者匹配。 f.addDependency(namespace, version)会根据实时软件包索引进行验证。version必须是具体版本(不接受'latest'),并且必须存在于软件包已发布的versions列表中。namespace必须存在于https://packages.robomotion.io/stable/index.json。调用addDependency之前,运行robomotion get packages <ns>或robomotion describe package <ns>,以确认有效版本。切勿编造版本号。- 终端节点(
Debug、Log、Stop、GoTo、End、WaitGroup.Done)的输出数为 0——使用f.edge()将线连到它们,切勿从它们调用.then()。 - 每个
Core.Flow.GoTo都必须引用同一工作流文件中存在的Core.Flow.LabelID。 - 工作流文件是 Flow Designer 可以读取的声明,而不是只能由 Bun 运行的程序。 Designer 会逐个静态解析
main.ts和每个subflows/*.ts文件,绘制它能理解的内容,并在每次保存时根据画布重新生成整个文件——它无法读取的内容会在用户第一次保存后从 git 中消失。因此:唯一的导入是@robomotion/sdk;每个节点都必须是在create回调中直接写出的字面量f.node()/.then()/f.edge()(不能使用辅助函数、循环或.map());每个属性都必须是字面量、由字面量组成的数组/对象、对字面量使用作用域辅助函数,或使用模板、+或[..].join('\n')由同一文件内的const构建的字符串;不能使用展开({ ...SHARED })、简写属性或在func中导入辅助函数。每个使用共享辅助字符串的文件都要重新声明它。robomotion validate会以“the Flow Designer cannot read it”拒绝其他写法。完整列表见./docs/reference/project-format.md。 - 程序就是工作流;Function 节点只是连接代码,仅在必要时编写,并且要让人读得懂。 我们确实会编写代码,但只在某个步骤需要时编写:Function 用于为下一个节点整理
msg。工作应放在节点中:SQL 应写在 SQL 节点中,使用{{{field}}}占位符,绝不能在 JavaScript 中通过拼接字符串构造 SQL;用户会命名的规则应使用独立的 Function,并设置outputs: 2;格式化是屏幕的工作;不要创建辅助库,也绝不能把辅助库粘贴到每个节点中。代码应格式清晰:每行一条语句,代码块单独成行并缩进,各部分之间留空行。没有行数限制——只要 Function 只做一件事且从上到下易于阅读,写得长也没问题。robomotion validate会拒绝拥挤的代码(“several statements on one line”、“a whole block on one line”),以及同一个代码块在三个或更多 Function 中重复的情况。各类代码应放在何处:./docs/reference/function-nodes.md。
必需的首行
每个流程文件(main.ts 和每个 subflows/*.ts)都必须以以下导入语句开头,且内容完全一致——请原样复制,包括当前未使用的辅助函数(Bun 不会提示未使用的导入,但缺少的导入会导致运行时 ReferenceError):
import { flow, Message, Custom, JS, Global, Flow, Credential, AI } from '@robomotion/sdk';
对于库文件,将 flow 替换为 library / subflow。这条规则适用于每个文件,无论文件多小:不存在更短的“最简”导入语句,本文档中的每个示例也都以此行开头。完整参考:./docs/reference/imports.md。
Builder 语法
f.node(id, type, name, props)— 参数顺序。只传入非默认属性(Go 运行时会根据 pspec 填充默认值)。.then()用于顺序连接,.edge()用于多端口连线。Message(name)用于变量 ·Custom(value)用于字面值 ·JS(expr)用于单行 JS ·Credential({vaultId, itemId})用于密钥。- 字段使用的作用域辅助函数取决于该节点中的字段类型,而不是它的
in*/opt*名称——而且同名字段在不同节点中可能不同。 每个in*/out*端口都必须使用作用域辅助函数(Custom('…')/Message());直接写字面值会被静默丢弃。对于opt*字段,不要根据名称猜测——请检查robomotion describe node <type>:类型为object且带有variableType的字段(即使是数值类型)需要使用作用域辅助函数;普通的number/boolean/enum字段则需要直接写字面值,绝不能用辅助函数包装。同一个属性在不同节点中可能有不同类型:Core.Browser.OpenLink的optTimeout是普通数值 →optTimeout: 32,但Core.Browser.WaitElement的optTimeout是variableType:Integer→optTimeout: Custom('30')。无论哪种情况,类型不匹配都能通过校验,但会在机器人上加载失败(flow_error: failed/Config parse error,不会运行任何节点):包装普通字段会向标量传入对象;未包装由变量支持的字段会向{scope,name}槽位传入标量。枚举/布尔值始终是普通值(optBrowser: 'chrome'、optMethod: 'post'、optInsecure: true);in*端口和optUrl/optDownloadDir/optNofBranches等值字段始终使用Custom()/Message()。 func是字面字符串(不是JS())。- 常见运行时属性也使用原始值:
delayBefore: 2、delayAfter: 0.5、continueOnError: true。 func内仅支持 ES5:不能使用=>、模板字符串、const/let或解构。不能使用require()/fs/Buffer/process(纯 JS 沙箱)。- 循环:
Label → ForEach → body → GoTo。Stop独立放置,通过f.edge()连接 ForEach 的端口 1。 GoTo/Label不只用于循环:长连线应使用GoTo。 任何需要回连或跨越其他行才能到达共享节点或后置声明节点的边(例如错误处理器、通用的“说明原因”响应节点、分支后的汇合点),都会在所有中间节点上方画出对角线——每个分支都如此,最终画布将难以阅读。在目标旁放置Core.Flow.Label,并让每个远端分支以放在独立行中的Core.Flow.GoTo结束。GoTo没有出边,因此长边不再存在,也就无需再画一条更短的连线。经验法则:连线需要跨越两行以上时,就使用GoTo,并根据目标为其命名,这样每一行仍能从左向右阅读。一行放不下的长链条也是同样的情况:以GoTo结束该行,并以Label开始下一行,绝不要让连线跨画布回连。参见./docs/patterns/branches.md;有关换行以及多端口节点的目标位置,请参见./docs/patterns/comments-and-layout.md。- 库项目使用
library.create(id, name, fn)和Begin/End节点(不使用.start())。内联子流使用subflow.create(name, fn)。 - 每个流都以
.start()结束。每个流都必须包含一个从触发器可到达的Core.Flow.Stop节点——有两种流不会停止:应用后端(由Robomotion.Apps.Action触发的流是运行在 Robomotion App 屏幕背后的长驻服务;每条路径都以App Respond结束;参见building-app技能),以及聊天流(由Robomotion.ChatAssistant.ChatIn触发的流会逐条回复消息;每轮都以Chat Out结束;参见./docs/patterns/conversational-chat.md;引导模式请参见./docs/patterns/guided-chat.md)。这两种流都没有Stop或End。只有当流中完全没有 Stop 时,robomotion validate才会发出警告(Chat In 和 App Action 流除外);如果触发器的路径无法到达 Stop,校验仍会通过——请自行检查连线。 Core.*软件包(Core.Trigger、Core.Browser、Core.Programming、Core.CSV、Core.Flow、Core.Vault、Core.Net、Core.Excel等)已嵌入机器人——绝不要调用f.addDependency('Core.*', …)。Designer 会自动加载这些软件包。只有非Core.*软件包才调用f.addDependency(ns, ver)。更新现有流时,绝不要升级现有的addDependency版本;只添加缺失的软件包。- 注释与画布布局——
Core.Flow.Comment节点(包含 Markdown 字符串optText)用于标注流标题并划分逻辑阶段;可视化布局——节点positions、注释框的颜色/大小以及 Sugiyama 风格的分层——位于main.designer.ts中。布局仅影响外观(绝不会影响运行时),但它决定了流是否易于阅读。参见./docs/patterns/comments-and-layout.md。 完整语法:./docs/sdk-grammar.md。架构:./docs/architecture.md。
诊断索引
根据错误症状查找对应的修复文档。运行 robomotion validate 失败时,请先在此处查找对应症状,再阅读完整的失败跟踪信息。
| 症状 | 可能原因 | 修复方法 |
|---|---|---|
[SDK] Invalid node ID '<x>' in f.node('<x>', …) | 语义化 ID/非十六进制 ID | ./docs/reference/id-format.md — 选择 6 位十六进制 ID |
[SDK] Invalid subflow filename '<x>.ts' | 子流程文件名不是十六进制 | 重命名文件,并更新父 SubFlow 节点 ID,使其与文件名一致 |
version must be concrete; 'latest' and empty are not allowed | f.addDependency(ns, 'latest') | robomotion describe package <ns> → 固定到一个实际版本 |
package '<ns>' not found in repository | 命名空间是臆造的 | robomotion get packages <kw> → 使用真实的命名空间 |
version '<v>' is not published for <ns> | 固定的版本有误 | 从验证器返回的 available_versions 中选择 |
Cannot chain from node (outputs=0) | 在 Debug/Log/Stop/GoTo/End 后调用了 .then() | 使用 f.edge() 连接 TO 端口,绝不要从 FROM 端口连接 |
the Flow Designer cannot read it(导入、展开运算符、辅助函数,或值“不是在此文件中声明的 const”) | 该文件是程序,而非声明(硬性规则 6) | 直接内联:只导入一次 @robomotion/sdk,在回调中编写节点,使用同一文件中的 const,不使用展开运算符。./docs/reference/project-format.md |
several statements on one line/a whole block on one line/the same block opens N Function nodes | 代码不是为人编写的,或把辅助库粘贴到了步骤中(硬性规则 7) | 格式化代码(每行一条语句,代码块单独占行);将 SQL 放入 SQL 节点,并使用 {{{field}}};每条规则对应一个 Function;在屏幕上进行格式化。./docs/reference/function-nodes.md |
Label 上出现 Invalid input port 0. Node has 0 input(s) | 连接到了 Core.Flow.Label(在某些 pspecs 中,Label 没有输入端口) | 使用 Core.Flow.GoTo,并设置 optNodes.ids: [<labelId>] 跳转到 Label |
运行时出现 Vault has to be selected | Core.Vault.GetItem 缺少 optCredentials | ./docs/patterns/credentials.md |
Property 'optCredentials' requires vault credentials but has empty/placeholder values | 一个可选凭据属性(例如用于受密码保护文件的 Core.Excel.Open)被设为 _/空白占位符 | 除非有真实的 Vault 引用,否则完全省略 optCredentials — ./docs/patterns/credentials.md |
inSelectorType 的值 'xpath' 无效(允许的值:xpath:position、css) | 写了 inSelectorType: 'xpath' — 这不是有效的枚举值 | 使用 XPath 时,直接省略 inSelectorType(这是默认值);XPath 枚举字面值是 xpath:position,而不是 xpath。CSS ⇒ inSelectorType: 'css'。./docs/patterns/browser.md |
GoTo 上未找到 inLabel 属性 | 属性有误 | optNodes: { ids: [...], type: 'goto', all: false } |
未找到 Core.Programming.If | 节点不存在 | 使用 outputs: 2 的 Core.Programming.Function(./docs/patterns/conditions.md) |
节点名称有误(例如 Core.CSV.Read、Browser.Click) | 常见命名错误 | ./docs/reference/node-naming.md |
inPath: Custom('$Home$/file') 字面值未解析 | 系统变量只会在 Function 节点中解析 | global.get('$Home$') + '/file'(./docs/reference/system-variables.md) |
流程通过验证,但在机器人上加载失败(flow_error: failed/Config parse error,没有节点运行) | opt* 值的形状与其节点类型不匹配:普通 number/bool/enum 字段被包装在 Custom() 中,或 variableType/对象字段被设为裸字面值 | 对每个节点检查 robomotion describe node <type>。枚举/布尔值直接填写(optBrowser: 'chrome')。数值字段因节点而异:OpenLink.optTimeout: 32(普通 number),而 WaitElement.optTimeout: Custom('30')(variableType:Integer)。in* 端口以及 optUrl/optDownloadDir/optNofBranches 始终需要使用 Custom()/Message()。 |
| 范围内有任何 CSV/Excel/Sheets/SQLite/Pandas/Airtable/DOMParser/DataTable 节点 | 自定义数据形状有误(例如 {header: [...]},或行是数组) | 必须阅读 ./docs/patterns/data-tables.md — 格式为 {columns: [...], rows: [{key: value}]},其中行键必须与列名一致 |
写入后出现空单元格/ErrFilePath/“table not recognized” | 使用了 header 而不是 columns,或行是数组而不是对象 | ./docs/patterns/data-tables.md — 属性必须是 columns,绝不是 header;行必须是以列名为键的对象,绝不能是按位置排列的数组 |
每次对流程代码执行 Write / Edit 前容易遗忘的提醒: |
- 永远不要在聊天中输出 TypeScript——始终使用
Write/Edit。计划和说明留在聊天中。 - 从一开始就使用十六进制 ID。交叉引用(
optNodes.ids、Catch.optNodes.ids、子流程文件名)必须使用相同的十六进制值。 - 对于图像流程(
Robomotion.ImageAutomation.*——远程桌面 / Citrix 会话,或其他任何东西都无法查看的旧版应用):先使用Skill(exploring-image)探索实时屏幕(通过ToolSearch预热后使用mcp__image__*),并根据其记录的序列构建流程;阅读./docs/patterns/image.md。绝不要绘制模板或猜测坐标:记录的模板已验证为屏幕上的唯一模板。image: IMG_X是由image_write_templates写入的 const 的标识符——绝不是字符串,也绝不能粘贴 base64。deltaX/Y、布尔值和枚举值为普通值;in*端口和optConfidence/optWaitTimeout使用Custom()。 - 对于 Java 桌面流程(
Robomotion.JavaAutomation.*,Swing/AWT 应用):先使用Skill(exploring-java)探索实时应用(通过ToolSearch预热后使用mcp__java__*),并根据其记录的序列构建流程;阅读./docs/patterns/java.md。绝不要猜测 Window Title 或 Full Path:记录的值已针对正在运行的应用验证。键槽inMod1..3、枚举值和optTimeout为普通值;in*端口使用Custom()。 - 对于浏览器流程:先探索实时页面(使用
Skill(exploring-browser),或通过ToolSearch预热后使用mcp__browser__*)。不要猜测选择器。Core.Browser.*元素节点(ClickElement/TypeText/GetValue/SetValue/WaitElement/Select)的inSelector默认使用 XPath——将找到的 CSS 句柄(#email、input[type="email"])转换为 XPath(//input[@id='email']),并省略inSelectorType;只有在inSelectorType: 'css'(普通字面值——inSelectorType是枚举值,因此绝不能使用Custom('css'))时才使用 CSS 字符串。使用默认引擎时,CSS 字符串会在运行时导致“element not found”。绝不要写inSelectorType: 'xpath'(无效;该值为xpath:position)。此外:枚举 / 下拉选项(optBrowser、optProxy、optProxyAuth、optClickType)使用普通字符串 / 布尔值——绝不能使用Custom();将枚举值包装在Custom()中会生成{name,scope}对象,机器人会在加载时拒绝该节点,并报Config parse error(流程无法启动)。Custom()/Message()仅用于变量值字段(选择器 / URL / 文本 / 路径)。请参阅./docs/patterns/browser.md。 - 对于 Windows 桌面应用(记事本、Excel 的 UI、ERP 客户端,以及任何
Robomotion.WindowsAutomation.*节点):先探索实时应用(使用Skill(exploring-windows),或通过ToolSearch预热后使用mcp__windows__*),并根据记录的序列构建流程——其选择器已针对应用验证。绝不要根据猜测或屏幕截图编写桌面选择器。程序使用Core.Process.StartProcess启动,并设置optBackground: true(不设置时,该节点会等待应用退出)。optWaitTimeout/optTimeout/optIndex和枚举值为普通值;in*和optText使用Custom()/Message()。请参阅./docs/patterns/windows.md。 - 对于任何读取或写入表格数据(CSV / Excel / Google Sheets / Excel 365 / SQLite / Airtable / Pandas / DataTable / DOMParser)的流程——在添加节点之前,先阅读
./docs/patterns/data-tables.md,无论是构建表格的 Function,还是读取 / 写入节点都要阅读。该文档列出了准确的节点名称及其属性(例如,写入 CSV =Core.CSV.WriteCSV,使用inFilePath+inTable;写入 Sheets =Robomotion.GoogleSheets.SetRange;等等),以及{columns: [...], rows: [{key: value}]}格式(绝不能使用{header: ...},也绝不能将行表示为数组)。**不要使用robomotion search搜索数据输出节点——搜索返回的是模板,而非节点,反复搜索只会浪费时间。节点名称已列在 data-tables.md 中;确定节点后,使用robomotion describe node <type>查看其准确属性。**如果搜索返回的是模板,而不是你需要的节点,请停止搜索并阅读相关模式文档。 - 对于任何处于对话式模式的
Robomotion.ChatAssistant流程——编写前先阅读./docs/patterns/conversational-chat.md。一条用户消息对应一次ChatIn → ChatOut运行,只有ChatOut才会解锁编辑框;因此,以其他方式结束的分支(出错或缺少ChatOut)会冻结聊天,直到重新加载页面——这是此类流程中最常见的错误,而且看起来像是产品故障,而不是流程故障。该文档还介绍了流式传输连线(Callback Instream_delta→Streaming Text,并且不要用Text节点重复输出答案)和附件连线(GetAttachments,因为msg.payload.files中包含的是名称和版本,而不是磁盘上的文件)。 - 对于处于引导式模式的
Robomotion.ChatAssistant流程(流程依次提出问题:Textbox、ButtonGroup、Checkbox等)——编写前先阅读./docs/patterns/guided-chat.md。固定选项格式为[{ scope: 'Custom', name: { label: '…' } }](describe node只会将其显示为array,且 validate 不会检查),每个outResult都是一个对象:读取msg.<x>.value。 - 保存前先验证——先运行
robomotion validate;git push会将文件夹中的内容原样存储,不管内容是否有问题。
模式参考
编写相应代码前,请先阅读这些文档:
| 模式 | 文档 |
|---|---|
| 循环(Label → ForEach → 主体 → GoTo) | ./docs/patterns/loops.md |
条件(带有 outputs: N 的 Function) | ./docs/patterns/conditions.md |
| 凭据(保管库 + 类别) | ./docs/patterns/credentials.md |
| 浏览器自动化(包括代理) | ./docs/patterns/browser.md |
远程桌面 / Citrix / 基于像素的屏幕(Robomotion.ImageAutomation)——先使用 exploring-image 探索 | ./docs/patterns/image.md |
Java 桌面应用(Swing / AWT、Robomotion.JavaAutomation)——先使用 exploring-java 探索 | ./docs/patterns/java.md |
Windows 桌面自动化(Robomotion.WindowsAutomation:选择器、节点、转换 exploring-windows 录制) | ./docs/patterns/windows.md |
| 异常处理(Catch、continueOnError) | ./docs/patterns/exceptions.md |
| 分支与并行(ForkBranch、WaitGroup) | ./docs/patterns/branches.md |
| 子流程(Begin/End、多输出) | ./docs/patterns/subflows.md |
数据表(CSV / Excel / Sheets / SQLite / Pandas / Airtable / DOMParser / DataTable)——编写任何生成或使用 msg.table 的代码前必须阅读 | ./docs/patterns/data-tables.md |
| 验证码求解 | ./docs/patterns/captcha.md |
将旧版 Robomotion.Assistant 流迁移到 Robomotion.ChatAssistant | ./docs/patterns/assistant-migration.md |
| 对话式 Chat Assistant(轮次约定、Stop、流式传输、附件)——编写任何对话模式的聊天流前必须阅读 | ./docs/patterns/conversational-chat.md |
引导式 Chat Assistant(问题组件、固定选项、outResult.value、再次提问、错误路径)——编写任何引导模式的聊天流前必须阅读 | ./docs/patterns/guided-chat.md |
注释、分组与 Sugiyama 布局(标题框、彩色阶段标题 + 描述文本、框尺寸、使用 GoTo/Label 连接长线、多端口扇出、main.designer.ts) | ./docs/patterns/comments-and-layout.md |
参考资料:
| 主题 | 文档 |
|---|---|
| 导入(所有作用域辅助工具 + 示例) | ./docs/reference/imports.md |
| 节点 ID 格式(十六进制规则) | ./docs/reference/id-format.md |
| Designer 和 CLI 均可读取和保存的项目格式(硬性规则 6) | ./docs/reference/project-format.md |
| Function 节点:仅在必要时编写胶水代码,面向人类排版;各项内容应放置的位置(硬性规则 7) | ./docs/reference/function-nodes.md |
系统变量($Home$、$TempDir$) | ./docs/reference/system-variables.md |
| 节点命名(错误 → 正确) | ./docs/reference/node-naming.md |
| 凭据类别(字段布局) | ./docs/reference/credential-categories.md |
如需查看架构、示例和包文档,请使用 robomotion CLI(它已在 PATH 中,直接使用命令名调用):
| 需求 | 命令 |
|---|---|
| 跨来源模糊 / 语义搜索 | robomotion search <query> |
| 查找包 | robomotion get packages [query] |
| 查找节点 | robomotion get nodes [query] [--in <ns>] |
| 查找模板 | robomotion get templates [query] [--category <name>] [--tag <name>] |
| 完整节点架构 + 文档 + 示例 | robomotion describe node <type>[,<type>...] |
| 包信息(包括已发布版本) | robomotion describe package <namespace> |
| 模板源代码 | robomotion describe template <slug> |
| 包文档(llms.txt) | robomotion docs <namespace> [--grep <pattern>] |
| 列出保管库 / 保管库条目 | robomotion get vaults · robomotion get vault-items <vault-id> |
| 列出机器人 | robomotion get robots |
公共模板仓库:
github.com/robomotionio/robomotion-templates是权威来源。与其从头构建,不如优先克隆或派生匹配的模板。
工作流
完整步骤指南:./docs/workflow.md。概要:
0a. 项目。 一个 flow 是一个文件夹:根目录中有 main.ts,并且是已登录账号的该 flow 自有仓库的 git 检出副本。如果还没有,就在用户希望存放它的文件夹下创建:
robomotion create flow "<short human name>"
该命令会创建文件夹(名称转换成 slug,或使用 --dir <path>),如果尚未登录则会引导登录(生成一段代码和一个链接,用户在浏览器中批准;在后台运行,等待批准;如果用户指定了工作区,则使用 --workspace <host>),在服务端创建 flow 并检出到该文件夹中。然后 cd 进入该文件夹。现有的检出副本(从 flow 的 Home 卡片执行 git clone 得到)无需任何操作;如果 robomotion auth whoami 显示尚未登录,则在其中运行 robomotion auth login --workspace <host>。
0. 收集需求(仅限交互模式)——凭据(从 robomotion get vaults / robomotion get vault-items <vault-id> 返回的结果中选定一个 Vault 条目,不要盘问用户;绝不要询问机密本身——请用户先将其添加到 Vault:./docs/patterns/credentials.md)、URL、文件、迭代方式、错误处理。
- 发现——使用
robomotion search、robomotion get nodes,并对每个非Core.*包使用robomotion docs <namespace>(当某个包没有 llms.txt 时,使用robomotion describe package <ns>和describe node)。 - 规划——将计划作为聊天文本输出,然后使用你自己的提问工具(或在普通聊天中)询问“开始构建,还是修改计划?”
- 编写——阅读 1-2 篇相关的
./docs/patterns/*.md,使用robomotion describe node验证属性名称,然后编写main.ts(以及任何subflows/<id>.ts)。对于浏览器工作流:先探索实时页面。 - 验证——在 flow 文件夹中运行
robomotion validate。该命令会进行 Pspec 检查和依赖项检查。保存前必须通过。 - 保存——在 flow 目录中运行
git add -A && git commit -m "..." && git push(robomotion create flow创建的检出副本已配置好推送,无需额外设置;将main.designer.ts与main.ts一起提交)。除非用户也要求运行,否则此步骤即为任务结束。 报告成功——不要自行接着运行 flow。运行是单独的用户请求,由running-flow技能处理;如果运行时发现错误并修复了错误,请再次验证并保存。 - 如果请求包含运行(“构建、运行,并在成功后保存”):构建 → 验证 → 运行(
running-flow:robomotion run会按文件夹当前状态运行,无需先保存)→ 修复问题,直到运行成功 → 运行成功后保存。Chat In flow 则由running-chat-assistant处理,该技能会在每次聊天前推送(在 flow 检出副本中,推送即为保存)。如果用户没有提出此要求:构建 → 验证 → 保存,然后停止。
如果以直接模式调用(“为 X 编写 main.ts”、“生成一个执行 Y 的 flow”),跳过第 0-2 步,直接进入第 3 步。
在 Designer 的 Build with AI 中,同样的步骤通过工具完成:第 4 步使用 validate_flow,第 5 步使用 save_flow(该环境会拒绝 git 操作),describe node 使用 get_node_schema,提问使用 AskUserQuestion(及其 vault_picker)。在终端中,使用上面的命令。
**浏览器注意事项:**如果初次探索后代码发生了变化(选择器不同、操作新增),保存前必须对照实时页面重新验证选择器。选择器验证属于第 3 步,不是保存后的步骤。探索结束后,立即关闭探索浏览器——无论它是由哪个工具打开的(robomotion-browser-mcp、Playwright MCP);编写或运行 flow 时绝不要让它保持打开。机器人会自行打开浏览器。
规范示例(简单链)
有关循环/条件/子流程/捕获示例,请参阅对应的模式文档,其中包含更丰富的可运行代码片段。
import { flow, Message, Custom, JS, Global, Flow, Credential, AI } from '@robomotion/sdk';
flow.create('<flow-id>', 'Simple Flow', (f) => {
f.node('42ec21', 'Core.Trigger.Inject', 'Start', {})
.then('7dbafc', 'Core.Programming.Function', 'Setup', {
func: `msg.url = 'https://example.com';
return msg;`
})
.then('a06926', 'Core.Browser.Open', 'Open Browser', {
outBrowserId: Message('browser_id')
})
.then('8e1c4b', 'Core.Browser.OpenLink', 'Navigate', {
inBrowserId: Message('browser_id'),
inUrl: Message('url'),
outPageId: Message('page_id')
})
.then('d52f73', 'Core.Browser.Close', 'Close', {
inBrowserId: Message('browser_id')
})
.then('b9a841', 'Core.Flow.Stop', 'Stop', {});
}).start();
CLI 和 MCP
robomotion— 功能完备的 CLI。用于构建、验证、运行、搜索和检查。运行robomotion help查看完整的动词列表。robomotion-browser-mcp— 用于交互式浏览器探索的 MCP 服务(供exploring-browser和mcp__browser__*工具使用)。robomotion-image-mcp— 用于仅以像素形式呈现的屏幕的 MCP 服务:远程桌面、Citrix、旧版应用(供exploring-image和mcp__image__*工具使用;仅限 Windows)。robomotion-java-mcp— 通过 Java Access Bridge 操作 Java 桌面应用的 MCP 服务(供exploring-java和mcp__java__*工具使用;仅限 Windows)。robomotion-windows-mcp— 仅限 Windows:用于交互式桌面应用探索的 MCP 服务(供exploring-windows和mcp__windows__*工具使用)。
robomotion CLI 在内部会调用 robomotion-sdk-mcp 来执行基于搜索的命令,并直接调用 api.robomotion.io 来执行运行、停止、保管库和机器人操作。无需其他 MCP 服务。
回归测试套件
对于编辑此技能的人:agent-skills 仓库中包含一个自动化评测套件(github.com/robomotionio/agent-skills,skills/creating-flow/evals/)——Tier A 精准回归测试(手工制作的样例,每个样例对应一条规则)以及 Tier B 集成测试(使用公开 robomotion-templates 仓库中的实时 main.ts)。robomotion skills install 不会安装此套件。在该仓库的检出目录中,提交对本 SKILL.md 或 ./docs/ 文件的修改前,请从根目录运行 bun run skills/creating-flow/evals/run-evals.ts;其 README.md 介绍了如何添加新用例以及断言语法。
相关技能
validating-flow— 架构验证testing-flow— 行为测试running-flow— 在机器人上执行running-chat-assistant— 在真实聊天页面中以 Agent 身份运行并测试 Chat Assistant 工作流(Chat In)searching-packages— 查找包、节点和模板exploring-browser— 交互式浏览器自动化exploring-image— 根据像素探索远程桌面/Citrix/旧版屏幕,并记录经过验证的 Image Automation 步骤exploring-java— 探索 Java(Swing/AWT)桌面应用,并记录经过验证的 Java Automation 步骤exploring-windows— 交互式 Windows 桌面应用自动化reversing-network— 捕获流量后,将浏览器工作流转换为 HTTP