diff --git a/dimos/robot/cli/README.md b/dimos/robot/cli/README.md index 57c23cc426..a8ceb37ba4 100644 --- a/dimos/robot/cli/README.md +++ b/dimos/robot/cli/README.md @@ -5,19 +5,19 @@ To avoid having so many runfiles, I created a common script to run any blueprint For example, to run the standard Unitree Go2 blueprint run: ```bash -dimos-robot run unitree-go2 +dimos run unitree-go2 ``` For the one with agents run: ```bash -dimos-robot run unitree-go2-agentic +dimos run unitree-go2-agentic ``` You can dynamically connect additional modules. For example: ```bash -dimos-robot run unitree-go2 --extra-module llm_agent --extra-module human_input --extra-module navigation_skill +dimos run unitree-go2 --extra-module llm_agent --extra-module human_input --extra-module navigation_skill ``` ## Definitions @@ -61,5 +61,5 @@ For environment variables/`.env` values, you have to prefix the name with `DIMOS For the command line, you call it like this: ```bash -dimos-robot --simulation run unitree-go2 +dimos --simulation run unitree-go2 ``` diff --git a/dimos/robot/cli/dimos_robot.py b/dimos/robot/cli/dimos.py similarity index 76% rename from dimos/robot/cli/dimos_robot.py rename to dimos/robot/cli/dimos.py index 6b7e19d725..5d08f3036a 100644 --- a/dimos/robot/cli/dimos_robot.py +++ b/dimos/robot/cli/dimos.py @@ -14,6 +14,7 @@ from enum import Enum import inspect +import sys from typing import Optional, get_args, get_origin import typer @@ -25,7 +26,10 @@ RobotType = Enum("RobotType", {key.replace("-", "_").upper(): key for key in all_blueprints.keys()}) -main = typer.Typer() +main = typer.Typer( + help="Dimensional CLI", + no_args_is_help=True, +) def create_dynamic_callback(): @@ -103,7 +107,7 @@ def run( [], "--extra-module", help="Extra modules to add to the blueprint" ), ) -> None: - """Run the robot with the specified configuration.""" + """Start a robot blueprint""" config: GlobalConfig = ctx.obj pubsub.lcm.autoconf() blueprint = get_blueprint_by_name(robot_type.value) @@ -118,7 +122,7 @@ def run( @main.command() def show_config(ctx: typer.Context) -> None: - """Show current configuration status.""" + """Show current config settings and their values.""" config: GlobalConfig = ctx.obj for field_name, value in config.model_dump().items(): @@ -133,5 +137,41 @@ def list() -> None: typer.echo(blueprint_name) +@main.command(context_settings={"allow_extra_args": True, "ignore_unknown_options": True}) +def lcmspy(ctx: typer.Context) -> None: + """LCM spy tool for monitoring LCM messages.""" + from dimos.utils.cli.lcmspy.run_lcmspy import main as lcmspy_main + + sys.argv = ["lcmspy", *ctx.args] + lcmspy_main() + + +@main.command(context_settings={"allow_extra_args": True, "ignore_unknown_options": True}) +def skillspy(ctx: typer.Context) -> None: + """Skills spy tool for monitoring skills.""" + from dimos.utils.cli.skillspy.skillspy import main as skillspy_main + + sys.argv = ["skillspy", *ctx.args] + skillspy_main() + + +@main.command(context_settings={"allow_extra_args": True, "ignore_unknown_options": True}) +def agentspy(ctx: typer.Context) -> None: + """Agent spy tool for monitoring agents.""" + from dimos.utils.cli.agentspy.agentspy import main as agentspy_main + + sys.argv = ["agentspy", *ctx.args] + agentspy_main() + + +@main.command(context_settings={"allow_extra_args": True, "ignore_unknown_options": True}) +def humancli(ctx: typer.Context) -> None: + """Interface interacting with agents.""" + from dimos.utils.cli.human.humanclianim import main as humancli_main + + sys.argv = ["humancli", *ctx.args] + humancli_main() + + if __name__ == "__main__": main() diff --git a/dimos/robot/cli/test_dimos_robot_e2e.py b/dimos/robot/cli/test_dimos_robot_e2e.py index 72e638abc8..8ae93b4814 100644 --- a/dimos/robot/cli/test_dimos_robot_e2e.py +++ b/dimos/robot/cli/test_dimos_robot_e2e.py @@ -71,7 +71,7 @@ def __init__(self) -> None: def start(self): self.process = subprocess.Popen( - ["dimos-robot", "run", "demo-skill"], + ["dimos", "run", "demo-skill"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) diff --git a/docker/navigation/README.md b/docker/navigation/README.md index 10e7999164..c1d1eba40f 100644 --- a/docker/navigation/README.md +++ b/docker/navigation/README.md @@ -143,8 +143,8 @@ In the container to run the full navigation stack you must run both the dimensio For the Unitree G1 ```bash -dimos-robot run unitree-g1 -ROBOT_IP=XX.X.X.XXX dimos-robot run unitree-g1 # If ROBOT_IP env variable is not set in .env +dimos run unitree-g1 +ROBOT_IP=XX.X.X.XXX dimos run unitree-g1 # If ROBOT_IP env variable is not set in .env ``` #### Navigation Stack diff --git a/pyproject.toml b/pyproject.toml index 1f59af27dd..1631baed36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,7 +120,7 @@ foxglove-bridge = "dimos.utils.cli.foxglove_bridge.run_foxglove_bridge:main" skillspy = "dimos.utils.cli.skillspy.skillspy:main" agentspy = "dimos.utils.cli.agentspy.agentspy:main" humancli = "dimos.utils.cli.human.humanclianim:main" -dimos-robot = "dimos.robot.cli.dimos_robot:main" +dimos = "dimos.robot.cli.dimos:main" [project.optional-dependencies] manipulation = [