sbm-cli
A generic command-line client for the SBM (Serena Business Manager) 12.0 JSON API.
Designed for day-to-day L3 support work and for use as a tool by AI assistants (Claude Code).
Install
# Recommended — isolated environment
uv tool install sbm-cli
# Also works
pip install sbm-cli
PATH issues? If
python,uv, orsbmare not found after installation, see the PATH setup guide in the manual.
Quick start
sbm configure setup # interactive setup wizard
sbm schema # verify config and see available transitions
sbm list # list open tickets
sbm get 02440942 # get ticket details
Configuration
Config is stored at ~/.sbm-cli/config.toml. Run sbm configure setup to create it interactively.
The password is stored in the system keyring — Windows Credential Manager, macOS Keychain, or GNOME Keyring/KWallet on Linux (never in the config file). On headless Linux without a keyring daemon, you are prompted for your password on each run. If you have an existing config with a plaintext password field, it is migrated automatically on the next run.
Use sbm configure transition <name> to add or update a named transition interactively.
Manual editing is still needed for teams (transition IDs are instance-specific):
[connection]
host = "https://sbm.example.com"
username = "myuser"
verify_ssl = false # set true for trusted certs
[defaults]
table_id = 1000
report_ids = [2208, 2209] # one or more reports; sbm list merges and de-duplicates them
list_fields = ["TITLE","STATE","FUNCTIONALITY","URGENCY"] # optional; blank uses built-in default
[transitions.assign]
id = 155
fields = ["OWNER", "3RD_LEVEL_SPECIALIST"]
optional_fields = ["SOLUTION_STEPS"] # optional comment field
[transitions.close]
id = 19
fields = ["RESOLUTION", "ROOT_CAUSE"]
optional_fields = ["SOLUTION_STEPS"]
pre_transition_id = 148
pre_transition_optional = true
[transitions.return-l2]
id = 88
fields = ["RETURN_REASON", "RETURN_NOTE", "SOLUTION_STEPS"] # SOLUTION_STEPS required here
[transitions.transfer]
id = 140
fields = ["L3_SPECIALIST_GROUP"]
optional_fields = ["SOLUTION_STEPS"]
[transitions.transfer.field_types]
L3_SPECIALIST_GROUP = "list"
[teams]
my-team = { id = 155, name = "L3 My Team" }
Transition IDs are instance-specific. Find them by inspecting browser developer tools while performing actions in the SBM web UI, or ask your SBM admin.
Multiple reports.
defaults.report_idsis a list.sbm list(with no--report) queries every configured report, merges the results, and drops duplicate tickets (a ticket appearing in more than one report is listed once). If one report fails, the others still return and a warning is printed to stderr;sbm listonly errors when every report fails. Override the config for a single run with a repeatable--reportflag:sbm list --report 2208 --report 2209.Migration: an older config with a single
report_id = 2208is still read (treated asreport_ids = [2208]) and rewritten toreport_idsthe next time the config is saved.
Commands
| Command | Description |
|---|---|
sbm configure setup |
Interactive setup wizard |
sbm configure transition <name> |
Add/update a named transition interactively |
sbm schema |
Machine-readable capabilities JSON |
sbm list [--report N]... [--filter N] |
List tickets (--report is repeatable; merges + de-dups across reports) |
sbm get <ticket-id> |
Get ticket by display ID |
sbm fields <ticket-id> [--fields F1,F2] |
List field definitions (dbnames, types, labels) |
sbm transition <name> <ticket-id> --field K=V |
Run named transition |
sbm transition run <ticket-id> --id N --field K=V |
Run raw transition by ID |
sbm field-values <field> --table <table-id> |
Discover valid relational field values |
sbm teams |
List configured teams |
Global flags
Global flags must appear before the subcommand: sbm --pretty list, not sbm list --pretty.
--version Show installed version and exit
--pretty / -H Human-readable output (rich tables)
--config PATH Override config file location
--quiet Suppress stderr status messages
--indent Output formatted JSON with indentation
Output format
All commands output a JSON envelope:
{"ok": true, "command": "get", "data": {...}}
{"ok": false, "command": "transition", "error": {"type": "api_error", "message": "..."}}
Exit codes: 0 success · 1 API error · 2 config/auth error · 3 validation error
Development
git clone https://github.com/xdoko01/sbm-cli
cd sbm-cli
uv sync
uv run sbm configure
uv run pytest
uv run pytest -m integration # requires live SBM connection
Changelog
0.4.0
- Cross-platform support: Windows, macOS, and Linux (previously Windows-only)
- Platform-aware credential storage messages (Windows Credential Manager / macOS Keychain / system keyring)
- Interactive password prompt fallback on headless Linux (no keyring daemon required)
- Safe config migration when no keyring is available — plaintext password preserved rather than silently lost
pyproject.tomlclassifier updated toOS Independent
0.3.2
sbm --pretty getnow renders relational fields (OWNER, SUBMITTER, CONTACT, etc.) correctly — they were always blank due to a formatter bug
0.3.1
sbm --versionflag added- README: version changelog, updated config example with
optional_fields
0.3.0
optional_fieldsper transition —SOLUTION_STEPS("Add your comment") is now discoverable on all transitions viasbm schemasbm --pretty schemashows— optional: SOLUTION_STEPSfor each supporting transition- Named
transitioncommand warns on stderr when an unrecognised field is passed CLAUDE.mdupdated with AI instruction to ask users whether to add a comment before executing any transition
0.2.0
- Passwords stored in Windows Credential Manager (keyring); auto-migrated from plaintext config
configure transitionsubcommand for interactive transition setuplist_fieldsconfig key for customisable default columns insbm list[users]config section — resolve login names to user IDs in transitionssbm fieldscommand — list field dbnames, types, and labels from a sample ticket--indentglobal flag for pretty-printed JSON output
0.1.0
- Initial release:
configure,schema,list,get,transition,field-values,teams - Named transitions with required fields, pre-transition support, relational field type handling
License
MIT
Metadata
Release files for sbm-cli 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sbm_cli-0.5.0.tar.gz | 53.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sbm_cli-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.6 kB
Release files / sbm_cli-0.5.0.tar.gz
| Download URL | sbm_cli-0.5.0.tar.gz |
|---|---|
| Size | 53.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a35f16d855374e1424df492cfba2176362f655644a51428a1a6cb6b7495640b
|
|
BLAKE2b-256 checksum How to use checksums |
817a717c6c9103bddeccede344529e98196302560ea3b71ec26cc3a467761bd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / sbm_cli-0.5.0-py3-none-any.whl
| Download URL | sbm_cli-0.5.0-py3-none-any.whl |
|---|---|
| Size | 18.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2c560da970cb49d468eba5f40b68f37160c3175b4df573cf31e5378c30101b37
|
|
BLAKE2b-256 checksum How to use checksums |
2bc6b9ae87b8cf8757169d195371545e3415e81fa2be8faa2bf1bb680995876a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|