@uipath/skills 1.204.0 → 1.204.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/CODEOWNERS +12 -14
- package/package.json +1 -1
- package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -3
- package/skills/uipath-agents/references/coded/quickstart.md +0 -2
- package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +10 -8
- package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +1 -1
- package/skills/uipath-human-in-the-loop/SKILL.md +1 -3
- package/skills/uipath-human-in-the-loop/references/hitl-node-apptask.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-coded-action-app.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-quickform.md +2 -2
- package/skills/uipath-maestro-flow/.maintenance/README.md +265 -0
- package/skills/uipath-maestro-flow/.maintenance/check-all.sh +40 -0
- package/skills/uipath-maestro-flow/.maintenance/check-anchors.sh +101 -0
- package/skills/uipath-maestro-flow/.maintenance/check-depth.sh +132 -0
- package/skills/uipath-maestro-flow/.maintenance/check-link-text.sh +123 -0
- package/skills/uipath-maestro-flow/.maintenance/check-links.sh +73 -0
- package/skills/uipath-maestro-flow/.maintenance/check-orphans.sh +93 -0
- package/skills/uipath-maestro-flow/.maintenance/check-plugin-pairs.sh +39 -0
- package/skills/uipath-maestro-flow/.maintenance/check-template.sh +42 -0
- package/skills/uipath-maestro-flow/.maintenance/check-uip-commands.sh +270 -0
- package/skills/uipath-maestro-flow/.maintenance/check-versions.sh +160 -0
- package/skills/uipath-maestro-flow/SKILL.md +69 -886
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +207 -0
- package/skills/uipath-maestro-flow/references/author/brownfield.md +91 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-cli.md +190 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-json.md +374 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations.md +104 -0
- package/skills/uipath-maestro-flow/references/author/greenfield.md +420 -0
- package/skills/uipath-maestro-flow/references/author/planning-arch.md +364 -0
- package/skills/uipath-maestro-flow/references/author/planning-impl.md +291 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/impl.md +237 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/planning.md +97 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/impl.md +108 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/impl.md +171 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/planning.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl-inline.md +120 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl.md +463 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/planning.md +186 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/impl.md +517 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/impl.md +309 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/planning.md +133 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/impl.md +428 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/planning.md +188 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/impl.md +83 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/planning.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/impl.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/planning.md +53 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/planning.md +28 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/planning.md +58 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/impl.md +181 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/planning.md +166 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-connector.md +86 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-manual.md +68 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl.md +173 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/planning.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/impl.md +540 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/impl.md +269 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/planning.md +128 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/impl.md +424 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/planning.md +95 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/impl.md +403 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/impl.md +43 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/planning.md +24 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/impl.md +82 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/planning.md +44 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/impl.md +117 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/planning.md +93 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/impl.md +98 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/planning.md +42 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/impl.md +164 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/planning.md +35 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/impl.md +189 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/planning.md +66 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/impl.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/planning.md +34 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/impl.md +48 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/planning.md +29 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/impl.md +252 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/planning.md +47 -0
- package/skills/uipath-maestro-flow/references/diagnose/CAPABILITY.md +73 -0
- package/skills/uipath-maestro-flow/references/diagnose/failure-modes.md +353 -0
- package/skills/uipath-maestro-flow/references/diagnose/troubleshooting-guide.md +174 -0
- package/skills/uipath-maestro-flow/references/evaluate/CAPABILITY.md +134 -0
- package/skills/uipath-maestro-flow/references/evaluate/commands-reference.md +376 -0
- package/skills/uipath-maestro-flow/references/evaluate/eval-sets-guide.md +227 -0
- package/skills/uipath-maestro-flow/references/evaluate/evaluators-guide.md +143 -0
- package/skills/uipath-maestro-flow/references/evaluate/running-guide.md +215 -0
- package/skills/uipath-maestro-flow/references/evaluate/upload-safety.md +94 -0
- package/skills/uipath-maestro-flow/references/operate/CAPABILITY.md +77 -0
- package/skills/uipath-maestro-flow/references/operate/manage.md +39 -0
- package/skills/uipath-maestro-flow/references/operate/run.md +121 -0
- package/skills/uipath-maestro-flow/references/operate/ship.md +57 -0
- package/skills/uipath-maestro-flow/references/shared/action-nodes.md +100 -0
- package/skills/uipath-maestro-flow/references/shared/cli-commands.md +269 -0
- package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +178 -0
- package/skills/uipath-maestro-flow/references/shared/file-format.md +582 -0
- package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +86 -0
- package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +113 -0
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +787 -0
- package/skills/uipath-platform/references/integration-service/activities.md +2 -2
- package/skills/uipath-platform/references/integration-service/activity-generation.md +8 -1
- package/skills/uipath-platform/references/integration-service/triggers.md +1 -3
- package/version-manifest.json +1 -1
- package/skills/uipath-maestro-flow/examples/AquariumSafetyStop.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/ArchiveCardExtract.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/BakeOffEntryForm.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/BeeHiveLedger.flow.ts +0 -61
- package/skills/uipath-maestro-flow/examples/BeltProgression.flow.ts +0 -53
- package/skills/uipath-maestro-flow/examples/BirdCountLookup.flow.ts +0 -24
- package/skills/uipath-maestro-flow/examples/ClubDirectory.flow.ts +0 -56
- package/skills/uipath-maestro-flow/examples/ConcertSoundcheck.flow.ts +0 -59
- package/skills/uipath-maestro-flow/examples/DoorbellLog.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FestivalMapScaffold.flow.ts +0 -22
- package/skills/uipath-maestro-flow/examples/FieldTripQuickForm.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FossilCatalogEnrich.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/GallerySubmission.flow.ts +0 -67
- package/skills/uipath-maestro-flow/examples/GreenhouseWatering.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/HarbourRadioLine.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/HerbariumDispatch.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/KilnReview.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/LibraryDeskChat.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/LighthouseSignal.flow.ts +0 -30
- package/skills/uipath-maestro-flow/examples/MeteorShowerPages.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/NeighborhoodWalkPlanner.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/ObservatorySeeing.flow.ts +0 -51
- package/skills/uipath-maestro-flow/examples/OralHistoryDigest.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/PlanetariumConfirmation.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/PlantNameAdvisor.flow.ts +0 -28
- package/skills/uipath-maestro-flow/examples/PostcardCaption.flow.ts +0 -44
- package/skills/uipath-maestro-flow/examples/PotteryStudioCallback.flow.ts +0 -41
- package/skills/uipath-maestro-flow/examples/RecipeScaler.flow.ts +0 -62
- package/skills/uipath-maestro-flow/examples/SeedPacketReader.flow.ts +0 -49
- package/skills/uipath-maestro-flow/examples/TideTableConverter.flow.ts +0 -35
- package/skills/uipath-maestro-flow/examples/TrailLogSummary.flow.ts +0 -75
- package/skills/uipath-maestro-flow/examples/WorkshopInventory.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/bindings.json +0 -85
- package/skills/uipath-maestro-flow/references/CLI-LOOP.md +0 -309
- package/skills/uipath-maestro-flow/references/agent-resources.md +0 -74
- package/skills/uipath-maestro-flow/references/agent.md +0 -175
- package/skills/uipath-maestro-flow/references/agentic-process.md +0 -41
- package/skills/uipath-maestro-flow/references/api-workflow.md +0 -29
- package/skills/uipath-maestro-flow/references/author.md +0 -178
- package/skills/uipath-maestro-flow/references/batch-transform.md +0 -23
- package/skills/uipath-maestro-flow/references/bindings.md +0 -178
- package/skills/uipath-maestro-flow/references/branch.md +0 -18
- package/skills/uipath-maestro-flow/references/brownfield.md +0 -152
- package/skills/uipath-maestro-flow/references/connector-params.md +0 -624
- package/skills/uipath-maestro-flow/references/conversational.md +0 -77
- package/skills/uipath-maestro-flow/references/data-fabric.md +0 -268
- package/skills/uipath-maestro-flow/references/delay.md +0 -26
- package/skills/uipath-maestro-flow/references/diagnose.md +0 -141
- package/skills/uipath-maestro-flow/references/document-pipeline.md +0 -47
- package/skills/uipath-maestro-flow/references/error-handling.md +0 -75
- package/skills/uipath-maestro-flow/references/evaluate.md +0 -168
- package/skills/uipath-maestro-flow/references/event-trigger.md +0 -155
- package/skills/uipath-maestro-flow/references/form-trigger.md +0 -41
- package/skills/uipath-maestro-flow/references/hitl.md +0 -169
- package/skills/uipath-maestro-flow/references/http.md +0 -105
- package/skills/uipath-maestro-flow/references/inline-agent.md +0 -132
- package/skills/uipath-maestro-flow/references/ixp.md +0 -167
- package/skills/uipath-maestro-flow/references/loops.md +0 -77
- package/skills/uipath-maestro-flow/references/manual-trigger.md +0 -39
- package/skills/uipath-maestro-flow/references/operate.md +0 -204
- package/skills/uipath-maestro-flow/references/or-processes.md +0 -91
- package/skills/uipath-maestro-flow/references/parallel-merge.md +0 -21
- package/skills/uipath-maestro-flow/references/placeholder.md +0 -70
- package/skills/uipath-maestro-flow/references/published-function.md +0 -66
- package/skills/uipath-maestro-flow/references/queue.md +0 -53
- package/skills/uipath-maestro-flow/references/return.md +0 -20
- package/skills/uipath-maestro-flow/references/rpa-workflow.md +0 -27
- package/skills/uipath-maestro-flow/references/scheduled-trigger.md +0 -34
- package/skills/uipath-maestro-flow/references/script.md +0 -52
- package/skills/uipath-maestro-flow/references/subflow.md +0 -33
- package/skills/uipath-maestro-flow/references/summarize.md +0 -20
- package/skills/uipath-maestro-flow/references/switch.md +0 -20
- package/skills/uipath-maestro-flow/references/terminate.md +0 -22
- package/skills/uipath-maestro-flow/references/transform.md +0 -32
- package/skills/uipath-maestro-flow/references/voice.md +0 -70
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# Greenfield — Create a New Flow
|
|
2
|
+
|
|
3
|
+
End-to-end journey for creating a Flow project from scratch. Author terminates at `validate` + `format`. To publish, run, or debug after this, see [operate/CAPABILITY.md](../operate/CAPABILITY.md).
|
|
4
|
+
|
|
5
|
+
> **Brownfield edits use a different journey.** If the `.flow` file already exists, see [brownfield.md](brownfield.md) instead.
|
|
6
|
+
|
|
7
|
+
## Scope gate — count what the request names
|
|
8
|
+
|
|
9
|
+
Count the steps the request names: services, systems, documents, decisions, approvals, schedules, computations. A domain or an outcome ("shipment tracking", "our onboarding") is not a step, and neither is the project name.
|
|
10
|
+
|
|
11
|
+
**Zero steps → scaffold only.** Run Steps 0–2 in full, then 5–6. Drop the whole Step 3 tail from the T1 chain — no `node add`, no `registry pull`, no `registry get`, no `registry search`, no `uip is connections list`, no `uip df entities list`. The chain's placeholder `core.action.http.v2` is a node the request never asked for; do not copy the chain verbatim. Leave the flow exactly as Step 2 produced it; a bare manual trigger passes `validate` and `format`. Report what the flow should do as **Open Questions** in the [Completion Output](#completion-output).
|
|
12
|
+
|
|
13
|
+
That is the finished deliverable, not a stall: a non-interactive run ([SKILL.md rule #5](../../SKILL.md)) ends the same way rather than inventing a pipeline from the domain word.
|
|
14
|
+
|
|
15
|
+
**Zero steps:** "Automate our shipment tracking with a new UiPath Flow project called ShipmentTracker" → scaffold, validate, stop.
|
|
16
|
+
|
|
17
|
+
**Three steps:** "Build a flow that watches a SharePoint folder, extracts invoices with IxP and POSTs to SAP" → build all of it.
|
|
18
|
+
|
|
19
|
+
**Borderline — two steps:** "Check the weather for the Bellevue office and tell me if it's a nice day" → outcome-shaped, but it names a lookup and a threshold decision. Build it. An outcome sitting next to a step does not cancel the step.
|
|
20
|
+
|
|
21
|
+
## Should you plan first?
|
|
22
|
+
|
|
23
|
+
For complex flows, produce a plan before building. Reference [planning-arch.md](planning-arch.md) and [planning-impl.md](planning-impl.md) for the node type catalog, port reference, wiring rules, and topology patterns.
|
|
24
|
+
|
|
25
|
+
**Plan when:**
|
|
26
|
+
- The flow has 5+ nodes with branching or parallel paths
|
|
27
|
+
- The flow uses connectors or resources that need discovery
|
|
28
|
+
- The user's requirements are ambiguous and you need to confirm the approach
|
|
29
|
+
|
|
30
|
+
**Don't plan when:**
|
|
31
|
+
- Adding/editing a single node in an existing flow (use [brownfield.md](brownfield.md))
|
|
32
|
+
- The flow is a straightforward linear pipeline (trigger → action → action → end)
|
|
33
|
+
- The user has already described the exact topology they want
|
|
34
|
+
|
|
35
|
+
**Skipping the plan never skips the node choice.** Two outcomes (*if … otherwise …*) = a `core.logic.decision` node with both `true`/`false` ports wired — never a Script ternary ([decision/planning.md](plugins/decision/planning.md)); three or more outcomes → `core.logic.switch`; a named external service → the Step 3 registry ladder below.
|
|
36
|
+
|
|
37
|
+
### Examples
|
|
38
|
+
|
|
39
|
+
**Plan:** "Build a flow that receives a Jira ticket, classifies it with an AI agent, routes urgent tickets to Slack and non-urgent to a queue, and logs everything to a Google Sheet."
|
|
40
|
+
→ Multiple services, branching logic, connector discovery needed. Plan first.
|
|
41
|
+
|
|
42
|
+
**Don't plan:** "Create a flow that calls an API and sends the result to Slack."
|
|
43
|
+
→ Linear pipeline, user knows what they want. Build directly, ask questions inline if needed. **"Build directly" skips the plan doc, not the registry search** — you still `registry search` each named service and pick a node type via the Step 3 ladder.
|
|
44
|
+
|
|
45
|
+
**Judgment call:** "Build me a flow that processes invoices."
|
|
46
|
+
→ Ambiguous requirements. Ask clarifying questions; plan if answers reveal complexity.
|
|
47
|
+
|
|
48
|
+
## Three-turn execution map
|
|
49
|
+
|
|
50
|
+
Steps 0–6 are **logical phases**, not separate turns. A typical greenfield build collapses to **three assistant turns** (universal SKILL.md rule #10). Each step heading below carries a `[T1]` / `[T2]` / `[T3]` tag — emit every tool call inside the same Turn as one assistant message.
|
|
51
|
+
|
|
52
|
+
| Turn | Steps | What you emit in ONE assistant message |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| **T1 — Setup + discovery** | 0, 1, 2, 3 | One chained `Bash` (scaffold + register + pull + `node add` for each CLI-owned node) **+** parallel `Bash` (one `registry get` per OOTB type you'll inline) **+** parallel `Read` (plugin `impl.md`s). **If existing `.uipx` solutions are present, the Step 2 gate fires first in its own turn** — resolve it before this chain. |
|
|
55
|
+
| **T2 — Read + author** | 4 | One `Read` of the `.flow` **+** a batch of `Edit` calls (or one `Write` if ≥70% of nodes change). Claude Code serializes Edits on the same file, so they don't race |
|
|
56
|
+
| **T3 — Finalize** | 5, 6 | One chained `Bash` (`node configure && validate && format`). On validate failure: one Edit turn, then re-chain `validate && format` |
|
|
57
|
+
|
|
58
|
+
### Batching anti-patterns
|
|
59
|
+
|
|
60
|
+
- **One CLI per turn.** Never issue `solution init`, then `cd`, then `flow init` as three separate Bash calls — chain with `&&`, the `cd` included as its own segment. Same for `node configure && validate && format`.
|
|
61
|
+
- **Sequential `registry get`s.** Emit every `registry get` as a parallel `Bash` in one message alongside the T1 scaffold chain.
|
|
62
|
+
- **Pre-reading a fallback walkthrough before the ladder resolves.** T1's "parallel `Read` (plugin `impl.md`s)" covers node types the Step 3 ladder has already selected. A connector gap is not selected until `uip is connectors metadata` returns; See [Select the node type for each external service](#select-the-node-type-for-each-external-service-runs-even-when-full-planning-is-skipped).
|
|
63
|
+
- **Validating after every Edit.** Validate once at the end of T3 (or after a recovery Edit). Intermediate states are expected to be invalid.
|
|
64
|
+
- **Re-reading the `.flow` every turn.** `Read` once at the start of T2; subsequent `Edit`s in the same conversation don't need re-reading unless an external command (e.g., `node configure`, `format`) rewrites the file between Edits.
|
|
65
|
+
- **`Edit` in the same turn as a `Bash` that mutates the same file.** Parallel tool calls race — separate them across turns.
|
|
66
|
+
- **Two parallel `Edit`s anchored to the same byte range.** Same-file Edits serialize in execution order; if Edit N's `old_string` overlaps text that Edit N-1's substitution removed or shifted, Edit N fails with "string not found." Use the [per-array anchor pattern](#anchoring-parallel-flow-edits--anchor-on-what-you-read-not-on-key-order) — anchor each Edit on its target array's own opening key, never on key order or a shared boundary.
|
|
67
|
+
|
|
68
|
+
## Step 0 — Resolve the `uip` binary and detect command prefix **[T1]**
|
|
69
|
+
|
|
70
|
+
See [shared/cli-conventions.md](../shared/cli-conventions.md) for binary resolution, version detection, and the `uip maestro flow` vs `uip flow` command prefix rule. All commands below are written in the `uip maestro flow` form. <!-- uip-check-skip -->
|
|
71
|
+
|
|
72
|
+
This probe is read-only — emit as a parallel `Bash` alongside the Step 2 scaffold chain. It does not need its own turn.
|
|
73
|
+
|
|
74
|
+
## Step 1 — Check login status **[T1 — only if needed]**
|
|
75
|
+
|
|
76
|
+
Greenfield steps 2–6 work without login (`flow init`, `validate`, `format`, registry OOTB nodes, `Edit` / `Write` edits). Login is required only when the registry needs tenant-specific connector/resource nodes, or before handing off to Operate.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
uip login status --output json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
If not logged in and you need tenant nodes:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
uip login # interactive OAuth (opens browser)
|
|
86
|
+
uip login --authority https://alpha.uipath.com # non-production environments
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
When you do need it, emit `uip login status --output json` as a parallel `Bash` inside T1.
|
|
90
|
+
|
|
91
|
+
## Step 2 — Create a solution, THEN a Flow project inside it **[T1]**
|
|
92
|
+
|
|
93
|
+
> **A Flow project cannot exist outside a solution** (universal rule in [SKILL.md](../../SKILL.md)). Run `uip maestro flow init` (Step 2b) outside a solution and it now **auto-scaffolds** one — `<Project>Solution/<Project>Solution.uipx` with the project nested at `<Project>Solution/<Project>/` (response carries `Data.AutoCreatedSolution`). Still scaffold or select the solution first (Step 2a) so you set the solution name yourself rather than the auto `<Project>Solution`, and so discovery is unambiguous. The solution and project names are independent — they need not match. The correct layout is **always** `<Solution>/<Project>/<Project>.flow` (double-nested — see the tree after Step 2c). Passing `--skip-solution-registration` opts out of both auto-scaffold and registration, leaving a bare single-nested layout that fails Studio Web upload and packaging.
|
|
94
|
+
|
|
95
|
+
Check for existing solutions with `find . -maxdepth 2 -type f -name '*.uipx' -print` (each solution is its own folder — `<Solution>/<Solution>.uipx` — so a bare `*.uipx` glob misses them). If any are found, **STOP before the T1 chain — do not run `uip solution init` yet** — and ask the user which solution to use per the dropdown question rule in [SKILL.md](../../SKILL.md) (rules #5 and #6): one option per discovered `.uipx`, a **"Create a new solution"** option, and **"Something else"** last. Rule #5 owns the ask mechanism (structured `AskUserQuestion` where the runtime offers it, a numbered chat list otherwise, recommended-option fallback when non-interactive) — do not re-specify a tool here. Applies even when the user wants a new solution. If none are found, create a new one automatically.
|
|
96
|
+
|
|
97
|
+
- If the user specifies an existing `.uipx` file path or solution name, use that (skip to Step 2b)
|
|
98
|
+
- Otherwise, create a new solution (Step 2a)
|
|
99
|
+
|
|
100
|
+
### Canonical T1 chain — issue this as ONE `Bash` call
|
|
101
|
+
|
|
102
|
+
This is the consolidated command that does Steps 2a + 2b + Step 3 + (optionally) one `node add` per CLI-owned node, in one chained Bash. `node add` signature is `<file> <node-type>` (file first):
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
uip solution init "<SolutionName>" --output json \
|
|
106
|
+
&& cd "<SolutionName>" \
|
|
107
|
+
&& uip maestro flow init "<ProjectName>" --output json \
|
|
108
|
+
&& cd "<ProjectName>" \
|
|
109
|
+
&& uip maestro flow registry pull \
|
|
110
|
+
&& uip maestro flow node add "<ProjectName>.flow" core.action.http.v2 --label "<NodeLabel>" --output json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
> **One creation path — never drop the `cd`.** `uip solution init "<SolutionName>"` → `cd "<SolutionName>"` → `uip maestro flow init "<ProjectName>"`, one chain. Without the `cd`, `flow init` runs in the old directory and auto-scaffolds a duplicate `<ProjectName>Solution/` (1-node husk). Never let auto-scaffold create the solution. Finish with exactly one `project.uiproj` — delete strays.
|
|
114
|
+
|
|
115
|
+
> **Building a Maestro Automate?** Add `--automate` to the `flow init` segment and change nothing else:
|
|
116
|
+
>
|
|
117
|
+
> ```bash
|
|
118
|
+
> && uip maestro flow init "<ProjectName>" --automate --output json \
|
|
119
|
+
> ```
|
|
120
|
+
>
|
|
121
|
+
> Only when the request names **Maestro Automate** as the product. The bare verb does not count — "automate invoice intake with a Flow" asks for a Flow. Anything else, including no signal, leaves the flag off. Steps 3-6 are identical either way — the flag changes the packaged `runtimeOptions.profile`, not how you author the `.flow`. See [SKILL.md rule #6](../../SKILL.md#critical-rules-universal).
|
|
122
|
+
|
|
123
|
+
Tail-append one `node add` per CLI-owned node (`uipath.connector.*`, `uipath.connector.trigger.*`, `core.action.http.v2`). Each `node add` returns the new node `id` in `Data` — capture it from the chained output for T2/T3. Drop the trailing `node add` segment when the flow is OOTB-only. `core.action.http.v2` in the example stands in for whichever CLI-owned type the Step 3 ladder selected — for a connector that has no curated activity, that is the generated `uipath.connector.custom.<key>.<slug>` node when the connector reports `V4Compatible: true`, and Managed HTTP only when it does not.
|
|
124
|
+
|
|
125
|
+
In the SAME assistant message (parallel to this chain): emit one `Bash` per OOTB `registry get <NODE_TYPE>` you'll need in T2 (always `core.control.end` — see Step 4), and parallel `Read` calls for any plugin `impl.md`s you'll consult.
|
|
126
|
+
|
|
127
|
+
> **Older `solution-tool` (< 1.0.0)** used `solution new` (see [.claude/rules/cli-renames.md](../../../../.claude/rules/cli-renames.md)). If `solution init` returns `unknown command`, substitute `solution new`.
|
|
128
|
+
|
|
129
|
+
The sub-steps below describe what each command in the chain does and how to verify the result.
|
|
130
|
+
|
|
131
|
+
### 2a. Create a new solution
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
uip solution init "<SolutionName>" --output json
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Creates `<cwd>/<SolutionName>/<SolutionName>.uipx`. **`cd` into the new solution directory before Step 2b.**
|
|
138
|
+
|
|
139
|
+
> **Naming convention:** In **pure greenfield** (no existing solutions), default the solution name to the project name unless the user specifies otherwise. When solutions already exist and the user chooses "Create a new solution", **ask for the new solution's name** — do not reuse the project name (SKILL.md rule #6). The two names are independent.
|
|
140
|
+
|
|
141
|
+
### 2b. Create the Flow project inside the solution folder
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
cd <directory>/<SolutionName> && uip maestro flow init <ProjectName> --output json
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Append `--automate` for a Maestro Automate project (SKILL.md rule #6). The rest of this step, and Steps 3-6, are unchanged.
|
|
148
|
+
|
|
149
|
+
The `cd` puts the project inside the solution you just created. Skip it and `flow init` won't find that solution (discovery walks **up**, not down into `<SolutionName>/`) — it auto-scaffolds a **second, separate** `<ProjectName>Solution/` beside your empty `<SolutionName>/`, leaving two solutions. The project no longer single-nests, but `cd` first to land in the right one.
|
|
150
|
+
|
|
151
|
+
> **Bash session state persists across tool calls.** This `cd` is **not scoped to one Bash invocation** — your cwd remains inside `<SolutionName>/` for every subsequent `Bash` call until you `cd` somewhere else. Plan the rest of Step 2 (and Steps 3–6) accordingly: either keep using paths relative to the solution dir, or anchor with `$(pwd)` / the absolute `Data.Path` returned by `flow init`. Do NOT prefix later commands with the original `<directory>/<SolutionName>/...` — that would resolve as `<SolutionName>/<directory>/<SolutionName>/...` and look like a layout bug when it isn't.
|
|
152
|
+
|
|
153
|
+
`--output json` is required so Step 2c can inspect `Data.SolutionRegistration.Status` to confirm the project was auto-registered with the parent solution.
|
|
154
|
+
|
|
155
|
+
### 2c. Verify the project is registered in the solution
|
|
156
|
+
|
|
157
|
+
When `uip maestro flow init` is run from inside a solution directory (Step 2b), it **auto-registers** the project with the nearest parent `.uipx`. Run outside any solution, it **auto-scaffolds** `<Project>Solution/` and registers the project in it — the response then also carries `Data.AutoCreatedSolution` (`{ Name, Path, SolutionFile }`) and `Status: Registered`. Pass `--skip-solution-registration` to opt out of both (Status `OptedOut`, bare single-nested layout). The success envelope always reports the outcome in `Data.SolutionRegistration`:
|
|
158
|
+
|
|
159
|
+
```json
|
|
160
|
+
{
|
|
161
|
+
"Result": "Success",
|
|
162
|
+
"Code": "FlowInit",
|
|
163
|
+
"Data": {
|
|
164
|
+
"Status": "Created successfully",
|
|
165
|
+
"Path": ".../<SolutionName>/<ProjectName>",
|
|
166
|
+
"SolutionRegistration": {
|
|
167
|
+
"Status": "Registered", // or "AlreadyRegistered"
|
|
168
|
+
"Solution": ".../<SolutionName>.uipx",
|
|
169
|
+
"Project": "<ProjectName>/project.uiproj",
|
|
170
|
+
"ProjectId": "<uuid>"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
If `Data.SolutionRegistration.Status` is `Registered` or `AlreadyRegistered`, **you are done** with this step — proceed to the layout check. If it is `OptedOut`, you passed `--skip-solution-registration` and the skip was intentional.
|
|
177
|
+
|
|
178
|
+
**Fallback** — when `Status` is `Skipped` (ambiguous discovery — e.g. multiple `.uipx`), `Failed` (the `.uipx` write failed), or `NotInSolution` (rare — auto-scaffold did not run and no parent `.uipx` was found): wire the project manually.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
uip solution projects add \
|
|
182
|
+
<directory>/<SolutionName>/<ProjectName> \
|
|
183
|
+
<directory>/<SolutionName>/<SolutionName>.uipx
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
If you ended up with a bare single-nested layout (e.g. `--skip-solution-registration` was passed), **delete the partial scaffold and restart from Step 2a** — do not try to patch the layout by hand. See [diagnose/failure-modes.md — Single-nested layout](../diagnose/failure-modes.md#single-nested-layout).
|
|
187
|
+
|
|
188
|
+
### Expected layout after Steps 2a–2c
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
<cwd>/
|
|
192
|
+
└── <SolutionName>/ ← from `uip solution init`
|
|
193
|
+
├── <SolutionName>.uipx
|
|
194
|
+
└── <ProjectName>/ ← from `uip maestro flow init` (run from inside <SolutionName>/)
|
|
195
|
+
├── <ProjectName>.flow ← the file you edit
|
|
196
|
+
├── project.uiproj
|
|
197
|
+
├── bindings_v2.json
|
|
198
|
+
├── entry-points.json
|
|
199
|
+
├── operate.json
|
|
200
|
+
└── package-descriptor.json
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**Self-check — run this before Step 3:**
|
|
204
|
+
|
|
205
|
+
After Step 2b your cwd is inside `<SolutionName>/` (the `cd` persists). Verify the flow file using a `$(pwd)`-anchored absolute path so the check is robust to that cwd drift:
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
ls "$(pwd)/<ProjectName>/<ProjectName>.flow"
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Equivalent: use the absolute project dir reported by `flow init` in `Data.Path` and append `/<ProjectName>.flow`. Either form gives an absolute path that doesn't depend on the current cwd.
|
|
212
|
+
|
|
213
|
+
> **Don't write `<SolutionName>/<ProjectName>/<ProjectName>.flow` here.** From inside `<SolutionName>/` that resolves to `<SolutionName>/<SolutionName>/<ProjectName>/<ProjectName>.flow` (triple-nested) and the `ls` will fail even though the layout is correct. That false negative wastes turns chasing a non-bug.
|
|
214
|
+
|
|
215
|
+
If the file does not exist at the absolute double-nested path, Step 2 is wrong. Delete the partial scaffold and restart from Step 2a — do not try to patch the layout by hand.
|
|
216
|
+
|
|
217
|
+
**Then assert it is the only one.** `cd` does not persist between tool calls, so a later `uip maestro flow init` issued outside the solution auto-scaffolds `<Project>Solution/` beside the real project rather than failing. Nothing warns you: `flow validate` passes on either file, and the duplicate surfaces only when something globs and resolves to two.
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
find . -name project.uiproj -o -name '*.flow' | sort # expect exactly one of each
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
More than one → **delete the stray scaffold.** Do not `mv` it into place — that leaves the original where it was, so you end up with two.
|
|
224
|
+
|
|
225
|
+
See [shared/file-format.md](../shared/file-format.md) for the full project structure.
|
|
226
|
+
|
|
227
|
+
## Step 3 — Refresh the registry **[T1 — chained tail of Step 2]**
|
|
228
|
+
|
|
229
|
+
This is already the last segment of the [canonical T1 chain](#canonical-t1-chain--issue-this-as-one-bash-call) above. Standalone:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
uip maestro flow registry pull # refresh local cache (expires after 30 min)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**Parallel `registry get`** — in the same T1 assistant message, emit one separate `Bash` per OOTB node type whose definition you'll inline in T2. **Always fetch `core.control.end`** — `flow init` does not scaffold one (see Step 4):
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
uip maestro flow registry get core.control.end --output json
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
> **Auth note**: Without `uip login`, registry shows OOTB nodes only. After login, tenant-specific connector and resource nodes are also available. **In-solution sibling projects** are always available via `--local` without login — see below.
|
|
242
|
+
|
|
243
|
+
### Select the node type for each external service (runs even when full planning is skipped)
|
|
244
|
+
|
|
245
|
+
Calling a named external service (Slack, open-meteo, Stripe, any REST API)? **Search first — never guess the node type from the brand name:**
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
uip maestro flow registry search "<service>" --output json --output-filter "[*].{NodeType:NodeType,DisplayName:DisplayName,Description:Description,AvailableOnTenant:AvailableOnTenant}"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Then pick the first match down this ladder:
|
|
252
|
+
|
|
253
|
+
1. **Curated connector activity** (`uipath.connector.<key>.<op>` in the results) → use it.
|
|
254
|
+
2. **Connector exists but no activity for what you need, and `uip is connectors metadata <key>` reports `V4Compatible: true`** → a generated non-catalog activity ([connector/planning.md — decision order](plugins/connector/planning.md#decision-order), authored per [connector/impl-inline.md](plugins/connector/impl-inline.md)).
|
|
255
|
+
3. **Connector exists but no activity, not `V4Compatible`** → `core.action.http.v2` (connector mode).
|
|
256
|
+
4. **No connector at all** → `core.action.http.v2` (manual mode).
|
|
257
|
+
5. **No API** (desktop app) → [rpa](plugins/rpa/planning.md).
|
|
258
|
+
|
|
259
|
+
Manual HTTP is the **bottom of the ladder** — only the search returning no connector authorizes it. Picking it without searching is the brand-name shortcut forbidden by [SKILL.md rule #3](../../SKILL.md#critical-rules-universal).
|
|
260
|
+
|
|
261
|
+
**Resolve rung 2 vs 3 before you open either walkthrough.** When the search shows the connector but no activity for the operation, the fallback is undecided until one more discovery call returns. Emit it in T1 alongside the search and the connections list:
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
uip is connectors metadata <connector-key> --output json --output-filter "[0].Flags"
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Read the flag off the `Flags` object the filter returns — the CLI emits it as **`V4Compatible`** (capital `V`), so a filter that names `V4Compatible` returns `Data: []` and reads as "flag absent", which misroutes a rung-2 connector to Managed HTTP. Then open only the walkthrough the flag selects — [connector/impl-inline.md](plugins/connector/impl-inline.md) when it is `true`, [http/impl-connector.md](plugins/http/impl-connector.md) when it is `false` or absent. Do not pre-read the Managed HTTP guide on the guess that the gap will land at rung 3: a fallback doc already in context steers the build toward that node type before the flag has been read. The `core.action.http.v2` in the [canonical T1 chain](#canonical-t1-chain--issue-this-as-one-bash-call) is a placeholder for whichever CLI-owned node the ladder selected, not the default fallback.
|
|
268
|
+
|
|
269
|
+
**Branching is a node, not a Script.** A requirement phrased as *if … otherwise …* (two outcomes) is a `core.logic.decision` node with both `true`/`false` ports wired ([decision/planning.md](plugins/decision/planning.md)); three or more outcomes → `core.logic.switch`. Do not fold the branch into a Script ternary — the branch must exist as a node in the graph.
|
|
270
|
+
|
|
271
|
+
### Document-extraction step — route it to IxP (runs even when full planning is skipped)
|
|
272
|
+
|
|
273
|
+
Pulling **named fields out of documents** (PDFs, scans, receipts, invoices, contracts, forms) is a document-extraction step — its node is an **IxP node** (`uipath.ixp.*`). It's easy to miss because the fetch/post steps around it are ordinary nodes, but the extraction in between is its own node. **Always land a node for it — never leave it out:**
|
|
274
|
+
|
|
275
|
+
- **Model published** → land the real `uipath.ixp.*` node (skeleton is fine; defer config to Open Questions).
|
|
276
|
+
- **No model published** (`registry search "uipath.ixp"` → `Data: []`) → land a `core.logic.mock`.
|
|
277
|
+
|
|
278
|
+
See [plugins/ixp/impl.md — Landing the node when you cannot fully configure it](plugins/ixp/impl.md#landing-the-node-when-you-cannot-fully-configure-it).
|
|
279
|
+
|
|
280
|
+
**In-solution discovery (no login required):**
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
uip maestro flow registry list --local --output json # discover sibling projects in the same .uipx solution
|
|
284
|
+
uip maestro flow registry search "<keyword>" --local --output json # keyword search across in-solution nodes
|
|
285
|
+
uip maestro flow registry get "<node-type>" --local --output json # get full manifest for a local node
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Run from inside the flow project directory. Returns the same manifest format as the tenant registry. Use `--local` to wire in-solution resources (RPA, agents, flows, API workflows) without publishing them first. `search --local` omits `AvailableOnTenant` — drop it from `--output-filter` projections.
|
|
289
|
+
|
|
290
|
+
## Step 4 — Build the flow **[T2]**
|
|
291
|
+
|
|
292
|
+
> **`flow init` scaffolds ONLY the manual trigger (`start` / `core.trigger.manual`) with zero edges.** Every other user-owned node — **including the End node** — is yours to add via `Edit` / `Write`. Any HTTP / connector / connector-trigger node you `node add`-ed in T1 is already in `nodes[]` and `definitions[]` but has empty `inputs.detail` (filled in T3) and is not wired yet.
|
|
293
|
+
|
|
294
|
+
### T2 batch — issue these in ONE assistant message
|
|
295
|
+
|
|
296
|
+
1. **One `Read`** of `<ProjectName>.flow` — required before any Edit/Write; T1's chained Bash mutated the file and Claude Code's file-state tracker does not auto-refresh on external mutations.
|
|
297
|
+
2. **A batch of parallel `Edit` calls** — **exactly one per top-level array you touch**, each carrying EVERY new entry for that array. Never one `Edit` per node; node count does not change the call count. Same-file Edits serialize in execution order, so each `old_string` must anchor to text NO OTHER parallel Edit modifies. Use the **per-array anchor pattern** below.
|
|
298
|
+
- Edit `nodes[]` — every user-owned node in one call, End included.
|
|
299
|
+
- Edit `definitions[]` — one entry per unique `type:typeVersion`, pasted verbatim from T1's `registry get` output.
|
|
300
|
+
- Edit `edges[]` — the whole wiring in one call.
|
|
301
|
+
- Edit `variables.globals` — every `in` / `out` variable the flow declares. Needed before an End node can map an output to one.
|
|
302
|
+
- Edit `layout.nodes` — placeholder `{ position: { x: 0, y: 0 }, size: { width: 96, height: 96 }, collapsed: false }` per new node; `format` rewrites both position and size (by node shape) in T3.
|
|
303
|
+
|
|
304
|
+
**≥70% of `nodes[]` new → one `Write` of the whole file instead.** That is the normal greenfield shape, and neither node count nor file size disqualifies it (see [editing-operations.md — Tool Selection Ladder](editing-operations.md#tool-selection-ladder)). Below that threshold the per-array `Edit` batch is cheaper, because a whole-file `Write` re-emits the file.
|
|
305
|
+
|
|
306
|
+
Two conditions when T1 ran `node add`. First, carry forward **verbatim** from the `Read` every key `node add` touched for each CLI-owned node — the node object, its `definitions[]` entry, its `bindings[]` rows, its `layout.nodes` entry, and its `variables.nodes` bindings ([CAPABILITY.md — Node ownership](CAPABILITY.md#node-ownership--who-authors-the-node) tabulates them). `variables.nodes` is the one `node configure` does not regenerate, and `flow validate` reports `Valid` without it, so a `Write` that drops it leaves the flow silently missing what makes `$vars.<id>.output` resolve until T3's trailing `format` regenerates it ([CAPABILITY.md](CAPABILITY.md#critical-rules) rule 14). Carry it forward rather than relying on that repair. Second, leave T3's `node configure` as the last write to touch `inputs.detail` / `bindings[]` — T3's `validate && format` still chain after it, and `format` touches neither. `node add` leaves `inputs.detail` empty and the `bindings[]` rows unresolved (`resourceKey: ""`), so a `Write` before `configure` costs nothing as long as those keys survive it. A `Write` AFTER `configure` clobbers the filled values, invisibly to `flow validate` — `Edit` in place there, or re-run `configure`. See [CAPABILITY.md — Node ownership](CAPABILITY.md#node-ownership--who-authors-the-node).
|
|
307
|
+
|
|
308
|
+
#### Anchoring parallel `.flow` Edits — anchor on what you Read, not on key order
|
|
309
|
+
|
|
310
|
+
> **Do not assume a top-level key order.** The CLI does not guarantee which keys are present or in what sequence — fixtures show `runtime` before `nodes` on one flow and absent on another, and `bindings` / `variables` / `solutionId` / `projectId` / `metadata` appear in varying positions. Any anchor of the form "closing `]` + the NEXT top-level key" is coupled to that ordering and will silently break across CLI versions or between flows. **Anchor on the target array's OWN key instead — you just `Read` the file at the top of T2, so anchor to text that read actually contains.**
|
|
311
|
+
|
|
312
|
+
Anchor each Edit using its target array's own opening key, located in the text you just Read — not adjacency to a neighbor key. The catch: `"nodes": [` and `"edges": [` are NOT unique in the file. They recur **inside inline `definitions[]`** (an HTTP v2 / agent / subprocess definition embeds its own nested `nodes`/`edges`) **and inside any `subflows.<id>` block** (each subflow holds its own `nodes`/`edges`) — so even a small flow can carry several copies. The reliable, version-independent discriminator is **indentation: the top-level array sits at 2-space indent; every nested one is deeper.** `"definitions": [` and the top-level `"layout": {` appear once each, so they need no disambiguation.
|
|
313
|
+
|
|
314
|
+
| Edit target | Anchor on (from the text you Read) | How to insert |
|
|
315
|
+
|---|---|---|
|
|
316
|
+
| Append to `nodes[]` | The **2-space-indented** `\n "nodes": [` (the top-level array — deeper-indented `"nodes": ["` inside definitions do not match the two-leading-space prefix) plus the `start` node's opening `{ "id": "start"`. | Insert the new node object as the first element, immediately after the `[`: `\n { new node JSON },`. Head-insertion keeps `old_string` clear of the array's closing `]`. |
|
|
317
|
+
| Append to `edges[]` | The **2-space-indented** `\n "edges": [`. A newly generated scaffold commonly has `\n "edges": []`; the 2-space prefix distinguishes it from nested `edges` arrays. | When empty, replace `\n "edges": []` with `\n "edges": [\n { new edge JSON }\n ]`. When non-empty, anchor through the first edge and insert the new edge as the first element. |
|
|
318
|
+
| Append to `definitions[]` | `"definitions": [` plus the first definition's opening bytes. Top-level `definitions[]` is the only one in the file, so this is reliably unique. | Insert the new definition right after the opening `[`, as the first element. Never anchor on whatever key follows `definitions` — that key varies (`runtime`, `bindings`, `variables`, `layout`, depending on CLI version and what the flow contains). |
|
|
319
|
+
| Add to `variables.globals` | `"variables": {` — the only top-level occurrence. `globals` may be absent on a fresh scaffold, in which case anchor on `"variables": {\n "nodes": [` and insert `"globals": [ ... ],\n ` before it. | Insert each variable object at the array head. `node add` writes `variables.nodes`, never `globals`, so the two never collide. |
|
|
320
|
+
| Add an entry to `layout.nodes` | `"layout": {\n "nodes": {\n "start":` — `start` is the always-present trigger and the first key under `layout.nodes` in newly generated flows. The top-level `"layout": {` is the only one. | `"layout":` + `"start":` jointly disambiguate. Insert `"<newId>": { ... },\n ` before `"start":`. CLI-owned nodes added via `node add` already have a `layout.nodes` entry — only add entries for nodes you author by hand (e.g. End). |
|
|
321
|
+
|
|
322
|
+
**Why head-insertion.** Inserting the new element right after the array's opening `[` means the `old_string` never includes the array's closing `]` — so it cannot collide with a closing `]` from a nested object (`form.sections[].fields[]`), and it never references a sibling top-level key whose position is not guaranteed. JSON array element order is not semantically significant for `nodes` / `edges` / `definitions`, so head vs. tail insertion is equivalent; `flow format` normalizes layout regardless.
|
|
323
|
+
|
|
324
|
+
**Disjointness rule.** Two parallel Edits MUST anchor on DIFFERENT top-level arrays — nodes-Edit on the top-level `nodes[]`, edges-Edit on the top-level `edges[]`, definitions-Edit on `definitions[]`, layout-Edit on `layout.nodes`. Because each anchors on its own array (not a shared boundary), the parallel Edits never overlap — provided each anchor is unique first (see below).
|
|
325
|
+
|
|
326
|
+
**Pre-flight uniqueness check.** Before submitting an Edit, confirm your `old_string` appears **exactly once** in the file you Read. `"definitions": [` and the top-level `"layout": {` are reliably unique. `"nodes": [` and `"edges": [` are NOT — they recur inside inline definitions and subflows, so anchor on the **2-space-indented** occurrence and extend through the first element's opening (e.g. `"id": "start"`) until the match count is one. Never anchor on a bare bracket shape, and never assume the first textual occurrence is the top-level one.
|
|
327
|
+
|
|
328
|
+
**Safer fallback when in doubt:** serialize the Edits across two turns. One extra turn is cheaper than a failed-Edit recovery loop (which forces a re-Read, a re-derived anchor, and a re-submit).
|
|
329
|
+
|
|
330
|
+
See [shared/file-format.md — Top-level structure](../shared/file-format.md#top-level-structure) for which top-level keys exist and the note that their order is not guaranteed.
|
|
331
|
+
|
|
332
|
+
> **Intra-turn ordering.** If a parallel `Edit` fails with "file not read," split `Read` into its own turn (cost: +1 turn).
|
|
333
|
+
|
|
334
|
+
### Node ownership recap
|
|
335
|
+
|
|
336
|
+
> **Before each node, classify it as user-owned or CLI-owned (see [CAPABILITY.md — Node ownership](CAPABILITY.md#node-ownership--who-authors-the-node)). Connector activities, connector triggers, and `core.action.http.v2` are CLI-only — use `uip maestro flow node add` + `uip maestro flow node configure`, never Edit. Hand-writing these will fail `flow validate`.**
|
|
337
|
+
|
|
338
|
+
Edit `<ProjectName>.flow` directly in the project root. The `bindings_v2.json` file is also in the project root for resource bindings.
|
|
339
|
+
|
|
340
|
+
> **Tool selection by ownership.** Use `Edit` for in-place changes to user-owned nodes; `Write` when ≥70% of nodes change **and `node configure` has not run yet** (a full-file `Write` after it clobbers connector / managed-HTTP `bindings[]` — see the Step 4 `Write` note above). For CLI-owned nodes (above), use `uip maestro flow node add` + `node configure` — see the relevant plugin's `impl.md` for the full configuration workflow. Inline-agent project scaffolding uses `uip agent init --inline-in-flow`, but inline-agent flow node/wiring edits are direct `.flow` JSON (the agent node itself is user-owned).
|
|
341
|
+
|
|
342
|
+
Read [editing-operations.md](editing-operations.md) for strategy selection and per-operation recipes.
|
|
343
|
+
|
|
344
|
+
> **Self-check before each mutation:** name the tool you're about to use. If the answer isn't `Edit`, `Write`, or `uip maestro flow ...` — STOP and ask the user (per the dropdown question rule in [SKILL.md](../../SKILL.md)). `python`, `node`, `jq`, `sed`, `awk`, and shell heredocs are a last resort and require explicit user approval after you've surfaced the trade-offs. See [editing-operations.md — Tool Selection Ladder](editing-operations.md#tool-selection-ladder).
|
|
345
|
+
|
|
346
|
+
For each node type, follow the relevant plugin's `impl.md` for node-specific inputs, JSON structure, and configuration. The operations guides cover the mechanics (how to add/remove/wire); the plugins cover the semantics (what inputs and model fields each node type needs).
|
|
347
|
+
|
|
348
|
+
## Step 5 — Validate **[T3 — chain with Step 6, plus any T1 `node configure`]**
|
|
349
|
+
|
|
350
|
+
### Canonical T3 chain — issue this as ONE `Bash` call
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
uip maestro flow node configure "<ProjectName>.flow" "<httpNodeId>" --detail '<DETAIL_JSON>' --output json \
|
|
354
|
+
&& uip maestro flow validate "<ProjectName>.flow" --output json \
|
|
355
|
+
&& uip maestro flow format "<ProjectName>.flow" --output json
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
`<DETAIL_JSON>` is node-type-specific — the schema is owned by each CLI-owned node's plugin, not duplicated here: HTTP → [http/impl.md](plugins/http/impl.md#critical-use-node-configure), connectors → [connector/impl.md](plugins/connector/impl.md), connector triggers → [connector-trigger/impl.md](plugins/connector-trigger/impl.md). Tail-append one `node configure` per CLI-owned node added in T1, using the node IDs captured from T1's chained output. Drop the entire `node configure` segment if no CLI-owned nodes exist.
|
|
359
|
+
|
|
360
|
+
> **The plugin `impl.md` is authoritative — follow its full procedure, not just its `--detail` schema, and let it override this turn map.** A plugin may prescribe steps the three-turn collapse does not show — most importantly a **pre-`configure` live fetch** whose output you must read before you can author `--detail` (the value depends on the live response, so it cannot be guessed or copied from a doc example). When `impl.md` defines such a step, run it in its **own turn before T3** and build `--detail` from its result; do not batch it into the chain, skip it, or hand-author the payload. An empty or static base response is expected for these steps and is not a signal the step is unavailable. This is general to every CLI-owned node type — defer to the owning `impl.md` rather than assuming static config.
|
|
361
|
+
|
|
362
|
+
**On validate failure:** one `Edit` turn to fix, then re-chain `validate && format` in one Bash. Do not validate after every individual Edit during T2 — intermediate states are expected to be invalid.
|
|
363
|
+
|
|
364
|
+
> **A passing exit code with warnings is NOT done.** `flow validate` returns 0 even when `Data.Warnings` is non-empty — read the warnings, don't just check the exit code. Three classes are build failures, not advisories:
|
|
365
|
+
>
|
|
366
|
+
> | Warning | What it means at debug time | Resolve by |
|
|
367
|
+
> | --- | --- | --- |
|
|
368
|
+
> | `mentions the "<connector>" connector keyword but uses the generic Managed HTTP type core.action.http.v2 with no connection binding` | The flow took the brand-name shortcut and runs against an undefined endpoint | Switch to the connector node (see [SKILL.md rule #3](../../SKILL.md#critical-rules-universal) and the anti-pattern list) |
|
|
369
|
+
> | `declares no inputs in its agent.json \`inputSchema\`, but the flow node binds N inputs … these bindings are silently dropped` | The inline agent never receives the flow's data, so its output is unrelated to the run. Nothing faults, and with an empty `outputSchema` the fields downstream nodes read come back `undefined` | Add the warning's named keys to `inputSchema.properties` **and** read each one as `{{input.<key>}}` in `messages[].content` — a key no prompt token reads never reaches the model, and `refresh` regenerates `contentTokens` without adding the reference. Then `uip agent refresh --inline-in-flow` and `uip agent validate --inline-in-flow` ([inline-agent/impl.md § Wiring Flow Variables into Agent Prompts](plugins/inline-agent/impl.md#wiring-flow-variables-into-agent-prompts)) |
|
|
370
|
+
> | `Expression at this field is not valid JavaScript` / `[EXPRESSION_DIAGNOSTIC] Cannot find name '…'` | The expression throws or evaluates to garbage | Fix the syntax before debug |
|
|
371
|
+
>
|
|
372
|
+
> Treat all three as a build failure for your own definition of "done."
|
|
373
|
+
|
|
374
|
+
### Common error categories
|
|
375
|
+
|
|
376
|
+
- **Missing targetPort** — every edge needs a `targetPort` string
|
|
377
|
+
- **Missing definition** — every `type:typeVersion` in nodes needs a matching `definitions` entry
|
|
378
|
+
- **Invalid node/edge references** — `sourceNodeId`/`targetNodeId` must reference existing node `id`s
|
|
379
|
+
- **Duplicate IDs** — node and edge `id`s must be unique
|
|
380
|
+
|
|
381
|
+
## Step 6 — Format node layout **[T3 — chained tail of Step 5]**
|
|
382
|
+
|
|
383
|
+
This is the last segment of the [canonical T3 chain](#canonical-t3-chain--issue-this-as-one-bash-call) above. After validation passes, format must run before publishing or debugging (see "Always run `flow format` after edits" in [the Author capability index](CAPABILITY.md)). Format:
|
|
384
|
+
|
|
385
|
+
- Arranges nodes horizontally (left-to-right) using ELK with `nodeSpacing: 96`, anchored to the leftmost node's original position
|
|
386
|
+
- Sets each non-stickyNote node's `size` by its canvas shape so Studio Web renders it correctly: inline agents (`shape: rectangle`) → `{ "width": 288, "height": 96 }`, containers (loops/groups) → `{ "width": 560, "height": 320 }`, everything else (incl. referenced `uipath.core.agent.<guid>`) → `{ "width": 96, "height": 96 }` (skipping this leaves stale dimensions intact and produces misshapen nodes)
|
|
387
|
+
- Recurses into subflows and rewrites `subflows[<id>].layout`
|
|
388
|
+
- Backfills missing `position`/`size` entries
|
|
389
|
+
|
|
390
|
+
Standalone (only if not chained from Step 5):
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
uip maestro flow format <ProjectName>.flow --output json
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
## Completion Output
|
|
397
|
+
|
|
398
|
+
When you finish building the flow, report to the user:
|
|
399
|
+
|
|
400
|
+
1. **File path** of the `.flow` file created
|
|
401
|
+
2. **What was built** — summary of nodes added, edges wired, and logic implemented
|
|
402
|
+
3. **Validation status** — whether `flow validate` passes (or remaining errors if unresolvable)
|
|
403
|
+
4. **Format status** — confirm `flow format` was run
|
|
404
|
+
5. **Mock placeholders** — list any `core.logic.mock` nodes that need to be replaced, and which skill to use
|
|
405
|
+
6. **Missing connections** — any connector nodes that need connections the user must create
|
|
406
|
+
7. **Open Questions** — every step the request left undecided, each prefixed `**[REQUIRED]**` or `**[OPTIONAL]**`. On the scaffold-only path ([Scope gate](#scope-gate--count-what-the-request-names)) there are no decided steps, so state the outcome the user asked for and ask which steps it needs — the scaffold records no intent on its own
|
|
407
|
+
8. **What's next** — ask the user, presenting the dropdown below (see the dropdown question rule in [SKILL.md](../../SKILL.md))
|
|
408
|
+
|
|
409
|
+
### What's next dropdown
|
|
410
|
+
|
|
411
|
+
Authoring terminates here. Each option below hands off to Operate — read [operate/CAPABILITY.md](../operate/CAPABILITY.md) for the command sequence.
|
|
412
|
+
|
|
413
|
+
| Option | What it does |
|
|
414
|
+
| --- | --- |
|
|
415
|
+
| **Publish to Studio Web** | Push the solution to Studio Web so the user can visualize, edit, and publish from the browser. |
|
|
416
|
+
| **Debug the solution** | Execute the flow end-to-end against real systems. Consent comes from the mandate, not from this menu — see the `flow debug` rule in [SKILL.md](../../SKILL.md). Selecting it here is the user asking for a run. |
|
|
417
|
+
| **Deploy to Orchestrator** | Pack and publish directly to Orchestrator (bypasses Studio Web). Only when explicitly chosen — see [/uipath:uipath-platform](/uipath:uipath-platform). |
|
|
418
|
+
| **Something else** | Last option. Accept free-form string input and act on it (e.g., "just leave it", "pack but don't publish", "upload to a different tenant"). |
|
|
419
|
+
|
|
420
|
+
When the original request already named the next step ("publish it", "deploy to Orchestrator", "run debug and iterate"), that instruction **is** the selection — act on it and skip the menu. Show the menu only when the next step was left unspecified, and then do not run any of these actions without explicit user selection. Once the option is settled, read [operate/CAPABILITY.md](../operate/CAPABILITY.md) and follow that capability's flow — do not run operate commands from inside this doc.
|