mcpField
W
wuji-cli-base

wuji-cli-base

github.com/wuji-technologyOther5205 installsUpdated 3d ago
Repository

About wuji-cli-base

wuji-cli-base is an Agent Skill for operating Wuji devices through the `wuji` CLI. It covers device discovery, parameter and live-data access, diagnostics, calibration, firmware updates, and structured output for scripts and agents.

Key features

  1. 01Scan and probe devices
  2. 02Read and write device parameters
  3. 03Subscribe to real-time data
  4. 04Run diagnostics and calibration
  5. 05Update firmware and CLI skills
  6. 06Output JSON and JSONL

Use cases

  1. 01Inspect connected devices and firmware
  2. 02Read or change device settings
  3. 03Record tactile or motion data
  4. 04Check device health and calibrate models

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/wuji-technology/wuji-cli --skill wuji-cli-base

After installing, type/wuji-cli-basein Claude Code to confirm it loaded.

Details

From the project README

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 (ping failing on any device or doctor reporting a Fail both exit 1), directly usable in scripts.

Command Overview

CommandPurpose
wuji devicesScan and list devices (USB/UDP)
wuji pingHandshake probe; reports SN/firmware/IP (probes all devices by default)
wuji resourcesList 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-modelHand model calibration (see the wuji-cli-calib skill)
wuji calib tactileTactile contact-model calibration (see the wuji-cli-calib skill)
wuji doctorDevice health self-check (see the wuji-cli-doctor skill)
wuji upgradeFirmware update check and upgrade (see the wuji-cli-upgrade skill)
wuji userManage SDK users and export/import calibration data (see the wuji-cli-user skill)
wuji updateUpdate 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 — capabilities vary by device, and the GET/SET columns in wuji resources --sn <SN> are authoritative
  • 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

SymptomMeaning 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=YMultiple devices share one address, or the scan entry is stale; rerun wuji devices to verify
virtual parameter 'X' currently has no valueThe virtual param has no default and the stateless CLI doesn't persist writes; expected behavior
'X' does not support set. Supported operations: getThe resource doesn't support that operation, so the CLI sends nothing to the device and exits with code 1. Check the resource's GET, SET, or SUB column in wuji resources --sn <SN>. With --json or --jsonl, the error also carries kind: "unsupported_operation", path, operation, device, and capabilities
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 changeNetwork 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.

Checking the Exact Version
wuji --version          # Two lines: short commit and version
wuji --version --long   # Four lines: full commit, version, build target, profile
wuji --version --json   # {"version", "commit" (full sha or "unknown"), "target", "profile"}

The --long output is stable line-oriented text for scripts: each line is key: value, in the order commit, version, target, profile. The commit is the 40-character sha the binary was built from, or unknown for builds outside a Git checkout.

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:

StatusMeaning
up-to-dateInstalled Skills are at or above the CLI's companion version
update-requiredInstalled Skills are older, or their version isn't readable. Skills sync automatically after a successful binary upgrade, or run wuji update --skills
not-installedNo 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

Comments

Markdown supported