@@ -36,7 +36,9 @@ def _load_target_modules() -> List[ModuleSpec]:
3636 # Import in dependency order: models -> utils -> z_visual -> services -> workspace -> others
3737 # This ensures dependencies are available when needed
3838 # Note: services depends on z_visual, so z_visual must come before services
39- dependency_order = ["models" , "utils" , "z_visual" , "services" , "workspace" , "ui_kivy" , "ui_streamlit" ]
39+ # Skip ui_kivy in CI environments where X server is not available
40+ # It will be handled gracefully by the import error handling below
41+ dependency_order = ["models" , "utils" , "z_visual" , "services" , "workspace" , "ui_streamlit" , "ui_kivy" ]
4042
4143 # Helper to create a stub module
4244 def _create_stub_module (module_name ):
@@ -76,8 +78,9 @@ def __getattr__(self, attr):
7678 mod = importlib .import_module (f"module.{ name } " )
7779 # Immediately set up alias so 'from X import ...' works in other modules
7880 sys .modules [name ] = mod
79- except Exception as e1 :
81+ except ( ImportError , ModuleNotFoundError , OSError ) as e1 :
8082 # Store the first error - this is more likely to have the real dependency issue
83+ # OSError catches kivy initialization failures (X server, libmtdev, etc.)
8184 first_error = e1
8285 error = first_error # Set error in case both imports fail
8386
0 commit comments