diff --git a/.claude/commands/create-frontend-release.md b/.claude/commands/create-frontend-release.md index 38ed14651..f16189d42 100644 --- a/.claude/commands/create-frontend-release.md +++ b/.claude/commands/create-frontend-release.md @@ -458,15 +458,15 @@ echo "Workflow triggered. Waiting for PR creation..." 3. **IMMEDIATELY CHECK**: Did release workflow trigger? ```bash sleep 10 - gh run list --workflow=release.yaml --limit=1 + gh run list --workflow=release-draft-create.yaml --limit=1 ``` -4. **For Minor/Major Version Releases**: The create-release-candidate-branch workflow will automatically: +4. **For Minor/Major Version Releases**: The release-branch-create workflow will automatically: - Create a `core/x.yy` branch for the PREVIOUS minor version - Apply branch protection rules - Document the feature freeze policy ```bash # Monitor branch creation (for minor/major releases) - gh run list --workflow=create-release-candidate-branch.yaml --limit=1 + gh run list --workflow=release-branch-create.yaml --limit=1 ``` 4. If workflow didn't trigger due to [skip ci]: ```bash @@ -477,7 +477,7 @@ echo "Workflow triggered. Waiting for PR creation..." ``` 5. If workflow triggered, monitor execution: ```bash - WORKFLOW_RUN_ID=$(gh run list --workflow=release.yaml --limit=1 --json databaseId --jq '.[0].databaseId') + WORKFLOW_RUN_ID=$(gh run list --workflow=release-draft-create.yaml --limit=1 --json databaseId --jq '.[0].databaseId') gh run watch ${WORKFLOW_RUN_ID} ``` diff --git a/.claude/commands/create-hotfix-release.md b/.claude/commands/create-hotfix-release.md index f35a8ad23..cc9c37ef5 100644 --- a/.claude/commands/create-hotfix-release.md +++ b/.claude/commands/create-hotfix-release.md @@ -246,7 +246,7 @@ For each commit: 3. Merge the PR: `gh pr merge --merge` 4. Monitor release workflow: ```bash - gh run list --workflow=release.yaml --limit=1 + gh run list --workflow=release-draft-create.yaml --limit=1 gh run watch ``` 5. Track progress: diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 000000000..f62e91eda --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,21 @@ +# GitHub Workflows + +## Naming Convention + +Workflow files follow a consistent naming pattern: `-.yaml` + +### Category Prefixes + +| Prefix | Purpose | Example | +| ---------- | ----------------------------------- | ------------------------------------ | +| `ci-` | Testing, linting, validation | `ci-tests-e2e.yaml` | +| `release-` | Version management, publishing | `release-version-bump.yaml` | +| `pr-` | PR automation (triggered by labels) | `pr-claude-review.yaml` | +| `api-` | External Api type generation | `api-update-registry-api-types.yaml` | +| `i18n-` | Internationalization updates | `i18n-update-core.yaml` | + +## Documentation + +Each workflow file contains comments explaining its purpose, triggers, and behavior. For specific details about what each workflow does, refer to the comments at the top of each `.yaml` file. + +For GitHub Actions documentation, see [Events that trigger workflows](https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows). diff --git a/.github/workflows/update-electron-types.yaml b/.github/workflows/api-update-electron-api-types.yaml similarity index 82% rename from .github/workflows/update-electron-types.yaml rename to .github/workflows/api-update-electron-api-types.yaml index 45d959b86..c25742118 100644 --- a/.github/workflows/update-electron-types.yaml +++ b/.github/workflows/api-update-electron-api-types.yaml @@ -1,4 +1,5 @@ -name: Update Electron Types +name: 'Api: Update Electron API Types' +description: 'When upstream electron API is updated, click dispatch to update the TypeScript type definitions in this repo' on: workflow_dispatch: @@ -25,15 +26,6 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - electron-types-tools-cache-${{ runner.os }}- - - name: Update electron types run: pnpm install --workspace-root @comfyorg/comfyui-electron-types@latest diff --git a/.github/workflows/update-comfyui-manager-api-types.yaml b/.github/workflows/api-update-manager-api-types.yaml similarity index 85% rename from .github/workflows/update-comfyui-manager-api-types.yaml rename to .github/workflows/api-update-manager-api-types.yaml index 7e307dfda..4961ae9d2 100644 --- a/.github/workflows/update-comfyui-manager-api-types.yaml +++ b/.github/workflows/api-update-manager-api-types.yaml @@ -1,4 +1,5 @@ -name: Update ComfyUI-Manager API Types +name: 'Api: Update Manager API Types' +description: 'When upstream ComfyUI-Manager API is updated, click dispatch to update the TypeScript type definitions in this repo' on: # Manual trigger @@ -30,26 +31,9 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - update-manager-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Cache ComfyUI-Manager repository - uses: actions/cache@v4 - with: - path: ComfyUI-Manager - key: comfyui-manager-repo-${{ runner.os }}-${{ github.run_id }} - restore-keys: | - comfyui-manager-repo-${{ runner.os }}- - - name: Checkout ComfyUI-Manager repository uses: actions/checkout@v5 with: diff --git a/.github/workflows/update-comfy-registry-api-types.yaml b/.github/workflows/api-update-registry-api-types.yaml similarity index 85% rename from .github/workflows/update-comfy-registry-api-types.yaml rename to .github/workflows/api-update-registry-api-types.yaml index 41a4db9ab..41a3d0a7a 100644 --- a/.github/workflows/update-comfy-registry-api-types.yaml +++ b/.github/workflows/api-update-registry-api-types.yaml @@ -1,4 +1,5 @@ -name: Update Comfy Registry API Types +name: 'Api: Update Registry API Types' +description: 'When upstream comfy-api is updated, click dispatch to update the TypeScript type definitions in this repo' on: # Manual trigger @@ -29,26 +30,9 @@ jobs: node-version: lts/* cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - update-registry-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Cache comfy-api repository - uses: actions/cache@v4 - with: - path: comfy-api - key: comfy-api-repo-${{ runner.os }}-${{ github.run_id }} - restore-keys: | - comfy-api-repo-${{ runner.os }}- - - name: Checkout comfy-api repository uses: actions/checkout@v5 with: diff --git a/.github/workflows/validate-json.yaml b/.github/workflows/ci-json-validation.yaml similarity index 63% rename from .github/workflows/validate-json.yaml rename to .github/workflows/ci-json-validation.yaml index 2986d23ed..0d8c9392f 100644 --- a/.github/workflows/validate-json.yaml +++ b/.github/workflows/ci-json-validation.yaml @@ -1,4 +1,5 @@ -name: Validate JSON +name: "CI: JSON Validation" +description: "Validates JSON syntax in all tracked .json files (excluding tsconfig*.json) using jq" on: push: diff --git a/.github/workflows/lint-and-format.yaml b/.github/workflows/ci-lint-format.yaml similarity index 84% rename from .github/workflows/lint-and-format.yaml rename to .github/workflows/ci-lint-format.yaml index 62956cadb..71d5eed15 100644 --- a/.github/workflows/lint-and-format.yaml +++ b/.github/workflows/ci-lint-format.yaml @@ -1,4 +1,5 @@ -name: Lint and Format +name: "CI: Lint Format" +description: "Linting and code formatting validation for pull requests" on: pull_request: @@ -32,21 +33,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - .eslintcache - tsconfig.tsbuildinfo - .prettierCache - .knip-cache - key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }} - restore-keys: | - lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - lint-format-cache-${{ runner.os }}- - ci-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/devtools-python-check.yaml b/.github/workflows/ci-python-validation.yaml similarity index 82% rename from .github/workflows/devtools-python-check.yaml rename to .github/workflows/ci-python-validation.yaml index f0893e99d..698f467bf 100644 --- a/.github/workflows/devtools-python-check.yaml +++ b/.github/workflows/ci-python-validation.yaml @@ -1,4 +1,5 @@ -name: Devtools Python Check +name: "CI: Python Validation" +description: "Validates Python code in tools/devtools directory" on: pull_request: diff --git a/.github/workflows/pr-playwright-deploy-forks.yaml b/.github/workflows/ci-tests-e2e-forks.yaml similarity index 95% rename from .github/workflows/pr-playwright-deploy-forks.yaml rename to .github/workflows/ci-tests-e2e-forks.yaml index 660fee77f..5d3767f8e 100644 --- a/.github/workflows/pr-playwright-deploy-forks.yaml +++ b/.github/workflows/ci-tests-e2e-forks.yaml @@ -1,8 +1,9 @@ -name: PR Playwright Deploy (Forks) +name: "CI: Tests E2E (Deploy for Forks)" +description: "Deploys test results from forked PRs (forks can't access deployment secrets)" on: workflow_run: - workflows: ["Tests CI"] + workflows: ["CI: Tests E2E"] types: [requested, completed] env: diff --git a/.github/workflows/tests-ci.yaml b/.github/workflows/ci-tests-e2e.yaml similarity index 98% rename from .github/workflows/tests-ci.yaml rename to .github/workflows/ci-tests-e2e.yaml index 0730cdaa1..4d448dbd4 100644 --- a/.github/workflows/tests-ci.yaml +++ b/.github/workflows/ci-tests-e2e.yaml @@ -1,4 +1,5 @@ -name: Tests CI +name: "CI: Tests E2E" +description: "End-to-end testing with Playwright across multiple browsers, deploys test reports to Cloudflare Pages" on: push: diff --git a/.github/workflows/pr-storybook-deploy-forks.yaml b/.github/workflows/ci-tests-storybook-forks.yaml similarity index 95% rename from .github/workflows/pr-storybook-deploy-forks.yaml rename to .github/workflows/ci-tests-storybook-forks.yaml index da27867c4..083a85f1d 100644 --- a/.github/workflows/pr-storybook-deploy-forks.yaml +++ b/.github/workflows/ci-tests-storybook-forks.yaml @@ -1,8 +1,9 @@ -name: PR Storybook Deploy (Forks) +name: "CI: Tests Storybook (Deploy for Forks)" +description: "Deploys Storybook previews from forked PRs (forks can't access deployment secrets)" on: workflow_run: - workflows: ['Storybook and Chromatic CI'] + workflows: ["CI: Tests Storybook"] types: [requested, completed] env: diff --git a/.github/workflows/storybook-and-chromatic-ci.yaml b/.github/workflows/ci-tests-storybook.yaml similarity index 85% rename from .github/workflows/storybook-and-chromatic-ci.yaml rename to .github/workflows/ci-tests-storybook.yaml index b29ee3623..6bc43e7eb 100644 --- a/.github/workflows/storybook-and-chromatic-ci.yaml +++ b/.github/workflows/ci-tests-storybook.yaml @@ -1,6 +1,5 @@ -name: Storybook and Chromatic CI - -# - [Automate Chromatic with GitHub Actions • Chromatic docs]( https://www.chromatic.com/docs/github-actions/ ) +name: "CI: Tests Storybook" +description: "Builds Storybook and runs visual regression testing via Chromatic, deploys previews to Cloudflare Pages" on: workflow_dispatch: # Allow manual triggering @@ -53,19 +52,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile @@ -118,19 +104,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/vitest-tests.yaml b/.github/workflows/ci-tests-unit.yaml similarity index 72% rename from .github/workflows/vitest-tests.yaml rename to .github/workflows/ci-tests-unit.yaml index 3695670cf..956a69e77 100644 --- a/.github/workflows/vitest-tests.yaml +++ b/.github/workflows/ci-tests-unit.yaml @@ -1,4 +1,5 @@ -name: Vitest Tests +name: "CI: Tests Unit" +description: "Unit and component testing with Vitest" on: push: @@ -28,19 +29,6 @@ jobs: node-version: "lts/*" cache: "pnpm" - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - coverage - .vitest-cache - key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }} - restore-keys: | - vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - vitest-cache-${{ runner.os }}- - test-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/update-locales.yaml b/.github/workflows/i18n-update-core.yaml similarity index 94% rename from .github/workflows/update-locales.yaml rename to .github/workflows/i18n-update-core.yaml index 9ffa702ca..8a20af4c0 100644 --- a/.github/workflows/update-locales.yaml +++ b/.github/workflows/i18n-update-core.yaml @@ -1,4 +1,5 @@ -name: Update Locales +name: "i18n: Update Core" +description: "Generates and updates translations for core ComfyUI components using OpenAI" on: # Manual dispatch for urgent translation updates @@ -54,5 +55,5 @@ jobs: # Apply the stashed changes if any git stash pop || true git add src/locales/ - git diff --staged --quiet || git commit -m "Update locales [skip ci]" + git diff --staged --quiet || git commit -m "Update locales" git push origin HEAD:${{ github.head_ref }} diff --git a/.github/workflows/update-locales-for-given-custom-node-repository.yaml b/.github/workflows/i18n-update-custom-nodes.yaml similarity index 98% rename from .github/workflows/update-locales-for-given-custom-node-repository.yaml rename to .github/workflows/i18n-update-custom-nodes.yaml index b9d1b33b9..61076f031 100644 --- a/.github/workflows/update-locales-for-given-custom-node-repository.yaml +++ b/.github/workflows/i18n-update-custom-nodes.yaml @@ -1,4 +1,4 @@ -name: Update Locales for given custom node repository +name: i18n Update Custom Nodes on: workflow_dispatch: diff --git a/.github/workflows/update-node-definitions-locales.yaml b/.github/workflows/i18n-update-nodes.yaml similarity index 97% rename from .github/workflows/update-node-definitions-locales.yaml rename to .github/workflows/i18n-update-nodes.yaml index ce991d09e..0b9f1534d 100644 --- a/.github/workflows/update-node-definitions-locales.yaml +++ b/.github/workflows/i18n-update-nodes.yaml @@ -1,4 +1,4 @@ -name: Update Node Definitions Locales +name: i18n Update Nodes on: workflow_dispatch: diff --git a/.github/workflows/auto-backport.yaml b/.github/workflows/pr-backport.yaml similarity index 75% rename from .github/workflows/auto-backport.yaml rename to .github/workflows/pr-backport.yaml index 20eadc0c9..1c9a29230 100644 --- a/.github/workflows/auto-backport.yaml +++ b/.github/workflows/pr-backport.yaml @@ -1,4 +1,4 @@ -name: Auto Backport +name: PR Backport on: pull_request_target: @@ -95,41 +95,61 @@ jobs: echo "skip=true" >> $GITHUB_OUTPUT echo "::warning::Backport PRs already exist for PR #${PR_NUMBER}, skipping to avoid duplicates" - - name: Extract version labels + - name: Collect backport targets if: steps.check-existing.outputs.skip != 'true' - id: versions + id: targets run: | - # Extract version labels (e.g., "1.24", "1.22") - VERSIONS="" - + TARGETS=() + declare -A SEEN=() + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - # For manual triggers, get labels from the PR LABELS=$(gh pr view ${{ inputs.pr_number }} --json labels | jq -r '.labels[].name') else - # For automatic triggers, extract from PR event LABELS='${{ toJSON(github.event.pull_request.labels) }}' LABELS=$(echo "$LABELS" | jq -r '.[].name') fi - - for label in $LABELS; do - # Match version labels like "1.24" (major.minor only) - if [[ "$label" =~ ^[0-9]+\.[0-9]+$ ]]; then - # Validate the branch exists before adding to list - if git ls-remote --exit-code origin "core/${label}" >/dev/null 2>&1; then - VERSIONS="${VERSIONS}${label} " - else - echo "::warning::Label '${label}' found but branch 'core/${label}' does not exist" - fi - fi - done - if [ -z "$VERSIONS" ]; then - echo "::error::No version labels found (e.g., 1.24, 1.22)" + add_target() { + local label="$1" + local target="$2" + + if [ -z "$target" ]; then + return + fi + + target=$(echo "$target" | xargs) + + if [ -z "$target" ] || [ -n "${SEEN[$target]}" ]; then + return + fi + + if git ls-remote --exit-code origin "$target" >/dev/null 2>&1; then + TARGETS+=("$target") + SEEN["$target"]=1 + else + echo "::warning::Label '${label}' references missing branch '${target}'" + fi + } + + while IFS= read -r label; do + [ -z "$label" ] && continue + + if [[ "$label" =~ ^branch:(.+)$ ]]; then + add_target "$label" "${BASH_REMATCH[1]}" + elif [[ "$label" =~ ^backport:(.+)$ ]]; then + add_target "$label" "${BASH_REMATCH[1]}" + elif [[ "$label" =~ ^[0-9]+\.[0-9]+$ ]]; then + add_target "$label" "core/${label}" + fi + done <<< "$LABELS" + + if [ "${#TARGETS[@]}" -eq 0 ]; then + echo "::error::No backport targets found (use labels like '1.24' or 'branch:release/hotfix')" exit 1 fi - echo "versions=${VERSIONS}" >> $GITHUB_OUTPUT - echo "Found version labels: ${VERSIONS}" + echo "targets=${TARGETS[*]}" >> $GITHUB_OUTPUT + echo "Found backport targets: ${TARGETS[*]}" - name: Backport commits if: steps.check-existing.outputs.skip != 'true' @@ -150,16 +170,17 @@ jobs: MERGE_COMMIT="${{ github.event.pull_request.merge_commit_sha }}" fi - for version in ${{ steps.versions.outputs.versions }}; do - echo "::group::Backporting to core/${version}" + for target in ${{ steps.targets.outputs.targets }}; do + TARGET_BRANCH="${target}" + SAFE_TARGET=$(echo "$TARGET_BRANCH" | tr '/' '-') + BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${SAFE_TARGET}" - TARGET_BRANCH="core/${version}" - BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${version}" + echo "::group::Backporting to ${TARGET_BRANCH}" # Fetch target branch (fail if doesn't exist) if ! git fetch origin "${TARGET_BRANCH}"; then echo "::error::Target branch ${TARGET_BRANCH} does not exist" - FAILED="${FAILED}${version}:branch-missing " + FAILED="${FAILED}${TARGET_BRANCH}:branch-missing " echo "::endgroup::" continue fi @@ -170,7 +191,7 @@ jobs: # Try cherry-pick if git cherry-pick "${MERGE_COMMIT}"; then git push origin "${BACKPORT_BRANCH}" - SUCCESS="${SUCCESS}${version}:${BACKPORT_BRANCH} " + SUCCESS="${SUCCESS}${TARGET_BRANCH}:${BACKPORT_BRANCH} " echo "Successfully created backport branch: ${BACKPORT_BRANCH}" # Return to main (keep the branch, we need it for PR) git checkout main @@ -180,7 +201,7 @@ jobs: git cherry-pick --abort echo "::error::Cherry-pick failed due to conflicts" - FAILED="${FAILED}${version}:conflicts:${CONFLICTS} " + FAILED="${FAILED}${TARGET_BRANCH}:conflicts:${CONFLICTS} " # Clean up the failed branch git checkout main @@ -214,13 +235,13 @@ jobs: fi for backport in ${{ steps.backport.outputs.success }}; do - IFS=':' read -r version branch <<< "${backport}" + IFS=':' read -r target branch <<< "${backport}" if PR_URL=$(gh pr create \ - --base "core/${version}" \ + --base "${target}" \ --head "${branch}" \ - --title "[backport ${version}] ${PR_TITLE}" \ - --body "Backport of #${PR_NUMBER} to \`core/${version}\`"$'\n\n'"Automatically created by backport workflow." \ + --title "[backport ${target}] ${PR_TITLE}" \ + --body "Backport of #${PR_NUMBER} to \`${target}\`"$'\n\n'"Automatically created by backport workflow." \ --label "backport" 2>&1); then # Extract PR number from URL @@ -230,9 +251,9 @@ jobs: gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Successfully backported to #${PR_NUM}" fi else - echo "::error::Failed to create PR for ${version}: ${PR_URL}" + echo "::error::Failed to create PR for ${target}: ${PR_URL}" # Still try to comment on the original PR about the failure - gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport branch created but PR creation failed for \`core/${version}\`. Please create the PR manually from branch \`${branch}\`" + gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport branch created but PR creation failed for \`${target}\`. Please create the PR manually from branch \`${branch}\`" fi done @@ -253,16 +274,16 @@ jobs: fi for failure in ${{ steps.backport.outputs.failed }}; do - IFS=':' read -r version reason conflicts <<< "${failure}" + IFS=':' read -r target reason conflicts <<< "${failure}" if [ "${reason}" = "branch-missing" ]; then - gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport failed: Branch \`core/${version}\` does not exist" + gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport failed: Branch \`${target}\` does not exist" elif [ "${reason}" = "conflicts" ]; then # Convert comma-separated conflicts back to newlines for display CONFLICTS_LIST=$(echo "${conflicts}" | tr ',' '\n' | sed 's/^/- /') - COMMENT_BODY="@${PR_AUTHOR} Backport to \`core/${version}\` failed: Merge conflicts detected."$'\n\n'"Please manually cherry-pick commit \`${MERGE_COMMIT}\` to the \`core/${version}\` branch."$'\n\n'"
Conflicting files"$'\n\n'"${CONFLICTS_LIST}"$'\n\n'"
" + COMMENT_BODY="@${PR_AUTHOR} Backport to \`${target}\` failed: Merge conflicts detected."$'\n\n'"Please manually cherry-pick commit \`${MERGE_COMMIT}\` to the \`${target}\` branch."$'\n\n'"
Conflicting files"$'\n\n'"${CONFLICTS_LIST}"$'\n\n'"
" gh pr comment "${PR_NUMBER}" --body "${COMMENT_BODY}" fi done diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/pr-claude-review.yaml similarity index 96% rename from .github/workflows/claude-pr-review.yml rename to .github/workflows/pr-claude-review.yaml index 76a9eb0f3..b09fde14f 100644 --- a/.github/workflows/claude-pr-review.yml +++ b/.github/workflows/pr-claude-review.yaml @@ -1,4 +1,5 @@ -name: Claude PR Review +name: "PR: Claude Review" +description: "AI-powered code review triggered by adding the 'claude-review' label to a PR" permissions: contents: read diff --git a/.github/workflows/update-playwright-expectations.yaml b/.github/workflows/pr-update-playwright-expectations.yaml similarity index 98% rename from .github/workflows/update-playwright-expectations.yaml rename to .github/workflows/pr-update-playwright-expectations.yaml index 61d5051d4..f688c3250 100644 --- a/.github/workflows/update-playwright-expectations.yaml +++ b/.github/workflows/pr-update-playwright-expectations.yaml @@ -1,5 +1,5 @@ # Setting test expectation screenshots for Playwright -name: Update Playwright Expectations +name: "PR: Update Playwright Expectations" on: pull_request: diff --git a/.github/workflows/publish-desktop-ui.yaml b/.github/workflows/publish-desktop-ui.yaml index 92324d2f5..356cf9e78 100644 --- a/.github/workflows/publish-desktop-ui.yaml +++ b/.github/workflows/publish-desktop-ui.yaml @@ -44,6 +44,7 @@ jobs: contents: read env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' + ENABLE_MINIFY: 'true' steps: - name: Validate inputs env: diff --git a/.github/workflows/create-release-branch.yaml b/.github/workflows/release-branch-create.yaml similarity index 99% rename from .github/workflows/create-release-branch.yaml rename to .github/workflows/release-branch-create.yaml index 7891a845d..992e779dd 100644 --- a/.github/workflows/create-release-branch.yaml +++ b/.github/workflows/release-branch-create.yaml @@ -1,4 +1,4 @@ -name: Create Release Branch +name: Release Branch Create on: pull_request: diff --git a/.github/workflows/create-release-draft.yaml b/.github/workflows/release-draft-create.yaml similarity index 90% rename from .github/workflows/create-release-draft.yaml rename to .github/workflows/release-draft-create.yaml index c359e3da4..749523104 100644 --- a/.github/workflows/create-release-draft.yaml +++ b/.github/workflows/release-draft-create.yaml @@ -1,4 +1,4 @@ -name: Create Release Draft +name: Release Draft Create on: pull_request: @@ -28,16 +28,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - tsconfig.tsbuildinfo - key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - release-tools-cache-${{ runner.os }}- - - name: Get current version id: current_version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT @@ -55,6 +45,7 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} + ENABLE_MINIFY: 'true' USE_PROD_CONFIG: 'true' run: | pnpm install --frozen-lockfile @@ -126,7 +117,7 @@ jobs: publish_types: needs: build - uses: ./.github/workflows/publish-frontend-types.yaml + uses: ./.github/workflows/release-npm-types.yaml with: version: ${{ needs.build.outputs.version }} ref: ${{ github.event.pull_request.merge_commit_sha }} diff --git a/.github/workflows/publish-frontend-types.yaml b/.github/workflows/release-npm-types.yaml similarity index 99% rename from .github/workflows/publish-frontend-types.yaml rename to .github/workflows/release-npm-types.yaml index 142a22a93..23f0cc016 100644 --- a/.github/workflows/publish-frontend-types.yaml +++ b/.github/workflows/release-npm-types.yaml @@ -1,4 +1,4 @@ -name: Publish Frontend Types +name: Release NPM Types on: workflow_dispatch: diff --git a/.github/workflows/create-dev-pypi-package.yaml b/.github/workflows/release-pypi-dev.yaml similarity index 86% rename from .github/workflows/create-dev-pypi-package.yaml rename to .github/workflows/release-pypi-dev.yaml index b592a8371..868321759 100644 --- a/.github/workflows/create-dev-pypi-package.yaml +++ b/.github/workflows/release-pypi-dev.yaml @@ -1,4 +1,4 @@ -name: Create Dev PyPI Package +name: Release PyPI Dev on: workflow_dispatch: @@ -25,17 +25,6 @@ jobs: node-version: 'lts/*' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - dist - tsconfig.tsbuildinfo - key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - dev-release-tools-cache-${{ runner.os }}- - - name: Get current version id: current_version run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT @@ -44,6 +33,7 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} + ENABLE_MINIFY: 'true' USE_PROD_CONFIG: 'true' run: | pnpm install --frozen-lockfile diff --git a/.github/workflows/version-bump.yaml b/.github/workflows/release-version-bump.yaml similarity index 63% rename from .github/workflows/version-bump.yaml rename to .github/workflows/release-version-bump.yaml index 4073729db..5f3152285 100644 --- a/.github/workflows/version-bump.yaml +++ b/.github/workflows/release-version-bump.yaml @@ -1,4 +1,5 @@ -name: Version Bump +name: "Release: Version Bump" +description: "Manual workflow to increment package version with semantic versioning support" on: workflow_dispatch: @@ -14,6 +15,11 @@ on: required: false default: '' type: string + branch: + description: 'Base branch to bump (e.g., main, core/1.29, core/1.30)' + required: true + default: 'main' + type: string jobs: bump-version: @@ -25,6 +31,24 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v5 + with: + ref: ${{ github.event.inputs.branch }} + fetch-depth: 0 + + - name: Validate branch exists + run: | + BRANCH="${{ github.event.inputs.branch }}" + if ! git show-ref --verify --quiet "refs/heads/$BRANCH" && ! git show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then + echo "❌ Branch '$BRANCH' does not exist" + echo "" + echo "Available core branches:" + git branch -r | grep 'origin/core/' | sed 's/.*origin\// - /' || echo " (none found)" + echo "" + echo "Main branch:" + echo " - main" + exit 1 + fi + echo "✅ Branch '$BRANCH' exists" - name: Install pnpm uses: pnpm/action-setup@v4 @@ -58,7 +82,9 @@ jobs: title: ${{ steps.bump-version.outputs.NEW_VERSION }} body: | ${{ steps.capitalised.outputs.capitalised }} version increment to ${{ steps.bump-version.outputs.NEW_VERSION }} + + **Base branch:** `${{ github.event.inputs.branch }}` branch: version-bump-${{ steps.bump-version.outputs.NEW_VERSION }} - base: main + base: ${{ github.event.inputs.branch }} labels: | Release diff --git a/.github/workflows/size-data.yml b/.github/workflows/size-data.yml new file mode 100644 index 000000000..8da55d0c2 --- /dev/null +++ b/.github/workflows/size-data.yml @@ -0,0 +1,52 @@ +name: size data + +on: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + collect: + if: github.repository == 'Comfy-Org/ComfyUI_frontend' + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v5 + + - name: Install pnpm + uses: pnpm/action-setup@v4.1.0 + with: + version: 10 + + - name: Install Node.js + uses: actions/setup-node@v5 + with: + node-version: '24.x' + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Build project + run: pnpm build + + - name: Collect size data + run: node scripts/size-collect.js + + - name: Save PR number & base branch + if: ${{ github.event_name == 'pull_request' }} + run: | + echo ${{ github.event.number }} > ./temp/size/number.txt + echo ${{ github.base_ref }} > ./temp/size/base.txt + + - name: Upload size data + uses: actions/upload-artifact@v4 + with: + name: size-data + path: temp/size diff --git a/.github/workflows/size-report.yml b/.github/workflows/size-report.yml new file mode 100644 index 000000000..caaafd30a --- /dev/null +++ b/.github/workflows/size-report.yml @@ -0,0 +1,104 @@ +name: size report + +on: + workflow_run: + workflows: ['size data'] + types: + - completed + workflow_dispatch: + inputs: + pr_number: + description: 'PR number to report on' + required: true + type: number + run_id: + description: 'Size data workflow run ID' + required: true + type: string + +permissions: + contents: read + pull-requests: write + issues: write + +jobs: + size-report: + runs-on: ubuntu-latest + if: > + github.repository == 'Comfy-Org/ComfyUI_frontend' && + ( + (github.event_name == 'workflow_run' && + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success') || + github.event_name == 'workflow_dispatch' + ) + steps: + - uses: actions/checkout@v5 + + - name: Install pnpm + uses: pnpm/action-setup@v4.1.0 + with: + version: 10 + + - name: Install Node.js + uses: actions/setup-node@v5 + with: + node-version: '24.x' + cache: pnpm + + - name: Install dependencies + run: pnpm install + + - name: Download size data + uses: dawidd6/action-download-artifact@v11 + with: + name: size-data + run_id: ${{ github.event_name == 'workflow_dispatch' && inputs.run_id || github.event.workflow_run.id }} + path: temp/size + + - name: Set PR number + id: pr-number + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + echo "content=${{ inputs.pr_number }}" >> $GITHUB_OUTPUT + else + echo "content=$(cat temp/size/number.txt)" >> $GITHUB_OUTPUT + fi + + - name: Set base branch + id: pr-base + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + echo "content=main" >> $GITHUB_OUTPUT + else + echo "content=$(cat temp/size/base.txt)" >> $GITHUB_OUTPUT + fi + + - name: Download previous size data + uses: dawidd6/action-download-artifact@v11 + with: + branch: ${{ steps.pr-base.outputs.content }} + workflow: size-data.yml + event: push + name: size-data + path: temp/size-prev + if_no_artifact_found: warn + + - name: Generate size report + run: node scripts/size-report.js > size-report.md + + - name: Read size report + id: size-report + uses: juliangruber/read-file-action@v1 + with: + path: ./size-report.md + + - name: Create or update PR comment + uses: actions-cool/maintain-one-comment@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + number: ${{ steps.pr-number.outputs.content }} + body: | + ${{ steps.size-report.outputs.content }} + + body-include: '' diff --git a/.github/workflows/version-bump-desktop-ui.yaml b/.github/workflows/version-bump-desktop-ui.yaml index 6d5d01c67..123cdbd9b 100644 --- a/.github/workflows/version-bump-desktop-ui.yaml +++ b/.github/workflows/version-bump-desktop-ui.yaml @@ -14,6 +14,11 @@ on: required: false default: '' type: string + branch: + description: 'Base branch to bump (e.g., main, core/1.29, core/1.30)' + required: true + default: 'main' + type: string jobs: bump-version-desktop-ui: @@ -26,8 +31,25 @@ jobs: - name: Checkout repository uses: actions/checkout@v5 with: + ref: ${{ github.event.inputs.branch }} + fetch-depth: 0 persist-credentials: false + - name: Validate branch exists + run: | + BRANCH="${{ github.event.inputs.branch }}" + if ! git show-ref --verify --quiet "refs/heads/$BRANCH" && ! git show-ref --verify --quiet "refs/remotes/origin/$BRANCH"; then + echo "❌ Branch '$BRANCH' does not exist" + echo "" + echo "Available core branches:" + git branch -r | grep 'origin/core/' | sed 's/.*origin\// - /' || echo " (none found)" + echo "" + echo "Main branch:" + echo " - main" + exit 1 + fi + echo "✅ Branch '$BRANCH' exists" + - name: Install pnpm uses: pnpm/action-setup@v4 with: @@ -64,8 +86,10 @@ jobs: title: desktop-ui ${{ steps.bump-version.outputs.NEW_VERSION }} body: | ${{ steps.capitalised.outputs.capitalised }} version increment for @comfyorg/desktop-ui to ${{ steps.bump-version.outputs.NEW_VERSION }} + + **Base branch:** `${{ github.event.inputs.branch }}` branch: desktop-ui-version-bump-${{ steps.bump-version.outputs.NEW_VERSION }} - base: main + base: ${{ github.event.inputs.branch }} labels: | Release diff --git a/apps/desktop-ui/src/components/maintenance/TaskCard.vue b/apps/desktop-ui/src/components/maintenance/TaskCard.vue index 1287169ce..e7d24d100 100644 --- a/apps/desktop-ui/src/components/maintenance/TaskCard.vue +++ b/apps/desktop-ui/src/components/maintenance/TaskCard.vue @@ -1,23 +1,23 @@