diff --git a/.github/workflows/agents-md-integrity.yml b/.github/workflows/agents-md-integrity.yml index 8ca2fae494..e020dea93f 100644 --- a/.github/workflows/agents-md-integrity.yml +++ b/.github/workflows/agents-md-integrity.yml @@ -16,6 +16,6 @@ jobs: agents-md: permissions: contents: read - uses: Comfy-Org/github-workflows/.github/workflows/agents-md-integrity.yml@1376eeff8a7a27caf9813e0da7f576fa47ea1989 # github-workflows main (1376eef) + uses: Comfy-Org/github-workflows/.github/workflows/agents-md-integrity.yml@c6b3effa6d2e9fff97500d9688b54106f556c433 # github-workflows main (c6b3eff) with: - workflows_ref: 1376eeff8a7a27caf9813e0da7f576fa47ea1989 + workflows_ref: c6b3effa6d2e9fff97500d9688b54106f556c433 diff --git a/.github/workflows/anchor-check.yml b/.github/workflows/anchor-check.yml index 5f8fd50800..58778232d8 100644 --- a/.github/workflows/anchor-check.yml +++ b/.github/workflows/anchor-check.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 9c93a08979..bcd8ef5933 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -25,7 +25,7 @@ jobs: id-token: write steps: - name: Checkout repository - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 1 diff --git a/.github/workflows/cms-changelog-sync.yml b/.github/workflows/cms-changelog-sync.yml index 8b6d7bcb87..12eb3debcd 100644 --- a/.github/workflows/cms-changelog-sync.yml +++ b/.github/workflows/cms-changelog-sync.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/cms-published-versions-check.yml b/.github/workflows/cms-published-versions-check.yml index 13d0306d26..f0301240df 100644 --- a/.github/workflows/cms-published-versions-check.yml +++ b/.github/workflows/cms-published-versions-check.yml @@ -18,7 +18,7 @@ jobs: if: github.event.pull_request.head.repo.full_name == github.repository steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/cms-scripts-test.yml b/.github/workflows/cms-scripts-test.yml index 058e64171e..b366b3b876 100644 --- a/.github/workflows/cms-scripts-test.yml +++ b/.github/workflows/cms-scripts-test.yml @@ -20,7 +20,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Set up Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/code-pages-check.yml b/.github/workflows/code-pages-check.yml deleted file mode 100644 index 0926e15a3a..0000000000 --- a/.github/workflows/code-pages-check.yml +++ /dev/null @@ -1,95 +0,0 @@ -name: Code Pages Freshness - -on: - pull_request: - paths: - - 'development/comfy-router/models/**/code.yaml' - - 'development/comfy-router/models/**/code.mdx' - - 'snippets/comfy-router/**' - - 'router-schemas/**' - - 'tutorials/partner-nodes/pricing.mdx' - - 'router-pricing/**' - - 'development/comfy-router/pricing.mdx' - - 'ja/development/comfy-router/pricing.mdx' - - 'zh/development/comfy-router/pricing.mdx' - - 'ko/development/comfy-router/pricing.mdx' - - '.github/scripts/i18n/translate-router-pricing*' - - '.github/scripts/i18n/sync-hash-i18n.ts' - - '.github/scripts/i18n/chunked-translate.ts' - - '.github/scripts/i18n/i18n-config.mjs' - - '.github/scripts/i18n/fix-anchor-slugs.ts' - - '.github/scripts/i18n/translation-config.json' - - 'docs.json' - - '.github/scripts/snippets/**' - - '.github/workflows/code-pages-check.yml' - - 'package.json' - -permissions: - contents: read - -jobs: - code-pages: - # Pinned until swift-actions/setup-swift supports ubuntu-26.04 (the ubuntu-latest image). - runs-on: ubuntu-24.04 - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # code-pages:check syntax-checks the Swift snippets with `swiftc -parse`, so this - # job (and only this job) needs a Swift toolchain. Pinned to a commit SHA: it runs - # on every PR touching these paths, on a public repo. The cloud-side regen path runs - # code-pages:gen without --validate, so it still needs bun alone and is unaffected. - - name: Setup Swift - uses: swift-actions/setup-swift@7ca6abe6b3b0e8b5421b88be48feee39cbf52c6a # v2.4.0 - with: - swift-version: "6.1" - - - name: Check generated code pages are fresh and their snippets parse - run: bun run code-pages:check - - - name: Check English and localized Router pricing pages are fresh - run: bun run router-pricing:check - - snippet-script-tests: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # Fixture-driven, so unlike provider-schemas below it needs no network and cannot go red on a provider outage. - - name: Run the snippet script unit tests - run: bun test ./.github/scripts/snippets/ - - provider-schemas: - runs-on: ubuntu-latest - # Fetches each provider's published spec, so a stalled provider host must not hold the runner. - timeout-minutes: 15 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Check documented input/output schemas against each provider's published spec - run: bun run code-pages:check-providers diff --git a/.github/workflows/docs-checks.yml b/.github/workflows/docs-checks.yml index d348939320..234286538d 100644 --- a/.github/workflows/docs-checks.yml +++ b/.github/workflows/docs-checks.yml @@ -11,16 +11,15 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Setup Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v4 with: - package-manager-cache: false node-version: '20' - name: Install Mint CLI - run: npm install -g mint@4.2.700 + run: npm install -g mint - name: Run Broken Links Check run: mint broken-links diff --git a/.github/workflows/external-link-tracking.yml b/.github/workflows/external-link-tracking.yml index 865d361f61..bed7b3243d 100644 --- a/.github/workflows/external-link-tracking.yml +++ b/.github/workflows/external-link-tracking.yml @@ -29,7 +29,7 @@ jobs: issues: write steps: - name: Checkout documentation repo - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/giscus-path-map-update.yml b/.github/workflows/giscus-path-map-update.yml deleted file mode 100644 index e876f2d89d..0000000000 --- a/.github/workflows/giscus-path-map-update.yml +++ /dev/null @@ -1,104 +0,0 @@ -name: Update Giscus Path Map - -# Regenerates the pathname → discussion number map embedded in giscus-comments.js -# so newly created comment threads get number mapping (#1468). Prefer opening a -# PR over pushing to main so the map can be reviewed. - -on: - schedule: - # Monday 00:00 Asia/Shanghai (UTC+8) == Sunday 16:00 UTC - - cron: "0 16 * * 0" - workflow_dispatch: - -concurrency: - group: giscus-path-map-update - cancel-in-progress: true - -permissions: - contents: write - pull-requests: write - discussions: read - -jobs: - update-map: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v7 - with: - # Need a token that can push a branch and open a PR - token: ${{ secrets.GITHUB_TOKEN }} - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: "3.12" - - - name: Regenerate GISCUS_PATH_MAP - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # Prefer gh over curl; script shells out to `gh api graphql` - GH_PROMPT_DISABLED: "1" - run: python3 scripts/generate-giscus-path-map.py - - - name: Check for map changes - id: diff - run: | - if git diff --quiet -- giscus-comments.js; then - echo "changed=false" >> "$GITHUB_OUTPUT" - echo "No giscus path-map changes." - else - echo "changed=true" >> "$GITHUB_OUTPUT" - git --no-pager diff --stat -- giscus-comments.js - fi - - - name: Create or update pull request - if: steps.diff.outputs.changed == 'true' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: chore/giscus-path-map-update - run: | - set -euo pipefail - - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - git fetch origin "$BRANCH" || true - git checkout -B "$BRANCH" - - git add giscus-comments.js - if git diff --cached --quiet; then - echo "Nothing staged; exiting." - exit 0 - fi - - git commit -m "$(cat <<'MSG' - chore(giscus): refresh pathname→discussion number map - - Auto-generated by scripts/generate-giscus-path-map.py so newly - created Announcements threads are reachable via number mapping - (#1468). - MSG - )" - - git push -u origin "$BRANCH" --force-with-lease - - EXISTING_PR=$(gh pr list --head "$BRANCH" --base main --state open --json number --jq '.[0].number // empty') - if [ -n "$EXISTING_PR" ]; then - echo "Updated existing PR #$EXISTING_PR" - gh pr comment "$EXISTING_PR" --body "Path map refreshed by scheduled workflow run ${{ github.run_id }}." - else - gh pr create --base main --head "$BRANCH" \ - --title "chore(giscus): refresh pathname→discussion number map" \ - --body "$(cat <<'BODY' - ## Summary - Weekly refresh of the Giscus pathname → discussion number map in `giscus-comments.js`. - - Generated by `scripts/generate-giscus-path-map.py` (GraphQL list of Announcements discussions, not search). Keeps #1468 fix current for newly created comment threads. - - ## Notes - - Unmapped pages still use pathname + strict so new discussions can be created. - - Review the diff of `giscus-comments.js` only; no content docs change. - BODY - )" - fi diff --git a/.github/workflows/i18n-scripts-test.yml b/.github/workflows/i18n-scripts-test.yml index 777f9dac87..e349420f0a 100644 --- a/.github/workflows/i18n-scripts-test.yml +++ b/.github/workflows/i18n-scripts-test.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 - name: Set up Bun uses: oven-sh/setup-bun@v2 diff --git a/.github/workflows/i18n-sync-check.yml b/.github/workflows/i18n-sync-check.yml index e6afffe7f8..63be8b7286 100644 --- a/.github/workflows/i18n-sync-check.yml +++ b/.github/workflows/i18n-sync-check.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -30,13 +30,11 @@ jobs: "${{ github.event.pull_request.base.sha }}" \ "${{ github.event.pull_request.head.sha }}" - - name: Comment i18n sync status on PR + - name: Notify translator on PR if: always() env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} CHECK_I18N_OUTPUT: /tmp/i18n-check.json - PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} - PR_BASE_REPO: ${{ github.repository }} run: | if [ ! -f "$CHECK_I18N_OUTPUT" ]; then echo "No check output; skipping comment." @@ -46,27 +44,12 @@ jobs: MISSING=$(node -e " const data = require('$CHECK_I18N_OUTPUT'); if (data.skipped) process.exit(2); - const sameRepository = process.env.PR_HEAD_REPO === process.env.PR_BASE_REPO; - const autoTranslated = new Set(sameRepository ? [ - 'ja/development/comfy-router/pricing.mdx', - 'zh/development/comfy-router/pricing.mdx', - 'ko/development/comfy-router/pricing.mdx', - ] : []); - const n = Object.values(data.missingByLang || {}).reduce((s, v) => s + v.files.filter(f => !autoTranslated.has(f)).length, 0); + const n = Object.values(data.missingByLang || {}).reduce((s, v) => s + v.files.length, 0); if (n === 0) process.exit(2); process.stdout.write(String(n)); " 2>/dev/null) || true if [ -z "$MISSING" ]; then - REPO="${{ github.repository }}" - PR_NUMBER="${{ github.event.pull_request.number }}" - MARKER="" - EXISTING_ID=$(gh api "repos/${REPO}/issues/${PR_NUMBER}/comments" \ - --jq '.[] | select(.body | contains("'"$MARKER"'")) | .id' | head -1) - if [ -n "$EXISTING_ID" ]; then - gh api -X DELETE "repos/${REPO}/issues/comments/${EXISTING_ID}" - echo "Removed the resolved i18n reminder comment." - fi echo "No missing translations; skipping PR comment." exit 0 fi @@ -74,35 +57,20 @@ jobs: BODY_FILE=/tmp/i18n-comment.md BODY_FILE="$BODY_FILE" node -e " const data = require(process.env.CHECK_I18N_OUTPUT); - const sameRepository = process.env.PR_HEAD_REPO === process.env.PR_BASE_REPO; - const autoTranslated = new Set(sameRepository ? [ - 'ja/development/comfy-router/pricing.mdx', - 'zh/development/comfy-router/pricing.mdx', - 'ko/development/comfy-router/pricing.mdx', - ] : []); - const groups = Object.entries(data.missingByLang) - .map(([code, { name, files }]) => ({ code, name, files: files.filter(f => !autoTranslated.has(f)) })) - .filter(g => g.files.length > 0); - const total = groups.reduce((s, g) => s + g.files.length, 0); - const plural = (n) => n + ' file' + (n === 1 ? '' : 's'); const lines = [ - '## 🌐 i18n translation sync check', + '## 🌐 i18n translation sync reminder', '', - 'English docs changed in this PR. ' + plural(total) + ' in ' + groups.length + ' language' + (groups.length === 1 ? '' : 's') + ' may not be synced yet. The automated translation workflow handles these updates. Expand a language to see the files.', + '@comfyui-wiki English documentation was updated in this PR. Please complete or schedule translation updates for the following files:', '', ]; - for (const { code, name, files } of groups) { - lines.push('
'); - lines.push('' + name + ' (' + code + '): ' + plural(files.length) + ''); - lines.push(''); - for (const f of files) lines.push('- ' + f.replace(/[&<>\`]/g, c => '&#' + c.charCodeAt(0) + ';') + ''); - lines.push(''); - lines.push('
'); + for (const [code, { name, files }] of Object.entries(data.missingByLang)) { + lines.push('### ' + name + ' (\`' + code + '\`)'); + for (const f of files) lines.push('- \`' + f + '\`'); lines.push(''); } lines.push('---'); lines.push(''); - lines.push('**Local sync:** \`npm run translate\` (see [README: Automated translation](https://github.com/${{ github.repository }}/blob/main/README.md#automated-translation))'); + lines.push('**Local sync:** \`npm run translate\` (see [README — Automated translation](https://github.com/${{ github.repository }}/blob/main/README.md#automated-translation))'); lines.push(''); lines.push(''); require('fs').writeFileSync(process.env.BODY_FILE, lines.join('\n')); diff --git a/.github/workflows/link-validation.yml b/.github/workflows/link-validation.yml index 2ef1086d16..22c1b68307 100644 --- a/.github/workflows/link-validation.yml +++ b/.github/workflows/link-validation.yml @@ -13,14 +13,13 @@ on: jobs: validate-links: - # Pinned until actions/setup-python ships Python 3.9 for ubuntu-26.04 (the ubuntu-latest image). - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} fetch-depth: 0 diff --git a/.github/workflows/redirect-check.yml b/.github/workflows/redirect-check.yml index 56d8101547..f8149bf62c 100644 --- a/.github/workflows/redirect-check.yml +++ b/.github/workflows/redirect-check.yml @@ -10,19 +10,17 @@ on: jobs: check-redirects: - # Pinned until Playwright supports webkit on ubuntu-26.04 (its postinstall breaks npm ci there). - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v7 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js - uses: actions/setup-node@v7 + uses: actions/setup-node@v4 with: - package-manager-cache: false node-version: '20' - name: Install dependencies diff --git a/.github/workflows/router-pricing-i18n.yml b/.github/workflows/router-pricing-i18n.yml deleted file mode 100644 index 8f12122c16..0000000000 --- a/.github/workflows/router-pricing-i18n.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: Generate Router pricing translations - -on: - pull_request: - branches: - - main - paths: - - '.github/scripts/i18n/translate-i18n.ts' - - '.github/scripts/i18n/translate-router-pricing.ts' - - '.github/scripts/i18n/sync-hash-i18n.ts' - - '.github/scripts/i18n/chunked-translate.ts' - - '.github/scripts/i18n/i18n-config.mjs' - - '.github/scripts/i18n/fix-anchor-slugs.ts' - - '.github/scripts/i18n/translation-config.json' - - '.github/scripts/snippets/gen-router-pricing.ts' - - '.github/scripts/snippets/router-pricing-display.ts' - - '.github/workflows/router-pricing-i18n.yml' - - 'development/comfy-router/models/**/code.mdx' - - 'development/comfy-router/pricing.mdx' - - 'ja/development/comfy-router/pricing.mdx' - - 'zh/development/comfy-router/pricing.mdx' - - 'ko/development/comfy-router/pricing.mdx' - - 'package.json' - - 'router-pricing/metronome-rates.json' - -concurrency: - group: router-pricing-i18n-${{ github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.event.pull_request.head.ref || github.ref_name }} - cancel-in-progress: true - -permissions: - contents: write - -jobs: - translate: - # Fork PRs cannot access the translation key or push to the source branch. - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository - runs-on: ubuntu-latest - timeout-minutes: 20 - steps: - # Checks on a commit pushed with GITHUB_TOKEN wait for a maintainer to - # approve them, so Sync PR Auto-merge never sees them pass. Push as - # cloud-code-bot instead, which starts them normally. The mint is - # continue-on-error: an unset vars.APP_ID or - # secrets.CLOUD_CODE_BOT_PRIVATE_KEY falls back to GITHUB_TOKEN. - - name: Mint the cloud-code-bot token - id: app-token - continue-on-error: true - uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 - with: - app-id: ${{ vars.APP_ID }} - private-key: ${{ secrets.CLOUD_CODE_BOT_PRIVATE_KEY }} - permission-contents: write - - - name: Warn that the push falls back to GITHUB_TOKEN - if: steps.app-token.outcome == 'failure' - run: echo "::warning::cloud-code-bot token mint failed; pushing with GITHUB_TOKEN, so checks on the new commit need manual approval. Check vars.APP_ID and secrets.CLOUD_CODE_BOT_PRIVATE_KEY." - - - name: Check out the PR branch - uses: actions/checkout@v4 - with: - repository: ${{ github.event.pull_request.head.repo.full_name || github.repository }} - ref: ${{ github.event.pull_request.head.ref || github.ref_name }} - token: ${{ steps.app-token.outputs.token || secrets.GITHUB_TOKEN }} - - - name: Set up Bun - uses: oven-sh/setup-bun@v2 - - - name: Regenerate pricing data, English page, and locale pages - run: | - bun run router-pricing:gen - - - name: Verify all locale pages were generated - run: | - for locale in ja zh ko; do - page="${locale}/development/comfy-router/pricing.mdx" - if [ ! -s "$page" ]; then - echo "Translation did not produce $page" - exit 1 - fi - done - - - name: Commit locale pages to the PR branch - env: - PR_BRANCH: ${{ github.event.pull_request.head.ref || github.ref_name }} - APP_TOKEN_MINTED: ${{ steps.app-token.outputs.token != '' }} - run: | - # The committer follows the token that pushes. - if [ "$APP_TOKEN_MINTED" = "true" ]; then - git config user.name "cloud-code-bot[bot]" - git config user.email "234529496+cloud-code-bot[bot]@users.noreply.github.com" - else - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - fi - git add development/comfy-router/pricing.mdx ja/development/comfy-router/pricing.mdx zh/development/comfy-router/pricing.mdx ko/development/comfy-router/pricing.mdx - if git diff --cached --quiet; then - echo "Router pricing data and translations are already up to date." - exit 0 - fi - git commit -m "Sync Router pricing translations" - git push origin "HEAD:refs/heads/${PR_BRANCH}" diff --git a/.github/workflows/structure-parity.yml b/.github/workflows/structure-parity.yml deleted file mode 100644 index e256e251cb..0000000000 --- a/.github/workflows/structure-parity.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: Structure Parity - -# A translated page must carry the same MDX structure as its English source: -# the same components (counted per tag name), the same number of images and the -# same selected asset links. It compares structure, not image identity: a -# present-but-swapped image or a mistranslated card is outside this gate and -# belongs to the review pass. -# `pnpm translate:dry-run` compares section hashes only, so a localized page can -# silently lose its download cards, workflow previews or card grouping and still -# pass every other check. This job fails the pull request when a translation -# lost structure the English page has, or when an English change left an -# existing translation behind. -# -# Both directions are checked: a changed localized page is compared with its -# English source, and a changed English page is compared with its existing -# ja/zh/ko counterparts. The second direction only fails when the counterpart -# matched the English page before the change, so pre-existing debt never blocks -# a pull request (it is reported as a warning). The backlog is reported by -# `bun .github/scripts/i18n/check-structure-parity.ts --all`. - -on: - workflow_dispatch: - pull_request: - paths: - - '**/*.mdx' - - '.github/scripts/i18n/check-structure-parity*' - - '.github/workflows/structure-parity.yml' - push: - branches: [main] - paths: - - '**/*.mdx' - - '.github/scripts/i18n/check-structure-parity*' - - '.github/workflows/structure-parity.yml' - -permissions: - contents: read - -jobs: - structure-parity: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Set up Bun - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 - with: - bun-version: latest - - - name: Test structure parity detection - run: bun test ./.github/scripts/i18n/check-structure-parity.test.ts - - - name: Check changed localized pages against their English source - env: - # Diff range for the change under review: `base` up to `head`. For a - # pull request that is the base branch SHA and the pull request's own - # head, for a push the previous and the current commit. Read the base - # branch SHA first: `github.event.before` also exists on pull_request - # events, where it holds the previous head of the pull request, and - # diffing that against the checked out merge commit also lists every - # commit the base branch added after the branch point. The gate would - # then audit pages this pull request never touched. - # The script falls back to `~1` when the base is unreachable - # after a force-push. - STRUCTURE_PARITY_BASE: ${{ github.event.pull_request.base.sha || github.event.before }} - STRUCTURE_PARITY_HEAD: ${{ github.event.pull_request.head.sha || github.sha }} - run: bun .github/scripts/i18n/check-structure-parity.ts diff --git a/.github/workflows/sync-owned-check.yml b/.github/workflows/sync-owned-check.yml deleted file mode 100644 index caca78ae59..0000000000 --- a/.github/workflows/sync-owned-check.yml +++ /dev/null @@ -1,88 +0,0 @@ -name: Sync-Owned Files Check - -# Refuse a pull request that edits a file the Comfy API spec sync owns and -# rewrites on every run. Such an edit publishes now and is reverted by the next -# sync; this fails it while its author can still move the change upstream. -# -# The path filter is the guarded set plus this check's own files, so a pull -# request that touches none of them never starts this workflow. `docs.json` -# (co-owned) and the hand-curated `development/comfy-router/models/**/code.yaml` -# generator inputs are deliberately absent. See the script's header comment. - -on: - pull_request: - paths: - - 'openapi-v2.yaml' - - 'router-openapi.yaml' - - 'development/comfy-router/reference.mdx' - - 'development/comfy-router/quickstart.mdx' - - 'development/comfy-router/limitations.mdx' - - 'development/comfy-router/higgsfield-byok.mdx' - - 'development/comfy-router/models.mdx' - - 'development/comfy-router/providers.mdx' - - 'development/comfy-router/models/**/code.mdx' - - 'router-schemas/**' - - '.github/scripts/sync-owned/**' - - '.github/workflows/sync-owned-check.yml' - -permissions: - contents: read - -jobs: - sync-owned: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - fetch-depth: 0 - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - # A generated page that matches the generator's output is that output, - # however it got there, so it is a regeneration rather than a hand-edit and - # the guard lets it through. `code-pages-check.yml` asserts the same thing, - # but its path filter omits `development/comfy-router/models.mdx`, so a pull - # request that hand-edits only the provider index never starts it. - - name: Are the generated code pages fresh? - id: fresh - continue-on-error: true - run: bun run code-pages:check - - - name: Check for edits to sync-owned files - env: - # Read through the environment rather than interpolated into the shell: - # a head branch name is contributor-controlled text. - PR_AUTHOR: ${{ github.event.pull_request.user.login }} - PR_HEAD_REF: ${{ github.event.pull_request.head.ref }} - BASE_SHA: ${{ github.event.pull_request.base.sha }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - GENERATED_PAGES_FRESH: ${{ steps.fresh.outcome == 'success' }} - run: | - set -euo pipefail - # --no-renames so a guarded file renamed away is reported as a deletion - # of the guarded path rather than only as its new name. - git diff --name-only --no-renames -z "$BASE_SHA...$HEAD_SHA" \ - | bun .github/scripts/sync-owned/check-sync-owned.ts - - sync-owned-script-tests: - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout code - uses: actions/checkout@v7 - with: - persist-credentials: false - - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Run the sync-owned check unit tests - run: bun test ./.github/scripts/sync-owned/ diff --git a/.github/workflows/sync-pr-automerge.yml b/.github/workflows/sync-pr-automerge.yml deleted file mode 100644 index ef8bf530f8..0000000000 --- a/.github/workflows/sync-pr-automerge.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: Sync PR Auto-merge - -# Merge the Comfy API spec sync pull request (branch chore/sync-comfy-api-v2-spec, -# opened by cloud-code-bot from Comfy-Org/cloud push-v2-spec-to-sdks.yml) once its -# checks are green. Off unless the repository variable DOCS_SYNC_AUTOMERGE is -# 'true'. Only that branch and author are ever merged; every other pull request -# is untouched, so this needs no ruleset on main. -# -# "Green" is decided here rather than by required checks, because most checks -# are path-filtered and a given sync may not start them. The rule: every check -# run on the head commit has finished, none failed, and mint-checks (no path -# filter, so it runs on every sync) passed. provider-schemas is exempt: it -# fetches live provider specs, so an upstream spec change can fail it with no -# fault in the pull request. -# -# Each finished pull_request workflow re-evaluates; the schedule covers checks -# from apps (Mintlify, Socket) that do not raise workflow_run. - -on: - workflow_run: - workflows: - - 'AGENTS.md Integrity' - - 'Anchor Check' - - 'Code Pages Freshness' - - 'Documentation Checks' - - 'External Link Tracking' - - 'Generate Router pricing translations' - - 'i18n Translation Sync Check' - - 'Link Validation' - - 'Redirect Check' - - 'Structure Parity' - - 'Sync-Owned Files Check' - types: [completed] - schedule: - - cron: '*/20 * * * *' - workflow_dispatch: - -permissions: - contents: write - pull-requests: write - checks: read - -concurrency: - group: sync-pr-automerge - cancel-in-progress: false - -env: - SYNC_BRANCH: chore/sync-comfy-api-v2-spec - SYNC_AUTHOR: cloud-code-bot - ANCHOR_CHECK: mint-checks - EXEMPT_CHECKS: provider-schemas - -jobs: - automerge: - if: >- - vars.DOCS_SYNC_AUTOMERGE == 'true' && - (github.event_name != 'workflow_run' || github.event.workflow_run.head_branch == 'chore/sync-comfy-api-v2-spec') - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Merge the sync pull request if its checks are green - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_REPO: ${{ github.repository }} - run: | - set -euo pipefail - # gh reports an App author as "app/" or "[bot]" depending on the API; accept both. - pr=$(gh pr list --head "$SYNC_BRANCH" --base main --state open \ - --json number,author,isDraft,headRefOid \ - --jq "[.[] | select(.author.login | IN(\"$SYNC_AUTHOR\", \"app/$SYNC_AUTHOR\", \"${SYNC_AUTHOR}[bot]\")) | select(.isDraft | not)][0] // empty") - if [ -z "$pr" ]; then echo "No open sync pull request by $SYNC_AUTHOR."; exit 0; fi - number=$(jq -r .number <<<"$pr"); sha=$(jq -r .headRefOid <<<"$pr") - echo "Sync pull request #$number at $sha" - - runs=$(gh api --paginate "repos/$GH_REPO/commits/$sha/check-runs?per_page=100" \ - --jq '.check_runs[] | {name, status, conclusion}' | jq -s .) - jq -r '.[] | " \(.name): \(.status) \(.conclusion // "")"' <<<"$runs" - - # This job's own check run is in progress while it evaluates, so leave it out. - pending=$(jq '[.[] | select(.name != "automerge" and .status != "completed")] | length' <<<"$runs") - if [ "$pending" -gt 0 ]; then echo "$pending check(s) still running; waiting."; exit 0; fi - - failed=$(jq -r --arg exempt "$EXEMPT_CHECKS" '[.[] | select(.name != "automerge") - | select(.name as $n | $exempt | split(",") | index($n) | not) - | select(.conclusion as $c | ["success", "neutral", "skipped"] | index($c) | not) | .name] | join(", ")' <<<"$runs") - if [ -n "$failed" ]; then echo "::notice::Not merging #$number: $failed did not pass."; exit 0; fi - - anchor=$(jq --arg n "$ANCHOR_CHECK" '[.[] | select(.name == $n and .conclusion == "success")] | length' <<<"$runs") - if [ "$anchor" -eq 0 ]; then echo "$ANCHOR_CHECK has not passed on $sha yet; waiting."; exit 0; fi - - # --match-head-commit refuses the merge if the bot pushed again since the checks above ran. - gh pr merge "$number" --squash --match-head-commit "$sha" - echo "::notice::Merged sync pull request #$number at $sha." diff --git a/community/links.mdx b/community/links.mdx index 0a71b0c6ae..bc891fc97e 100644 --- a/community/links.mdx +++ b/community/links.mdx @@ -1,8 +1,10 @@ --- title: "Community links" -description: "Connect with the ComfyUI community through various platforms" +description: "Get ComfyUI help and share your work through the community's Discord, support portal, forum, Matrix, GitHub, YouTube, X, LinkedIn, and Reddit channels." --- +## Where can you get ComfyUI help and connect with the community? + Join the ComfyUI community and get help, share your work, and stay updated with the latest developments. diff --git a/es/index.mdx b/es/index.mdx index 707ba70104..672a7957a6 100644 --- a/es/index.mdx +++ b/es/index.mdx @@ -4,7 +4,7 @@ description: "Documentación oficial de ComfyUI, la aplicación de código abier icon: "book-open" sidebarTitle: "Inicio" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ La aplicación de código abierto basada en nodos más potente para IA generativ {/* Getting Started Section */}
-

