Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9f3bbb9
[backport cloud/1.36] fix: restore mask editor compatibility with Imp…
comfy-pr-bot Dec 30, 2025
4957cd3
[backport cloud/1.36] Guard downgrades via billing portal (#7820)
comfy-pr-bot Jan 1, 2026
8eb2ba0
[backport cloud/1.36] [feat] Filter out nlf model type from Upload Mo…
comfy-pr-bot Jan 8, 2026
e9c47e8
[backport cloud/1.36] [feat] Add async model upload with WebSocket pr…
comfy-pr-bot Jan 8, 2026
1de23b8
[backport cloud/1.36] feat: split asset_update_options_enabled into s…
comfy-pr-bot Jan 8, 2026
f1b874e
[backport cloud/1.36] feat: Stale-while-revalidate pattern for AssetB…
comfy-pr-bot Jan 8, 2026
2a15325
[backport cloud/1.36] Prevent nav item shrink (#7890)
comfy-pr-bot Jan 8, 2026
b4e4ccc
[backport cloud/1.36] Fix run badge anchoring (#7915)
comfy-pr-bot Jan 9, 2026
aecb841
[backport cloud/1.36] feature: model browser folder grouping (#7916)
comfy-pr-bot Jan 9, 2026
e912b42
[backport cloud/1.36] feat: add model download progress dialog (#7917)
comfy-pr-bot Jan 9, 2026
b9e6f3d
[backport cloud/1.36] feat: add HoneyToast component for persistent p…
luke-mino-altherr Jan 9, 2026
be8ee3d
[backport cloud/1.36] fix: Button sizing in modals and asset browser …
comfy-pr-bot Jan 9, 2026
ec7a3a9
[backport cloud/1.36] perf(AssetBrowserModal): virtualize asset grid …
comfy-pr-bot Jan 9, 2026
b53976c
[backport cloud/1.36] Feat(cloud)/new top up dialog (#7932)
simula-r Jan 9, 2026
4165f52
[backport cloud/1.36] fix: UX nits and styles (#7936)
comfy-pr-bot Jan 10, 2026
348d674
[backport cloud/1.36] fix: Model upload UI improvements (#7943)
comfy-pr-bot Jan 10, 2026
e84b6f3
[backport cloud/1.36] fix(UploadModel): truncate long filenames in wi…
comfy-pr-bot Jan 10, 2026
1abe3f2
[backport cloud/1.36] fix(upload-model): UI/UX improvements for Uploa…
comfy-pr-bot Jan 13, 2026
53d76c4
[backport cloud/1.36] fix: PrimitiveNode combo widget value not persi…
comfy-pr-bot Jan 13, 2026
7158e81
[backport cloud/1.36] disable workflow validation warnings by default…
comfy-pr-bot Jan 13, 2026
89a00fe
[backport cloud/1.36] CI: Use custom container for E2E tests (#7983)
comfy-pr-bot Jan 13, 2026
2d04cf4
[backport cloud/1.36] fix 3d-min-resize (#7985)
comfy-pr-bot Jan 13, 2026
7f83af3
[backport cloud/1.36] feat: add polling fallback for stale asset down…
DrJKL Jan 13, 2026
4963f59
[backport cloud/1.36] refactor: simplify asset download state and fix…
comfy-pr-bot Jan 13, 2026
19db196
[backport cloud/1.36] fix: Improve legacy widget compatibility in vue…
comfy-pr-bot Jan 13, 2026
fe48900
[backport cloud/1.36] fix: disable frustum culling for SkinnedMesh to…
comfy-pr-bot Jan 13, 2026
056308a
[backport cloud/1.36] fix: continue rendering when 3D animation is pl…
comfy-pr-bot Jan 13, 2026
9bf5176
[backport cloud/1.36] fix: prevent image preview resize issues when s…
comfy-pr-bot Jan 13, 2026
4a6a128
[backport cloud/1.36] fix(price-badges): improve Gemini and OpenAI ch…
comfy-pr-bot Jan 13, 2026
bc4b3d0
[backport cloud/1.36] fix(price-badges): add missing badge for WanRef…
comfy-pr-bot Jan 13, 2026
74ebfec
[backport cloud/1.36] Fix linked asset widget promotion in vue (#8003)
comfy-pr-bot Jan 13, 2026
dc0d859
[backport cloud/1.36] fix: respect node resizable property in vueNode…
comfy-pr-bot Jan 13, 2026
c28e60e
[backport cloud/1.36] fix: remove negative margin from legacy widget …
comfy-pr-bot Jan 13, 2026
eeb0fd3
[backport cloud/1.36] fix: enable immediate file saving for i18n tran…
comfy-pr-bot Jan 13, 2026
fca4931
[backport cloud/1.36] feat(price-badges): add price badges for Vidu2 …
comfy-pr-bot Jan 13, 2026
8e62359
[backport cloud/1.36] Fix reactivity washing in refreshNodeSlots (#8019)
comfy-pr-bot Jan 13, 2026
15955bd
[backport cloud/1.36] fix: wrap image preview navigation dots when ov…
comfy-pr-bot Jan 13, 2026
2da8338
[backport cloud/1.36] Dynamic input fixes (#8008)
comfy-pr-bot Jan 13, 2026
99f5b36
[backport cloud/1.36] feat: local/legacy settings dialog fix (#8004)
comfy-pr-bot Jan 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/actions/start-comfyui-server/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Start ComfyUI Server
description: 'Start ComfyUI server in a container environment (assumes ComfyUI is pre-installed)'

inputs:
front_end_root:
description: 'Path to frontend dist directory'
required: false
default: '$GITHUB_WORKSPACE/dist'
timeout:
description: 'Timeout in seconds for server startup'
required: false
default: '600'

runs:
using: 'composite'
steps:
- name: Copy devtools and start server
shell: bash
run: |
set -euo pipefail
cp -r ./tools/devtools/* /ComfyUI/custom_nodes/ComfyUI_devtools/
cd /ComfyUI && python3 main.py --cpu --multi-user --front-end-root "${{ inputs.front_end_root }}" &
wait-for-it --service 127.0.0.1:8188 -t ${{ inputs.timeout }}
106 changes: 46 additions & 60 deletions .github/workflows/ci-tests-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,66 +15,56 @@ concurrency:
jobs:
setup:
runs-on: ubuntu-latest
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
steps:
- name: Checkout repository
uses: actions/checkout@v5

# Setup Test Environment, build frontend but do not start server yet
- name: Setup ComfyUI server
uses: ./.github/actions/setup-comfyui-server
- name: Setup frontend
uses: ./.github/actions/setup-frontend
with:
include_build_step: true
- name: Setup Playwright
uses: ./.github/actions/setup-playwright # Setup Playwright and cache browsers

# Save the entire workspace as cache for later test jobs to restore
- name: Generate cache key
id: cache-key
run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT
- name: Save cache
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684

# Upload only built dist/ (containerized test jobs will pnpm install without cache)
- name: Upload built frontend
uses: actions/upload-artifact@v4
with:
path: .
key: comfyui-setup-${{ steps.cache-key.outputs.key }}
name: frontend-dist
path: dist/
retention-days: 1

# Sharded chromium tests
playwright-tests-chromium-sharded:
needs: setup
runs-on: ubuntu-latest
timeout-minutes: 60
container:
image: ghcr.io/comfy-org/comfyui-ci-container:0.0.8
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
packages: read
strategy:
fail-fast: false
matrix:
shardIndex: [1, 2, 3, 4, 5, 6, 7, 8]
shardTotal: [8]
steps:
# download built frontend repo from setup job
- name: Wait for cache propagation
run: sleep 10
- name: Restore cached setup
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684
- name: Checkout repository
uses: actions/checkout@v5
- name: Download built frontend
uses: actions/download-artifact@v4
with:
fail-on-cache-miss: true
path: .
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
name: frontend-dist
path: dist/

# Setup Test Environment for this runner, start server, use cached built frontend ./dist from 'setup' job
- name: Setup ComfyUI server
uses: ./.github/actions/setup-comfyui-server
with:
launch_server: true
- name: Setup nodejs, pnpm, reuse built frontend
uses: ./.github/actions/setup-frontend
- name: Setup Playwright
uses: ./.github/actions/setup-playwright
- name: Start ComfyUI server
uses: ./.github/actions/start-comfyui-server

# Run sharded tests and upload sharded reports
- name: Install frontend deps
run: pnpm install --frozen-lockfile

# Run sharded tests (browsers pre-installed in container)
- name: Run Playwright tests (Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
id: playwright
run: pnpm exec playwright test --project=chromium --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --reporter=blob
Expand All @@ -94,39 +84,37 @@ jobs:
timeout-minutes: 15
needs: setup
runs-on: ubuntu-latest
container:
image: ghcr.io/comfy-org/comfyui-ci-container:0.0.8
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
packages: read
strategy:
fail-fast: false
matrix:
browser: [chromium-2x, chromium-0.5x, mobile-chrome]
steps:
# download built frontend repo from setup job
- name: Wait for cache propagation
run: sleep 10
- name: Restore cached setup
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684
- name: Checkout repository
uses: actions/checkout@v5
- name: Download built frontend
uses: actions/download-artifact@v4
with:
fail-on-cache-miss: true
path: .
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
name: frontend-dist
path: dist/

# Setup Test Environment for this runner, start server, use cached built frontend ./dist from 'setup' job
- name: Setup ComfyUI server
uses: ./.github/actions/setup-comfyui-server
with:
launch_server: true
- name: Setup nodejs, pnpm, reuse built frontend
uses: ./.github/actions/setup-frontend
- name: Setup Playwright
uses: ./.github/actions/setup-playwright
- name: Start ComfyUI server
uses: ./.github/actions/start-comfyui-server

# Run tests and upload reports
- name: Install frontend deps
run: pnpm install --frozen-lockfile

# Run tests (browsers pre-installed in container)
- name: Run Playwright tests (${{ matrix.browser }})
id: playwright
run: |
# Run tests with blob reporter first
pnpm exec playwright test --project=${{ matrix.browser }} --reporter=blob
run: pnpm exec playwright test --project=${{ matrix.browser }} --reporter=blob
env:
PLAYWRIGHT_BLOB_OUTPUT_DIR: ./blob-report

Expand All @@ -147,7 +135,7 @@ jobs:
path: ./playwright-report/
retention-days: 30

# Merge sharded test reports
# Merge sharded test reports (no container needed - only runs CLI)
merge-reports:
needs: [playwright-tests-chromium-sharded]
runs-on: ubuntu-latest
Expand All @@ -156,11 +144,9 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v5

# Setup Test Environment, we only need playwright to merge reports
# Setup pnpm/node to run playwright merge-reports (no browsers needed)
- name: Setup frontend
uses: ./.github/actions/setup-frontend
- name: Setup Playwright
uses: ./.github/actions/setup-playwright

- name: Download blob reports
uses: actions/download-artifact@v4
Expand Down
114 changes: 52 additions & 62 deletions .github/workflows/pr-update-playwright-expectations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ jobs:
) &&
startsWith(github.event.comment.body, '/update-playwright') )
outputs:
cache-key: ${{ steps.cache-key.outputs.key }}
pr-number: ${{ steps.pr-info.outputs.pr-number }}
branch: ${{ steps.pr-info.outputs.branch }}
comment-id: ${{ steps.find-update-comment.outputs.comment-id }}
Expand Down Expand Up @@ -64,70 +63,63 @@ jobs:
uses: ./.github/actions/setup-frontend
with:
include_build_step: true
# Save expensive build artifacts (Python env, built frontend, node_modules)
# Source code will be checked out fresh in sharded jobs
- name: Generate cache key
id: cache-key
run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT
- name: Save cache
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684

# Upload built dist/ (containerized test jobs will pnpm install without cache)
- name: Upload built frontend
uses: actions/upload-artifact@v4
with:
path: |
ComfyUI
dist
key: comfyui-setup-${{ steps.cache-key.outputs.key }}
name: frontend-dist
path: dist/
retention-days: 1

# Sharded snapshot updates
update-snapshots-sharded:
needs: setup
runs-on: ubuntu-latest
container:
image: ghcr.io/comfy-org/comfyui-ci-container:0.0.8
credentials:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
permissions:
contents: read
packages: read
strategy:
fail-fast: false
matrix:
shardIndex: [1, 2, 3, 4]
shardTotal: [4]
steps:
# Checkout source code fresh (not cached)
- name: Checkout repository
uses: actions/checkout@v5
with:
ref: ${{ needs.setup.outputs.branch }}

# Restore expensive build artifacts from setup job
- name: Restore cached artifacts
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684
with:
fail-on-cache-miss: true
path: |
ComfyUI
dist
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}

- name: Setup ComfyUI server (from cache)
uses: ./.github/actions/setup-comfyui-server
- name: Download built frontend
uses: actions/download-artifact@v4
with:
launch_server: true
name: frontend-dist
path: dist/

- name: Setup nodejs, pnpm, reuse built frontend
uses: ./.github/actions/setup-frontend
- name: Start ComfyUI server
uses: ./.github/actions/start-comfyui-server

- name: Setup Playwright
uses: ./.github/actions/setup-playwright
- name: Install frontend deps
run: pnpm install --frozen-lockfile

# Run sharded tests with snapshot updates
# Run sharded tests with snapshot updates (browsers pre-installed in container)
- name: Update snapshots (Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
id: playwright-tests
run: pnpm exec playwright test --update-snapshots --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
continue-on-error: true

# Identify and stage only changed snapshot files
- name: Stage changed snapshot files
id: changed-snapshots
shell: bash
run: |
set -euo pipefail
echo "=========================================="
echo "STAGING CHANGED SNAPSHOTS (Shard ${{ matrix.shardIndex }})"
echo "=========================================="

# Configure git safe.directory for container environment
git config --global --add safe.directory "$(pwd)"

# Get list of changed snapshot files (including untracked/new files)
changed_files=$( (
Expand All @@ -136,43 +128,25 @@ jobs:
) | sort -u | grep -E '\-snapshots/' || true )

if [ -z "$changed_files" ]; then
echo "No snapshot changes in this shard"
echo "No snapshot changes in shard ${{ matrix.shardIndex }}"
echo "has-changes=false" >> $GITHUB_OUTPUT
exit 0
fi

echo "✓ Found changed files:"
echo "$changed_files"
file_count=$(echo "$changed_files" | wc -l)
echo "Count: $file_count"
echo "Shard ${{ matrix.shardIndex }}: $file_count changed snapshot(s):"
echo "$changed_files"
echo "has-changes=true" >> $GITHUB_OUTPUT
echo ""

# Create staging directory
# Copy changed files to staging directory
mkdir -p /tmp/changed_snapshots_shard

# Copy only changed files, preserving directory structure
# Strip 'browser_tests/' prefix to avoid double nesting
echo "Copying changed files to staging directory..."
while IFS= read -r file; do
# Skip paths that no longer exist (e.g. deletions)
if [ ! -f "$file" ]; then
echo " → (skipped; not a file) $file"
continue
fi
# Remove 'browser_tests/' prefix
[ -f "$file" ] || continue
file_without_prefix="${file#browser_tests/}"
# Create parent directories
mkdir -p "/tmp/changed_snapshots_shard/$(dirname "$file_without_prefix")"
# Copy file
cp "$file" "/tmp/changed_snapshots_shard/$file_without_prefix"
echo " → $file_without_prefix"
done <<< "$changed_files"

echo ""
echo "Staged files for upload:"
find /tmp/changed_snapshots_shard -type f

# Upload ONLY the changed files from this shard
- name: Upload changed snapshots
uses: actions/upload-artifact@v4
Expand Down Expand Up @@ -213,9 +187,15 @@ jobs:
echo "=========================================="
echo "DOWNLOADED SNAPSHOT FILES"
echo "=========================================="
find ./downloaded-snapshots -type f
echo ""
echo "Total files: $(find ./downloaded-snapshots -type f | wc -l)"
if [ -d "./downloaded-snapshots" ]; then
find ./downloaded-snapshots -type f
echo ""
echo "Total files: $(find ./downloaded-snapshots -type f | wc -l)"
else
echo "No snapshot artifacts downloaded (no changes in any shard)"
echo ""
echo "Total files: 0"
fi

# Merge only the changed files into browser_tests
- name: Merge changed snapshots
Expand All @@ -226,6 +206,16 @@ jobs:
echo "MERGING CHANGED SNAPSHOTS"
echo "=========================================="

# Check if any artifacts were downloaded
if [ ! -d "./downloaded-snapshots" ]; then
echo "No snapshot artifacts to merge"
echo "=========================================="
echo "MERGE COMPLETE"
echo "=========================================="
echo "Shards merged: 0"
exit 0
fi

# Verify target directory exists
if [ ! -d "browser_tests" ]; then
echo "::error::Target directory 'browser_tests' does not exist"
Expand Down
1 change: 1 addition & 0 deletions .i18nrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const { defineConfig } = require('@lobehub/i18n-cli');
module.exports = defineConfig({
modelName: 'gpt-4.1',
splitToken: 1024,
saveImmediately: true,
entry: 'src/locales/en',
entryLocale: 'en',
output: 'src/locales',
Expand Down
Loading