mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-01-22 20:10:19 +08:00
Compare commits
4 Commits
5a228dfe06
...
4c4bb6b43f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c4bb6b43f | ||
|
|
29b4824ee2 | ||
|
|
e3a8b669b2 | ||
|
|
c98117a802 |
@ -20356,6 +20356,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple node for ComfyUI that rotates or resizes the input latent to common orientations."
|
||||
},
|
||||
{
|
||||
"author": "SparknightLLC",
|
||||
"title": "ComfyUI-ModelSamplingSD3Advanced",
|
||||
"reference": "https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced",
|
||||
"files": [
|
||||
"https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Adds windowed, curved shift control for Flow Matching samplers (SD3-style / flow schedules). It is a drop-in replacement for Comfy's included ModelSamplingSD3 node."
|
||||
},
|
||||
{
|
||||
"author": "lightricks",
|
||||
"title": "ComfyUI-LTXVideo",
|
||||
@ -38908,6 +38918,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Generate human poses from text descriptions using T2P Transformer for ControlNet/T2I-Adapter workflows"
|
||||
},
|
||||
{
|
||||
"author": "logicalor",
|
||||
"title": "comfyui_friendly_pipe",
|
||||
"reference": "https://github.com/logicalor/comfyui_friendly_pipe",
|
||||
"files": [
|
||||
"https://github.com/logicalor/comfyui_friendly_pipe"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Flexible pipe nodes for bundling and unbundling multiple connections of any type in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ssspace1",
|
||||
"title": "SSpack_ComfyUI",
|
||||
@ -39228,8 +39248,56 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI extension that helps users relink missing models in workflows"
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
"author": "xuheyao",
|
||||
"title": "comfyui-dinov3-point-prompt",
|
||||
"reference": "https://github.com/xuheyao/comfyui-dinov3-point-prompt",
|
||||
"files": [
|
||||
"https://github.com/xuheyao/comfyui-dinov3-point-prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for DINOv3 point prompt functionality with integration of Facebook's DINOv3 research model. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "Asidert",
|
||||
"title": "ComfyUI_Base64Images",
|
||||
"reference": "https://github.com/Asidert/ComfyUI_Base64Images",
|
||||
"files": [
|
||||
"https://github.com/Asidert/ComfyUI_Base64Images"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of base64 input and output nodes for a custom API using ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ddontsov93",
|
||||
"title": "ComfyUI-AudioSeparator",
|
||||
"reference": "https://github.com/ddontsov93/ComfyUI-AudioSeparator",
|
||||
"files": [
|
||||
"https://github.com/ddontsov93/ComfyUI-AudioSeparator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom node for ComfyUI integrating audio-separator library that separates audio stems (vocals vs instrumental), removes noise, and fixes audio artifacts using GPU acceleration. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "TobiasGlaubach",
|
||||
"title": "ComfyUI-TG_pydocmaker",
|
||||
"reference": "https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker",
|
||||
"files": [
|
||||
"https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A minimal node set in comfyui to render pydocmaker reports"
|
||||
},
|
||||
{
|
||||
"author": "cyberlightdev",
|
||||
"title": "ComfyUI-CyberUtils",
|
||||
"reference": "https://github.com/cyberlightdev/ComfyUI-CyberUtils",
|
||||
"files": [
|
||||
"https://github.com/cyberlightdev/ComfyUI-CyberUtils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A minimal template for creating React/TypeScript frontend extensions for ComfyUI, with complete boilerplate setup including internationalization and unit testing."
|
||||
},
|
||||
|
||||
|
||||
|
||||
@ -39631,6 +39699,17 @@
|
||||
],
|
||||
"install_type": "unzip",
|
||||
"description": "This is a node to convert an image into a CMYK Halftone dot image."
|
||||
},
|
||||
{
|
||||
"author": "femanzo",
|
||||
"title": "ComfyUI User Profiles",
|
||||
"id": "comfyui-user-profiles",
|
||||
"reference": "https://github.com/femanzo/comfyui-user-profiles",
|
||||
"files": [
|
||||
"https://github.com/femanzo/comfyui-user-profiles"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "User profile management with custom input/output folders and optional file encryption (AES-256). Create multiple profiles, protect with passwords, and encrypt your files when logged out."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -161,7 +161,11 @@
|
||||
"https://github.com/1038lab/ComfyUI-QwenVL": [
|
||||
[
|
||||
"AILab_QwenVL",
|
||||
"AILab_QwenVL_Advanced"
|
||||
"AILab_QwenVL_Advanced",
|
||||
"AILab_QwenVL_GGUF",
|
||||
"AILab_QwenVL_GGUF_Advanced",
|
||||
"AILab_QwenVL_GGUF_PromptEnhancer",
|
||||
"AILab_QwenVL_PromptEnhancer"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-QwenVL"
|
||||
@ -2971,6 +2975,15 @@
|
||||
"title_aux": "Dir Gir"
|
||||
}
|
||||
],
|
||||
"https://github.com/Asidert/ComfyUI_Base64Images": [
|
||||
[
|
||||
"ConvertImageToBase64",
|
||||
"LoadImageFromBase64"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Base64Images"
|
||||
}
|
||||
],
|
||||
"https://github.com/AstrionX/ComfyUI-Tensor-Prism-Node-Pack": [
|
||||
[
|
||||
"AdvancedCLIPMerge",
|
||||
@ -3028,6 +3041,16 @@
|
||||
"title_aux": "ComfyUI-AnimateAnyone-reproduction"
|
||||
}
|
||||
],
|
||||
"https://github.com/AuroBit/ComfyUI-OOTDiffusion": [
|
||||
[
|
||||
"LoadOOTDPipeline",
|
||||
"LoadOOTDPipelineHub",
|
||||
"OOTDGenerate"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI OOTDiffusion"
|
||||
}
|
||||
],
|
||||
"https://github.com/Austat/ComfyUI-DownsampleFPS": [
|
||||
[
|
||||
"DownsampleFPSNode"
|
||||
@ -8373,12 +8396,14 @@
|
||||
"GR Background Remover REMBG",
|
||||
"GR Checkered Board",
|
||||
"GR Counter",
|
||||
"GR Filename",
|
||||
"GR Flip Tile Random Inverted",
|
||||
"GR Flip Tile Random Red Ring",
|
||||
"GR Florence 2 Caption Generator",
|
||||
"GR INT Incremetor",
|
||||
"GR Image Details Displayer",
|
||||
"GR Image Details Saver",
|
||||
"GR Image Multiplication",
|
||||
"GR Image Multiplier",
|
||||
"GR Image Paste",
|
||||
"GR Image Paste With Mask",
|
||||
@ -17155,8 +17180,11 @@
|
||||
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora": [
|
||||
[
|
||||
"ApplyTrainedLora",
|
||||
"ClippyRebornImageLoader",
|
||||
"FLUXSelectiveLoRALoader",
|
||||
"ImageOfDayLoader",
|
||||
"LoRALoaderWithAnalysis",
|
||||
"LoRALoaderWithAnalysisV2",
|
||||
"MusubiQwenImageEditLoraTrainer",
|
||||
"MusubiQwenImageLoraTrainer",
|
||||
"MusubiWanLoraTrainer",
|
||||
@ -17166,6 +17194,7 @@
|
||||
"SD15LoraTrainer",
|
||||
"SDXLLoraTrainer",
|
||||
"SDXLSelectiveLoRALoader",
|
||||
"ScheduledLoRALoader",
|
||||
"WanSelectiveLoRALoader",
|
||||
"ZImageSelectiveLoRALoader"
|
||||
],
|
||||
@ -17586,6 +17615,14 @@
|
||||
"title_aux": "ComfyUI-MaskArbiter"
|
||||
}
|
||||
],
|
||||
"https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced": [
|
||||
[
|
||||
"ModelSamplingSD3Advanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-ModelSamplingSD3Advanced"
|
||||
}
|
||||
],
|
||||
"https://github.com/SparknightLLC/ComfyUI-WeightedRandomChoice": [
|
||||
[
|
||||
"WeightedRandomChoice"
|
||||
@ -19293,6 +19330,15 @@
|
||||
"title_aux": "DreamO Comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker": [
|
||||
[
|
||||
"TG_PydGetMetadata",
|
||||
"TG_PydPreview"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-TG_pydocmaker"
|
||||
}
|
||||
],
|
||||
"https://github.com/Tr1dae/ComfyUI-Dequality": [
|
||||
[
|
||||
"Dequality"
|
||||
@ -29779,6 +29825,14 @@
|
||||
"title_aux": "ComfyUI_text_diff"
|
||||
}
|
||||
],
|
||||
"https://github.com/ddontsov93/ComfyUI-AudioSeparator": [
|
||||
[
|
||||
"AudioSeparatorNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-AudioSeparator"
|
||||
}
|
||||
],
|
||||
"https://github.com/denfrost/Den_ComfyUI_Workflow": [
|
||||
[
|
||||
"Den_CropImage_AS",
|
||||
@ -39641,6 +39695,16 @@
|
||||
"title_aux": "Comfyui_three_js"
|
||||
}
|
||||
],
|
||||
"https://github.com/logicalor/comfyui_friendly_pipe": [
|
||||
[
|
||||
"FriendlyPipeEdit",
|
||||
"FriendlyPipeIn",
|
||||
"FriendlyPipeOut"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui_friendly_pipe"
|
||||
}
|
||||
],
|
||||
"https://github.com/logicalor/comfyui_multi_replace": [
|
||||
[
|
||||
"FindReplacePairs",
|
||||
@ -45337,6 +45401,17 @@
|
||||
"title_aux": "ComfyUI WD 1.4 Tagger"
|
||||
}
|
||||
],
|
||||
"https://github.com/pzc163/Comfyui-CatVTON": [
|
||||
[
|
||||
"AutoMasker",
|
||||
"CatVTON",
|
||||
"LoadAutoMasker",
|
||||
"LoadCatVTONPipeline"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-CatVTON"
|
||||
}
|
||||
],
|
||||
"https://github.com/pzc163/Comfyui_MiniCPMv2_6-prompt-generator": [
|
||||
[
|
||||
"Prompt_Generator",
|
||||
@ -46254,6 +46329,17 @@
|
||||
"title_aux": "Dia realistic TTS"
|
||||
}
|
||||
],
|
||||
"https://github.com/rnbwdsh/ComfyUI-LatentWalk": [
|
||||
[
|
||||
"LatentWalkConditional",
|
||||
"LatentWalkConditionalRandom",
|
||||
"LatentWalkNoise",
|
||||
"LatentWalkVae"
|
||||
],
|
||||
{
|
||||
"title_aux": "Latent Walk"
|
||||
}
|
||||
],
|
||||
"https://github.com/rndnanthu/ComfyUI-RndNanthu": [
|
||||
[
|
||||
"AutoGradePro",
|
||||
@ -52744,6 +52830,17 @@
|
||||
"title_aux": "Comfyui_Get_promptId"
|
||||
}
|
||||
],
|
||||
"https://github.com/xuheyao/comfyui-dinov3-point-prompt": [
|
||||
[
|
||||
"DINOv3Loader",
|
||||
"DINOv3PointCollector",
|
||||
"DINOv3Process",
|
||||
"DINOv3Similarity"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-dinov3-point-prompt"
|
||||
}
|
||||
],
|
||||
"https://github.com/xuhongming251/ComfyUI-GPEN": [
|
||||
[
|
||||
"FaceEnhancement"
|
||||
|
||||
15684
github-stats-cache.json
15684
github-stats-cache.json
File diff suppressed because it is too large
Load Diff
8111
github-stats.json
8111
github-stats.json
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,25 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "TobiasGlaubach",
|
||||
"title": "ComfyUI-TG_PyCode [UNSAFE]",
|
||||
"reference": "https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode",
|
||||
"files": [
|
||||
"https://github.com/TobiasGlaubach/ComfyUI-TG_PyCode"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node library with an editor and nodes to run Python code within ComfyUI workflows.[w/This nodepack has a vulnerability that allows arbitrary code execution remotely.]"
|
||||
},
|
||||
{
|
||||
"author": "jchiotaka",
|
||||
"title": "ComfyUI-ClarityAI-Upscaler",
|
||||
"reference": "https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler",
|
||||
"files": [
|
||||
"https://github.com/jchiotaka/ComfyUI-ClarityAI-Upscaler"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI upscaler nodes including ClarityCreativeUpscaler, ClarityCrystalUpscaler, and ClarityFluxUpscaler. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "tpc2233",
|
||||
"title": "ComfyUI-TP-IMtalker [WIP]",
|
||||
|
||||
@ -9126,13 +9126,18 @@
|
||||
],
|
||||
"https://github.com/jorin91/ComfyUI-JSG-Utils": [
|
||||
[
|
||||
"JSGAddMetadata",
|
||||
"JSGDeleteFilePassAny",
|
||||
"JSGDeleteFilePassImage",
|
||||
"JSGDeleteFilePassString",
|
||||
"JSGFindImagePathsRecursive",
|
||||
"JSGFindImagesRecursiveList",
|
||||
"JSGLoadImageFromPath",
|
||||
"JSGParsePath"
|
||||
"JSGParsePath",
|
||||
"JSGRandomColorHSVA",
|
||||
"JSGRemoveMetadata",
|
||||
"JSGSaveImage",
|
||||
"JSGSetMetadata"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-JSG-Utils [UNSAFE]"
|
||||
@ -12202,12 +12207,7 @@
|
||||
"ListItemExtractor",
|
||||
"LogValue",
|
||||
"LoopAny",
|
||||
"PromptCombinationProcessor",
|
||||
"PromptConditioner",
|
||||
"PromptPartJoin",
|
||||
"PromptRandomizer",
|
||||
"PromptTagFilter",
|
||||
"PromptWeightManager",
|
||||
"StringBuilder",
|
||||
"StringCollector",
|
||||
"StringConcatenation",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,65 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "SparknightLLC",
|
||||
"title": "ComfyUI-ModelSamplingSD3Advanced",
|
||||
"reference": "https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced",
|
||||
"files": [
|
||||
"https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Adds windowed, curved shift control for Flow Matching samplers (SD3-style / flow schedules). It is a drop-in replacement for Comfy's included ModelSamplingSD3 node."
|
||||
},
|
||||
{
|
||||
"author": "ddontsov93",
|
||||
"title": "ComfyUI-AudioSeparator",
|
||||
"reference": "https://github.com/ddontsov93/ComfyUI-AudioSeparator",
|
||||
"files": [
|
||||
"https://github.com/ddontsov93/ComfyUI-AudioSeparator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom node for ComfyUI integrating audio-separator library that separates audio stems (vocals vs instrumental), removes noise, and fixes audio artifacts using GPU acceleration. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "TobiasGlaubach",
|
||||
"title": "ComfyUI-TG_pydocmaker",
|
||||
"reference": "https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker",
|
||||
"files": [
|
||||
"https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A minimal node set in comfyui to render pydocmaker reports"
|
||||
},
|
||||
{
|
||||
"author": "xuheyao",
|
||||
"title": "comfyui-dinov3-point-prompt",
|
||||
"reference": "https://github.com/xuheyao/comfyui-dinov3-point-prompt",
|
||||
"files": [
|
||||
"https://github.com/xuheyao/comfyui-dinov3-point-prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for DINOv3 point prompt functionality with integration of Facebook's DINOv3 research model. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "logicalor",
|
||||
"title": "comfyui_friendly_pipe",
|
||||
"reference": "https://github.com/logicalor/comfyui_friendly_pipe",
|
||||
"files": [
|
||||
"https://github.com/logicalor/comfyui_friendly_pipe"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Flexible pipe nodes for bundling and unbundling multiple connections of any type in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "Asidert",
|
||||
"title": "ComfyUI_Base64Images",
|
||||
"reference": "https://github.com/Asidert/ComfyUI_Base64Images",
|
||||
"files": [
|
||||
"https://github.com/Asidert/ComfyUI_Base64Images"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of base64 input and output nodes for a custom API using ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "9nate-drake",
|
||||
"title": "ComfyUI-PanoTools",
|
||||
@ -662,343 +722,6 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Efficient lazy path switch for ComfyUI. Skips execution of the inactive branch entirely using native lazy evaluation. Includes live status display."
|
||||
},
|
||||
{
|
||||
"author": "Deathspike",
|
||||
"title": "ComfyUI-MyOriginalWaifu",
|
||||
"reference": "https://github.com/Deathspike/ComfyUI-MyOriginalWaifu",
|
||||
"files": [
|
||||
"https://github.com/Deathspike/ComfyUI-MyOriginalWaifu"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "My Original Waifu is a tag-based prompt-transformation engine for ComfyUI designed for creators who want their original characters to feel consistent, expressive, and faithfully rendered across every scene. Instead of manually adjusting tags each time you generate an image, you define the essence of your waifu, her look, her outfits, the way she appears in different contexts, and the engine transforms your prompt to match those intentions. It stays out of the way and simply follows your rules with clarity and consistency. Your Waifu. Your Rules. Your Perfect Prompt."
|
||||
},
|
||||
{
|
||||
"author": "LeonQ8",
|
||||
"title": "ComfyUI-Dynamic-Lora-Scheduler",
|
||||
"reference": "https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler",
|
||||
"files": [
|
||||
"https://github.com/LeonQ8/ComfyUI-Dynamic-Lora-Scheduler"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Dynamically balance weights of multiple LoRAs over generation steps for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "sebagallo",
|
||||
"title": "comfyui-sg-llama-cpp",
|
||||
"reference": "https://github.com/sebagallo/comfyui-sg-llama-cpp",
|
||||
"files": [
|
||||
"https://github.com/sebagallo/comfyui-sg-llama-cpp"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "llama-cpp-python wrapper, with support for vision models. It allows the user to generate text responses from prompts using llama.cpp."
|
||||
},
|
||||
{
|
||||
"author": "Limbicnation",
|
||||
"title": "ComfyUI-PromptGenerator",
|
||||
"id": "comfyui-prompt-generator",
|
||||
"reference": "https://github.com/Limbicnation/ComfyUI-PromptGenerator",
|
||||
"files": [
|
||||
"https://github.com/Limbicnation/ComfyUI-PromptGenerator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Generate Stable Diffusion prompts using Qwen3-8B via Ollama with 7 style presets (cinematic, anime, photorealistic, fantasy, abstract, cyberpunk, sci-fi)"
|
||||
},
|
||||
{
|
||||
"author": "TuonoMindCode",
|
||||
"title": "ComfyUI-Resolution-Suggest-Downscale",
|
||||
"reference": "https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale",
|
||||
"files": [
|
||||
"https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Resolution suggestion and downscale helper node for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "dcyd-lun",
|
||||
"title": "ComfyUI_text_diff",
|
||||
"reference": "https://github.com/dcyd-lun/ComfyUI_text_diff",
|
||||
"files": [
|
||||
"https://github.com/dcyd-lun/ComfyUI_text_diff"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Compare two texts with GitHub/GitLab-style diff highlighting in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "SKFRMSEHF",
|
||||
"title": "SK-ComfyUI-FolderingLoader",
|
||||
"id": "skloader",
|
||||
"reference": "https://github.com/SKFRMSEHF/comfyui_SK_Loader",
|
||||
"files": [
|
||||
"https://github.com/SKFRMSEHF/comfyui_SK_Loader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unified loader nodes with folder organization support for checkpoints, LoRA, VAE, and diffusion models"
|
||||
},
|
||||
{
|
||||
"author": "drawthingsai",
|
||||
"title": "draw-things-comfyui",
|
||||
"reference": "https://github.com/drawthingsai/draw-things-comfyui",
|
||||
"files": [
|
||||
"https://github.com/drawthingsai/draw-things-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The official Draw Things extension for ComfyUI. Sends image-generation requests to Draw Things over gRPC. Supports Bridge Mode for DT+ cloud and local model execution."
|
||||
},
|
||||
{
|
||||
"author": "darrell-goh",
|
||||
"title": "ComfyUI-NanoBanana_node",
|
||||
"reference": "https://github.com/darrell-goh/ComfyUI-NanoBanana_node",
|
||||
"files": [
|
||||
"https://github.com/darrell-goh/ComfyUI-NanoBanana_node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that allows you to interact with Nano Banana's Vertex API proxy, providing access to Gemini models with dynamic image inputs."
|
||||
},
|
||||
{
|
||||
"author": "This-is-Uncut",
|
||||
"title": "Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"reference": "https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"files": [
|
||||
"https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node to use NBP with custom API key to improve data privacy control."
|
||||
},
|
||||
{
|
||||
"author": "princepainter",
|
||||
"title": "Comfyui-PainterAudioLength",
|
||||
"reference": "https://github.com/princepainter/Comfyui-PainterAudioLength",
|
||||
"files": [
|
||||
"https://github.com/princepainter/Comfyui-PainterAudioLength"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A tool for calculating audio duration that takes audio input and outputs the audio length as a floating-point number. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "akaugun",
|
||||
"title": "comfyui-lora-hook-trigger",
|
||||
"reference": "https://github.com/akaugun/comfyui-lora-hook-trigger",
|
||||
"files": [
|
||||
"https://github.com/akaugun/comfyui-lora-hook-trigger"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A clean and simple ComfyUI custom node that creates a LoRA Hook and automatically finds and loads trigger TXT files placed in a folder named after the LoRA file."
|
||||
},
|
||||
{
|
||||
"author": "tumbowungus",
|
||||
"title": "MultiMaskCouple",
|
||||
"reference": "https://github.com/tumbowungus/MultiMaskCouple",
|
||||
"files": [
|
||||
"https://github.com/tumbowungus/MultiMaskCouple"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI which simplifies the process of masking multiple prompts, making it easier to manage scenes with multiple distinct characters."
|
||||
},
|
||||
{
|
||||
"author": "fudosanit",
|
||||
"title": "ComfyUI-Random-Resolution",
|
||||
"reference": "https://github.com/fudosanit/ComfyUI-Random-Resolution",
|
||||
"files": [
|
||||
"https://github.com/fudosanit/ComfyUI-Random-Resolution"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI. Based on the specified resolution, it randomly selects and outputs one of three patterns: original orientation, swapped width/height, or a square format. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "SuLU-K",
|
||||
"title": "comfyui-easy-sam3-tools",
|
||||
"reference": "https://github.com/SuLU-K/comfyui-easy-sam3-tools",
|
||||
"files": [
|
||||
"https://github.com/SuLU-K/comfyui-easy-sam3-tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom nodes for building SAM3-centric editing pipelines inside ComfyUI, featuring mask merging, bounding box rendering, and DOM-based interactive editing. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "EMkrtchyan",
|
||||
"title": "ComfyUI-NormalsToDepth",
|
||||
"reference": "https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth",
|
||||
"files": [
|
||||
"https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Converts normal maps to depth maps for use in ComfyUI. (Description by CC)"
|
||||
},
|
||||
|
||||
{
|
||||
"author": "jeankassio",
|
||||
"title": "JK AceStep Nodes",
|
||||
"id": "JK-AceStep-Nodes",
|
||||
"reference": "https://github.com/jeankassio/JK-AceStep-Nodes",
|
||||
"files": [
|
||||
"https://github.com/jeankassio/JK-AceStep-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced nodes optimized for ACE-Step audio generation in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "a-und-b",
|
||||
"title": "ComfyUI_AB_Wildcard",
|
||||
"reference": "https://github.com/a-und-b/ComfyUI_AB_Wildcard",
|
||||
"files": [
|
||||
"https://github.com/a-und-b/ComfyUI_AB_Wildcard"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple node for advanced wildcard text processing. Supports variables, conditionals, tag aggregation, weighted selection, and deep nesting. Lightweight, fast, zero external dependencies."
|
||||
},
|
||||
{
|
||||
"author": "RamonGuthrie",
|
||||
"title": "ComfyUI-RBG-SmartSeedVariance",
|
||||
"reference": "https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance",
|
||||
"files": [
|
||||
"https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced seed diversity enhancement for ComfyUI with intelligent noise injection and directional biasing."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-NvidiaCaptioner",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI node for generating rich, detailed captions for images using NVIDIA's vision models. Supports batch processing, multiple captioning styles, and includes built-in caching for efficient workflows."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-Universal-Latent",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-Universal-Latent",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-Universal-Latent"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Enhanced empty latent node with extended aspect ratio support for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "lrzjason",
|
||||
"title": "Comfyui-LatentUtils",
|
||||
"reference": "https://github.com/lrzjason/Comfyui-LatentUtils",
|
||||
"files": [
|
||||
"https://github.com/lrzjason/Comfyui-LatentUtils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI node performing selective latent denoising and detail enhancement using Fourier Transform (FFT) to separate and enhance image frequencies while suppressing noise. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "aTanguay",
|
||||
"title": "ComfyUI_Detonate",
|
||||
"reference": "https://github.com/aTanguay/ComfyUI_Detonate",
|
||||
"files": [
|
||||
"https://github.com/aTanguay/ComfyUI_Detonate"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Professional compositing nodes for ComfyUI - bringing Nuke and Fusion workflows to AI-powered image generation"
|
||||
},
|
||||
{
|
||||
"author": "huihuihuiz",
|
||||
"title": "LoRA Downloader for ComfyUI",
|
||||
"id": "lora_downloader",
|
||||
"reference": "https://github.com/huihuihuiz/lora_downloader",
|
||||
"files": [
|
||||
"https://github.com/huihuihuiz/lora_downloader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node for downloading and managing LoRA models directly within the UI."
|
||||
},
|
||||
{
|
||||
"author": "lovelybbq",
|
||||
"title": "ComfyUI Custom Node Color",
|
||||
"reference": "https://github.com/lovelybbq/comfyui-custom-node-color",
|
||||
"files": [
|
||||
"https://github.com/lovelybbq/comfyui-custom-node-color"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A modern GUI-based color picker for ComfyUI nodes. Features visual spectrum, HEX/RGB inputs, eyedropper tool, and favorite colors support."
|
||||
},
|
||||
{
|
||||
"author": "Moeblack",
|
||||
"title": "ComfyUI-SimpleChat",
|
||||
"reference": "https://github.com/Moeblack/ComfyUI-SimpleChat",
|
||||
"files": [
|
||||
"https://github.com/Moeblack/ComfyUI-SimpleChat"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple, no-nonsense LLM chat nodes for ComfyUI. Support OpenAI, Claude, Gemini and NoASS Roleplay.",
|
||||
"tags": [
|
||||
"LLM",
|
||||
"chat",
|
||||
"openai",
|
||||
"claude",
|
||||
"gemini",
|
||||
"roleplay",
|
||||
"noass"
|
||||
]
|
||||
},
|
||||
{
|
||||
"author": "Lord Lethris",
|
||||
"title": "Dia2 TTS & Captions Generators for ComfyUI",
|
||||
"id": "dia2_tts_captions",
|
||||
"reference": "https://github.com/lord-lethris/ComfyUI-lethris-dia2",
|
||||
"files": [
|
||||
"https://github.com/lord-lethris/ComfyUI-lethris-dia2"
|
||||
],
|
||||
"install_type": "Git-Clone",
|
||||
"description": "This package provides two ComfyUI nodes: 🗣️ Dia2 TTS Generator for text-to-speech using Dia2-2B, and 💬 Dia2 Captions Generator to convert TTS timestamps into SRT/SSA/VTT subtitles. Includes example workflow and voice samples. GPU users require CUDA 12.8+."
|
||||
},
|
||||
{
|
||||
"author": "Braeden90000",
|
||||
"title": "ComfyUI Load Image URL",
|
||||
"id": "load-image-url",
|
||||
"reference": "https://github.com/Braeden90000/comfyui-load-image-url",
|
||||
"files": [
|
||||
"https://github.com/Braeden90000/comfyui-load-image-url"
|
||||
],
|
||||
"pip": ["requests"],
|
||||
"install_type": "git-clone",
|
||||
"description": "Load images from files or URLs with live preview and source switching."
|
||||
},
|
||||
{
|
||||
"author": "purzbeats",
|
||||
"title": "ComfyUI-Purz",
|
||||
"reference": "https://github.com/purzbeats/ComfyUI-Purz",
|
||||
"files": [
|
||||
"https://github.com/purzbeats/ComfyUI-Purz"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A comprehensive node pack for ComfyUI that provides powerful image effects, pattern generation, and animated pattern creation capabilities."
|
||||
},
|
||||
{
|
||||
"author": "TheArtOfficial",
|
||||
"title": "ComfyUI-MaskMorph",
|
||||
"reference": "https://github.com/TheArtOfficial/ComfyUI-MaskMorph",
|
||||
"files": [
|
||||
"https://github.com/TheArtOfficial/ComfyUI-MaskMorph"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Directional mask expansion node that extends masks along specified directions with pixel-precise control, plus separate pinch/widen morphology operations."
|
||||
},
|
||||
{
|
||||
"author": "brahianrosswill",
|
||||
"title": "ComfyUi-RandomNoiseCustom",
|
||||
"reference": "https://github.com/brahianrosswill/ComfyUi-RandomNoiseCustom",
|
||||
"files": [
|
||||
"https://github.com/brahianrosswill/ComfyUi-RandomNoiseCustom"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Provides custom noise generation capabilities for ComfyUI workflows with configurable parameters. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "amtarr",
|
||||
"title": "ComfyUI-TextureAlchemy",
|
||||
"reference": "https://github.com/amtarr/ComfyUI-TextureAlchemy",
|
||||
"files": [
|
||||
"https://github.com/amtarr/ComfyUI-TextureAlchemy"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Complete workflow suite for ComfyUI that transforms images into PBR material sets ready for game engines and 3D software."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -161,7 +161,11 @@
|
||||
"https://github.com/1038lab/ComfyUI-QwenVL": [
|
||||
[
|
||||
"AILab_QwenVL",
|
||||
"AILab_QwenVL_Advanced"
|
||||
"AILab_QwenVL_Advanced",
|
||||
"AILab_QwenVL_GGUF",
|
||||
"AILab_QwenVL_GGUF_Advanced",
|
||||
"AILab_QwenVL_GGUF_PromptEnhancer",
|
||||
"AILab_QwenVL_PromptEnhancer"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-QwenVL"
|
||||
@ -2971,6 +2975,15 @@
|
||||
"title_aux": "Dir Gir"
|
||||
}
|
||||
],
|
||||
"https://github.com/Asidert/ComfyUI_Base64Images": [
|
||||
[
|
||||
"ConvertImageToBase64",
|
||||
"LoadImageFromBase64"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Base64Images"
|
||||
}
|
||||
],
|
||||
"https://github.com/AstrionX/ComfyUI-Tensor-Prism-Node-Pack": [
|
||||
[
|
||||
"AdvancedCLIPMerge",
|
||||
@ -3028,6 +3041,16 @@
|
||||
"title_aux": "ComfyUI-AnimateAnyone-reproduction"
|
||||
}
|
||||
],
|
||||
"https://github.com/AuroBit/ComfyUI-OOTDiffusion": [
|
||||
[
|
||||
"LoadOOTDPipeline",
|
||||
"LoadOOTDPipelineHub",
|
||||
"OOTDGenerate"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI OOTDiffusion"
|
||||
}
|
||||
],
|
||||
"https://github.com/Austat/ComfyUI-DownsampleFPS": [
|
||||
[
|
||||
"DownsampleFPSNode"
|
||||
@ -8373,12 +8396,14 @@
|
||||
"GR Background Remover REMBG",
|
||||
"GR Checkered Board",
|
||||
"GR Counter",
|
||||
"GR Filename",
|
||||
"GR Flip Tile Random Inverted",
|
||||
"GR Flip Tile Random Red Ring",
|
||||
"GR Florence 2 Caption Generator",
|
||||
"GR INT Incremetor",
|
||||
"GR Image Details Displayer",
|
||||
"GR Image Details Saver",
|
||||
"GR Image Multiplication",
|
||||
"GR Image Multiplier",
|
||||
"GR Image Paste",
|
||||
"GR Image Paste With Mask",
|
||||
@ -17155,8 +17180,11 @@
|
||||
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora": [
|
||||
[
|
||||
"ApplyTrainedLora",
|
||||
"ClippyRebornImageLoader",
|
||||
"FLUXSelectiveLoRALoader",
|
||||
"ImageOfDayLoader",
|
||||
"LoRALoaderWithAnalysis",
|
||||
"LoRALoaderWithAnalysisV2",
|
||||
"MusubiQwenImageEditLoraTrainer",
|
||||
"MusubiQwenImageLoraTrainer",
|
||||
"MusubiWanLoraTrainer",
|
||||
@ -17166,6 +17194,7 @@
|
||||
"SD15LoraTrainer",
|
||||
"SDXLLoraTrainer",
|
||||
"SDXLSelectiveLoRALoader",
|
||||
"ScheduledLoRALoader",
|
||||
"WanSelectiveLoRALoader",
|
||||
"ZImageSelectiveLoRALoader"
|
||||
],
|
||||
@ -17586,6 +17615,14 @@
|
||||
"title_aux": "ComfyUI-MaskArbiter"
|
||||
}
|
||||
],
|
||||
"https://github.com/SparknightLLC/ComfyUI-ModelSamplingSD3Advanced": [
|
||||
[
|
||||
"ModelSamplingSD3Advanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-ModelSamplingSD3Advanced"
|
||||
}
|
||||
],
|
||||
"https://github.com/SparknightLLC/ComfyUI-WeightedRandomChoice": [
|
||||
[
|
||||
"WeightedRandomChoice"
|
||||
@ -19293,6 +19330,15 @@
|
||||
"title_aux": "DreamO Comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/TobiasGlaubach/ComfyUI-TG_pydocmaker": [
|
||||
[
|
||||
"TG_PydGetMetadata",
|
||||
"TG_PydPreview"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-TG_pydocmaker"
|
||||
}
|
||||
],
|
||||
"https://github.com/Tr1dae/ComfyUI-Dequality": [
|
||||
[
|
||||
"Dequality"
|
||||
@ -29779,6 +29825,14 @@
|
||||
"title_aux": "ComfyUI_text_diff"
|
||||
}
|
||||
],
|
||||
"https://github.com/ddontsov93/ComfyUI-AudioSeparator": [
|
||||
[
|
||||
"AudioSeparatorNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-AudioSeparator"
|
||||
}
|
||||
],
|
||||
"https://github.com/denfrost/Den_ComfyUI_Workflow": [
|
||||
[
|
||||
"Den_CropImage_AS",
|
||||
@ -39641,6 +39695,16 @@
|
||||
"title_aux": "Comfyui_three_js"
|
||||
}
|
||||
],
|
||||
"https://github.com/logicalor/comfyui_friendly_pipe": [
|
||||
[
|
||||
"FriendlyPipeEdit",
|
||||
"FriendlyPipeIn",
|
||||
"FriendlyPipeOut"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui_friendly_pipe"
|
||||
}
|
||||
],
|
||||
"https://github.com/logicalor/comfyui_multi_replace": [
|
||||
[
|
||||
"FindReplacePairs",
|
||||
@ -45337,6 +45401,17 @@
|
||||
"title_aux": "ComfyUI WD 1.4 Tagger"
|
||||
}
|
||||
],
|
||||
"https://github.com/pzc163/Comfyui-CatVTON": [
|
||||
[
|
||||
"AutoMasker",
|
||||
"CatVTON",
|
||||
"LoadAutoMasker",
|
||||
"LoadCatVTONPipeline"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-CatVTON"
|
||||
}
|
||||
],
|
||||
"https://github.com/pzc163/Comfyui_MiniCPMv2_6-prompt-generator": [
|
||||
[
|
||||
"Prompt_Generator",
|
||||
@ -46254,6 +46329,17 @@
|
||||
"title_aux": "Dia realistic TTS"
|
||||
}
|
||||
],
|
||||
"https://github.com/rnbwdsh/ComfyUI-LatentWalk": [
|
||||
[
|
||||
"LatentWalkConditional",
|
||||
"LatentWalkConditionalRandom",
|
||||
"LatentWalkNoise",
|
||||
"LatentWalkVae"
|
||||
],
|
||||
{
|
||||
"title_aux": "Latent Walk"
|
||||
}
|
||||
],
|
||||
"https://github.com/rndnanthu/ComfyUI-RndNanthu": [
|
||||
[
|
||||
"AutoGradePro",
|
||||
@ -52744,6 +52830,17 @@
|
||||
"title_aux": "Comfyui_Get_promptId"
|
||||
}
|
||||
],
|
||||
"https://github.com/xuheyao/comfyui-dinov3-point-prompt": [
|
||||
[
|
||||
"DINOv3Loader",
|
||||
"DINOv3PointCollector",
|
||||
"DINOv3Process",
|
||||
"DINOv3Similarity"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-dinov3-point-prompt"
|
||||
}
|
||||
],
|
||||
"https://github.com/xuhongming251/ComfyUI-GPEN": [
|
||||
[
|
||||
"FaceEnhancement"
|
||||
|
||||
172
scanner.py
172
scanner.py
@ -20,7 +20,7 @@ from pathlib import Path
|
||||
from typing import Set, Dict, Optional
|
||||
|
||||
# Scanner version for cache invalidation
|
||||
SCANNER_VERSION = "2.0.11" # Multi-layer detection: class existence + display names
|
||||
SCANNER_VERSION = "2.0.12" # Add dict comprehension + export list detection
|
||||
|
||||
# Cache for extract_nodes and extract_nodes_enhanced results
|
||||
_extract_nodes_cache: Dict[str, Set[str]] = {}
|
||||
@ -552,12 +552,22 @@ def extract_nodes_enhanced(
|
||||
if exists:
|
||||
phase5_nodes.add(node_name)
|
||||
|
||||
# Union all results (FIX: Scanner 2.0.9 bug + Scanner 2.0.10 bug)
|
||||
# Phase 6: Dict comprehension pattern (NEW in 2.0.12)
|
||||
# Detects: NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
# Example: TobiasGlaubach/ComfyUI-TG_PyCode
|
||||
phase6_nodes = _fallback_dict_comprehension(code_text, file_path)
|
||||
|
||||
# Phase 7: Import-based class names for dict comprehension (NEW in 2.0.12)
|
||||
# Detects imported classes that are added to export lists
|
||||
phase7_nodes = _fallback_import_class_names(code_text, file_path)
|
||||
|
||||
# Union all results (FIX: Scanner 2.0.9 bug + Scanner 2.0.10 bug + Scanner 2.0.12 dict comp)
|
||||
# 2.0.9: Used early return which missed Phase 3 nodes
|
||||
# 2.0.10: Only checked registrations, missed classes referenced in display names
|
||||
all_nodes = phase1_nodes | phase2_nodes | phase3_nodes | phase4_nodes | phase5_nodes
|
||||
# 2.0.12: Added dict comprehension and import-based class detection
|
||||
all_nodes = phase1_nodes | phase2_nodes | phase3_nodes | phase4_nodes | phase5_nodes | phase6_nodes | phase7_nodes
|
||||
|
||||
# Phase 6: Empty dict detector (logging only, doesn't add nodes)
|
||||
# Phase 8: Empty dict detector (logging only, doesn't add nodes)
|
||||
if not all_nodes:
|
||||
_fallback_empty_dict_detector(code_text, file_path, verbose)
|
||||
|
||||
@ -616,7 +626,7 @@ def _fallback_classname_resolver(code_text: str, file_path: Optional[Path]) -> S
|
||||
def _fallback_item_assignment(code_text: str) -> Set[str]:
|
||||
"""
|
||||
Detect item assignment pattern.
|
||||
|
||||
|
||||
Pattern:
|
||||
NODE_CLASS_MAPPINGS = {}
|
||||
NODE_CLASS_MAPPINGS["MyNode"] = MyNode
|
||||
@ -627,9 +637,9 @@ def _fallback_item_assignment(code_text: str) -> Set[str]:
|
||||
parsed = ast.parse(code_text)
|
||||
except:
|
||||
return set()
|
||||
|
||||
|
||||
nodes = set()
|
||||
|
||||
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
@ -640,10 +650,156 @@ def _fallback_item_assignment(code_text: str) -> Set[str]:
|
||||
if isinstance(target.slice, ast.Constant):
|
||||
if isinstance(target.slice.value, str):
|
||||
nodes.add(target.slice.value)
|
||||
|
||||
|
||||
return nodes
|
||||
|
||||
|
||||
def _fallback_dict_comprehension(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
|
||||
"""
|
||||
Detect dict comprehension pattern with __name__ attribute access.
|
||||
|
||||
Pattern:
|
||||
NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
NODE_CLASS_MAPPINGS = {c.__name__: c for c in [ClassA, ClassB]}
|
||||
|
||||
This function detects dict comprehension assignments to NODE_CLASS_MAPPINGS
|
||||
and extracts class names from the iterable (list literal or variable reference).
|
||||
|
||||
Returns:
|
||||
Set of class names extracted from the dict comprehension
|
||||
"""
|
||||
try:
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('ignore', category=SyntaxWarning)
|
||||
parsed = ast.parse(code_text)
|
||||
except:
|
||||
return set()
|
||||
|
||||
nodes = set()
|
||||
export_lists = {} # Track list variables and their contents
|
||||
|
||||
# First pass: collect list assignments (to_export = [...], exports = [...])
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name):
|
||||
var_name = target.id
|
||||
# Check for list literal
|
||||
if isinstance(node.value, ast.List):
|
||||
class_names = set()
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
class_names.add(elt.id)
|
||||
export_lists[var_name] = class_names
|
||||
|
||||
# Handle augmented assignment: to_export += [...]
|
||||
elif isinstance(node, ast.AugAssign):
|
||||
if isinstance(node.target, ast.Name) and isinstance(node.op, ast.Add):
|
||||
var_name = node.target.id
|
||||
if isinstance(node.value, ast.List):
|
||||
class_names = set()
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
class_names.add(elt.id)
|
||||
if var_name in export_lists:
|
||||
export_lists[var_name].update(class_names)
|
||||
else:
|
||||
export_lists[var_name] = class_names
|
||||
|
||||
# Second pass: find NODE_CLASS_MAPPINGS dict comprehension
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name) and target.id in ['NODE_CLASS_MAPPINGS', 'NODE_CONFIG']:
|
||||
# Check for dict comprehension
|
||||
if isinstance(node.value, ast.DictComp):
|
||||
dictcomp = node.value
|
||||
|
||||
# Check if key is cls.__name__ pattern
|
||||
key = dictcomp.key
|
||||
if isinstance(key, ast.Attribute) and key.attr == '__name__':
|
||||
# Get the iterable from the first generator
|
||||
for generator in dictcomp.generators:
|
||||
iter_node = generator.iter
|
||||
|
||||
# Case 1: Inline list [ClassA, ClassB, ...]
|
||||
if isinstance(iter_node, ast.List):
|
||||
for elt in iter_node.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
nodes.add(elt.id)
|
||||
|
||||
# Case 2: Variable reference (to_export, exports, etc.)
|
||||
elif isinstance(iter_node, ast.Name):
|
||||
var_name = iter_node.id
|
||||
if var_name in export_lists:
|
||||
nodes.update(export_lists[var_name])
|
||||
|
||||
return nodes
|
||||
|
||||
|
||||
def _fallback_import_class_names(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
|
||||
"""
|
||||
Extract class names from imports that are added to export lists.
|
||||
|
||||
Pattern:
|
||||
from .module import ClassA, ClassB
|
||||
to_export = [ClassA, ClassB]
|
||||
NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
|
||||
This is a complementary fallback that works with _fallback_dict_comprehension
|
||||
to resolve import-based node registrations.
|
||||
|
||||
Returns:
|
||||
Set of imported class names that appear in export-like contexts
|
||||
"""
|
||||
try:
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('ignore', category=SyntaxWarning)
|
||||
parsed = ast.parse(code_text)
|
||||
except:
|
||||
return set()
|
||||
|
||||
# Collect imported names
|
||||
imported_names = set()
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.ImportFrom):
|
||||
for alias in node.names:
|
||||
name = alias.asname if alias.asname else alias.name
|
||||
imported_names.add(name)
|
||||
|
||||
# Check if these names appear in list assignments that feed into NODE_CLASS_MAPPINGS
|
||||
export_candidates = set()
|
||||
has_dict_comp_mapping = False
|
||||
|
||||
for node in ast.walk(parsed):
|
||||
# Check for dict comprehension NODE_CLASS_MAPPINGS
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name) and target.id == 'NODE_CLASS_MAPPINGS':
|
||||
if isinstance(node.value, ast.DictComp):
|
||||
has_dict_comp_mapping = True
|
||||
|
||||
# Collect list contents
|
||||
if isinstance(node, ast.Assign):
|
||||
if isinstance(node.value, ast.List):
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name) and elt.id in imported_names:
|
||||
export_candidates.add(elt.id)
|
||||
|
||||
# Handle augmented assignment
|
||||
elif isinstance(node, ast.AugAssign):
|
||||
if isinstance(node.value, ast.List):
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name) and elt.id in imported_names:
|
||||
export_candidates.add(elt.id)
|
||||
|
||||
# Only return if there's a dict comprehension mapping
|
||||
if has_dict_comp_mapping:
|
||||
return export_candidates
|
||||
|
||||
return set()
|
||||
|
||||
|
||||
def _extract_repo_name(file_path: Path) -> str:
|
||||
"""
|
||||
Extract repository name from file path.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user