diff --git a/.changeset/c3-frameworks-update-14205.md b/.changeset/c3-frameworks-update-14205.md new file mode 100644 index 0000000000..18b7709c5e --- /dev/null +++ b/.changeset/c3-frameworks-update-14205.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": patch +--- + +Update dependencies of "create-cloudflare" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ------------------- | ------ | ------ | +| create-react-router | 7.16.0 | 7.17.0 | diff --git a/.changeset/c3-frameworks-update-14206.md b/.changeset/c3-frameworks-update-14206.md new file mode 100644 index 0000000000..dcae1b3b20 --- /dev/null +++ b/.changeset/c3-frameworks-update-14206.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": patch +--- + +Update dependencies of "create-cloudflare" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ---------- | ------ | ------ | +| sv | 0.15.3 | 0.15.4 | diff --git a/.changeset/c3-frameworks-update-14207.md b/.changeset/c3-frameworks-update-14207.md new file mode 100644 index 0000000000..fc09b62a85 --- /dev/null +++ b/.changeset/c3-frameworks-update-14207.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": patch +--- + +Update dependencies of "create-cloudflare" + +The following dependency versions have been updated: + +| Dependency | From | To | +| ------------- | ----- | ----- | +| create-analog | 2.5.2 | 2.6.0 | diff --git a/.changeset/c3-frameworks-update-14208.md b/.changeset/c3-frameworks-update-14208.md new file mode 100644 index 0000000000..5879ad344f --- /dev/null +++ b/.changeset/c3-frameworks-update-14208.md @@ -0,0 +1,11 @@ +--- +"create-cloudflare": patch +--- + +Update dependencies of "create-cloudflare" + +The following dependency versions have been updated: + +| Dependency | From | To | +| --------------- | ------ | ------ | +| create-next-app | 16.2.6 | 16.2.7 | diff --git a/.github/actions/check-remote-tests/action.yml b/.github/actions/check-remote-tests/action.yml index 02e932e235..07f4802af8 100644 --- a/.github/actions/check-remote-tests/action.yml +++ b/.github/actions/check-remote-tests/action.yml @@ -2,7 +2,7 @@ name: "Check Remote Tests" description: > Determines whether E2E tests should be given Cloudflare API credentials. Returns true for merge-queue runs, Version Packages PRs, or when the - "run-remote-tests" label is present on a pull request. + "ci:run-remote-tests" label is present on a pull request. outputs: run-remote: description: "'true' when remote tests should run, 'false' otherwise" @@ -26,7 +26,7 @@ runs: elif [ "$EVENT_NAME" = "pull_request" ]; then HAS_LABEL=$(gh pr view "$PR_NUMBER" \ --repo "$REPO" --json labels \ - --jq '[.labels[].name] | any(. == "run-remote-tests")') + --jq '[.labels[].name] | any(. == "ci:run-remote-tests")') echo "run_remote=${HAS_LABEL}" >> "$GITHUB_OUTPUT" else echo "run_remote=false" >> "$GITHUB_OUTPUT" diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4b8ac47b36..0d69c83584 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -20,9 +20,9 @@ updates: commit-message: prefix: "[C3] " labels: - - "c3" + - "package:c3" - "dependencies" - - "skip-pr-description-validation" + - "ci:skip-pr-description-validation" # Check for workerd & workers-types updates for Miniflare - package-ecosystem: "npm" diff --git a/.github/holopin.yml b/.github/holopin.yml index b4bf04e518..6c269f6c45 100644 --- a/.github/holopin.yml +++ b/.github/holopin.yml @@ -1,7 +1,7 @@ organization: cloudflare stickers: - id: cltg4w6r612040fl2r7vweuvv - alias: "[automation] outstanding contribution" + alias: "ci:outstanding-contribution" holobytes: - evolvingStickerId: cltg4rlqc39020fl51scnguhb diff --git a/.github/workflows/README.md b/.github/workflows/README.md index ff975ee05e..8d38d050aa 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -40,7 +40,7 @@ Workflow changes should avoid unsuppressed `zizmor` findings. In particular: - PRs in the merge queue. - Actions - Runs the E2E tests for Wrangler. - - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. + - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `ci:run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. ### Vite Plugin E2E tests (e2e-vite.yml) @@ -49,7 +49,7 @@ Workflow changes should avoid unsuppressed `zizmor` findings. In particular: - PRs in the merge queue. - Actions - Runs the E2E tests for the Vite plugin. - - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. + - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `ci:run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. ## Deploy Pages Previews (deploy-pages-preview.yml) @@ -119,7 +119,7 @@ Workflow changes should avoid unsuppressed `zizmor` findings. In particular: - Updates to PRs. - Actions - Runs the E2E tests for C3. - - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. + - Cloudflare API credentials are only passed on Version Packages PRs (`changeset-release/main`), in the merge queue, or when the `ci:run-remote-tests` label is applied. Other PRs run the E2E suite without remote tests. ### Rerun Code Owners (rerun-codeowners.yml + rerun-codeowners-privileged.yml) @@ -132,8 +132,8 @@ Workflow changes should avoid unsuppressed `zizmor` findings. In particular: ### Rerun Remote Tests (rerun-remote-tests.yml) - Triggers - - The `run-remote-tests` or `run-c3-frameworks-tests` label is added to or removed from a PR. + - The `ci:run-remote-tests` or `run-c3-frameworks-tests` label is added to or removed from a PR. - Actions - Re-runs the E2E workflows for the PR so they pick up the label change and pass (or withhold) API credentials to the test steps. - - `run-remote-tests` re-runs Wrangler, Vite, and C3 E2E workflows; `run-c3-frameworks-tests` re-runs only C3 E2E. + - `ci:run-remote-tests` re-runs Wrangler, Vite, and C3 E2E workflows; `run-c3-frameworks-tests` re-runs only C3 E2E. - Uses `pull_request_target` to get a privileged token even for fork PRs (safe because no untrusted code is checked out). diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml index cf10b49279..a98fda2067 100644 --- a/.github/workflows/issues.yml +++ b/.github/workflows/issues.yml @@ -23,19 +23,19 @@ jobs: with: project-url: https://github.com/orgs/cloudflare/projects/2 github-token: ${{ secrets.GH_ACCESS_TOKEN }} - labeled: pages + labeled: product:pages - uses: actions/add-to-project@a9f041ddd462ed185893ea1024cec954f50dbe42 # v0.3.0 with: project-url: https://github.com/orgs/cloudflare/projects/6 github-token: ${{ secrets.GH_ACCESS_TOKEN }} - labeled: d1 + labeled: product:d1 - uses: actions/add-to-project@a9f041ddd462ed185893ea1024cec954f50dbe42 # v0.3.0 with: project-url: https://github.com/orgs/cloudflare/projects/12 github-token: ${{ secrets.GH_ACCESS_TOKEN }} - labeled: c3 + labeled: product:c3 - uses: actions/add-to-project@a9f041ddd462ed185893ea1024cec954f50dbe42 # v0.3.0 with: project-url: https://github.com/orgs/cloudflare/projects/8 github-token: ${{ secrets.GH_ACCESS_TOKEN }} - labeled: queues + labeled: product:queues diff --git a/.github/workflows/rerun-remote-tests.yml b/.github/workflows/rerun-remote-tests.yml index 5363437016..c581692634 100644 --- a/.github/workflows/rerun-remote-tests.yml +++ b/.github/workflows/rerun-remote-tests.yml @@ -22,7 +22,7 @@ permissions: {} jobs: rerun-e2e: name: "Rerun E2E Tests" - if: github.event.label.name == 'run-remote-tests' || github.event.label.name == 'run-c3-frameworks-tests' + if: github.event.label.name == 'ci:run-remote-tests' || github.event.label.name == 'run-c3-frameworks-tests' runs-on: ubuntu-latest permissions: actions: write @@ -35,7 +35,7 @@ jobs: REPO: ${{ github.repository }} run: | # Determine which workflows to re-run based on the label. - if [ "$LABEL_NAME" = "run-remote-tests" ]; then + if [ "$LABEL_NAME" = "ci:run-remote-tests" ]; then WORKFLOWS="e2e-wrangler.yml e2e-vite.yml c3-e2e.yml" else WORKFLOWS="c3-e2e.yml" diff --git a/.github/workflows/run-ci-for-external-forks.yml b/.github/workflows/run-ci-for-external-forks.yml index 1d7e8e4d21..6ee021c164 100644 --- a/.github/workflows/run-ci-for-external-forks.yml +++ b/.github/workflows/run-ci-for-external-forks.yml @@ -71,16 +71,16 @@ jobs: if [ -n "$existing_pr" ]; then gh pr edit "$existing_pr" \ - --add-label "e2e" \ - --add-label "run-remote-tests" \ + --add-label "ci:e2e" \ + --add-label "ci:run-remote-tests" \ --title "$TITLE" \ --body "$BODY" else gh pr create \ --head "run-ci-on-behalf-of-$PR_NUM" \ --draft \ - --label "e2e" \ - --label "run-remote-tests" \ + --label "ci:e2e" \ + --label "ci:run-remote-tests" \ --title "$TITLE" \ --body "$BODY" fi diff --git a/.github/workflows/test-and-check-other-node.yml b/.github/workflows/test-and-check-other-node.yml index d2b39803d2..528c3e745c 100644 --- a/.github/workflows/test-and-check-other-node.yml +++ b/.github/workflows/test-and-check-other-node.yml @@ -22,7 +22,7 @@ jobs: matrix: # expected_to_fail: if true, tests may fail on this Node version. # These versions are skipped on normal PRs but run on Version Packages PRs - # (changeset-release/main) or when the 'test all node versions' label is added. + # (changeset-release/main) or when the 'ci:test-all-node-versions' label is added. include: - { node_version: 24, description: "Node 24", expected_to_fail: true } - { node_version: 25, description: "Node 25", expected_to_fail: true } @@ -47,7 +47,7 @@ jobs: env: CHANGES_EVERYTHING_BUT_MARKDOWN: ${{ steps.changes.outputs.everything_but_markdown }} EXPECTED_TO_FAIL: ${{ matrix.expected_to_fail }} - HAS_TEST_ALL_NODE_VERSIONS_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'test all node versions') }} + HAS_TEST_ALL_NODE_VERSIONS_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'ci:test-all-node-versions') }} HEAD_REF: ${{ github.event.pull_request.head.ref }} run: | if [[ "$CHANGES_EVERYTHING_BUT_MARKDOWN" == "true" ]] && \ diff --git a/.github/workflows/worker-playground-preview-testing-env-deploy-and-test.yml b/.github/workflows/worker-playground-preview-testing-env-deploy-and-test.yml index a7e61d4ffb..9ea49394e3 100644 --- a/.github/workflows/worker-playground-preview-testing-env-deploy-and-test.yml +++ b/.github/workflows/worker-playground-preview-testing-env-deploy-and-test.yml @@ -24,7 +24,7 @@ permissions: jobs: e2e-test: - if: github.repository_owner == 'cloudflare' && (github.event_name != 'pull_request' || contains(github.event.*.labels.*.name, 'playground-worker')) + if: github.repository_owner == 'cloudflare' && (github.event_name != 'pull_request' || contains(github.event.*.labels.*.name, 'feature:playground-worker')) name: "Deploy Playground Preview Worker (testing)" runs-on: ubuntu-latest diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cf4145d354..bc58952fbc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -360,10 +360,10 @@ Remote E2E tests run automatically in these cases: - **Version Packages PRs** (branch `changeset-release/main`) — acts as a pre-release safety net, catching remote-test failures before packages are published. - **Merge queue** — final check before code lands on `main`. -If you need remote E2E tests on your PR (e.g. you're changing deployment logic or binding behavior), apply the **`run-remote-tests`** label. This triggers a re-run of the E2E workflows with API credentials enabled. +If you need remote E2E tests on your PR (e.g. you're changing deployment logic or binding behavior), apply the **`ci:run-remote-tests`** label. This triggers a re-run of the E2E workflows with API credentials enabled. > [!NOTE] -> The `run-remote-tests` label has no effect on PRs from forks, because GitHub does not expose repository secrets to fork PRs. +> The `ci:run-remote-tests` label has no effect on PRs from forks, because GitHub does not expose repository secrets to fork PRs. ## Running E2E tests locally diff --git a/packages/create-cloudflare/src/frameworks/package.json b/packages/create-cloudflare/src/frameworks/package.json index ba22033c38..567b3078e8 100644 --- a/packages/create-cloudflare/src/frameworks/package.json +++ b/packages/create-cloudflare/src/frameworks/package.json @@ -3,13 +3,13 @@ "dependencies": { "@angular/create": "21.2.13", "@tanstack/cli": "0.68.0", - "create-analog": "2.5.2", + "create-analog": "2.6.0", "create-astro": "5.0.6", "create-docusaurus": "3.10.1", "create-hono": "0.19.4", - "create-next-app": "16.2.6", + "create-next-app": "16.2.7", "create-qwik": "1.20.0", - "create-react-router": "7.16.0", + "create-react-router": "7.17.0", "create-rwsdk": "3.1.3", "create-solid": "0.7.0", "create-vike": "0.0.627", @@ -18,7 +18,7 @@ "create-waku": "0.12.5-1.0.0-alpha.10-0", "gatsby": "5.16.1", "nuxi": "3.35.2", - "sv": "0.15.3" + "sv": "0.15.4" }, "info": [ "This package.json is only used to keep track of the frameworks cli dependencies", diff --git a/packages/wrangler/e2e/remote-binding/remote-bindings-api.test.ts b/packages/wrangler/e2e/remote-binding/remote-bindings-api.test.ts index fa623b7e76..2d3f69007c 100644 --- a/packages/wrangler/e2e/remote-binding/remote-bindings-api.test.ts +++ b/packages/wrangler/e2e/remote-binding/remote-bindings-api.test.ts @@ -105,7 +105,13 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)( error = e; } expect(normalizeOutput(`${error}`)).toMatchInlineSnapshot( - `"Error: Failed to start the remote proxy session. Error reloading remote server: A request to the Cloudflare API (/accounts/00000000000000000000000000000000/workers/subdomain/edge-preview) failed."` + ` + "Error: Failed to establish remote session due to an authentication issue. + It looks like you are authenticating via a custom API token (\`CLOUDFLARE_API_TOKEN\`) set in an environment variable. + The token may be invalid or lack the required permissions for this operation. + To fix this, verify that your token is valid and has the correct permissions. + You can also run \`wrangler whoami\` to check your current authentication status." + ` ); }); }); @@ -166,7 +172,13 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)( error = e; } expect(normalizeOutput(`${error}`)).toMatchInlineSnapshot( - `"Error: Failed to start the remote proxy session. Error reloading remote server: A request to the Cloudflare API (/accounts/00000000000000000000000000000000/workers/subdomain/edge-preview) failed."` + ` + "Error: Failed to establish remote session due to an authentication issue. + It looks like you are authenticating via a custom API token (\`CLOUDFLARE_API_TOKEN\`) set in an environment variable. + The token may be invalid or lack the required permissions for this operation. + To fix this, verify that your token is valid and has the correct permissions. + You can also run \`wrangler whoami\` to check your current authentication status." + ` ); }); }); diff --git a/packages/wrangler/e2e/start-worker-auth-opts.test.ts b/packages/wrangler/e2e/start-worker-auth-opts.test.ts index 6f9924547c..c96b6b810d 100644 --- a/packages/wrangler/e2e/start-worker-auth-opts.test.ts +++ b/packages/wrangler/e2e/start-worker-auth-opts.test.ts @@ -21,7 +21,7 @@ describe("startWorker - auth options", { sequential: true }, () => { beforeEach(async () => { consoleErrorMock = vi.spyOn(console, "error").mockImplementation(() => { - // suppress error output during tests - we are going to check for specific error messages in the tests themselves + // suppress error output during tests }); helper = new WranglerE2ETestHelper(); @@ -65,6 +65,8 @@ describe("startWorker - auth options", { sequential: true }, () => { }; }); + let emittedErrors: unknown[] = []; + worker = await startWorker({ entrypoint: path.resolve(helper.tmpPath, "src/index.js"), bindings: { @@ -82,11 +84,13 @@ describe("startWorker - auth options", { sequential: true }, () => { }, }); - await assertValidWorkerAiResponse(expect); + worker.raw.on("error", (e: unknown) => emittedErrors.push(e)); + + await assertValidWorkerAiResponse(expect, emittedErrors); expect(validAuth).toHaveBeenCalled(); - consoleErrorMock.mockReset(); + emittedErrors = []; const incorrectAuth = vi.fn(() => { return { @@ -103,7 +107,7 @@ describe("startWorker - auth options", { sequential: true }, () => { }, }); - await assertInvalidWorkerAiResponse(expect); + await assertAuthErrorForWorkerAiResponse(expect, emittedErrors); expect(incorrectAuth).toHaveBeenCalled(); }); @@ -120,6 +124,8 @@ describe("startWorker - auth options", { sequential: true }, () => { }; }); + let emittedErrors: unknown[] = []; + worker = await startWorker({ entrypoint: path.resolve(helper.tmpPath, "src/index.js"), bindings: { @@ -137,11 +143,14 @@ describe("startWorker - auth options", { sequential: true }, () => { }, }); - await assertInvalidWorkerAiResponse(expect); + worker.raw.on("error", (e: unknown) => emittedErrors.push(e)); + + await assertAuthErrorForWorkerAiResponse(expect, emittedErrors); expect(incorrectAuth).toHaveBeenCalled(); consoleErrorMock.mockReset(); + emittedErrors = []; const validAuth = vi.fn(() => { assert(process.env.CLOUDFLARE_API_TOKEN); @@ -160,12 +169,15 @@ describe("startWorker - auth options", { sequential: true }, () => { }, }); - await assertValidWorkerAiResponse(expect); + await assertValidWorkerAiResponse(expect, emittedErrors); expect(validAuth).toHaveBeenCalled(); }); - async function assertValidWorkerAiResponse(expect: ExpectStatic) { + async function assertValidWorkerAiResponse( + expect: ExpectStatic, + emittedErrors: unknown[] + ) { assert(worker, "Worker is not defined"); const responseText = await fetchTimedTextFromWorker(worker); @@ -174,15 +186,20 @@ describe("startWorker - auth options", { sequential: true }, () => { expect(responseText).toBeTruthy(); expect(responseText).toContain("This is a response from Workers AI."); - // And there should be no error regarding the Cloudflare API in the console - expect(consoleErrorMock).not.toHaveBeenCalledWith( - expect.stringMatching( - /A request to the Cloudflare API \([^)]*\) failed\./ + // And there should be no authentication error emitted + const authErrors = emittedErrors.filter((e) => + hasMatchingCauseMessage( + e, + /Failed to establish remote session due to an authentication issue/ ) ); + expect(authErrors).toHaveLength(0); } - async function assertInvalidWorkerAiResponse(expect: ExpectStatic) { + async function assertAuthErrorForWorkerAiResponse( + expect: ExpectStatic, + emittedErrors: unknown[] + ) { assert(worker, "Worker is not defined"); const responseText = await fetchTimedTextFromWorker(worker); @@ -190,12 +207,37 @@ describe("startWorker - auth options", { sequential: true }, () => { // get a response from the worker expect(responseText).toBe(null); - // And in the console an appropriate error was logged - expect(consoleErrorMock).toHaveBeenCalledWith( - expect.stringMatching( - /A request to the Cloudflare API \([^)]*\) failed\./ + // And an authentication error was emitted + const authErrors = emittedErrors.filter((e) => + hasMatchingCauseMessage( + e, + /Failed to establish remote session due to an authentication issue/ ) ); + expect(authErrors.length).toBeGreaterThan(0); + } + + /** + * Checks whether an emitted error event (or its cause chain) contains + * a message matching the given pattern. + * + * @param event - the error event to inspect + * @param pattern - the regex pattern to match against error messages + * @returns whether any error in the cause chain matches the pattern + */ + function hasMatchingCauseMessage(event: unknown, pattern: RegExp): boolean { + if (event == null || typeof event !== "object") { + return false; + } + const cause = (event as { cause?: unknown }).cause; + if (cause instanceof Error && pattern.test(cause.message)) { + return true; + } + // Recurse into nested cause + if (cause instanceof Error && cause.cause) { + return hasMatchingCauseMessage({ cause: cause.cause }, pattern); + } + return false; } }); diff --git a/tools/deployments/__tests__/validate-pr-description.test.ts b/tools/deployments/__tests__/validate-pr-description.test.ts index 260d6d30ea..94183306fe 100644 --- a/tools/deployments/__tests__/validate-pr-description.test.ts +++ b/tools/deployments/__tests__/validate-pr-description.test.ts @@ -2,11 +2,11 @@ import { describe, it } from "vitest"; import { validateDescription } from "../validate-pr-description"; describe("validateDescription()", () => { - it("should skip validation with the `skip-pr-description-validation` label", ({ + it("should skip validation with the `ci:skip-pr-description-validation` label", ({ expect, }) => { expect( - validateDescription("", "", '["skip-pr-description-validation"]', "[]") + validateDescription("", "", '["ci:skip-pr-description-validation"]', "[]") ).toHaveLength(0); }); @@ -45,8 +45,8 @@ In particular, for non-trivial changes, please always engage on the issue or cre ) ).toMatchInlineSnapshot(` [ - "Your PR must include tests, or provide justification for why no tests are required in the PR description and apply the \`no-tests\` label", - "Your PR doesn't include a changeset. Either include one (following the instructions in CONTRIBUTING.md) or add the 'no-changeset-required' label to bypass this check. Most PRs should have a changeset, so only bypass this check if you're sure that your change doesn't need one: see https://github.com/cloudflare/workers-sdk/blob/main/CONTRIBUTING.md#changesets for more details.", + "Your PR must include tests, or provide justification for why no tests are required in the PR description and apply the \`ci:no-tests\` label", + "Your PR doesn't include a changeset. Either include one (following the instructions in CONTRIBUTING.md) or add the 'ci:no-changeset-required' label to bypass this check. Most PRs should have a changeset, so only bypass this check if you're sure that your change doesn't need one: see https://github.com/cloudflare/workers-sdk/blob/main/CONTRIBUTING.md#changesets for more details.", "Your PR must include documentation (in the form of a link to a Cloudflare Docs issue or PR), or provide justification for why no documentation is required", ] `); @@ -79,7 +79,7 @@ The following selections do not need to be completed if this PR only contains ch Have you read our [Contributing guide](https://github.com/cloudflare/workers-sdk/blob/main/CONTRIBUTING.md)? In particular, for non-trivial changes, please always engage on the issue or create a discussion or feature request issue first before writing your code. -->`, - '["no-changeset-required"]', + '["ci:no-changeset-required"]', "[]" ) ).toMatchInlineSnapshot(`[]`); diff --git a/tools/deployments/validate-pr-description.ts b/tools/deployments/validate-pr-description.ts index 700d6e1a28..6b5508917b 100644 --- a/tools/deployments/validate-pr-description.ts +++ b/tools/deployments/validate-pr-description.ts @@ -34,9 +34,9 @@ export function validateDescription( const parsedLabels = JSON.parse(labels) as string[]; - if (parsedLabels.includes("skip-pr-description-validation")) { + if (parsedLabels.includes("ci:skip-pr-description-validation")) { console.log( - "Skipping validation because the `skip-pr-description-validation` label has been applied" + "Skipping validation because the `ci:skip-pr-description-validation` label has been applied" ); return []; } @@ -51,7 +51,7 @@ export function validateDescription( ) ) { errors.push( - "Your PR must include tests, or provide justification for why no tests are required in the PR description and apply the `no-tests` label" + "Your PR must include tests, or provide justification for why no tests are required in the PR description and apply the `ci:no-tests` label" ); } @@ -60,9 +60,12 @@ export function validateDescription( f.startsWith(".changeset/") ); - if (!changesetIncluded && !parsedLabels.includes("no-changeset-required")) { + if ( + !changesetIncluded && + !parsedLabels.includes("ci:no-changeset-required") + ) { errors.push( - "Your PR doesn't include a changeset. Either include one (following the instructions in CONTRIBUTING.md) or add the 'no-changeset-required' label to bypass this check. Most PRs should have a changeset, so only bypass this check if you're sure that your change doesn't need one: see https://github.com/cloudflare/workers-sdk/blob/main/CONTRIBUTING.md#changesets for more details." + "Your PR doesn't include a changeset. Either include one (following the instructions in CONTRIBUTING.md) or add the 'ci:no-changeset-required' label to bypass this check. Most PRs should have a changeset, so only bypass this check if you're sure that your change doesn't need one: see https://github.com/cloudflare/workers-sdk/blob/main/CONTRIBUTING.md#changesets for more details." ); } diff --git a/tools/github-workflow-helpers/auto-assign-issues.ts b/tools/github-workflow-helpers/auto-assign-issues.ts index 63a609742c..25e4cf6cbf 100644 --- a/tools/github-workflow-helpers/auto-assign-issues.ts +++ b/tools/github-workflow-helpers/auto-assign-issues.ts @@ -7,52 +7,52 @@ import type { IssuesLabeledEvent } from "@octokit/webhooks-types"; * The mapping of github issue labels to team members for assignment. */ const TEAM_ASSIGNMENTS: { [label: string]: { [jobRole: string]: string } } = { - agents: { em: "whoiskatrin", pm: "mikenomitch" }, - "analytics engine": {}, + "product:agents": { em: "whoiskatrin", pm: "mikenomitch" }, + "product:analytics-engine": {}, api: { em: "dcartertwo", pm: "korinne" }, auth: { em: "dcartertwo", pm: "korinne" }, - "auto-provisioning": { em: "lrapoport-cf", pm: "mattietk" }, - c3: { em: "lrapoport-cf", pm: "mattietk" }, - constellation: {}, - containers: { em: "th0m", pm: "mikenomitch" }, - d1: { em: "joshthoward", pm: "vy-ton" }, + "feature:auto-provisioning": { em: "lrapoport-cf", pm: "mattietk" }, + "package:c3": { em: "lrapoport-cf", pm: "mattietk" }, + "product:constellation": {}, + "product:containers": { em: "th0m", pm: "mikenomitch" }, + "product:d1": { em: "joshthoward", pm: "vy-ton" }, documentation: {}, - "durable objects": { em: "joshthoward", pm: "vy-ton" }, - email: { pm: "thomasgauvin" }, - hyperdrive: { em: "sejoker", pm: "thomasgauvin" }, - "kv-asset-handler": { em: "lrapoport-cf", pm: "mattietk" }, - miniflare: { em: "lrapoport-cf", pm: "mattietk" }, - multiworker: { em: "lrapoport-cf", pm: "mattietk" }, - "node compat": { em: "lrapoport-cf", pm: "mattietk" }, - "nodejs compat": { em: "lrapoport-cf", pm: "mattietk" }, - observability: { em: "boristane", pm: "nevikashah" }, + "product:durable-objects": { em: "joshthoward", pm: "vy-ton" }, + "product:email": { pm: "thomasgauvin" }, + "product:hyperdrive": { em: "sejoker", pm: "thomasgauvin" }, + "package:kv-asset-handler": { em: "lrapoport-cf", pm: "mattietk" }, + "package:miniflare": { em: "lrapoport-cf", pm: "mattietk" }, + "feature:multiworker": { em: "lrapoport-cf", pm: "mattietk" }, + "node-compat": { em: "lrapoport-cf", pm: "mattietk" }, + "nodejs-compat": { em: "lrapoport-cf", pm: "mattietk" }, + "feature:observability": { em: "boristane", pm: "nevikashah" }, opennext: { em: "lrapoport-cf", pm: "mattietk", tl: "vicb" }, - pages: { em: "dcartertwo", pm: "irvinebroque" }, - pipelines: {}, - "playground-worker": { em: "lrapoport-cf", pm: "mattietk" }, + "product:pages": { em: "dcartertwo", pm: "irvinebroque" }, + "product:pipelines": {}, + "feature:playground-worker": { em: "lrapoport-cf", pm: "mattietk" }, python: { em: "danlapid", pm: "mikenomitch" }, - queues: {}, - r2: { em: "annibread", pm: "aninibread" }, - "remote-bindings": { em: "lrapoport-cf", pm: "mattietk" }, - "secrets-store": {}, + "product:queues": {}, + "product:r2": { em: "annibread", pm: "aninibread" }, + "feature:remote-bindings": { em: "lrapoport-cf", pm: "mattietk" }, + "product:secrets-store": {}, "start-dev-worker": { em: "lrapoport-cf", pm: "mattietk" }, - templates: { em: "lrapoport-cf", pm: "mattietk" }, - types: { em: "lrapoport-cf", pm: "mattietk" }, - "types-ai": { em: "jkipp-cloudflare" }, - unenv: { em: "lrapoport-cf", pm: "mattietk" }, - vectorize: { em: "sejoker", pm: "jonesphillip" }, - "vite-plugin": { em: "lrapoport-cf", pm: "mattietk" }, - vitest: { em: "lrapoport-cf", pm: "mattietk" }, - "workers vpc": { em: "efalcao", pm: "thomasgauvin" }, - "Workers + Assets": { em: "dcartertwo", pm: "irvinebroque" }, - "workers ai": { em: "jkipp-cloudflare" }, - "workers-builds": { + "feature:templates": { em: "lrapoport-cf", pm: "mattietk" }, + "feature:types": { em: "lrapoport-cf", pm: "mattietk" }, + "feature:types-ai": { em: "jkipp-cloudflare" }, + "package:unenv": { em: "lrapoport-cf", pm: "mattietk" }, + "product:vectorize": { em: "sejoker", pm: "jonesphillip" }, + "package:vite-plugin": { em: "lrapoport-cf", pm: "mattietk" }, + "package:vitest": { em: "lrapoport-cf", pm: "mattietk" }, + "product:vpc": { em: "efalcao", pm: "thomasgauvin" }, + "feature:workers-assets": { em: "dcartertwo", pm: "irvinebroque" }, + "product:workers-ai": { em: "jkipp-cloudflare" }, + "feature:workers-builds": { director: "fredkschott", pm: "yomna-shousha", em: "ericclemmons", }, - workflows: { em: "bruxodasilva", pm: "jonesphillip" }, - wrangler: { em: "lrapoport-cf", pm: "mattietk" }, + "product:workflows": { em: "bruxodasilva", pm: "jonesphillip" }, + "package:wrangler": { em: "lrapoport-cf", pm: "mattietk" }, }; if (require.main === module) {