Previously the index was built only from the live registry, so a custom node
that wasn't installed (a red "missing" node in a downloaded workflow) was
invisible — the main point of the tool. Now:
- Backend: utfcn_core split into build_context / build_index / match. build_index
also emits curated candidates for uninstalled source types (curated-only), and
a new POST /utfcn/match matches missing nodes by their serialized signature
against installed core/other-pack nodes.
- Frontend: nodeType() reads a missing placeholder's last_serialization.type;
matchMissing() feeds serialized slots to /utfcn/match and merges the results;
the right-click item moved to a canvas-level getNodeMenuOptions patch so it
reaches missing placeholders too. Bulk dialog labels them "not installed".
Replace a missing node with core without installing its pack. Links are rewired
losslessly; widget values can't be carried for a node whose def is absent.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A ComfyUI companion that suggests core / available equivalents for custom
nodes and replaces them in a workflow.
- Backend (utfcn_core.py, __init__.py): read-only /utfcn/scan analysis that
ranks equivalents in three tiers (curated → exact-signature → partial
heuristic) from the live node registry.
- Frontend (web/utfcn.js): on-add mode (Off / Suggest / Force auto-replace),
bulk "Replace with core / available…" command + Extensions menu with a
preview-then-confirm dialog, and a right-click single-node replace. The swap
engine only rewires losslessly.
- mappings.json: 7 hand-verified curated rules mined from installed packs
(essentials, KJNodes, WAS); user_mappings.json for user overrides.
- Docs + branding: README, icon and social banner (SVG + PNG), GPL-3.0.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>