Merge remote-tracking branch 'origin/main' into feat/new-workflow-templates

This commit is contained in:
Johnpaul
2025-08-27 22:53:16 +01:00
57 changed files with 12929 additions and 20016 deletions

View File

@@ -128,7 +128,25 @@ echo "Last stable release: $LAST_STABLE"
### Step 4: Analyze Dependency Updates ### Step 4: Analyze Dependency Updates
1. **Check significant dependency updates:** 1. **Use pnpm's built-in dependency analysis:**
```bash
# Get outdated dependencies with pnpm
pnpm outdated --format table > outdated-deps-${NEW_VERSION}.txt
# Check for license compliance
pnpm licenses ls --json > licenses-${NEW_VERSION}.json
# Analyze why specific dependencies exist
echo "Dependency analysis:" > dep-analysis-${NEW_VERSION}.md
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
for dep in "${MAJOR_DEPS[@]}"; do
echo -e "\n## $dep\n\`\`\`" >> dep-analysis-${NEW_VERSION}.md
pnpm why "$dep" >> dep-analysis-${NEW_VERSION}.md || echo "Not found" >> dep-analysis-${NEW_VERSION}.md
echo "\`\`\`" >> dep-analysis-${NEW_VERSION}.md
done
```
2. **Check for significant dependency updates:**
```bash ```bash
# Extract all dependency changes for major version bumps # Extract all dependency changes for major version bumps
OTHER_DEP_CHANGES="" OTHER_DEP_CHANGES=""
@@ -200,22 +218,48 @@ echo "Last stable release: $LAST_STABLE"
PR data: [contents of prs-${NEW_VERSION}.json] PR data: [contents of prs-${NEW_VERSION}.json]
``` ```
3. **Generate GTM notification:** 3. **Generate GTM notification using this EXACT Slack-compatible format:**
```bash ```bash
# Save to gtm-summary-${NEW_VERSION}.md based on analysis # Only create file if GTM-worthy features exist:
# If GTM-worthy features exist, include them with testing instructions if [ "$GTM_FEATURES_FOUND" = "true" ]; then
# If not, note that this is a maintenance/bug fix release cat > gtm-summary-${NEW_VERSION}.md << 'EOF'
*GTM Summary: ComfyUI Frontend v${NEW_VERSION}*
# Check if notification is needed
if grep -q "No marketing-worthy features" gtm-summary-${NEW_VERSION}.md; then _Disclaimer: the below is AI-generated_
echo "✅ No GTM notification needed for this release"
echo "📄 Summary saved to: gtm-summary-${NEW_VERSION}.md" 1. *[Feature Title]* (#[PR_NUMBER])
else * *Author:* @[username]
* *Demo:* [Media Link or "No demo available"]
* *Why users should care:* [One compelling sentence]
* *Key Features:*
* [Feature detail 1]
* [Feature detail 2]
2. *[Feature Title]* (#[PR_NUMBER])
* *Author:* @[username]
* *Demo:* [Media Link]
* *Why users should care:* [One compelling sentence]
* *Key Features:*
* [Feature detail 1]
* [Feature detail 2]
EOF
echo "📋 GTM summary saved to: gtm-summary-${NEW_VERSION}.md" echo "📋 GTM summary saved to: gtm-summary-${NEW_VERSION}.md"
echo "📤 Share this file in #gtm channel to notify the team" echo "📤 Share this file in #gtm channel to notify the team"
else
echo "✅ No GTM notification needed for this release"
echo "📄 No gtm-summary file created - no marketing-worthy features"
fi fi
``` ```
**CRITICAL Formatting Requirements:**
- Use single asterisk (*) for emphasis, NOT double (**)
- Use underscore (_) for italics
- Use 4 spaces for indentation (not tabs)
- Convert author names to @username format (e.g., "John Smith" → "@john")
- No section headers (#), no code language specifications
- Always include "Disclaimer: the below is AI-generated"
- Keep content minimal - no testing instructions, additional sections, etc.
### Step 6: Version Preview ### Step 6: Version Preview
**Version Preview:** **Version Preview:**
@@ -228,37 +272,42 @@ echo "Last stable release: $LAST_STABLE"
### Step 7: Security and Dependency Audit ### Step 7: Security and Dependency Audit
1. Run security audit: 1. Run pnpm security audit:
```bash ```bash
npm audit --audit-level moderate pnpm audit --audit-level moderate
pnpm licenses ls --summary
``` ```
2. Check for known vulnerabilities in dependencies 2. Check for known vulnerabilities in dependencies
3. Scan for hardcoded secrets or credentials: 3. Run comprehensive dependency health check:
```bash
pnpm doctor
```
4. Scan for hardcoded secrets or credentials:
```bash ```bash
git log -p ${BASE_TAG}..HEAD | grep -iE "(password|key|secret|token)" || echo "No sensitive data found" git log -p ${BASE_TAG}..HEAD | grep -iE "(password|key|secret|token)" || echo "No sensitive data found"
``` ```
4. Verify no sensitive data in recent commits 5. Verify no sensitive data in recent commits
5. **SECURITY REVIEW**: Address any critical findings before proceeding? 6. **SECURITY REVIEW**: Address any critical findings before proceeding?
### Step 8: Pre-Release Testing ### Step 8: Pre-Release Testing
1. Run complete test suite: 1. Run complete test suite:
```bash ```bash
npm run test:unit pnpm test:unit
npm run test:component pnpm test:component
``` ```
2. Run type checking: 2. Run type checking:
```bash ```bash
npm run typecheck pnpm typecheck
``` ```
3. Run linting (may have issues with missing packages): 3. Run linting (may have issues with missing packages):
```bash ```bash
npm run lint || echo "Lint issues - verify if critical" pnpm lint || echo "Lint issues - verify if critical"
``` ```
4. Test build process: 4. Test build process:
```bash ```bash
npm run build pnpm build
npm run build:types pnpm build:types
``` ```
5. **QUALITY GATE**: All tests and builds passing? 5. **QUALITY GATE**: All tests and builds passing?
@@ -488,7 +537,7 @@ echo "Workflow triggered. Waiting for PR creation..."
```bash ```bash
# Check npm availability # Check npm availability
for i in {1..10}; do for i in {1..10}; do
if npm view @comfyorg/comfyui-frontend-types@${NEW_VERSION} version >/dev/null 2>&1; then if pnpm view @comfyorg/comfyui-frontend-types@${NEW_VERSION} version >/dev/null 2>&1; then
echo "✅ npm package available" echo "✅ npm package available"
break break
fi fi

View File

@@ -80,7 +80,7 @@ For each commit:
- **CONFIRMATION REQUIRED**: Conflicts resolved correctly? - **CONFIRMATION REQUIRED**: Conflicts resolved correctly?
3. After successful cherry-pick: 3. After successful cherry-pick:
- Show the changes: `git show HEAD` - Show the changes: `git show HEAD`
- Run validation: `npm run typecheck && npm run lint` - Run validation: `pnpm typecheck && pnpm lint`
4. **CONFIRMATION REQUIRED**: Cherry-pick successful and valid? 4. **CONFIRMATION REQUIRED**: Cherry-pick successful and valid?
### Step 6: Create PR to Core Branch ### Step 6: Create PR to Core Branch
@@ -197,7 +197,7 @@ For each commit:
5. Track progress: 5. Track progress:
- GitHub release draft/publication - GitHub release draft/publication
- PyPI upload - PyPI upload
- npm types publication - pnpm types publication
### Step 12: Post-Release Verification ### Step 12: Post-Release Verification
@@ -211,7 +211,7 @@ For each commit:
``` ```
3. Verify npm package: 3. Verify npm package:
```bash ```bash
npm view @comfyorg/comfyui-frontend-types@1.23.5 pnpm view @comfyorg/comfyui-frontend-types@1.23.5
``` ```
4. Generate release summary with: 4. Generate release summary with:
- Version released - Version released

View File

@@ -5,7 +5,7 @@ Follow these steps systematically to verify our changes:
1. **Server Setup** 1. **Server Setup**
- Check if the dev server is running on port 5173 using browser navigation or port checking - Check if the dev server is running on port 5173 using browser navigation or port checking
- If not running, start it with `npm run dev` from the root directory - If not running, start it with `pnpm dev` from the root directory
- If the server fails to start, provide detailed troubleshooting steps by reading package.json and README.md for accurate instructions - If the server fails to start, provide detailed troubleshooting steps by reading package.json and README.md for accurate instructions
- Wait for the server to be fully ready before proceeding - Wait for the server to be fully ready before proceeding

View File

@@ -21,11 +21,16 @@ jobs:
with: with:
fetch-depth: 0 # Required for Chromatic baseline fetch-depth: 0 # Required for Chromatic baseline
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: '20' node-version: '20'
cache: 'npm' cache: 'pnpm'
- name: Get current time - name: Get current time
id: current-time id: current-time
@@ -58,14 +63,14 @@ jobs:
.cache .cache
storybook-static storybook-static
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }}
restore-keys: | restore-keys: |
storybook-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}- storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
storybook-cache-${{ runner.os }}- storybook-cache-${{ runner.os }}-
storybook-tools-cache-${{ runner.os }}- storybook-tools-cache-${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Build Storybook and run Chromatic - name: Build Storybook and run Chromatic
id: chromatic id: chromatic

View File

@@ -53,14 +53,20 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: '20' node-version: '20'
cache: 'pnpm'
- name: Install dependencies for analysis tools - name: Install dependencies for analysis tools
run: | run: |
npm install -g typescript @vue/compiler-sfc pnpm install -g typescript @vue/compiler-sfc
- name: Run Claude PR Review - name: Run Claude PR Review
uses: anthropics/claude-code-action@main uses: anthropics/claude-code-action@main

View File

@@ -16,10 +16,14 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
@@ -28,7 +32,7 @@ jobs:
.cache .cache
dist dist
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
dev-release-tools-cache-${{ runner.os }}- dev-release-tools-cache-${{ runner.os }}-
@@ -42,9 +46,9 @@ jobs:
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
USE_PROD_CONFIG: 'true' USE_PROD_CONFIG: 'true'
run: | run: |
npm ci pnpm install --frozen-lockfile
npm run build pnpm build
npm run zipdist pnpm zipdist
- name: Upload dist artifact - name: Upload dist artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:

View File

@@ -42,9 +42,14 @@ jobs:
with: with:
repository: ${{ inputs.owner }}/${{ inputs.repository }} repository: ${{ inputs.owner }}/${{ inputs.repository }}
path: 'ComfyUI/custom_nodes/${{ inputs.repository }}' path: 'ComfyUI/custom_nodes/${{ inputs.repository }}'
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'pnpm'
- uses: actions/setup-python@v4 - uses: actions/setup-python@v4
with: with:
python-version: '3.10' python-version: '3.10'
@@ -63,8 +68,8 @@ jobs:
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }} working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
- name: Build & Install ComfyUI_frontend - name: Build & Install ComfyUI_frontend
run: | run: |
npm ci pnpm install --frozen-lockfile
npm run build pnpm build
rm -rf ../ComfyUI/web/* rm -rf ../ComfyUI/web/*
mv dist/* ../ComfyUI/web/ mv dist/* ../ComfyUI/web/
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
@@ -79,18 +84,18 @@ jobs:
- name: Start dev server - name: Start dev server
# Run electron dev server as it is a superset of the web dev server # Run electron dev server as it is a superset of the web dev server
# We do want electron specific UIs to be translated. # We do want electron specific UIs to be translated.
run: npm run dev:electron & run: pnpm dev:electron &
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Capture base i18n - name: Capture base i18n
run: npx tsx scripts/diff-i18n capture run: npx tsx scripts/diff-i18n capture
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update en.json - name: Update en.json
run: npm run collect-i18n run: pnpm collect-i18n
env: env:
PLAYWRIGHT_TEST_URL: http://localhost:5173 PLAYWRIGHT_TEST_URL: http://localhost:5173
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update translations - name: Update translations
run: npm run locale run: pnpm locale
env: env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend

View File

@@ -13,22 +13,22 @@ jobs:
update-locales: update-locales:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3 - uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: npx playwright install chromium --with-deps run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Start dev server - name: Start dev server
# Run electron dev server as it is a superset of the web dev server # Run electron dev server as it is a superset of the web dev server
# We do want electron specific UIs to be translated. # We do want electron specific UIs to be translated.
run: npm run dev:electron & run: pnpm dev:electron &
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update en.json - name: Update en.json
run: npm run collect-i18n -- scripts/collect-i18n-node-defs.ts run: pnpm collect-i18n -- scripts/collect-i18n-node-defs.ts
env: env:
PLAYWRIGHT_TEST_URL: http://localhost:5173 PLAYWRIGHT_TEST_URL: http://localhost:5173
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update translations - name: Update translations
run: npm run locale run: pnpm locale
env: env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend

View File

@@ -1,22 +1,20 @@
name: Update Locales name: Update Locales
on: on:
# Manual dispatch for urgent translation updates
workflow_dispatch:
# Only trigger on PRs to main/master - additional branch filtering in job condition
pull_request: pull_request:
branches: [ main, master, dev* ] branches: [ main ]
paths-ignore: types: [opened, synchronize, reopened]
- '.github/**'
- '.husky/**'
- '.vscode/**'
- 'browser_tests/**'
- 'tests-ui/**'
jobs: jobs:
update-locales: update-locales:
# Don't run on fork PRs # Branch detection: Only run for manual dispatch or version-bump-* branches from main repo
if: github.event.pull_request.head.repo.full_name == github.repository if: github.event_name == 'workflow_dispatch' || (github.event.pull_request.head.repo.full_name == github.repository && startsWith(github.head_ref, 'version-bump-'))
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3 - uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
@@ -24,7 +22,7 @@ jobs:
path: | path: |
ComfyUI_frontend/.cache ComfyUI_frontend/.cache
ComfyUI_frontend/.cache ComfyUI_frontend/.cache
key: i18n-tools-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }} key: i18n-tools-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
i18n-tools-cache-${{ runner.os }}- i18n-tools-cache-${{ runner.os }}-
- name: Install Playwright Browsers - name: Install Playwright Browsers
@@ -33,15 +31,15 @@ jobs:
- name: Start dev server - name: Start dev server
# Run electron dev server as it is a superset of the web dev server # Run electron dev server as it is a superset of the web dev server
# We do want electron specific UIs to be translated. # We do want electron specific UIs to be translated.
run: npm run dev:electron & run: pnpm dev:electron &
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update en.json - name: Update en.json
run: npm run collect-i18n -- scripts/collect-i18n-general.ts run: pnpm collect-i18n -- scripts/collect-i18n-general.ts
env: env:
PLAYWRIGHT_TEST_URL: http://localhost:5173 PLAYWRIGHT_TEST_URL: http://localhost:5173
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Update translations - name: Update translations
run: npm run locale run: pnpm locale
env: env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend

View File

@@ -19,11 +19,16 @@ jobs:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0 fetch-depth: 0
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
@@ -34,20 +39,20 @@ jobs:
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
.prettierCache .prettierCache
.knip-cache .knip-cache
key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }} key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }}
restore-keys: | restore-keys: |
lint-format-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}- lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
lint-format-cache-${{ runner.os }}- lint-format-cache-${{ runner.os }}-
ci-tools-cache-${{ runner.os }}- ci-tools-cache-${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Run ESLint with auto-fix - name: Run ESLint with auto-fix
run: npm run lint:fix run: pnpm lint:fix
- name: Run Prettier with auto-format - name: Run Prettier with auto-format
run: npm run format run: pnpm format
- name: Check for changes - name: Check for changes
id: verify-changed-files id: verify-changed-files
@@ -69,9 +74,9 @@ jobs:
- name: Final validation - name: Final validation
run: | run: |
npm run lint pnpm lint
npm run format:check pnpm format:check
npm run knip pnpm knip
- name: Comment on PR about auto-fix - name: Comment on PR about auto-fix
if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository
@@ -96,5 +101,5 @@ jobs:
issue_number: context.issue.number, issue_number: context.issue.number,
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
body: '## ⚠️ Linting/Formatting Issues Found\n\nThis PR has linting or formatting issues that need to be fixed.\n\n**Since this PR is from a fork, auto-fix cannot be applied automatically.**\n\n### Option 1: Set up pre-commit hooks (recommended)\nRun this once to automatically format code on every commit:\n```bash\nnpm run prepare\n```\n\n### Option 2: Fix manually\nRun these commands and push the changes:\n```bash\nnpm run lint:fix\nnpm run format\n```\n\nSee [CONTRIBUTING.md](https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/CONTRIBUTING.md#git-pre-commit-hooks) for more details.' body: '## ⚠️ Linting/Formatting Issues Found\n\nThis PR has linting or formatting issues that need to be fixed.\n\n**Since this PR is from a fork, auto-fix cannot be applied automatically.**\n\n### Option 1: Set up pre-commit hooks (recommended)\nRun this once to automatically format code on every commit:\n```bash\npnpm prepare\n```\n\n### Option 2: Fix manually\nRun these commands and push the changes:\n```bash\npnpm lint:fix\npnpm format\n```\n\nSee [CONTRIBUTING.md](https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/CONTRIBUTING.md#git-pre-commit-hooks) for more details.'
}) })

View File

@@ -19,10 +19,14 @@ jobs:
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
@@ -30,7 +34,7 @@ jobs:
path: | path: |
.cache .cache
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
release-tools-cache-${{ runner.os }}- release-tools-cache-${{ runner.os }}-
@@ -53,9 +57,9 @@ jobs:
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
USE_PROD_CONFIG: 'true' USE_PROD_CONFIG: 'true'
run: | run: |
npm ci pnpm install --frozen-lockfile
npm run build pnpm build
npm run zipdist pnpm zipdist
- name: Upload dist artifact - name: Upload dist artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
@@ -125,10 +129,14 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'npm' cache: 'pnpm'
registry-url: https://registry.npmjs.org registry-url: https://registry.npmjs.org
- name: Cache tool outputs - name: Cache tool outputs
@@ -138,14 +146,14 @@ jobs:
.cache .cache
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
dist dist
key: types-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
types-tools-cache-${{ runner.os }}- types-tools-cache-${{ runner.os }}-
- run: npm ci - run: pnpm install --frozen-lockfile
- run: npm run build:types - run: pnpm build:types
- name: Publish package - name: Publish package
run: npm publish --access public run: pnpm publish --access public
working-directory: dist working-directory: dist
env: env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.event.label.name == 'New Browser Test Expectations' if: github.event.label.name == 'New Browser Test Expectations'
steps: steps:
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3 - uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: npx playwright install chromium --with-deps run: npx playwright install chromium --with-deps
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend

View File

@@ -37,11 +37,16 @@ jobs:
path: 'ComfyUI/custom_nodes/ComfyUI_devtools' path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
ref: 'd05fd48dd787a4192e16802d4244cfcc0e2f9684' ref: 'd05fd48dd787a4192e16802d4244cfcc0e2f9684'
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version: lts/*
cache: 'npm' cache: 'pnpm'
cache-dependency-path: 'ComfyUI_frontend/package-lock.json' cache-dependency-path: 'ComfyUI_frontend/pnpm-lock.yaml'
- name: Get current time - name: Get current time
id: current-time id: current-time
@@ -61,7 +66,7 @@ jobs:
--- ---
<img alt='claude-loading-gif' src="https://github.com/user-attachments/assets/5ac382c7-e004-429b-8e35-7feb3e8f9c6f" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" /> <img alt='comfy-loading-gif' src="https://github.com/user-attachments/assets/755c86ee-e445-4ea8-bc2c-cca85df48686" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
<bold>[${{ steps.current-time.outputs.time }} UTC] Preparing browser tests across multiple browsers...</bold> <bold>[${{ steps.current-time.outputs.time }} UTC] Preparing browser tests across multiple browsers...</bold>
--- ---
@@ -73,16 +78,16 @@ jobs:
path: | path: |
ComfyUI_frontend/.cache ComfyUI_frontend/.cache
ComfyUI_frontend/tsconfig.tsbuildinfo ComfyUI_frontend/tsconfig.tsbuildinfo
key: playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-${{ hashFiles('ComfyUI_frontend/src/**/*.{ts,vue,js}', 'ComfyUI_frontend/*.config.*') }} key: playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-${{ hashFiles('ComfyUI_frontend/src/**/*.{ts,vue,js}', 'ComfyUI_frontend/*.config.*') }}
restore-keys: | restore-keys: |
playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}- playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-
playwright-setup-cache-${{ runner.os }}- playwright-setup-cache-${{ runner.os }}-
playwright-tools-cache-${{ runner.os }}- playwright-tools-cache-${{ runner.os }}-
- name: Build ComfyUI_frontend - name: Build ComfyUI_frontend
run: | run: |
npm ci pnpm install --frozen-lockfile
npm run build pnpm build
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Generate cache key - name: Generate cache key
@@ -129,6 +134,11 @@ jobs:
ComfyUI_frontend ComfyUI_frontend
key: comfyui-setup-${{ needs.setup.outputs.cache-key }} key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- uses: actions/setup-python@v4 - uses: actions/setup-python@v4
with: with:
python-version: '3.10' python-version: '3.10'
@@ -158,7 +168,7 @@ jobs:
comment-author: 'github-actions[bot]' comment-author: 'github-actions[bot]'
edit-mode: append edit-mode: append
body: | body: |
<img alt='claude-loading-gif' src="https://github.com/user-attachments/assets/5ac382c7-e004-429b-8e35-7feb3e8f9c6f" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" /> <img alt='comfy-loading-gif' src="https://github.com/user-attachments/assets/755c86ee-e445-4ea8-bc2c-cca85df48686" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
<bold>${{ matrix.browser }}</bold>: Running tests... <bold>${{ matrix.browser }}</bold>: Running tests...
- name: Install requirements - name: Install requirements
@@ -179,9 +189,9 @@ jobs:
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ~/.cache/ms-playwright path: ~/.cache/ms-playwright
key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-${{ matrix.browser }} key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-${{ matrix.browser }}
restore-keys: | restore-keys: |
playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}- playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-
playwright-browsers-${{ runner.os }}- playwright-browsers-${{ runner.os }}-
- name: Install Playwright Browsers - name: Install Playwright Browsers
@@ -189,7 +199,7 @@ jobs:
working-directory: ComfyUI_frontend working-directory: ComfyUI_frontend
- name: Install Wrangler - name: Install Wrangler
run: npm install -g wrangler run: pnpm install -g wrangler
- name: Run Playwright tests (${{ matrix.browser }}) - name: Run Playwright tests (${{ matrix.browser }})
id: playwright id: playwright

View File

@@ -14,28 +14,33 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version: lts/*
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
.cache .cache
key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
electron-types-tools-cache-${{ runner.os }}- electron-types-tools-cache-${{ runner.os }}-
- name: Update electron types - name: Update electron types
run: npm install @comfyorg/comfyui-electron-types@latest run: pnpm install @comfyorg/comfyui-electron-types@latest
- name: Get new version - name: Get new version
id: get-version id: get-version
run: | run: |
NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./package-lock.json')).packages['node_modules/@comfyorg/comfyui-electron-types'].version)") NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./pnpm-lock.yaml')).packages['node_modules/@comfyorg/comfyui-electron-types'].version)")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
- name: Create Pull Request - name: Create Pull Request

View File

@@ -19,23 +19,28 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version: lts/*
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
.cache .cache
key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
update-manager-tools-cache-${{ runner.os }}- update-manager-tools-cache-${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Cache ComfyUI-Manager repository - name: Cache ComfyUI-Manager repository
uses: actions/cache@v4 uses: actions/cache@v4
@@ -81,7 +86,7 @@ jobs:
- name: Lint generated types - name: Lint generated types
run: | run: |
echo "Linting generated ComfyUI-Manager API types..." echo "Linting generated ComfyUI-Manager API types..."
npm run lint:fix:no-cache -- ./src/types/generatedManagerTypes.ts pnpm lint:fix:no-cache -- ./src/types/generatedManagerTypes.ts
- name: Check for changes - name: Check for changes
id: check-changes id: check-changes

View File

@@ -18,23 +18,28 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version: lts/*
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: | path: |
.cache .cache
key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: | restore-keys: |
update-registry-tools-cache-${{ runner.os }}- update-registry-tools-cache-${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Cache comfy-api repository - name: Cache comfy-api repository
uses: actions/cache@v4 uses: actions/cache@v4
@@ -81,7 +86,7 @@ jobs:
- name: Lint generated types - name: Lint generated types
run: | run: |
echo "Linting generated Comfy Registry API types..." echo "Linting generated Comfy Registry API types..."
npm run lint:fix:no-cache -- ./src/types/comfyRegistryTypes.ts pnpm lint:fix:no-cache -- ./src/types/comfyRegistryTypes.ts
- name: Check for changes - name: Check for changes
id: check-changes id: check-changes

View File

@@ -26,16 +26,21 @@ jobs:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: lts/* node-version: lts/*
cache: 'npm' cache: 'pnpm'
- name: Bump version - name: Bump version
id: bump-version id: bump-version
run: | run: |
npm version ${{ github.event.inputs.version_type }} --preid ${{ github.event.inputs.pre_release }} --no-git-tag-version pnpm version ${{ github.event.inputs.version_type }} --preid ${{ github.event.inputs.pre_release }} --no-git-tag-version
NEW_VERSION=$(node -p "require('./package.json').version") NEW_VERSION=$(node -p "require('./package.json').version")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT

View File

@@ -13,11 +13,16 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Use Node.js - name: Use Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4
with: with:
node-version: 'lts/*' node-version: 'lts/*'
cache: 'npm' cache: 'pnpm'
- name: Cache tool outputs - name: Cache tool outputs
uses: actions/cache@v4 uses: actions/cache@v4
@@ -26,16 +31,16 @@ jobs:
.cache .cache
coverage coverage
.vitest-cache .vitest-cache
key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }} key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }}
restore-keys: | restore-keys: |
vitest-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}- vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
vitest-cache-${{ runner.os }}- vitest-cache-${{ runner.os }}-
test-tools-cache-${{ runner.os }}- test-tools-cache-${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Run Vitest tests - name: Run Vitest tests
run: | run: |
npm run test:component pnpm test:component
npm run test:unit pnpm test:unit

1
.gitignore vendored
View File

@@ -10,7 +10,6 @@ lerna-debug.log*
# Package manager lockfiles (allow users to use different package managers) # Package manager lockfiles (allow users to use different package managers)
bun.lock bun.lock
bun.lockb bun.lockb
pnpm-lock.yaml
yarn.lock yarn.lock
# Cache files # Cache files

View File

@@ -2,9 +2,9 @@
## Quick Commands ## Quick Commands
- `npm run storybook`: Start Storybook development server - `pnpm storybook`: Start Storybook development server
- `npm run build-storybook`: Build static Storybook - `pnpm build-storybook`: Build static Storybook
- `npm run test:component`: Run component tests (includes Storybook components) - `pnpm test:component`: Run component tests (includes Storybook components)
## Development Workflow for Storybook ## Development Workflow for Storybook
@@ -19,8 +19,8 @@
- Ensure proper theming and styling - Ensure proper theming and styling
3. **Code Quality**: 3. **Code Quality**:
- Run `npm run typecheck` to verify TypeScript - Run `pnpm typecheck` to verify TypeScript
- Run `npm run lint` to check for linting issues - Run `pnpm lint` to check for linting issues
- Follow existing story patterns and conventions - Follow existing story patterns and conventions
## Story Creation Guidelines ## Story Creation Guidelines
@@ -138,13 +138,13 @@ The Storybook preview is configured with:
```bash ```bash
# Check TypeScript issues # Check TypeScript issues
npm run typecheck pnpm typecheck
# Lint Storybook files # Lint Storybook files
npm run lint .storybook/ pnpm lint .storybook/
# Build to check for production issues # Build to check for production issues
npm run build-storybook pnpm build-storybook
``` ```
## File Organization ## File Organization

View File

@@ -40,10 +40,10 @@ Storybook is a frontend workshop for building UI components and pages in isolati
```bash ```bash
# Start Storybook development server # Start Storybook development server
npm run storybook pnpm storybook
# Build static Storybook for deployment # Build static Storybook for deployment
npm run build-storybook pnpm build-storybook
``` ```
### Creating Stories ### Creating Stories

View File

@@ -8,19 +8,19 @@
- Config: `vite.config.mts`, `vitest.config.ts`, `playwright.config.ts`, `eslint.config.js`, `.prettierrc`. - Config: `vite.config.mts`, `vitest.config.ts`, `playwright.config.ts`, `eslint.config.js`, `.prettierrc`.
## Build, Test, and Development Commands ## Build, Test, and Development Commands
- `npm run dev`: Start Vite dev server. - `pnpm dev`: Start Vite dev server.
- `npm run dev:electron`: Dev server with Electron API mocks. - `pnpm dev:electron`: Dev server with Electron API mocks.
- `npm run build`: Type-check then production build to `dist/`. - `pnpm build`: Type-check then production build to `dist/`.
- `npm run preview`: Preview the production build locally. - `pnpm preview`: Preview the production build locally.
- `npm run test:unit`: Run Vitest unit tests (`tests-ui/`). - `pnpm test:unit`: Run Vitest unit tests (`tests-ui/`).
- `npm run test:component`: Run component tests (`src/components/`). - `pnpm test:component`: Run component tests (`src/components/`).
- `npm run test:browser`: Run Playwright E2E tests (`browser_tests/`). - `pnpm test:browser`: Run Playwright E2E tests (`browser_tests/`).
- `npm run lint` / `npm run lint:fix`: Lint (ESLint). `npm run format` / `format:check`: Prettier. - `pnpm lint` / `pnpm lint:fix`: Lint (ESLint). `pnpm format` / `format:check`: Prettier.
- `npm run typecheck`: Vue TSC type checking. - `pnpm typecheck`: Vue TSC type checking.
## Coding Style & Naming Conventions ## Coding Style & Naming Conventions
- Language: TypeScript, Vue SFCs (`.vue`). Indent 2 spaces; single quotes; no semicolons; width 80 (see `.prettierrc`). - Language: TypeScript, Vue SFCs (`.vue`). Indent 2 spaces; single quotes; no semicolons; width 80 (see `.prettierrc`).
- Imports: sorted/grouped by plugin; run `npm run format` before committing. - Imports: sorted/grouped by plugin; run `pnpm format` before committing.
- ESLint: Vue + TS rules; no floating promises; unused imports disallowed; i18n raw text restrictions in templates. - ESLint: Vue + TS rules; no floating promises; unused imports disallowed; i18n raw text restrictions in templates.
- Naming: Vue components in PascalCase (e.g., `MenuHamburger.vue`); composables `useXyz.ts`; Pinia stores `*Store.ts`. - Naming: Vue components in PascalCase (e.g., `MenuHamburger.vue`); composables `useXyz.ts`; Pinia stores `*Store.ts`.
@@ -33,7 +33,7 @@
## Commit & Pull Request Guidelines ## Commit & Pull Request Guidelines
- Commits: Prefer Conventional Commits (e.g., `feat(ui): add sidebar`), `refactor(litegraph): …`. Use `[skip ci]` for locale-only updates when appropriate. - Commits: Prefer Conventional Commits (e.g., `feat(ui): add sidebar`), `refactor(litegraph): …`. Use `[skip ci]` for locale-only updates when appropriate.
- PRs: Include clear description, linked issues (`Fixes #123`), and screenshots/GIFs for UI changes. Add/adjust tests and i18n strings when applicable. - PRs: Include clear description, linked issues (`Fixes #123`), and screenshots/GIFs for UI changes. Add/adjust tests and i18n strings when applicable.
- Quality gates: `npm run lint`, `npm run typecheck`, and relevant tests must pass. Keep PRs focused and small. - Quality gates: `pnpm lint`, `pnpm typecheck`, and relevant tests must pass. Keep PRs focused and small.
## Security & Configuration Tips ## Security & Configuration Tips
- Secrets: Use `.env` (see `.env_example`); do not commit secrets. - Secrets: Use `.env` (see `.env_example`); do not commit secrets.

View File

@@ -2,13 +2,13 @@
## Quick Commands ## Quick Commands
- `npm run`: See all available commands - `pnpm`: See all available commands
- `npm run typecheck`: Type checking - `pnpm typecheck`: Type checking
- `npm run lint`: Linting - `pnpm lint`: Linting
- `npm run format`: Prettier formatting - `pnpm format`: Prettier formatting
- `npm run test:component`: Run component tests with browser environment - `pnpm test:component`: Run component tests with browser environment
- `npm run test:unit`: Run all unit tests - `pnpm test:unit`: Run all unit tests
- `npm run test:unit -- tests-ui/tests/example.test.ts`: Run single test file - `pnpm test:unit -- tests-ui/tests/example.test.ts`: Run single test file
## Development Workflow ## Development Workflow

View File

@@ -17,7 +17,7 @@ Have another idea? Drop into Discord or open an issue, and let's chat!
### Prerequisites & Technology Stack ### Prerequisites & Technology Stack
- **Required Software**: - **Required Software**:
- Node.js (v16 or later; v20/v22 strongly recommended) and npm - Node.js (v16 or later; v24 strongly recommended) and pnpm
- Git for version control - Git for version control
- A running ComfyUI backend instance - A running ComfyUI backend instance
@@ -39,7 +39,7 @@ Have another idea? Drop into Discord or open an issue, and let's chat!
2. Install dependencies: 2. Install dependencies:
```bash ```bash
npm install pnpm install
``` ```
3. Configure environment (optional): 3. Configure environment (optional):
@@ -57,13 +57,13 @@ python main.py --port 8188
### Git pre-commit hooks ### Git pre-commit hooks
Run `npm run prepare` to install Git pre-commit hooks. Currently, the pre-commit hook is used to auto-format code on commit. Run `pnpm prepare` to install Git pre-commit hooks. Currently, the pre-commit hook is used to auto-format code on commit.
### Dev Server ### Dev Server
- Start local ComfyUI backend at `localhost:8188` - Start local ComfyUI backend at `localhost:8188`
- Run `npm run dev` to start the dev server - Run `pnpm dev` to start the dev server
- Run `npm run dev:electron` to start the dev server with electron API mocked - Run `pnpm dev:electron` to start the dev server with electron API mocked
#### Access dev server on touch devices #### Access dev server on touch devices
@@ -155,7 +155,7 @@ For ComfyUI_frontend development, you can ask coding assistants to use Playwrigh
##### Setup for Claude Code ##### Setup for Claude Code
After installing dependencies with `npm i`, the Playwright MCP server will be automatically available when you start Claude Code locally. After installing dependencies with `pnpm i`, the Playwright MCP server will be automatically available when you start Claude Code locally.
Here's how Claude Code can use the Playwright MCP server to inspect the interface of the local development server (assuming you're running the dev server at `localhost:5173`): Here's how Claude Code can use the Playwright MCP server to inspect the interface of the local development server (assuming you're running the dev server at `localhost:5173`):
@@ -210,14 +210,14 @@ Here's how Claude Code can use the Playwright MCP server to inspect the interfac
### Unit Tests ### Unit Tests
- `npm i` to install all dependencies - `pnpm i` to install all dependencies
- `npm run test:unit` to execute all unit tests - `pnpm test:unit` to execute all unit tests
### Component Tests ### Component Tests
Component tests verify Vue components in `src/components/`. Component tests verify Vue components in `src/components/`.
- `npm run test:component` to execute all component tests - `pnpm test:component` to execute all component tests
### Playwright Tests ### Playwright Tests
@@ -228,12 +228,12 @@ Playwright tests verify the whole app. See [browser_tests/README.md](browser_tes
Before submitting a PR, ensure all tests pass: Before submitting a PR, ensure all tests pass:
```bash ```bash
npm run test:unit pnpm test:unit
npm run test:component pnpm test:component
npm run test:browser pnpm test:browser
npm run typecheck pnpm typecheck
npm run lint pnpm lint
npm run format pnpm format
``` ```
## Code Style Guidelines ## Code Style Guidelines

View File

@@ -43,7 +43,7 @@ test.describe('Selection Toolbox', () => {
const boundingBox = await toolboxContainer.boundingBox() const boundingBox = await toolboxContainer.boundingBox()
expect(boundingBox).not.toBeNull() expect(boundingBox).not.toBeNull()
// Canvas-based positioning can vary, just verify toolbox appears in reasonable bounds // Canvas-based positioning can vary, just verify toolbox appears in reasonable bounds
expect(boundingBox!.x).toBeGreaterThan(-100) // Not too far off-screen left expect(boundingBox!.x).toBeGreaterThan(-200) // Not too far off-screen left
expect(boundingBox!.x).toBeLessThan(1000) // Not too far off-screen right expect(boundingBox!.x).toBeLessThan(1000) // Not too far off-screen right
expect(boundingBox!.y).toBeGreaterThan(-100) // Not too far off-screen top expect(boundingBox!.y).toBeGreaterThan(-100) // Not too far off-screen top
}) })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -105,7 +105,7 @@ The alternative would have been breaking all existing extensions or staying with
Build the frontend for full functionality: Build the frontend for full functionality:
```bash ```bash
npm run build pnpm build
``` ```
For faster iteration during development, use watch mode: For faster iteration during development, use watch mode:

19797
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "@comfyorg/comfyui-frontend", "name": "@comfyorg/comfyui-frontend",
"private": true, "private": true,
"version": "1.26.6", "version": "1.26.7",
"type": "module", "type": "module",
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
"homepage": "https://comfy.org", "homepage": "https://comfy.org",
@@ -10,7 +10,7 @@
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"dev:electron": "vite --config vite.electron.config.mts", "dev:electron": "vite --config vite.electron.config.mts",
"build": "npm run typecheck && vite build", "build": "pnpm typecheck && vite build",
"build:types": "vite build --config vite.types.config.mts && node scripts/prepare-types.js", "build:types": "vite build --config vite.types.config.mts && node scripts/prepare-types.js",
"zipdist": "node scripts/zipdist.js", "zipdist": "node scripts/zipdist.js",
"typecheck": "vue-tsc --noEmit", "typecheck": "vue-tsc --noEmit",
@@ -21,6 +21,7 @@
"test:browser": "npx playwright test", "test:browser": "npx playwright test",
"test:unit": "vitest run tests-ui/tests", "test:unit": "vitest run tests-ui/tests",
"test:component": "vitest run src/components/", "test:component": "vitest run src/components/",
"preinstall": "npx only-allow pnpm",
"prepare": "husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true", "prepare": "husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true",
"preview": "vite preview", "preview": "vite preview",
"lint": "eslint src --cache", "lint": "eslint src --cache",
@@ -45,6 +46,7 @@
"@pinia/testing": "^0.1.5", "@pinia/testing": "^0.1.5",
"@playwright/test": "^1.52.0", "@playwright/test": "^1.52.0",
"@storybook/addon-docs": "^9.1.1", "@storybook/addon-docs": "^9.1.1",
"@storybook/vue3": "^9.1.1",
"@storybook/vue3-vite": "^9.1.1", "@storybook/vue3-vite": "^9.1.1",
"@trivago/prettier-plugin-sort-imports": "^5.2.0", "@trivago/prettier-plugin-sort-imports": "^5.2.0",
"@types/dompurify": "^3.0.5", "@types/dompurify": "^3.0.5",
@@ -56,6 +58,7 @@
"@vue/test-utils": "^2.4.6", "@vue/test-utils": "^2.4.6",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"commander": "^14.0.0",
"eslint": "^9.12.0", "eslint": "^9.12.0",
"eslint-config-prettier": "^10.1.2", "eslint-config-prettier": "^10.1.2",
"eslint-plugin-prettier": "^5.2.6", "eslint-plugin-prettier": "^5.2.6",
@@ -67,11 +70,14 @@
"happy-dom": "^15.11.0", "happy-dom": "^15.11.0",
"husky": "^9.0.11", "husky": "^9.0.11",
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"ink": "^4.2.0",
"knip": "^5.62.0", "knip": "^5.62.0",
"lint-staged": "^15.2.7", "lint-staged": "^15.2.7",
"lucide-vue-next": "^0.540.0", "lucide-vue-next": "^0.540.0",
"postcss": "^8.4.39", "postcss": "^8.4.39",
"prettier": "^3.3.2", "prettier": "^3.3.2",
"react": "^18.3.1",
"react-reconciler": "^0.29.2",
"storybook": "^9.1.1", "storybook": "^9.1.1",
"tailwindcss": "^3.4.4", "tailwindcss": "^3.4.4",
"tsx": "^4.15.6", "tsx": "^4.15.6",
@@ -79,6 +85,7 @@
"typescript-eslint": "^8.0.0", "typescript-eslint": "^8.0.0",
"unplugin-icons": "^0.22.0", "unplugin-icons": "^0.22.0",
"unplugin-vue-components": "^0.28.0", "unplugin-vue-components": "^0.28.0",
"uuid": "^11.1.0",
"vite": "^5.4.19", "vite": "^5.4.19",
"vite-plugin-dts": "^4.3.0", "vite-plugin-dts": "^4.3.0",
"vite-plugin-html": "^3.2.2", "vite-plugin-html": "^3.2.2",
@@ -92,8 +99,14 @@
"@alloc/quick-lru": "^5.2.0", "@alloc/quick-lru": "^5.2.0",
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1", "@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
"@comfyorg/comfyui-electron-types": "^0.4.43", "@comfyorg/comfyui-electron-types": "^0.4.43",
"@primeuix/forms": "0.0.2",
"@primeuix/styled": "0.3.2",
"@primeuix/utils": "^0.3.2",
"@primevue/core": "^4.2.5",
"@primevue/forms": "^4.2.5", "@primevue/forms": "^4.2.5",
"@primevue/icons": "4.2.5",
"@primevue/themes": "^4.2.5", "@primevue/themes": "^4.2.5",
"@sentry/core": "^10.5.0",
"@sentry/vue": "^8.48.0", "@sentry/vue": "^8.48.0",
"@tiptap/core": "^2.10.4", "@tiptap/core": "^2.10.4",
"@tiptap/extension-link": "^2.10.4", "@tiptap/extension-link": "^2.10.4",
@@ -113,8 +126,10 @@
"es-toolkit": "^1.39.9", "es-toolkit": "^1.39.9",
"extendable-media-recorder": "^9.2.27", "extendable-media-recorder": "^9.2.27",
"extendable-media-recorder-wav-encoder": "^7.0.129", "extendable-media-recorder-wav-encoder": "^7.0.129",
"fast-glob": "^3.3.3",
"firebase": "^11.6.0", "firebase": "^11.6.0",
"fuse.js": "^7.0.0", "fuse.js": "^7.0.0",
"glob": "^11.0.3",
"jsondiffpatch": "^0.6.0", "jsondiffpatch": "^0.6.0",
"loglevel": "^1.9.2", "loglevel": "^1.9.2",
"marked": "^15.0.11", "marked": "^15.0.11",

View File

@@ -90,8 +90,8 @@ export default defineConfig({
/* Run your local dev server before starting the tests */ /* Run your local dev server before starting the tests */
// webServer: { // webServer: {
// command: 'npm run start', // command: 'pnpm dev',
// url: 'http://127.0.0.1:3000', // url: 'http://127.0.0.1:5173',
// reuseExistingServer: !process.env.CI, // reuseExistingServer: !process.env.CI,
// }, // },
}) })

