Commit Graph
76 Commits
Author SHA1 Message Date
Ethanfel dddb136b16 Fail closed on plain definition decorators 2026-07-02 21:45:00 +02:00
Ethanfel f0b83b5505 Preserve empty static display names 2026-07-02 21:37:18 +02:00
Ethanfel a2a5b44436 Fail closed after arbitrary assignment calls 2026-07-02 21:28:47 +02:00
Ethanfel d7c3fc86c1 Invalidate static env after arbitrary calls 2026-07-02 21:19:10 +02:00
Ethanfel ee8496174f Fail closed on no-arg arbitrary calls 2026-07-02 21:09:10 +02:00
Ethanfel 126f5db959 Fail closed on nested mutable env aliases 2026-07-02 20:58:31 +02:00
Ethanfel f23d4ae69a Resolve class lookups through namespace aliases 2026-07-02 20:51:12 +02:00
Ethanfel 42aeafd0e9 Fail closed on starred mapping alias duplicate safety 2026-07-02 20:43:28 +02:00
Ethanfel 49666141fa Fail closed on dynamic mapping duplicate safety 2026-07-02 20:34:35 +02:00
Ethanfel 11acb12658 Fail closed on namespace mapping replacements 2026-07-02 20:28:53 +02:00
Ethanfel 75224982ba Fail closed on ambiguous mapping duplicate keys 2026-07-02 20:21:04 +02:00
Ethanfel ecd8f7c082 Make signature artifact timestamps deterministic 2026-07-02 20:10:09 +02:00
Ethanfel 25b3f69d0d Fail closed on class-body signature references 2026-07-02 20:02:55 +02:00
Ethanfel 447a5c72dd Track alias mapping keys in duplicate preflight 2026-07-02 19:53:45 +02:00
Ethanfel 9792989216 Fail closed on mapping mutation keys and bare input specs 2026-07-02 19:46:55 +02:00
Ethanfel 7e7479fb6a Fail closed on class namespace alias mutations 2026-07-02 19:35:51 +02:00
Ethanfel 2d951c759a Fail closed on class-body namespace aliases 2026-07-02 19:28:44 +02:00
Ethanfel 52ac447e0e Track namespace alias mapping mutations 2026-07-02 19:21:19 +02:00
Ethanfel c45bf3c230 Fail closed on class-body mutations and duplicate inputs 2026-07-02 19:14:53 +02:00
Ethanfel 1b56798018 Fail closed on definition references and sticky mappings 2026-07-02 19:04:25 +02:00
Ethanfel 39b991800a Track chained input type aliases 2026-07-02 18:54:16 +02:00
Ethanfel a3bb718bd2 Fail closed on duplicate keys and observed calls 2026-07-02 18:49:21 +02:00
Ethanfel 73bdca9e1e Track chained static extraction aliases 2026-07-02 18:37:17 +02:00
Ethanfel 3cf4a5eb52 Fail closed on namespace dunders and metadata types 2026-07-02 18:29:47 +02:00
Ethanfel f7143e7bac Fail closed on namespace aliases and input observations 2026-07-02 18:19:48 +02:00
Ethanfel bf46f9b389 Fail closed on duplicate nodes and observed input types 2026-07-02 18:08:48 +02:00
Ethanfel 3219ec0c39 Track starred collection aliases in static extraction 2026-07-02 17:59:53 +02:00
Ethanfel c6d2b2d645 Invalidate mapped classes on signature attribute observation 2026-07-02 17:53:04 +02:00
Ethanfel 07822bc3ec Fail closed on arbitrary static extraction calls 2026-07-02 17:47:11 +02:00
Ethanfel 79d9921ba6 Track starred unpack aliases in static extraction 2026-07-02 17:37:06 +02:00
Ethanfel 5844a0a433 Track namespace-derived class aliases 2026-07-02 17:30:00 +02:00
Ethanfel b560f238a1 Cover type parameter class extraction hazards 2026-07-02 17:23:58 +02:00
Ethanfel 7c4b83ed0e Track namespace and getattr aliases 2026-07-02 17:19:07 +02:00
Ethanfel 065c9ae7ec Skip nontrivial class creation signatures 2026-07-02 17:12:50 +02:00
Ethanfel 34e53e8692 Invalidate namespace lookup mutations 2026-07-02 17:07:25 +02:00
Ethanfel 97e0126a1d Detect getattr mutating method calls 2026-07-02 17:01:08 +02:00
Ethanfel 2ad3cd3a09 Invalidate dynamic namespace mutations 2026-07-02 16:55:52 +02:00
Ethanfel d1f49e7c95 Track mapping and class attribute aliases 2026-07-02 16:47:39 +02:00
Ethanfel f26e441e03 Fail closed on invalid node mapping keys 2026-07-02 16:39:06 +02:00
Ethanfel 2c9452ae67 Fail closed on invalid display mappings 2026-07-02 16:35:19 +02:00
Ethanfel 7e4e85a0bd Fail closed on dynamic patches and displays 2026-07-02 16:27:48 +02:00
Ethanfel 9752248ee9 Track unpacked and class attribute aliases 2026-07-02 16:12:32 +02:00
Ethanfel 05fa411d47 Fail closed on walrus bindings and invalid input sections 2026-07-02 16:00:05 +02:00
Ethanfel f5d72b494d Fail closed on decorated input types and nested aliases 2026-07-02 15:47:17 +02:00
Ethanfel 86ea12924c Invalidate mappings on duplicate keys and class aliases 2026-07-02 15:34:50 +02:00
Ethanfel 51db0d16e5 Skip decorated and patched mapped classes 2026-07-02 15:19:22 +02:00
Ethanfel fc92d1db24 Invalidate static extraction for exception and type alias bindings 2026-07-02 15:08:19 +02:00
Ethanfel 8f872baf0b Invalidate inputs from class definition-time mutations 2026-07-02 14:56:13 +02:00
Ethanfel 317788572e Detect definition-time mutating expressions 2026-07-02 14:50:03 +02:00
Ethanfel 65c3a57052 Resolve node mappings at assignment time 2026-07-02 14:40:16 +02:00
Ethanfel 45e3cbaad8 Detect mutating calls inside statements 2026-07-02 14:29:04 +02:00
Ethanfel 6c2653c803 Fail closed on final input bindings and transitive aliases 2026-07-02 14:18:38 +02:00
Ethanfel 99d2bb25da Fail closed on mutable module captures in class signatures 2026-07-02 14:09:07 +02:00
Ethanfel 034e07269d Fail closed on class alias mutations 2026-07-02 13:58:58 +02:00
Ethanfel bebd4e09aa Resolve input and class attribute environments correctly 2026-07-02 13:53:45 +02:00
Ethanfel 67b875cdd5 Require mapped classes to remain top-level bindings 2026-07-02 13:45:45 +02:00
Ethanfel 90b7e3e872 Fail closed on invalid return name declarations 2026-07-02 13:34:13 +02:00
Ethanfel 0456e8033a Fail closed on invalid return names 2026-07-02 13:29:51 +02:00
Ethanfel 479a70f377 Evaluate class signatures with definition-time env 2026-07-02 13:24:02 +02:00
Ethanfel c8c1205bde Skip extraction after wildcard imports 2026-07-02 13:14:16 +02:00
Ethanfel b2b1bd16bd Invalidate static extraction on nested wildcard imports 2026-07-02 13:06:51 +02:00
Ethanfel 2845daf90c Invalidate static extraction on annotated aliases and wildcard imports 2026-07-02 12:58:24 +02:00
Ethanfel fae0c312bc Invalidate static extraction on rebinding and alias mutation 2026-07-02 12:50:06 +02:00
Ethanfel 21a29b8846 Invalidate static extraction on deletion and mutation 2026-07-02 12:39:38 +02:00
Ethanfel 6be0fe9d1e Fail closed on dynamic node mapping extraction 2026-07-02 12:29:27 +02:00
Ethanfel 6a4617f002 Fail closed on dynamic static extraction inputs 2026-07-02 12:23:09 +02:00
Ethanfel 960c41b330 Harden static signature extraction 2026-07-02 12:13:50 +02:00
Ethanfel 669f209930 Add popular node signature extractor 2026-07-02 12:06:19 +02:00
Ethanfel bf2f6f3b95 Respect serialized input names over generated signatures 2026-07-02 11:56:28 +02:00
Ethanfel 9c17083298 Harden generated signature matching 2026-07-02 11:47:07 +02:00
Ethanfel 38c142d42e Use generated signatures for missing node matching 2026-07-02 11:38:49 +02:00
Ethanfel 8c45016c00 Add generated signature loader 2026-07-02 11:29:54 +02:00
Ethanfel 55e59f5e1d Add popular node signature implementation plan 2026-07-02 11:23:29 +02:00
Ethanfel fef2b8b7f1 Add popular node signature design 2026-07-02 11:09:37 +02:00
EthanfelandClaude Opus 4.8 cc728eb50b Support uninstalled / missing nodes
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>
2026-07-02 10:43:13 +02:00
EthanfelandClaude Opus 4.8 16f4e93a3a Initial commit: UTFCN — Use The (F***ing) Core Nodes
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>
2026-07-02 10:26:30 +02:00