From aa943ac565bff62d6405d14544c44543c676af7e Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:15:56 -0700 Subject: [PATCH 01/69] CI: Remove .cache caching from GitHub Actions workflows (#6097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Overview Removes **all `actions/cache` steps** from GitHub Actions workflows after empirical testing showed that they actually **slow down CI/CD by 11%** rather than speeding it up. ## Context As discussed in #5988, the codebase has evolved with components moving into the `/packages` directory structure. The review comment suggested removing the entire `actions/cache` step rather than just the `.cache` path to properly evaluate performance impact. ## Performance Benchmark Results Empirical testing on this PR (commits 38695ae0b vs ab16635c5) revealed that **removing cache steps improves CI performance across all workflows**: | Workflow | WITHOUT Cache | WITH Cache | Improvement | |----------|---------------|------------|-------------| | **CI: Lint Format** | 208s (3m 28s) | 226s (3m 46s) | **-18s (-8.7%)** ⚡ | | **CI: Tests Unit** | 160s (2m 40s) | 177s (2m 57s) | **-17s (-10.6%)** ⚡ | | **CI: Tests Storybook** | 65s (1m 5s) | 78s (1m 18s) | **-13s (-20.0%)** ⚡ | | **Total Pipeline** | **433s (7m 13s)** | **481s (8m 1s)** | **-48s (-11.1%)** ⚡ | ### Why is caching slower? 1. **Cache overhead exceeds benefits**: Time spent saving/restoring cache > time saved from cached content 2. **Complex cache key computation**: Hash calculations for file patterns add processing time 3. **Network I/O cost**: Each cache step adds network round-trips 4. **Tools already optimize incrementally**: ESLint, Vitest, Prettier handle their own incremental checks efficiently ## Changes Removed the entire `actions/cache` step from 8 workflow files: - `ci-lint-format.yaml` - Removed tool outputs cache (.eslintcache, .prettierCache, .knip-cache, tsconfig.tsbuildinfo) - `ci-tests-storybook.yaml` - Removed storybook-static and tsconfig.tsbuildinfo cache (both jobs) - `ci-tests-unit.yaml` - Removed coverage and .vitest-cache - `api-update-electron-api-types.yaml` - Removed tsconfig.tsbuildinfo cache - `api-update-manager-api-types.yaml` - Removed tool cache and ComfyUI-Manager repo cache - `api-update-registry-api-types.yaml` - Removed tool cache and comfy-api repo cache - `release-draft-create.yaml` - Removed tsconfig.tsbuildinfo cache - `release-pypi-dev.yaml` - Removed dist and tsconfig.tsbuildinfo cache **What remains cached:** - ✅ pnpm packages via `cache: 'pnpm'` in setup-node actions (the most valuable cache) - ✅ Tool-specific incremental caches generated fresh each run - ✅ Docker layer caching (where applicable) ## Testing - ✅ Empirical performance testing completed (see benchmark results above) - ✅ All cache steps removed successfully - ✅ No structural changes to workflow logic - ✅ pnpm package caching remains active ## Conclusion The benchmark data clearly shows that removing `actions/cache` steps results in **faster, simpler CI workflows**. The overhead of cache management exceeds any benefit, especially with pnpm package caching already handling the most time-consuming dependency installations. **Recommendation: ✅ Proceed with this change** ## Test Methodology 1. **WITHOUT cache** (commit [38695ae0b](https://github.com/Comfy-Org/ComfyUI_frontend/commit/38695ae0b)): Removed all `actions/cache` steps → [Workflow run](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/18654024806) 2. **WITH cache** (commit [ab16635c5](https://github.com/Comfy-Org/ComfyUI_frontend/commit/ab16635c5)): Temporarily restored all `actions/cache` steps → [Workflow run](https://github.com/Comfy-Org/ComfyUI_frontend/actions/runs/18654143363) 3. **Final state** (commit [3ce876f87](https://github.com/Comfy-Org/ComfyUI_frontend/commit/3ce876f87)): Restored no-cache version (current) Fixes #5988 --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: snomiao <7323030+snomiao@users.noreply.github.com> Co-authored-by: snomiao Co-authored-by: Claude --- .../api-update-electron-api-types.yaml | 9 ------- .../api-update-manager-api-types.yaml | 17 ------------ .../api-update-registry-api-types.yaml | 17 ------------ .github/workflows/ci-lint-format.yaml | 15 ----------- .github/workflows/ci-tests-storybook.yaml | 26 ------------------- .github/workflows/ci-tests-unit.yaml | 13 ---------- .github/workflows/release-draft-create.yaml | 10 ------- .github/workflows/release-pypi-dev.yaml | 11 -------- 8 files changed, 118 deletions(-) diff --git a/.github/workflows/api-update-electron-api-types.yaml b/.github/workflows/api-update-electron-api-types.yaml index 90a08e02c..c25742118 100644 --- a/.github/workflows/api-update-electron-api-types.yaml +++ b/.github/workflows/api-update-electron-api-types.yaml @@ -26,15 +26,6 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - electron-types-tools-cache-${{ runner.os }}- - - name: Update electron types run: pnpm install --workspace-root @comfyorg/comfyui-electron-types@latest diff --git a/.github/workflows/api-update-manager-api-types.yaml b/.github/workflows/api-update-manager-api-types.yaml index 5a1e8ec74..4961ae9d2 100644 --- a/.github/workflows/api-update-manager-api-types.yaml +++ b/.github/workflows/api-update-manager-api-types.yaml @@ -31,26 +31,9 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - update-manager-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Cache ComfyUI-Manager repository - uses: actions/cache@v4 - with: - path: ComfyUI-Manager - key: comfyui-manager-repo-${{ runner.os }}-${{ github.run_id }} - restore-keys: | - comfyui-manager-repo-${{ runner.os }}- - - name: Checkout ComfyUI-Manager repository uses: actions/checkout@v5 with: diff --git a/.github/workflows/api-update-registry-api-types.yaml b/.github/workflows/api-update-registry-api-types.yaml index 69b4ad5b2..41a3d0a7a 100644 --- a/.github/workflows/api-update-registry-api-types.yaml +++ b/.github/workflows/api-update-registry-api-types.yaml @@ -30,26 +30,9 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - update-registry-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Cache comfy-api repository - uses: actions/cache@v4 - with: - path: comfy-api - key: comfy-api-repo-${{ runner.os }}-${{ github.run_id }} - restore-keys: | - comfy-api-repo-${{ runner.os }}- - - name: Checkout comfy-api repository uses: actions/checkout@v5 with: diff --git a/.github/workflows/ci-lint-format.yaml b/.github/workflows/ci-lint-format.yaml index 5c4e0011b..71d5eed15 100644 --- a/.github/workflows/ci-lint-format.yaml +++ b/.github/workflows/ci-lint-format.yaml @@ -33,21 +33,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - .eslintcache - tsconfig.tsbuildinfo - .prettierCache - .knip-cache - key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }} - restore-keys: | - lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - lint-format-cache-${{ runner.os }}- - ci-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/ci-tests-storybook.yaml b/.github/workflows/ci-tests-storybook.yaml index 65e97ed91..77dcf5210 100644 --- a/.github/workflows/ci-tests-storybook.yaml +++ b/.github/workflows/ci-tests-storybook.yaml @@ -50,19 +50,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile @@ -115,19 +102,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/ci-tests-unit.yaml b/.github/workflows/ci-tests-unit.yaml index 152f78885..2f4417594 100644 --- a/.github/workflows/ci-tests-unit.yaml +++ b/.github/workflows/ci-tests-unit.yaml @@ -29,19 +29,6 @@ jobs: node-version: "lts/*" cache: "pnpm" - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - coverage - .vitest-cache - key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }} - restore-keys: | - vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - vitest-cache-${{ runner.os }}- - test-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/release-draft-create.yaml b/.github/workflows/release-draft-create.yaml index d26744f56..749523104 100644 --- a/.github/workflows/release-draft-create.yaml +++ b/.github/workflows/release-draft-create.yaml @@ -28,16 +28,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - tsconfig.tsbuildinfo - key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - release-tools-cache-${{ runner.os }}- - - name: Get current version id: current_version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT diff --git a/.github/workflows/release-pypi-dev.yaml b/.github/workflows/release-pypi-dev.yaml index 1bb375025..868321759 100644 --- a/.github/workflows/release-pypi-dev.yaml +++ b/.github/workflows/release-pypi-dev.yaml @@ -25,17 +25,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - dist - tsconfig.tsbuildinfo - key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - dev-release-tools-cache-${{ runner.os }}- - - name: Get current version id: current_version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT From 80013bcd5c7e45249083e328a2f7c1ba9d1a6a1c Mon Sep 17 00:00:00 2001 From: sno Date: Tue, 21 Oct 2025 05:11:22 +0900 Subject: [PATCH 02/69] [bugfix] Fix i18n linting errors (#6170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Fix i18n linting errors by adding missing locale keys to `src/locales/en/main.json` - Update all affected components to use `$t()` for internationalization ## Changes Added the following locale keys: - `comfyOrgLogoAlt`: "ComfyOrg Logo" - `comfy`: "Comfy" - `pressKeysForNewBinding`: "Press keys for new binding" - `defaultBanner`: "default banner" - `enableOrDisablePack`: "Enable or disable pack" - `openManager`: "Open Manager" - `graphNavigation`: "Graph navigation" Updated components to use i18n keys: - `ComfyOrgHeader.vue` - `KeybindingPanel.vue` - `PackBanner.vue` - `PackIcon.vue` - `PackEnableToggle.vue` - `LoadWorkflowWarning.vue` - `SubgraphBreadcrumb.vue` - `SignInContent.vue` ## Test plan - [x] Run `pnpm lint` - all i18n linting errors resolved - [x] Pre-commit hooks pass Aim to make #5625 CI/CD pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6170-bugfix-Fix-i18n-linting-errors-2926d73d365081c3b7fbcbbf4a8e03d6) by [Unito](https://www.unito.io) Co-authored-by: Claude --- src/components/breadcrumb/SubgraphBreadcrumb.vue | 2 +- src/components/dialog/content/LoadWorkflowWarning.vue | 7 ++++++- src/components/dialog/content/SignInContent.vue | 2 +- src/components/dialog/content/setting/KeybindingPanel.vue | 2 +- src/components/dialog/header/ComfyOrgHeader.vue | 2 +- src/locales/en/main.json | 7 +++++++ .../manager/components/manager/button/PackEnableToggle.vue | 4 ++-- .../manager/components/manager/packBanner/PackBanner.vue | 2 +- .../manager/components/manager/packIcon/PackIcon.vue | 2 +- 9 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/components/breadcrumb/SubgraphBreadcrumb.vue b/src/components/breadcrumb/SubgraphBreadcrumb.vue index 4d6c82671..c5ee7ab71 100644 --- a/src/components/breadcrumb/SubgraphBreadcrumb.vue +++ b/src/components/breadcrumb/SubgraphBreadcrumb.vue @@ -18,7 +18,7 @@ class="w-fit rounded-lg p-0" :model="items" :pt="{ item: { class: 'pointer-events-auto' } }" - aria-label="Graph navigation" + :aria-label="$t('g.graphNavigation')" > diff --git a/src/components/dialog/content/SignInContent.vue b/src/components/dialog/content/SignInContent.vue index a6bb0e890..19da83125 100644 --- a/src/components/dialog/content/SignInContent.vue +++ b/src/components/dialog/content/SignInContent.vue @@ -89,7 +89,7 @@ Comfy {{ t('auth.login.useApiKey') }} diff --git a/src/components/dialog/content/setting/KeybindingPanel.vue b/src/components/dialog/content/setting/KeybindingPanel.vue index 6117d5ea8..861ec9bc6 100644 --- a/src/components/dialog/content/setting/KeybindingPanel.vue +++ b/src/components/dialog/content/setting/KeybindingPanel.vue @@ -89,7 +89,7 @@ ref="keybindingInput" class="mb-2 text-center" :model-value="newBindingKeyCombo?.toString() ?? ''" - placeholder="Press keys for new binding" + :placeholder="$t('g.pressKeysForNewBinding')" autocomplete="off" fluid @keydown.stop.prevent="captureKeybinding" diff --git a/src/components/dialog/header/ComfyOrgHeader.vue b/src/components/dialog/header/ComfyOrgHeader.vue index 8a8a0afa2..d4fc3a458 100644 --- a/src/components/dialog/header/ComfyOrgHeader.vue +++ b/src/components/dialog/header/ComfyOrgHeader.vue @@ -3,7 +3,7 @@
ComfyOrg Logo diff --git a/src/locales/en/main.json b/src/locales/en/main.json index b23d88902..210468449 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -36,6 +36,8 @@ "import": "Import", "loadAllFolders": "Load All Folders", "logoAlt": "ComfyUI Logo", + "comfyOrgLogoAlt": "ComfyOrg Logo", + "comfy": "Comfy", "refresh": "Refresh", "refreshNode": "Refresh Node", "terminal": "Terminal", @@ -88,6 +90,11 @@ "no": "No", "cancel": "Cancel", "close": "Close", + "pressKeysForNewBinding": "Press keys for new binding", + "defaultBanner": "default banner", + "enableOrDisablePack": "Enable or disable pack", + "openManager": "Open Manager", + "graphNavigation": "Graph navigation", "dropYourFileOr": "Drop your file or", "back": "Back", "next": "Next", diff --git a/src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue b/src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue index be162c571..c032f5ba9 100644 --- a/src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue +++ b/src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue @@ -16,14 +16,14 @@ :model-value="isEnabled" :disabled="isLoading" :readonly="!canToggleDirectly" - aria-label="Enable or disable pack" + :aria-label="$t('g.enableOrDisablePack')" @focus="handleToggleInteraction" />
diff --git a/src/workbench/extensions/manager/components/manager/packBanner/PackBanner.vue b/src/workbench/extensions/manager/components/manager/packBanner/PackBanner.vue index ffb158fa1..cce839e22 100644 --- a/src/workbench/extensions/manager/components/manager/packBanner/PackBanner.vue +++ b/src/workbench/extensions/manager/components/manager/packBanner/PackBanner.vue @@ -4,7 +4,7 @@
default banner
diff --git a/src/workbench/extensions/manager/components/manager/packIcon/PackIcon.vue b/src/workbench/extensions/manager/components/manager/packIcon/PackIcon.vue index 0d753267a..d1375ff2f 100644 --- a/src/workbench/extensions/manager/components/manager/packIcon/PackIcon.vue +++ b/src/workbench/extensions/manager/components/manager/packIcon/PackIcon.vue @@ -4,7 +4,7 @@
default banner
From 9ae66c778d86ba93673afc56f3ca0f0c37966780 Mon Sep 17 00:00:00 2001 From: AustinMroz Date: Mon, 20 Oct 2025 20:22:30 -0700 Subject: [PATCH 03/69] Fix nodeDef resolution for virtual nodes. (#6175) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit image Virtual nodes (like primitives) don't have a nodeData. As a result, the existing call to attempt lookup from a node instance fails. This is fixed by adding `node.type` as a fallback ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6175-Fix-nodeDef-resolution-for-virtual-nodes-2936d73d365081b0abfcfe8532a50f8e) by [Unito](https://www.unito.io) --- src/stores/nodeDefStore.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/stores/nodeDefStore.ts b/src/stores/nodeDefStore.ts index 25e82a93c..232bba7fb 100644 --- a/src/stores/nodeDefStore.ts +++ b/src/stores/nodeDefStore.ts @@ -342,8 +342,7 @@ export const useNodeDefStore = defineStore('nodeDef', () => { nodeDefsByDisplayName.value[nodeDef.display_name] = nodeDefImpl } function fromLGraphNode(node: LGraphNode): ComfyNodeDefImpl | null { - // Frontend-only nodes don't have nodeDef - const nodeTypeName = node.constructor?.nodeData?.name + const nodeTypeName = node.constructor?.nodeData?.name ?? node.type if (!nodeTypeName) return null const nodeDef = nodeDefsByName.value[nodeTypeName] ?? null return nodeDef From 6f8789b9aad0f74b7e8a711b505bf4ba05c10ed7 Mon Sep 17 00:00:00 2001 From: filtered <176114999+webfiltered@users.noreply.github.com> Date: Wed, 22 Oct 2025 04:30:52 +1100 Subject: [PATCH 04/69] Fix asset path resolution in desktop GPU picker (#6178) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes regression where desktop UI GPU picker images failed to load due to incorrect absolute path resolution. ## Changes - **What**: Converts absolute image paths to relative paths with `./` prefix in GpuPicker component - **Breaking**: None ## Review Focus ESLint rule incorrectly flagged relative paths as errors, leading to use of absolute paths that don't resolve correctly in desktop app context. The change is just adding `.` to the start of two lines. ESLint rules reorganised the rest. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6178-Fix-asset-path-resolution-in-desktop-GPU-picker-2936d73d3650814e9d0df9faf8e28733) by [Unito](https://www.unito.io) --- .../src/components/install/GpuPicker.vue | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/desktop-ui/src/components/install/GpuPicker.vue b/apps/desktop-ui/src/components/install/GpuPicker.vue index 0a8cac0a9..98dddb762 100644 --- a/apps/desktop-ui/src/components/install/GpuPicker.vue +++ b/apps/desktop-ui/src/components/install/GpuPicker.vue @@ -1,17 +1,17 @@