The frontend directory is declared once, in pyproject.toml as
`[tool.comfy] web = "javascript"`. This `WEB_DIRECTORY = "./web"` pointed at
a directory that no longer exists -- it was left behind when the JS moved to
javascript/ -- so it is dead today. It is also a trap.
ComfyUI registers the web folder in TWO independent code paths, and they key
the same dict differently (nodes.py):
pyproject [tool.comfy] web -> EXTENSION_WEB_DIRS[project.name] (:2280)
WEB_DIRECTORY -> EXTENSION_WEB_DIRS[module_name] (:2289)
They are separate `if` blocks guarded by os.path.isdir(), not a fallback
chain, and project.name is rarely the directory name. So the moment a `web/`
directory exists again -- a revert, a merge, a stray file -- BOTH paths
register the same folder under two different keys. GET /extensions then lists
every file twice, the browser imports each twice, and app.registerExtension
runs twice with the same name: the collision the javascript test level exists
to catch, and invisible to it, because the duplication is in registration
rather than in source.
Removing the stale declaration makes that unreachable instead of dormant.
Move web/ to javascript/ and declare it via [tool.comfy] web so the served
directory is explicit rather than positional.
comfy-test.toml moves to the current schema: [test.workflows] cuda (there is no
"gpu" key -- the accelerator is named by backend, and the old spelling parsed to
an empty list, so CUDA runners silently ran the full unfiltered set), an
explicit [test.platforms] platforms allowlist (per-platform booleans are no
longer supported), and the javascript level.
Declares the comfy-test config (levels + platform matrix), mirroring the
ComfyUI-SAM3 setup. Workflows run on GPU only; none on CPU since the
grounding models require GPU inference.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>