uipath-maestro-flow
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUiPath Flow Skill
UiPath Flow Skill
Comprehensive guide for creating, editing, validating, debugging, publishing, diagnosing, and evaluating UiPath Flow projects using the CLI and file format. The skill is organized into four capabilities — Author, Operate, Diagnose, Evaluate — each with its own index doc.
uip.flow本指南全面介绍如何使用 CLI和文件格式创建、编辑、验证、调试、发布、诊断和评估UiPath Flow项目。该技能分为四大能力模块——创作(Author)、运维(Operate)、诊断(Diagnose)、评估(Evaluate),每个模块都有对应的索引文档。
uip.flowWhen to use this skill
何时使用本技能
Author — building or editing a file. Read references/author/CAPABILITY.md.
<!--skill-flavor:project-creation-scope:start-->
.flow- Create a new Flow project ()
uip maestro flow init
- Edit a file — add nodes, edges, variables, subflows, transforms, triggers
.flow - Explore available node types via the registry
- Validate or format a Flow file locally
- Apply Node ownership — Edit/Write for user-owned nodes, CLI for CLI-owned nodes (see Author capability)
- Configure connector, connector-trigger, or managed HTTP nodes; scaffold inline-agent projects
- Add IxP / document-extraction nodes to a flow, or list IxP models available to Maestro Flow through the flow registry
- Plan a complex flow before building
Operate — publishing, running, or managing a deployed flow. Read references/operate/CAPABILITY.md.
<!--skill-flavor:upload-scope-bullets:start-->
- Push a flow to Studio Web ()
uip solution upload - Deploy a flow to Orchestrator (+
uip maestro flow pack)uip solution publish
- Debug a flow end-to-end against real systems
- Trigger a deployed process
- Check job status or stream traces
- Pause, resume, cancel, or retry a running instance
Diagnose — investigating a failed or misbehaving run. Read references/diagnose/CAPABILITY.md.
- Triage a failed or deployed process run
flow debug - Read incidents, runtime variables, deployed BPMN
- Recognize known failure modes (MST-9107, MST-9061, HITL-stuck, reused reference IDs, single-nested layout)
Evaluate — designing and running evaluations against a deployed flow. Read references/evaluate/CAPABILITY.md.
- Create evaluators (,
exact-match,json-similarity,contains) for a Flow projectllm-judge-* - Create eval sets, add data points (test cases), pin entry points
- Start Studio Web eval runs, poll status, fetch results, compare runs
- Decide whether to call (almost always: don't auto-run; ask first)
uip solution upload
创作——构建或编辑文件。阅读references/author/CAPABILITY.md。
<!--skill-flavor:project-creation-scope:start-->
.flow- 创建新的Flow项目()
uip maestro flow init
- 编辑文件——添加节点、边、变量、子流程、转换、触发器
.flow - 通过注册表探索可用的节点类型
- 在本地验证或格式化Flow文件
- 设置节点所有权——用户拥有的节点使用编辑/写入操作,CLI拥有的节点使用CLI操作(请参阅创作能力模块)
- 配置连接器、连接器触发器或托管HTTP节点;搭建内联代理项目
- 为Flow添加IxP/文档提取节点,或列出通过Flow注册表可供Maestro Flow使用的IxP模型
- 在构建前规划复杂Flow
运维——发布、运行或管理已部署的Flow。阅读references/operate/CAPABILITY.md。
<!--skill-flavor:upload-scope-bullets:start-->
- 将Flow推送到Studio Web()
uip solution upload - 将Flow部署到Orchestrator(+
uip maestro flow pack)uip solution publish
- 针对真实系统端到端调试Flow
- 触发已部署的流程
- 检查任务状态或流式查看跟踪信息
- 暂停、恢复、取消或重试运行中的实例
诊断——调查失败或运行异常的任务。阅读references/diagnose/CAPABILITY.md。
- 分类处理失败的或已部署流程运行任务
flow debug - 查看事件、运行时变量、已部署的BPMN
- 识别已知故障模式(MST-9107、MST-9061、HITL停滞、重复引用ID、单层嵌套布局)
评估——针对已部署的Flow设计并运行评估。阅读references/evaluate/CAPABILITY.md。
- 为Flow项目创建评估器(、
exact-match、json-similarity、contains)llm-judge-* - 创建评估集、添加数据点(测试用例)、固定入口点
- 启动Studio Web评估运行、轮询状态、获取结果、对比运行情况
- 决定是否调用(几乎总是:不要自动运行;先询问用户)
uip solution upload
Capability router
能力模块导航
| I want to... | Read |
|---|---|
| Create a new flow or edit an existing one | references/author/CAPABILITY.md |
| Publish, deploy, debug, or manage a flow's lifecycle | references/operate/CAPABILITY.md |
| Diagnose a failed or misbehaving flow run | references/diagnose/CAPABILITY.md |
Design and run evaluations ( | references/evaluate/CAPABILITY.md |
| Look up CLI command syntax | references/shared/cli-commands.md |
Look up CLI conventions ( | references/shared/cli-conventions.md |
Understand the | references/shared/file-format.md |
Understand variables and | references/shared/variables-and-expressions.md |
| Wire one node's output into another node's input | references/shared/node-output-wiring.md |
Look up action-node boilerplate shared across plugin | references/shared/action-nodes.md |
| Narrate progress + maintain todos (opt-in — when user wants verbosity) | references/shared/ux-narration-and-todos.md |
| 我想要... | 阅读文档 |
|---|---|
| 创建新Flow或编辑现有Flow | references/author/CAPABILITY.md |
| 发布、部署、调试或管理Flow的生命周期 | references/operate/CAPABILITY.md |
| 诊断失败或运行异常的Flow任务 | references/diagnose/CAPABILITY.md |
设计并运行评估( | references/evaluate/CAPABILITY.md |
| 查阅CLI命令语法 | references/shared/cli-commands.md |
查阅CLI约定( | references/shared/cli-conventions.md |
了解 | references/shared/file-format.md |
了解变量和 | references/shared/variables-and-expressions.md |
| 将一个节点的输出连接到另一个节点的输入 | references/shared/node-output-wiring.md |
查阅插件 | references/shared/action-nodes.md |
| 叙述进度并维护待办事项(可选——仅当用户需要详细信息时) | references/shared/ux-narration-and-todos.md |
Critical rules (universal)
通用关键规则
These rules apply across all three capabilities. Each capability index adds capability-scoped rules on top.
Tool vocabulary. Tool names in this skill use Claude Code conventions:= in-place string replacement,Edit= full-file write,Write/Read/Glob= file read/search,Grep= shell, progress list = the harness's task list. On another harness, map each to its equivalent — the semantics (reviewable in-place diff vs wholesale rewrite, shell as last resort for file edits) carry unchanged.Bash
-
ALWAYS useand prefer
--output jsonfor extraction on all--output-filtercommands when parsing output programmatically.uipis a global CLI flag applied to the--output-filter <jmespath>envelope before printing — write expressions starting atData(noDataprefix). Canonical recipe:Data..uip maestro flow registry search <keyword> --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"returnsregistry searchas a flat array of PascalCase objects (Data,NodeType,DisplayName,Description) — NOTAvailableOnTenant, lowercaseData.Nodes, or lowercasetype. Withcategory,--localis omitted (no tenant lookup) — drop it from the projection. External parsers (AvailableOnTenant,python3 -c) remain valid for transforms JMESPath cannot express; reach for them only after the shape is verified. Full mechanics, fall-back guidance, and shape-inspection probes: cli-conventions.md §3.jq -
Do NOT runwithout explicit user consent — debug executes the flow for real (sends emails, posts messages, calls APIs).
flow debug -
Resource discovery order — search before creating. When the prompt references an existing resource by name ("use the X agent", "call the Y API workflow", "invoke the Z RPA process"), follow this order strictly before deciding the resource doesn't exist:
- Pull, then search the tenant registry — . Always pull first:
uip maestro flow registry pull --force && uip maestro flow registry search "<name>" --output jsonreads the local cache (populated bysearch, expires after 30 min), so a search before a fresh pull can return empty for a resource that exists. Requirespull; returns published resources.uip login - In-solution local discovery — , or
uip maestro flow registry list --local --output jsonfor keyword match. No login required; returns sibling projects in the sameuip maestro flow registry search "<name>" --local --output jsonsolution. An empty.uipxis not proof of absence (the keyword may not match the project's naming) — confirm withsearch --localbefore concluding the resource is not in the solution.list --local - Only then create/scaffold — scaffold an inline agent, mock, or create-new-resource only when both searches return no match AND either the user explicitly asks to embed/inline/create, or no published resource can satisfy the requirement.
The words "coded" and "low-code" describe the implementation style of a published agent — they are NOT synonyms for "inline".(inline) is only correct when the user explicitly asks to embed/inline/create a new agent inside this flow. Only useuipath.agent.autonomouswhen the resource is not in the same solution and not yet published. See the relevant resource plugin'score.logic.mock(e.g., rpa, agent).impl.mdThe same "search before deciding it doesn't exist" discipline applies to connector connections. The connector key MUST come from anode type (registry search) — never inferred from the service's brand name. The registry key is frequently prefixed or qualified differently than the product name, so a guessed key silently misses the real connector. Anyuipath.connector.<connector-key>.<activity>used for discovery MUST passuip is connections list. An empty result from an unverified key or without--all-foldersis a false negative, never authoritative — do not conclude "no connection exists" or ask the user to create one until both hold.--all-foldersIt also applies to ANY external service named in the prompt — not just in-tenant resources. Before picking a node type for a named service (Slack, open-meteo, Stripe, any REST API), runand follow the Selecting External Service Nodes ladder (connector → managed HTTP → RPA). Manualuip maestro flow registry search "<service>" --output jsonis the bottom of that ladder, chosen only after a search finds no connector — never a first guess from the brand name. This holds even when full planning is skipped (see greenfield.md — Select the node type for each external service).core.action.http.v2Two tells that you skipped the search and took the brand-name shortcut — both are build defects, not valid manual-mode HTTP: (a) you authored a manual-modenode whosecore.action.http.v2targets a well-known SaaS API domain that has a connector (url,slack.com/api/*,api.github.com,*.salesforce.com, …); (b) you declared angraph.microsoft.comvariable to hold that service's API token or secret (e.g. ainholding anslackTokenbot token, anxoxb-…, a bearer token). A connector-backed flow never carries the raw credential — the IS connection does. If you find yourself writing either, stop: runapiKeyanduip maestro flow registry search "<service>", then use the connector activity (or connector-mode HTTP:uip is connections list "<connector-key>" --all-folders+authentication:"connector"+ a boundtargetConnector/connectionId). Manual mode is legitimate only for a service the search proves has no connector.folderKey - Pull, then search the tenant registry —
-
Never invoke other skills automatically — when a flow needs an RPA process, agent, or app, identify the gap and provide handoff instructions. Let the user decide when to switch skills.
-
Always present user questions as a dropdown with a "Something else" escape hatch — Whenever this skill needs a decision from the user (which solution to use, publish vs debug vs deploy, which connector to pick, which trigger type, which resource to bind, etc.), ask the user a question with the enumerated choices as options AND include "Something else" as the last option so the user can supply free-form string input. Never ask open-ended questions in chat when a finite set of sensible defaults exists. If the user picks "Something else", parse their string answer and continue. No structured-question facility on the harness → ask in chat as a numbered list with "Something else" last. Running non-interactively (CI/headless — no user available to answer) → take the pre-selected/recommended option, proceed, and record the decision prominently in the final report; if no option is marked recommended, stop and report the open decision instead of guessing. Exception: consent gates (, destructive operations) are never auto-answered — in non-interactive mode, stop and report the blocked step instead. These fallbacks define "ask the user" / "confirm with the user" wherever this skill's references require it.
flow debug
- Discover the target solution before you scaffold — a Flow project MUST live inside a solution (layout is always double-nested: ). Before any
<Solution>/<Project>/<Project>.floworuip solution initfor a NEW Flow, runuip maestro flow init. If it lists one or more solutions, STOP — do not scaffold, initialize, delete, or repair anything. Ask which solution to use (dropdown per rule #5): one option per discovered solution, "Create a new solution", then "Something else" last; continue only after the answer. This holds even when the user says they want a new solution or supplies only a Flow-project name — never silently adopt an existing solution, and when they pick "Create a new solution", ask for its name rather than defaulting to the Flow-project name. If none are found, create one automatically (default its name to the Flow name unless the user specifies otherwise). Prefer solution-first — it works on every CLI version and lets you set the two names independently:find . -maxdepth 2 -type f -name '*.uipx' -print→uip solution init "<SolutionName>" --output json && cd "<SolutionName>" && uip maestro flow init "<FlowName>" --output json, with the project auto-registered in the parent<SolutionName>/<FlowName>/<FlowName>.flow(.uipx);Data.SolutionRegistration.Status: "Registered"and<SolutionName>are independent and need not match. On a current CLI, running<FlowName>outside any solution instead auto-scaffoldsuip maestro flow init "<FlowName>"with the project at<FlowName>Solution/<FlowName>Solution.uipx(response carries<FlowName>Solution/<FlowName>/) — convenient, but it forces theData.AutoCreatedSolutionname, so use it only when the solution name doesn't matter.<FlowName>Solutionopts out of both auto-scaffold and registration, leaving a bare single-nested--skip-solution-registrationthat fails Studio Web upload and packaging. If a non-empty directory already exists at the path you typed, init warns and leaves it untouched. Never drop the<Flow>/<Flow>.flowbetweencdandsolution init—flow initin the old directory auto-scaffolds a duplicateflow init. One<FlowName>Solution/at finish; delete strays. See author/greenfield.md Step 2.project.uiproj
- Narrate progress in plain English only when the user has opted into verbosity — silent by default. Engage when the user asks for narration / progress ("walk me through it", "show your steps", "verbose", "be detailed") or signals a verbosity preference; otherwise work quietly and surface only decisions, failures, consent gates, and the final result. When engaged: one short line per logical step, in user terms ("checking your tenant login", "adding the Slack node and wiring its inputs", "running validate") — no flag-level or JSON-structure-level detail, applied uniformly across CLI calls, shell builtins, file edits, and bulk searches. See shared/ux-narration-and-todos.md §When to engage.
uip - Maintain a user-facing progress list only when the user has opted into progress tracking / verbosity. In silent mode there is no user-facing todo list (the agent MAY track privately). When engaged: any journey above the trivial threshold gets a granular list — one logical step ≈ one todo, granularity per-step not per-phase. The count emerges from the journey's actual steps; do not target a number. Bash plumbing inside a step (registry lookups, JSON parsing, intermediate file reads) is invisible — do not surface as todos. See shared/ux-narration-and-todos.md for the engage triggers, granularity rules, threshold table, and pivot rules.
- Every node has exactly one author — Edit/Write or CLI, never both. Connector activities (), connector triggers (
uipath.connector.<key>.<op>), wait for events (uipath.connector.trigger.<key>.<trigger>— a mid-flow event wait, configured exactly like a trigger), and managed HTTP (uipath.connector.event.<key>.<event>) are CLI-owned — usecore.action.http.v2+uip maestro flow node add. Every other node type — triggers, control flow, logic, HITL, patterns, agents, resource nodes, queue — is user-owned: author theuip maestro flow node configureJSON directly with.flow— orEdit, but never a full-fileWriteon a flow that also contains CLI-owned nodes (it clobbers their CLI-setWrite/bindings[];inputs.detailin place, or re-runEditas the last step).node configureon CLI-owned nodes is ainputs.detailenvelope that the validator rejects when hand-authored. Inline-agent CLI is limited to agent project lifecycle (=jsonString:essentialConfiguration); theuip agent init / refresh / validate --inline-in-flowflow node itself is user-owned. Scripting languages (uipath.agent.autonomous,python,node,jq,sed, inline shell heredocs) are a last resort for user-owned edits and require explicit user approval after the trade-offs (state bypass, opaque diff, no interruption point) are surfaced. Canonical source of truth: author/CAPABILITY.md — Node ownership (full table); author/editing-operations.md — Tool Selection Ladder (per-operation ladder).awk - Batch tool calls into one assistant turn whenever data dependencies allow — minimize wall-clock round-trips. A typical greenfield build is 3 turns, not 10+: (T1) one chained for scaffold + registry pull + CLI-owned
Bash, in parallel withnode addandregistry getcalls for any extra discovery; (T2) oneReadof the scaffoldedReadin parallel with the.flow/Editcalls that add the End node and wire edges; (T3) one chainedWriteforBash. Within an assistant message: chain sequentialnode configure && validate && formatcalls withuipin a single&&, and emit independentBash/Bash/Readcalls as parallel tool uses. Only split turns where a later call truly depends on an earlier call's stdout or on a file mutation. See author/references/greenfield.md — Three-turn execution map for the canonical pattern.Edit - Cross-node bindings inside need the
=js:prefix — a bare node reference resolves to$vars.at runtime.undefinedis correct;"recordId": "=js:$vars.createEntityRecord1.output.Id"(missing"recordId": "=js:createEntityRecord1.output.Id") silently resolves to$vars.. Pattern:undefined, never=js:$vars.<nodeId>.output.... See variables-and-expressions.md — IS Activity Inputs Require=js:<nodeId>.output....=js: - Node and edge s MUST start with a letter — never a bare UUID. Edges:
id. Nodes: descriptive camelCase. UUIDs only for the top-level flowedge_<sourceNodeId>_<sourcePort>_<targetNodeId>_<targetPort>/id.entryPointId
这些规则适用于所有三个能力模块。每个能力模块的索引文档会在此基础上添加模块专属规则。
工具术语说明:本技能中的工具名称遵循Claude Code约定:= 原地字符串替换,Edit= 全文件写入,Write/Read/Glob= 文件读取/搜索,Grep= 终端,进度列表 = 工具的任务列表。在其他工具环境中,请将每个术语映射为对应的功能——语义(可审核的原地差异与整体重写、终端作为文件编辑的最后手段)保持不变。Bash
-
程序化解析输出时,所有命令必须使用
uip,优先使用--output json进行提取。--output-filter是全局CLI标志,会在打印前应用于--output-filter <jmespath>包——编写表达式时从Data开始(无需Data前缀)。标准示例:Data.。uip maestro flow registry search <keyword> --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"返回的registry search是PascalCase对象的扁平数组(Data、NodeType、DisplayName、Description)——不是AvailableOnTenant、小写Data.Nodes或小写type。使用category时,--local会被省略(无需租户查询)——请从投影中移除该字段。外部解析器(AvailableOnTenant、python3 -c)仍适用于JMESPath无法实现的转换;仅在确认数据结构后再使用它们。完整机制、 fallback 指南和结构探测方法:cli-conventions.md §3。jq -
未经用户明确同意,不得运行——debug会实际执行Flow(发送邮件、发布消息、调用API)。
flow debug -
资源发现顺序——先搜索再创建。当提示中按名称引用现有资源(“使用X代理”、“调用Y API工作流”、“触发Z RPA流程”)时,在确定资源不存在前,请严格遵循以下顺序:
- 拉取租户注册表,然后搜索——。务必先拉取:
uip maestro flow registry pull --force && uip maestro flow registry search "<name>" --output json读取本地缓存(由search填充,30分钟后过期),因此在重新拉取前进行搜索可能会返回空结果,即使资源实际存在。需要pull;返回已发布的资源。uip login - 解决方案内本地发现——,或使用
uip maestro flow registry list --local --output json进行关键词匹配。无需登录;返回同一uip maestro flow registry search "<name>" --local --output json解决方案中的同级项目。.uipx返回空结果并不代表资源不存在(关键词可能与项目名称不匹配)——在得出资源不在解决方案中的结论前,请用search --local确认。list --local - 仅在此时创建/搭建——仅当两次搜索均无结果,且用户明确要求嵌入/内联/创建,或没有已发布资源能满足需求时,才搭建内联代理、模拟资源或创建新资源。
“编码”和“低代码”描述的是已发布代理的实现风格——它们不是“内联”的同义词。仅当用户明确要求在此Flow中嵌入/内联/创建新代理时,才使用(内联)。仅当资源不在同一解决方案中且尚未发布时,才使用uipath.agent.autonomous。请参阅相关资源插件的core.logic.mock(例如:rpa、agent)。impl.md“先搜索再确定不存在”的原则同样适用于连接器连接。连接器密钥必须来自节点类型(registry search)——绝不能从服务品牌名称推断。注册表密钥的前缀或限定方式通常与产品名称不同,因此猜测的密钥会无声地错过真正的连接器。用于发现的任何uipath.connector.<connector-key>.<activity>必须传递uip is connections list。未验证的密钥或未使用--all-folders返回的空结果是假阴性,绝不能作为权威结论——在同时满足两个条件前,不得得出“无连接存在”的结论或要求用户创建连接。--all-folders此原则也适用于提示中提及的任何外部服务——不仅仅是租户内资源。在为指定服务(Slack、open-meteo、Stripe、任何REST API)选择节点类型前,请运行并遵循选择外部服务节点优先级(连接器→托管HTTP→RPA)。手动uip maestro flow registry search "<service>" --output json是优先级最低的选项,仅在搜索未找到连接器时才选择——绝不能从品牌名称直接猜测。即使跳过完整规划,此原则依然适用(请参阅greenfield.md — 为每个外部服务选择节点类型)。core.action.http.v2两个表明你跳过搜索并使用品牌名称捷径的迹象——均为构建缺陷,而非有效的手动模式HTTP:(a) 你编写了手动模式节点,其core.action.http.v2指向知名SaaS API域名且该域名已有连接器(url、slack.com/api/*、api.github.com、*.salesforce.com等);(b) 你声明了graph.microsoft.com变量来存储该服务的API令牌或密钥(例如存储in机器人令牌的xoxb-…、slackToken、Bearer令牌)。基于连接器的Flow绝不会携带原始凭据——凭据由IS连接管理。如果你发现自己正在编写上述任何一种情况,请停止:运行apiKey和uip maestro flow registry search "<service>",然后使用连接器活动(或连接器模式HTTP:uip is connections list "<connector-key>" --all-folders+authentication:"connector"+绑定的targetConnector/connectionId)。仅当搜索证明服务没有连接器时,手动模式才是合理的。folderKey - 拉取租户注册表,然后搜索——
-
切勿自动调用其他技能——当Flow需要RPA流程、代理或应用时,请指出缺口并提供交接说明。让用户决定何时切换技能。
-
始终将用户问题以下拉菜单形式呈现,并提供“其他选项”作为退路——每当本技能需要用户做出决策(使用哪个解决方案、发布/调试/部署、选择哪个连接器、选择哪种触发器类型、绑定哪个资源等)时,请向用户提出问题,列出枚举选项作为选择,并将**“其他选项”**作为最后一个选项,以便用户提供自由格式的字符串输入。当存在合理的有限默认选项集时,切勿在聊天中提出开放式问题。如果用户选择“其他选项”,请解析其字符串答案并继续。如果工具不支持结构化提问功能,请在聊天中以编号列表形式提问,并将“其他选项”放在最后。非交互式运行(CI/无头模式——无用户可回答)→ 选择预先选定/推荐的选项,继续执行,并在最终报告中突出记录决策;如果没有标记为推荐的选项,请停止并报告未解决的决策,而非猜测。例外情况:同意门(、破坏性操作)绝不会自动回答——在非交互式模式下,请停止并报告被阻止的步骤。这些fallback定义了本技能文档中任何需要“询问用户”/“与用户确认”的场景。
flow debug
- 搭建前先发现目标解决方案——Flow项目必须位于解决方案内(布局始终为双层嵌套:)。在为新Flow运行任何
<Solution>/<Project>/<Project>.flow或uip solution init之前,请运行uip maestro flow init。如果列出一个或多个解决方案,请停止——不要搭建、初始化、删除或修复任何内容。询问用户要使用哪个解决方案(遵循规则#5的下拉菜单形式):每个已发现的解决方案对应一个选项,“创建新解决方案”,最后是**“其他选项”;仅在得到答案后继续。即使用户表示想要新解决方案或仅提供Flow项目名称,此原则依然适用——切勿静默采用现有解决方案,当用户选择“创建新解决方案”时,请询问其名称**,而非默认使用Flow项目名称。如果未找到任何解决方案,请自动创建一个(默认名称为Flow名称,除非用户指定其他名称)。优先采用解决方案优先的方式——此方式适用于所有CLI版本,且允许你独立设置两个名称:find . -maxdepth 2 -type f -name '*.uipx' -print→uip solution init "<SolutionName>" --output json && cd "<SolutionName>" && uip maestro flow init "<FlowName>" --output json,项目会自动注册到父级<SolutionName>/<FlowName>/<FlowName>.flow中(.uipx);Data.SolutionRegistration.Status: "Registered"和<SolutionName>相互独立,无需匹配。在当前CLI版本中,在任何解决方案之外运行<FlowName>会自动搭建uip maestro flow init "<FlowName>",项目位于<FlowName>Solution/<FlowName>Solution.uipx(响应包含<FlowName>Solution/<FlowName>/)——此方式很方便,但会强制使用Data.AutoCreatedSolution名称,因此仅在解决方案名称无关紧要时使用。<FlowName>Solution会退出自动搭建和注册,留下单层嵌套的--skip-solution-registration,这会导致Studio Web上传和打包失败。如果你输入的路径已存在非空目录,init会发出警告并保持目录不变。切勿在<Flow>/<Flow>.flow和solution init之间省略flow init命令——在旧目录中运行cd会自动搭建重复的flow init。完成后应有一个<FlowName>Solution/;删除多余的文件。请参阅author/greenfield.md步骤2。project.uiproj
- 仅当用户选择详细模式时,才用通俗易懂的英语叙述进度——默认静默模式。当用户要求叙述/进度(“带我一步步操作”、“展示你的步骤”、“详细模式”、“请详细说明”)或表示偏好详细信息时,才进行叙述;否则请静默工作,仅展示决策、失败、同意门和最终结果。进行叙述时:每个逻辑步骤用简短的一行,使用用户易懂的术语(“检查你的租户登录状态”、“添加Slack节点并连接其输入”、“运行验证”)——不展示标志级或JSON结构级细节,统一应用于CLI调用、终端内置命令、文件编辑和批量搜索。请参阅shared/ux-narration-and-todos.md §何时进行叙述。
uip - 仅当用户选择进度跟踪/详细模式时,才维护面向用户的进度列表。静默模式下没有面向用户的待办事项列表(代理可私下跟踪)。进行叙述时:任何超出 trivial 阈值的流程都会得到一个粒度化列表——一个逻辑步骤≈一个待办事项,粒度按步骤而非阶段划分。数量由流程的实际步骤决定;无需目标数量。步骤内的终端管道操作(注册表查找、JSON解析、中间文件读取)不可见——请勿作为待办事项展示。请参阅shared/ux-narration-and-todos.md了解触发条件、粒度规则、阈值表和转换规则。
- 每个节点恰好有一个创建者——编辑/写入或CLI,绝不同时使用两者。连接器活动()、连接器触发器(
uipath.connector.<key>.<op>)、等待事件(uipath.connector.trigger.<key>.<trigger>——流程中间的事件等待,配置方式与触发器完全相同)和托管HTTP(uipath.connector.event.<key>.<event>)属于CLI拥有的节点——使用core.action.http.v2+uip maestro flow node add。所有其他节点类型——触发器、控制流、逻辑、HITL、模式、代理、资源节点、队列——属于用户拥有的节点:直接使用uip maestro flow node configure编写EditJSON——或使用.flow,但绝不要对同时包含CLI拥有节点的Flow进行全文件Write(这会覆盖CLI设置的Write/bindings[];请原地inputs.detail,或在最后重新运行Edit)。CLI拥有节点的node configure是inputs.detail包,手动编写会被验证器拒绝。内联代理CLI仅限于代理项目生命周期(=jsonString:essentialConfiguration);uip agent init / refresh / validate --inline-in-flowFlow节点本身属于用户拥有的节点。脚本语言(uipath.agent.autonomous、python、node、jq、sed、内联终端 heredocs)是用户拥有节点编辑的最后手段,且在展示权衡(状态绕过、不透明差异、无中断点)后需要用户明确批准。权威参考来源:author/CAPABILITY.md — 节点所有权(完整表格);author/editing-operations.md — 工具选择优先级(按操作划分的优先级)。awk - 只要数据依赖允许,就将工具调用批量整合到一次助手交互中——最小化实际往返时间。典型的全新构建只需3次交互,而非10+次:(T1) 一次链式调用,用于搭建+注册表拉取+CLI拥有节点的
Bash,同时并行运行node add和registry get调用进行额外发现;(T2) 一次Read调用读取搭建好的Read,同时并行运行.flow/Edit调用添加End节点并连接边;(T3) 一次链式Write调用,用于Bash。在助手消息中:将顺序node configure && validate && format调用用uip链接到单个&&中,并将独立的Bash/Bash/Read调用作为并行工具使用。仅当后续调用确实依赖于先前调用的标准输出或文件变更时,才拆分交互。请参阅author/references/greenfield.md — 三次交互执行图了解标准模式。Edit - 内部的跨节点绑定需要
=js:前缀——裸节点引用在运行时会解析为$vars.。undefined是正确的;"recordId": "=js:$vars.createEntityRecord1.output.Id"(缺少"recordId": "=js:createEntityRecord1.output.Id")会无声地解析为$vars.。模式:undefined,绝不要使用=js:$vars.<nodeId>.output...。请参阅variables-and-expressions.md — IS活动输入需要=js:<nodeId>.output...。=js: - 节点和边的必须以字母开头——绝不能使用裸UUID。边:
id。节点:描述性驼峰式命名。UUID仅用于顶层Flow的edge_<sourceNodeId>_<sourcePort>_<targetNodeId>_<targetPort>/id。entryPointId
Anti-patterns (universal)
通用反模式
- Never use on any
--format jsoncommand — the flag isuip(rule #1).--output jsonproduces--formatand exit code 3 on everyerror: unknown option '--format'subcommand, not a helpful message pointing you atuip.--output - Avoid piping to
uip ... --output json/python3 -cfor simple field extraction — usejqinstead (rule #1). The common failure mode: the agent assumes--output-filter(or another nested shape) and the external parser silently returnsData.Nodesagainst[]'s actual flat array, prompting a second and third retry with different access paths.Datadoes not rescue a wrong-shape guess by itself — a valid expression that doesn't match (e.g.--output-filteragainst the flat array) still returns"Nodes"with exit 0; only an invalid expression (bad syntax, or a type error likeData: []on an array) exits non-zero. The fix is the pinned shape in rule #1, so you write the right expression on call #1. Reserve external parsers for transforms JMESPath cannot express (multi-step joins, format conversion); when in doubt, verify the shape first — see cli-conventions.md §3 for thekeys(@)first-probe sequence (note:type(@)throws on arrays, so usekeys(@)first).type(@) - Never run as a validation step — debug executes the flow with real side effects (rule #2). Use
flow debugfor checking correctness.flow validate - Never silently pick the first match from . When a search returns multiple connectors for the same intent, apply the canonical Connector Disambiguation ladder via connector/planning.md — Disambiguation, which defers to the Integration Service rules.
uip maestro flow registry search - Never conclude "no connection exists" from a bare — discovery requires
uip is connections listand a connector key derived from--all-folders, not a brand name (rule #3). Without both, "No connections found" is a false negative; do not surface it as an Open Question or ask the user to create one.registry search - Never write as a JSON object map — Studio Web's TS port emits
customFieldsRequestDetails.parameterValuesviaMap<string,string|null>, so the on-wire shape isArray.from(entries())tuples. Object-form[[key, value], ...]is rejected by the CLI at validate time. Inner keys are camelCase ({key: value},objectActionName), not PascalCase. See connector/impl.md Step 6c.parameterValues - Never treat a exit code of 0 as "done" when it printed warnings. Warnings are build defects the validator chose not to hard-fail — read every one and resolve it before declaring the flow complete. The connector-keyword warning (
flow validate) means you took the brand-name shortcut (rule #3) — fix it by binding the connector, do not ship past it. A green exit with an unresolved connector warning still fails downstream connector checks and runs against an undefined endpoint at debug time.node "…" mentions the "<connector>" connector keyword but uses the generic Managed HTTP type core.action.http.v2 with no connection binding - Never issue setup or finalization CLI calls one-per-turn. Each separate Bash call adds a model round-trip — the dominant wall-clock cost. Chain them per rule #10 and the Three-turn execution map.
Trouble? If something didn't work as expected, useto send a report./uipath-feedback
- 切勿在任何命令中使用
uip——正确的标志是--format json(规则#1)。--output json会在所有--format子命令中产生uip错误,退出码为3,而非指向error: unknown option '--format'的有用提示。--output - 避免将通过管道传递给
uip ... --output json/python3 -c进行简单字段提取——请改用jq(规则#1)。常见失败模式:代理假设--output-filter(或其他嵌套结构),而外部解析器针对Data.Nodes的实际扁平数组无声地返回Data,导致第二次和第三次重试使用不同的访问路径。[]本身无法拯救错误的结构猜测——与结构不匹配的有效表达式(例如针对扁平数组使用--output-filter)仍会返回"Nodes",退出码为0;只有无效表达式(语法错误,或类型错误如对数组使用Data: [])才会返回非零退出码。解决方法是规则#1中固定的结构,因此你可以在第一次调用时编写正确的表达式。仅在JMESPath无法实现的转换(多步骤连接、格式转换)时使用外部解析器;如有疑问,请先验证结构——请参阅cli-conventions.md §3了解keys(@)首次探测序列(注意:type(@)会对数组抛出错误,因此请先使用keys(@))。type(@) - 切勿将作为验证步骤运行——debug会执行Flow并产生实际副作用(规则#2)。请使用
flow debug检查正确性。flow validate - 切勿静默选择返回的第一个匹配项。当搜索返回多个满足同一意图的连接器时,请通过connector/planning.md — 消歧应用标准连接器消歧优先级,该优先级遵循集成服务规则。
uip maestro flow registry search - 切勿从裸得出“无连接存在”的结论——发现需要
uip is connections list和从--all-folders得出的连接器密钥,而非品牌名称(规则#3)。如果不同时满足这两个条件,“未找到连接”是假阴性;请勿将其作为未解决问题展示或要求用户创建连接。registry search - 切勿将编写为JSON对象映射——Studio Web的TS端口通过
customFieldsRequestDetails.parameterValues发出Array.from(entries()),因此线上格式是Map<string,string|null>元组。对象形式[[key, value], ...]会在验证时被CLI拒绝。内部键为驼峰式命名({key: value}、objectActionName),而非PascalCase。请参阅connector/impl.md 步骤6c。parameterValues - 切勿将退出码0视为“完成”,如果它打印了警告。警告是验证器选择不强制失败的构建缺陷——请阅读每个警告并在宣布Flow完成前解决。连接器关键字警告(
flow validate)意味着你使用了品牌名称捷径(规则#3)——请通过绑定连接器修复,切勿忽略它。即使退出码为0但存在未解决的连接器警告,下游连接器检查仍会失败,且在debug时会针对未定义的端点运行。node "…" mentions the "<connector>" connector keyword but uses the generic Managed HTTP type core.action.http.v2 with no connection binding - 切勿逐个交互发出设置或最终CLI调用。每个单独的Bash调用都会增加模型往返时间——这是实际耗时的主要来源。请按照规则#10和三次交互执行图将它们链接起来。
遇到问题? 如果未按预期工作,请使用发送报告。/uipath-feedback