@uipath/solution-tool 1.204.0 → 1.205.0-preview.258
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/README.md +3 -3
- package/dist/THIRD-PARTY-NOTICES.md +2 -2
- package/dist/archive-extract-x35t9ktj.js +120 -0
- package/dist/cleanup-command-service-rc5e42hk.js +149 -0
- package/dist/deploy-delete-service-qdbtj3qd.js +25 -0
- package/dist/deploy-run-service-m9mg34n5.js +25 -0
- package/dist/{deploy-status-service-3req7hje.js → deploy-status-service-kz3nk43q.js} +41 -33
- package/dist/deploy.js +23 -17
- package/dist/{deployment-search-3mah6f0a.js → deployment-search-jvwyaqek.js} +16 -10
- package/dist/{embedded-file-reader-rf2g1kfj.js → embedded-file-reader-z4becc02.js} +2 -2
- package/dist/{feed-resolver-bxj9xkgr.js → feed-resolver-3xb7ayx4.js} +10 -9
- package/dist/feed-scope-failure-qps17dv3.js +19 -0
- package/dist/{feed-session-sxga31vn.js → feed-session-7xqphdrg.js} +3 -3
- package/dist/governance-options-amc1v319.js +32 -0
- package/dist/index-6wak6hg6.js +667 -0
- package/dist/index-prm27bvm.js +138 -0
- package/dist/index.js +27 -29
- package/dist/init.js +11 -10
- package/dist/{list-s5pkkefj.js → list-7jy11vb4.js} +10 -8
- package/dist/models/pack-command-types.d.ts +15 -0
- package/dist/node-p1scvsw8.js +86 -0
- package/dist/pack-command-service-8etwpgm9.js +35 -0
- package/dist/pack-project-hjvbvhgx.js +97 -0
- package/dist/pack.js +24 -14
- package/dist/package-id-c18sx4mz.js +13 -0
- package/dist/packager-tool-09fwj7e8.js +171 -0
- package/dist/{packager-tool-nfmygm61.js → packager-tool-361zx07h.js} +74 -23
- package/dist/packager-tool-37jmavap.js +42 -0
- package/dist/{packager-tool-px1j9kre.js → packager-tool-3bwnkjdq.js} +2 -2
- package/dist/{packager-tool-gb35b4qs.js → packager-tool-43ahv5mn.js} +192 -96
- package/dist/packager-tool-47wzvqw0.js +86 -0
- package/dist/{packager-tool-gfhdpkp3.js → packager-tool-4bq36bf5.js} +25 -4
- package/dist/packager-tool-4jekgh4s.js +517 -0
- package/dist/{packager-tool-zns6n8zp.js → packager-tool-5ddtwzva.js} +1 -1
- package/dist/packager-tool-5edvzz80.js +543 -0
- package/dist/packager-tool-5y09xhx5.js +1333 -0
- package/dist/packager-tool-60af1hw2.js +26 -0
- package/dist/{packager-tool-f5gq77m5.js → packager-tool-61pwb567.js} +2 -2
- package/dist/{packager-tool-kdwsw2x7.js → packager-tool-69jmxeh0.js} +196 -1519
- package/dist/{packager-tool-yrz4mwfn.js → packager-tool-6kz1pv9f.js} +1373 -486
- package/dist/{packager-tool-stsnbewn.js → packager-tool-6x35kvbx.js} +17 -8
- package/dist/packager-tool-6ybywxxn.js +1809 -0
- package/dist/{packager-tool-wfkv9v8b.js → packager-tool-85pen8t9.js} +2196 -3455
- package/dist/packager-tool-8ptbmmmp.js +2132 -0
- package/dist/{packager-tool-9ex75r32.js → packager-tool-8q4tvv8d.js} +6 -4
- package/dist/packager-tool-8rg0s4w9.js +109 -0
- package/dist/{packager-tool-7gr2nphb.js → packager-tool-97rcgwvv.js} +224 -6
- package/dist/packager-tool-act5r386.js +239 -0
- package/dist/packager-tool-amhyxzz6.js +125 -0
- package/dist/{packager-tool-j3520gxw.js → packager-tool-an5bpbwe.js} +3556 -1646
- package/dist/{packager-tool-e2rtr49j.js → packager-tool-b2nhscfk.js} +15 -31
- package/dist/packager-tool-bqw7edje.js +188 -0
- package/dist/{packager-tool-4gs8y6pr.js → packager-tool-dwxswyv4.js} +149 -53
- package/dist/{packager-tool-fehvgd51.js → packager-tool-e7vczxa8.js} +357 -1370
- package/dist/{packager-tool-v8bkkqdb.js → packager-tool-gmwva4yv.js} +5 -5
- package/dist/packager-tool-gs3f3tf7.js +103 -0
- package/dist/packager-tool-kkfb5kgn.js +182 -0
- package/dist/{packager-tool-ds45xby2.js → packager-tool-m74zqwmh.js} +104 -14
- package/dist/{packager-tool-fv7xyzg2.js → packager-tool-pbmqk39a.js} +126 -128
- package/dist/packager-tool-q5j6k3fy.js +1510 -0
- package/dist/packager-tool-qk21gk5m.js +445 -0
- package/dist/{packager-tool-bqre28m1.js → packager-tool-qw47eyw7.js} +1 -1
- package/dist/packager-tool-resolver-994z3jkj.js +23 -0
- package/dist/{packager-tool-gab9y5ct.js → packager-tool-t8gh825q.js} +37 -13
- package/dist/{packager-tool-kswwd3hp.js → packager-tool-tx834spe.js} +2376 -4077
- package/dist/{packager-tool-zf3929se.js → packager-tool-v1f5e8t9.js} +11 -1
- package/dist/{packager-tool-g8kjzrg7.js → packager-tool-wknfv4p5.js} +13 -11
- package/dist/{packager-tool-1rzssy0x.js → packager-tool-wy4fx250.js} +19 -18
- package/dist/packager-tool-y2k2f6yg.js +68 -0
- package/dist/packager-tool.js +2 -2
- package/dist/prepare-solution-resources-m1djfj62.js +29 -0
- package/dist/project-command-utils-t6pmpvq3.js +90 -0
- package/dist/project-contributions-79ndycrx.js +32 -0
- package/dist/publish.js +13 -12
- package/dist/resource-mutations-c3krjqze.js +36 -0
- package/dist/resource-version-lookup-0e3e2j58.js +99 -0
- package/dist/resource.js +10 -9
- package/dist/restore-command-service-eyx911f2.js +155 -0
- package/dist/run-service-p1vzzqe3.js +428 -0
- package/dist/services/deploy-activate-service.d.ts +10 -5
- package/dist/services/deploy-delete-service.d.ts +8 -4
- package/dist/services/deploy-run-service.d.ts +34 -1
- package/dist/services/deploy-uninstall-service.d.ts +21 -3
- package/dist/services/deploy-upgrade-service.d.ts +35 -1
- package/dist/services/deployment-feed-locator.d.ts +15 -4
- package/dist/services/deployment-search-client.d.ts +5 -53
- package/dist/services/deployment-search.d.ts +58 -3
- package/dist/services/deployment-state.d.ts +84 -24
- package/dist/services/deployment-validation.d.ts +5 -0
- package/dist/services/emit-runtime-dependencies.d.ts +2 -1
- package/dist/services/feed-resolver.d.ts +6 -4
- package/dist/services/feed-selection.d.ts +47 -0
- package/dist/services/http-status.d.ts +2 -7
- package/dist/services/pack-command-service.d.ts +9 -0
- package/dist/services/pack-project-selection.d.ts +51 -0
- package/dist/services/pack-project.d.ts +26 -0
- package/dist/services/pack-service.d.ts +7 -3
- package/dist/services/package-search-client.d.ts +7 -0
- package/dist/services/packager-tool-resolver.d.ts +7 -1
- package/dist/services/packages-list-service.d.ts +1 -1
- package/dist/services/permanent-deletion-consent.d.ts +110 -0
- package/dist/services/pipeline-deploy-poll.d.ts +7 -0
- package/dist/services/prepare-solution-resources.d.ts +12 -2
- package/dist/services/project-contributions.d.ts +5 -4
- package/dist/services/search-failure.d.ts +9 -13
- package/dist/services/solution-packager-helpers.d.ts +5 -2
- package/dist/services/solution-path.d.ts +1 -1
- package/dist/services/uninstall-consent.d.ts +82 -0
- package/dist/ship-telemetry-myes7ak5.js +21 -0
- package/dist/solution-auth-aead70sw.js +11 -0
- package/dist/templates/AGENTS.md +125 -12
- package/dist/tool.js +27 -29
- package/dist/utils/deployment-errors.d.ts +9 -1
- package/package.json +2 -2
- package/dist/deploy-delete-service-1zydyyhj.js +0 -22
- package/dist/feed-scope-failure-2kndwpf6.js +0 -18
- package/dist/packager-tool-f2e9rzxk.js +0 -104
- package/dist/packager-tool-resolver-6zwhec62.js +0 -20
- package/dist/packager-tool-zdfn32bc.js +0 -4465
- package/dist/prepare-solution-resources-jpb5as2s.js +0 -25
- package/dist/project-contributions-6wpff2hm.js +0 -30
- package/dist/services/legacy-deployment-search-v3.d.ts +0 -23
package/dist/templates/AGENTS.md
CHANGED
|
@@ -67,7 +67,7 @@ A solution can contain multiple projects of different types. The table below lis
|
|
|
67
67
|
| `Function` | UiPath Function (JS / TS / Python) | `uip function new [name]` | `uipath-functions` |
|
|
68
68
|
| `Api` | API Workflow project | `uip api-workflow init <name>` | `uipath-api-workflow` |
|
|
69
69
|
| `BusinessRules` | Business rule — one or more DMN decisions. Packs to a `.uirule` (its `.dmn` files plus `entry-points.json`), not a `.nupkg` | `uip rules init <name>` | `uipath-rules` |
|
|
70
|
-
| `Entity` | Data Fabric entity project — one folder per project, one `.entity` pointer file per entity; the schema itself lives in `resources/solution_folder/entity/native/<Name>.json`. Emits no package: the entity resources are the deployable payload, so `solution pack` validates the project instead of building it. |
|
|
70
|
+
| `Entity` | Data Fabric entity project — one folder per project, one `.entity` pointer file per entity; the schema itself lives in `resources/solution_folder/entity/native/<Name>.json`. Emits no package: the entity resources are the deployable payload, so `solution pack` validates the project instead of building it. | `uip df entities create <Name> --local` — scaffolds the project when it does not exist (named after the entity unless `--project-name` says otherwise), and adds a further entity when it does; `entities list`/`get`/`update`/`validate`/`delete` with `--local` work on them afterwards. Prefer these to hand-writing the `.entity` file or its resource — the pointer and the schema must stay in step, and `solution pack` fails if they do not. Entities are also modelled in the UiPath VS Code extension. | `uipath-platform` (covers `uip df` entities, records and choice sets) |
|
|
71
71
|
| `Connector` | Integration Service connector | no CLI scaffolding — use `uip is connectors` to list / get / export existing connectors | `uipath-connector-builder` |
|
|
72
72
|
| `WebApp` | Legacy low-code UiPath App (the coded variant is `AppV2`) | no CLI scaffolding | none |
|
|
73
73
|
|
|
@@ -81,12 +81,14 @@ The type lives in either `project.uiproj` (top-level `ProjectType`) or `project.
|
|
|
81
81
|
|
|
82
82
|
The `init` scaffolders above auto-register when run inside a solution directory (unless `--skip-solution-registration` is passed). For other scaffolders, register the project with the solution after scaffolding: use `uip solution projects add <project-path> [<solution-file>]` when the project already lives inside the solution directory (registers in place, no copy), or `uip solution projects import <path>` to copy a project from outside the solution dir into it and register it. If you pass an unknown type to those commands, they reject with the exhaustive accepted list — trust that error over this table. `uip solution pack` rejects the same way: a `Projects[]` entry whose `Type` no packager handles fails with `ErrorCode: invalid_argument`, naming the project, the accepted types, and how to drop the entry, rather than attempting the pack.
|
|
83
83
|
|
|
84
|
+
`projects add` and `projects remove` take **either** the project folder or its manifest file: `uip solution projects remove my-app` and `uip solution projects remove my-app/project.uiproj` do the same thing. That matters because the `.uipx` records a project by its manifest file (`ProjectRelativePath: "my-app/project.uiproj"`), so the path `pack` quotes back when it refuses an entry can be pasted straight into `remove`. `projects import` is the exception — its argument is an external folder to copy, so give it a directory.
|
|
85
|
+
|
|
84
86
|
**Member package ids come from folder names, and pack refuses the ones a feed cannot store.** Each member is published under `<solution>.<project-type>.<member-folder>` — the solution's own `.uipx` name, the short type (`Rpa`, `Case`, `Flow`, …) and the member's folder inside the solution. The name a project declares for itself is not used, and `--name` renames the archive only. Two limits ride on that, both checked before anything is packed and both reported as `ErrorCode: invalid_argument` / `Retry: RetryWillNotFix`:
|
|
85
87
|
|
|
86
88
|
- **Unique.** Two members whose folders compose the same id fail the pack, naming the shared id and every folder that produced it. Spaces and dots both collapse to a single dot and NuGet ids are case-insensitive, so `collide me`, `collide.me` and `Collide.Me` are one id.
|
|
87
89
|
- **100 characters.** A composed id longer than that fails the pack, naming the member folder that blew the limit.
|
|
88
90
|
|
|
89
|
-
The fix for either is a rename — the member folder, or the `.uipx
|
|
91
|
+
The fix for either is a rename — the member folder, or the `.uipx`. A whole-solution pack takes no `--package-id`; only a single-project pack (`--project`, below) can override the id.
|
|
90
92
|
|
|
91
93
|
## End-to-End Lifecycle
|
|
92
94
|
|
|
@@ -102,13 +104,13 @@ uip login --client-id env.UIPATH_CLIENT_ID --client-secret env.UIPATH_CLIENT_SEC
|
|
|
102
104
|
|
|
103
105
|
# 1a. (Optional) Restore project dependencies before packing. Resolves NuGet
|
|
104
106
|
# deps (including authenticated Orchestrator feeds) so pack can compile.
|
|
105
|
-
# Useful in CI: login -> restore -> pack. Takes <
|
|
107
|
+
# Useful in CI: login -> restore -> pack. Takes <solution-path> as its only
|
|
106
108
|
# positional arg and does not produce a package. Pack also restores
|
|
107
109
|
# internally, so this is an optimization, not a requirement.
|
|
108
110
|
uip solution restore .
|
|
109
111
|
|
|
110
112
|
# 2. Pack the solution into a .zip. Two positional args:
|
|
111
|
-
# <
|
|
113
|
+
# <solution-path> — solution dir (containing .uipx) or a .uis file
|
|
112
114
|
# <output-path> — directory where the .zip is written (required unless --dry-run)
|
|
113
115
|
uip solution pack . ./out
|
|
114
116
|
|
|
@@ -116,6 +118,17 @@ uip solution pack . ./out
|
|
|
116
118
|
# pipeline without producing a package — useful as a CI gate.
|
|
117
119
|
uip solution pack . --dry-run
|
|
118
120
|
|
|
121
|
+
# 2b. (Optional) Pack ONE project into its own .nupkg instead of the .zip.
|
|
122
|
+
# It packs as a stand-alone project: no solution resources go into it, so
|
|
123
|
+
# a project that uses one is published without it.
|
|
124
|
+
# --project takes the project's Id from the .uipx or its path relative to
|
|
125
|
+
# the solution folder. The package id defaults to the one the solution
|
|
126
|
+
# pack gives the project; --package-id (only with --project) overrides
|
|
127
|
+
# it, and --name is refused with it. Data.Packages is the absolute path of
|
|
128
|
+
# the .nupkg. An unknown --project fails with invalid_argument and lists
|
|
129
|
+
# the valid Ids and paths.
|
|
130
|
+
uip solution pack . ./out --project <project-id-or-path> [--package-id <id>]
|
|
131
|
+
|
|
119
132
|
# 3. Publish the packed .zip to Orchestrator
|
|
120
133
|
uip solution publish ./out/<package>.zip
|
|
121
134
|
|
|
@@ -154,6 +167,8 @@ uip solution deploy list
|
|
|
154
167
|
|
|
155
168
|
**A rejected attempt leaves a pending draft.** When a `deploy run` or `deploy upgrade` stops at `ValidationFailed` (or a conflict or scheduling error), nothing is installed and the live version keeps running, but the attempt stays behind as a *draft* — its key is the `deploymentKey` in the failure's `Instructions`. While the draft exists it owns the deployment, as in the Orchestrator UI (which offers only "continue editing" and "delete draft"): re-running the same `deploy run` with a corrected `--config-file` and the **draft's** version re-validates it with the new file (settings and resource links the file does not name keep the rejected values). Any other version is refused before anything is sent (`ErrorCode: invalid_argument`) — including the version that is live now, which the server would otherwise answer by installing the draft's version instead. Under an external app that check only warns and the deploy goes ahead — and the server then runs the draft, installing the draft's version — so from CI/CD ask only for the draft's version, or discard the draft first. `deploy upgrade` sends no configuration, so it refuses a deployment with a pending draft (`ErrorCode: invalid_argument`, naming the draft's key and version) rather than re-run the rejected attempt; once the cause is fixed, `uip solution deploy upgrade <draft-or-deployment-key> --discard-draft` deletes the draft and upgrades the live version with its own configuration, and reports the deleted key as `DiscardedDraftKey`. Address the deployment by key for this from CI/CD — on an older server the name form can only find the draft with a user session. A draft still being validated cannot be discarded yet (`Retry: RetryLater`). A Setup activation started in Orchestrator and left unfinished is a draft too, of the live version: both commands refuse while it exists and name it as such — finish it in Orchestrator, or discard it the same way. A deployment whose *first* install never completed has nothing to upgrade: fix and re-run its `deploy run`, or delete the draft in Orchestrator.
|
|
156
169
|
|
|
170
|
+
**Replacing an installed resource with a link deletes it.** When a `deploy run` config file (or the new version in a `deploy upgrade`) links a resource that the deployment already installed, the server deletes the installed copy and its data — and asks for confirmation first. Without `--acknowledge-permanent-deletion` the command stops (`ErrorCode: invalid_argument`), lists the resources in `Message` and in `Data.PermanentDeletionResources`, and installs nothing; the attempt is kept as a pending draft. Re-run the same command with `--acknowledge-permanent-deletion` to confirm — for `deploy upgrade` do **not** add `--discard-draft`, which would drop the links being confirmed (the command refuses the two together on such a draft); the flag lets the same-version draft through: each listed resource is acknowledged, the same install runs once more, and the success output names them in `PermanentlyDeletedResources`. If that re-run is refused before it runs (e.g. a `429`), nothing was deleted but the acknowledgement stays on the draft: the next run of the same command deletes them without asking. To keep the installed copies, remove the links instead (`deploy config unlink` for `deploy run`; for `deploy upgrade`, `--discard-draft` without the flag, or remove them in Orchestrator). The flag is independent of `--yes`, and nothing ever prompts.
|
|
171
|
+
|
|
157
172
|
**One deployment per package.** `deploy run` always creates a *new* deployment in a *new* Orchestrator folder — it never updates an existing one, and it cannot deploy into a folder that already exists (Orchestrator renames the folder instead, `MySolution` -> `MySolution 1`). So if the package is already deployed, the command stops and lists the existing deployments rather than quietly adding another folder. That check is best-effort, not a guarantee: a failed lookup only logs a warning, and a CI job signed in with an application (client-credentials) account is never stopped by it — an existing deployment is reported as a warning and the deploy goes ahead (on servers without the Pipelines deployment search the check is skipped, with a warning). In automation, track what you have already deployed instead of relying on the stop. To ship a new version, upgrade the existing deployment in place with `uip solution deploy upgrade <deployment-key>`; to start over, `deploy uninstall`, then `deploy delete` to clear the record it leaves in `deploy list` (that record does not block a redeploy — `blocksRedeploy` lets an uninstalled deployment through — so the delete is housekeeping, not a prerequisite). Pass `--yes` only when you really do want a second, independent copy, and give it a different `--name`: the install is keyed on the deployment name, so re-using an existing one updates that deployment in place instead. While you are still iterating, validate locally (`solution pack --dry-run`) instead of deploying each attempt.
|
|
158
173
|
|
|
159
174
|
**Activation lifecycle.** `deploy run` activates by default. To split the steps:
|
|
@@ -162,14 +177,15 @@ uip solution deploy list
|
|
|
162
177
|
uip solution deploy run --skip-activate ... # leaves "Inactive (Ready to activate)"
|
|
163
178
|
uip solution deploy activate <deployment-name> # activate later
|
|
164
179
|
uip solution deploy uninstall <deployment-name> --yes # remove the deployment + its resources (--yes required; the CLI never prompts)
|
|
180
|
+
uip solution deploy uninstall <deployment-name> --force # same, past uncompleted jobs and the permanent deletion of resources replaced by links (implies --yes)
|
|
165
181
|
uip solution deploy delete <deployment-name> --yes # remove what uninstall leaves behind (--yes required)
|
|
166
182
|
```
|
|
167
183
|
|
|
168
|
-
`deploy run` reports `ActivationStatus: SuccessfulActivate` when the deployment runs. When the install landed but a resource needs "Setup activation" in Orchestrator first, it is still `Result: Success`, with `ActivationStatus: NeedsSetupToActivate`, `PendingResources` and `NextSteps` — the deployment exists, so do **not** run the deploy again; complete the setup, then `deploy activate`. `ReadyToActivate` in the same place means the install landed and the command could not activate it: run `deploy activate`.
|
|
184
|
+
`deploy run` reports `ActivationStatus: SuccessfulActivate` when the deployment runs. When the install landed but a resource needs "Setup activation" in Orchestrator first, it is still `Result: Success`, with `ActivationStatus: NeedsSetupToActivate`, `PendingResources` and `NextSteps` — the deployment exists, so do **not** run the deploy again; complete the setup, then `deploy activate`. When the server already reports that state after the install, `deploy run` does not try to activate (the service would refuse it). `ReadyToActivate` in the same place means the install landed and the command could not activate it: run `deploy activate`.
|
|
169
185
|
|
|
170
186
|
`uninstall`, `delete`, `activate` and `status` take the deployment **name** as a positional argument (no `--name` flag). `status` also accepts a **deployment key** (from `deploy list` or `deploy upgrade` — the form that diagnoses a stale key) or the **pipeline deployment ID** from `deploy run` (that run's progress and errors, `Code: SolutionDeployStatus`); by name or key it answers `Code: SolutionDeployment` and reports the record's `Operation`, `OperationStatus`, `ActivationStatus`, `Actions`, and `NextSteps` when it is not live. A name is found across feeds; a key outside the tenant feed needs `--personal-workspace` or `--feed <name-or-key>`, as with `deploy list`. `Superseded: null` means the CLI could not tell — the chain search failed or holds no row for the key — and the fields are the requested record's own; take the current key from `deploy list`.
|
|
171
187
|
|
|
172
|
-
**Two status axes.** `OperationStatus: Successful` means the last operation's content landed. `ActivationStatus: Active` means the deployment runs. An upgrade can land `Successful` *and* `NeedsSetupToActivate`: the new version is installed but does not run until "Setup activation" is completed in Orchestrator (Tenant > Solutions > Deployments); the previous version keeps running meanwhile. The UI words the same states differently: `NeedsSetupToActivate` shows as **Inactive (Needs setup)**, `Operation: VersionChange` as **Change version**, `Operation: ActivationSetup` as **Activation setup** — and the UI lists every record of a deployment, where `deploy list` shows only the newest. `deploy upgrade` reports both axes; when not `Active` it adds `PendingResources` (the resources the service flags as needing configuration — Integration Service connections, typically — each with the `Reason` the activation validation gives, such as a connection that needs authenticating) and `NextSteps`. "Setup activation" has no CLI command **on an existing deployment**: `deploy config link` maps a resource to an existing one only in the config file a new `deploy run` consumes, `deploy upgrade` takes no config file, and the `resource`/`resources` verbs edit the solution project, not a deployment. `deploy activate` is refused (`4007 … cannot be activated`) until the setup is done in Orchestrator.
|
|
188
|
+
**Two status axes.** `OperationStatus: Successful` means the last operation's content landed. `ActivationStatus: Active` means the deployment runs. An upgrade can land `Successful` *and* `NeedsSetupToActivate`: the new version is installed but does not run until "Setup activation" is completed in Orchestrator (Tenant > Solutions > Deployments); the previous version keeps running meanwhile. The UI words the same states differently: `NeedsSetupToActivate` shows as **Inactive (Needs setup)**, `Operation: VersionChange` as **Change version**, `Operation: ActivationSetup` as **Activation setup** — and the UI lists every record of a deployment, where `deploy list` shows only the newest. `deploy upgrade` reports both axes; when not `Active` it adds `PendingResources` (the resources the service flags as needing configuration — Integration Service connections, typically — each with the `Reason` the activation validation gives, such as a connection that needs authenticating, and the Orchestrator `FolderPaths` it lives in when the server reports them) and `NextSteps`. On current servers this works the same for an external app (CI/CD) as for a user session; on older servers an external app may see `ActivationStatus` without `PendingResources`, and `NextSteps` say the resources could not be read. "Setup activation" has no CLI command **on an existing deployment**: `deploy config link` maps a resource to an existing one only in the config file a new `deploy run` consumes, `deploy upgrade` takes no config file, and the `resource`/`resources` verbs edit the solution project, not a deployment. `deploy activate` is refused (`4007 … cannot be activated`) until the setup is done in Orchestrator.
|
|
173
189
|
|
|
174
190
|
**A key is one record, not the deployment.** Every operation creates a new deployment record with its own key: `deploy run` the Install record, `deploy upgrade` a VersionChange one (`DeploymentKey` in its output; `InstallDeploymentKey` is the one that never changes). `deploy list` shows the newest per deployment. A key from before an upgrade is *superseded*: the Solutions record still answers as it was — old version, `Active`, `Upgrade` offered — but `deploy upgrade <key>` resolves it to the deployment's current generation through the Pipelines lookup and upgrades that, and `deploy status <key>` reports `Superseded: true` with `CurrentDeploymentKey`. Store `InstallDeploymentKey`, or take the current key from `deploy list`.
|
|
175
191
|
|
|
@@ -183,11 +199,13 @@ uip solution deploy delete <deployment-name> --yes # remove what uninstall
|
|
|
183
199
|
|
|
184
200
|
So a full clean-up of a live deployment is two commands: `uninstall` removes its resources and folder, `delete` then removes the deployment itself. `delete` reads the action list first, and when the record lists actions but not `Delete` it says so and names the command to run instead — it never sends a request the state forbids. A record that lists **no** actions is the exception: nothing is known about it, so the request goes out and the server answers.
|
|
185
201
|
|
|
202
|
+
`delete` works from CI/CD: an external app (client-credentials) login deletes tenant-feed records on servers with the Pipelines delete route. On an older server a user session still deletes, while an external app is refused (`ErrorCode: permission_denied`, `Retry: RetryWillNotFix`) with nothing deleted — run that delete with a user session. A draft still being validated cannot be deleted yet (`Retry: RetryLater`): wait for its run to finish, then retry.
|
|
203
|
+
|
|
186
204
|
`uninstall` waits out an operation that blocks it: when Orchestrator refuses because the deployment still has something running, the CLI polls until that finishes and then sends the request again, all inside `--timeout` (which covers the whole command, the status poll included). If it is still busy when the timeout expires you get exit `2` with `ErrorCode: timeout` and `Retry: RetryLater` — retry later, do not treat it as permanent. A refusal for any other reason (superseded, inactive, unknown name) still fails immediately with exit `1`.
|
|
187
205
|
|
|
188
|
-
|
|
206
|
+
`uninstall` and `activate` do not need a feed flag: without one they find the deployment themselves — tenant feed first, then your Personal Workspace, then the folder feeds you can reach — and scope their requests to whatever feed holds it. So the `deploy activate <name>` that `--skip-activate` points you at works the same on a `--personal-workspace` or `--feed` deployment as on a tenant one. The cost is a lookup per feed until the name is found, and a name that exists in no feed you can see is reported as not found rather than as a blocked uninstall. When you know the feed, pass it: `uninstall`, `activate` and `delete` take `--personal-workspace` or `--feed <name-or-key>` and then search that feed alone. The commands the CLI prints as next steps already carry the flag for the feed the deployment was found in. With either flag, an external-app (client-credentials) login is refused for any feed but the tenant's, because the server ignores the feed header for it.
|
|
189
207
|
|
|
190
|
-
`deploy delete` and `deploy status <name>` (without a feed flag) find a name the same way. All four say "not found" only when every feed answered — with one exception: under an external-app login, `deploy status <guid>` for a GUID that is no deployment key still says "not found" when only the feeds after the tenant could not be searched, or when the tenant search refused the login (401/403), because an app login cannot read those feeds at all. When a feed cannot be searched — the feed service is down or refuses the session, the list of feeds cannot be read or gives a feed no key, or the tenant search itself fails — and no other feed has the name, they fail with a message that names the feeds they could not search instead of calling the name unknown. `ErrorCode` then comes from that failure (`server_error`, `network_error`, `authentication_required`, `permission_denied`, …, or `unknown_error` when it has no known class) and is never `not_found`; `Retry` follows it — `RetryLater` for an outage, `RetryWillNotFix` for a 401 or 403, and also `RetryWillNotFix` when every feed that could not be searched is one the list gives no key, since a retry gets the same list. Do not treat the name as wrong: do what `Instructions` say (log in again, fix the session's access, or retry later). To check one feed yourself, pass `--personal-workspace` or `--feed <name-or-key>` to `deploy status` or `deploy list` — but `--feed` is resolved through the same list of feeds, so when that list is what failed only `--personal-workspace` helps, and `--feed` cannot pick a feed the list gives no key. When the tenant feed refuses an `activate` or `uninstall` for its own reason (401, 403, 409, 422, 429, a 5xx), that failure is reported as it is.
|
|
208
|
+
`deploy delete` and `deploy status <name>` (without a feed flag) find a name the same way. All four say "not found" only when every feed answered — with one exception: under an external-app login, `deploy status <guid>` for a GUID that is no deployment key still says "not found" when only the feeds after the tenant could not be searched, or when the tenant search refused the login (401/403), because an app login cannot read those feeds at all. When a feed cannot be searched — the feed service is down or refuses the session, the list of feeds cannot be read or gives a feed no key, or the tenant search itself fails — and no other feed has the name, they fail with a message that names the feeds they could not search instead of calling the name unknown. `ErrorCode` then comes from that failure (`server_error`, `network_error`, `authentication_required`, `permission_denied`, …, or `unknown_error` when it has no known class) and is never `not_found`; `Retry` follows it — `RetryLater` for an outage, `RetryWillNotFix` for a 401 or 403, and also `RetryWillNotFix` when every feed that could not be searched is one the list gives no key, since a retry gets the same list. Do not treat the name as wrong: do what `Instructions` say (log in again, fix the session's access, or retry later). To check one feed yourself, pass `--personal-workspace` or `--feed <name-or-key>` to `deploy status` or `deploy list`, or to the `activate`, `uninstall` or `delete` you meant to run — but `--feed` is resolved through the same list of feeds, so when that list is what failed only `--personal-workspace` helps, and `--feed` cannot pick a feed the list gives no key. When the tenant feed refuses an `activate` or `uninstall` for its own reason (401, 403, 409, 422, 429, a 5xx), that failure is reported as it is.
|
|
191
209
|
|
|
192
210
|
## Dependency Feeds
|
|
193
211
|
|
|
@@ -236,15 +254,17 @@ The analyzer rule configuration comes from whichever governance flag you use. `-
|
|
|
236
254
|
|
|
237
255
|
`--automation-ops-profile` is the old name for `--governance-product`. It still works and still parses, but it is hidden from help and warns; passing both is rejected rather than resolved. Use `--governance-product` in anything new.
|
|
238
256
|
|
|
239
|
-
Whenever you are signed in, the tenant is asked first — including when you pass `--governance-file-path`. There are three possible answers and each does something different:
|
|
257
|
+
Whenever you are signed in as a user, the tenant is asked first — including when you pass `--governance-file-path`. There are three possible answers and each does something different:
|
|
240
258
|
|
|
241
259
|
- **The tenant publishes a policy.** That policy is what the analyzer uses, whatever else you passed. A `--governance-file-path` alongside it is not used, and `--ignored-rules` is not applied; each gets a warning and the pack carries on — a flag in your own pipeline does not lift the organisation's policy.
|
|
242
260
|
- **The tenant publishes nothing.** The analyzer uses your `--governance-file-path` if you passed one, otherwise the rules shipped with the WorkflowCompiler.
|
|
243
|
-
- **The question could not be answered** (expired token, no route, the service is down). The pack still succeeds and nothing fails: you get a warning naming the reason (`unauthorized`, `notFound`, `serverError`, `timedOut`, …), shown
|
|
261
|
+
- **The question could not be answered** (expired token, no route, the service is down). The pack still succeeds and nothing fails: you get a warning naming the reason (`unauthorized`, `notFound`, `serverError`, `timedOut`, …), shown at the default `--log-level warn` (see below), and the analyzer uses your `--governance-file-path` if you passed one, otherwise the shipped rules. Not knowing whether you are governed is not a reason to break a build.
|
|
244
262
|
|
|
245
263
|
With no signed-in tenant there is nothing to ask, so a `--governance-file-path` is simply used and an offline pack keeps working.
|
|
246
264
|
|
|
247
|
-
|
|
265
|
+
When you are signed in as an external application, the tenant is not asked: AutomationOps does not accept external-application tokens yet. The pack behaves as when the question could not be answered — your `--governance-file-path` if you passed one, otherwise the shipped rules — and the warning names the reason `applicationLogin`.
|
|
266
|
+
|
|
267
|
+
Note what this means for CI: a pack that could not reach AutomationOps still returns `Result: Success` and exit `0`, so a stage using `--governance-product` as a governance gate goes green while having enforced the shipped defaults. The warning in the log is what tells you which happened — `uip solution pack` reports on governance, it does not enforce it. That warning is a `warn`-level log line. It shows on stderr at the default `--log-level`, which is `warn`; `--log-level error` hides it. A stage that needs to know reads stderr, or passes `--log-file <path>` to read it from a file. Do not combine `--log-file` with `--log-level error`: the level filter runs before a line is sent to the file, so the warning is dropped. Strict, fail-closed behaviour belongs to design-time hosts, not to this command.
|
|
248
268
|
|
|
249
269
|
## Dependency Feeds
|
|
250
270
|
|
|
@@ -343,6 +363,12 @@ uip solution projects resync <cloud-project-name> --sync-option Reset
|
|
|
343
363
|
|
|
344
364
|
Each project declares the resources it needs (assets, queues, buckets, processes, …) in a `bindings_v2.json` file at the project root. These declarations drive the solution's resource inventory.
|
|
345
365
|
|
|
366
|
+
A Flow project is the exception: its bindings live in its `.flow` file, including bindings used only by subflow nodes. `uip maestro flow nodes create`, `delete` and `configure` also maintain a derived `bindings_v2.json` beside the `.flow`. `resources refresh`, `pack` and `upload` read the `.flow` and ignore that derived file, even after a hand edit. To change what a Flow binds, edit the `.flow` or use `uip maestro flow nodes configure`. The sync also builds inline agents and includes their bindings in the solution resources. The solution-root `bindings_v2.json` is shared across projects and is always read once, even when a Flow project lives at the solution root. For a root-level Flow without a `.flow`, shared bindings stay with the solution and out of the Flow package; only its own inline-agent bindings belong to the Flow. A sibling Agent project is packed separately.
|
|
367
|
+
|
|
368
|
+
The source is selected by `project.uiproj`'s `MainFile`, then the project name, then the usual `.flow` search in the root, `content/` and `flow_files/`. An unreadable `.flow` never falls back to a stale binding file; it produces a refresh warning and stops pack/upload, so fix the named `.flow` before retrying. A Flow project with no `.flow` may instead author `bindings_v2.json`; refresh reads it because packaging preserves it. An inline agent build failure names the agent files rather than blaming the `.flow`. A Flow's selected source and every `$ref` chunk must resolve inside that Flow's project directory, including through symlinks. Refresh warns and contributes no bindings for an outside source or chunk; pack and upload stop. Move shared chunks into the project before retrying.
|
|
369
|
+
|
|
370
|
+
Packaging stages the selected source after copying other files and inlines its `$ref` chunks from their original paths, so a same-named file or a moved source cannot change the bindings it reads.
|
|
371
|
+
|
|
346
372
|
`projects add` and `projects import` do not always create the project's resources. Some project types (a coded app, for example) pick their resource template from a file only their own tool can read, so these commands register the project and stop. They report `Data.ResourcesPending: true` and warn when that happens, naming the tool to install (`uip tools install codedapp` for a coded app) — the resources arrive at the next `resources refresh`, `pack` or `upload`.
|
|
347
373
|
|
|
348
374
|
After editing a project's bindings, or after `solution projects import` (which doesn't auto-sync resources), reconcile the solution-level inventory:
|
|
@@ -353,8 +379,14 @@ uip solution resources refresh # re-scan every project, sync new / removed r
|
|
|
353
379
|
|
|
354
380
|
`solution resources refresh` creates new resources for bindings not yet in the solution and imports from Orchestrator when a matching resource already exists.
|
|
355
381
|
|
|
382
|
+
It also generates or regenerates each project's own resources (its `package` and `process`, for example) — on the first run, and again after a project rename or type change. The output counts these apart from the binding counts: `Data.Created`, `Data.Imported` and `Data.Skipped` count bindings only, and `Data.ProjectResourcesCreated` counts the project resources this run generated or regenerated; resources the regeneration removes are not counted. A rerun with nothing new reports `0`. `Status` names this count too (`, N project resources generated`) when it is above `0`.
|
|
383
|
+
|
|
356
384
|
**Refresh is import-only for cloud resources. It never overwrites an imported resource** — that is what keeps your local edits (a renamed resource, a patched retry count) from being wiped on every re-scan. So if you change an entity, queue or asset **in the cloud** after importing it, `refresh` will not pick the change up: it reports the resource under `Skipped` and leaves it alone. To pull the new cloud definition, use `resources edit --source remote` (below).
|
|
357
385
|
|
|
386
|
+
**A failed Resource Catalog call is not a "not found".** `resources refresh`, `pack`, `upload`, `projects add` and `projects import` look each binding up in the Resource Catalog. When that lookup fails — the catalog refuses the login with 401/403, it is unreachable, or (for `pack`, which runs without a login) there is no login — nothing is created for the binding, because a local stub would deploy as a new, empty resource instead of the one in the cloud. The same goes for a resource the catalog found but whose import was refused. A binding the solution already holds keeps that resource as it is. Refresh reports what it could not check in `Data.Warnings` and exits `0`; `projects add` / `import` log it as a warning. `pack` and `upload` fail when a binding the solution does **not** hold could not be resolved: `ErrorCode: permission_denied` for a refused login (`Retry: RetryWillNotFix`), `server_error` or `rate_limited` (`Retry: RetryLater`) when the catalog is down or throttling, and — `pack` only — `authentication_required` with no login. `resources refresh` and `upload` check the login before they start, so with no login they fail on that check instead, as before. After no login or a 401/403 the rest of the bindings are not looked up. From CI/CD, run `uip solution resources refresh` under a login the catalog accepts (a user login), commit the solution's resources, and the pipeline's `pack` then uses them as they are. An import that fails for any other reason still falls back to a local resource, and says so in the warnings.
|
|
387
|
+
|
|
388
|
+
`pack` and `upload` also stop if a project's contributed bindings are invalid. Fix the project's source file or inline agent and retry; these commands do not ship a solution with missing resources.
|
|
389
|
+
|
|
358
390
|
Each project's own tool also reports what its authored files add to the solution
|
|
359
391
|
resources — for a Coded Action app, its `action-schema.json` lands on the app
|
|
360
392
|
resource's `spec.actionSchema`. Two things follow:
|
|
@@ -370,10 +402,85 @@ resource's `spec.actionSchema`. Two things follow:
|
|
|
370
402
|
`ErrorCode: invalid_argument`.
|
|
371
403
|
Nothing is written before that check passes, so fix the file and re-run the command.
|
|
372
404
|
|
|
405
|
+
For project types whose resources do not depend on a tool contribution, refresh
|
|
406
|
+
does not warn when the installed tool has nothing to contribute. Use
|
|
407
|
+
`--log-level debug` to see that diagnostic. An `AppV2` coded app does require its
|
|
408
|
+
tool's contribution: if it is missing, refresh warns and pack/upload fail with
|
|
409
|
+
`contribution_unavailable`. Run `uip tools install codedapp`, then try again.
|
|
410
|
+
|
|
373
411
|
An `action-schema.json` edited without a following `refresh` or `pack` still
|
|
374
412
|
shows the previous schema in `uip solution resources get`; the next pack or
|
|
375
413
|
refresh rewrites it, so the packed solution is never stale.
|
|
376
414
|
|
|
415
|
+
`uip codedapp init <path> --type Action` writes a valid starter
|
|
416
|
+
`action-schema.json`, so a freshly scaffolded Coded Action packs without being
|
|
417
|
+
edited first. It is never overwritten on a re-run — your own schema is the one
|
|
418
|
+
that matters.
|
|
419
|
+
|
|
420
|
+
### A coded app's build output
|
|
421
|
+
|
|
422
|
+
A coded app's packed payload is a **folder that is already built**: nothing in
|
|
423
|
+
`uip solution pack` runs the app's build, so a CI pipeline has to run its
|
|
424
|
+
`npm run build` (or equivalent) first. Which folder gets packed is
|
|
425
|
+
`config.bundlePath` in the app's `webAppManifest.json`, relative to the project
|
|
426
|
+
directory — `source/dist` for an app `uip codedapp init` scaffolded inside a
|
|
427
|
+
solution, `dist` for a standalone one.
|
|
428
|
+
|
|
429
|
+
Pack **fails** when that folder holds no HTML entry point (`index.html`,
|
|
430
|
+
`main.html` or `app.html`, unless `config.mainFile` selects another HTML file),
|
|
431
|
+
naming the path and both ways out. That used to
|
|
432
|
+
succeed and ship an app that could not start, so if you see this failure the
|
|
433
|
+
answer is to build the app or repoint `config.bundlePath` — not to retry.
|
|
434
|
+
|
|
435
|
+
Coded app entry points declared in `config.mainFile` must be HTML files inside
|
|
436
|
+
the bundle; absolute paths and parent segments are refused by the shared packager.
|
|
437
|
+
When adopting an app with `codedapp init --force`, `config.bundlePath` must name
|
|
438
|
+
a child build folder, never the project root or a parent. Standalone
|
|
439
|
+
`codedapp pack <dist>` uses that selected folder for preview and packaging,
|
|
440
|
+
and preserves the project identity written by the packager. Its bundle and entry
|
|
441
|
+
selection stays in memory and in the package. Only a missing project ID is
|
|
442
|
+
persisted to the project manifest. `config.mainFile`, when present, must be a string.
|
|
443
|
+
When a coded app has an authored `entry-points.json`, pack updates its primary
|
|
444
|
+
entry's `filePath` in the archive to match the selected HTML file, preserving
|
|
445
|
+
the other metadata and leaving the project file unchanged.
|
|
446
|
+
Child bundle paths are checked after aliases resolve during adoption and again
|
|
447
|
+
at pack time. They cannot point to the project root or outside it. An explicitly
|
|
448
|
+
selected external positional folder in `codedapp pack` remains supported.
|
|
449
|
+
|
|
450
|
+
### Bringing an app you already have into a solution
|
|
451
|
+
|
|
452
|
+
To register a web app that already exists — one with its own sources and build
|
|
453
|
+
at the project root, not the `source/` layout `init` writes — run
|
|
454
|
+
`uip codedapp init <path> --force` on it. With an app already there (an
|
|
455
|
+
`index.html`, or a `package.json` declaring a build script), init **adopts** it
|
|
456
|
+
instead of writing a starter: it writes only `project.uiproj` and
|
|
457
|
+
`webAppManifest.json`, leaves every other file alone, and sets
|
|
458
|
+
`config.bundlePath` to the app's own build output. The result's
|
|
459
|
+
`Data.AdoptedApp` reports the path it chose and where it came from —
|
|
460
|
+
`build-output` (a folder it found), `existing-manifest` (a value already
|
|
461
|
+
declared, which wins) or `default` (nothing is built yet, so the value is a
|
|
462
|
+
guess and `NextSteps` says so — check it before you pack; for an app with no
|
|
463
|
+
build script it also says the folder will not appear on its own, so set
|
|
464
|
+
`config.bundlePath` yourself).
|
|
465
|
+
|
|
466
|
+
One exception to a declared value winning: if an earlier `init --force` on
|
|
467
|
+
an older CLI wrote a starter into `source/` over your app and pointed
|
|
468
|
+
`config.bundlePath` at it, that value is ignored and the probe runs instead,
|
|
469
|
+
with `NextSteps` saying so. It is recognised by the starter page's own
|
|
470
|
+
markup, so an app that genuinely builds into `source/dist` — or one where
|
|
471
|
+
you have since built over the starter — keeps its declared path. Without it the solution would keep packing
|
|
472
|
+
`Result: Success` while shipping the starter, because the starter has an
|
|
473
|
+
`index.html` of its own. Delete the leftover `source/` once a pack looks
|
|
474
|
+
right.
|
|
475
|
+
|
|
476
|
+
Re-running `init` over a project that already has a `webAppManifest.json`
|
|
477
|
+
merges into it rather than rewriting it: `config.bundlePath` is applied and
|
|
478
|
+
everything else — including the `projectId` a pack writes to keep the
|
|
479
|
+
packaged app's identity stable — is carried through. Omitting `--type` on a
|
|
480
|
+
re-run means "leave the variant alone": an existing Coded Action stays one,
|
|
481
|
+
schema and artefact subtype included. Passing `--type Action` over a plain
|
|
482
|
+
coded app still upgrades it.
|
|
483
|
+
|
|
377
484
|
### Adding a resource by hand
|
|
378
485
|
|
|
379
486
|
A resource is either **virtual** — declared locally now, provisioned when the solution deploys — or **imported**, pointing at something that already exists in Orchestrator. `--source` picks which:
|
|
@@ -432,6 +539,8 @@ uip solution resources edit <resource-key> --source remote --force # apply it
|
|
|
432
539
|
uip solution resources remove <resource-key>
|
|
433
540
|
```
|
|
434
541
|
|
|
542
|
+
`get` reads the solution first. Only a key the solution does not declare is read from the tenant instead (the resource catalog, then an export). Any other local failure is reported as it is and exits `1`; it is never answered with a tenant copy of the same key, so fix the solution rather than retrying.
|
|
543
|
+
|
|
435
544
|
### Picking up a cloud change: `edit --source remote`
|
|
436
545
|
|
|
437
546
|
Use this when the resource changed **in Orchestrator or Data Fabric** after you imported it — a new field on an entity, a changed queue setting — and `refresh` reported it under `Skipped`.
|
|
@@ -566,17 +675,21 @@ Adjacent groups commonly used alongside solutions:
|
|
|
566
675
|
|---|---|
|
|
567
676
|
| `Not authenticated` / 401 | `uip login`, then re-run |
|
|
568
677
|
| `upload` fails with 401/403 and `ErrorCode: permission_denied` | Not a login problem — the token was valid when the call went out, so `uip login` mints the same one. Read `Instructions`: for a session on an external application, check that the app has the Studio Web (`StudioWebS2S`) grants, not only the Orchestrator and Solutions ones; for a user, check Studio Web access in the tenant. Then confirm the `SolutionId` in the `.uipx` belongs to the tenant you are logged into — one from another tenant is refused, not reported missing |
|
|
569
|
-
| `packages list` or `deploy list` fails with `ErrorCode: permission_denied` from a CI/CD pipeline |
|
|
678
|
+
| `packages list` or `deploy list` fails with `ErrorCode: permission_denied` from a CI/CD pipeline | Both accept an external app on servers that serve their Pipelines search (`POST /v1/pipelines/packages/search`, `POST /v1/pipelines/deployments/search`). An app is refused only on an older server, which has just the user-only search (the message says so), or with `--personal-workspace` or a folder `--feed`, whose feed the server ignores for an app (a `--feed` naming the tenant feed works). A `--feed` is checked against the Studio Web publish locations, so an app needs a `StudioWebS2S` grant for it; the message names it when that lookup is refused. `uip login` with the same app mints the same kind of token; run the listing under a user session, or drop the feed flag to list the tenant feed. The same goes for `--personal-workspace` on any command: an external app has no Personal Workspace. |
|
|
679
|
+
| `pack` or `upload` fails with `ErrorCode: permission_denied` (or `pack` with `authentication_required`) and a message naming the Resource Catalog | The catalog refused the login (or there was none), so bindings the solution does not hold yet could not be resolved, and the command will not pack them as empty stubs. Run `uip solution resources refresh` under a user login, commit the solution's resources, then re-run. Bindings already in the solution are fine as they are |
|
|
570
680
|
| Command targets the wrong tenant | `uip login tenant set <tenant>`; verify with `uip login status` |
|
|
571
681
|
| Pack succeeds but publish 409s | Version conflict — bump the version (`uip solution pack . ./out -v <new-version>`) or delete the colliding version with `uip solution packages delete <package-name> <version> --yes` (only if intentional; `--yes` required) |
|
|
572
682
|
| `deploy run` stops because the package is already deployed | Upgrade it in place with `uip solution deploy upgrade <deployment-key>` (running `deploy run` again does not upgrade it), or `uip solution deploy uninstall <name> --yes` then `uip solution deploy delete <name> --yes` first, or pass `--yes` with a different `--name` to create a second, separate deployment (re-using the name updates the existing one in place) |
|
|
573
683
|
| `HTTP 400 … cannot be uninstalled` (error `4007`) | The deployment is not uninstallable in its state — superseded, already uninstalled, or left by a failed install. Read `Instructions`: when its `Actions` list offers `Delete`, remove the record with `uip solution deploy delete <name> --yes`. An operation still running is the other cause, and that one clears by itself (`Retry: RetryLater`) |
|
|
684
|
+
| `deploy uninstall` fails with `Message` "Uninstall failed with status: FailedUninstall: this deployment has uncompleted jobs…" or "…permanently deletes these resources and their data: …", or "Deployment '<name>' was not uninstalled: …" | Orchestrator wants explicit consent: the deployment has uncompleted jobs (`Data.JobsNotInFinalState: true`), or uninstalling it permanently deletes resources that were replaced by links (`Data.PermanentDeletionResources`; the "was not uninstalled" form is the synchronous HTTP 409, error `4026`). Re-run with `--force` only if that is acceptable; otherwise let the jobs finish first. Retrying without `--force` does not help (`Retry: RetryWillNotFix`) |
|
|
685
|
+
| `deploy uninstall` fails with `Message` "Deployment '<name>' was not uninstalled: its Uninstall validation reports errors that --force cannot get past: …" | The deployment also awaits the permanent-deletion confirmation, but its validation holds an error `--force` does not skip (named after the colon, with its code). Resolve that in Orchestrator and run the uninstall again without `--force` (`Retry: RetryLater`); it then asks for the confirmation on its own |
|
|
574
686
|
| `deploy upgrade` reported `Status: DeploymentSucceeded` but the old version still runs | Read `DeploymentStatus` and `ActivationStatus` in the same output. `SuccessfulInstall` / `NeedsSetupToActivate` means the new version is installed and waits for "Setup activation" in Orchestrator; `PendingResources` names what needs configuring and why (`Reason`, from the activation validation, e.g. `[CNS1072] You will need to authenticate this connection before proceeding further`) and `NextSteps` the step. `ReadyToActivate` means `uip solution deploy activate <name>` is all that is left. Do not run the upgrade again — the content is already there |
|
|
575
687
|
| `Another upgrade has already started for this deployment` (error `4005`) | The key you passed is superseded by a later record; nothing is running. The CLI names the current record — use that key (`uip solution deploy list` shows it). If the current record is already at the version you want, there is nothing to upgrade |
|
|
576
688
|
| `deploy run` succeeded with `ActivationStatus: NeedsSetupToActivate` and the deployment does not run | Expected: the install landed, and a resource needs "Setup activation" in Orchestrator before activation. `PendingResources` names what needs configuring and why (`Reason`, from the activation validation, e.g. `[CNS1072] You will need to authenticate this connection before proceeding further`) and `NextSteps` the step. `Status` may read `ValidationFailed` there: that is the pipeline's word for the activation validation it ran after the install, and `NextSteps` open with its errors. Do not deploy again (the deployment exists); complete the setup, then `uip solution deploy activate <name>` |
|
|
577
689
|
| `deploy activate` refused with `cannot be activated` (error `4007`) on an installed deployment | The deployment needs "Setup activation" first (`ActivationStatus: NeedsSetupToActivate`); `Instructions` list the resources that need configuration. Complete the setup in Orchestrator, then activate. `deploy status <key>` shows the same state |
|
|
578
690
|
| `deploy run` fails on a resource conflict | `uip solution deploy config link config.json <resource> --name <existing> --folder-path <path>` to map to the existing one, or change `conflictFixingAction` via `config set` |
|
|
579
691
|
| The deployment is stuck in `Draft` and `deploy activate` won't take it | Read `Operation` first. `ActivationSetup` + `Draft` is a "Setup activation" someone started in Orchestrator and did not finish — complete it there (the UI lists it as `Activation setup · Draft`); `deploy status <key>` names the resources it waits for. To discard it instead, `uip solution deploy delete <name> --yes` removes the draft alone and the deployment returns to its previous record (still needing setup). `VersionChange` + `Draft` is an upgrade queued and never installed. An `Install` `Draft` is a deploy whose install never completed — validation rejected something. It never advances on its own (a deployment passes through `Draft` for a moment right after you fire the command, but not once the command has returned). The reasons are in the failure's `Instructions` (`Validation:` / `Conflicts:`) on every feed, next to the draft's key; fix them with `uip solution deploy config set` / `deploy config link`, then run your original `uip solution deploy run …` again with `--config-file config.json` added and the **same** `--name` and `--package-version` — it still needs `--package-name` and `--folder-name`. A `Draft` left by an install does not block that rerun; one left by an update of a live deployment needs `--yes`, because the package is already deployed. While a draft exists any other version is refused, `deploy upgrade` included — to drop it instead, run `uip solution deploy upgrade <draft-key> --discard-draft`, or Delete draft in Orchestrator. To look at it, `uip solution deploy list` needs the same `--personal-workspace` / `--feed <name-or-key>` flag the deploy used — plain `deploy list` is tenant-scoped and shows no row for those deployments at all |
|
|
692
|
+
| `Resource key <key> is used by: <file>, <file>` (or `Node already added to the graph` from an older CLI) | Two resource files carry one key. Keep the file whose `name` other resource files and the projects' bindings reference, delete the rest, then run `uip solution resources refresh`. For `(missing)` or `""`, the files are different resources: give each its own unique `key` instead of deleting |
|
|
580
693
|
| `Resource not found` after deploy | `uip solution resources refresh` to re-sync from each project's `bindings_v2.json`; if still missing, the resource was never declared in any project |
|
|
581
694
|
| A cloud change (new entity field, changed queue setting) never reaches the solution | Expected: `refresh` is import-only and reports the resource under `Skipped`. Pull it with `uip solution resources edit <resource-key> --source remote --force` |
|
|
582
695
|
| Output looks empty | You may have redirected stderr — confirmations and errors go there. Re-run without `2>` |
|
package/dist/tool.js
CHANGED
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
metadata,
|
|
3
3
|
registerCommands
|
|
4
|
-
} from "./packager-tool-
|
|
5
|
-
import"./packager-tool-
|
|
6
|
-
import"./packager-tool-
|
|
7
|
-
import"./packager-tool-
|
|
8
|
-
import"./packager-tool-
|
|
9
|
-
import"./packager-tool-
|
|
10
|
-
import"./packager-tool-
|
|
11
|
-
import"./packager-tool-
|
|
12
|
-
import"./packager-tool-
|
|
13
|
-
import"./packager-tool-
|
|
14
|
-
import"./packager-tool-
|
|
15
|
-
import"./packager-tool-
|
|
16
|
-
import"./packager-tool-
|
|
17
|
-
import"./packager-tool-
|
|
18
|
-
import"./packager-tool-
|
|
19
|
-
import"./packager-tool-
|
|
20
|
-
import"./packager-tool-
|
|
21
|
-
import"./packager-tool-
|
|
22
|
-
import"./packager-tool-
|
|
23
|
-
import"./packager-tool-
|
|
24
|
-
import"./packager-tool-
|
|
25
|
-
import"./packager-tool-
|
|
26
|
-
import"./packager-tool-
|
|
27
|
-
import"./packager-tool-
|
|
28
|
-
import"./packager-tool-
|
|
29
|
-
import"./packager-tool-
|
|
30
|
-
import"./packager-tool-gb35b4qs.js";
|
|
31
|
-
import"./packager-tool-zf3929se.js";
|
|
4
|
+
} from "./packager-tool-e7vczxa8.js";
|
|
5
|
+
import"./packager-tool-kkfb5kgn.js";
|
|
6
|
+
import"./packager-tool-amhyxzz6.js";
|
|
7
|
+
import"./packager-tool-gmwva4yv.js";
|
|
8
|
+
import"./packager-tool-8q4tvv8d.js";
|
|
9
|
+
import"./packager-tool-q5j6k3fy.js";
|
|
10
|
+
import"./packager-tool-y2k2f6yg.js";
|
|
11
|
+
import"./packager-tool-4bq36bf5.js";
|
|
12
|
+
import"./packager-tool-qk21gk5m.js";
|
|
13
|
+
import"./packager-tool-m74zqwmh.js";
|
|
14
|
+
import"./packager-tool-act5r386.js";
|
|
15
|
+
import"./packager-tool-dwxswyv4.js";
|
|
16
|
+
import"./packager-tool-3bwnkjdq.js";
|
|
17
|
+
import"./packager-tool-gs3f3tf7.js";
|
|
18
|
+
import"./packager-tool-wknfv4p5.js";
|
|
19
|
+
import"./packager-tool-6x35kvbx.js";
|
|
20
|
+
import"./packager-tool-97rcgwvv.js";
|
|
21
|
+
import"./packager-tool-an5bpbwe.js";
|
|
22
|
+
import"./packager-tool-qw47eyw7.js";
|
|
23
|
+
import"./packager-tool-61pwb567.js";
|
|
24
|
+
import"./packager-tool-8ptbmmmp.js";
|
|
25
|
+
import"./packager-tool-5edvzz80.js";
|
|
26
|
+
import"./packager-tool-43ahv5mn.js";
|
|
27
|
+
import"./packager-tool-tx834spe.js";
|
|
28
|
+
import"./packager-tool-6ybywxxn.js";
|
|
29
|
+
import"./packager-tool-v1f5e8t9.js";
|
|
32
30
|
import"./packager-tool-dfrk01gn.js";
|
|
33
31
|
import"./packager-tool-1de529jm.js";
|
|
34
32
|
export {
|
|
@@ -36,4 +34,4 @@ export {
|
|
|
36
34
|
registerCommands
|
|
37
35
|
};
|
|
38
36
|
|
|
39
|
-
//# debugId=
|
|
37
|
+
//# debugId=B0CD5F2BE1565ADD64756E2164756E21
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PipelineDeploymentResult, WorkflowError } from "@uipath/pipelines-sdk";
|
|
1
|
+
import type { DeploymentRunServiceStatus, PipelineDeploymentResult, WorkflowError } from "@uipath/pipelines-sdk";
|
|
2
2
|
/**
|
|
3
3
|
* Normalize the SDK's `DeploymentRunStatus.errorMessage` field into a
|
|
4
4
|
* `WorkflowError[]` regardless of the runtime shape returned by the API.
|
|
@@ -36,6 +36,8 @@ export declare function extractDeploymentErrors(result: PipelineDeploymentResult
|
|
|
36
36
|
* Schedule: [SCHED_001] Cron expression invalid
|
|
37
37
|
*/
|
|
38
38
|
export declare function formatDeploymentErrorsAsText(summary: DeploymentErrorSummary): string;
|
|
39
|
+
/** The per-service lines for a run's `services`, empty when there are none. */
|
|
40
|
+
export declare function formatServiceErrors(services: DeploymentRunServiceStatus[] | null | undefined): string[];
|
|
39
41
|
export declare function formatDeploymentFailureDetails(pipelineDeploymentId: string, status: PipelineDeploymentResult): string;
|
|
40
42
|
/**
|
|
41
43
|
* The errors a pipeline attached to its terminal status, one line per
|
|
@@ -66,6 +68,12 @@ export declare function isBareResponse(details: string): boolean;
|
|
|
66
68
|
* built for another version: a pending attempt stands in the way.
|
|
67
69
|
*/
|
|
68
70
|
export declare const DRAFT_VERSION_MISMATCH_CODE = "DraftDeploymentHasDifferentPackageVersion";
|
|
71
|
+
/**
|
|
72
|
+
* `ErrorCodes.Deployments.ValidationConfirmationRequired`: the run was refused
|
|
73
|
+
* because replacing installed resources with links permanently deletes them,
|
|
74
|
+
* and nobody acknowledged that. Reported as a schedule error's `errorCode`.
|
|
75
|
+
*/
|
|
76
|
+
export declare const VALIDATION_CONFIRMATION_REQUIRED_CODE = "4026";
|
|
69
77
|
/**
|
|
70
78
|
* Terminal statuses the pipeline reaches before it schedules the install. The
|
|
71
79
|
* attempt's generation is then never promoted: it stays behind as a Draft,
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@uipath/solution-tool",
|
|
3
3
|
"author": "UiPath",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.205.0-preview.258",
|
|
6
6
|
"description": "Create, pack, publish, and deploy UiPath Automation Solutions.",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"dist"
|
|
49
49
|
],
|
|
50
50
|
"private": false,
|
|
51
|
-
"gitHead": "
|
|
51
|
+
"gitHead": "8f629ee9fa89abf94f197436a60cb3b9620f8b27"
|
|
52
52
|
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
deleteDeploymentAsync
|
|
3
|
-
} from "./packager-tool-nfmygm61.js";
|
|
4
|
-
import"./packager-tool-gfhdpkp3.js";
|
|
5
|
-
import"./packager-tool-4gs8y6pr.js";
|
|
6
|
-
import"./packager-tool-7gr2nphb.js";
|
|
7
|
-
import"./packager-tool-stsnbewn.js";
|
|
8
|
-
import"./packager-tool-j3520gxw.js";
|
|
9
|
-
import"./packager-tool-bqre28m1.js";
|
|
10
|
-
import"./packager-tool-f5gq77m5.js";
|
|
11
|
-
import"./packager-tool-zdfn32bc.js";
|
|
12
|
-
import"./packager-tool-f2e9rzxk.js";
|
|
13
|
-
import"./packager-tool-kswwd3hp.js";
|
|
14
|
-
import"./packager-tool-gb35b4qs.js";
|
|
15
|
-
import"./packager-tool-zf3929se.js";
|
|
16
|
-
import"./packager-tool-dfrk01gn.js";
|
|
17
|
-
import"./packager-tool-1de529jm.js";
|
|
18
|
-
export {
|
|
19
|
-
deleteDeploymentAsync
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
//# debugId=BCFE0E491B8154C164756E2164756E21
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
resolveFeedScopeOrFailureAsync
|
|
3
|
-
} from "./packager-tool-9ex75r32.js";
|
|
4
|
-
import"./packager-tool-stsnbewn.js";
|
|
5
|
-
import"./packager-tool-j3520gxw.js";
|
|
6
|
-
import"./packager-tool-bqre28m1.js";
|
|
7
|
-
import"./packager-tool-zdfn32bc.js";
|
|
8
|
-
import"./packager-tool-f2e9rzxk.js";
|
|
9
|
-
import"./packager-tool-kswwd3hp.js";
|
|
10
|
-
import"./packager-tool-gb35b4qs.js";
|
|
11
|
-
import"./packager-tool-zf3929se.js";
|
|
12
|
-
import"./packager-tool-dfrk01gn.js";
|
|
13
|
-
import"./packager-tool-1de529jm.js";
|
|
14
|
-
export {
|
|
15
|
-
resolveFeedScopeOrFailureAsync
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
//# debugId=A12986041C239A2364756E2164756E21
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
catchError,
|
|
3
|
-
logger
|
|
4
|
-
} from "./packager-tool-kswwd3hp.js";
|
|
5
|
-
|
|
6
|
-
// ../solution-sdk/src/solution-file.ts
|
|
7
|
-
var STUDIO_WEB_PROJECT_TYPE_OVERRIDES = {
|
|
8
|
-
ProcessOrchestration: "processOrchestration"
|
|
9
|
-
};
|
|
10
|
-
function normalizeProjectType(projectType) {
|
|
11
|
-
return STUDIO_WEB_PROJECT_TYPE_OVERRIDES[projectType] ?? projectType;
|
|
12
|
-
}
|
|
13
|
-
function toPortableRelativePath(relativePath) {
|
|
14
|
-
return relativePath.replace(/\\/g, "/");
|
|
15
|
-
}
|
|
16
|
-
async function readUipxFile(fs, solutionDir) {
|
|
17
|
-
const dirEntries = await fs.readdir(solutionDir);
|
|
18
|
-
const uipxFileName = dirEntries.find((f) => f.endsWith(".uipx"));
|
|
19
|
-
if (!uipxFileName) {
|
|
20
|
-
throw new Error(`No .uipx file found in ${solutionDir}. Run 'uip solution init' first.`);
|
|
21
|
-
}
|
|
22
|
-
const uipxContent = await fs.readFile(fs.path.join(solutionDir, uipxFileName), "utf-8");
|
|
23
|
-
if (!uipxContent) {
|
|
24
|
-
throw new Error(`Could not read .uipx file: ${uipxFileName} is empty or missing.`);
|
|
25
|
-
}
|
|
26
|
-
const [parseError, parsed] = catchError(() => JSON.parse(uipxContent));
|
|
27
|
-
if (parseError) {
|
|
28
|
-
throw new Error(`Invalid .uipx file: could not parse JSON in ${uipxFileName}.`);
|
|
29
|
-
}
|
|
30
|
-
const uipx = validateUipxFile(parsed, uipxFileName);
|
|
31
|
-
return { uipx, uipxFileName };
|
|
32
|
-
}
|
|
33
|
-
function validateUipxFile(parsed, uipxFileName) {
|
|
34
|
-
if (!isRecord(parsed)) {
|
|
35
|
-
throw new Error(`Invalid .uipx file: ${uipxFileName} must contain a JSON object.`);
|
|
36
|
-
}
|
|
37
|
-
if (typeof parsed.SolutionId !== "string" || !parsed.SolutionId.trim()) {
|
|
38
|
-
throw new Error("Invalid .uipx file: missing SolutionId.");
|
|
39
|
-
}
|
|
40
|
-
if (!Array.isArray(parsed.Projects) || parsed.Projects.length === 0) {
|
|
41
|
-
throw new Error("Invalid .uipx file: missing Projects.");
|
|
42
|
-
}
|
|
43
|
-
for (const [index, project] of parsed.Projects.entries()) {
|
|
44
|
-
if (!isRecord(project)) {
|
|
45
|
-
throw new Error(`Invalid .uipx file: Projects[${index}] must be an object.`);
|
|
46
|
-
}
|
|
47
|
-
if (typeof project.ProjectRelativePath !== "string" || !project.ProjectRelativePath.trim()) {
|
|
48
|
-
const pathHint = typeof project.Path === "string" ? " Found Path, but .uipx uses ProjectRelativePath." : "";
|
|
49
|
-
throw new Error(`Invalid .uipx file: Projects[${index}] is missing ProjectRelativePath.${pathHint} Use 'uip solution projects add' to add projects, or set ProjectRelativePath to the project file path, for example "Foo/project.uiproj".`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return parsed;
|
|
53
|
-
}
|
|
54
|
-
function isRecord(value) {
|
|
55
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
56
|
-
}
|
|
57
|
-
function resolveSolutionDir(fs, inputPath) {
|
|
58
|
-
const resolved = fs.path.resolve(inputPath);
|
|
59
|
-
if (resolved.endsWith(".uipx")) {
|
|
60
|
-
return fs.path.dirname(resolved);
|
|
61
|
-
}
|
|
62
|
-
return resolved;
|
|
63
|
-
}
|
|
64
|
-
async function updateUipxSolutionId(fs, uipxPath, newSolutionId) {
|
|
65
|
-
const [readError, content] = await catchError(fs.readFile(uipxPath, "utf-8"));
|
|
66
|
-
if (readError || !content) {
|
|
67
|
-
logger.error(`Could not read .uipx file for update: ${readError?.message ?? "empty file"}`);
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const [parseError, parsed] = catchError(() => JSON.parse(content));
|
|
71
|
-
if (parseError) {
|
|
72
|
-
logger.error(`Could not parse .uipx file for update: ${parseError.message}`);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
parsed.SolutionId = newSolutionId;
|
|
76
|
-
const [writeError] = await catchError(fs.writeFile(uipxPath, JSON.stringify(parsed, null, 4)));
|
|
77
|
-
if (writeError) {
|
|
78
|
-
logger.error(`Could not update .uipx with new SolutionId: ${writeError.message}`);
|
|
79
|
-
} else {
|
|
80
|
-
logger.info(`Updated .uipx with Studio Web SolutionId: ${newSolutionId}`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async function findSolutionFileUpward(fs, startDir) {
|
|
84
|
-
let dir = startDir;
|
|
85
|
-
while (true) {
|
|
86
|
-
const entries = await fs.readdir(dir);
|
|
87
|
-
const files = entries.filter((f) => f.endsWith(".uipx"));
|
|
88
|
-
if (files.length === 1) {
|
|
89
|
-
return fs.path.join(dir, files[0]);
|
|
90
|
-
}
|
|
91
|
-
if (files.length > 1) {
|
|
92
|
-
throw new Error(`Multiple .uipx files found in ${dir}. Please specify which solution file to use.`);
|
|
93
|
-
}
|
|
94
|
-
const parent = fs.path.dirname(dir);
|
|
95
|
-
if (parent === dir) {
|
|
96
|
-
throw new Error(`No .uipx solution file found (searched from ${startDir} to filesystem root)`);
|
|
97
|
-
}
|
|
98
|
-
dir = parent;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export { normalizeProjectType, toPortableRelativePath, readUipxFile, resolveSolutionDir, updateUipxSolutionId, findSolutionFileUpward };
|
|
103
|
-
|
|
104
|
-
//# debugId=FD084AD2795A138064756E2164756E21
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
UnpackableProjectTypeError,
|
|
3
|
-
ensurePackagerTools,
|
|
4
|
-
isUnpackableProjectTypeError,
|
|
5
|
-
toolVerbForProjectType
|
|
6
|
-
} from "./packager-tool-e2rtr49j.js";
|
|
7
|
-
import"./packager-tool-zns6n8zp.js";
|
|
8
|
-
import"./packager-tool-fv7xyzg2.js";
|
|
9
|
-
import"./packager-tool-kswwd3hp.js";
|
|
10
|
-
import"./packager-tool-zf3929se.js";
|
|
11
|
-
import"./packager-tool-dfrk01gn.js";
|
|
12
|
-
import"./packager-tool-1de529jm.js";
|
|
13
|
-
export {
|
|
14
|
-
UnpackableProjectTypeError,
|
|
15
|
-
ensurePackagerTools,
|
|
16
|
-
isUnpackableProjectTypeError,
|
|
17
|
-
toolVerbForProjectType
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
//# debugId=C6DDCB8627A7967264756E2164756E21
|