Skip to main content
Version: 2.4

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.