brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Use when the user wants to create a ComfyUI custom node, convert Python code to a node, make a node from a script, or needs help with ComfyUI node development, INPUT_TYPES, RETURN_TYPES, or node class structure.
Claude Code
$ npx -y skills add ConstantineB6/comfy-pilot --skill comfy-nodes --agent claude-code
Codex
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a codex -y
Cursor
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a cursor -y
Gemini CLI
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a gemini-cli -y
GitHub Copilot
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a github-copilot -y
OpenCode
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a opencode -y
Windsurf
$ npx skills add ConstantineB6/comfy-pilot --skill comfy-nodes -a windsurf -y
name: comfy-nodes description: Use when the user wants to create a ComfyUI custom node, convert Python code to a node, make a node from a script, or needs help with ComfyUI node development, INPUT_TYPES, RETURN_TYPES, or node class structure. version: 1.0.0
This skill helps you create custom ComfyUI nodes from Python code.
class MyNode:
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"image": ("IMAGE",),
"value": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0}),
},
"optional": {
"mask": ("MASK",),
}
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("output",)
FUNCTION = "execute"
CATEGORY = "Custom/MyNodes"
def execute(self, image, value, mask=None):
result = image * value
return (result,)
NODE_CLASS_MAPPINGS = {"MyNode": MyNode}
NODE_DISPLAY_NAME_MAPPINGS = {"MyNode": "My Node"}When you have Python code to wrap:
# Original function
def apply_blur(image, radius=5):
from PIL import ImageFilter
return image.filter(ImageFilter.GaussianBlur(radius))| Python Type | ComfyUI Type | Conversion | |-------------|--------------|------------| | PIL Image | IMAGE | `torch.from_numpy(np.array(pil) / 255.0)` | | numpy array | IMAGE | `torch.from_numpy(arr.astype(np.float32))` | | cv2 BGR | IMAGE | `torch.from_numpy(cv2.cvtColor(img, cv2.COLOR_BGR2RGB) / 255.0)` | | float 0-255 | IMAGE | Divide by 255.0 | | Single image | Batch | `tensor.unsqueeze(0)` |
ComfyUI images are `[B,H,W,C]` - always process all batch items:
def execute(self, image, radius):
batch_results = []
for i in range(image.shape[0]):
# Convert to PIL
img_np = (image[i].cpu().numpy() * 255).astype(np.uint8)
pil_img = Image.fromarray(img_np)
# Your processing
result = pil_img.filter(ImageFilter.GaussianBlur(radius))
# Convert back
result_np = np.array(result).astype(np.float32) / 255.0
batch_results.append(torch.from_numpy(result_np))
return (torch.stack(batch_results),)| Type | Shape/Format | Widget Options | |------|--------------|----------------| | IMAGE | [B,H,W,C] float 0-1 | - | | MASK | [H,W] or [B,H,W] float 0-1 | - | | LATENT | {"samples": [B,C,H,W]} | - | | MODEL | ModelPatcher | - | | CLIP | CLIP encoder | - | | VAE | VAE model | - | | CONDITIONING | [(cond, pooled), ...] | - | | INT | integer | default, min, max, step | | FLOAT | float | default, min, max, step, display | | STRING | str | default, multiline | | BOOLEAN | bool | default | | COMBO | str | List of options as type |
Use the MCP tools to find existing nodes for reference:
comfy_search("blur") → Find blur implementations
comfy_spec("GaussianBlur") → See how inputs are definedTalk to your ComfyUI workflows. Comfy Pilot gives Claude Code direct access to see, edit, and run your workflows — with an embedded terminal right inside ComfyUI.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.