Inspect the application
Prerequisite: the dev context from Install and connect.
tsm app entity types
tsm app forms capabilities
tsm app jexl capabilities -o yaml
tsm app request GET tsm-config-form/api/v2/entity-types/search --json
Expected: entity types table; Forms capabilities as readable sections; JEXL capabilities in YAML; raw request result in JSON. These are read-only inspections and require no workspace or local DB.
tsm --context dev app entity list BillingCycleType --page-size 10
tsm --context dev app entity get BillingCycleType <CODE>
tsm --context dev service health tsm-ordering
tsm --context dev app request GET tsm-config-form/api/v2/entity-types/search --raw
Replace <CODE> with a value from the Code column of the list. Entity types and codes differ between deployments.
service stays at root for low-level microservice access. app request is the raw HTTP escape hatch;
--raw preserves the response bytes/text contract. Explicit POST/PUT/PATCH/DELETE requests can mutate the target.
Cleanup: none for these read-only operations.
Create a tenant from local packages
--config-package and --data-package are repeatable; --mock-package selects one
mock package. Every input accepts a source directory or an existing ZIP. Directories
are snapshotted from the current working tree (including uncommitted edits); ZIPs
are uploaded byte for byte. Relative paths follow the selected workspace.
tsm --context dev app tenant create demo01 --name 'Local ISP changes' \
--source-tenant ispblueprint --purpose TESTING --ttl-days 2 \
--config-package packages/isp-core \
--config-package packages/isp-e2e \
--data-package packages/isp-demo-data \
--mock-package packages/isp-mocks \
--run-suite Isp.Demo --wait
tsm --context dev app tenant cleanup demo01 --wait
Choose a copy-only source profile such as standard (the configured default is used
when --profile is omitted). The source needs the project's baseline and schema registrations.
The CLI validates and snapshots all inputs before allocating the tenant. It sends a plain JSON create request to UM and waits for READY. For a suite, mocks or packaged E2E definitions it explicitly initializes target E2E storage through its native API before any package access. It then installs config packages through Form's configuration package API, imports datasets through Form's data import API, uploads mocks directly to E2E and provisions the allocation's binding. Connector overrides use the existing tenant testing-configurations API. Finally the CLI submits the suite directly to E2E under the current credentials in the target tenant.
If the copied tenant has a different account from the management owner, pass
--preparation-context <name> to select its stored credentials for target preparation
and E2E. The context must resolve to the same endpoint as the management context.
The allocated tenant overrides its configured tenant. The receipt stores the context name
so cleanup can drain E2E with the same account; keep that context available until cleanup.
For older receipts or to select a different account, pass --preparation-context <name>
to tenant cleanup; this overrides the receipt context and has the same endpoint restriction.
Create, status, connector administration and delete still use the management context.
UM only manages allocation lifecycle; it does not receive package bytes or need package storage or increased multipart limits. The create JSON carries a requestId for lost-response recovery and prepareMocks to track the allocation's cleanup obligation.
Package preparation runs synchronously even without --wait; that flag additionally waits for
the E2E verdict/report. Keep the CLI running until preparation finishes. READY is UM lifecycle
status; the local receipt records PREPARED separately. An interrupted CLI does not automatically
resume or retry partially applied packages. Inspect the receipt/status and cleanup the allocation.
Uncertain write responses (including HTTP 408/5xx) record WRITE_OUTCOME_UNKNOWN. An interrupted
write phase also blocks cleanup until an operator verifies completion and reconciles the receipt.
There is no force bypass.
Preparation does not submit a Data Model refresh or poll its lifecycle-admission endpoint.
--wait waits for lifecycle READY, synchronous package uploads and the optional E2E verdict/report;
it does not imply Data Model freshness. Configuration and dataset APIs use native entity metadata,
not the derived Data Model. Use --require-clean-data-model only when a following operation
actually needs it: this explicitly submits a refresh after configuration uploads, rejects failed
sources even for SUCCEEDED/CURRENT traversal, and waits for physical drain before importing data.
Each upload relies on server-side allocation/write admission. The CLI retries only HTTP409 with
TENANT_WRITE_NOT_ADMITTED, which the server emits before beginning a write. Generic conflicts,
transport failures and unknown outcomes are never replayed. Retries share one bounded stage budget.
Cleanup still requires Form lifecycle-admission support and physical writer drain before deletion.
On servers that serialize configuration writes with background Data Model refresh, uploads can
still receive pre-write 409 and wait.
The current server conservatively retains an operation for FAILED/PARTIAL Data Model results and failed direct writes. An operator must verify physical completion and use the native per-allocation writer inspect/confirmation API before cleanup can continue; elapsed time or an expired process lock does not clear that evidence.
Mock connector bindings are part of the client input. Put a connectorOverrides map in
mock-package.yaml, or pass --mock-connector-overrides local-connectors.json. Its values
use {{mockEndpoint}} and {{tenant}}, following the native connector override contract.
The server validates the allowed connectors and requires E2e.Environment.Provision.
Local mock directories get a stable VERSION-local-CONTENTHASH transport version, so
editing a fixture does not collide with the immutable release version. Source files are
not rewritten. Prebuilt ZIPs keep their declared version and immutable-identity checks.
Cleanup requires the workspace creation receipt in .tsm/state/tenants/, bound to the
endpoint, owner and allocation ID. It cancels/drains the recorded suite, refuses unrelated
online executions and uncertain writer completion, and uses native cancel/delete until
DELETED. A dedicated mock runtime is reset only after
operator identity, allocation and foreign-expectation checks; the pool slot is then freed.
Fresh local runtime catalogs use one dedicated slot per workspace as well. Existing SHARED
runtimes require operator cleanup. Reports and local receipts are retained.
A failed preparation retains the tenant and its local provenance for diagnosis. No UM upload
files exist; cleanup uses native writer guards before deletion. --config-package installs
configuration; it does not implicitly execute arbitrary setup scripts or deploy every BPMN
in a package. Sources must contain the required baseline; project-specific runtime setup
must be completed explicitly before selecting a suite that depends on it.
For app entity get --source es and app entity verify, quotes in the entity code are escaped as TQL literals. A backslash before a quote or at the end of an ID/code, or a double quote/backslash in --es-entity, is rejected before any request because TQL cannot represent it safely.