Phone Harness
ShawnPana/phone-harness
Control the user's phone - an iPhone through the Mac's iPhone Mirroring window, an Android over adb, a rented cloud Android, or a cloud iPhone over HTTPS: open apps, tap, type, swipe, read the screen.
UiPath Maestro BPMN / Process Orchestration: author (registry-driven), validate, package, operate, and diagnose .bpmn projects.
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install UiPath/skills uipath-maestro-bpmn --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/uipath-maestro-bpmn .claude/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .claude/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmnType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install UiPath/skills uipath-maestro-bpmn --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/uipath-maestro-bpmn .agents/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .agents/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install UiPath/skills uipath-maestro-bpmn --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/uipath-maestro-bpmn .cursor/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .cursor/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/UiPath/skills.git --path skills/uipath-maestro-bpmn--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install UiPath/skills uipath-maestro-bpmn --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/uipath-maestro-bpmn .gemini/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .gemini/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install UiPath/skills uipath-maestro-bpmnInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/uipath-maestro-bpmn .github/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .github/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add UiPath/skills --skill uipath-maestro-bpmn -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install UiPath/skills uipath-maestro-bpmn --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/UiPath/skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/uipath-maestro-bpmn .opencode/skills/uipath-maestro-bpmn && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "uipath-maestro-bpmn" agent skill from https://github.com/UiPath/skills/tree/main/skills/uipath-maestro-bpmn into .opencode/skills/uipath-maestro-bpmn/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "uipath-maestro-bpmn", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
uipath-maestro-bpmnUiPath Maestro BPMN / Process Orchestration: author (registry-driven), validate, package, operate, and diagnose .bpmn projects.
Uipath Maestro Bpmn is an agent skill from UiPath/skills. UiPath Maestro BPMN / Process Orchestration: author (registry-driven), validate, package, operate, and diagnose .bpmn projects. For .flow use uipath-maestro-flow; for case plans use uipath-maestro-case.
Its SKILL.md is about 11k tokens, which your agent loads only when the skill is triggered. The skill folder holds 29 other files, including reference files (for example `references/cli-conventions.md`, `references/diagnose/CAPABILITY.md` and `references/diagnose/failure-modes.md`).
It sits in Mobile, covering Mobile testing and debugging. The repository describes itself as: This is a repository of skills for interfacing UiPath capabilities to external developers. The licence is MIT.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 0bada1b. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
BashReadWriteEditGlobGrepAskUserQuestionFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
python3jqFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
w3.orgFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
FOLDER_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Uipath Maestro Bpmn loads about 11k tokens when it runs, and up to ~65k if it reads all its reference files. Until then it costs about 56 tokens; SKILL.md has 5,311 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestionAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from UiPath/skills at commit 0bada1b, republished under its MIT licence (© UiPath). 5,311 words, ~10,965 tokens.
.claude/skills/uipath-maestro-bpmn/SKILL.md (or your agent's skills folder). This skill also uses 25 other files; get the full folder from GitHub.jq select), never truncate it (head, sed -n).Work with UiPath Maestro (Process Orchestration) .bpmn projects across their
lifecycle: author, validate, package, operate, and diagnose. Authoring is
registry-driven for registered nodes: their execution payloads come from
templates the registry serves. The structural BPMN and serializer-owned scaffold
metadata that hold those nodes together (process scaffold, variables, bindings,
entry points, sequence flows, gateways, events, boundary events, containers,
multi-instance markers, and the diagram) are authored from the documented spec
and canvas contract. Packaging, operating (upload, publish, run, manage), and
diagnosing are driven through the UiPath CLI, covered in the capability
references below.
.bpmn from a description, or from an image of a process
(sketch, whiteboard or sticky-note photo, screenshot of another diagram)..bpmn structure: gateways, events, boundary events, subprocesses, call
activities, multi-instance loops, sequence-flow conditions, variables..bpmn against the canvas rules before import..bpmn (preserve what you did not author)The skill can edit an existing file. If the edit introduces one of the shapes in
Patterns, use that guide — inserting a pattern into a running
process is a normal edit, not a reason to skip the shape. Make surgical
edits and preserve content you did not author: unknown uipath:* elements, uipath:migrationVersion,
tags, imported Integration Service payloads, and stable element IDs. Do not
regenerate the whole file or drop extension data the skill does not recognize —
preserve-only structures (see the blocklist in
references/structural-bpmn.md) round-trip
untouched. Never normalize existing nodes to this skill's canonical templates:
do not add missing attributes (e.g. type="json" target="bodyField" on an
existing uipath:input) to elements the edit does not target — on untouched
neighbors only wiring (bpmn:incoming/bpmn:outgoing) may change.
For an existing ScriptTask, preserve its mapping discriminator and
uipath:scriptVersion, and do not normalize a working brownfield node merely
because the new-node authoring contract differs. Migration requires explicit
confirmation — see
references/structural-bpmn.md.
For .flow JSON use uipath-maestro-flow; for XAML/coded workflows use
uipath-rpa; for Python agents use uipath-agents; for Case plans use
uipath-maestro-case.
Two halves make a valid Maestro .bpmn:
uipath:activity / uipath:event / uipath:mapping, its
context, input, output, and bindingInfo) comes from
uip maestro bpmn registry get <type>'s xmlTemplate. Never hand-author a
registry-owned node payload from prose.<bpmn:definitions>/<bpmn:process>, no sequence flows, no gateway
conditions/defaults, no event-definition payloads, no boundary-event
attributes, no subprocess/loop structure, and no diagram. Serializer-owned
scaffold extensions such as uipath:variables, uipath:bindings,
uipath:entryPointId, and uipath:migrationVersion also come from this
contract rather than a node template. Author these from
references/structural-bpmn.md, which is
grounded in the registry spec, the CLI scaffold, and the canvas serializer.Seven recurring process shapes, for building a new process and for extending one that already runs. Each guide gives a worked-out topology — nodes, wiring, gateway conditions, variables — and the reasoning behind it. Many topologies pass validation for the same request; these are known-good shapes, not specifications. Adapt them: add steps, drop branches, and change counts as the process needs. Each guide's "Why it works" names the parts that carry the shape — change those and you are building something else, so say so. Read the guide for each pattern the process actually uses — one for a simple process, several for a composed one — and none for a pattern you are not building.
Every guide's shape table marks each node Entry (omit when inserting into a
process that already runs), Mechanism (changing it changes the pattern), or
Placeholder (bind it, or skip it if the process already does this). Author
the element the table names. A Placeholder whose target step 1 did not
resolve is that element with its registry payload and the identity slots left
as public placeholders, never a bare bpmn:task standing in for the work.
| Pattern | Reach for it when | Guide |
|---|---|---|
ai-decision-review | AI makes one call; act on it, or a human reviews it | ai-decision-review-guide.md |
approval-chain | A request needs sign-off from several people | approval-chain-guide.md |
smart-triage | Inbound work sorted into categories, each handled elsewhere | smart-triage-guide.md |
external-wait | The process waits on an outside party under an SLA | external-wait-guide.md |
high-volume-batch | Many independent items processed in one run | high-volume-batch-guide.md |
failure-escalation | Unhandled failures must never disappear silently | failure-escalation-guide.md |
queue-distribution | An Orchestrator queue hands work across runtimes | queue-distribution-guide.md |
Do not reach for a pattern when the ask is a short linear process, a single node, or a change that does not introduce one of these shapes. A pattern is never a wrapper to retrofit onto work that does not need one.
Using more than one pattern in one process? Read references/patterns/composing-guide.md first — which pattern keeps its start event, the four ways the rest join it, how variables cross a nesting boundary, and the two placements the engine constrains. A single pattern needs only its own guide.
When the process comes from an image, the job is transcription: every item in the image becomes a node and every visible connector becomes a flow. A plausible process "inspired by" the image is not a transcription. The usual failure is dropping and merging items while summarizing, then building from the summary.
validate passes, look at the
image again and compare it with the BPMN node by node and flow by flow.
Report any remaining mismatch rather than calling the result done.
Validation proves the file is structurally valid, not that it matches the
image.Work the six steps quickly, but keep the path matched to the user's ask. Treat
requests to discover before authoring, save raw registry JSON/evidence, or "do
not author yet" as discovery-only even if they describe an eventual BPMN. In
that mode, immediately create registry-evidence/, run and save registry pull --output json, registry list --output json or registry search ... --output json, and registry get <type> --output json for each requested type; do not
read deep authoring references or scaffold a project. For authoring asks, author
early: do not pre-read every reference before writing. Read a reference only
when you reach the structure it covers, and read only the section covering it —
references/structural-bpmn.md opens with a
section index naming every anchor. Get the needed templates, then write the
first complete draft before further spelunking.
For registry-evidence-only tasks, follow the command-first recipe in references/registry-workflow.md.
uip maestro bpmn registry pull once (cached for the
session — do not re-pull), then list / search to map intent to extension
types; uip is connections list --all-folders for live connections (always
--all-folders — a folder-scoped list silently misses connections). Never
fabricate an identifier; ask only under Rule 4, otherwise decide. Bind each
connector node to an Enabled connection for its connector: the one in the
folder the task names, else IsDefault Yes, else the first. Confirm it
with uip is connections ping <id> --output json (Data.Status must be
Enabled; the list's State is cached) and fall to the next candidate when
it is not. Another owner is no reason to skip it; name each bound
connection's Name, Owner, and Folder (never its Id) as a Rule 4 assumption.
Use placeholders only when the user asked for a draft, a handoff, or
placeholder, synthetic, public-safe, or sanitized values, or when no
candidate pings Enabled.
See references/registry-workflow.md.uip maestro bpmn registry get <type> --output json for
each chosen registry-owned node only. Fetch every chosen template in one
Bash call, not one command per turn — each shell round-trip is a model turn
and dozens of them exhaust the run's time budget before authoring finishes:
for t in TypeA TypeB TypeC; do uip maestro bpmn registry get "$t" --output json; done.
Enrich Intsvc.* connector nodes with --connection-id/--object-name; take
--object-name from the table in
references/registry-workflow.md
— a connector exposes several objects per operation and describe does not
rank them. Do not call registry get for structural
gaps the registry never owns: sequence flows, gateways, events, boundary
events, multi-instance/loop markers, errorMapping/retry structure, or
diagrams. On every bpmn: tag you paste, opening and closing, lowercase
the first letter after bpmn:: <bpmn:UserTask> → <bpmn:userTask>,
<bpmn:ServiceTask> → <bpmn:serviceTask>. Preserve the uipath:*
payload exactly.
BPMN.ScriptTask is the registry lookup key, but a new node serializes
<uipath:type value="BPMN.Variables" version="v1" /> — never the lookup
key. Local validation accepts the older discriminator, so a clean
validate does not prove that mapping is right. For the compatibility
fallback and its scope, see
references/structural-bpmn.md#script-tasks--jint-authoring-contract.xmlTemplate (fill placeholders only). That skeleton shows
a stable manual entry point, one structural task, and complete DI. Do not
reverse-engineer authoring patterns from task fixtures, generated package
files, or any installed package bundle under node_modules — such
spelunking is the top reason authoring runs out of time.
Add only the structural pieces your process needs (extra
gateways, events, boundary events, containers, multi-instance markers,
expression/error mappings, retry attributes). Leave the diagram to step 4;
do not hand-author bpmndi:* while the source is still moving. For a new local project, initialize the
supported scaffold with uip maestro bpmn init <ProjectName> --output json,
edit at the returned Data.Path, and preserve its generated metadata. For a
source-only draft the user has not asked to package or operate, pass
--skip-solution-registration so no *Solution/ wrapper or .uipx is
created. init takes a project name, not a path, and writes under the
current directory: ./<ProjectName>/ with that flag or inside an existing
solution, ./<ProjectName>Solution/<ProjectName>/ otherwise.<!--skill-flavor:named-solution-init:start-->
When the user names a solution ("a solution of the same name" is
<ProjectName>, not <ProjectName>Solution), create it and run init
from inside it:
uip solution init <SolutionName> --output json
cd <SolutionName> && uip maestro bpmn init <ProjectName> --output json A Data.AutoCreatedSolution in the response means init ran outside the
solution: re-run it from inside and report the stray directory.
<!--skill-flavor:named-solution-init:end-->
To land a
project at a path the user named, mkdir -p its parent and run init there
with the leaf as the name — and either pass --skip-solution-registration
or make that parent a solution first, because default init inserts a
<ProjectName>Solution/ level the requested path does not have. Check
Data.Path against the requested path before editing. The
init scaffold declares no xsi namespace: add
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" to
bpmn:definitions before writing any xsi:type attribute. See
references/shared/local-metadata-regeneration-guide.md.
The runnable BPMN/start-event path belongs in lowercase operate.json.main,
never project.uiproj.main.
When adding draft or preserve-only case-management variants, include a real
lowercase <uipath:caseManagement version="v1">...</uipath:caseManagement>
payload with synthetic content as a separate preserve-only extension. Do not
treat an Orchestrator.StartCaseMgmtProcess* typed activity shell as a
substitute for that payload when the user asks to preserve case-management
contract variants.
When asked to preserve a generic unsupported uipath:Activity, write the
actual capitalized element <uipath:Activity version="v1">...</uipath:Activity>.
Do not write <uipath:activity><uipath:type value="uipath:Activity" ... />;
that is a lowercase typed shell, not the preserve-only generic payload.
When writing public-safe placeholders into XML attribute values, XML-escape
angle brackets: use <TENANT_URL>, <FOLDER_KEY>, and
<CONNECTION_NAME> in attributes. Raw <PLACEHOLDER> text is only safe
in element text or CDATA; unescaped angle brackets inside attributes make the
BPMN not well-formed.
When routing on an Actions.HITL user task's outcome, the sequence-flow
conditions from the exclusive gateway must reference the exact variable bound
by the HITL template's <uipath:output ... var="..."> (for example
=vars.Var_HitlResult == "approve"), not only a copied or derived script
variable.
For an Intsvc.* activity whose inputTarget is body
(Intsvc.ActivityExecution and its async, agent, and workflow variants),
these rules override the template's InputNotes, DiscoveryNotes, and
ContextFieldNotes:
<uipath:input name="body" type="json" target="body"> holding the whole request object in CDATA, never one
input per field and never a bare array. Dotted names nest
(fields.project.key → {"fields":{"project":{"key":…}}}); users[*]
is an array under users ({"users":["U1","U2"]}). See
Body shape.Parameters. Each Required: true entry (Slack send_as)
is its own uipath:input with target set to its Type, after
</uipath:context>, valued from the request, else its DefaultValue. See
Parameters.operation (Intsvc.ActivityExecution only) is the described
Operation.Name (Create, List, Retrieve, Update, Delete,
Replace), never the activity's Name.UploadFileToRecordField,
DownloadFileFromRecordField, and DeleteFileFromRecordField, never the
V2 objects uip is resources list shows. See
Picking the object.folderKey (Intsvc.ActivityExecution only). Keep the template's
folderKey context input as =bindings.<folderBindingId> plus its
folder binding on every node that binds a connection. Without it the run faults 102010 Value cannot be null (Parameter 'Folder'). See
Bindings.Reference field takes the looked-up id (Rule 2). A body
value without a leading = is a literal: write "=vars.<id>", and make
text mixed with variables one =js: expression
("=js:'Severity: ' + vars.Var_Severity").
For an Integration Service draft or boundary handoff the user asked for (a
request that only says to validate is not one), emit only the
.bpmn plus the notes file — do NOT create the four generated package files
(Rule 16); authoring them fails the boundary the task tests. The node itself
is still authored: paste the registry's Intsvc.* template and keep the
shell that template declares — uipath:activity for activities,
uipath:event for Intsvc.WaitForEvent and Intsvc.EventTrigger (Rule 6)
— plus its context and output, filling the resource identity slots with the
escaped public placeholders. Event context references the connection as
connectionId, activities as connection. A host element carrying neither
shell, such as a bare bpmn:sendTask with no uipath:activity, is a
missing node, not a draft. Only the resolved values are CLI-owned — see
references/registry-workflow.md.
For Integration Service draft notes, name every CLI-owned blocker literally,
including the exact phrase connection binding, plus dynamic schemas,
generated outputs, bindings_v2.json, and package metadata. Avoid softer
wording such as "connection and process binding" because it hides the concrete
artifact the CLI must supply.
Run uip maestro bpmn refresh <project-path> after any edit that changes a
start event id or adds or removes an entry point — not only when packaging
or operating. Lay the diagram out first (step 4): refresh validates
before it writes, so a node you just added fails it with MISSING_DI_SHAPE. operate.json and entry-points.json are generated once and
do not follow source edits, so step 5's validator fails on the mismatch:
entry-points.json references start event "Event_start" via filePath, but no <bpmn:startEvent id="Event_start"> exists. Authoring from the skeleton above
renames the initializer's Event_start, so a source-only draft needs this
too. Keep the output as written — that shape is the contract pack consumes.
refresh requires an init-generated project: with no
project.uiproj it fails Required file is missing / RetryWillNotFix.
For a bare .bpmn (the shape of this repo's edit fixtures), write the
two-key project.uiproj first — { "Name": "<ProjectName>", "ProjectType": "ProcessOrchestration" } — then refresh, which writes the
rest. Only fall back to the equivalent hand-authored shape in
references/shared/local-metadata-regeneration-guide.md
when the CLI is unavailable. Do not copy CLI scaffold metadata shapes into a
synthetic local project. Every root manual start event needs a
<uipath:entryPointId value="<uuid>" /> child in its extensionElements;
without one refresh fails the whole project RetryWillNotFix instead of
writing an empty entry-point list. A connector or timer start is not
manual, so a project that runs refresh or pack keeps the initializer's
manual start alongside it; only a source-only draft replaces it. Clearing
the resulting stale-entry error by editing or deleting entry-points.json
instead of running refresh passes validate and pack while shipping an
empty bindings_v2.json.
Give public inputs and outputs explicit runtime bridges, and converge routes
returning one result on a single completion EndEvent — for the two-layer
contract see
references/structural-bpmn.md.Lay out the diagram. After the last source edit, and before any
validate, refresh, or pack — including the refresh step 3 calls for:
uip maestro bpmn format <file.bpmn>It overwrites the file's bpmndi:BPMNDiagram in place, so the canvas
renders the process arranged instead of stacked at the origin. Every
deliverable gets this, source-only drafts included. It is also a hard
precondition for the next two steps, not a cosmetic pass: a node with no
BPMNShape or a flow with no BPMNEdge fails validate with
MISSING_DI_SHAPE / MISSING_DI_EDGE, no diagram at all fails it with
BPMN_PARSE_ERROR, and refresh validates before it writes, so it fails
the same way. Edit the source again and the layout is stale — re-run this
step before re-validating. If format reports unknown command, update the
CLI (see references/cli-conventions.md); if
upgrading is unavailable, hand-author the fallback DI structure in
references/structural-bpmn.md.
Validate. Check well-formedness first. validate tokenizes with a
tolerant parser and reports Valid on XML with an unbound namespace
prefix, so a ParseError here is a source defect to fix before anything
else. Then run the CLI validator, which runs the full PO.Frontend canvas
rule set (structural rules plus variable, method-call, input-type, and
event-object checks) offline, plus deploy-readiness checks:
python3 -c "import sys, xml.etree.ElementTree as ET; ET.parse(sys.argv[1])" <file.bpmn> &&
! grep -nE '</?bpmn:[A-Z]' <file.bpmn> &&
uip maestro bpmn validate <file.bpmn> --output jsonvalidate ignores tag case; a line the grep prints is a tag to lowercase
(step 2).
Exit 0 = valid. Exit 1 = a parse error, a grep hit, or a validate
failure. Read severity from each issue's [error]/[warning] tag, not
from the Found N error(s) header, which counts errors while the list under
it prints warnings too. Fix only
error-severity findings, then re-run step 4 and validate again; stop
re-validating once every remaining finding is a warning or the placeholder
pair below. read but never assigned is a defect no error covers: nothing
writes a value the process reads, so a step that should produce it does not.
MISSING_RESOURCE (warning) and MISSING_BINDING (error) are one finding
about one unresolved node, and the binding half is a live tenant lookup.
Bind the node to a deployed resource. When the user asked for a
placeholder, draft, or boundary handoff, or step 1 found no Enabled
candidate, no invented identifier can clear
MISSING_BINDING (Rule 2): exit 1 / RetryWillNotFix is the
expected result. Report the pair once and continue; refresh (step 6)
succeeds with it unresolved. Fix every VARIABLE_DOES_NOT_EXIST warning:
it names a reference with no declaration. A VARIABLE_NOT_SET warning on
the node reading a start-event-scoped caller input is expected; see
references/structural-bpmn.md#validation.
[warning] [(xml)] unknown attribute <type> is expected noise from the
script-task template's <uipath:inputSchema type="jsonSchema">. Leave it.
type is required on uipath:input, uipath:output, and
uipath:inputOutput; removing it there fails the load with
BPMN_PARSE_ERROR ... to be a string. Do not bisect the file and do not
read package bundles under node_modules to find the rule.
Validation is structural preflight, not runtime proof — see references/cli-conventions.md. When execution is authorized, inspect runtime variables, element executions, and incidents before reporting behavioral success.
If validate reports "unknown command" or clearly skips the
structural rules, the installed CLI predates them — update it (see
references/cli-conventions.md). See
references/structural-bpmn.md#validation.
Refresh derived metadata. Once step 5 leaves no fixable error, regenerate the four CLI-owned package files:
uip maestro bpmn refresh <project-path> --output jsonTreat a nonzero result as a source/precondition failure: fix the BPMN or
project.uiproj, re-run steps 4 and 5, and refresh again — never repair the generated
JSON by hand. Refresh after binding a connection (step 1) and for a
package-ready, upload, debug, publish, or deploy deliverable; a source-only
draft needs it only for step 3's start-event edits. For the full
contract (scope, idempotency, binding rules) see
references/shared/local-metadata-regeneration-guide.md.
Beyond authoring, this skill packages, ships, runs, and diagnoses Maestro projects through the UiPath CLI.
uip maestro bpmn ... --output json read,
one literal command per read, never a loop (rule 9 there);
local .bpmn source and generated package files are read from disk as usual.
Never substitute the files backing that CLI for the CLI itself — see rule 3
in that reference.Any cloud-side change (upload, publish, deploy, run, pause, resume, cancel, retry, migrate) requires explicit user consent, and local validation should pass first.
This skill teaches authoring of the full surface the canvas supports. What the registry serves a template for vs. what you author by hand:
| Structure | Source |
|---|---|
Node uipath:* payloads (RPA, agent, HITL, queue, business rule, API workflow, IS connector, internal message, timer, script) | Registry xmlTemplate |
<uipath:variables> declarations (each with an elementId) | Authored (registry gap) |
<bpmn:definitions>/<bpmn:process> scaffold + namespaces | Authored (registry gap) |
Sequence flows, conditionExpression, gateway default | Authored (registry gap) |
| Gateways: exclusive, parallel, inclusive, event-based (complex is preserve-only) | Authored (registry gap) |
| Events + event-definition matrix: message, timer, error, terminate (end-only). Signal/escalation/conditional/link/compensate/cancel/multiple are preserve-only | Authored (registry gap); payload per canvas serializer |
Boundary events: attachedToRef, interrupting/non-interrupting (cancelActivity) | Authored (registry gap) |
Subprocess, event subprocess (triggeredByEvent), call activity | Authored (registry gap); call-activity payloads from registry |
| Multi-instance / loop characteristics | Authored from canvas contract — registry exposes no template (registry gap) |
bpmndi:BPMNDiagram (shape per node, edge per flow) | Generated via uip maestro bpmn format <file.bpmn> — registry emits none (registry gap) |
Flagged registry gaps: the registry serves no template for structural BPMN, sequence-flow conditions, event-definition payloads, boundary-event attributes, multi-instance markers, or the diagram. These are authored from the spec + canvas contract in references/structural-bpmn.md and honestly surfaced to the user as gaps when asked.
registry get templates; author serializer-owned scaffold
metadata only from the structural/canvas contract. Never invent either from
prose.describe entry carries Reference takes the LookupValue a
live lookup returned, never the name the user wrote. See
references/registry-workflow.md.BPMNShape, every flow a BPMNEdge, or it will not appear on the canvas.
uip maestro bpmn format <file.bpmn> generates the whole diagram; run it as
the last write to the .bpmn and before validate or refresh, both of
which error on a node with no shape.uipath:activity /
uipath:event / uipath:mapping templates declare their type as a nested
<uipath:type value="<Type>" version="v1" />. Some runtime-authored
templates use the payload's type attribute instead; notably,
Orchestrator.StartAgentJob is a direct child of bpmn:ServiceTask with
<uipath:activity type="Orchestrator.StartAgentJob" version="v1">. Both
declarations are supported. Paste the selected registry template literally
and do not normalize one form into the other.
Event extension types (Intsvc.WaitForEvent, Intsvc.EventTrigger,
Maestro.ReceiveMessageEvent, Maestro.SendMessageEvent) must use
<uipath:event>, including when the BPMN host is task-like such as
<bpmn:receiveTask>.-- in XML comments. XML forbids -- (double-hyphen) inside
<!-- … -->, so never paste CLI commands or flags (--output,
--connection-id, --object-name) into a comment — it makes the file
unparseable. Keep comments minimal.--output json for parsed CLI calls..bpmn and the CLI-generated
bindings_v2.json), a connection binding and its folder key take the real
IDs step 1 bound (step 1 names when placeholders apply). Notes, and examples
or fixtures added to this skills repository, stay sanitized.uipath:retry on the activity. Never draw a retry loop from gateways
and timer events. See
references/structural-bpmn.md.bindings_v2.json, entry-points.json, operate.json, or
package-descriptor.json. Run uip maestro bpmn refresh <project-path> to
generate them — never the deprecated update-metadata. An
Integration Service draft or boundary handoff the user asked for (step 3)
asks for none of those — emit
only the .bpmn plus a .md notes file naming the CLI-owned blockers.name and folderPath, keyed <folderPath>.<name>, per
registry-workflow.md § Business rule bindings.)<!--skill-flavor:delegated-resource-solution-first:start-->
(1) Create or open the solution first (uip solution init; on
unknown command, the older uip solution new), and
author the resource's project inside it, so it registers in the
.uipx: run the resource's init and uip maestro bpmn init from the
directory holding the .uipx, as in Assemble. A project created
outside any solution has no path to deployment.
<!--skill-flavor:delegated-resource-solution-first:end-->
<!--skill-flavor:delegated-resource-author-deploy:start-->
(2) Delegate authoring to the resource's owning skill (e.g.
uipath-api-workflow, uipath-rpa) with an explicit argument contract:
declared inputs and outputs, not an unauthored scaffold. (3) Deploy the
resource (pack, publish, solution deploy run) before binding it into
the BPMN node; its release key and folder key exist only once deployed.
To redeploy, follow uipath-solution's upgrade path.
<!--skill-flavor:delegated-resource-author-deploy:end-->
(4) Pick the wrapper by ProcessType, read from
uip or processes list --folder-path <path> --all-fields --output json
(registry-workflow.md);
a low-code agent uses Orchestrator.StartAgentJob, whose template (rule
6) binds name and folderPath, not rule 18. For a rule-18 wrapper, read
the same response's Key and FolderKey (PascalCase, like the default
list; the default list without --all-fields omits ProcessType) and
bind per rule 18, never a fabricated or placeholder key. Re-read both
after every deploy: deploy run creates a new folder, so a literal
folderKey from an earlier deploy points at the old one. (5) Unless the task forbids
live runs or asks for a draft or handoff, run the process
(uip maestro bpmn debug) and read the node's output in
debug-instance variables-all. Map =result.<key> to the key that output
used; a scalar can surface under a generic key instead of the schema
property name. Without a run, use the schema name and report the mapping
as unverified. A business rule maps its whole result as one output from
=result, never one output per decision or column.
18. Job-wrapper registry templates (Orchestrator.StartJob,
ExecuteApiWorkflowAsync, StartAgenticProcess[Async],
StartCaseMgmtProcess[Async]) serve an unresolved releaseKey that
validates but faults at runtime. This is the one exception to rule 6's
paste-literally. For all of them, bind releaseKey via
=bindings.<id> to the resource's Key. For ExecuteApiWorkflowAsync
only, also add a literal folderKey with the folder's FolderKey and
drop folderId, folderPath, and name. For the others, keep the
template's remaining fields and make that swap only after a live run
faults with key:FolderKey; without a run, report the node unverified. Details:
references/registry-workflow.md.
| Topic | Read |
|---|---|
| Discover → template → bind → assemble loop | references/registry-workflow.md |
| Structural BPMN, event matrix, boundary events, containers, multi-instance, diagram, validation | references/structural-bpmn.md |
| Worked-out topology for a recurring process shape, and how shapes compose | Patterns table above → references/patterns/*-guide.md |
Runtime expressions, vars./bindings./iterator., =js: (Jint) syntax | references/expression-authoring.md |
| CLI conventions and the side-effect boundary | references/cli-conventions.md |
| Keeping content public-safe | references/public-safety.md |
| Package, upload, publish, run, or manage instances | references/operate/CAPABILITY.md |
| Diagnose a failed or misbehaving run | references/diagnose/CAPABILITY.md |
| Project layout and generated package files | references/shared/project-layout.md |
© UiPath, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 25 other files (references) in skills/uipath-maestro-bpmn of UiPath/skills.
Open the folder on GitHubat commit 0bada1b
Uipath Maestro Bpmn next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Uipath Maestro Bpmn this skillUiPath/skills | 167 | — | ~11k | Automated safety check: Notes | MIT | |
| Phone HarnessShawnPana/phone-harness | 3.2k | — | ~7.7k | Automated safety check: Pass | MIT | |
| Maa Issue Log AnalysisMaaAssistantArknights/MaaAssistantArknights | 24k | — | ~4k | Automated safety check: Pass | AGPL-3.0 | |
| Mobile QAtloncorp/tlon-apps | 107 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Store Listing Screenshotstherxmv/Telegram-Themer | 119 | — | ~2.5k | Automated safety check: Pass | None | |
| Maestro ImproveReinaMacCredy/maestro | 233 | — | ~1.9k | Automated safety check: Pass | MIT |
ShawnPana/phone-harness
Control the user's phone - an iPhone through the Mac's iPhone Mirroring window, an Android over adb, a rented cloud Android, or a cloud iPhone over HTTPS: open apps, tap, type, swipe, read the screen.
MaaAssistantArknights/MaaAssistantArknights
分析 MaaAssistantArknights 上游仓库公开 Issue(https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/...
tloncorp/tlon-apps
Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.
therxmv/Telegram-Themer
Generate TelegramThemer's Play Store listing images — capture the 8 required app screenshots on a running emulator/device by driving the real UI with adb, then composite them into the final…
ReinaMacCredy/maestro
Turn filed lessons into the smallest doctrine edit. An agent skill from ReinaMacCredy/maestro.
yang1ming/android-harness
Direct Android device control through ADB. An agent skill from yang1ming/android-harness.
UiPath/skills
UiPath automation discovery — mines Slack/email/wikis/CRM/HRIS/ERP for repetitive work, SPOFs, and replicable models; produces a 4-tier prioritized opportunity report with UiPath implementation…
UiPath/skills
Maintain build-time skill flavors in the UiPath skills repository.
UiPath/skills
UiPath Coded Functions — deterministic Python or TypeScript/JavaScript units built with the uip function CLI (new -l py|ts|js, init, serve, run, pack, publish); the functions map in uipath.json…
UiPath/skills
TRIGGER for authoring, operating or diagnosing UiPath Maestro BPMN.
UiPath/skills
TRIGGER for authoring UiPath Maestro Case plans as <Name.case.ts with the reference-mode TypeScript builder SDK (@uipath/maestro-builder-sdk/case), compiling to caseplan.json, and running the uip…
UiPath/skills
UiPath causal investigation across every product, runtime, and activity package.
Categories
UiPath Maestro BPMN / Process Orchestration: author (registry-driven), validate, package, operate, and diagnose .bpmn projects. Uipath Maestro Bpmn is an agent skill from UiPath/skills.bpmn projects.
Uipath Maestro Bpmn fits situations like: tasks that involve Mobile testing and debugging.
Run `npx skills add UiPath/skills --skill uipath-maestro-bpmn -a claude-code`. Or copy the skill folder (skills/uipath-maestro-bpmn in UiPath/skills) into .claude/skills/uipath-maestro-bpmn in your project. Claude Code loads it when a task matches its description.
Run `npx skills add UiPath/skills --skill uipath-maestro-bpmn -a codex`. Or copy the skill folder (skills/uipath-maestro-bpmn in UiPath/skills) into .agents/skills/uipath-maestro-bpmn in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add UiPath/skills --skill uipath-maestro-bpmn -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/uipath-maestro-bpmn, .gemini/skills/uipath-maestro-bpmn, .github/skills/uipath-maestro-bpmn and .opencode/skills/uipath-maestro-bpmn in your project.
Going by SKILL.md and its folder, Uipath Maestro Bpmn needs the command-line tools its instructions call (python3 and jq) and credentials named FOLDER_KEY. Our summary lists: Python 3. Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, Glob, Grep, AskUserQuestion.
SKILL.md names 1 domain. In commands or code: w3.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Uipath Maestro Bpmn is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 11k tokens (SKILL.md is roughly 44k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 54k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Uipath Maestro Bpmn: Phone Harness (ShawnPana/phone-harness, 3.2k stars), Maa Issue Log Analysis (MaaAssistantArknights/MaaAssistantArknights, 24k stars), Mobile QA (tloncorp/tlon-apps, 107 stars) and Store Listing Screenshots (therxmv/Telegram-Themer, 119 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
UiPath (a GitHub organization) maintains it in UiPath/skills, which has 167 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 10, 2026.
Source: UiPath/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.