The migration path reads a UiPath project and answers one question before it changes anything: which parts of this workflow does TaskSultan already implement? The answer comes per activity, from the repository's own code, and it names what blocks a unit rather than averaging a blocker away.
#What converts
uipath evaluate walks a Studio project (project.json plus .xaml files) or a published package and classifies
every authored activity into one of four verdicts.
- DIRECT: the platform does this today with an existing surface. Logging, delays and retry scopes, assignments, data-table and collection operations, the whole control-flow family, the Excel range family, the file family, the send-mail family, the queue and credential activities and the HTTP activities all land here.
- COMPOSITE: the action maps but something beside it must be re-authored. UI activities are the large family:
Playwright performs the click or the type and the UiPath target metadata has to become a semantic target.
A nested
InvokeWorkflowFileis composite because a nested workflow becomes a typed function. - MISSING: the platform has no engine for it. Desktop application control, CV and OCR, Word and PowerPoint, PDF reading, inbox reading, Integration Service connectors, macros and VBA and the Testing assert family.
- REFUSE: the activity blocks an unattended run on purpose.
MessageBox,InputDialogand the form activities belong here, because the Action Centre is the designed replacement, not an activity.
On the operator's own corpus the evaluator measured 82.7% of authored activity usage landing on a capability that exists. The number to hold beside it is that about 48% of the files carrying a recognisable selector point at a desktop application and no activity table changes that: those units are blocked by architecture rather than by a missing action.
#What does not convert
Two axes fail for different reasons and the report keeps them apart.
The first axis is the activity verdict above. The second is whether the workflow's stored element targets can be
addressed at all. UiPath keeps a selector string; TaskSultan addresses elements semantically through getByRole,
getByLabel or getByText. The static synthesiser derives a semantic locator from the selector's own attributes,
and on the measured corpus that worked for 67 of 2,448 stored targets, or 9.4% of the web element targets. Most
selectors carry no accessible name, a positional index, or a CSS chain the locator policy forbids.
That is why the path has a live pass. uipath bind opens the pages the workflow declares and asks the running
page, rather than the stored string, for each element's identity.
#The shape of the conversion
The verbs run in order and nothing is written until you say so.
# 1. can this convert at all? Nothing is written.
npx tsx orchestrator/cli.ts uipath evaluate ./MyProject --json
# 2. what do the stored targets become? Snippets and TODOs.
npx tsx orchestrator/cli.ts uipath targets ./MyProject
# 3. bind the targets against the live pages.
npx tsx orchestrator/cli.ts uipath bind ./MyProject --url https://example.test
# 4. model the behaviour, then emit staged code.
npx tsx orchestrator/cli.ts uipath ir ./MyProject
npx tsx orchestrator/cli.ts uipath codegen ./MyProject --out ./staged
uipath emit is the one conversion verb that can write installed files and only when you pass --install.
Everything else stages or reports. Behaviour translation is the newest part of the path and it is partial: the
codegen carries every construct it cannot translate as a TODO(conversion) marker and counts it in a manifest, so
a half-converted workflow declares its own incompleteness rather than looking finished.
#Things that catch people out
- An
UNCLASSIFIEDactivity is not fine. It is a name with no rule yet and it blocks the unit exactly asMISSINGdoes. - A file that cannot be read makes the whole unit
ERROR, not clean. A truncated XAML reporting zero activities is the failure the evaluator exists to prevent. - The static target count and the live bind count are different numbers on purpose. Bind reports what the page allows, not what the string contained.
- The emitted automation is a candidate, not an installed one.
uipath codegenwrites only into--out.