uipath-maestro-flow

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

UiPath Flow Skill

UiPath Flow Skill

Comprehensive guide for creating, editing, validating, debugging, publishing, diagnosing, and evaluating UiPath Flow projects using the
uip
CLI and
.flow
file format. The skill is organized into four capabilities — Author, Operate, Diagnose, Evaluate — each with its own index doc.
本指南全面介绍如何使用
uip
CLI和
.flow
文件格式创建、编辑、验证、调试、发布、诊断和评估UiPath Flow项目。该技能分为四大能力模块——创作(Author)运维(Operate)诊断(Diagnose)评估(Evaluate),每个模块都有对应的索引文档。

When to use this skill

何时使用本技能

Author — building or editing a
.flow
file. Read references/author/CAPABILITY.md.
<!--skill-flavor:project-creation-scope:start-->
  • Create a new Flow project (
    uip maestro flow init
    )
<!--skill-flavor:project-creation-scope:end-->
  • Edit a
    .flow
    file — add nodes, edges, variables, subflows, transforms, triggers
  • 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
    )
<!--skill-flavor:upload-scope-bullets:end-->
  • 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
    flow debug
    or deployed process run
  • 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
    ,
    llm-judge-*
    ) for a Flow project
  • Create eval sets, add data points (test cases), pin entry points
  • Start Studio Web eval runs, poll status, fetch results, compare runs