Primeros pasos

+

¿Qué es ComfyUI y cómo creas tu primer flujo de trabajo?

-

Getting Started

+

What is ComfyUI, and how do you create your first workflow?

diff --git a/ja/index.mdx b/ja/index.mdx index 20ac438957..2700a5e04a 100644 --- a/ja/index.mdx +++ b/ja/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI の公式ドキュメント。オープンソースのノ icon: "book-open" sidebarTitle: "ホーム" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ translationFrom: index.mdx {/* Getting Started Section */}
-

はじめに

+

ComfyUI とは何か、最初のワークフローはどう作る?

diff --git a/ko/index.mdx b/ko/index.mdx index 9d3f6de17b..df7baf9b6e 100644 --- a/ko/index.mdx +++ b/ko/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI 공식 문서. 노드 기반 오픈소스 생성형 AI 애 icon: "book-open" sidebarTitle: "홈" mode: "frame" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -58,7 +58,7 @@ translationFrom: index.mdx {/* 시작하기 섹션 */}
-

시작하기

+

ComfyUI란 무엇이며, 첫 워크플로는 어떻게 만드나요?

diff --git a/zh/index.mdx b/zh/index.mdx index 18d3e25697..9809f85e3b 100644 --- a/zh/index.mdx +++ b/zh/index.mdx @@ -4,7 +4,7 @@ description: "ComfyUI 官方文档。开源、基于节点的生成式 AI 应用 icon: "book-open" mode: "frame" sidebarTitle: "首页" -translationSourceHash: 2a1adf8b +translationSourceHash: ee7b0862 translationFrom: index.mdx --- @@ -61,7 +61,7 @@ translationFrom: index.mdx {/* Getting Started Section */}
-

开始使用

+

ComfyUI 是什么,如何创建你的第一个工作流?