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.
These rules apply across all three capabilities. Each capability index adds capability-scoped rules on top.
-
ALWAYS use --output json on all uip commands when parsing output programmatically.
-
Do NOT run flow debug without explicit user consent — debug executes the flow for real (sends emails, posts messages, calls APIs).
-
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:
- Tenant registry search —
uip maestro flow registry search "<name>" --output json. Requires uip login; returns published resources.
- In-solution local discovery —
uip maestro flow registry list --local --output json. No login required; returns sibling projects in the same .uipx solution.
- 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).
-
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.), use the AskUserQuestion tool 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.
-
A Flow project MUST live inside a solution — always scaffold the solution first (uip solution new <Name>), then cd <Name> and run uip maestro flow init <Name>. The correct layout is always <Solution>/<Project>/<Project>.flow (double-nested). Running uip maestro flow init in a bare directory produces a single-nested <Project>/<Project>.flow layout that fails Studio Web upload, packaging, and downstream tooling. See author/greenfield.md Step 2.
-
Always narrate progress in plain English at each logical step boundary. One short line per step, in user terms ("checking your tenant login", "adding the Slack node and wiring its inputs", "editing the flow JSON to add the new variable", "running validate") — no flag-level or JSON-structure-level detail. Applies uniformly to uip CLI calls, shell builtins (ls, cat, cd, mkdir, find, grep), file edits (Read/Write/Edit), and bulk searches (Glob/Grep). The user should never need to know bash, uip flags, or .flow JSON internals to follow along. See shared/ux-narration-and-todos.md.
-
Use TodoWrite for any journey above the trivial threshold; keep granularity per-step, not per-phase. Standard journeys (greenfield, brownfield with multiple nodes, ship, run, full diagnose) require a granular todo list (~15–25 items). One logical step ≈ one todo. 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 granularity rules, threshold table, and pivot rules.
-
Use Edit / Write for every non-carve-out mutation of a .flow file. The uip maestro flow node / edge / variable CLI is a carve-out, not an opt-in alternative. Use Flow mutation CLI only for connector activity, connector-trigger, and managed HTTP workflows where the plugin documents that CLI commands populate product-managed state such as inputs.detail, bindings_v2.json, or connection resources. For OOTB structural edits — node add/remove, edge add/remove, variables, subflows, trigger swaps, in-place input updates, and inline-agent node/wiring — author the .flow JSON directly with Edit / Write. Inline-agent CLI is limited to agent project lifecycle commands (uip agent init --inline-in-flow, uip agent validate --inline-in-flow); after the inline agent has a ProjectId, add the uipath.agent.autonomous node with inputs.source = <ProjectId> and wire its edges directly in the .flow. Use Write for wholesale rewrites only when ≥70% of nodes change. Scripting languages (python, node, jq, sed, awk, inline shell heredocs) are a last resort and require explicit user approval after the trade-offs (state bypass, opaque diff, no interruption point) have been surfaced. See author/editing-operations.md — Tool Selection Ladder for the per-operation tool ladder and the rationale.