Files
sim/packages/sim-cli
Waleed 479ae8c138 fix(cli): seven defects found by live-testing the CLI against staging (#7176)
* fix(catalog): resolve an unversioned tool id against the visible set

`tools get github_comment` answered NOT_FOUND while `github_comment_v2` worked,
though the toolId help promises an unversioned name resolves to the newest
version. A superseded tool stays in the registry, so `resolveToolId`
short-circuits on the exact hit and returns it unchanged; the visibility gate
then refuses it because no visible block exposes a v1 tool. 204 base names were
unresolvable this way.

Resolution now walks the visible set newest-first, the way blocks already do.
`resolveToolId` is untouched — execution depends on an exact id returning that
exact id, and none of the 5182 visible ids change under the new path.

* fix(files): resolve an archived folder path through its active ancestors

The archived folder listing built its path map from the archived rows alone, so
a folder whose parent is still active came back as its own name. Deleting
`a/sub` and restoring `a/sub` therefore disagreed — restore only matched the
truncated `sub` — and the path and parentPath fields were wrong.

The extra read is taken only for the archived scope; active and all keep their
single query, which a test now pins.

Restoring by path also stopped guessing. Archiving, recreating and archiving
again leaves two archived folders with the same canonical path, and the resolver
took the first match, silently restoring the wrong one. It now refuses and names
the folder-id form.

* fix(v2): answer a folder-list miss with an empty page

A parentPath naming no folder returned 404 on the workflow, table and knowledge
folder lists, and an empty page on files. The rule the codebase already
publishes is the empty page: V2_FOLDER_FILTER_MISS is appended to the folderPath
filter on six list surfaces, and resolveFolderPathFilter documents why a list
must not become an existence oracle — a 404 claims the collection is missing and
breaks a walk when a folder is deleted mid-pagination.

Both TSDocs asserted the sibling folder lists already behaved that way. They did
not; that premise is corrected here too.

Mutations keep every 404. The miss short-circuits before the row query, because
an unfiltered parent id lists the whole workspace.

* fix(cli): gate activating a deployed version

`workflows activate create` switched which version production serves with no
confirmation, while `rollback` refused without --yes. They are the same
application operation under two transitions, so gating one and not the other was
an accident of naming.

The destructive-operation classification in the client tests listed activate as
non-destructive, which is what kept its sweep from noticing. Moved, so two
independent tests now hold the gate.

* fix(cli): name the profile in the suggestion configure prints

Refusing a root global printed a command to save it — without --profile, so
following it verbatim wrote the default profile and left the named one
untouched. The neighbouring suggestions in this file already carry the flag.

Resolution matches resolveProfile, so SIM_PROFILE is covered too, and the
profile name is redacted like the value beside it.

* fix(cli): fail a row delete that matched nothing

`tables rows batch-delete` exited 0 when none of the named rows existed, while
the table equivalent exited 1 on the same shape. Only the id-list selection is
checked: a filter answers without a requested count, so the guard self-excludes
and an idempotent sweep still exits 0 on its second run.

* fix(cli): show the -- escape for an id that opens with a dash

Short ids draw from a 64-character alphabet containing one dash, so 1 in 64 open
with one and commander reads it as an unknown option. It reaches `audit-logs
get` and the custom-tool commands, and the escape was documented nowhere.

The hint is appended only for a lone dash followed by two or more characters
carrying an uppercase letter or digit — a shape no flag on this surface has — so
a misspelt flag keeps commander's own suggestion.

* chore: regenerate the API reference and CLI surface

* fix(cli): quote a profile name a pasted command would otherwise split

The suggestion configure prints is meant to be pasted, and it interpolated the
profile name bare. Profile-name validation is creation-only by design — the
validator says so, because a hand-written `[profile my stack]` has to keep
resolving — so a name carrying whitespace, or a `;` that would end the pasted
command and start another, reaches this message unchecked.

Names that already satisfy the creation rule stay bare; the rest are single
quoted, embedded quotes included. Redaction runs first, so a control character
becomes a space and is then quoted rather than splitting the command.
2026-08-27 15:14:48 -07:00
..

Sim CLI

sim is the command-line client for Sim, a workspace for building, deploying, and managing AI agents and workflows.

Use the CLI to work with an existing Sim account or self-hosted deployment from your terminal. You can run workflows, inspect logs, query tables, manage files and knowledge bases, and configure workspace resources. The CLI does not install or run Sim itself; see the self-hosting guide if you need to set up a Sim deployment.

Install

The CLI requires Node.js 20 or newer.

npm install --global sim
sim --version

You can also run a command without installing the package globally:

npx sim --help

Get started

Sign in to the default profile:

sim login

The CLI opens a browser and prints a pairing code. Confirm that the code in the browser matches the one in your terminal, approve the login, and choose a workspace. The selected workspace becomes the default for this profile.

The login stores a personal API key locally. It does not start a local callback server, so the same flow works over SSH and in containers. Use sim login --no-browser when the browser is on another machine.

Check the active profile and verify that its endpoint, API key, and workspace work together:

sim whoami

This also reports whether the active key is personal or workspace-scoped. Some administrative and deployment operations require a personal key.

Then list and run workflows:

sim workflows list
sim workflows run <workflowId> --input '{"ticketId":"T-4821"}'

A workflow must be deployed before it can run:

sim workflows deploy <workflowId>

Workflow, knowledge-base, and workspace IDs are UUIDs. Table IDs start with tbl_; file IDs start with wf_. Despite the prefix, wf_ identifies a file, not a workflow.

Profiles

A profile is a named CLI configuration. It determines:

  • which Sim deployment to use
  • which API key to authenticate with
  • which workspace to target by default
  • how command output is formatted

If you do not specify a profile, the CLI uses default. Select another profile with --profile, its short form -P, or SIM_PROFILE:

sim workflows list --profile production
sim -P production logs list
SIM_PROFILE=production sim tables list

Unknown profile names fail with the configured profile list and a suggested match when available. login and configure are the exceptions because they can create a new profile.

There are two common ways to create profiles.

Use one login with several workspaces

After sim login, create another profile that shares the active profile's API key but has its own default workspace:

sim workspaces list
sim profile add acme --workspace <workspaceId>
sim --profile acme whoami

If you omit --workspace in an interactive terminal, the CLI asks you to choose one. The new profile stores an auth_profile reference to the active login; it does not copy the API key.

Use a separate account or deployment

Run login with a new profile name. Add --endpoint when the profile should use a self-hosted or local deployment:

sim login --profile work
sim login --profile local --endpoint http://localhost:3000

Each of these profiles stores its own API key. The endpoint selected during login is saved with the profile.

View and change profiles

sim profiles
sim configure --profile work
sim configure --profile work --set-workspace <workspaceId>
sim configure --profile work --set-output json
sim configure --profile local --set-endpoint http://localhost:3000
sim whoami --profile work

sim profiles marks the active profile with *. Running sim configure with no setting flags prints the saved settings for that profile.

Non-secret settings are stored in ~/.sim/config. API keys are stored separately in ~/.sim/credentials, which is written with 0600 permissions. Set SIM_CONFIG_DIR to use a different directory.

For each setting, the CLI uses the first available value in this order:

  1. command-line flag
  2. environment variable
  3. selected profile
  4. built-in default

sim whoami shows both the resolved values and where each one came from.

Useful commands

Run --help at any level to see the available subcommands and flags:

sim --help
sim workflows --help
sim tables rows query --help

The commands you will use most often are:

Task Command
Ask Sim about the workspace sim chat "Which workflows failed today?"
List or inspect workflows sim workflows list, sim workflows get <workflowId>
Deploy or run a workflow sim workflows deploy <workflowId>, sim workflows run <workflowId>
Follow a workflow run sim workflows run <workflowId> --follow
Inspect workflow runs sim workflows runs list --workflow <workflowId>
Find errors sim logs list --level error, sim logs follow
Inspect a run trace sim logs get <runId> --trace
Work with tables sim tables list, sim tables rows query <tableId>
Import a CSV sim tables import ./data.csv
Upload or download files sim files upload ./report.pdf, sim files get <fileId>
Search knowledge bases sim knowledge search --query "refund policy" --kb <knowledgeBaseId>
Upload a knowledge document sim knowledge documents upload <knowledgeBaseId> ./handbook.pdf
Manage integration credentials sim credentials --help
Manage workspace secrets sim secrets list, sim secrets set <name>

Commands follow this general shape:

sim <resource> [sub-resource] <verb> [arguments] [options]

Many plural top-level resource names also accept a singular spelling, so sim workflow get <workflowId> and sim workflows get <workflowId> are equivalent. Not every group has a singular alias; sim --help shows the exact aliases. knowledge also has the kb alias.

For workflows, tables, files, and knowledge bases, list returns resources only. ls [path] returns the resources and direct child folders at a path:

sim workflows ls /Support
sim files ls /Reports

See the command reference for every command, argument, and flag.

JSON input and output

Human-readable tables are the default. Use JSON or YAML when another program will consume the result, and text for tab-separated shell output:

sim workflows list --output json
sim logs list --output json | jq -r '.[].runId'
SIM_OUTPUT=yaml sim tables get <tableId>
sim configure --set-output json

JSON-valued options accept inline JSON, a file prefixed with @, or stdin with @-:

sim workflows run <workflowId> --input '{"customerId":"cus_123"}'
sim workflows run <workflowId> --input @input.json
printf '%s' '{"customerId":"cus_123"}' | sim workflows run <workflowId> --input @-

List-valued options use the same @file and @- forms, with one value per line. Destructive commands require an explicit selector and --yes; they do not default to deleting every resource when a selector is missing.

For secret values, prefer a prompt, file, or stdin so the value does not appear in shell history or the process list:

sim secrets set API_KEY --scope workspace
sim secrets set API_KEY --scope workspace --value @secret.txt
printf '%s' "$API_KEY" | sim secrets set API_KEY --scope workspace --value @-

CI and automation

In CI, use an API key instead of sim login:

export SIM_API_KEY="sim_..."
export SIM_WORKSPACE="<workspaceId>"

sim workflows run <workflowId> --input @input.json --output json

Create and revoke API keys in Sim under Settings → API keys, and store them in your CI provider's secret store. sim logout only removes a stored key from the current machine; it does not revoke the key.

The main environment variables are:

Variable Purpose
SIM_PROFILE Profile to use
SIM_ENDPOINT Sim deployment URL
SIM_API_KEY API key, usually for CI
SIM_WORKSPACE Workspace to target
SIM_OUTPUT table, json, yaml, or text
SIM_CONFIG_DIR Directory containing CLI config and credentials
SIM_TIMEOUT_SECONDS Per-request timeout; 0 waits indefinitely
SIM_DEBUG Print request diagnostics to stderr

Documentation

License

Apache-2.0