Skip to content

PER-8985 feat: Playwright drop-in baseline seeding — build attributes + exec orchestration#2335

Open
Shivanshu-07 wants to merge 13 commits into
masterfrom
feat/playwright-dropin-baseline
Open

PER-8985 feat: Playwright drop-in baseline seeding — build attributes + exec orchestration#2335
Shivanshu-07 wants to merge 13 commits into
masterfrom
feat/playwright-dropin-baseline

Conversation

@Shivanshu-07

Copy link
Copy Markdown
Contributor

What

CLI-side support for the @percy/playwright toHaveScreenshot drop-in's baseline flow:

  • @percy/clientcreateBuild accepts allow-listed drop-in build sources via PERCY_BUILD_SOURCE (playwright-dropin / playwright-dropin-baseline) plus dropin-baseline-candidate / dropin-baseline-setup attributes (env or explicit options). The API keys baseline auto-approval on these.
  • @percy/cli-exec — generic baseline-provider discovery: any installed SDK package can declare "@percy/cli": { "baselineProvider": "..." } (no framework code enters the CLI, same scaling model as command discovery). On an EMPTY project, percy exec uploads the committed baseline screenshots as an auto-approved build ⬆️ Bump @babel/register from 7.10.4 to 7.10.5 #1 before the user's command runs (the suite never executes for the baseline), then starts the head build. Established projects get a notice pointing at the SDK's explicit playwright:setup-baseline command — the API's no-build-persisted sentinel guarantees no stray builds. Seeding dispatches by project type: web → rendered web snapshots (root DOM + image resource, the percy upload shape); app → comparison ingest (tag + tile, no render).
  • @percy/core — the server-decided build source is kept on percy.build so SDKs can key on it through the healthcheck.

Depends on

Testing

Client + exec suites green incl. 11 new seeding specs; E2E verified against a local percy-api and on staging (empty web/app seed → head diff flow, established-project sentinel, explicit setup command).

🤖 Generated with Claude Code

Shivanshu-07 and others added 3 commits July 13, 2026 18:31
…orchestration

- @percy/client createBuild: allow-listed drop-in build sources via
  PERCY_BUILD_SOURCE, plus dropin-baseline-candidate / dropin-baseline-setup
  attributes (env or explicit options) the API keys baseline auto-approval on.
- @percy/cli-exec: generic baseline-provider discovery (any installed SDK
  package can declare "@percy/cli".baselineProvider). On an empty project,
  percy exec uploads the committed baseline screenshots as an auto-approved
  build #1 before the user's command runs; established projects get a notice
  pointing at the SDK's explicit setup command. Seeding helpers exported for
  SDK-contributed commands.
- @percy/core: expose the server-decided build source on percy.build so SDKs
  can key on it through the healthcheck.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Verified E2E against a local percy-api: a web project's snapshot create
requires a root resource, so raw-PNG comparison tiles are rejected. Seed
uploads now use client.sendSnapshot with the same generated root-DOM +
image-resource shape 'percy upload' uses for web projects — Percy renders
the baseline in the project's own browsers, so it pairs with the head
run's DOM snapshots by (name, browser, width).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Seeding dispatches by project type: web projects seed rendered snapshots
(root DOM + image resource); app projects seed raw comparison uploads
(tag + tile), exactly how App Percy ingests screenshots. Exec seeding now
engages for app tokens too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Shivanshu-07 Shivanshu-07 requested a review from a team as a code owner July 13, 2026 13:03
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Comment thread packages/cli-exec/src/baseline.js Fixed
Shivanshu-07 and others added 10 commits July 14, 2026 10:28
The same env var the SDK override honors — one switch turns off both the
toHaveScreenshot override and exec's baseline provider discovery.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- core: only set percy.build.source when the API returned one — an own
  'source: undefined' key survives in-process but drops out of JSON
  responses, breaking the API-server shape specs.
- cli-exec: cover the exec seeding block (real provider-package fixture)
  and the remaining baseline.js branches for the 100% coverage gate.
- cli-exec: sanitize dirent names / paths at the fs boundary in the
  provider walk (also clears semgrep's path-join-resolve-traversal
  findings on the diff).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Direct sanitizer unit tests, walk fixtures for every discovery skip branch
(empty dir, ESM named-export provider without discoverBaselines), and the
non-web/app token exec branch; istanbul-ignore the two defense-in-depth
dirent guards unreachable via readdir.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The seed build keeps rendering and only auto-approves once it reaches
finished; head snapshots select their baseline as they process, so
starting the head immediately raced the approval and a lost race made
the whole first run report as new instead of diffing. Poll the seed
build up to the pipeline latency budget (10m) with a 30s heartbeat,
degrade to a warning instead of blocking on timeout or status errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pin-baseline

# Conflicts:
#	packages/client/src/client.js
#	packages/client/test/client.test.js
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Master-inherited coverage gap from the metadata-SSRF change — the catch
path for a colon-containing host that fails URL parsing was never
exercised, holding @percy/core under the 100% gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every caller (matchMetadataHost) null-guards before calling, so the
branch cannot be exercised by tests; it held @percy/core under the
100% gate on master too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants