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 是什么,如何创建你的第一个工作流?