From e9096c79f52b4def308b6d20349759b890ac5d58 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:08:37 +0800 Subject: [PATCH 1/7] ci(ecosystem): declare playwright via repo.json + force playwright >= 1.60 `npx playwright install chromium` wedges after the download bar reaches 100% under Node 24.16.0+ with Playwright < 1.60 (microsoft/playwright#40724, fixed in 1.60.0 via #40747). This was silently consuming the full 10-min timeout on vibe-dashboard, vitepress, tanstack-start-helloworld, and vitest-playwright-repro every nightly run, because vp env happens to pick 24.16.0 for them. Make Playwright a first-class declaration: - repo.json gains `"playwright": true` on the 5 projects that need it (vibe-dashboard, vitepress, tanstack-start-helloworld, vitest-playwright-repro, vite-vue-vercel). - patch-project.ts reads the flag and writes a `pnpm.overrides.playwright` entry pinned to `^1.60.0`. The override applies uniformly across direct deps, catalog entries (vibe-dashboard), and transitive-only cases (vitest-playwright-repro via @vitest/browser-playwright). - e2e-test.yml adds a single `Install Playwright chromium` step gated on the repo.json flag (read via jq), removing the duplicated `npx playwright install chromium` lines from the 5 per-project command blocks. --- .github/workflows/e2e-test.yml | 18 +++++++++++++----- ecosystem-ci/patch-project.ts | 16 ++++++++++++++++ ecosystem-ci/repo.json | 15 ++++++++++----- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 4c2ab8f3de..7f864fcb31 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -145,7 +145,6 @@ jobs: - name: vibe-dashboard node-version: 24 command: | - npx playwright install chromium # FIXME: Failed to load JS plugin: ./plugins/debugger.js # vp run ready vp fmt @@ -216,7 +215,6 @@ jobs: - name: vitepress node-version: 24 command: | - npx playwright install chromium vp run format vp run build vp test run -r __tests__/unit @@ -226,7 +224,6 @@ jobs: - name: tanstack-start-helloworld node-version: 24 command: | - npx playwright install chromium vp run test vp run build - name: oxlint-plugin-complexity @@ -241,7 +238,6 @@ jobs: - name: vite-vue-vercel node-version: 24 command: | - npx playwright install chromium vp run test vp run build - name: dify @@ -314,7 +310,6 @@ jobs: - name: vitest-playwright-repro node-version: 24 command: | - npx playwright install chromium vp test - name: vite-plus-vitest-type-aug node-version: 24 @@ -410,6 +405,19 @@ jobs: shell: bash run: node $GITHUB_WORKSPACE/ecosystem-ci/verify-install.ts + - name: Determine playwright requirement + id: pw + shell: bash + run: | + needs=$(jq -r --arg p '${{ matrix.project.name }}' '.[$p].playwright // false' "$GITHUB_WORKSPACE/ecosystem-ci/repo.json") + echo "needs=$needs" >> "$GITHUB_OUTPUT" + + - name: Install Playwright chromium + if: steps.pw.outputs.needs == 'true' + working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }} + shell: bash + run: npx playwright install chromium + - name: Run vite-plus commands in ${{ matrix.project.name }} working-directory: ${{ runner.temp }}/vite-plus-ecosystem-ci/${{ matrix.project.name }}${{ matrix.project.directory && format('/{0}', matrix.project.directory) || '' }} run: ${{ matrix.project.command }} diff --git a/ecosystem-ci/patch-project.ts b/ecosystem-ci/patch-project.ts index 0f9276d5e1..c54f548480 100644 --- a/ecosystem-ci/patch-project.ts +++ b/ecosystem-ci/patch-project.ts @@ -24,6 +24,22 @@ const cwd = directory ? join(repoRoot, directory) : repoRoot; // run vp migrate const cli = process.env.VP_CLI_BIN ?? 'vp'; +// Projects that need Playwright (declared via `playwright: true` in repo.json) +// must use Playwright >= 1.60.0, otherwise `npx playwright install chromium` +// wedges after the download bar reaches 100% under Node 24.16.0+ +// (microsoft/playwright#40724, fixed in 1.60.0 via microsoft/playwright#40747). +// Force the version uniformly via pnpm overrides so it covers direct deps, +// catalog entries, and transitive-only (e.g. @vitest/browser-playwright) cases. +const needsPlaywright = 'playwright' in repoConfig && repoConfig.playwright; +if (needsPlaywright) { + const pkgPath = join(cwd, 'package.json'); + const pkg = JSON.parse(await readFile(pkgPath, 'utf-8')); + pkg.pnpm ??= {}; + pkg.pnpm.overrides ??= {}; + pkg.pnpm.overrides.playwright = '^1.60.0'; + await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf-8'); +} + if (project === 'rollipop') { const oxfmtrc = await readFile(join(repoRoot, '.oxfmtrc.json'), 'utf-8'); await writeFile( diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index e184aaabf8..f326f1d3db 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -14,7 +14,8 @@ "repository": "https://github.com/voidzero-dev/vibe-dashboard.git", "branch": "main", "hash": "158e4a0c3d8a1801e330300a5deba4506fd5dfb9", - "forceFreshMigration": true + "forceFreshMigration": true, + "playwright": true }, "rollipop": { "repository": "https://github.com/leegeunhyeok/rollipop.git", @@ -39,12 +40,14 @@ "vitepress": { "repository": "https://github.com/vuejs/vitepress.git", "branch": "feat/vite-8", - "hash": "9330f228861623c71f2598271d4e79c9c53f2c08" + "hash": "9330f228861623c71f2598271d4e79c9c53f2c08", + "playwright": true }, "tanstack-start-helloworld": { "repository": "https://github.com/fengmk2/tanstack-start-helloworld.git", "branch": "main", - "hash": "09bafe177bbcd1e3108c441a67601ae6380ad352" + "hash": "09bafe177bbcd1e3108c441a67601ae6380ad352", + "playwright": true }, "oxlint-plugin-complexity": { "repository": "https://github.com/itaymendel/oxlint-plugin-complexity.git", @@ -54,7 +57,8 @@ "vite-vue-vercel": { "repository": "https://github.com/fengmk2/vite-vue-vercel.git", "branch": "main", - "hash": "f2bf9fc40880c6a80f5d89bff70641c2eeaf77ef" + "hash": "f2bf9fc40880c6a80f5d89bff70641c2eeaf77ef", + "playwright": true }, "viteplus-ws-repro": { "repository": "https://github.com/Charles5277/viteplus-ws-repro.git", @@ -112,7 +116,8 @@ "vitest-playwright-repro": { "repository": "https://github.com/why-reproductions-are-required/vitest-playwright-repro.git", "branch": "main", - "hash": "f7252170025c01ec482fa9ad43e09b965f46928f" + "hash": "f7252170025c01ec482fa9ad43e09b965f46928f", + "playwright": true }, "vite-plus-vitest-type-aug": { "repository": "https://github.com/why-reproductions-are-required/vite-plus-vitest-type-aug.git", From feb29f726b911cfca7a99b7e649240aa587bdcb1 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:35:45 +0800 Subject: [PATCH 2/7] ci(ecosystem): bump vibe-dashboard to 92a143a5 (playwright 1.60.0 in lockfile) Upstream vibe-dashboard main now has playwright@1.60.0 pinned in pnpm-lock.yaml via the existing catalog `^1.58.2`. Bumping the hash so e2e tests exercise the installed-version state instead of relying solely on patch-project.ts's pnpm override. --- ecosystem-ci/repo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index f326f1d3db..6a5e5a9dfb 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -13,7 +13,7 @@ "vibe-dashboard": { "repository": "https://github.com/voidzero-dev/vibe-dashboard.git", "branch": "main", - "hash": "158e4a0c3d8a1801e330300a5deba4506fd5dfb9", + "hash": "92a143a57478723987e778439a355291835135ec", "forceFreshMigration": true, "playwright": true }, From 0440e4ed8da3ffe5db71ebf2d5df98a041f8f8a3 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:37:41 +0800 Subject: [PATCH 3/7] ci(ecosystem): drop pnpm.overrides.playwright injection from patch-project.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-version-bumping each project (so its lockfile resolves playwright >= 1.60 directly) is the right place to enforce the version — overriding it inside patch-project.ts produced several pitfalls: - pkg.pnpm.overrides is ignored by npm-managed projects (vitest-playwright-repro uses npm); the override never reached the lockfile and the wedge returned - override targeted the bare `playwright` package, missing vitepress which depends on `playwright-chromium` - writing pkg.pnpm before vp migrate flipped migrator branches and could mask upstream pnpm-workspace.yaml overrides on forceFreshMigration projects The repo.json `"playwright": true` flag still drives the workflow's "Install Playwright chromium" step; the actual version pinning will be handled at the upstream project level instead. --- ecosystem-ci/patch-project.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/ecosystem-ci/patch-project.ts b/ecosystem-ci/patch-project.ts index c54f548480..0f9276d5e1 100644 --- a/ecosystem-ci/patch-project.ts +++ b/ecosystem-ci/patch-project.ts @@ -24,22 +24,6 @@ const cwd = directory ? join(repoRoot, directory) : repoRoot; // run vp migrate const cli = process.env.VP_CLI_BIN ?? 'vp'; -// Projects that need Playwright (declared via `playwright: true` in repo.json) -// must use Playwright >= 1.60.0, otherwise `npx playwright install chromium` -// wedges after the download bar reaches 100% under Node 24.16.0+ -// (microsoft/playwright#40724, fixed in 1.60.0 via microsoft/playwright#40747). -// Force the version uniformly via pnpm overrides so it covers direct deps, -// catalog entries, and transitive-only (e.g. @vitest/browser-playwright) cases. -const needsPlaywright = 'playwright' in repoConfig && repoConfig.playwright; -if (needsPlaywright) { - const pkgPath = join(cwd, 'package.json'); - const pkg = JSON.parse(await readFile(pkgPath, 'utf-8')); - pkg.pnpm ??= {}; - pkg.pnpm.overrides ??= {}; - pkg.pnpm.overrides.playwright = '^1.60.0'; - await writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`, 'utf-8'); -} - if (project === 'rollipop') { const oxfmtrc = await readFile(join(repoRoot, '.oxfmtrc.json'), 'utf-8'); await writeFile( From ab49c7648eb19d959d06b646eeadfcd999e39104 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:41:25 +0800 Subject: [PATCH 4/7] ci(ecosystem): switch vitepress to fengmk2 fork + fix-playwright-chromium branch Pointing at fengmk2/vitepress so the playwright-chromium upgrade can land on feat/vite-8-and-fix-playwright-chromium without waiting on the upstream vuejs/vitepress merge. --- ecosystem-ci/repo.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index 6a5e5a9dfb..509bfa2d5f 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -38,8 +38,8 @@ "hash": "0d3912b73d3aa1dc8f64619c82b3dacb0769e49e" }, "vitepress": { - "repository": "https://github.com/vuejs/vitepress.git", - "branch": "feat/vite-8", + "repository": "https://github.com/fengmk2/vitepress.git", + "branch": "feat/vite-8-and-fix-playwright-chromium", "hash": "9330f228861623c71f2598271d4e79c9c53f2c08", "playwright": true }, From 5554935d929664055a624c836475fa224f8ffb9b Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:43:02 +0800 Subject: [PATCH 5/7] ci(ecosystem): bump vitepress to ff11029b (playwright-chromium 1.60.0) --- ecosystem-ci/repo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index 509bfa2d5f..1e7dcdfb67 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -40,7 +40,7 @@ "vitepress": { "repository": "https://github.com/fengmk2/vitepress.git", "branch": "feat/vite-8-and-fix-playwright-chromium", - "hash": "9330f228861623c71f2598271d4e79c9c53f2c08", + "hash": "ff11029b8853b2f2dd8e32f7ed4581b28c020ccb", "playwright": true }, "tanstack-start-helloworld": { From 2429ec178f7f4af2d37fa46a0ee0236f04294375 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:45:10 +0800 Subject: [PATCH 6/7] ci(ecosystem): bump tanstack-start-helloworld to ae2cfafa (playwright ^1.60.0) --- ecosystem-ci/repo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index 1e7dcdfb67..908e6e9e4e 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -46,7 +46,7 @@ "tanstack-start-helloworld": { "repository": "https://github.com/fengmk2/tanstack-start-helloworld.git", "branch": "main", - "hash": "09bafe177bbcd1e3108c441a67601ae6380ad352", + "hash": "ae2cfafa384da35c57912b7e776414c1837487c2", "playwright": true }, "oxlint-plugin-complexity": { From a88ad5e4f7904d7c58d1a31f5b858175bfa4d640 Mon Sep 17 00:00:00 2001 From: MK Date: Sun, 24 May 2026 15:50:39 +0800 Subject: [PATCH 7/7] ci(ecosystem): bump vitest-playwright-repro to 15cb1ac9 (playwright ^1.60.0) --- ecosystem-ci/repo.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem-ci/repo.json b/ecosystem-ci/repo.json index 908e6e9e4e..38d4fb1340 100644 --- a/ecosystem-ci/repo.json +++ b/ecosystem-ci/repo.json @@ -116,7 +116,7 @@ "vitest-playwright-repro": { "repository": "https://github.com/why-reproductions-are-required/vitest-playwright-repro.git", "branch": "main", - "hash": "f7252170025c01ec482fa9ad43e09b965f46928f", + "hash": "15cb1ac9154f9d67a987a80c08963701b99efd7c", "playwright": true }, "vite-plus-vitest-type-aug": {