"""ComfyUI-AusBoss entry point. Every node lives in its own file under nodes/ and exports its own NODE_CLASS_MAPPINGS / NODE_DISPLAY_NAME_MAPPINGS. This file merges them and hands the result to ComfyUI. To register a new node, add its module name to NODE_MODULES below — nothing else to wire up. A module that fails to import is skipped with a console warning instead of taking the whole pack down, so one broken node never hides the rest. """ import importlib import os import re import traceback # One entry per file in nodes/, kept alphabetical. The order has no # functional effect. NODE_MODULES = [ "node_align_image", "node_batch_utils", "node_callout", "node_color_match", "node_compare", "node_frame_interpolate", "node_free_memory", "node_h3_prompt_writer", "node_image_crop_rotate_pad", "node_image_folder", "node_image_resize", "node_image_size", "node_inpaint_crop_stitch", "node_krea2_encode", "node_krea2_model_patch", "node_lama_inpaint", "node_layout_boxes", "node_literals", "node_load_image_pad", "node_load_audio", "node_load_video", "node_lora_loader", "node_mask_by_name", "node_mask_by_touch", "node_math", "node_realign_to_source", "node_refine_mask", "node_resolution", "node_run_timer", "node_save_image", "node_save_video", "node_seed", "node_select_frame", "node_show_text", "node_step_preview", "node_tiled_upscale", "node_video_crop_rotate_pad", "node_video_crop_rotate_pad_clip", "node_workflow_note", "node_workflow_switches", ] NODE_CLASS_MAPPINGS = {} NODE_DISPLAY_NAME_MAPPINGS = {} _failed_modules = [] for _module_name in NODE_MODULES: try: _module = importlib.import_module(f".nodes.{_module_name}", __name__) NODE_CLASS_MAPPINGS.update(getattr(_module, "NODE_CLASS_MAPPINGS", {})) NODE_DISPLAY_NAME_MAPPINGS.update( getattr(_module, "NODE_DISPLAY_NAME_MAPPINGS", {}) ) except Exception: _failed_modules.append(_module_name) traceback.print_exc() # Folder ComfyUI serves to the browser; every .js file in it is loaded as a # frontend extension. Shared modules use .mjs so they are import-only. WEB_DIRECTORY = "./js" __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] def _read_version(): """Version straight from pyproject.toml so it is never duplicated.""" try: pyproject = os.path.join(os.path.dirname(__file__), "pyproject.toml") with open(pyproject, "r", encoding="utf-8") as f: match = re.search(r'^version\s*=\s*"([^"]+)"', f.read(), re.MULTILINE) return match.group(1) if match else "unknown" except Exception: return "unknown" def _print_banner(): # ASCII only in here: ComfyUI on Windows often runs with a cp1252 # console, and a UnicodeEncodeError at import time kills the whole pack. teal = "\033[38;2;0;180;170m" grey = "\033[0;37m" red = "\033[0;31m" reset = "\033[0m" bar = f"{teal}{'-' * 70}{reset}" print(bar) print( f" {teal}AusBoss{reset} v{_read_version()} | " f"{len(NODE_CLASS_MAPPINGS)} nodes loaded" ) if _failed_modules: print(f" {red}Failed to load: {', '.join(_failed_modules)}{reset}") print(f" {grey}https://github.com/ausboss/ComfyUI-AusBoss{reset}") print(bar) try: from .nodes._frontend_cache import register_frontend_cache_guard register_frontend_cache_guard() except Exception: traceback.print_exc() _print_banner()