Before running commands
Sync these skills to the installed CLI version:
wuji update --skills
When the local skills already match the CLI version, the command installs nothing, but it still reports stale Skills directories and moves them out of ~/.agents/skills when you pass --yes or confirm the prompt (see the Stale Skill Directories section below). It exits non-zero only when the sync fails to converge.
Mental Model
- Stateless: each command runs connect → operate → disconnect on its own. No connection persists between commands, so there's no separate "connect" step.
- Single occupancy: device firmware allows only one direct session at a time. When a host app (such as Wuji Studio) holds the device, the CLI automatically falls back to read-only access through the Zenoh bridge (set writes are rejected in this mode).
- Exit codes: 0 = success; non-zero = failure (
pingfailing on any device ordoctorreporting a Fail both exit 1), directly usable in scripts.
Command Overview
| Command | Purpose |
|---|---|
wuji devices |
Scan and list devices (USB/UDP) |
wuji ping |
Handshake probe; reports SN/firmware/IP (probes all devices by default) |
wuji resources |
List readable/writable params and subscribable topics |
wuji get <path> |
Read a parameter (auto-decoded to JSON per schema) |
wuji set <path> <value> |
Write a parameter (value is JSON; 0x prefix means raw hex bytes) |
wuji sub <topic> |
Subscribe to real-time data (--count N exits after N frames) |
wuji viz --sn <SN> |
Visualize live Wuji Hand 2 data (see the wuji-cli-viz skill) |
wuji calib hand-model |
Hand model calibration (see the wuji-cli-calib skill) |
wuji calib tactile |
Tactile contact-model calibration (see the wuji-cli-calib skill) |
wuji doctor |
Device health self-check (see the wuji-cli-doctor skill) |
wuji upgrade |
Firmware update check and upgrade (see the wuji-cli-upgrade skill) |
wuji user |
Manage SDK users and export/import calibration data (see the wuji-cli-user skill) |
wuji update |
Update the CLI and its Agent Skills (--check checks only, --skills syncs Skills only) |
wuji completions <shell> |
Generate shell completion scripts |
Add --help after any command to see its detailed help.
Selecting a Device
Most commands accept one of three mutually exclusive selectors:
--sn WG1KXXXXXXXXXXX # By serial number (recommended, most precise)
--address 192.168.1.100:50000 # By address: ip:port for UDP, /dev/ttyACM0 for USB
--handedness left # By handedness left/right (two-handed setups)
Without a device selector: ping / doctor handle all devices; get / set / sub / resources require a specific device and error out with candidate SNs listed.
Typical Workflow
wuji devices --json # 1. What devices are there
wuji ping --json # 2. Can they all connect (confirm SN/firmware/IP)
wuji resources --sn <SN> --json # 3. What params / topics are available
wuji get data_port --sn <SN> --json # 4. Read a parameter
wuji set data_port 50001 --sn <SN> # 5. Write a parameter (JSON value)
wuji sub tactile --sn <SN> --count 10 --jsonl # 6. Capture 10 tactile frames
Common Resources at a Glance
wuji resources --sn <SN> --json is the authoritative list; these are the high-frequency items:
- Common params (get/set):
hand_side,firmware_version,serial_number,ip_address,data_port - Common topics (sub):
tactile(tactile matrix),emf_poses(EMF poses),imu_data/palm(IMU),tip_poses(fingertip poses),hand_joint_angles(joint angles),hand_skeleton,tf
Recording Data to Files
--jsonl prints one frame per line, so a pipe is all you need for lightweight recording:
wuji sub tactile --count 500 --jsonl > data/tactile.jsonl # Silent recording
wuji sub emf_poses --count 500 --jsonl | tee data/emf.jsonl | jq # Record and watch
Common Errors and Handling
| Symptom | Meaning and handling |
|---|---|
found N devices: ... |
No device specified and multiple are on the bus; use --sn as prompted |
Session already exists (0x0013) |
Another process holds a direct session; with --sn or no target, the CLI falls back to Zenoh read-only automatically |
connected to wrong device: requested sn=X, got sn=Y |
Multiple devices share one address, or the scan entry is stale; rerun wuji devices to verify |
virtual parameter 'X' currently has no value |
The virtual param has no default and the stateless CLI doesn't persist writes; expected behavior |
set rejected (direct_only) |
Currently read-only through the Zenoh bridge; retry after the direct session holder releases the device |
set succeeds but wuji devices shows no change |
Network params such as ip_address/data_port take effect after a device reboot |
Most commands support --json, which gives agents more detailed, structured output.
Without --json, output is human-friendly, for example:
$ wuji devices
found 1 device(s)
┌──────────────────┬───────────┬──────────┬─────────────────────┬─────────────────────┐
│ SN ┆ Transport ┆ USB Port ┆ IP ┆ Address │
╞══════════════════╪═══════════╪══════════╪═════════════════════╪═════════════════════╡
│ WG1KXXXXXXXXXXX ┆ Udp ┆ - ┆ 192.168.1.100:50001 ┆ 192.168.1.100:50001 │
└──────────────────┴───────────┴──────────┴─────────────────────┴─────────────────────┘
💡 run `wuji ping` to get device type and firmware version
$ wuji devices --json
{
"devices": [
{
"sn": "WG1KXXXXXXXXXXX",
"transport": "Udp",
"usb_port": null,
"ip": "192.168.1.100:50001",
"address": "192.168.1.100:50001"
}
]
}
Device type and firmware version are not shown here: discovery is a broadcast scan without a handshake. Use wuji ping to get them.
Keeping the CLI and Skills Up to Date
wuji update --check --json # {"current": ..., "latest": ..., "update_available": true/false}
wuji update # Download, verify, and replace the binary in place
wuji update --skills # Sync Agent Skills to this CLI's companion version only
update --check always exits 0 when the check itself succeeds. Gate on the update_available JSON field instead of the exit code. A background check also runs at most once every 24 hours and prints a notice on stderr — it never blocks commands or touches stdout. Set WUJI_NO_UPDATE_CHECK=1 to disable it.
Agent Skills
wuji update and wuji update --skills keep the Wuji CLI Skills in ~/.agents/skills at or above the version that ships with your CLI. The report's skills.status field has three states:
| Status | Meaning |
|---|---|
up-to-date |
Installed Skills are at or above the CLI's companion version |
update-required |
Installed Skills are older, or their version isn't readable. Skills sync automatically after a successful binary upgrade, or run wuji update --skills |
not-installed |
No Wuji CLI Skills found. wuji update reports this state, and wuji update --skills installs them |
wuji update --skills syncs Skills without touching the binary, so you don't need a CLI upgrade to get Skills at the CLI's version or above. It exits 1 when Skills remain below that version after the sync, or when their version stays unreadable.
Stale Skill Directories
A Skill that was renamed or retired keeps its directory on disk after a sync, because the installer only writes files. After a sync the CLI lists those directories, warns on stderr, and asks before moving them out of ~/.agents/skills. Moved directories stay in a temp directory, and the report lists each one with its new path and "action": "moved". Nothing gets deleted.
In JSON output those directories appear under stale_skills — the field is omitted when there are none. Each entry has name, action (moved, kept, or failed), and, when it applies, version, path, and error.
Pass --yes to skip the question, as wuji update --yes or wuji update --skills --yes. A run without a terminal reports the stale directories and leaves them in place unless you also pass --yes. With --yes the directories move out whether or not a terminal is present, so an automated run that passes the flag modifies ~/.agents/skills.
wuji update --skills --json # Report stale directories without moving them (no --yes)
wuji update --skills --yes # Move them out without asking, with or without a terminal
wuji update --check never moves directories.
Install Shell Completions (Optional)
# bash example; for other shells (zsh/fish/powershell/elvish), see wuji completions --help
mkdir -p ~/.local/share/bash-completion/completions
wuji completions bash > ~/.local/share/bash-completion/completions/wuji
exec bash # Takes effect in the current session