Skip to content

Commit 4b21ffb

Browse files
authored
Merge branch 'main' into app-startup-stage-tracking
2 parents ec04f84 + 6449d26 commit 4b21ffb

File tree

330 files changed

+18253
-3937
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

330 files changed

+18253
-3937
lines changed

.claude/commands/comprehensive-pr-review.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ This is critical for better file inspection:
6767

6868
Use git locally for much faster analysis:
6969

70-
1. Get list of changed files: `git diff --name-only "origin/$BASE_BRANCH" > changed_files.txt`
71-
2. Get the full diff: `git diff "origin/$BASE_BRANCH" > pr_diff.txt`
72-
3. Get detailed file changes with status: `git diff --name-status "origin/$BASE_BRANCH" > file_changes.txt`
70+
1. Get list of changed files: `git diff --name-only "$BASE_SHA" > changed_files.txt`
71+
2. Get the full diff: `git diff "$BASE_SHA" > pr_diff.txt`
72+
3. Get detailed file changes with status: `git diff --name-status "$BASE_SHA" > file_changes.txt`
7373

7474
### Step 1.5: Create Analysis Cache
7575

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313

1414
# Generated files
1515
src/types/comfyRegistryTypes.ts linguist-generated=true
16-
src/types/generatedManagerTypes.ts linguist-generated=true
16+
src/workbench/extensions/manager/types/generatedManagerTypes.ts linguist-generated=true

.github/workflows/backport.yaml

Lines changed: 96 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,61 @@ on:
44
pull_request_target:
55
types: [closed, labeled]
66
branches: [main]
7+
workflow_dispatch:
8+
inputs:
9+
pr_number:
10+
description: 'PR number to backport'
11+
required: true
12+
type: string
13+
force_rerun:
14+
description: 'Force rerun even if backports exist'
15+
required: false
16+
type: boolean
17+
default: false
718

819
jobs:
920
backport:
10-
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'needs-backport')
21+
if: >
22+
(github.event_name == 'pull_request_target' &&
23+
github.event.pull_request.merged == true &&
24+
contains(github.event.pull_request.labels.*.name, 'needs-backport')) ||
25+
github.event_name == 'workflow_dispatch'
1126
runs-on: ubuntu-latest
1227
permissions:
1328
contents: write
1429
pull-requests: write
1530
issues: write
1631

