| name | stella-cli |
| description | Drive the stella command-line client (@stll/cli), a legal-workspace CLI whose command surface is generated from the stella MCP tool registry. Covers install, OAuth login, the full command tree grouped by domain, JSON output for scripting, the --input escape hatch for deep payloads, cursor pagination, destructive-op confirmation, and exit codes. |
| metadata | {"type":"reference","library":"@stll/cli"} |
stella CLI
@stll/cli is the command-line client for stella, an open-source legal
workspace. Its command surface (stella <domain> <action>) is generated from
the stella MCP tool registry, so it mirrors exactly the tools a stella server
exposes. Every command works for humans, scripts, and agents alike.
Install
npm i -g @stll/cli
Authenticate
stella auth login
Login runs an OAuth 2.1 authorization-code flow with PKCE against the stella
server, using a loopback listener (http://127.0.0.1/callback, ephemeral port)
to capture the code. Credentials are stored per server origin, so one machine
can hold sessions for several servers at once. Point at a non-default server
with --server <url>; scope the session with --scopes (default scopes:
openid profile email stella:read stella:search). stella auth whoami shows
the active session; stella auth logout clears it.
Conventions every agent must know
- Output format: table is the default only on a TTY; piped/non-TTY output
defaults to JSON. Force it with
--output json|table (or --json / --table).
Always pass --output json when scripting or parsing.
- Deep payloads: any command accepts
--input '<json>' for the whole tool
argument object, --input @file to read JSON from a file, or --input - to
read JSON from stdin. Individual string flags also take gh-style @file / @-
sugar (use @@ to pass a literal leading @).
- Array flags are repeatable: pass the flag once per value.
- Pagination: list commands take
--cursor <c> and --limit <n>; --all
follows cursors up to bounded ceilings. The nextCursor resume hint is written
to stderr (more: --cursor <c>) so piped JSON on stdout stays clean.
- Destructive commands (delete/remove) prompt for confirmation on a TTY and
require
--yes when there is no TTY to confirm on. The CLI owns the server's
confirm gate: it injects confirm: true only after you confirm (or pass
--yes), so there is no separate --confirm flag to pass.
- Errors print
error: <message> (and hint: <next step> when the server
supplies one) to stderr as plain text, never to stdout, so a scripted stdout
stays clean even with --output json. Every tool error carries a stable
machine code that maps to the process exit code (see below): branch on the
exit code, and read the error:/hint: lines for the human-readable message.
- MCP resources:
stella reference list enumerates static server resources;
stella reference show <name> prints one.
Exit codes
| Code | Meaning |
|---|
| 0 | success |
| 1 | unexpected internal error |
| 2 | usage or input validation error |
| 3 | authentication required or failed (run stella auth login) |
| 4 | server or tool error |
| 5 | feature disabled for this organization |
| 6 | resource not found |
| 7 | confirmation aborted (a destructive op was declined) |
| 8 | permission denied (member role lacks the required permission) |
| 9 | usage entitlement exceeded |
| 10 | conflict with current state (duplicate or concurrent change) |
The exit code lines up with the tool-error code: validation_error -> 2,
missing_scope -> 3, feature_disabled -> 5, not_found -> 6,
confirmation_required -> 7, and rate_limited / unknown_tool /
internal_error -> 4. A legacy server that tags only a bare feature_disabled
code (no envelope) still maps to 5; anything else falls to 4.
Capability commands (full surface)
Beyond the curated commands above, the CLI generates 247
capability commands from the server's capability catalog: every safe handler
that is not a curated tool, reached through the generic invoke_capability
path. They follow the same stella <domain> <action> shape (a colliding
capability drops under stella capability <domain> <action> instead).
- Discover:
stella capability list [--domain <d>] [--access read|write]
enumerates them (paginated); stella capability describe <id> prints one
capability's full input schema, scope, and flags.
- Invoke by id (forward-compatible with any server):
stella capability invoke <id> --input '<json>', where the JSON is { body?, params?, query? }.
- Flags: each capability command derives flags from its input schema;
workspace-scoped capabilities take a required
--workspace <id>. Deep or
ambiguous payloads use --input (the whole { body?, params?, query? }).
- Dry run:
--dry-run validates the input server-side and returns without
executing (maps to validateOnly).
- Destructive capabilities prompt on a TTY and need
--yes off a TTY; the
server's per-capability confirm gate is satisfied automatically once confirmed.
- Exit codes are identical to the curated commands (see above).
Filing feedback
stella feedback send files a bug, feature request, or docs issue with the
maintainers. Content is sanitized server-side (emails, ids, secrets, URLs, and
IPs are redacted); never include tenant data, client or matter names, ids, or
secrets: describe the problem, reproduction steps, and expected vs actual
result. Pass --kind, --title, and --body.
- github (preferred): returns a prefilled new-issue URL and a
gh command
the human opens and submits under their own GitHub account. The CLI never
publishes anything itself.
Command tree
Generated from the MCP tool registry; Access is the OAuth scope the command
requires (request it at stella auth login --scopes).
| Domain | Command | Access | Notes |
|---|
| audit-log | stella audit-log list | admin_read | paginated |
| capability | stella capability describe | read | |
| capability | stella capability invoke | read | |
| capability | stella capability list | read | paginated |
| case-law | stella case-law read | read | paginated; windowed text |
| case-law | stella case-law search | search | paginated |
| clause | stella clause delete | knowledge_write | destructive (needs --yes off a TTY) |
| clause | stella clause list | read | paginated |
| clause | stella clause save | knowledge_write | |
| contact | stella contact delete | matters_write | destructive (needs --yes off a TTY) |
| contact | stella contact lookup-registry | read | |
| contact | stella contact read | read | |
| contact | stella contact save | matters_write | |
| document | stella document delete | documents_write | destructive (needs --yes off a TTY) |
| document | stella document field set | documents_write | |
| document | stella document list | read | paginated |
| document | stella document properties list | read | paginated |
| document | stella document read | read | |
| document | stella document save | documents_write | |
| feedback | stella feedback send | feedback | |
| invoice | stella invoice list | read | paginated |
| legislation | stella legislation search | read | paginated |
| matter | stella matter delete | matters_write | destructive (needs --yes off a TTY) |
| matter | stella matter link-contact | matters_write | |
| matter | stella matter list | read | paginated |
| matter | stella matter save | matters_write | |
| organization | stella organization add-member | admin_write | |
| organization | stella organization remove-member | admin_write | destructive (needs --yes off a TTY) |
| organization | stella organization set-jurisdictions | onboarding | |
| organization | stella organization update-settings | admin_write | |
| playbook | stella playbook list | read | paginated |
| playbook | stella playbook run | knowledge_write | |
| rate | stella rate resolve | read | |
| search | stella search matters | search | paginated |
| search | stella search read | read | paginated; windowed text |
| task | stella task list | read | paginated |
| task | stella task save | matters_write | |
| template | stella template fill | templates | |
| template | stella template list | templates | paginated |
| template | stella template save | templates | |
| time-entry | stella time-entry delete | billing_write | destructive (needs --yes off a TTY) |
| time-entry | stella time-entry list | read | paginated |
| time-entry | stella time-entry save | billing_write | |
| usage | stella usage get | read | |