12504
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

15
pnpm-workspace.yaml Normal file
View File

@@ -0,0 +1,15 @@
packages:
- apps/**
- packages/**
ignoredBuiltDependencies:
- '@firebase/util'
- protobufjs
- vue-demi
onlyBuiltDependencies:
- '@playwright/browser-chromium'
- '@playwright/browser-firefox'
- '@playwright/browser-webkit'
- esbuild
- oxc-resolver

View File

@@ -118,7 +118,7 @@ const sortedGroups = (category: SettingTreeNode): ISettingGroup[] => {
} }
const handleSearch = (query: string) => { const handleSearch = (query: string) => {
handleSearchBase(query) handleSearchBase(query.trim())
activeCategory.value = query ? null : defaultCategory.value activeCategory.value = query ? null : defaultCategory.value
} }

View File

@@ -1,16 +1,13 @@
<template> <template>
<Transition name="slide-up"> <div
<!-- Wrapping panel in div to get correct ref because panel ref is not of raw dom el --> ref="toolboxRef"
<div style="transform: translate(var(--tb-x), var(--tb-y))"
v-show="visible" class="fixed left-0 top-0 z-40"
ref="toolboxRef" >
style=" <Transition name="slide-up">
transform: translate(calc(var(--tb-x) - 50%), calc(var(--tb-y) - 120%));
"
class="selection-toolbox fixed left-0 top-0 z-40"
>
<Panel <Panel
class="rounded-lg" v-if="visible"
class="rounded-lg selection-toolbox"
:pt="{ :pt="{
header: 'hidden', header: 'hidden',
content: 'p-0 flex flex-row' content: 'p-0 flex flex-row'
@@ -33,8 +30,8 @@
/> />
<HelpButton /> <HelpButton />
</Panel> </Panel>
</div> </Transition>
</Transition> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -84,22 +81,31 @@ const extensionToolboxCommands = computed<ComfyCommandImpl[]>(() => {
</script> </script>
<style scoped> <style scoped>
.selection-toolbox {
transform: translateX(-50%) translateY(-120%);
will-change: transform, opacity;
}
@keyframes slideUp {
0% {
transform: translateX(-50%) translateY(-100%);
opacity: 0;
}
50% {
transform: translateX(-50%) translateY(-125%);
opacity: 0.5;
}
100% {
transform: translateX(-50%) translateY(-120%);
opacity: 1;
}
}
.slide-up-enter-active { .slide-up-enter-active {
opacity: 1; animation: slideUp 125ms ease-out;
transition: all 0.3s ease-out;
} }
.slide-up-leave-active { .slide-up-leave-active {
transition: none; animation: slideUp 25ms ease-out reverse;
}
.slide-up-enter-from {
transform: translateY(-100%);
opacity: 0;
}
.slide-up-leave-to {
transform: translateY(0);
opacity: 0;
} }
</style> </style>

View File

@@ -136,8 +136,6 @@ const closePopup = async () => {
hide() hide()
} }
// Learn more handled by anchor href
// const handleCTA = async () => { // const handleCTA = async () => {
// window.open('https://docs.comfy.org/installation/update_comfyui', '_blank') // window.open('https://docs.comfy.org/installation/update_comfyui', '_blank')
// await closePopup() // await closePopup()
@@ -161,8 +159,10 @@ defineExpose({
<style scoped> <style scoped>
/* Popup container - positioning handled by parent */ /* Popup container - positioning handled by parent */
.whats-new-popup-container { .whats-new-popup-container {
--whats-new-popup-bottom: 1rem;
position: absolute; position: absolute;
bottom: 1rem; bottom: var(--whats-new-popup-bottom);
z-index: 1000; z-index: 1000;
pointer-events: auto; pointer-events: auto;
} }
@@ -171,8 +171,8 @@ defineExpose({
.help-center-arrow { .help-center-arrow {
position: absolute; position: absolute;
bottom: calc( bottom: calc(
var(--sidebar-width, 4rem) + 0.25rem var(--sidebar-width) * 2 + var(--sidebar-width) / 2
); /* Position toward center of help center icon */ ); /* Position to center of help center icon (2 icons below + half icon height for center) */
transform: none; transform: none;
z-index: 999; z-index: 999;
pointer-events: none; pointer-events: none;
@@ -185,7 +185,10 @@ defineExpose({
.whats-new-popup-container.sidebar-left.small-sidebar .help-center-arrow { .whats-new-popup-container.sidebar-left.small-sidebar .help-center-arrow {
left: -14px; /* Overlap with popup outline */ left: -14px; /* Overlap with popup outline */
bottom: calc(2.5rem + 0.25rem); /* Adjust for small sidebar */ bottom: calc(
var(--sidebar-width) * 2 + var(--sidebar-icon-size) / 2 -
var(--whats-new-popup-bottom)
); /* Position to center of help center icon (2 icons below + half icon height for center - whats new popup bottom position ) */
} }
/* Sidebar positioning classes applied by parent */ /* Sidebar positioning classes applied by parent */

View File

@@ -76,6 +76,22 @@ const getTabTooltipSuffix = (tab: SidebarTabExtension) => {
} }
</script> </script>
<style>
/* Global CSS variables for sidebar
* These variables need to be global (not scoped) because they are used by
* teleported components like WhatsNewPopup that render outside the sidebar
* but need to reference sidebar dimensions for proper positioning.
*/
:root {
--sidebar-width: 4rem;
--sidebar-icon-size: 1rem;
}
:root:has(.side-tool-bar-container.small-sidebar) {
--sidebar-width: 2.5rem;
}
</style>
<style scoped> <style scoped>
.side-tool-bar-container { .side-tool-bar-container {
display: flex; display: flex;
@@ -88,9 +104,6 @@ const getTabTooltipSuffix = (tab: SidebarTabExtension) => {
background-color: var(--comfy-menu-secondary-bg); background-color: var(--comfy-menu-secondary-bg);
color: var(--fg-color); color: var(--fg-color);
box-shadow: var(--bar-shadow); box-shadow: var(--bar-shadow);
--sidebar-width: 4rem;
--sidebar-icon-size: 1rem;
} }
.side-tool-bar-container.small-sidebar { .side-tool-bar-container.small-sidebar {

View File

@@ -1332,6 +1332,9 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
return 'Token-based' return 'Token-based'
} }
}, },
GeminiImageNode: {
displayPrice: '$0.03 per 1K tokens'
},
// OpenAI nodes // OpenAI nodes
OpenAIChatNode: { OpenAIChatNode: {
displayPrice: (node: LGraphNode): string => { displayPrice: (node: LGraphNode): string => {

View File

@@ -446,6 +446,9 @@ export function useCoreCommands(): ComfyCommand[] {
) )
group.resizeTo(canvas.selectedItems, padding) group.resizeTo(canvas.selectedItems, padding)
canvas.graph?.add(group) canvas.graph?.add(group)
group.recomputeInsideNodes()
useTitleEditorStore().titleEditorTarget = group useTitleEditorStore().titleEditorTarget = group
} }
}, },

View File

@@ -13,6 +13,7 @@ export const CORE_MENU_COMMANDS = [
], ],
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']], [['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
[['Edit'], ['Comfy.OpenClipspace']], [['Edit'], ['Comfy.OpenClipspace']],
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
[ [
['Help'], ['Help'],
[ [

View File

@@ -42,6 +42,8 @@ app.registerExtension({
this.graph.add(group) this.graph.add(group)
// @ts-expect-error fixme ts strict error // @ts-expect-error fixme ts strict error
this.graph.change() this.graph.change()
group.recomputeInsideNodes()
} }
}) })
} }