1732
steps:
33+
- name: Validate inputs for manual triggers
34+
if: github.event_name == 'workflow_dispatch'
35+
run: |
36+
# Validate PR number format
37+
if ! [[ "${{ inputs.pr_number }}" =~ ^[0-9]+$ ]]; then
38+
echo "::error::Invalid PR number format. Must be a positive integer."
39+
exit 1
40+
fi
41+
42+
# Validate PR exists and is merged
43+
if ! gh pr view "${{ inputs.pr_number }}" --json merged >/dev/null 2>&1; then
44+
echo "::error::PR #${{ inputs.pr_number }} not found or inaccessible."
45+
exit 1
46+
fi
47+
48+
MERGED=$(gh pr view "${{ inputs.pr_number }}" --json merged --jq '.merged')
49+
if [ "$MERGED" != "true" ]; then
50+
echo "::error::PR #${{ inputs.pr_number }} is not merged. Only merged PRs can be backported."
51+
exit 1
52+
fi
53+
54+
# Validate PR has needs-backport label
55+
if ! gh pr view "${{ inputs.pr_number }}" --json labels --jq '.labels[].name' | grep -q "needs-backport"; then
56+
echo "::error::PR #${{ inputs.pr_number }} does not have 'needs-backport' label."
57+
exit 1
58+
fi
59+
env:
60+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61+
1862
- name: Checkout repository
1963
uses: actions/checkout@v4
2064
with:
@@ -29,7 +73,7 @@ jobs:
2973
id: check-existing
3074
env:
3175
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32-
PR_NUMBER: ${{ github.event.pull_request.number }}
76+
PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }}
3377
run: |
3478
# Check for existing backport PRs for this PR number
3579
EXISTING_BACKPORTS=$(gh pr list --state all --search "backport-${PR_NUMBER}-to" --json title,headRefName,baseRefName | jq -r '.[].headRefName')
@@ -39,6 +83,13 @@ jobs:
3983
exit 0
4084
fi
4185
86+
# For manual triggers with force_rerun, proceed anyway
87+
if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ inputs.force_rerun }}" = "true" ]; then
88+
echo "skip=false" >> $GITHUB_OUTPUT
89+
echo "::warning::Force rerun requested - existing backports will be updated"
90+
exit 0
91+
fi
92+
4293
echo "Found existing backport PRs:"
4394
echo "$EXISTING_BACKPORTS"
4495
echo "skip=true" >> $GITHUB_OUTPUT
@@ -50,8 +101,17 @@ jobs:
50101
run: |
51102
# Extract version labels (e.g., "1.24", "1.22")
52103
VERSIONS=""
53-
LABELS='${{ toJSON(github.event.pull_request.labels) }}'
54-
for label in $(echo "$LABELS" | jq -r '.[].name'); do
104+
105+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
106+
# For manual triggers, get labels from the PR
107+
LABELS=$(gh pr view ${{ inputs.pr_number }} --json labels | jq -r '.labels[].name')
108+
else
109+
# For automatic triggers, extract from PR event
110+
LABELS='${{ toJSON(github.event.pull_request.labels) }}'
111+
LABELS=$(echo "$LABELS" | jq -r '.[].name')
112+
fi
113+
114+
for label in $LABELS; do
55115
# Match version labels like "1.24" (major.minor only)
56116
if [[ "$label" =~ ^[0-9]+\.[0-9]+$ ]]; then
57117
# Validate the branch exists before adding to list
@@ -75,12 +135,20 @@ jobs:
75135
if: steps.check-existing.outputs.skip != 'true'
76136
id: backport
77137
env:
78-
PR_NUMBER: ${{ github.event.pull_request.number }}
79-
PR_TITLE: ${{ github.event.pull_request.title }}
80-
MERGE_COMMIT: ${{ github.event.pull_request.merge_commit_sha }}
138+
PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }}
81139
run: |
82140
FAILED=""
83141
SUCCESS=""
142+
143+
# Get PR data for manual triggers
144+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
145+
PR_DATA=$(gh pr view ${{ inputs.pr_number }} --json title,mergeCommit)
146+
PR_TITLE=$(echo "$PR_DATA" | jq -r '.title')
147+
MERGE_COMMIT=$(echo "$PR_DATA" | jq -r '.mergeCommit.oid')
148+
else
149+
PR_TITLE="${{ github.event.pull_request.title }}"
150+
MERGE_COMMIT="${{ github.event.pull_request.merge_commit_sha }}"
151+
fi
84152
85153
for version in ${{ steps.versions.outputs.versions }}; do
86154
echo "::group::Backporting to core/${version}"
@@ -133,10 +201,18 @@ jobs:
133201
if: steps.check-existing.outputs.skip != 'true' && steps.backport.outputs.success
134202
env:
135203
GH_TOKEN: ${{ secrets.PR_GH_TOKEN }}
136-
PR_TITLE: ${{ github.event.pull_request.title }}
137-
PR_NUMBER: ${{ github.event.pull_request.number }}
138-
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
204+
PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }}
139205
run: |
206+
# Get PR data for manual triggers
207+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
208+
PR_DATA=$(gh pr view ${{ inputs.pr_number }} --json title,author)
209+
PR_TITLE=$(echo "$PR_DATA" | jq -r '.title')
210+
PR_AUTHOR=$(echo "$PR_DATA" | jq -r '.author.login')
211+
else
212+
PR_TITLE="${{ github.event.pull_request.title }}"
213+
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
214+
fi
215+
140216
for backport in ${{ steps.backport.outputs.success }}; do
141217
IFS=':' read -r version branch <<< "${backport}"
142218
@@ -165,9 +241,16 @@ jobs:
165241
env:
166242
GH_TOKEN: ${{ github.token }}
167243
run: |
168-
PR_NUMBER="${{ github.event.pull_request.number }}"
169-
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
170-
MERGE_COMMIT="${{ github.event.pull_request.merge_commit_sha }}"
244+
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
245+
PR_DATA=$(gh pr view ${{ inputs.pr_number }} --json author,mergeCommit)
246+
PR_NUMBER="${{ inputs.pr_number }}"
247+
PR_AUTHOR=$(echo "$PR_DATA" | jq -r '.author.login')
248+
MERGE_COMMIT=$(echo "$PR_DATA" | jq -r '.mergeCommit.oid')
249+
else
250+
PR_NUMBER="${{ github.event.pull_request.number }}"
251+
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
252+
MERGE_COMMIT="${{ github.event.pull_request.merge_commit_sha }}"
253+
fi
171254
172255
for failure in ${{ steps.backport.outputs.failed }}; do
173256
IFS=':' read -r version reason conflicts <<< "${failure}"

