diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 35c5d31183..c7488db5dd 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -15,6 +15,11 @@ reviews: - github-actions[bot] pre_merge_checks: override_requested_reviewers_only: true + # Explicitly disable the built-in docstring coverage check, which is + # enabled via organization-level settings. This repo opts out at the + # repo level without affecting other org repos. + docstrings: + mode: 'off' custom_checks: - name: End-to-end regression coverage for fixes mode: error diff --git a/.github/workflows/ci-tests-e2e-coverage.yaml b/.github/workflows/ci-tests-e2e-coverage.yaml index 246b551917..5e5583fe51 100644 --- a/.github/workflows/ci-tests-e2e-coverage.yaml +++ b/.github/workflows/ci-tests-e2e-coverage.yaml @@ -85,6 +85,16 @@ jobs: fi done + - name: Strip non-source entries from coverage + if: steps.coverage-shards.outputs.has-coverage == 'true' + run: | + # Drop served bundle scripts (localhost-8188/assets/*.js) that V8 records but have no source file on disk, which would abort genhtml. + lcov --remove coverage/playwright/coverage.lcov \ + '*localhost-8188*' \ + -o coverage/playwright/coverage.lcov \ + --ignore-errors unused + wc -l coverage/playwright/coverage.lcov + - name: Upload merged coverage data if: steps.coverage-shards.outputs.has-coverage == 'true' uses: actions/upload-artifact@v6 diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 0000000000..01a26f7cb9 --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,63 @@ +name: CLA Assistant + +on: + issue_comment: + types: [created] + pull_request_target: + types: [opened, synchronize, closed] + merge_group: + +permissions: + actions: write + contents: read # 'read' is enough because signatures live in a REMOTE repo + pull-requests: write + statuses: write + +jobs: + cla-assistant: + runs-on: ubuntu-latest + steps: + - name: CLA Assistant + # Run on PR events, on "recheck" comment, or when someone posts the exact signing phrase. + # IMPORTANT: this phrase must match `custom-pr-sign-comment` below. + if: > + github.event_name == 'pull_request_target' || + github.event.comment.body == 'recheck' || + github.event.comment.body == 'I have read and agree to the Contributor License Agreement' + uses: contributor-assistant/github-action@ca4a40a7d1004f18d9960b404b97e5f30a505a08 # v2.6.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # PAT required to write to the centralized signatures repo. + PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }} + with: + # Where the CLA document lives (shown to contributors) + path-to-document: https://github.com/Comfy-Org/comfy-cla/blob/main/comfyui_icla.md + + # Centralized signature storage + remote-organization-name: comfy-org + remote-repository-name: comfy-cla + path-to-signatures: signatures/cla.json + branch: main + + # Allowlist bots so they don't need to sign (optional, comma-separated). + # *[bot] is a catch-all for any GitHub App bot account. + allowlist: actions-user,ampagent,claude,coderabbitai[bot],comfy-pr-bot,dependabot[bot],github-actions[bot],copilot-swe-agent[bot],devin-ai-integration[bot],*[bot] + + # Custom PR comment messages + custom-notsigned-prcomment: | + 🎉 Thank you for your contribution, we really appreciate it! 🎉 + + Like many open source projects, we require contributors to sign our [Contributor License Agreement (CLA)](https://github.com/Comfy-Org/comfy-cla/blob/main/comfyui_icla.md). A CLA makes the ownership of contributions explicit, so contributors and the project share a clear understanding of how the code can be used. By signing, you: + + - Confirm that you own your contribution. + - Keep the right to reuse your own code. + - Grant us a copyright license to include and share it within our projects. + + CLAs are standard practice across major open source projects including those under the Apache Software Foundation and the Linux Foundation. Ours is based on the Apache Software Foundation's CLA. Most importantly, it would enable us to relicense the project under a more permissive license in the future, giving the project and its community greater flexibility. + + ✍ **To sign, please post a new comment on this PR with exactly the following text:** ✍ + + custom-pr-sign-comment: I have read and agree to the Contributor License Agreement + + custom-allsigned-prcomment: | + ✅ All contributors have signed the CLA. Thank you! This PR is ready to be merged. diff --git a/.storybook/main.ts b/.storybook/main.ts index 0c576b0bde..afbdbca499 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -78,6 +78,11 @@ const config: StorybookConfig = { find: '@/composables/queue/useJobActions', replacement: process.cwd() + '/src/storybook/mocks/useJobActions.ts' }, + { + find: '@/composables/billing/useBillingContext', + replacement: + process.cwd() + '/src/storybook/mocks/useBillingContext.ts' + }, { find: '@/utils/formatUtil', replacement: diff --git a/apps/website/e2e/pricing.spec.ts b/apps/website/e2e/pricing.spec.ts index 05520f0e5b..20ae747242 100644 --- a/apps/website/e2e/pricing.spec.ts +++ b/apps/website/e2e/pricing.spec.ts @@ -1,4 +1,5 @@ import { expect } from '@playwright/test' +import type { Page } from '@playwright/test' import { test } from './fixtures/blockExternalMedia' @@ -7,36 +8,27 @@ test.describe('Pricing page @smoke', () => { await page.goto('/cloud/pricing') }) - test('shows the three paid tiers and Enterprise', async ({ page }) => { - const pricingGrid = page - .locator('section', { - has: page.getByRole('heading', { name: /Pricing/i }) - }) - .locator('.lg\\:grid') + const pricingSection = (page: Page) => + page.locator('section').filter({ + has: page.getByRole('heading', { name: /Choose a plan/i }) + }) - for (const label of ['STANDARD', 'CREATOR', 'PRO']) { + test('shows the three paid tiers and Enterprise', async ({ page }) => { + const section = pricingSection(page) + + for (const label of ['STANDARD', 'CREATOR', 'PRO', 'ENTERPRISE']) { await expect( - pricingGrid.locator('span', { hasText: new RegExp(`^${label}$`) }) + section.locator('span', { hasText: new RegExp(`^${label}$`) }) ).toBeVisible() } - - await expect( - page.getByRole('heading', { name: /Looking for Enterprise Solutions/i }) - ).toBeVisible() }) test('does not show the Free tier when SHOW_FREE_TIER is disabled', async ({ page }) => { - const pricingGrid = page - .locator('section', { - has: page.getByRole('heading', { name: /Pricing/i }) - }) - .locator('.lg\\:grid') + const section = pricingSection(page) - await expect( - pricingGrid.locator('span', { hasText: /^FREE$/ }) - ).toHaveCount(0) + await expect(section.locator('span', { hasText: /^FREE$/ })).toHaveCount(0) await expect(page.getByRole('link', { name: /^START FREE$/ })).toHaveCount( 0 ) diff --git a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-1-sm-visual-linux.png b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-1-sm-visual-linux.png index 367013862f..5220b6d864 100644 Binary files a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-1-sm-visual-linux.png and b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-1-sm-visual-linux.png differ diff --git a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-2-md-visual-linux.png b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-2-md-visual-linux.png index 81af53c23e..0164519b68 100644 Binary files a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-2-md-visual-linux.png and b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-2-md-visual-linux.png differ diff --git a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-3-lg-visual-linux.png b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-3-lg-visual-linux.png index 8bf7c36cd9..ee19a54955 100644 Binary files a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-3-lg-visual-linux.png and b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-3-lg-visual-linux.png differ diff --git a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-4-xl-visual-linux.png b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-4-xl-visual-linux.png index b6ba02ec4b..e715fc3d4d 100644 Binary files a/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-4-xl-visual-linux.png and b/apps/website/e2e/visual-responsive.spec.ts-snapshots/pricing-tiers-4-xl-visual-linux.png differ diff --git a/apps/website/src/components/blocks/FAQSplit01.vue b/apps/website/src/components/blocks/FAQSplit01.vue index 6cc804df82..0a3f93372b 100644 --- a/apps/website/src/components/blocks/FAQSplit01.vue +++ b/apps/website/src/components/blocks/FAQSplit01.vue @@ -1,28 +1,15 @@ diff --git a/apps/website/src/components/common/CallToActionSection.vue b/apps/website/src/components/common/CallToActionSection.vue index 64735595ad..0a3e6411ec 100644 --- a/apps/website/src/components/common/CallToActionSection.vue +++ b/apps/website/src/components/common/CallToActionSection.vue @@ -25,7 +25,7 @@ const {

{{ t(headingKey, locale) }}

diff --git a/apps/website/src/components/common/EventsSection.vue b/apps/website/src/components/common/EventsSection.vue index 147e32c9dd..b0c21d557a 100644 --- a/apps/website/src/components/common/EventsSection.vue +++ b/apps/website/src/components/common/EventsSection.vue @@ -40,12 +40,12 @@ const {

{{ t(headingKey, locale) }}

{{ t(descriptionKey, locale) }}

@@ -66,10 +66,10 @@ const { v-for="(event, i) in events" :key="i" :href="event.href" - class="group border-primary-comfy-canvas/15 flex items-center gap-4 border-b py-6 lg:gap-8" + class="group flex items-center gap-4 border-b border-primary-comfy-canvas/15 py-6 lg:gap-8" > {{ event.label[locale] }} diff --git a/apps/website/src/components/common/SiteFooter.vue b/apps/website/src/components/common/SiteFooter.vue index 6ab92728c5..65726471ae 100644 --- a/apps/website/src/components/common/SiteFooter.vue +++ b/apps/website/src/components/common/SiteFooter.vue @@ -109,7 +109,7 @@ const contactColumn: { title: string; links: FooterLink[] } = {