{{ message }}
Repository navigation
Conversation
FRSgit
force-pushed
the
feat/playwright
branch
from
September 26, 2026 14:40
fef4c97 to
ad7d6ce
Compare
FRSgit
force-pushed
the
feat/github-app
branch
from
September 26, 2026 18:24
96c8611 to
b941139
Compare
FRSgit
force-pushed
the
feat/playwright
branch
from
September 26, 2026 18:27
1117429 to
427c859
Compare
FRSgit
changed the base branch from
feat/github-app
to
feat/manifest-emission
September 26, 2026 18:27
FRSgit
force-pushed
the
feat/manifest-emission
branch
from
September 30, 2026 14:09
b2be329 to
b49f3fa
Compare
FRSgit
force-pushed
the
feat/playwright
branch
from
September 30, 2026 14:09
427c859 to
0cbf4be
Compare
…wser @frsource/playwright-visual-regression-diff brings the matchImage flow to Playwright as a fixture: same pixelmatch comparison, padding and PNG marker as the Cypress plugin, same baseline file layout and path tokens, and the same run manifest (one file per worker, discoverable with the existing *cp-visual-regression-diff-manifest*.json glob). remoteBrowser() runs the browser inside the official Playwright image while the runner, app and test code stay on the host, which is the Playwright adapter's first render mode in RENDERER-DESIGN.md; the manifest's renderer block then reports backend docker with the image digest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ression-manifest
The package mirrored the plugin's manifest writer, types and CI detection
from before the manifest package existed. Now that the standard lives in
@frsource/visual-regression-manifest, the fixture maps a worker's config
onto its ManifestWriter (src/manifest.utils.ts) and drops manifest.ts,
manifest.types.ts and ci.utils.ts together with their tests.
The file is named with getManifestFileName('playwright.w<n>'), i.e.
<outputDir>/visual-regression-manifest.playwright.w<n>.json, so the
GitHub App's default MANIFEST_FILE_GLOB picks it up unchanged. The
renderer block keeps the docker/native identity from remoteBrowser().
The unit tests and the smoke spec validate the written file against the
package's schema.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fa3bWmHWmzRkXcueAfwotL
Register the package in release-please's prerelease mode the way the manifest package is: the first release PR cuts 0.1.0-beta.1, which scripts/publish.mjs sends to the `next` dist-tag. Ship the LICENSE file and note in CONTRIBUTING that this package, like the plugin, has to be released after @frsource/visual-regression-manifest. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fa3bWmHWmzRkXcueAfwotL
…orker keeps it Playwright restarts a worker process after a test failure. The new process keeps the slot's `parallelIndex` but gets a fresh `workerIndex`, and the manifest file was named after `parallelIndex`: `ManifestWriter` rewrites the whole file from the process's own state, so the first `matchImage` in the restarted worker replaced `w<parallelIndex>.json` and every entry the earlier process had recorded was gone, the failed one included. Reproduced with three tests in one worker: after the second failed, the file held only the third. The file is `visual-regression-manifest.playwright.w<workerIndex>.json` now, unique per process for the whole run; consumers merge the files like manifests of several machines, which the new unit test does through `mergeManifests` (no warnings, the retry's entry wins). A configured `visualRegressionManifestPath` gets the same `.w<workerIndex>` label before its extension, since one file for all workers had the same problem. The `runner` block records both `parallelIndex` and `workerIndex`. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fa3bWmHWmzRkXcueAfwotL
The Playwright package takes its Tozsame name before its first publish (0.1.0-beta.1 on next): package name, release-please component, README, the internal remote-browser environment variables (TOZSAME_PLAYWRIGHT_*) and the manifest dependency, now @tozsame/manifest. The README also says which comparison default differs from the 4.x Cypress plugin (includeAA) until 5.0 aligns them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fa3bWmHWmzRkXcueAfwotL
The package publishes as @pixsame/playwright, depends on @pixsame/manifest, reads PIXSAME_PLAYWRIGHT_REMOTE* and points its homepage at https://pixsame.com. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151fsftRgaK9YzhSySZjakh
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0151fsftRgaK9YzhSySZjakh
FRSgit
force-pushed
the
feat/manifest-emission
branch
from
September 30, 2026 18:46
b49f3fa to
5bf92c3
Compare
FRSgit
force-pushed
the
feat/playwright
branch
from
September 30, 2026 18:46
0cbf4be to
b4780a7
Compare
…t/playwright Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

This is the Playwright adapter from
RENDERER-DESIGN.md(section 4 and phase 3 of section 16), as a first cut. It lives inpackages/playwright-visual-regression-diffand is meant to be published as@frsource/playwright-visual-regression-diff.What's in it:
matchImagefixture (import { test, expect } from '@frsource/playwright-visual-regression-diff', orbase.extend(visualRegressionFixtures)if you extendtestyourself). Same options as the Cypress command where they make sense:imagesPathwith{spec_path}/{platform}/{os}/{browser},maxDiffThreshold,diffConfig,createMissingImages,updateImagesincl.'failures-only',title,matchAgainstPath,screenshotConfig,deterministicRendering(animations off, caret hidden). Globals go throughuse: { visualRegression: {...} }.includeAA: false, same_#n.png/.actual.png/.diff.pnglayout, sameFRSOURCE_CPVRD_Vmarker, so baselines are interchangeable between the two tools. On failure the three images are attached to the Playwright report.outputDir(cp-visual-regression-diff-manifest.playwright.w<n>.json), so the GitHub App's default glob already picks them up and merges them like manifests from several machines. Same shape as feat: run manifest for CI consumers, shipped as the @frsource/visual-regression-manifest standard #414 incl.rendererandhashes; onlyrunneris Playwright-specific.remoteBrowser()(@frsource/playwright-visual-regression-diff/remote): starts or reuses a container frommcr.microsoft.com/playwright:v<your version>-noblerunningplaywright run-server, and hands youconnectOptionsplusglobalSetup/globalTeardownfor the config. The runner, the app and the test code stay on the host, only the browser is in Docker, which is why this came before DOM snapshots for Playwright.exposeNetwork: '<loopback>'is on by default, solocalhostdev servers just work withouthost.docker.internal. Containers are labelled (frsource.visual-renderer=1, version, port) and reused; Docker is detected but never launched; every failure has a code (DAEMON_UNREACHABLE,CONTAINER_START_FAILED,CONTAINER_UNHEALTHY,PLAYWRIGHT_VERSION_UNKNOWN) with a one-line fix. When the remote browser is in use the manifest saysrenderer: { backend: 'docker', rendererVersion: <playwright version>, imageDigest: <sha256 of the image> }.Things I checked:
docker(start, reuse, unreachable daemon, failed start, exited container, timeout).pnpm test:smoke(real Chromium,page.setContent): first run creates baselines, second passes, a colour change fails with.actual.png+.diff.pngkept and attached, manifest written. Ran on this Mac.pnpm test:smoke:remoteagainst Docker Desktop: fresh start pulls nothing (image pre-pulled), container comes up in ~3 s, all 4 pass; the second run reuses the container. Same page rendered by the same Chromium 153 build differs by 0.7–1.0% of pixels between macOS and the Linux container (fonts), and by 0% between two container runs, which is the whole point.run-serverlistens, so readiness is an HTTP probe (any response = up), not a TCP connect.Deliberately not in this PR:
compare, the path tokens, the manifest types andci.utilsare mirrored from the plugin (marked as such in the files). Extracting@frsource/visual-regression-coreis the obvious next step once the API settles; I didn't want to refactor the Cypress plugin in the same PR.toMatchImage()matcher, no DOM-snapshot capture, no CLI (doctor/pull). The renderer client package from section 11 of the design is a separate piece of work;remoteBrowser()is intentionally a thindockerCLI wrapper that fits in one file.test-integration-coveragejob viapnpm -r.versionis0.0.0and it's registered in release-please, so the firstfeatonmaincuts0.1.0.Retargeted onto the 4.x stack
The branch was rebased from
feat/manifest(the v5 line) ontofeat/github-app(#423), the top of the 4.x stack (#425 → #426 → #427 → #428 → #429 → #430 → #423), so the package ships independently of the plugin major. Two follow-up commits update what the description above says about the manifest and the release:@frsource/visual-regression-manifest(feat(manifest): publish @pixsame/manifest 1.0.0-beta.1 on beta #427). The mirroredmanifest.ts/manifest.types.ts/ci.utils.tsare gone;src/manifest.utils.tsmaps a worker's config onto the package'sManifestWriter(runner: { name: 'playwright', ... }, hostplatform,civiadetectCi, per-entryrendererfromremoteBrowser()as before, entries with the same statuses and fields the 4.3 plugin records). The file is now named withgetManifestFileName('playwright.w<n>'), i.e.<outputDir>/visual-regression-manifest.playwright.w<n>.json, which the GitHub App's defaultMANIFEST_FILE_GLOBmatches andparseManifestJsonaccepts unchanged. The unit tests and the smoke spec validate the written file against the package's JSON Schema (validateManifestreturns no issues on a real Chromium run). The sharp comparison and the path tokens stay in this package; a shared core is still a later step.0.1.0-beta.1on thenextdist-tag through release-please's prerelease mode, registered exactly like the manifest package (versioning: prerelease,prerelease: true,release-as: 0.1.0-beta.1,0.0.0placeholder in.release-please-manifest.json, whichscripts/publish.mjsskips). Release order per CONTRIBUTING: the manifest package's release PR merges and publishes first, this package's after it, sinceworkspace:^is rewritten to the manifest version in the repo at publish time. README says the package is 0.x and options may still change.Verified on the retargeted branch: Playwright package build + 31 unit tests, smoke spec 4/4 twice (create, then compare), plugin 176 tests, GitHub App 86 tests, manifest package 60 tests, root eslint
--max-warnings 0, prettier.🤖 Generated with Claude Code
https://claude.ai/code/session_01Fa3bWmHWmzRkXcueAfwotL
Review follow-ups (2026-09-26)
feat/manifest-emission(feat: write a run manifest for CI consumers (4.x) #429) instead of the App PR, so the two merge independently.@pixsame/playwrightbefore the first publish; depends on@pixsame/manifest; the remote-browser env vars arePIXSAME_PLAYWRIGHT_REMOTE*. The README now says that the 4.x Cypress plugin compares withincludeAA: truewhile this package usesfalse, until 5.0 aligns them.