Skip to content

Commit b3f200a

Browse files
Merge remote-tracking branch 'origin/main' into HEAD
2 parents 48ca602 + 16fdcab commit b3f200a

405 files changed

Lines changed: 24224 additions & 9532 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coderabbit.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,14 @@ reviews:
6363
Pass if none of these patterns are found in the diff.
6464
6565
When warning, reference the specific ADR by number and link to `docs/adr/` for context. Frame findings as directional guidance since ADR 0003 and 0008 are in Proposed status.
66+
67+
path_instructions:
68+
- path: '**/*.test.ts'
69+
instructions: |
70+
Treat `.agents/checks/test-quality.md`, `docs/testing/README.md`, and `docs/guidance/vitest.md` as required review context for every changed Vitest test file.
71+
- path: 'src/lib/litegraph/**/*.test.ts'
72+
instructions: |
73+
Treat `.agents/checks/test-quality.md`, `docs/testing/README.md`, `docs/guidance/vitest.md`, and `docs/testing/litegraph-testing.md` as required review context for every changed litegraph Vitest test file.
74+
- path: '{browser_tests,apps/website/e2e}/**/*.spec.ts'
75+
instructions: |
76+
Treat `.agents/checks/test-quality.md`, `docs/testing/README.md`, and `docs/guidance/playwright.md` as required review context for every changed Playwright test file.

.github/workflows/ci-website-build.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,6 @@ jobs:
4040
WEBSITE_ASHBY_API_KEY: ${{ secrets.WEBSITE_ASHBY_API_KEY }}
4141
WEBSITE_ASHBY_JOB_BOARD_NAME: ${{ secrets.WEBSITE_ASHBY_JOB_BOARD_NAME }}
4242
run: pnpm --filter @comfyorg/website build
43+
44+
- name: Validate JSON-LD structured data
45+
run: pnpm --filter @comfyorg/website validate:jsonld

.github/workflows/cla.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,11 @@ jobs:
3838
PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }}
3939
PR_AUTHOR: ${{ github.event.pull_request.user.login || github.event.issue.user.login }}
4040
BASE_ALLOWLIST: action@github.com,actions-user,ampagent,claude,comfy-pr-bot,GitHub Action,github-actions,github-actions[bot],Glary Bot,Glary-Bot,*[bot]
41+
# For each commit emit the GitHub login when the author/committer email resolves to a GitHub account
42+
# otherwise fall back to the raw git name.
4143
run: |
4244
others=$(gh api "repos/${{ github.repository }}/pulls/${PR_NUMBER}/commits" --paginate \
43-
--jq '.[] | (.author.login // empty), (.committer.login // empty)' \
45+
--jq '.[] | (.author.login // .commit.author.name // empty), (.committer.login // .commit.committer.name // empty)' \
4446
| sort -u | grep -vix "${PR_AUTHOR}" | paste -sd, -)
4547
if [ -n "$others" ]; then
4648
echo "allowlist=${BASE_ALLOWLIST},${others}" >> "$GITHUB_OUTPUT"