View File

@@ -9,9 +9,9 @@
# Bash commands # Bash commands
- `npm run typecheck` Run the typechecker - `pnpm typecheck` Run the typechecker
- `npm run build` Build the project - `pnpm build` Build the project
- `npm run lint:fix` Run ESLint - `pnpm lint:fix` Run ESLint
# Code style # Code style

View File

@@ -152,7 +152,7 @@ Use GitHub actions to release normal versions.
### Pre-release ### Pre-release
The action directly translates `Version increment type` to the npm version command. `Pre-release ID (suffix)` is the option for the `--preid` argument. The action directly translates `Version increment type` to the pnpm version command. `Pre-release ID (suffix)` is the option for the `--preid` argument.
e.g. Use `prerelease` increment type to automatically bump the patch version and create a pre-release version. Subsequent runs of prerelease will update the prerelease version only. e.g. Use `prerelease` increment type to automatically bump the patch version and create a pre-release version. Subsequent runs of prerelease will update the prerelease version only.
Use `patch` when ready to remove the pre-release suffix. Use `patch` when ready to remove the pre-release suffix.

View File

@@ -79,19 +79,20 @@ const messages = {
#### Option A: Local Generation (Optional) #### Option A: Local Generation (Optional)
```bash ```bash
# Only if you have OpenAI API key configured # Only if you have OpenAI API key configured
npm run locale pnpm locale
``` ```
#### Option B: Let CI Handle It (Recommended) #### Option B: Let CI Handle It (Recommended)
- Create your PR with the configuration changes above - Create your PR with the configuration changes above
- Our GitHub CI will automatically generate translation files - **Important**: Translation files will be generated during release PRs, not feature PRs
- Empty JSON files are fine - they'll be populated by the workflow - Empty JSON files are fine - they'll be populated during the next release workflow
- For urgent translation needs, maintainers can manually trigger the workflow
### Step 3: Test Your Changes ### Step 3: Test Your Changes
```bash ```bash
npm run typecheck # Check for TypeScript errors pnpm typecheck # Check for TypeScript errors
npm run dev # Start development server pnpm dev # Start development server
``` ```
**Testing checklist:** **Testing checklist:**
@@ -110,11 +111,23 @@ npm run dev # Start development server
## What Happens in CI ## What Happens in CI
Our automated translation workflow: Our automated translation workflow now runs on release PRs (version-bump-* branches) to improve development performance:
### For Feature PRs (Regular Development)
- **No automatic translations** - faster reviews and fewer conflicts
- **English-only development** - new strings show in English until release
- **Focus on functionality** - reviewers see only your actual changes
### For Release PRs (version-bump-* branches)
1. **Collects strings**: Scans the UI for translatable text 1. **Collects strings**: Scans the UI for translatable text
2. **Updates English files**: Ensures all strings are captured 2. **Updates English files**: Ensures all strings are captured
3. **Generates translations**: Uses OpenAI API to translate to all configured languages 3. **Generates translations**: Uses OpenAI API to translate to all configured languages
4. **Commits back**: Automatically updates your PR with complete translations 4. **Commits back**: Automatically updates the release PR with complete translations
### Manual Translation Updates
If urgent translation updates are needed outside of releases, maintainers can:
- Trigger the "Update Locales" workflow manually from GitHub Actions
- The workflow supports manual dispatch for emergency translation updates
## File Structure ## File Structure

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "تم رفض إذن الميكروفون", "micPermissionDenied": "تم رفض إذن الميكروفون",
"migrate": "ترحيل", "migrate": "ترحيل",
"missing": "مفقود", "missing": "مفقود",
"moreWorkflows": "المزيد من سير العمل",
"name": "الاسم", "name": "الاسم",
"newFolder": "مجلد جديد", "newFolder": "مجلد جديد",
"next": "التالي", "next": "التالي",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "Permiso de micrófono denegado", "micPermissionDenied": "Permiso de micrófono denegado",
"migrate": "Migrar", "migrate": "Migrar",
"missing": "Faltante", "missing": "Faltante",
"moreWorkflows": "Más flujos de trabajo",
"name": "Nombre", "name": "Nombre",
"newFolder": "Nueva carpeta", "newFolder": "Nueva carpeta",
"next": "Siguiente", "next": "Siguiente",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "Permission du microphone refusée", "micPermissionDenied": "Permission du microphone refusée",
"migrate": "Migrer", "migrate": "Migrer",
"missing": "Manquant", "missing": "Manquant",
"moreWorkflows": "Plus de workflows",
"name": "Nom", "name": "Nom",
"newFolder": "Nouveau dossier", "newFolder": "Nouveau dossier",
"next": "Suivant", "next": "Suivant",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "マイクの許可が拒否されました", "micPermissionDenied": "マイクの許可が拒否されました",
"migrate": "移行する", "migrate": "移行する",
"missing": "不足している", "missing": "不足している",
"moreWorkflows": "さらに多くのワークフロー",
"name": "名前", "name": "名前",
"newFolder": "新しいフォルダー", "newFolder": "新しいフォルダー",
"next": "次へ", "next": "次へ",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "마이크 권한이 거부되었습니다", "micPermissionDenied": "마이크 권한이 거부되었습니다",
"migrate": "이전(migrate)", "migrate": "이전(migrate)",
"missing": "누락됨", "missing": "누락됨",
"moreWorkflows": "더 많은 워크플로우",
"name": "이름", "name": "이름",
"newFolder": "새 폴더", "newFolder": "새 폴더",
"next": "다음", "next": "다음",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "Доступ к микрофону запрещён", "micPermissionDenied": "Доступ к микрофону запрещён",
"migrate": "Мигрировать", "migrate": "Мигрировать",
"missing": "Отсутствует", "missing": "Отсутствует",
"moreWorkflows": "Больше рабочих процессов",
"name": "Имя", "name": "Имя",
"newFolder": "Новая папка", "newFolder": "Новая папка",
"next": "Далее", "next": "Далее",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "麥克風權限被拒絕", "micPermissionDenied": "麥克風權限被拒絕",
"migrate": "遷移", "migrate": "遷移",
"missing": "缺少", "missing": "缺少",
"moreWorkflows": "更多工作流程",
"name": "名稱", "name": "名稱",
"newFolder": "新資料夾", "newFolder": "新資料夾",
"next": "下一步", "next": "下一步",

View File

@@ -341,6 +341,7 @@
"micPermissionDenied": "麦克风权限被拒绝", "micPermissionDenied": "麦克风权限被拒绝",
"migrate": "迁移", "migrate": "迁移",
"missing": "缺失", "missing": "缺失",
"moreWorkflows": "更多工作流",
"name": "名称", "name": "名称",
"newFolder": "新文件夹", "newFolder": "新文件夹",
"next": "下一个", "next": "下一个",

View File

@@ -63,6 +63,7 @@ import { ExtensionManager } from '@/types/extensionTypes'
import type { NodeExecutionId } from '@/types/nodeIdentification' import type { NodeExecutionId } from '@/types/nodeIdentification'
import { ColorAdjustOptions, adjustColor } from '@/utils/colorUtil' import { ColorAdjustOptions, adjustColor } from '@/utils/colorUtil'
import { graphToPrompt } from '@/utils/executionUtil' import { graphToPrompt } from '@/utils/executionUtil'
import { forEachNode } from '@/utils/graphTraversalUtil'
import { import {
getNodeByExecutionId, getNodeByExecutionId,
triggerCallbackOnAllNodes triggerCallbackOnAllNodes
@@ -1700,12 +1701,13 @@ export class ComfyApp {
for (const nodeId in defs) { for (const nodeId in defs) {
this.registerNodeDef(nodeId, defs[nodeId]) this.registerNodeDef(nodeId, defs[nodeId])
} }
for (const node of this.graph.nodes) { // Refresh combo widgets in all nodes including those in subgraphs
forEachNode(this.graph, (node) => {
const def = defs[node.type] const def = defs[node.type]
// Allow primitive nodes to handle refresh // Allow primitive nodes to handle refresh
node.refreshComboInNode?.(defs) node.refreshComboInNode?.(defs)
if (!def?.input) continue if (!def?.input) return
if (node.widgets) { if (node.widgets) {
const nodeInputs = def.input const nodeInputs = def.input
@@ -1732,7 +1734,7 @@ export class ComfyApp {
} }
} }
} }
} })
await useExtensionService().invokeExtensionsAsync( await useExtensionService().invokeExtensionsAsync(
'refreshComboInNodes', 'refreshComboInNodes',

View File

@@ -33,13 +33,13 @@ To run the tests locally:
```bash ```bash
# Run unit tests # Run unit tests
npm run test:unit pnpm test:unit
# Run unit tests in watch mode # Run unit tests in watch mode
npm run test:unit:dev pnpm test:unit:dev
# Run component tests with browser-native environment # Run component tests with browser-native environment
npm run test:component pnpm test:component
``` ```
Refer to the specific guides for more detailed information on each testing type. Refer to the specific guides for more detailed information on each testing type.

View File

@@ -1561,6 +1561,14 @@ describe('useNodePricing', () => {
const price = getNodeDisplayPrice(node) const price = getNodeDisplayPrice(node)
expect(price).toBe('Token-based') expect(price).toBe('Token-based')
}) })
it('should return static price for GeminiImageNode', () => {
const { getNodeDisplayPrice } = useNodePricing()
const node = createMockNode('GeminiImageNode')
const price = getNodeDisplayPrice(node)
expect(price).toBe('$0.03 per 1K tokens')
})
}) })
describe('Additional RunwayML edge cases', () => { describe('Additional RunwayML edge cases', () => {

View File

@@ -18,13 +18,13 @@ litegraph/
```bash ```bash
# Run all litegraph tests # Run all litegraph tests
npm run test:unit -- tests-ui/tests/litegraph/ pnpm test:unit -- tests-ui/tests/litegraph/
# Run specific subdirectory # Run specific subdirectory
npm run test:unit -- tests-ui/tests/litegraph/core/ pnpm test:unit -- tests-ui/tests/litegraph/core/
# Run single test file # Run single test file
npm run test:unit -- tests-ui/tests/litegraph/core/LGraph.test.ts pnpm test:unit -- tests-ui/tests/litegraph/core/LGraph.test.ts
``` ```
## Migration Status ## Migration Status