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/.env_example b/.env_example index 520521fe0..b77b87bc0 100644 --- a/.env_example +++ b/.env_example @@ -5,6 +5,10 @@ PLAYWRIGHT_TEST_URL=http://localhost:5173 # Proxy target of the local development server # Note: localhost:8188 does not work. +# Cloud auto-detection: Setting this to any *.comfy.org URL automatically enables +# cloud mode (DISTRIBUTION=cloud) without needing to set DISTRIBUTION separately. +# Examples: https://testcloud.comfy.org/, https://stagingcloud.comfy.org/, +# https://pr-123.testenvs.comfy.org/, https://cloud.comfy.org/ DEV_SERVER_COMFYUI_URL=http://127.0.0.1:8188 # Allow dev server access from remote IP addresses. @@ -19,10 +23,10 @@ TEST_COMFYUI_DIR=/home/ComfyUI # Whether to enable minification of the frontend code. ENABLE_MINIFY=true -# Whether to disable proxying the `/templates` route. If true, allows you to -# serve templates from the ComfyUI_frontend/public/templates folder (for -# locally testing changes to templates). When false or nonexistent, the -# templates are served via the normal method from the server's python site +# Whether to disable proxying the `/templates` route. If true, allows you to +# serve templates from the ComfyUI_frontend/public/templates folder (for +# locally testing changes to templates). When false or nonexistent, the +# templates are served via the normal method from the server's python site # packages. DISABLE_TEMPLATES_PROXY=false @@ -33,3 +37,8 @@ DISABLE_VUE_PLUGINS=false # Algolia credentials required for developing with the new custom node manager. ALGOLIA_APP_ID=4E0RO38HS8 ALGOLIA_API_KEY=684d998c36b67a9a9fce8fc2d8860579 + +# Sentry ENV vars replace with real ones for debugging +# SENTRY_AUTH_TOKEN=private-token # get from sentry +# SENTRY_ORG=comfy-org +# SENTRY_PROJECT=cloud-frontend-staging diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 06139b08a..3c9750e0f 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -25,3 +25,6 @@ e3bb29ceb8174b8bbca9e48ec7d42cd540f40efa # [refactor] Improve updates/notifications domain organization (#5590) 27ab355f9c73415dc39f4d3f512b02308f847801 + +# Migrate Tailwind styles to design-system package +9f19d8fb4bd22518879343b49c05634dca777df0 diff --git a/.gitattributes b/.gitattributes index 0f538ae76..39d7f722c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,6 +7,7 @@ *.json text eol=lf *.mjs text eol=lf *.mts text eol=lf +*.snap text eol=lf *.ts text eol=lf *.vue text eol=lf *.yaml text eol=lf 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..6ebfd8d38 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,27 +33,15 @@ 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 - name: Run ESLint with auto-fix run: pnpm lint:fix + - name: Run Stylelint with auto-fix + run: pnpm stylelint:fix + - name: Run Prettier with auto-format run: pnpm format @@ -77,6 +66,7 @@ jobs: - name: Final validation run: | pnpm lint + pnpm stylelint pnpm format:check pnpm knip 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/ci-size-data.yaml b/.github/workflows/ci-size-data.yaml new file mode 100644 index 000000000..a21c93110 --- /dev/null +++ b/.github/workflows/ci-size-data.yaml @@ -0,0 +1,52 @@ +name: "CI: 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/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 0d33ecf19..690417a04 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 bfac96530..77dcf5210 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 @@ -51,19 +50,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile @@ -116,19 +102,6 @@ jobs: node-version: '20' cache: 'pnpm' - - name: Cache tool outputs - uses: actions/cache@v4 - with: - path: | - .cache - storybook-static - tsconfig.tsbuildinfo - key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }} - restore-keys: | - storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}- - storybook-cache-${{ runner.os }}- - storybook-tools-cache-${{ runner.os }}- - - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/vitest-tests.yaml b/.github/workflows/ci-tests-unit.yaml similarity index 55% rename from .github/workflows/vitest-tests.yaml rename to .github/workflows/ci-tests-unit.yaml index 394145188..2f4417594 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 f38113835..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 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 53% rename from .github/workflows/auto-backport.yaml rename to .github/workflows/pr-backport.yaml index 20eadc0c9..8729c5d57 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: @@ -69,70 +69,139 @@ jobs: git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - - name: Check if backports already exist - id: check-existing - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} + - name: Collect backport targets + id: targets run: | - # Check for existing backport PRs for this PR number - EXISTING_BACKPORTS=$(gh pr list --state all --search "backport-${PR_NUMBER}-to" --json title,headRefName,baseRefName | jq -r '.[].headRefName') - - if [ -z "$EXISTING_BACKPORTS" ]; then - echo "skip=false" >> $GITHUB_OUTPUT - exit 0 - fi - - # For manual triggers with force_rerun, proceed anyway - if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ inputs.force_rerun }}" = "true" ]; then - echo "skip=false" >> $GITHUB_OUTPUT - echo "::warning::Force rerun requested - existing backports will be updated" - exit 0 - fi - - echo "Found existing backport PRs:" - echo "$EXISTING_BACKPORTS" - echo "skip=true" >> $GITHUB_OUTPUT - echo "::warning::Backport PRs already exist for PR #${PR_NUMBER}, skipping to avoid duplicates" + TARGETS=() + declare -A SEEN=() - - name: Extract version labels - if: steps.check-existing.outputs.skip != 'true' - id: versions - run: | - # Extract version labels (e.g., "1.24", "1.22") - VERSIONS="" - 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" =~ ^core\/([0-9]+)\.([0-9]+)$ ]]; then + SAFE_MAJOR="${BASH_REMATCH[1]}" + SAFE_MINOR="${BASH_REMATCH[2]}" + add_target "$label" "core/${SAFE_MAJOR}.${SAFE_MINOR}" + elif [[ "$label" =~ ^cloud\/([0-9]+)\.([0-9]+)$ ]]; then + SAFE_MAJOR="${BASH_REMATCH[1]}" + SAFE_MINOR="${BASH_REMATCH[2]}" + add_target "$label" "cloud/${SAFE_MAJOR}.${SAFE_MINOR}" + 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: Filter already backported targets + id: filter-targets + env: + EVENT_NAME: ${{ github.event_name }} + FORCE_RERUN_INPUT: >- + ${{ github.event_name == 'workflow_dispatch' && inputs.force_rerun + || 'false' }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: >- + ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number + || github.event.pull_request.number }} + run: | + set -euo pipefail + + REQUESTED_TARGETS="${{ steps.targets.outputs.targets }}" + if [ -z "$REQUESTED_TARGETS" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + echo "pending-targets=" >> $GITHUB_OUTPUT + exit 0 + fi + + FORCE_RERUN=false + if [ "$EVENT_NAME" = "workflow_dispatch" ] && [ "$FORCE_RERUN_INPUT" = "true" ]; then + FORCE_RERUN=true + fi + + mapfile -t EXISTING_BRANCHES < <( + git ls-remote --heads origin "backport-${PR_NUMBER}-to-*" || true + ) + + PENDING=() + SKIPPED=() + + for target in $REQUESTED_TARGETS; do + SAFE_TARGET=$(echo "$target" | tr '/' '-') + BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${SAFE_TARGET}" + + if [ "$FORCE_RERUN" = true ]; then + PENDING+=("$target") + continue + fi + + if printf '%s\n' "${EXISTING_BRANCHES[@]:-}" | + grep -Fq "refs/heads/${BACKPORT_BRANCH}"; then + SKIPPED+=("$target") + else + PENDING+=("$target") + fi + done + + SKIPPED_JOINED="${SKIPPED[*]:-}" + PENDING_JOINED="${PENDING[*]:-}" + + echo "already-exists=${SKIPPED_JOINED}" >> $GITHUB_OUTPUT + echo "pending-targets=${PENDING_JOINED}" >> $GITHUB_OUTPUT + + if [ -z "$PENDING_JOINED" ]; then + echo "skip=true" >> $GITHUB_OUTPUT + if [ -n "$SKIPPED_JOINED" ]; then + echo "::warning::Backport branches already exist for: ${SKIPPED_JOINED}" + fi + else + echo "skip=false" >> $GITHUB_OUTPUT + if [ -n "$SKIPPED_JOINED" ]; then + echo "::notice::Skipping already backported targets: ${SKIPPED_JOINED}" + fi + fi - name: Backport commits - if: steps.check-existing.outputs.skip != 'true' + if: steps.filter-targets.outputs.skip != 'true' id: backport env: PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} @@ -150,16 +219,25 @@ 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.filter-targets.outputs.pending-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 + + # Check if commit already exists on target branch + if git branch -r --contains "${MERGE_COMMIT}" | grep -q "origin/${TARGET_BRANCH}"; then + echo "::notice::Commit ${MERGE_COMMIT} already exists on ${TARGET_BRANCH}, skipping backport" + FAILED="${FAILED}${TARGET_BRANCH}:already-exists " echo "::endgroup::" continue fi @@ -170,7 +248,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 +258,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 @@ -198,7 +276,7 @@ jobs: fi - name: Create PR for each successful backport - if: steps.check-existing.outputs.skip != 'true' && steps.backport.outputs.success + if: steps.filter-targets.outputs.skip != 'true' && steps.backport.outputs.success env: GH_TOKEN: ${{ secrets.PR_GH_TOKEN }} PR_NUMBER: ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} @@ -214,13 +292,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,14 +308,14 @@ 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 - name: Comment on failures - if: steps.check-existing.outputs.skip != 'true' && failure() && steps.backport.outputs.failed + if: steps.filter-targets.outputs.skip != 'true' && failure() && steps.backport.outputs.failed env: GH_TOKEN: ${{ github.token }} run: | @@ -253,16 +331,25 @@ 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}" = "already-exists" ]; then + gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Commit \`${MERGE_COMMIT}\` already exists on branch \`${target}\`. No backport needed." 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 + + - name: Remove needs-backport label + if: steps.filter-targets.outputs.skip != 'true' && success() + run: gh pr edit ${{ github.event_name == 'workflow_dispatch' && inputs.pr_number || github.event.pull_request.number }} --remove-label "needs-backport" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/pr-claude-review.yaml similarity index 62% rename from .github/workflows/claude-pr-review.yml rename to .github/workflows/pr-claude-review.yaml index 76a9eb0f3..e4684af07 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 @@ -16,39 +17,9 @@ concurrency: cancel-in-progress: true jobs: - wait-for-ci: + claude-review: runs-on: ubuntu-latest if: github.event.label.name == 'claude-review' - outputs: - should-proceed: ${{ steps.check-status.outputs.proceed }} - steps: - - name: Wait for other CI checks - uses: lewagon/wait-on-check-action@e106e5c43e8ca1edea6383a39a01c5ca495fd812 - with: - ref: ${{ github.event.pull_request.head.sha }} - check-regexp: '^(lint-and-format|test|playwright-tests)' - wait-interval: 30 - repo-token: ${{ secrets.GITHUB_TOKEN }} - - - name: Check if we should proceed - id: check-status - run: | - CHECK_RUNS=$(gh api repos/${{ github.repository }}/commits/${{ github.event.pull_request.head.sha }}/check-runs --jq '.check_runs[] | select(.name | test("lint-and-format")) | {name, conclusion}') - - if echo "$CHECK_RUNS" | grep -Eq '"conclusion": "(failure|cancelled|timed_out|action_required)"'; then - echo "Some CI checks failed - skipping Claude review" - echo "proceed=false" >> $GITHUB_OUTPUT - else - echo "All CI checks passed - proceeding with Claude review" - echo "proceed=true" >> $GITHUB_OUTPUT - fi - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - claude-review: - needs: wait-for-ci - if: needs.wait-for-ci.outputs.should-proceed == 'true' - runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout repository diff --git a/.github/workflows/pr-size-report.yaml b/.github/workflows/pr-size-report.yaml new file mode 100644 index 000000000..968888aa9 --- /dev/null +++ b/.github/workflows/pr-size-report.yaml @@ -0,0 +1,104 @@ +name: "PR: Size Report" + +on: + workflow_run: + workflows: ['CI: 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: + comment: + 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: ci-size-data.yaml + 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/pr-update-playwright-expectations.yaml b/.github/workflows/pr-update-playwright-expectations.yaml new file mode 100644 index 000000000..a01362466 --- /dev/null +++ b/.github/workflows/pr-update-playwright-expectations.yaml @@ -0,0 +1,309 @@ +# Setting test expectation screenshots for Playwright +name: "PR: Update Playwright Expectations" + +on: + pull_request: + types: [labeled] + issue_comment: + types: [created] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + setup: + runs-on: ubuntu-latest + if: > + ( github.event_name == 'pull_request' && github.event.label.name == 'New Browser Test Expectations' ) || + ( github.event.issue.pull_request && + github.event_name == 'issue_comment' && + ( + github.event.comment.author_association == 'OWNER' || + github.event.comment.author_association == 'MEMBER' || + github.event.comment.author_association == 'COLLABORATOR' + ) && + startsWith(github.event.comment.body, '/update-playwright') ) + outputs: + cache-key: ${{ steps.cache-key.outputs.key }} + pr-number: ${{ steps.pr-info.outputs.pr-number }} + branch: ${{ steps.pr-info.outputs.branch }} + comment-id: ${{ steps.find-update-comment.outputs.comment-id }} + steps: + - name: Get PR info + id: pr-info + run: | + echo "pr-number=${{ github.event.number || github.event.issue.number }}" >> $GITHUB_OUTPUT + echo "branch=$(gh pr view ${{ github.event.number || github.event.issue.number }} --repo ${{ github.repository }} --json headRefName --jq '.headRefName')" >> $GITHUB_OUTPUT + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Find Update Comment + uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad + id: "find-update-comment" + with: + issue-number: ${{ steps.pr-info.outputs.pr-number }} + comment-author: "github-actions[bot]" + body-includes: "Updating Playwright Expectations" + + - name: Add Starting Reaction + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 + with: + comment-id: ${{ steps.find-update-comment.outputs.comment-id }} + issue-number: ${{ steps.pr-info.outputs.pr-number }} + body: | + Updating Playwright Expectations + edit-mode: replace + reactions: eyes + + - name: Checkout repository + uses: actions/checkout@v5 + with: + ref: ${{ steps.pr-info.outputs.branch }} + - name: Setup frontend + uses: ./.github/actions/setup-frontend + with: + include_build_step: true + # Save expensive build artifacts (Python env, built frontend, node_modules) + # Source code will be checked out fresh in sharded jobs + - name: Generate cache key + id: cache-key + run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT + - name: Save cache + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 + with: + path: | + ComfyUI + dist + key: comfyui-setup-${{ steps.cache-key.outputs.key }} + + # Sharded snapshot updates + update-snapshots-sharded: + needs: setup + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + shardIndex: [1, 2, 3, 4] + shardTotal: [4] + steps: + # Checkout source code fresh (not cached) + - name: Checkout repository + uses: actions/checkout@v5 + with: + ref: ${{ needs.setup.outputs.branch }} + + # Restore expensive build artifacts from setup job + - name: Restore cached artifacts + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 + with: + fail-on-cache-miss: true + path: | + ComfyUI + dist + key: comfyui-setup-${{ needs.setup.outputs.cache-key }} + + - name: Setup ComfyUI server (from cache) + uses: ./.github/actions/setup-comfyui-server + with: + launch_server: true + + - name: Setup nodejs, pnpm, reuse built frontend + uses: ./.github/actions/setup-frontend + + - name: Setup Playwright + uses: ./.github/actions/setup-playwright + + # Run sharded tests with snapshot updates + - name: Update snapshots (Shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) + id: playwright-tests + run: pnpm exec playwright test --update-snapshots --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} + continue-on-error: true + + # Identify and stage only changed snapshot files + - name: Stage changed snapshot files + id: changed-snapshots + run: | + echo "==========================================" + echo "STAGING CHANGED SNAPSHOTS (Shard ${{ matrix.shardIndex }})" + echo "==========================================" + + # Get list of changed snapshot files + changed_files=$(git diff --name-only browser_tests/ 2>/dev/null | grep -E '\-snapshots/' || echo "") + + if [ -z "$changed_files" ]; then + echo "No snapshot changes in this shard" + echo "has-changes=false" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "✓ Found changed files:" + echo "$changed_files" + file_count=$(echo "$changed_files" | wc -l) + echo "Count: $file_count" + echo "has-changes=true" >> $GITHUB_OUTPUT + echo "" + + # Create staging directory + mkdir -p /tmp/changed_snapshots_shard + + # Copy only changed files, preserving directory structure + # Strip 'browser_tests/' prefix to avoid double nesting + echo "Copying changed files to staging directory..." + while IFS= read -r file; do + # Remove 'browser_tests/' prefix + file_without_prefix="${file#browser_tests/}" + # Create parent directories + mkdir -p "/tmp/changed_snapshots_shard/$(dirname "$file_without_prefix")" + # Copy file + cp "$file" "/tmp/changed_snapshots_shard/$file_without_prefix" + echo " → $file_without_prefix" + done <<< "$changed_files" + + echo "" + echo "Staged files for upload:" + find /tmp/changed_snapshots_shard -type f + + # Upload ONLY the changed files from this shard + - name: Upload changed snapshots + uses: actions/upload-artifact@v4 + if: steps.changed-snapshots.outputs.has-changes == 'true' + with: + name: snapshots-shard-${{ matrix.shardIndex }} + path: /tmp/changed_snapshots_shard/ + retention-days: 1 + + - name: Upload test report + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report-shard-${{ matrix.shardIndex }} + path: ./playwright-report/ + retention-days: 30 + + # Merge snapshots and commit + merge-and-commit: + needs: [setup, update-snapshots-sharded] + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + ref: ${{ needs.setup.outputs.branch }} + + # Download all changed snapshot files from shards + - name: Download snapshot artifacts + uses: actions/download-artifact@v4 + with: + pattern: snapshots-shard-* + path: ./downloaded-snapshots + merge-multiple: false + + - name: List downloaded files + run: | + echo "==========================================" + echo "DOWNLOADED SNAPSHOT FILES" + echo "==========================================" + find ./downloaded-snapshots -type f + echo "" + echo "Total files: $(find ./downloaded-snapshots -type f | wc -l)" + + # Merge only the changed files into browser_tests + - name: Merge changed snapshots + run: | + set -euo pipefail + + echo "==========================================" + echo "MERGING CHANGED SNAPSHOTS" + echo "==========================================" + + # Verify target directory exists + if [ ! -d "browser_tests" ]; then + echo "::error::Target directory 'browser_tests' does not exist" + exit 1 + fi + + merged_count=0 + + # For each shard's changed files, copy them directly + for shard_dir in ./downloaded-snapshots/snapshots-shard-*/; do + if [ ! -d "$shard_dir" ]; then + continue + fi + + shard_name=$(basename "$shard_dir") + file_count=$(find "$shard_dir" -type f | wc -l) + + if [ "$file_count" -eq 0 ]; then + echo " $shard_name: no files" + continue + fi + + echo "Processing $shard_name ($file_count file(s))..." + + # Copy files directly, preserving directory structure + # Since files are already in correct structure (no browser_tests/ prefix), just copy them all + cp -v -r "$shard_dir"* browser_tests/ 2>&1 | sed 's/^/ /' + + merged_count=$((merged_count + 1)) + echo " ✓ Merged" + echo "" + done + + echo "==========================================" + echo "MERGE COMPLETE" + echo "==========================================" + echo "Shards merged: $merged_count" + + - name: Show changes + run: | + echo "==========================================" + echo "CHANGES SUMMARY" + echo "==========================================" + echo "" + echo "Changed files in browser_tests:" + git diff --name-only browser_tests/ | head -20 || echo "No changes" + echo "" + echo "Total changes:" + git diff --name-only browser_tests/ | wc -l || echo "0" + + - name: Commit updated expectations + id: commit + run: | + git config --global user.name 'github-actions' + git config --global user.email 'github-actions@github.com' + + if git diff --quiet browser_tests/; then + echo "No changes to commit" + echo "has-changes=false" >> $GITHUB_OUTPUT + exit 0 + fi + + echo "==========================================" + echo "COMMITTING CHANGES" + echo "==========================================" + + echo "has-changes=true" >> $GITHUB_OUTPUT + + git add browser_tests/ + git commit -m "[automated] Update test expectations" + + echo "Pushing to ${{ needs.setup.outputs.branch }}..." + git push origin ${{ needs.setup.outputs.branch }} + + echo "✓ Commit and push successful" + + - name: Add Done Reaction + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 + if: github.event_name == 'issue_comment' && steps.commit.outputs.has-changes == 'true' + with: + comment-id: ${{ needs.setup.outputs.comment-id }} + issue-number: ${{ needs.setup.outputs.pr-number }} + reactions: +1 + reactions-edit-mode: replace + + - name: Remove New Browser Test Expectations label + if: always() && github.event_name == 'pull_request' + run: gh pr edit ${{ needs.setup.outputs.pr-number }} --remove-label "New Browser Test Expectations" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/publish-desktop-ui.yaml b/.github/workflows/publish-desktop-ui.yaml index 92324d2f5..d2741d792 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: @@ -160,20 +161,6 @@ jobs: echo "publish_dir=$PUBLISH_DIR" >> "$GITHUB_OUTPUT" echo "name=$NAME" >> "$GITHUB_OUTPUT" - - name: Pack (preview only) - shell: bash - working-directory: ${{ steps.pkg.outputs.publish_dir }} - run: | - set -euo pipefail - npm pack --json | tee pack-result.json - - - name: Upload package tarball artifact - uses: actions/upload-artifact@v4 - with: - name: desktop-ui-npm-tarball-${{ inputs.version }} - path: ${{ steps.pkg.outputs.publish_dir }}/*.tgz - if-no-files-found: error - - name: Check if version already on npm id: check_npm env: diff --git a/.github/workflows/create-release-branch.yaml b/.github/workflows/release-branch-create.yaml similarity index 59% rename from .github/workflows/create-release-branch.yaml rename to .github/workflows/release-branch-create.yaml index 7891a845d..434100ff3 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: @@ -69,6 +69,9 @@ jobs: echo "prev_version=$PREV_VERSION" >> $GITHUB_OUTPUT echo "prev_minor=$PREV_MINOR" >> $GITHUB_OUTPUT + BASE_COMMIT=$(git rev-parse HEAD) + echo "base_commit=$BASE_COMMIT" >> $GITHUB_OUTPUT + # Get previous major version for comparison PREV_MAJOR=$(echo $PREV_VERSION | cut -d. -f1) @@ -87,13 +90,13 @@ jobs: elif [[ "$MAJOR" -gt "$PREV_MAJOR" && "$MINOR" == "0" && "$PATCH" == "0" ]]; then # Major version bump (e.g., 1.99.x → 2.0.0) echo "is_minor_bump=true" >> $GITHUB_OUTPUT - BRANCH_NAME="core/${PREV_MAJOR}.${PREV_MINOR}" - echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT + BRANCH_BASE="${PREV_MAJOR}.${PREV_MINOR}" + echo "branch_base=$BRANCH_BASE" >> $GITHUB_OUTPUT elif [[ "$MAJOR" == "$PREV_MAJOR" && "$MINOR" -gt "$PREV_MINOR" && "$PATCH" == "0" ]]; then # Minor version bump (e.g., 1.23.x → 1.24.0) echo "is_minor_bump=true" >> $GITHUB_OUTPUT - BRANCH_NAME="core/${MAJOR}.${PREV_MINOR}" - echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT + BRANCH_BASE="${MAJOR}.${PREV_MINOR}" + echo "branch_base=$BRANCH_BASE" >> $GITHUB_OUTPUT else echo "is_minor_bump=false" >> $GITHUB_OUTPUT fi @@ -101,64 +104,97 @@ jobs: # Return to main branch git checkout main - - name: Create release branch + - name: Create release branches + id: create_branches if: steps.check_version.outputs.is_minor_bump == 'true' run: | - BRANCH_NAME="${{ steps.check_version.outputs.branch_name }}" + BRANCH_BASE="${{ steps.check_version.outputs.branch_base }}" + PREV_VERSION="${{ steps.check_version.outputs.prev_version }}" - # Check if branch already exists - if git ls-remote --heads origin "$BRANCH_NAME" | grep -q "$BRANCH_NAME"; then - echo "⚠️ Branch $BRANCH_NAME already exists, skipping creation" - echo "branch_exists=true" >> $GITHUB_ENV - exit 0 - else - echo "branch_exists=false" >> $GITHUB_ENV + if [[ -z "$BRANCH_BASE" ]]; then + echo "::error::Branch base not set; unable to determine release branches" + exit 1 fi - # Create branch from the commit BEFORE the version bump - # This ensures the release branch has the previous minor version - git checkout -b "$BRANCH_NAME" HEAD^1 + BASE_COMMIT="${{ steps.check_version.outputs.base_commit }}" - # Push the new branch - git push origin "$BRANCH_NAME" + if [[ -z "$BASE_COMMIT" ]]; then + echo "::error::Base commit not provided; cannot create release branches" + exit 1 + fi - echo "✅ Created release branch: $BRANCH_NAME" - echo "This branch is now in feature freeze and will only receive:" - echo "- Bug fixes" - echo "- Critical security patches" - echo "- Documentation updates" + RESULTS_FILE=$(mktemp) + trap 'rm -f "$RESULTS_FILE"' EXIT + for PREFIX in core cloud; do + BRANCH_NAME="${PREFIX}/${BRANCH_BASE}" + + if git ls-remote --exit-code --heads origin \ + "$BRANCH_NAME" >/dev/null 2>&1; then + echo "⚠️ Branch $BRANCH_NAME already exists" + echo "ℹ️ Skipping creation for $BRANCH_NAME" + STATUS="exists" + else + # Create branch from the commit BEFORE the version bump + if ! git push origin "$BASE_COMMIT:refs/heads/$BRANCH_NAME"; then + echo "::error::Failed to push release branch $BRANCH_NAME" + exit 1 + fi + echo "✅ Created release branch: $BRANCH_NAME" + STATUS="created" + fi + + echo "$BRANCH_NAME|$STATUS|$PREV_VERSION" >> "$RESULTS_FILE" + done + + { + echo "results<<'EOF'" + cat "$RESULTS_FILE" + echo "EOF" + } >> $GITHUB_OUTPUT - name: Post summary if: steps.check_version.outputs.is_minor_bump == 'true' run: | - BRANCH_NAME="${{ steps.check_version.outputs.branch_name }}" - PREV_VERSION="${{ steps.check_version.outputs.prev_version }}" CURRENT_VERSION="${{ steps.check_version.outputs.current_version }}" + RESULTS="${{ steps.create_branches.outputs.results }}" - if [[ "${{ env.branch_exists }}" == "true" ]]; then + if [[ -z "$RESULTS" ]]; then cat >> $GITHUB_STEP_SUMMARY << EOF - ## 🌿 Release Branch Already Exists + ## 🌿 Release Branch Summary - The release branch for the previous minor version already exists: - EOF - else - cat >> $GITHUB_STEP_SUMMARY << EOF - ## 🌿 Release Branch Created - - A new release branch has been created for the previous minor version: + Release branch creation skipped; no eligible branches were found. EOF + exit 0 fi cat >> $GITHUB_STEP_SUMMARY << EOF + ## 🌿 Release Branch Summary - - **Branch**: \`$BRANCH_NAME\` - - **Version**: \`$PREV_VERSION\` (feature frozen) - **Main branch**: \`$CURRENT_VERSION\` (active development) + ### Branch Status + EOF + + while IFS='|' read -r BRANCH STATUS PREV_VERSION; do + if [[ "$STATUS" == "created" ]]; then + cat >> $GITHUB_STEP_SUMMARY << EOF + + - \`$BRANCH\` created from version \`$PREV_VERSION\` + EOF + else + cat >> $GITHUB_STEP_SUMMARY << EOF + + - \`$BRANCH\` already existed (based on version \`$PREV_VERSION\`) + EOF + fi + done <<< "$RESULTS" + + cat >> $GITHUB_STEP_SUMMARY << EOF + ### Branch Policy - The \`$BRANCH_NAME\` branch is now in **feature freeze** and will only accept: + Release branches are feature-frozen and only accept: - 🐛 Bug fixes - 🔒 Security patches - 📚 Documentation updates @@ -167,9 +203,9 @@ jobs: ### Backporting Changes - To backport a fix to this release branch: + To backport a fix: 1. Create your fix on \`main\` first - 2. Cherry-pick to \`$BRANCH_NAME\` - 3. Create a PR targeting \`$BRANCH_NAME\` - 4. Use the \`Release\` label on the PR + 2. Cherry-pick to the target release branch + 3. Create a PR targeting that branch + 4. Apply the matching \`core/x.y\` or \`cloud/x.y\` label EOF 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..30254c6aa 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 @@ -35,7 +59,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: lts/* - cache: 'pnpm' - name: Bump version id: bump-version @@ -58,7 +81,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/update-playwright-expectations.yaml b/.github/workflows/update-playwright-expectations.yaml deleted file mode 100644 index 61d5051d4..000000000 --- a/.github/workflows/update-playwright-expectations.yaml +++ /dev/null @@ -1,108 +0,0 @@ -# Setting test expectation screenshots for Playwright -name: Update Playwright Expectations - -on: - pull_request: - types: [labeled] - issue_comment: - types: [created] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - test: - runs-on: ubuntu-latest - if: > - ( github.event_name == 'pull_request' && github.event.label.name == 'New Browser Test Expectations' ) || - ( github.event.issue.pull_request && - github.event_name == 'issue_comment' && - ( - github.event.comment.author_association == 'OWNER' || - github.event.comment.author_association == 'MEMBER' || - github.event.comment.author_association == 'COLLABORATOR' - ) && - startsWith(github.event.comment.body, '/update-playwright') ) - steps: - - name: Find Update Comment - uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad - id: "find-update-comment" - with: - issue-number: ${{ github.event.number || github.event.issue.number }} - comment-author: "github-actions[bot]" - body-includes: "Updating Playwright Expectations" - - - name: Add Starting Reaction - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 - with: - comment-id: ${{ steps.find-update-comment.outputs.comment-id }} - issue-number: ${{ github.event.number || github.event.issue.number }} - body: | - Updating Playwright Expectations - edit-mode: replace - reactions: eyes - - - name: Get Branch SHA - id: "get-branch" - run: echo ::set-output name=branch::$(gh pr view $PR_NO --repo $REPO --json headRefName --jq '.headRefName') - env: - REPO: ${{ github.repository }} - PR_NO: ${{ github.event.number || github.event.issue.number }} - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Initial Checkout - uses: actions/checkout@v5 - with: - ref: ${{ steps.get-branch.outputs.branch }} - - name: Setup Frontend - uses: ./.github/actions/setup-frontend - with: - include_build_step: true - - name: Setup ComfyUI Server - uses: ./.github/actions/setup-comfyui-server - with: - launch_server: true - - name: Setup Playwright - uses: ./.github/actions/setup-playwright - - name: Run Playwright tests and update snapshots - id: playwright-tests - run: pnpm exec playwright test --update-snapshots - continue-on-error: true - - uses: actions/upload-artifact@v4 - if: always() - with: - name: playwright-report - path: ./playwright-report/ - retention-days: 30 - - name: Debugging info - run: | - echo "PR: ${{ github.event.issue.number }}" - echo "Branch: ${{ steps.get-branch.outputs.branch }}" - git status - - name: Commit updated expectations - run: | - git config --global user.name 'github-actions' - git config --global user.email 'github-actions@github.com' - git add browser_tests - if git diff --cached --quiet; then - echo "No changes to commit" - else - git commit -m "[automated] Update test expectations" - git push origin ${{ steps.get-branch.outputs.branch }} - fi - - - name: Add Done Reaction - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 - if: github.event_name == 'issue_comment' - with: - comment-id: ${{ steps.find-update-comment.outputs.comment-id }} - issue-number: ${{ github.event.number || github.event.issue.number }} - reactions: +1 - reactions-edit-mode: replace - - - name: Remove New Browser Test Expectations label - if: always() && github.event_name == 'pull_request' - run: gh pr edit ${{ github.event.pull_request.number }} --remove-label "New Browser Test Expectations" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 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/.github/workflows/weekly-docs-check.yaml b/.github/workflows/weekly-docs-check.yaml new file mode 100644 index 000000000..c67e4adcb --- /dev/null +++ b/.github/workflows/weekly-docs-check.yaml @@ -0,0 +1,144 @@ +name: "Weekly Documentation Check" +description: "Automated weekly documentation accuracy check and update via Claude" + +permissions: + contents: write + pull-requests: write + id-token: write + +on: + schedule: + # Run every Monday at 9 AM UTC + - cron: '0 9 * * 1' + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + docs-check: + runs-on: ubuntu-latest + timeout-minutes: 45 + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 + ref: main + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'pnpm' + + - name: Install dependencies for analysis tools + run: | + # Check if packages are already available locally + if ! pnpm list typescript @vue/compiler-sfc >/dev/null 2>&1; then + echo "Installing TypeScript and Vue compiler globally..." + pnpm install -g typescript @vue/compiler-sfc + else + echo "TypeScript and Vue compiler already available locally" + fi + + - name: Run Claude Documentation Review + uses: anthropics/claude-code-action@v1.0.6 + with: + prompt: | + Is all documentation still 100% accurate? + + INSTRUCTIONS: + 1. Fact-check all documentation against the current codebase + 2. Look for: + - Outdated API references + - Deprecated functions or components still documented + - Missing documentation for new features + - Incorrect code examples + - Broken internal references + - Configuration examples that no longer work + - Documentation that contradicts actual implementation + 3. Update any inaccurate or outdated documentation + 4. Add documentation for significant undocumented features + 5. Ensure all code examples are valid and tested against current code + + Focus on these key areas: + - docs/**/*.md (all documentation files) + - CLAUDE.md (project guidelines) + - README.md files throughout the repository + - .claude/commands/*.md (Claude command documentation) + + Make changes directly to the documentation files as needed. + DO NOT modify any source code files unless absolutely necessary for documentation accuracy. + + After making all changes, create a comprehensive PR message summary: + 1. Write a detailed PR body to /tmp/pr-body-${{ github.run_id }}.md in markdown format + 2. Include: + - ## Summary section with bullet points of what was changed + - ## Changes Made section with details organized by category + - ## Review Notes section with any important context + 3. Be specific about which files were updated and why + 4. If no changes were needed, write a brief message stating documentation is up to date + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + claude_args: "--max-turns 256 --allowedTools 'Bash(git status),Bash(git diff),Bash(git log),Bash(pnpm:*),Bash(npm:*),Bash(node:*),Bash(tsc:*),Bash(echo:*),Read,Write,Edit,Glob,Grep'" + continue-on-error: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check for changes + id: check_changes + run: | + if git diff --quiet && git diff --cached --quiet; then + echo "has_changes=false" >> $GITHUB_OUTPUT + echo "No documentation changes needed" + else + echo "has_changes=true" >> $GITHUB_OUTPUT + echo "Documentation changes detected" + fi + + - name: Create default PR body if not generated + if: steps.check_changes.outputs.has_changes == 'true' + run: | + if [ ! -f /tmp/pr-body-${{ github.run_id }}.md ]; then + cat > /tmp/pr-body-${{ github.run_id }}.md <<'EOF' + ## Automated Documentation Review + + This PR contains documentation updates identified by the weekly automated review. + + ### Review Process + - Automated fact-checking against current codebase + - Verification of code examples and API references + - Detection of outdated or missing documentation + + ### What was checked + - All markdown documentation in `docs/` + - Project guidelines in `CLAUDE.md` + - README files throughout the repository + - Claude command documentation in `.claude/commands/` + + **Note**: This is an automated PR. Please review all changes carefully before merging. + + 🤖 Generated by weekly documentation check workflow + EOF + fi + + - name: Create or Update Pull Request + if: steps.check_changes.outputs.has_changes == 'true' + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.PR_GH_TOKEN }} + commit-message: 'docs: weekly documentation accuracy update' + branch: docs/weekly-update + delete-branch: true + title: 'docs: Weekly Documentation Update' + body-path: /tmp/pr-body-${{ github.run_id }}.md + labels: | + documentation + automated + draft: true diff --git a/.gitignore b/.gitignore index 8f69ce164..3e400ba39 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ yarn.lock .stylelintcache node_modules +.pnpm-store dist dist-ssr *.local @@ -78,7 +79,7 @@ templates_repo/ vite.config.mts.timestamp-*.mjs # Linux core dumps -./core +/core *storybook.log storybook-static @@ -92,3 +93,6 @@ storybook-static .github/instructions/nx.instructions.md vite.config.*.timestamp* vitest.config.*.timestamp* + +# Weekly docs check output +/output.txt diff --git a/.husky/pre-push b/.husky/pre-push index ec1fc17d0..dcb556451 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,5 +1,5 @@ #!/usr/bin/env bash # Run Knip with cache via package script -pnpm knip +pnpm knip 1>&2 diff --git a/.prettierrc b/.prettierrc index 07c5ccc22..aa43a43ac 100644 --- a/.prettierrc +++ b/.prettierrc @@ -7,12 +7,5 @@ "importOrder": ["^@core/(.*)$", "", "^@/(.*)$", "^[./]"], "importOrderSeparation": true, "importOrderSortSpecifiers": true, - "overrides": [ - { - "files": "*.{js,cjs,mjs,ts,cts,mts,tsx,vue}", - "options": { - "plugins": ["@trivago/prettier-plugin-sort-imports"] - } - } - ] + "plugins": ["@prettier/plugin-oxc", "@trivago/prettier-plugin-sort-imports"] } diff --git a/CLAUDE.md b/CLAUDE.md index 0b187fbfc..4866c2dce 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -62,6 +62,11 @@ Key Nx features: ## Project Philosophy +- Follow good software engineering principles + - YAGNI + - AHA + - DRY + - SOLID - Clean, stable public APIs - Domain-driven design - Thousands of users and extensions diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f1c9341d5..6c84779ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,7 +43,7 @@ Have another idea? Drop into Discord or open an issue, and let's chat! ``` 3. Configure environment (optional): - Create a `.env` file in the project root based on the provided [.env.example](.env.example) file. + Create a `.env` file in the project root based on the provided [.env_example](.env_example) file. **Note about ports**: By default, the dev server expects the ComfyUI backend at `localhost:8188`. If your ComfyUI instance runs on a different port, update this in your `.env` file. @@ -325,4 +325,4 @@ If you have questions about contributing: - Ask in our [Discord](https://discord.com/invite/comfyorg) - Open a new issue for clarification -Thank you for contributing to ComfyUI Frontend! \ No newline at end of file +Thank you for contributing to ComfyUI Frontend! diff --git a/apps/desktop-ui/index.html b/apps/desktop-ui/index.html index 5cb34ffc2..3020c67bf 100644 --- a/apps/desktop-ui/index.html +++ b/apps/desktop-ui/index.html @@ -2,7 +2,7 @@ - ComfyUI Desktop + ComfyUI diff --git a/apps/desktop-ui/package.json b/apps/desktop-ui/package.json index 686d35233..0aa47e320 100644 --- a/apps/desktop-ui/package.json +++ b/apps/desktop-ui/package.json @@ -1,6 +1,6 @@ { "name": "@comfyorg/desktop-ui", - "version": "0.0.1", + "version": "0.0.3", "type": "module", "nx": { "tags": [ diff --git a/apps/desktop-ui/src/components/install/GpuPicker.vue b/apps/desktop-ui/src/components/install/GpuPicker.vue index 0a8cac0a9..98dddb762 100644 --- a/apps/desktop-ui/src/components/install/GpuPicker.vue +++ b/apps/desktop-ui/src/components/install/GpuPicker.vue @@ -1,17 +1,17 @@