<!--skill-flavor:upload-eval-scope-bullet:start-->
  • Decide whether to call
    uip solution upload
    (almost always: don't auto-run; ask first)
<!--skill-flavor:upload-eval-scope-bullet:end-->
创作——构建或编辑
.flow
文件。阅读references/author/CAPABILITY.md
<!--skill-flavor:project-creation-scope:start-->
  • 创建新的Flow项目(
    uip maestro flow init
<!--skill-flavor:project-creation-scope:end-->
  • 编辑
    .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
<!--skill-flavor:upload-scope-bullets:end-->
  • 针对真实系统端到端调试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评估运行、轮询状态、获取结果、对比运行情况
<!--skill-flavor:upload-eval-scope-bullet:start-->
  • 决定是否调用
    uip solution upload
    (几乎总是:不要自动运行;先询问用户)
<!--skill-flavor:upload-eval-scope-bullet:end-->

Capability router

能力模块导航

I want to...Read
Create a new flow or edit an existing onereferences/author/CAPABILITY.md
Publish, deploy, debug, or manage a flow's lifecyclereferences/operate/CAPABILITY.md
Diagnose a failed or misbehaving flow runreferences/diagnose/CAPABILITY.md
Design and run evaluations (
uip maestro flow eval
)
references/evaluate/CAPABILITY.md
Look up CLI command syntaxreferences/shared/cli-commands.md
Look up CLI conventions (
--output json
,
--output-filter
, login, FOLDER_KEY)
references/shared/cli-conventions.md
Understand the
.flow
JSON format
references/shared/file-format.md
Understand variables and
=js:
expressions
references/shared/variables-and-expressions.md
Wire one node's output into another node's inputreferences/shared/node-output-wiring.md
Look up action-node boilerplate shared across plugin
impl.md
s
references/shared/action-nodes.md
Narrate progress + maintain todos (opt-in — when user wants verbosity)references/shared/ux-narration-and-todos.md
我想要...阅读文档
创建新Flow或编辑现有Flowreferences/author/CAPABILITY.md
发布、部署、调试或管理Flow的生命周期references/operate/CAPABILITY.md
诊断失败或运行异常的Flow任务references/diagnose/CAPABILITY.md
设计并运行评估(
uip maestro flow eval
references/evaluate/CAPABILITY.md
查阅CLI命令语法references/shared/cli-commands.md
查阅CLI约定(
--output json
--output-filter
、登录、FOLDER_KEY)
references/shared/cli-conventions.md
了解
.flow
JSON格式
references/shared/file-format.md
了解变量和
=js:
表达式
references/shared/variables-and-expressions.md
将一个节点的输出连接到另一个节点的输入references/shared/node-output-wiring.md
查阅插件
impl.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:
Edit
= in-place string replacement,
Write
= full-file write,
Read
/
Glob
/
Grep
= file read/search,
Bash
= 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.
  1. ALWAYS use
    --output json
    and prefer
    --output-filter
    for extraction
    on all
    uip
    commands when parsing output programmatically.
    --output-filter <jmespath>
    is a global CLI flag applied to the
    Data
    envelope before printing — write expressions starting at
    Data
    (no
    Data.
    prefix). Canonical recipe:
    uip maestro flow registry search <keyword> --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"
    .
    registry search
    returns
    Data
    as a flat array of PascalCase objects (
    NodeType
    ,
    DisplayName
    ,
    Description
    ,
    AvailableOnTenant
    ) — NOT
    Data.Nodes
    , lowercase
    type
    , or lowercase
    category
    . With
    --local
    ,
    AvailableOnTenant
    is omitted (no tenant lookup) — drop it from the projection. External parsers (
    python3 -c
    ,
    jq
    ) 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.
  2. Do NOT run
    flow debug
    without explicit user consent
    — debug executes the flow for real (sends emails, posts messages, calls APIs).
  3. 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:
    1. Pull, then search the tenant registry
      uip maestro flow registry pull --force && uip maestro flow registry search "<name>" --output json
      . Always pull first:
      search
      reads the local cache (populated by
      pull
      , expires after 30 min), so a search before a fresh pull can return empty for a resource that exists. Requires
      uip login
      ; returns published resources.
    2. In-solution local discovery
      uip maestro flow registry list --local --output json
      , or
      uip maestro flow registry search "<name>" --local --output json
      for keyword match. No login required; returns sibling projects in the same
      .uipx
      solution. An empty
      search --local
      is not proof of absence (the keyword may not match the project's naming) — confirm with
      list --local
      before concluding the resource is not in the solution.
    3. 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".
    uipath.agent.autonomous
    (inline) is only correct when the user explicitly asks to embed/inline/create a new agent inside this flow. Only use
    core.logic.mock
    when the resource is not in the same solution and not yet published. See the relevant resource plugin's
    impl.md
    (e.g., rpa, agent).
    The same "search before deciding it doesn't exist" discipline applies to connector connections. The connector key MUST come from a
    registry search
    node type (
    uipath.connector.<connector-key>.<activity>
    ) — 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. Any
    uip is connections list
    used for discovery MUST pass
    --all-folders
    . An empty result from an unverified key or without
    --all-folders
    is a false negative, never authoritative — do not conclude "no connection exists" or ask the user to create one until both hold.
    It 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), run
    uip maestro flow registry search "<service>" --output json
    and follow the Selecting External Service Nodes ladder (connector → managed HTTP → RPA). Manual
    core.action.http.v2
    is 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).
    Two 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-mode
    core.action.http.v2
    node whose
    url
    targets a well-known SaaS API domain that has a connector (
    slack.com/api/*
    ,
    api.github.com
    ,
    *.salesforce.com
    ,
    graph.microsoft.com
    , …); (b) you declared an
    in
    variable to hold that service's API token or secret (e.g. a
    slackToken
    holding an
    xoxb-…
    bot token, an
    apiKey
    , a bearer token). A connector-backed flow never carries the raw credential — the IS connection does. If you find yourself writing either, stop: run
    uip maestro flow registry search "<service>"
    and
    uip is connections list "<connector-key>" --all-folders
    , then use the connector activity (or connector-mode HTTP:
    authentication:"connector"
    +
    targetConnector
    + a bound
    connectionId
    /
    folderKey
    ). Manual mode is legitimate only for a service the search proves has no connector.
  4. 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.
  5. 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 (
    flow debug
    , 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.
<!--skill-flavor:project-creation:start-->
  1. Discover the target solution before you scaffold — a Flow project MUST live inside a solution (layout is always double-nested:
    <Solution>/<Project>/<Project>.flow
    ). Before any
    uip solution init
    or
    uip maestro flow init
    for a NEW Flow, run
    find . -maxdepth 2 -type f -name '*.uipx' -print
    . 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:
    uip solution init "<SolutionName>" --output json && cd "<SolutionName>" && uip maestro flow init "<FlowName>" --output json
    <SolutionName>/<FlowName>/<FlowName>.flow
    , with the project auto-registered in the parent
    .uipx
    (
    Data.SolutionRegistration.Status: "Registered"
    );
    <SolutionName>
    and
    <FlowName>
    are independent and need not match. On a current CLI, running
    uip maestro flow init "<FlowName>"
    outside any solution instead auto-scaffolds
    <FlowName>Solution/<FlowName>Solution.uipx
    with the project at
    <FlowName>Solution/<FlowName>/
    (response carries
    Data.AutoCreatedSolution
    ) — convenient, but it forces the
    <FlowName>Solution
    name, so use it only when the solution name doesn't matter.
    --skip-solution-registration
    opts out of both auto-scaffold and registration, leaving a bare single-nested
    <Flow>/<Flow>.flow
    that 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
    cd
    between
    solution init
    and
    flow init
    flow init
    in the old directory auto-scaffolds a duplicate
    <FlowName>Solution/
    . One
    project.uiproj
    at finish; delete strays. See author/greenfield.md Step 2.
<!--skill-flavor:project-creation:end-->
  1. 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
    uip
    CLI calls, shell builtins, file edits, and bulk searches. See shared/ux-narration-and-todos.md §When to engage.
  2. 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.
  3. Every node has exactly one author — Edit/Write or CLI, never both. Connector activities (
    uipath.connector.<key>.<op>
    ), connector triggers (
    uipath.connector.trigger.<key>.<trigger>
    ), wait for events (
    uipath.connector.event.<key>.<event>
    — a mid-flow event wait, configured exactly like a trigger), and managed HTTP (
    core.action.http.v2
    ) are CLI-owned — use
    uip maestro flow node add
    +
    uip maestro flow node configure
    . Every other node type — triggers, control flow, logic, HITL, patterns, agents, resource nodes, queue — is user-owned: author the
    .flow
    JSON directly with
    Edit
    — or
    Write
    , but never a full-file
    Write
    on a flow that also contains CLI-owned nodes (it clobbers their CLI-set
    bindings[]
    /
    inputs.detail
    ;
    Edit
    in place, or re-run
    node configure
    as the last step).
    inputs.detail
    on CLI-owned nodes is a
    =jsonString:essentialConfiguration
    envelope that the validator rejects when hand-authored. Inline-agent CLI is limited to agent project lifecycle (
    uip agent init / refresh / validate --inline-in-flow
    ); the
    uipath.agent.autonomous
    flow node itself is user-owned. Scripting languages (
    python
    ,
    node
    ,
    jq
    ,
    sed
    ,
    awk
    , 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).
  4. 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
    Bash
    for scaffold + registry pull + CLI-owned
    node add
    , in parallel with
    registry get
    and
    Read
    calls for any extra discovery; (T2) one
    Read
    of the scaffolded
    .flow
    in parallel with the
    Edit
    /
    Write
    calls that add the End node and wire edges; (T3) one chained
    Bash
    for
    node configure && validate && format
    . Within an assistant message: chain sequential
    uip
    calls with
    &&
    in a single
    Bash
    , and emit independent
    Bash
    /
    Read
    /
    Edit
    calls 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.
  5. Cross-node bindings inside
    =js:
    need the
    $vars.
    prefix — a bare node reference resolves to
    undefined
    at runtime.
    "recordId": "=js:$vars.createEntityRecord1.output.Id"
    is correct;
    "recordId": "=js:createEntityRecord1.output.Id"
    (missing
    $vars.
    ) silently resolves to
    undefined
    . Pattern:
    =js:$vars.<nodeId>.output...
    , never
    =js:<nodeId>.output...
    . See variables-and-expressions.md — IS Activity Inputs Require
    =js:
    .
  6. Node and edge
    id
    s MUST start with a letter — never a bare UUID.
    Edges:
    edge_<sourceNodeId>_<sourcePort>_<targetNodeId>_<targetPort>
    . Nodes: descriptive camelCase. UUIDs only for the top-level flow
    id
    /
    entryPointId
    .
这些规则适用于所有三个能力模块。每个能力模块的索引文档会在此基础上添加模块专属规则。
工具术语说明:本技能中的工具名称遵循Claude Code约定:
Edit
= 原地字符串替换,
Write
= 全文件写入,
Read
/
Glob
/
Grep
= 文件读取/搜索,
Bash
= 终端,进度列表 = 工具的任务列表。在其他工具环境中,请将每个术语映射为对应的功能——语义(可审核的原地差异与整体重写、终端作为文件编辑的最后手段)保持不变。
  1. 程序化解析输出时,所有
    uip
    命令必须使用
    --output json
    ,优先使用
    --output-filter
    进行提取
    --output-filter <jmespath>
    是全局CLI标志,会在打印前应用于
    Data
    包——编写表达式时从
    Data
    开始(无需
    Data.
    前缀)。标准示例:
    uip maestro flow registry search <keyword> --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"
    registry search
    返回的
    Data
    PascalCase对象的扁平数组
    NodeType
    DisplayName
    Description
    AvailableOnTenant
    )——不是
    Data.Nodes
    、小写
    type
    或小写
    category
    。使用
    --local
    时,
    AvailableOnTenant
    会被省略(无需租户查询)——请从投影中移除该字段。外部解析器(
    python3 -c
    jq
    )仍适用于JMESPath无法实现的转换;仅在确认数据结构后再使用它们。完整机制、 fallback 指南和结构探测方法:cli-conventions.md §3
  2. 未经用户明确同意,不得运行
    flow debug
    ——debug会实际执行Flow(发送邮件、发布消息、调用API)。
  3. 资源发现顺序——先搜索再创建。当提示中按名称引用现有资源(“使用X代理”、“调用Y API工作流”、“触发Z RPA流程”)时,在确定资源不存在前,请严格遵循以下顺序:
    1. 拉取租户注册表,然后搜索——
      uip maestro flow registry pull --force && uip maestro flow registry search "<name>" --output json
      。务必先拉取:
      search
      读取本地缓存(由
      pull
      填充,30分钟后过期),因此在重新拉取前进行搜索可能会返回空结果,即使资源实际存在。需要
      uip login
      ;返回已发布的资源。
    2. 解决方案内本地发现——
      uip maestro flow registry list --local --output json
      ,或使用
      uip maestro flow registry search "<name>" --local --output json
      进行关键词匹配。无需登录;返回同一
      .uipx
      解决方案中的同级项目。
      search --local
      返回空结果并不代表资源不存在(关键词可能与项目名称不匹配)——在得出资源不在解决方案中的结论前,请用
      list --local
      确认。
    3. 仅在此时创建/搭建——仅当两次搜索均无结果,且用户明确要求嵌入/内联/创建,或没有已发布资源能满足需求时,才搭建内联代理、模拟资源或创建新资源。
    “编码”和“低代码”描述的是已发布代理的实现风格——它们不是“内联”的同义词。仅当用户明确要求在此Flow中嵌入/内联/创建新代理时,才使用
    uipath.agent.autonomous
    (内联)。仅当资源不在同一解决方案中且尚未发布时,才使用
    core.logic.mock
    。请参阅相关资源插件的
    impl.md
    (例如:rpaagent)。
    “先搜索再确定不存在”的原则同样适用于连接器连接。连接器密钥必须来自
    registry search
    节点类型(
    uipath.connector.<connector-key>.<activity>
    )——绝不能从服务品牌名称推断。注册表密钥的前缀或限定方式通常与产品名称不同,因此猜测的密钥会无声地错过真正的连接器。用于发现的任何
    uip is connections list
    必须传递
    --all-folders
    。未验证的密钥或未使用
    --all-folders
    返回的空结果是假阴性,绝不能作为权威结论——在同时满足两个条件前,不得得出“无连接存在”的结论或要求用户创建连接。
    此原则也适用于提示中提及的任何外部服务——不仅仅是租户内资源。在为指定服务(Slack、open-meteo、Stripe、任何REST API)选择节点类型前,请运行
    uip maestro flow registry search "<service>" --output json
    并遵循选择外部服务节点优先级(连接器→托管HTTP→RPA)。手动
    core.action.http.v2
    是优先级最低的选项,仅在搜索未找到连接器时才选择——绝不能从品牌名称直接猜测。即使跳过完整规划,此原则依然适用(请参阅greenfield.md — 为每个外部服务选择节点类型)。
    两个表明你跳过搜索并使用品牌名称捷径的迹象——均为构建缺陷,而非有效的手动模式HTTP:(a) 你编写了手动模式
    core.action.http.v2
    节点,其
    url
    指向知名SaaS API域名且该域名已有连接器(
    slack.com/api/*
    api.github.com
    *.salesforce.com
    graph.microsoft.com
    等);(b) 你声明了
    in
    变量来存储该服务的API令牌或密钥(例如存储
    xoxb-…
    机器人令牌的
    slackToken
    apiKey
    、Bearer令牌)。基于连接器的Flow绝不会携带原始凭据——凭据由IS连接管理。如果你发现自己正在编写上述任何一种情况,请停止:运行
    uip maestro flow registry search "<service>"
    uip is connections list "<connector-key>" --all-folders
    ,然后使用连接器活动(或连接器模式HTTP:
    authentication:"connector"
    +
    targetConnector
    +绑定的
    connectionId
    /
    folderKey
    )。仅当搜索证明服务没有连接器时,手动模式才是合理的。
  4. 切勿自动调用其他技能——当Flow需要RPA流程、代理或应用时,请指出缺口并提供交接说明。让用户决定何时切换技能。
  5. 始终将用户问题以下拉菜单形式呈现,并提供“其他选项”作为退路——每当本技能需要用户做出决策(使用哪个解决方案、发布/调试/部署、选择哪个连接器、选择哪种触发器类型、绑定哪个资源等)时,请向用户提出问题,列出枚举选项作为选择,并将**“其他选项”**作为最后一个选项,以便用户提供自由格式的字符串输入。当存在合理的有限默认选项集时,切勿在聊天中提出开放式问题。如果用户选择“其他选项”,请解析其字符串答案并继续。如果工具不支持结构化提问功能,请在聊天中以编号列表形式提问,并将“其他选项”放在最后。非交互式运行(CI/无头模式——无用户可回答)→ 选择预先选定/推荐的选项,继续执行,并在最终报告中突出记录决策;如果没有标记为推荐的选项,请停止并报告未解决的决策,而非猜测。例外情况:同意门(
    flow debug
    、破坏性操作)绝不会自动回答——在非交互式模式下,请停止并报告被阻止的步骤。这些fallback定义了本技能文档中任何需要“询问用户”/“与用户确认”的场景。
<!--skill-flavor:project-creation:start-->
  1. 搭建前先发现目标解决方案——Flow项目必须位于解决方案内(布局始终为双层嵌套:
    <Solution>/<Project>/<Project>.flow
    )。在为新Flow运行任何
    uip solution init
    uip maestro flow init
    之前,请运行
    find . -maxdepth 2 -type f -name '*.uipx' -print
    如果列出一个或多个解决方案,请停止——不要搭建、初始化、删除或修复任何内容。询问用户要使用哪个解决方案(遵循规则#5的下拉菜单形式):每个已发现的解决方案对应一个选项,“创建新解决方案”,最后是**“其他选项”;仅在得到答案后继续。即使用户表示想要新解决方案或仅提供Flow项目名称,此原则依然适用——切勿静默采用现有解决方案,当用户选择“创建新解决方案”时,请询问其名称**,而非默认使用Flow项目名称。如果未找到任何解决方案,请自动创建一个(默认名称为Flow名称,除非用户指定其他名称)。优先采用解决方案优先的方式——此方式适用于所有CLI版本,且允许你独立设置两个名称:
    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>
    <FlowName>
    相互独立,无需匹配。在当前CLI版本中,在任何解决方案之外运行
    uip maestro flow init "<FlowName>"
    会自动搭建
    <FlowName>Solution/<FlowName>Solution.uipx
    ,项目位于
    <FlowName>Solution/<FlowName>/
    (响应包含
    Data.AutoCreatedSolution
    )——此方式很方便,但会强制使用
    <FlowName>Solution
    名称,因此仅在解决方案名称无关紧要时使用。
    --skip-solution-registration
    会退出自动搭建和注册,留下单层嵌套的
    <Flow>/<Flow>.flow
    ,这会导致Studio Web上传和打包失败。如果你输入的路径已存在非空目录,init会发出警告并保持目录不变。切勿在
    solution init
    flow init
    之间省略
    cd
    命令
    ——在旧目录中运行
    flow init
    会自动搭建重复的
    <FlowName>Solution/
    。完成后应有一个
    project.uiproj
    ;删除多余的文件。请参阅author/greenfield.md步骤2。
<!--skill-flavor:project-creation:end-->
  1. 仅当用户选择详细模式时,才用通俗易懂的英语叙述进度——默认静默模式。当用户要求叙述/进度(“带我一步步操作”、“展示你的步骤”、“详细模式”、“请详细说明”)或表示偏好详细信息时,才进行叙述;否则请静默工作,仅展示决策、失败、同意门和最终结果。进行叙述时:每个逻辑步骤用简短的一行,使用用户易懂的术语(“检查你的租户登录状态”、“添加Slack节点并连接其输入”、“运行验证”)——不展示标志级或JSON结构级细节,统一应用于
    uip
    CLI调用、终端内置命令、文件编辑和批量搜索。请参阅shared/ux-narration-and-todos.md §何时进行叙述。
  2. 仅当用户选择进度跟踪/详细模式时,才维护面向用户的进度列表。静默模式下没有面向用户的待办事项列表(代理可私下跟踪)。进行叙述时:任何超出 trivial 阈值的流程都会得到一个粒度化列表——一个逻辑步骤≈一个待办事项,粒度按步骤而非阶段划分。数量由流程的实际步骤决定;无需目标数量。步骤内的终端管道操作(注册表查找、JSON解析、中间文件读取)不可见——请勿作为待办事项展示。请参阅shared/ux-narration-and-todos.md了解触发条件、粒度规则、阈值表和转换规则。
  3. 每个节点恰好有一个创建者——编辑/写入或CLI,绝不同时使用两者。连接器活动(
    uipath.connector.<key>.<op>
    )、连接器触发器(
    uipath.connector.trigger.<key>.<trigger>
    )、等待事件(
    uipath.connector.event.<key>.<event>
    ——流程中间的事件等待,配置方式与触发器完全相同)和托管HTTP(
    core.action.http.v2
    )属于CLI拥有的节点——使用
    uip maestro flow node add
    +
    uip maestro flow node configure
    。所有其他节点类型——触发器、控制流、逻辑、HITL、模式、代理、资源节点、队列——属于用户拥有的节点:直接使用
    Edit
    编写
    .flow
    JSON——或使用
    Write
    ,但绝不要对同时包含CLI拥有节点的Flow进行全文件
    Write
    (这会覆盖CLI设置的
    bindings[]
    /
    inputs.detail
    ;请原地
    Edit
    ,或在最后重新运行
    node configure
    )。CLI拥有节点的
    inputs.detail
    =jsonString:essentialConfiguration
    包,手动编写会被验证器拒绝。内联代理CLI仅限于代理项目生命周期(
    uip agent init / refresh / validate --inline-in-flow
    );
    uipath.agent.autonomous
    Flow节点本身属于用户拥有的节点。脚本语言(
    python
    node
    jq
    sed
    awk
    、内联终端 heredocs)是用户拥有节点编辑的最后手段,且在展示权衡(状态绕过、不透明差异、无中断点)后需要用户明确批准。权威参考来源author/CAPABILITY.md — 节点所有权(完整表格);author/editing-operations.md — 工具选择优先级(按操作划分的优先级)。
  4. 只要数据依赖允许,就将工具调用批量整合到一次助手交互中——最小化实际往返时间。典型的全新构建只需3次交互,而非10+次:(T1) 一次链式
    Bash
    调用,用于搭建+注册表拉取+CLI拥有节点的
    node add
    ,同时并行运行
    registry get
    Read
    调用进行额外发现;(T2) 一次
    Read
    调用读取搭建好的
    .flow
    ,同时并行运行
    Edit
    /
    Write
    调用添加End节点并连接边;(T3) 一次链式
    Bash
    调用,用于
    node configure && validate && format
    。在助手消息中:将顺序
    uip
    调用用
    &&
    链接到单个
    Bash
    中,并将独立的
    Bash
    /
    Read
    /
    Edit
    调用作为并行工具使用。仅当后续调用确实依赖于先前调用的标准输出或文件变更时,才拆分交互。请参阅author/references/greenfield.md — 三次交互执行图了解标准模式。
  5. =js:
    内部的跨节点绑定需要
    $vars.
    前缀——裸节点引用在运行时会解析为
    undefined
    "recordId": "=js:$vars.createEntityRecord1.output.Id"
    是正确的;
    "recordId": "=js:createEntityRecord1.output.Id"
    (缺少
    $vars.
    )会无声地解析为
    undefined
    。模式:
    =js:$vars.<nodeId>.output...
    ,绝不要使用
    =js:<nodeId>.output...
    。请参阅variables-and-expressions.md — IS活动输入需要
    =js:
  6. 节点和边的
    id
    必须以字母开头——绝不能使用裸UUID
    。边:
    edge_<sourceNodeId>_<sourcePort>_<targetNodeId>_<targetPort>
    。节点:描述性驼峰式命名。UUID仅用于顶层Flow的
    id
    /
    entryPointId

Anti-patterns (universal)

通用反模式

  • Never use
    --format json
    on any
    uip
    command
    — the flag is
    --output json
    (rule #1).
    --format
    produces
    error: unknown option '--format'
    and exit code 3 on every
    uip
    subcommand, not a helpful message pointing you at
    --output
    .
  • Avoid piping
    uip ... --output json
    to
    python3 -c
    /
    jq
    for simple field extraction
    — use
    --output-filter
    instead (rule #1). The common failure mode: the agent assumes
    Data.Nodes
    (or another nested shape) and the external parser silently returns
    []
    against
    Data
    's actual flat array, prompting a second and third retry with different access paths.
    --output-filter
    does not rescue a wrong-shape guess by itself — a valid expression that doesn't match (e.g.
    "Nodes"
    against the flat array) still returns
    Data: []
    with exit 0; only an invalid expression (bad syntax, or a type error like
    keys(@)
    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 the
    type(@)
    first-probe sequence (note:
    keys(@)
    throws on arrays, so use
    type(@)
    first).
  • Never run
    flow debug
    as a validation step
    — debug executes the flow with real side effects (rule #2). Use
    flow validate
    for checking correctness.
  • Never silently pick the first match from
    uip maestro flow registry search
    .
    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.
  • Never conclude "no connection exists" from a bare
    uip is connections list
    — discovery requires
    --all-folders
    and a connector key derived from
    registry search
    , 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.
  • Never write
    customFieldsRequestDetails.parameterValues
    as a JSON object map
    — Studio Web's TS port emits
    Map<string,string|null>
    via
    Array.from(entries())
    , so the on-wire shape is
    [[key, value], ...]
    tuples. Object-form
    {key: value}
    is rejected by the CLI at validate time. Inner keys are camelCase (
    objectActionName
    ,
    parameterValues
    ), not PascalCase. See connector/impl.md Step 6c.
  • Never treat a
    flow validate
    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 (
    node "…" mentions the "<connector>" connector keyword but uses the generic Managed HTTP type core.action.http.v2 with no connection binding
    ) 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.
  • 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, use
/uipath-feedback
to send a report.
  • 切勿在任何
    uip
    命令中使用
    --format json
    ——正确的标志是
    --output json
    (规则#1)。
    --format
    会在所有
    uip
    子命令中产生
    error: unknown option '--format'
    错误,退出码为3,而非指向
    --output
    的有用提示。
  • 避免将
    uip ... --output json
    通过管道传递给
    python3 -c
    /
    jq
    进行简单字段提取
    ——请改用
    --output-filter
    (规则#1)。常见失败模式:代理假设
    Data.Nodes
    (或其他嵌套结构),而外部解析器针对
    Data
    的实际扁平数组无声地返回
    []
    ,导致第二次和第三次重试使用不同的访问路径。
    --output-filter
    本身无法拯救错误的结构猜测——与结构不匹配的有效表达式(例如针对扁平数组使用
    "Nodes"
    )仍会返回
    Data: []
    ,退出码为0;只有无效表达式(语法错误,或类型错误如对数组使用
    keys(@)
    )才会返回非零退出码。解决方法是规则#1中固定的结构,因此你可以在第一次调用时编写正确的表达式。仅在JMESPath无法实现的转换(多步骤连接、格式转换)时使用外部解析器;如有疑问,请先验证结构——请参阅cli-conventions.md §3了解
    type(@)
    首次探测序列(注意:
    keys(@)
    会对数组抛出错误,因此请先使用
    type(@)
    )。
  • 切勿将
    flow debug
    作为验证步骤运行
    ——debug会执行Flow并产生实际副作用(规则#2)。请使用
    flow validate
    检查正确性。
  • 切勿静默选择
    uip maestro flow registry search
    返回的第一个匹配项
    。当搜索返回多个满足同一意图的连接器时,请通过connector/planning.md — 消歧应用标准连接器消歧优先级,该优先级遵循集成服务规则。
  • 切勿从裸
    uip is connections list
    得出“无连接存在”的结论
    ——发现需要
    --all-folders
    和从
    registry search
    得出的连接器密钥,而非品牌名称(规则#3)。如果不同时满足这两个条件,“未找到连接”是假阴性;请勿将其作为未解决问题展示或要求用户创建连接。
  • 切勿将
    customFieldsRequestDetails.parameterValues
    编写为JSON对象映射
    ——Studio Web的TS端口通过
    Array.from(entries())
    发出
    Map<string,string|null>
    ,因此线上格式是
    [[key, value], ...]
    元组。对象形式
    {key: value}
    会在验证时被CLI拒绝。内部键为驼峰式命名(
    objectActionName
    parameterValues
    ),而非PascalCase。请参阅connector/impl.md 步骤6c
  • 切勿将
    flow validate
    退出码0视为“完成”,如果它打印了警告
    。警告是验证器选择不强制失败的构建缺陷——请阅读每个警告并在宣布Flow完成前解决。连接器关键字警告(
    node "…" mentions the "<connector>" connector keyword but uses the generic Managed HTTP type core.action.http.v2 with no connection binding
    )意味着你使用了品牌名称捷径(规则#3)——请通过绑定连接器修复,切勿忽略它。即使退出码为0但存在未解决的连接器警告,下游连接器检查仍会失败,且在debug时会针对未定义的端点运行。
  • 切勿逐个交互发出设置或最终CLI调用。每个单独的Bash调用都会增加模型往返时间——这是实际耗时的主要来源。请按照规则#10和三次交互执行图将它们链接起来。
遇到问题? 如果未按预期工作,请使用
/uipath-feedback
发送报告。