Skip to content

Split tests off of self hosted runner#1901

Open
Dreamsorcerer wants to merge 108 commits intomainfrom
sam/split-tests
Open

Split tests off of self hosted runner#1901
Dreamsorcerer wants to merge 108 commits intomainfrom
sam/split-tests

Conversation

@Dreamsorcerer
Copy link
Copy Markdown
Collaborator

@Dreamsorcerer Dreamsorcerer commented Apr 22, 2026

This splits linting and tests into separate jobs on standard GH runners.
Only the tests that need ROS, LFS or something similar are now run on self-hosted runner.

This speeds up the CI significantly (GH runner tests also get to use xdist to parallelise the tests).
This also allows external PRs to be tested and merged normally, with just the self-hosted tests being skipped.
Also some security improvements and improving maintainability of the code.

@Dreamsorcerer Dreamsorcerer changed the base branch from main to dev April 22, 2026 15:24
Comment thread .github/workflows/ci.yml Outdated
Comment thread dimos/models/vl/test_base.py Outdated
Dreamsorcerer and others added 4 commits May 7, 2026 15:29
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented May 7, 2026

❌ 6 Tests Failed:

Tests completed Failed Passed Skipped
1690 6 1684 25
View the top 3 failed test(s) by shortest run time
dimos.robot.test_all_blueprints::test_old_self_hosted_blueprints
Stack Traces | 0.001s run time
def test_old_self_hosted_blueprints() -> None:
        """Validate no non-existent name in SELF_HOSTED_BLUEPRINTS."""
>       assert not SELF_HOSTED_BLUEPRINTS - set(all_blueprints)
E       TypeError: unsupported operand type(s) for -: 'list' and 'set'


dimos/robot/test_all_blueprints.py:90: TypeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-mock]
Stack Traces | 0.007s run time
blueprint_name = 'coordinator-mock'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'coordinator-mock'

dimos/robot/test_all_blueprints.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:73: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-mock'
        message    = 'Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_mock'
        module_path = 'dimos.control.blueprints.basic'
        name       = 'coordinator-mock'