.github/workflows/i18n-custom-nodes.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ jobs:
3232
with:
3333
repository: Comfy-Org/ComfyUI_frontend
3434
path: ComfyUI_frontend
35-
- name: Checkout ComfyUI_devtools
36-
uses: actions/checkout@v4
37-
with:
38-
repository: Comfy-Org/ComfyUI_devtools
39-
path: ComfyUI/custom_nodes/ComfyUI_devtools
35+
- name: Copy ComfyUI_devtools from frontend repo
36+
run: |
37+
mkdir -p ComfyUI/custom_nodes/ComfyUI_devtools
38+
cp -r ComfyUI_frontend/tools/devtools/* ComfyUI/custom_nodes/ComfyUI_devtools/
4039
- name: Checkout custom node repository
4140
uses: actions/checkout@v4
4241
with:

.github/workflows/test-ui.yaml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,10 @@ jobs:
2727
repository: 'Comfy-Org/ComfyUI_frontend'
2828
path: 'ComfyUI_frontend'
2929

30-
- name: Checkout ComfyUI_devtools
31-
uses: actions/checkout@v4
32-
with:
33-
repository: 'Comfy-Org/ComfyUI_devtools'
34-
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
35-
ref: 'd05fd48dd787a4192e16802d4244cfcc0e2f9684'
30+
- name: Copy ComfyUI_devtools from frontend repo
31+
run: |
32+
mkdir -p ComfyUI/custom_nodes/ComfyUI_devtools
33+
cp -r ComfyUI_frontend/tools/devtools/* ComfyUI/custom_nodes/ComfyUI_devtools/
3634
3735
- name: Install pnpm
3836
uses: pnpm/action-setup@v4

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ components.d.ts
4444
tests-ui/data/*
4545
tests-ui/ComfyUI_examples
4646
tests-ui/workflows/examples
47+
coverage/
4748

4849
# Browser tests
4950
/test-results/

.i18nrc.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module.exports = defineConfig({
99
entry: 'src/locales/en',
1010
entryLocale: 'en',
1111
output: 'src/locales',
12-
outputLocales: ['zh', 'zh-TW', 'ru', 'ja', 'ko', 'fr', 'es', 'ar'],
12+
outputLocales: ['zh', 'zh-TW', 'ru', 'ja', 'ko', 'fr', 'es', 'ar', 'tr'],
1313
reference: `Special names to keep untranslated: flux, photomaker, clip, vae, cfg, stable audio, stable cascade, stable zero, controlnet, lora, HiDream.
1414
'latent' is the short form of 'latent space'.
1515
'mask' is in the context of image processing.

CODEOWNERS

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,61 @@
1-
# Admins
2-
* @Comfy-Org/comfy_frontend_devs
1+
# Desktop/Electron
2+
/src/types/desktop/ @webfiltered
3+
/src/constants/desktopDialogs.ts @webfiltered
4+
/src/constants/desktopMaintenanceTasks.ts @webfiltered
5+
/src/stores/electronDownloadStore.ts @webfiltered
6+
/src/extensions/core/electronAdapter.ts @webfiltered
7+
/src/views/DesktopDialogView.vue @webfiltered
8+
/src/components/install/ @webfiltered
9+
/src/components/maintenance/ @webfiltered
10+
/vite.electron.config.mts @webfiltered
311

4-
# Maintainers
5-
*.md @Comfy-Org/comfy_maintainer
6-
/tests-ui/ @Comfy-Org/comfy_maintainer
7-
/browser_tests/ @Comfy-Org/comfy_maintainer
8-
/.env_example @Comfy-Org/comfy_maintainer
12+
# Common UI Components
13+
/src/components/chip/ @viva-jinyi
14+
/src/components/card/ @viva-jinyi
15+
/src/components/button/ @viva-jinyi
16+
/src/components/input/ @viva-jinyi
917

10-
# Translations (AIGODLIKE team + shinshin86)
11-
/src/locales/ @Yorha4D @KarryCharon @DorotaLuna @shinshin86 @Comfy-Org/comfy_maintainer
18+
# Topbar
19+
/src/components/topbar/ @pythongosssss
1220

13-
# Load 3D extension
14-
/src/extensions/core/load3d.ts @jtydhr88 @Comfy-Org/comfy_frontend_devs
21+
# Thumbnail
22+
/src/renderer/core/thumbnail/ @pythongosssss
1523

16-
# Mask Editor extension
17-
/src/extensions/core/maskeditor.ts @brucew4yn3rp @trsommer @Comfy-Org/comfy_frontend_devs
24+
# Legacy UI
25+
/scripts/ui/ @pythongosssss
26+
27+
# Link rendering
28+
/src/renderer/core/canvas/links/ @benceruleanlu
29+
30+
# Node help system
31+
/src/utils/nodeHelpUtil.ts @benceruleanlu
32+
/src/stores/workspace/nodeHelpStore.ts @benceruleanlu
33+
/src/services/nodeHelpService.ts @benceruleanlu
34+
35+
# Selection toolbox
36+
/src/components/graph/selectionToolbox/ @Myestery
37+
38+
# Minimap
39+
/src/renderer/extensions/minimap/ @jtydhr88
40+
41+
# Assets
42+
/src/platform/assets/ @arjansingh
43+
44+
# Workflow Templates
45+
/src/platform/workflow/templates/ @Myestery @christian-byrne @comfyui-wiki
46+
/src/components/templates/ @Myestery @christian-byrne @comfyui-wiki
47+
48+
# Mask Editor
49+
/src/extensions/core/maskeditor.ts @trsommer @brucew4yn3rp
50+
/src/extensions/core/maskEditorLayerFilenames.ts @trsommer @brucew4yn3rp
51+
/src/extensions/core/maskEditorOld.ts @trsommer @brucew4yn3rp
52+
53+
# 3D
54+
/src/extensions/core/load3d.ts @jtydhr88
55+
/src/components/load3d/ @jtydhr88
56+
57+
# Manager
58+
/src/workbench/extensions/manager/ @viva-jinyi @christian-byrne @ltdrdata
59+
60+
# Translations
61+
/src/locales/ @Yorha4D @KarryCharon @shinshin86 @Comfy-Org/comfy_maintainer

browser_tests/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ Without this flag, parallel tests will conflict and fail randomly.
1616

1717
### ComfyUI devtools
1818

19-
Clone <https://github.com/Comfy-Org/ComfyUI_devtools> to your `custom_nodes` directory.
19+
ComfyUI_devtools is now included in this repository under `tools/devtools/`. During CI/CD, these files are automatically copied to the `custom_nodes` directory.
2020
_ComfyUI_devtools adds additional API endpoints and nodes to ComfyUI for browser testing._
2121

22+
For local development, copy the devtools files to your ComfyUI installation:
23+
```bash
24+
cp -r tools/devtools/* /path/to/your/ComfyUI/custom_nodes/ComfyUI_devtools/
25+
```
26+
2227
### Node.js & Playwright Prerequisites
2328

2429
Ensure you have Node.js v20 or v22 installed. Then, set up the Chromium test driver:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"id":"4412323e-2509-4258-8abc-68ddeea8f9e1","revision":0,"last_node_id":39,"last_link_id":29,"nodes":[{"id":37,"type":"KSampler","pos":[3635.923095703125,870.237548828125],"size":[428,437],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"MODEL","link":null},{"localized_name":"positive","name":"positive","type":"CONDITIONING","link":null},{"localized_name":"negative","name":"negative","type":"CONDITIONING","link":null},{"localized_name":"latent_image","name":"latent_image","type":"LATENT","link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"cfg","name":"cfg","type":"FLOAT","widget":{"name":"cfg"},"link":null},{"localized_name":"sampler_name","name":"sampler_name","type":"COMBO","widget":{"name":"sampler_name"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"denoise","name":"denoise","type":"FLOAT","widget":{"name":"denoise"},"link":null}],"outputs":[{"localized_name":"LATENT","name":"LATENT","type":"LATENT","links":null}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[0,"randomize",20,8,"euler","simple",1]},{"id":38,"type":"VAEDecode","pos":[4164.01611328125,925.5230712890625],"size":[193.25,107],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"samples","name":"samples","type":"LATENT","link":null},{"localized_name":"vae","name":"vae","type":"VAE","link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":null}],"properties":{"Node name for S&R":"VAEDecode"}},{"id":39,"type":"CLIPTextEncode","pos":[3259.289794921875,927.2508544921875],"size":[239.9375,155],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"clip","name":"clip","type":"CLIP","link":null},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null}],"outputs":[{"localized_name":"CONDITIONING","name":"CONDITIONING","type":"CONDITIONING","links":null}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":[""]}],"links":[],"groups":[],"config":{},"extra":{"ds":{"scale":1.1576250000000001,"offset":[-2808.366467322067,-478.34316506594797]}},"version":0.4}

0 commit comments

Comments
 (0)