The previous publish.yml used `Comfy-Org/publish-node-action@main` to
upload the registry archive. That action runs its own internal
`actions/checkout@v4` step before zipping, which wipes the working
directory back to a fresh git checkout. Since `js/` and `web/` are
gitignored build outputs (Vite emits them per `[tool.comfy].includes`
in pyproject.toml force-includes them past .gitignore), our `pnpm run
build` step before the publish action got silently undone — the
upload zip ended up with empty `js/` + `web/` directories.
Observed in the v2.0.0 publish run (job 26577663233):
Creating zip file...
Including additional directories: js, web
Warning: Included directory 'js' does not exist, creating empty directory
Warning: Included directory 'web' does not exist, creating empty directory
Upload successful.
End-user impact: the registry-hosted v2.0.0 zip shipped with only the
Python engine (engine/, wp_nodes/, wp_api/) — no canvas widgets, no
manager SPA. ComfyUI loaded the Python side fine but every JS-driven
surface (Context widget, debug viewer, assembler helper, /wp/ SPA
route) failed to mount. Registry security scanner also flagged the
version (`NodeVersionStatusFlagged`), likely because of the empty
critical-include trees.
Fix: skip the wrapper action and call `comfy node publish` directly
via comfy-cli. No internal checkout means our `pnpm run build`
artifacts survive into the publish call.
Also added a `Verify build output` step that fails the job if `js/`
or `web/` is missing or empty after `pnpm run build`. Catches a
silently-broken build at the workflow level instead of letting it
become another empty registry archive.