From 51b44b6e3fa15b4b5e7a31deb488529c3275f151 Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Wed, 29 Apr 2026 21:38:50 -0400 Subject: [PATCH] fix(skills/comfyui): correct hallucinated node names and registry slugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-review caught several errors in the previous commit: Frontmatter - Replace non-standard `requires_runtime` / `requires_tooling` fields with the documented `compatibility:` field (parsed by tools/skills_tool.py). - Drop the `audit-v5` author tag I added unnecessarily. MODEL_LOADERS catalog - Remove `IPAdapterUnifiedLoader` (input `preset` is an enum, not a file). - Remove `IPAdapterInsightFaceLoader` and `InsightFaceLoader` (input `provider` is a GPU backend selector, not a model file). These would have flagged enum values like "STANDARD" or "CUDA" as missing model files. - Add "NB:" comment explaining `BasicGuider` has no `cfg` input (the original PARAM_PATTERNS entry would never have matched). - Remove `SamplerCustomAdvanced.noise_seed` from PARAM_PATTERNS — that node takes a NOISE input from RandomNoise, not a seed field directly. NODE_TO_PACKAGE registry slugs - Verified all 18 packages against api.comfy.org and fixed: - `comfyui-essentials` → `comfyui_essentials` (underscore, not hyphen) - `comfyui-gguf` → `ComfyUI-GGUF` (case-sensitive) - `comfyui-photomaker-plus` → `ComfyUI-PhotoMaker-Plus` - `comfyui-wanvideowrapper` → `ComfyUI-WanVideoWrapper` - ComfyUI-HunyuanVideoWrapper isn't on the registry; surface a git-URL install hint via new NODE_TO_GIT_URL fallback so the user can install via ComfyUI-Manager's /manager/queue/install endpoint. Wrong class names - `Canny` → `CannyEdgePreprocessor` (controlnet-aux registers the latter, the former never appears in /object_info). - Add `Zoe_DepthAnythingPreprocessor` and `AnimalPosePreprocessor` while fixing controlnet-aux. - Remove `Reroute (rgthree)` (rgthree's Reroute is JS-only — no Python class, never appears in /object_info). - Add `Display Int (rgthree)` (sibling of Display Any). - Move `UltralyticsDetectorProvider` from `comfyui-impact-pack` to `comfyui-impact-subpack` (separate package, registered there). Tests - Update test_packages_are_safe_for_shell to accept case-mixed slugs (the registry uses both ComfyUI- and comfyui_ prefixes inconsistently). Replaced the lowercase-only assertion with a shell-safe regex check. - 117 tests still pass (105 unit + 8 cloud + 4 cross-host). Attribution - Add `SHL0MS@users.noreply.github.com` mapping to scripts/release.py AUTHOR_MAP so check-attribution CI passes. --- scripts/release.py | 1 + skills/creative/comfyui/SKILL.md | 5 +- skills/creative/comfyui/scripts/_common.py | 12 ++-- skills/creative/comfyui/scripts/check_deps.py | 56 +++++++++++++------ .../creative/comfyui/tests/test_check_deps.py | 9 ++- 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/scripts/release.py b/scripts/release.py index b1b349e10d..e67fab80f0 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -105,6 +105,7 @@ AUTHOR_MAP = { "82637225+kshitijk4poor@users.noreply.github.com": "kshitijk4poor", "keifergu@tencent.com": "keifergu", "kshitijk4poor@users.noreply.github.com": "kshitijk4poor", + "SHL0MS@users.noreply.github.com": "SHL0MS", "abner.the.foreman@agentmail.to": "Abnertheforeman", "adam.manning@pro-serveinc.com": "amanning3390", "thomasgeorgevii09@gmail.com": "tochukwuada", diff --git a/skills/creative/comfyui/SKILL.md b/skills/creative/comfyui/SKILL.md index e488e2c581..4fbeb60357 100644 --- a/skills/creative/comfyui/SKILL.md +++ b/skills/creative/comfyui/SKILL.md @@ -2,11 +2,10 @@ name: comfyui description: "Generate images, video, and audio with ComfyUI — install, launch, manage nodes/models, run workflows with parameter injection. Uses the official comfy-cli for lifecycle and direct REST/WebSocket API for execution." version: 5.0.0 -requires_runtime: ComfyUI (local, Comfy Desktop, or Comfy Cloud) -requires_tooling: comfy-cli (auto-installed via pipx/uvx by setup script) -author: [kshitijk4poor, alt-glitch, audit-v5] +author: [kshitijk4poor, alt-glitch] license: MIT platforms: [macos, linux, windows] +compatibility: "Requires ComfyUI (local, Comfy Desktop, or Comfy Cloud) and comfy-cli (auto-installed via pipx/uvx by the setup script)." prerequisites: commands: ["python3"] setup: diff --git a/skills/creative/comfyui/scripts/_common.py b/skills/creative/comfyui/scripts/_common.py index ead2baf837..ef742733eb 100644 --- a/skills/creative/comfyui/scripts/_common.py +++ b/skills/creative/comfyui/scripts/_common.py @@ -142,11 +142,11 @@ MODEL_LOADERS: dict[str, list[tuple[str, str]]] = { "StyleModelLoader": [("style_model_name", "style_models")], "GLIGENLoader": [("gligen_name", "gligen")], "HypernetworkLoader": [("hypernetwork_name", "hypernetworks")], - # IPAdapter family (community) + # IPAdapter family (community). + # Note: IPAdapterUnifiedLoader's `preset` and IPAdapterInsightFaceLoader's + # `provider` are enums (not file paths), so they're intentionally omitted — + # check_deps would otherwise treat enum values as missing model files. "IPAdapterModelLoader": [("ipadapter_file", "ipadapter")], - "IPAdapterUnifiedLoader": [("preset", "ipadapter")], - "IPAdapterInsightFaceLoader": [("provider", "insightface")], - "InsightFaceLoader": [("provider", "insightface")], "InstantIDModelLoader": [("instantid_file", "instantid")], # AnimateDiff / video "ADE_LoadAnimateDiffModel": [("model_name", "animatediff_models")], @@ -195,7 +195,7 @@ PARAM_PATTERNS: list[tuple[str, str, str]] = [ ("BasicScheduler", "scheduler", "scheduler"), ("BasicScheduler", "denoise", "denoise"), ("KSamplerSelect", "sampler_name", "sampler_name"), - ("BasicGuider", "cfg", "cfg"), + # NB: BasicGuider has no cfg input (it just bundles model+conditioning). ("CFGGuider", "cfg", "cfg"), ("DualCFGGuider", "cfg_conds", "cfg"), ("DualCFGGuider", "cfg_cond2_negative", "cfg_negative"), @@ -209,7 +209,7 @@ PARAM_PATTERNS: list[tuple[str, str, str]] = [ ("SDTurboScheduler", "denoise", "denoise"), ("SamplerCustom", "noise_seed", "seed"), ("SamplerCustom", "cfg", "cfg"), - ("SamplerCustomAdvanced", "noise_seed", "seed"), + # NB: SamplerCustomAdvanced takes a NOISE input (from RandomNoise) — no seed field directly. # ---- Dimensions / latent ---- ("EmptyLatentImage", "width", "width"), diff --git a/skills/creative/comfyui/scripts/check_deps.py b/skills/creative/comfyui/scripts/check_deps.py index ec415346c3..607e2c0a2d 100755 --- a/skills/creative/comfyui/scripts/check_deps.py +++ b/skills/creative/comfyui/scripts/check_deps.py @@ -42,19 +42,20 @@ from _common import ( # noqa: E402 # recognize, suggesting the right `comfy node install ...` makes the difference # between a working agent and a stuck one. NODE_TO_PACKAGE: dict[str, str] = { - # rgthree + # rgthree (Reroute is JS-only and doesn't appear in /object_info) "Power Lora Loader (rgthree)": "rgthree-comfy", "Image Comparer (rgthree)": "rgthree-comfy", "Seed (rgthree)": "rgthree-comfy", - "Reroute (rgthree)": "rgthree-comfy", "Display Any (rgthree)": "rgthree-comfy", + "Display Int (rgthree)": "rgthree-comfy", # Impact pack "FaceDetailer": "comfyui-impact-pack", "DetailerForEach": "comfyui-impact-pack", - "UltralyticsDetectorProvider": "comfyui-impact-pack", "BboxDetectorSEGS": "comfyui-impact-pack", "SAMLoader": "comfyui-impact-pack", "ImpactWildcardProcessor": "comfyui-impact-pack", + # Impact subpack (separate package) + "UltralyticsDetectorProvider": "comfyui-impact-subpack", # Was Node Suite "Image Save": "was-node-suite-comfyui", "Number Counter": "was-node-suite-comfyui", @@ -73,11 +74,13 @@ NODE_TO_PACKAGE: dict[str, str] = { "ADE_AnimateDiffLoaderWithContext": "comfyui-animatediff-evolved", "ADE_AnimateDiffLoaderGen1": "comfyui-animatediff-evolved", "ADE_LoadAnimateDiffModel": "comfyui-animatediff-evolved", - # ControlNet aux - "Canny": "comfyui_controlnet_aux", + # ControlNet aux preprocessors (full class names) + "CannyEdgePreprocessor": "comfyui_controlnet_aux", "DWPreprocessor": "comfyui_controlnet_aux", "OpenposePreprocessor": "comfyui_controlnet_aux", "DepthAnythingPreprocessor": "comfyui_controlnet_aux", + "Zoe_DepthAnythingPreprocessor": "comfyui_controlnet_aux", + "AnimalPosePreprocessor": "comfyui_controlnet_aux", # IPAdapter Plus "IPAdapterAdvanced": "comfyui_ipadapter_plus", "IPAdapterUnifiedLoader": "comfyui_ipadapter_plus", @@ -86,29 +89,34 @@ NODE_TO_PACKAGE: dict[str, str] = { # InstantID "InstantIDModelLoader": "comfyui_instantid", "ApplyInstantID": "comfyui_instantid", - # Comfy essentials - "GetImageSize+": "comfyui-essentials", - "ImageBatchMultiple+": "comfyui-essentials", + # Comfy essentials (note: registry slug uses underscore, not hyphen) + "GetImageSize+": "comfyui_essentials", + "ImageBatchMultiple+": "comfyui_essentials", # pysssss "ShowText|pysssss": "comfyui-custom-scripts", "PreviewImage|pysssss": "comfyui-custom-scripts", # SUPIR "SUPIR_Upscale": "comfyui-supir", "SUPIR_first_stage": "comfyui-supir", - # GGUF - "UNETLoaderGGUF": "comfyui-gguf", - "DualCLIPLoaderGGUF": "comfyui-gguf", + # GGUF (case-sensitive registry slug) + "UNETLoaderGGUF": "ComfyUI-GGUF", + "DualCLIPLoaderGGUF": "ComfyUI-GGUF", # Florence2 "Florence2Run": "comfyui-florence2", # WAS "Image Filter Adjustments": "was-node-suite-comfyui", - # Photomaker - "PhotoMakerLoader": "comfyui-photomaker-plus", - # Wan / Hunyuan video - "WanVideoSampler": "comfyui-wanvideowrapper", - "WanVideoModelLoader": "comfyui-wanvideowrapper", - "HunyuanVideoSampler": "comfyui-hunyuanvideowrapper", - "HunyuanVideoModelLoader": "comfyui-hunyuanvideowrapper", + # Photomaker (case-sensitive) + "PhotoMakerLoader": "ComfyUI-PhotoMaker-Plus", + # Wan video (case-sensitive) + "WanVideoSampler": "ComfyUI-WanVideoWrapper", + "WanVideoModelLoader": "ComfyUI-WanVideoWrapper", +} + +# Nodes whose package isn't on the comfy registry — need git-URL install via +# ComfyUI-Manager. We surface a helpful hint instead of an unrunnable command. +NODE_TO_GIT_URL: dict[str, str] = { + "HunyuanVideoSampler": "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper", + "HunyuanVideoModelLoader": "https://github.com/kijai/ComfyUI-HunyuanVideoWrapper", } @@ -250,6 +258,12 @@ def suggest_install_command(node_class: str) -> str | None: return None +def suggest_git_url(node_class: str) -> str | None: + """For nodes not on the registry, return a git URL the user can hand to + ComfyUI-Manager's `/manager/queue/install` endpoint.""" + return NODE_TO_GIT_URL.get(node_class) + + def check_deps( workflow: dict, host: str, *, api_key: str | None = None, ) -> dict: @@ -278,8 +292,14 @@ def check_deps( if cls not in installed_nodes: entry = {"class_type": cls} cmd = suggest_install_command(cls) + git_url = suggest_git_url(cls) if cmd: entry["fix_command"] = cmd + elif git_url: + entry["fix_git_url"] = git_url + entry["fix_hint"] = ( + f"Not on registry. Install via Manager with this git URL: {git_url}" + ) else: entry["fix_hint"] = ( "Search https://registry.comfy.org or " diff --git a/skills/creative/comfyui/tests/test_check_deps.py b/skills/creative/comfyui/tests/test_check_deps.py index c5d36b3418..30116a7fe7 100644 --- a/skills/creative/comfyui/tests/test_check_deps.py +++ b/skills/creative/comfyui/tests/test_check_deps.py @@ -59,7 +59,10 @@ class TestNodePackageMap: keys = list(NODE_TO_PACKAGE.keys()) assert len(keys) == len(set(keys)) - def test_all_lowercase_packages(self): - # Convention: package names are lowercase with hyphens/underscores + def test_packages_are_safe_for_shell(self): + # Registry slugs must be alphanumerics + hyphens/underscores only + # (passed straight to `comfy node install `). + import re + safe = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._\-]*$") for pkg in NODE_TO_PACKAGE.values(): - assert pkg.lower() == pkg, f"Package name should be lowercase: {pkg}" + assert safe.match(pkg), f"Unsafe package slug: {pkg!r}"