.github/workflows/pr-backport.yaml

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -278,32 +278,49 @@ jobs:
278278
continue
279279
fi
280280
281-
# Create backport branch
282-
git checkout -b "${BACKPORT_BRANCH}" "origin/${TARGET_BRANCH}"
281+
# Create backport branch. A failure here (e.g. dirty state left
282+
# by a prior target) must not abort the loop and skip remaining
283+
# targets, so fall back to a clean checkout and record the error.
284+
if ! git checkout -B "${BACKPORT_BRANCH}" "origin/${TARGET_BRANCH}"; then
285+
echo "::error::Failed to create branch ${BACKPORT_BRANCH} for ${TARGET_BRANCH}"
286+
FAILED="${FAILED}${TARGET_BRANCH}:branch-create-failed "
287+
git checkout main || git checkout -f main
288+
echo "::endgroup::"
289+
continue
290+
fi
283291
284292
# Try cherry-pick
285293
if git cherry-pick "${MERGE_COMMIT}"; then
286294
if [ "$REMOTE_BACKPORT_EXISTS" = true ]; then
287-
git push --force-with-lease origin "${BACKPORT_BRANCH}"
295+
PUSH_CMD=(git push --force-with-lease origin "${BACKPORT_BRANCH}")
296+
else
297+
PUSH_CMD=(git push origin "${BACKPORT_BRANCH}")
298+
fi
299+
300+
# A push failure for one target must not abort the loop and
301+
# prevent remaining targets from being attempted.
302+
if "${PUSH_CMD[@]}"; then
303+
echo "${BACKPORT_BRANCH}" >> "$CREATED_BRANCHES_FILE"
304+
SUCCESS="${SUCCESS}${TARGET_BRANCH}:${BACKPORT_BRANCH} "
305+
echo "Successfully created backport branch: ${BACKPORT_BRANCH}"
288306
else
289-
git push origin "${BACKPORT_BRANCH}"
307+
echo "::error::Failed to push ${BACKPORT_BRANCH} for ${TARGET_BRANCH}"
308+
FAILED="${FAILED}${TARGET_BRANCH}:push-failed "
290309
fi
291-
echo "${BACKPORT_BRANCH}" >> "$CREATED_BRANCHES_FILE"
292-
SUCCESS="${SUCCESS}${TARGET_BRANCH}:${BACKPORT_BRANCH} "
293-
echo "Successfully created backport branch: ${BACKPORT_BRANCH}"
310+
294311
# Return to main (keep the branch, we need it for PR)
295-
git checkout main
312+
git checkout main || git checkout -f main
296313
else
297314
# Get conflict info
298315
CONFLICTS=$(git diff --name-only --diff-filter=U | tr '\n' ',')
299-
git cherry-pick --abort
316+
git cherry-pick --abort || true
300317
301318
echo "::error::Cherry-pick failed due to conflicts"
302319
FAILED="${FAILED}${TARGET_BRANCH}:conflicts:${CONFLICTS} "
303320
304321
# Clean up the failed branch
305-
git checkout main
306-
git branch -D "${BACKPORT_BRANCH}"
322+
git checkout main || git checkout -f main
323+
git branch -D "${BACKPORT_BRANCH}" || true
307324
fi
308325
309326
echo "::endgroup::"
@@ -384,6 +401,10 @@ jobs:
384401
385402
**Reason:** Merge conflicts detected during cherry-pick of `${MERGE_COMMIT_SHORT}`
386403
404+
The auto-backport could not be completed automatically. Please backport
405+
manually onto branch `${BACKPORT_BRANCH}` (from `origin/${target}`) and
406+
open a PR to `${target}`.
407+
387408
<details>
388409
<summary>📄 Conflicting files</summary>
389410
@@ -416,19 +437,37 @@ jobs:
416437
MERGE_COMMIT=$(jq -r '.pull_request.merge_commit_sha' "$GITHUB_EVENT_PATH")
417438
fi
418439
440+
# Post a comment without letting a single failed `gh pr comment` (e.g.
441+
# a locked issue, as happened for PR #13359, or a transient API error)
442+
# abort the step under `set -e` and swallow the remaining failures.
443+
post_comment() {
444+
local body="$1"
445+
local context="$2"
446+
if ! gh pr comment "${PR_NUMBER}" --body "${body}"; then
447+
echo "::warning::Could not comment on PR #${PR_NUMBER} about ${context}. Manual backport required."
448+
fi
449+
}
450+
419451
for failure in ${{ steps.backport.outputs.failed }}; do
420452
IFS=':' read -r target reason conflicts <<< "${failure}"
421453
454+
SAFE_TARGET=$(echo "$target" | tr '/' '-')
455+
BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${SAFE_TARGET}"
456+
422457
if [ "${reason}" = "branch-missing" ]; then
423-
gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport failed: Branch \`${target}\` does not exist"
458+
post_comment "@${PR_AUTHOR} Backport failed: Branch \`${target}\` does not exist" "missing branch ${target}"
424459
425460
elif [ "${reason}" = "already-exists" ]; then
426-
gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Commit \`${MERGE_COMMIT}\` already exists on branch \`${target}\`. No backport needed."
461+
post_comment "@${PR_AUTHOR} Commit \`${MERGE_COMMIT}\` already exists on branch \`${target}\`. No backport needed." "already-backported ${target}"
462+
463+
elif [ "${reason}" = "branch-create-failed" ]; then
464+
gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport to \`${target}\` failed: could not create the backport branch. Please retry or backport manually."
465+
466+
elif [ "${reason}" = "push-failed" ]; then
467+
gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Backport to \`${target}\` cherry-picked cleanly but the push failed. Please retry or push the backport branch manually."
427468
428469
elif [ "${reason}" = "conflicts" ]; then
429470
CONFLICTS_INLINE=$(echo "${conflicts}" | tr ',' ' ')
430-
SAFE_TARGET=$(echo "$target" | tr '/' '-')
431-
BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${SAFE_TARGET}"
432471
PR_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/pull/${PR_NUMBER}"
433472
434473
export PR_NUMBER PR_URL MERGE_COMMIT target BACKPORT_BRANCH CONFLICTS_INLINE
@@ -444,10 +483,10 @@ jobs:
444483
CONFLICTS_BLOCK=$(echo "${conflicts}" | tr ',' '\n')
445484
MERGE_COMMIT_SHORT="${MERGE_COMMIT:0:7}"
446485
447-
export target MERGE_COMMIT_SHORT CONFLICTS_BLOCK AGENT_PROMPT PR_AUTHOR
448-
COMMENT_BODY=$(envsubst '${target} ${MERGE_COMMIT_SHORT} ${CONFLICTS_BLOCK} ${AGENT_PROMPT} ${PR_AUTHOR}' <<<"$COMMENT_BODY_TEMPLATE")
486+
export target MERGE_COMMIT_SHORT BACKPORT_BRANCH CONFLICTS_BLOCK AGENT_PROMPT PR_AUTHOR
487+
COMMENT_BODY=$(envsubst '${target} ${MERGE_COMMIT_SHORT} ${BACKPORT_BRANCH} ${CONFLICTS_BLOCK} ${AGENT_PROMPT} ${PR_AUTHOR}' <<<"$COMMENT_BODY_TEMPLATE")
449488
450-
gh pr comment "${PR_NUMBER}" --body "${COMMENT_BODY}"
489+
post_comment "${COMMENT_BODY}" "cherry-pick conflict on ${target} (backport manually onto ${BACKPORT_BRANCH})"
451490
fi
452491
done
453492

apps/website/e2e/affiliates.spec.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,14 @@ test.describe('Affiliates landing — desktop interactions', () => {
7676
return match?.textContent ?? null
7777
})
7878
expect(faqJsonLd, 'FAQ JSON-LD script').not.toBeNull()
79-
const parsed = JSON.parse(faqJsonLd!)
80-
expect(parsed['@type']).toBe('FAQPage')
81-
expect(Array.isArray(parsed.mainEntity)).toBe(true)
82-
expect(parsed.mainEntity.length).toBe(FAQ_COUNT)
79+
const graph = JSON.parse(faqJsonLd!)['@graph'] as {
80+
'@type': string
81+
mainEntity?: unknown[]
82+
}[]
83+
const faqPage = graph.find((node) => node['@type'] === 'FAQPage')
84+
expect(faqPage, 'FAQPage node in @graph').toBeDefined()
85+
expect(Array.isArray(faqPage!.mainEntity)).toBe(true)
86+
expect(faqPage!.mainEntity!.length).toBe(FAQ_COUNT)
8387
})
8488

8589
test('Apply Now CTA opens the application form in a new tab', async ({

apps/website/e2e/careers.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ test.describe('Careers page @smoke', () => {
88
})
99

1010
test('has correct title', async ({ page }) => {
11-
await expect(page).toHaveTitle('Careers Comfy')
11+
await expect(page).toHaveTitle('Careers - Comfy')
1212
})
1313

1414
test('Roles section heading is visible', async ({ page }) => {
@@ -72,7 +72,7 @@ test.describe('Careers page role links', () => {
7272
test.describe('Careers page (zh-CN) @smoke', () => {
7373
test('renders localized heading and roles', async ({ page }) => {
7474
await page.goto('/zh-CN/careers')
75-
await expect(page).toHaveTitle('招聘 Comfy')
75+
await expect(page).toHaveTitle('招聘 - Comfy')
7676
await expect(
7777
page.getByRole('heading', { name: '职位', level: 2 })
7878
).toBeVisible()

apps/website/e2e/cloud-nodes.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ test.describe('Cloud nodes page @smoke', () => {
99

1010
test('has correct title', async ({ page }) => {
1111
await expect(page).toHaveTitle(
12-
'Custom-node packs on Comfy Cloud supported by default'
12+
'Custom-node packs on Comfy Cloud - supported by default'
1313
)
1414
})
1515

apps/website/e2e/cloud.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ test.describe('Cloud page @smoke', () => {
88
})
99

1010
test('has correct title', async ({ page }) => {
11-
await expect(page).toHaveTitle('Comfy Cloud AI in the Cloud')
11+
await expect(page).toHaveTitle('Comfy Cloud - AI in the Cloud')
1212
})
1313

1414
test('HeroSection heading and subtitle are visible', async ({ page }) => {

apps/website/e2e/download.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ test.describe('Download page @smoke', () => {
1616

1717
test('has correct title', async ({ page }) => {
1818
await expect(page).toHaveTitle(
19-
'Download Comfy Desktop Run AI on Your Hardware'
19+
'Download Comfy Desktop - Run AI on Your Hardware'
2020
)
2121
})
2222

apps/website/e2e/homepage.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test.describe('Homepage @smoke', () => {
1717
})
1818

1919
test('has correct title', async ({ page }) => {
20-
await expect(page).toHaveTitle('Comfy Professional Control of Visual AI')
20+
await expect(page).toHaveTitle('Comfy - Professional Control of Visual AI')
2121
})
2222

2323
test('HeroSection heading is visible', async ({ page }) => {

0 commit comments

Comments
 (0)