.../control/blueprints/basic.py:89: in <module>
    *_mujoco_if_sim(str(XARM7_SIM_PATH), _xarm7_cfg.dof),
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        PIPER_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb19e50>
        XARM6_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb18450>
        XARM7_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
        __doc__    = 'Single-arm coordinator blueprints with trajectory control.\n\nEach arm blueprint switches between real hardware and M...ator-piper                   # Piper real (CAN)\n    dimos --simulation run coordinator-piper      # Piper in MuJoCo\n'
        __file__   = '/home/runner/work/dimos/dimos/.../control/blueprints/basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c6f5b20>
        __name__   = 'dimos.control.blueprints.basic'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c6f5b20>, origin='/home/runner/work/dimos/dimos/.../control/blueprints/basic.py')
        _catalog_piper = <function piper at 0x7f1a0c620b80>
        _catalog_xarm6 = <function xarm6 at 0x7f1a0c622160>
        _catalog_xarm7 = <function xarm7 at 0x7f1a0c623380>
        _is_sim    = False
        _mock_cfg  = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c8ec5f0>
        _mujoco_if_sim = <function _mujoco_if_sim at 0x7f1a0c6979c0>
        _xarm7_cfg = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c8ec780>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x7f1b20f31760>
        coordinator_basic = Blueprint(blueprints=(BlueprintAtom(kwargs={'tick_rate': 100.0, 'publish_joint_state': True, 'joint_state_frame_id': '...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_mock = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, simulation=False, replay=Fals..._speed=None, mcp_port=23617, dtop=False, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1')
dimos/utils/data.py:324: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:302: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:259: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:186: in _pull_lfs_archive
    _check_git_lfs_available()
        filename   = 'xarm7'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _check_git_lfs_available() -> bool:
        missing = []
    
        # Check if git is available
        try:
            subprocess.run(["git", "--version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git")
    
        # Check if git-lfs is available
        try:
            subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git-lfs")
    
        if missing:
>           raise RuntimeError(
                f"Missing required tools: {', '.join(missing)}.\n\n"
                "Git LFS installation instructions: https://git-lfs.github.io/"
            )
E           RuntimeError: Missing required tools: git-lfs.
E           
E           Git LFS installation instructions: https://git-lfs.github.io/

missing    = ['git-lfs']

dimos/utils/data.py:135: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-piper]
Stack Traces | 0.007s run time
blueprint_name = 'coordinator-piper'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'coordinator-piper'

dimos/robot/test_all_blueprints.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:73: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-piper'
        message    = 'Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_piper'
        module_path = 'dimos.control.blueprints.basic'
        name       = 'coordinator-piper'
.../control/blueprints/basic.py:89: in <module>
    *_mujoco_if_sim(str(XARM7_SIM_PATH), _xarm7_cfg.dof),
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        PIPER_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb19e50>
        XARM6_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb18450>
        XARM7_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
        __doc__    = 'Single-arm coordinator blueprints with trajectory control.\n\nEach arm blueprint switches between real hardware and M...ator-piper                   # Piper real (CAN)\n    dimos --simulation run coordinator-piper      # Piper in MuJoCo\n'
        __file__   = '/home/runner/work/dimos/dimos/.../control/blueprints/basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5a6de0>
        __name__   = 'dimos.control.blueprints.basic'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5a6de0>, origin='/home/runner/work/dimos/dimos/.../control/blueprints/basic.py')
        _catalog_piper = <function piper at 0x7f1a0c620b80>
        _catalog_xarm6 = <function xarm6 at 0x7f1a0c622160>
        _catalog_xarm7 = <function xarm7 at 0x7f1a0c623380>
        _is_sim    = False
        _mock_cfg  = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0bce1810>
        _mujoco_if_sim = <function _mujoco_if_sim at 0x7f1a0bcdc680>
        _xarm7_cfg = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0bce19a0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x7f1b20f31760>
        coordinator_basic = Blueprint(blueprints=(BlueprintAtom(kwargs={'tick_rate': 100.0, 'publish_joint_state': True, 'joint_state_frame_id': '...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_mock = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, simulation=False, replay=Fals..._speed=None, mcp_port=23617, dtop=False, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1')
dimos/utils/data.py:324: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:302: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:259: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:186: in _pull_lfs_archive
    _check_git_lfs_available()
        filename   = 'xarm7'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _check_git_lfs_available() -> bool:
        missing = []
    
        # Check if git is available
        try:
            subprocess.run(["git", "--version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git")
    
        # Check if git-lfs is available
        try:
            subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git-lfs")
    
        if missing:
>           raise RuntimeError(
                f"Missing required tools: {', '.join(missing)}.\n\n"
                "Git LFS installation instructions: https://git-lfs.github.io/"
            )
E           RuntimeError: Missing required tools: git-lfs.
E           
E           Git LFS installation instructions: https://git-lfs.github.io/

missing    = ['git-lfs']

dimos/utils/data.py:135: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-xarm7]
Stack Traces | 0.01s run time
blueprint_name = 'coordinator-xarm7'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'coordinator-xarm7'

dimos/robot/test_all_blueprints.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:73: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-xarm7'
        message    = 'Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_xarm7'
        module_path = 'dimos.control.blueprints.basic'
        name       = 'coordinator-xarm7'
.../control/blueprints/basic.py:89: in <module>
    *_mujoco_if_sim(str(XARM7_SIM_PATH), _xarm7_cfg.dof),
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        PIPER_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb19e50>
        XARM6_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb18450>
        XARM7_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
        __doc__    = 'Single-arm coordinator blueprints with trajectory control.\n\nEach arm blueprint switches between real hardware and M...ator-piper                   # Piper real (CAN)\n    dimos --simulation run coordinator-piper      # Piper in MuJoCo\n'
        __file__   = '/home/runner/work/dimos/dimos/.../control/blueprints/basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5cc6e0>
        __name__   = 'dimos.control.blueprints.basic'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5cc6e0>, origin='/home/runner/work/dimos/dimos/.../control/blueprints/basic.py')
        _catalog_piper = <function piper at 0x7f1a0c620b80>
        _catalog_xarm6 = <function xarm6 at 0x7f1a0c622160>
        _catalog_xarm7 = <function xarm7 at 0x7f1a0c623380>
        _is_sim    = False
        _mock_cfg  = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c950910>
        _mujoco_if_sim = <function _mujoco_if_sim at 0x7f1a0bcdf100>
        _xarm7_cfg = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c950af0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x7f1b20f31760>
        coordinator_basic = Blueprint(blueprints=(BlueprintAtom(kwargs={'tick_rate': 100.0, 'publish_joint_state': True, 'joint_state_frame_id': '...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_mock = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, simulation=False, replay=Fals..._speed=None, mcp_port=23617, dtop=False, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1')
dimos/utils/data.py:324: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:302: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:259: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:186: in _pull_lfs_archive
    _check_git_lfs_available()
        filename   = 'xarm7'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _check_git_lfs_available() -> bool:
        missing = []
    
        # Check if git is available
        try:
            subprocess.run(["git", "--version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git")
    
        # Check if git-lfs is available
        try:
            subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git-lfs")
    
        if missing:
>           raise RuntimeError(
                f"Missing required tools: {', '.join(missing)}.\n\n"
                "Git LFS installation instructions: https://git-lfs.github.io/"
            )
E           RuntimeError: Missing required tools: git-lfs.
E           
E           Git LFS installation instructions: https://git-lfs.github.io/

missing    = ['git-lfs']

dimos/utils/data.py:135: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-xarm6]
Stack Traces | 0.011s run time
blueprint_name = 'coordinator-xarm6'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'coordinator-xarm6'

dimos/robot/test_all_blueprints.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:73: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-xarm6'
        message    = 'Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_xarm6'
        module_path = 'dimos.control.blueprints.basic'
        name       = 'coordinator-xarm6'
.../control/blueprints/basic.py:89: in <module>
    *_mujoco_if_sim(str(XARM7_SIM_PATH), _xarm7_cfg.dof),
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        PIPER_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb19e50>
        XARM6_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb18450>
        XARM7_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
        __doc__    = 'Single-arm coordinator blueprints with trajectory control.\n\nEach arm blueprint switches between real hardware and M...ator-piper                   # Piper real (CAN)\n    dimos --simulation run coordinator-piper      # Piper in MuJoCo\n'
        __file__   = '/home/runner/work/dimos/dimos/.../control/blueprints/basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5b9df0>
        __name__   = 'dimos.control.blueprints.basic'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c5b9df0>, origin='/home/runner/work/dimos/dimos/.../control/blueprints/basic.py')
        _catalog_piper = <function piper at 0x7f1a0c620b80>
        _catalog_xarm6 = <function xarm6 at 0x7f1a0c622160>
        _catalog_xarm7 = <function xarm7 at 0x7f1a0c623380>
        _is_sim    = False
        _mock_cfg  = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0bce33e0>
        _mujoco_if_sim = <function _mujoco_if_sim at 0x7f1a0bcde7a0>
        _xarm7_cfg = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0bce3610>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x7f1b20f31760>
        coordinator_basic = Blueprint(blueprints=(BlueprintAtom(kwargs={'tick_rate': 100.0, 'publish_joint_state': True, 'joint_state_frame_id': '...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_mock = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, simulation=False, replay=Fals..._speed=None, mcp_port=23617, dtop=False, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1')
dimos/utils/data.py:324: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:302: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:259: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:186: in _pull_lfs_archive
    _check_git_lfs_available()
        filename   = 'xarm7'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _check_git_lfs_available() -> bool:
        missing = []
    
        # Check if git is available
        try:
            subprocess.run(["git", "--version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git")
    
        # Check if git-lfs is available
        try:
            subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git-lfs")
    
        if missing:
>           raise RuntimeError(
                f"Missing required tools: {', '.join(missing)}.\n\n"
                "Git LFS installation instructions: https://git-lfs.github.io/"
            )
E           RuntimeError: Missing required tools: git-lfs.
E           
E           Git LFS installation instructions: https://git-lfs.github.io/

missing    = ['git-lfs']

dimos/utils/data.py:135: RuntimeError
dimos.robot.test_all_blueprints::test_blueprint_is_valid[coordinator-basic]
Stack Traces | 0.091s run time
blueprint_name = 'coordinator-basic'

    @pytest.mark.parametrize("blueprint_name", UBUNTU_BLUEPRINTS)
    def test_blueprint_is_valid(blueprint_name: str) -> None:
        """Validate blueprints that should import on the ubuntu-latest runner."""
>       _check_blueprint(blueprint_name)

blueprint_name = 'coordinator-basic'

dimos/robot/test_all_blueprints.py:96: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/robot/test_all_blueprints.py:73: in _check_blueprint
    blueprint = get_blueprint_by_name(blueprint_name)
        blueprint_name = 'coordinator-basic'
        message    = 'Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/'
dimos/robot/get_all_blueprints.py:47: in get_blueprint_by_name
    module = __import__(module_path, fromlist=[attr])
        attr       = 'coordinator_basic'
        module_path = 'dimos.control.blueprints.basic'
        name       = 'coordinator-basic'
.../control/blueprints/basic.py:89: in <module>
    *_mujoco_if_sim(str(XARM7_SIM_PATH), _xarm7_cfg.dof),
        Blueprint  = <class 'dimos.core.coordination.blueprints.Blueprint'>
        ControlCoordinator = <class 'dimos.control.coordinator.ControlCoordinator'>
        JointState = <class 'dimos.msgs.sensor_msgs.JointState.JointState'>
        LCMTransport = <class 'dimos.core.transport.LCMTransport'>
        MujocoSimModule = <class 'dimos.simulation.engines.mujoco_sim_module.MujocoSimModule'>
        PIPER_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb19e50>
        XARM6_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb18450>
        XARM7_SIM_PATH = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
        __builtins__ = <builtins>
        __cached__ = '.../blueprints/__pycache__/basic.cpython-312.pyc'
        __doc__    = 'Single-arm coordinator blueprints with trajectory control.\n\nEach arm blueprint switches between real hardware and M...ator-piper                   # Piper real (CAN)\n    dimos --simulation run coordinator-piper      # Piper in MuJoCo\n'
        __file__   = '/home/runner/work/dimos/dimos/.../control/blueprints/basic.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c6f3fb0>
        __name__   = 'dimos.control.blueprints.basic'
        __package__ = 'dimos.control.blueprints'
        __spec__   = ModuleSpec(name='dimos.control.blueprints.basic', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f1a0c6f3fb0>, origin='/home/runner/work/dimos/dimos/.../control/blueprints/basic.py')
        _catalog_piper = <function piper at 0x7f1a0c620b80>
        _catalog_xarm6 = <function xarm6 at 0x7f1a0c622160>
        _catalog_xarm7 = <function xarm7 at 0x7f1a0c623380>
        _is_sim    = False
        _mock_cfg  = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c651a90>
        _mujoco_if_sim = <function _mujoco_if_sim at 0x7f1a0c620ae0>
        _xarm7_cfg = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] RobotConfig object at 0x7f1a0c651fe0>
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        autoconnect = <function autoconnect at 0x7f1b20f31760>
        coordinator_basic = Blueprint(blueprints=(BlueprintAtom(kwargs={'tick_rate': 100.0, 'publish_joint_state': True, 'joint_state_frame_id': '...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        coordinator_mock = Blueprint(blueprints=(BlueprintAtom(kwargs={'hardware': [HardwareComponent(hardware_id='arm', hardware_type=<HardwareT...lobal_config_overrides=mappingproxy({}), remapping_map=mappingproxy({}), requirement_checks=(), configurator_checks=())
        global_config = GlobalConfig(robot_ip=None, robot_ips=None, xarm7_ip=None, xarm6_ip=None, can_port=None, simulation=False, replay=Fals..._speed=None, mcp_port=23617, dtop=False, obstacle_avoidance=True, detection_model='moondream', listen_host='127.0.0.1')
dimos/utils/data.py:324: in __str__
    return str(self._ensure_downloaded())
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:302: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'xarm7/scene.xml'
        self       = <[RuntimeError('Missing required tools: git-lfs.\n\nGit LFS installation instructions: https://git-lfs.github.io/') raised in repr()] LfsPath object at 0x7f1a0cb1b9d0>
dimos/utils/data.py:259: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'xarm7'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/xarm7/scene.xml')
        name       = 'xarm7/scene.xml'
        nested_path = PosixPath('scene.xml')
        path_parts = ('xarm7', 'scene.xml')
dimos/utils/data.py:186: in _pull_lfs_archive
    _check_git_lfs_available()
        filename   = 'xarm7'
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    def _check_git_lfs_available() -> bool:
        missing = []
    
        # Check if git is available
        try:
            subprocess.run(["git", "--version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git")
    
        # Check if git-lfs is available
        try:
            subprocess.run(["git-lfs", "version"], capture_output=True, check=True, text=True)
        except (subprocess.CalledProcessError, FileNotFoundError):
            missing.append("git-lfs")
    
        if missing:
>           raise RuntimeError(
                f"Missing required tools: {', '.join(missing)}.\n\n"
                "Git LFS installation instructions: https://git-lfs.github.io/"
            )
E           RuntimeError: Missing required tools: git-lfs.
E           
E           Git LFS installation instructions: https://git-lfs.github.io/

missing    = ['git-lfs']

dimos/utils/data.py:135: RuntimeError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

Comment thread dimos/agents/mcp/mcp_client.py Outdated
Comment thread pyproject.toml Outdated
Comment thread pyproject.toml Outdated
@Dreamsorcerer
Copy link
Copy Markdown
Collaborator Author

@copilot resolve the merge conflicts in this pull request

Copy link
Copy Markdown

Copilot AI commented May 8, 2026

@copilot resolve the merge conflicts in this pull request

Resolved on the branch in 72efa9e. I merged the latest dev, fixed the uv.lock conflict, and pushed the updated branch; CodeQL is clean on the current head.

@Dreamsorcerer Dreamsorcerer changed the base branch from dev to main May 9, 2026 01:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants