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/pr-backport.yaml b/.github/workflows/pr-backport.yaml index 8ebbecafd..eee18aa56 100644 --- a/.github/workflows/pr-backport.yaml +++ b/.github/workflows/pr-backport.yaml @@ -96,41 +96,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' @@ -151,16 +171,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 @@ -171,7 +192,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 @@ -181,7 +202,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 @@ -215,13 +236,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 @@ -231,9 +252,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 @@ -254,16 +275,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/publish-desktop-ui.yaml b/.github/workflows/publish-desktop-ui.yaml index 421ae698a..9fd414865 100644 --- a/.github/workflows/publish-desktop-ui.yaml +++ b/.github/workflows/publish-desktop-ui.yaml @@ -45,6 +45,7 @@ jobs: contents: read env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' + ENABLE_MINIFY: 'true' steps: - name: Validate inputs env: diff --git a/.github/workflows/release-draft-create.yaml b/.github/workflows/release-draft-create.yaml index a888594c8..cad04ff37 100644 --- a/.github/workflows/release-draft-create.yaml +++ b/.github/workflows/release-draft-create.yaml @@ -56,6 +56,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/release-pypi-dev.yaml b/.github/workflows/release-pypi-dev.yaml index 62f24ae76..45219e858 100644 --- a/.github/workflows/release-pypi-dev.yaml +++ b/.github/workflows/release-pypi-dev.yaml @@ -45,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 diff --git a/.github/workflows/release-version-bump.yaml b/.github/workflows/release-version-bump.yaml index 337bf6975..5f3152285 100644 --- a/.github/workflows/release-version-bump.yaml +++ b/.github/workflows/release-version-bump.yaml @@ -15,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: @@ -26,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 @@ -59,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 c50dd32f9..6285d4ec2 100644 --- a/.github/workflows/version-bump-desktop-ui.yaml +++ b/.github/workflows/version-bump-desktop-ui.yaml @@ -15,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-desktop-ui: @@ -27,8 +32,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: @@ -65,8 +87,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 @@