microduck-cli
Agent-agnostic CLI for controlling the MicroDuck robot. Any agent, any human, one CLI. Built on the neurosymbolic-system runtime and following the reachy-mini-cli architecture.
What ships today
The agent-first introspection CLI (whoami, learn, explain, overview,
doctor, cli overview) plus four domain nouns with real action verbs, all
exercised against pollen-robotics/microduck's
own simulator and fake daemon:
| Noun | Verbs |
|---|---|
env |
overview, doctor, up, down, status, hosts — bring up / doctor / tear down the simulator (duck-body + robotd --sim) or a fake robotd --fake stand-in. |
duck |
overview, health, version, monitor, init, relax, enable, do, mode, look, stop, move, quack, configure, record — operate one duck directly, in robotctl's own words. |
policy |
overview, list, load, reset, add, remove, search, check, update, pad bindings/bind/reset, smoke, train, play, export, publish, infer, install — the policy lifecycle plus the microduck_rl train/smoke/export/publish/infer lane. |
rules |
overview, list, check, engine overview/run/start/stop/status, intent — the data-only rules layer and the one 50 Hz tick engine that evaluates it. |
Sim-first, and it stays that way until t23 verifies on real hardware: no
physical MicroDuck has been driven from this CLI yet. Every verb above is
built and tested against robotd --fake/--sim and the in-process fake
daemon (tests/fake_robotd.py) — see
docs/operating-the-duck.md for the six-command
walkthrough and docs/upstream-pins.md for the
exact upstream commits this CLI is validated against.
Approved deviation d1 — policy's robot.policies / robot.loadPolicy /
robot.setSkill channel needs a daemon reporting API >= 18
(pollen-robotics/microduck main); the pinned sim-remote-io build answers
API 16 and has no policy channel at all, so those verbs report that plainly
and fall back to robot.subscribe where they can (see policy module
docstring for the full d1 note).
The neurosymbolic-system runtime this CLI is meant to import (senses,
rules, arbitration and motion composed onto one 50 Hz tick) is itself still a
bare scaffold, so it is not a dependency of this package yet — the tick
engine lives in microduck_cli/behavior/ in the meantime, written behind the
seams the eventual extraction needs (see CLAUDE.md).
What you get
- An agent-first CLI cited from teken
(
afi-cli) — the runtime package has zero third-party runtime dependencies (dependencies = []);teken, pytest and the lint stack are dev-only. - A mesh identity —
culture.yaml(suffix+backend) and the matching prompt file (AGENTS.colleague.mdfor this agent'sbackend: colleague). - The vendored guildmaster skill kit under
.claude/skills/, cite-don't-import. Seedocs/skill-sources.md. - A build + deploy baseline — pytest, lint, the agent-first rubric gate, and PyPI Trusted Publishing wired into GitHub Actions.
Quickstart
Both console scripts install — microduck (short) and microduck-cli
(the distribution name, and the prog name the CLI prints in its own output).
They are the same entry point, so either works everywhere below:
uv sync
uv run pytest -n auto # run the test suite
uv run microduck whoami # identity from culture.yaml
uv run microduck learn # self-teaching prompt (add --json)
uv run teken cli doctor . --strict # the agent-first rubric gate CI runs
Try it in simulation
No physical duck required — this brings up robotd --fake and walks it
through a rules-engine tick. See
docs/operating-the-duck.md for the full
walkthrough (each command's exact output, and what to do when a check fails).
uv run microduck env doctor # is this box ready? (clones, cargo, port, venv)
uv run microduck env up --fake # bring up robotd --fake and wait for healthy
uv run microduck duck health # ask the fake robot's own verdict on itself
uv run microduck rules engine run --max-ticks 50 --apply # run the tick engine briefly
uv run microduck rules intent stop # inject one intent through the ONE registry
uv run microduck env down # tear the stack back down
Every command supports --json. Results go to stdout, errors/diagnostics to
stderr (never mixed). Exit codes: 0 success, 1 user error, 2 environment
error, 3+ reserved.
Sibling projects
microduck-cli is built by composing three siblings rather than inventing a fourth architecture:
| Repo | Role here |
|---|---|
neurosymbolic-system |
The robot runtime to import once it ships — never re-implement the tick loop in this repo. |
reachy-mini-cli |
The architecture to follow: noun groups, one tick seam for all senses, the single-SDK-owner model. |
arm101-cli |
The hardware-safety patterns: gated motion (--apply / dry-run / TTY confirm), release-on-abnormal-exit, hardware deps behind an extra. |
Contributing
See CLAUDE.md for the full conventions: the CLI contracts, what
to take from each sibling, version-bump-every-PR, the cicd PR lane, worktree
layout, and memory discipline.
License
Apache 2.0 — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file microduck_cli-0.9.2.tar.gz.
File metadata
- Download URL: microduck_cli-0.9.2.tar.gz
- Upload date:
- Size: 632.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75661fa21ac065782aefb0502b0c4f83c92d8c2c1f8235c5e45ddfd163a136ed
|
|
| MD5 |
9812234b13d3054966e7538216b331b3
|
|
| BLAKE2b-256 |
4304dea1da7d29c0c71c07bdcd353f6314c102b899701aae8d654d481e72c67c
|
File details
Details for the file microduck_cli-0.9.2-py3-none-any.whl.
File metadata
- Download URL: microduck_cli-0.9.2-py3-none-any.whl
- Upload date:
- Size: 249.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8d4341e70a9fb0659d5f2604c7bacb0d2cc6badd2df7f42ae52ac23386b45bf
|
|
| MD5 |
5c8062e0bfe8098cecc6979a9c9ede80
|
|
| BLAKE2b-256 |
bf24a586e2478fcf86485928b8ce555bed3ec98b16cf4445001bbbd48fc8bf28
|