The section never held nodes -- every entry is a whole pack repo. Read
literally, `[node_reqs]` says "the requirements of my node", which is pip
packages, and that section genuinely exists one file over as [dependencies]
in comfy-env.toml. `[node_packs]` names the unit and sits parallel to the
existing [cuda_packages].
Requires comfy-env >= 0.4.27, which renames the key with no shim: the root
file has a closed schema, so an old comfy-env rejects [node_packs] by name
and a new one rejects [node_reqs] by name. Neither fails silently.
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.
Vendor the viewer JavaScript into javascript/ and drop the
comfy-3d-viewers dependency. The viewers were previously copied into web/ at
every startup by prestartup_script.py, which made the served frontend depend on
a second package resolving at runtime.
Bundles are vendored as .mjs so ComfyUI's **/*.js auto-import glob skips them:
they are iframe-only and must never enter the shared main browser realm. Only
the widget entry points stay .js.
Also replace comfy_env.copy_files with a local helper. Its two extra features
(frame-derived source dir, silent no-op on a missing source) were unused here,
and the asset seeding now resolves the input directory through
folder_paths.get_input_directory() so it follows ComfyUI Desktop and
--input-directory instead of writing into the code tree.
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.
DisplayName becomes "DepthAnythingV3": the namespace enforced on
registerExtension names is derived from it, and the space in "Depth Anything
V3" made that prefix invalid.
Delete the 21 loose js/viewer/*.js modules -- they are already inside
viewer-bundle-vtk.mjs, so shipping them loose leaked the whole viewer into the
shared realm.
Three sites raised ValueError when max_depth landed in [0.95, 1.05],
on the assumption that values that close to 1.0 mean the depth was
normalized (and the geometric pipeline needs raw/metric depth).
The heuristic produces false positives on Apple Silicon CPU: the model
sometimes outputs raw depth with max=1.0302 there, where the same model
on x86 CPU produces values clearly outside the band. Result: macos-cpu
CI fails 1/4 workflows while linux-cpu / windows-cpu / windows-portable-cpu
all pass 4/4.
Demote raise -> logger.warning so the workflow continues. The downstream
pipeline tolerates non-metric depth (the result just isn't physically
scaled); blocking on a heuristic that flakes by platform isn't worth it.
Users still see the warning, can flip allow_around_1=True to silence,
or rewire to normalization_mode='Raw' if they actually wanted metric.
Sites patched:
- nodes_3d.py:197 — DepthAnythingV3_PointCloud
- nodes_3d.py:982 — DepthAnythingV3_Mesh
- nodes_multiview.py:689 — DepthAnythingV3_MultiViewPointCloud
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>