Parity with the VS Code extension
This page is generated at build time from docs/parity.md in the repository (commit ffe2b67, built 2026-10-29). Edit the source file, not this page.
Reference: https://github.com/microsoft/playwright-vscode. One row per upstream capability
named in the constitution. Status values: full, partial, blocked, not-started,
zed-only. Primitive values: tasks, dap, lsp, settings, playwright-ui, none.
| Capability | Status | Primitive | Note |
|---|---|---|---|
| Install Playwright | not-started | none | |
| Playwright project detection and selection | full | lsp | Detects every playwright.config.* with a resolvable @playwright/test (v1.38 gate, nearest config wins, monorepos). Test discovery waits for Zed’s worktree trust on Zed 0.218+, otherwise for the per-workspace consent question (see the last row). Project (browser) picker as code actions, one [x]/[ ] entry per project plus “Select all projects” (feature 005): first project selected by default as upstream, single-project configs unchanged, runs pass --project per selected project, lenses follow the selection, the choice is remembered per config in the user’s state directory (upstream: VS Code workspace state). zed-only addition: a folder default via lsp.playwright.settings.projects, forwarded by the shell’s language_server_workspace_configuration. Zed limitation: the code action menu is cached per cursor position (crates/editor/src/code_actions.rs) and is not refetched after a command-only code action runs, so the check marks at an unchanged cursor lag one toggle behind; the server confirms every change in a notification instead (no API workaround, Zed issue to be filed by the owner). Files open before the extension starts are served without a reopen (Zed sends didOpen for every open buffer when a server starts, verified on Zed 1.24.2), except after an update or reinstall in the same session, when Zed keeps the extension’s server stopped until editor: restart language server (Zed limitation, crates/project/src/lsp_store.rs stopped_language_servers, tracked as zed-industries/zed#60405). |
| Run tests with a single click | full | lsp | Run test, describe (file:line selects the whole group, verified), file and re-run via code actions and code lenses, executed by the workspace Playwright CLI. Results: progress, pass/fail notification, diagnostics at failing lines, full output in the language server log. Feature 006 closes the three former gaps with LSP surfaces Zed renders: the executing step and the per-step durations are inlay hints (⌛ waiting…, <n>ms, <n>ms (ran <k>×); cleared on edit or next run; fed by a step reporter the server attaches to the run through Playwright’s reporter API, as upstream does; inlay_hints.enabled must be on in Zed), and the run’s full output is written to a log file in the user’s state directory and opened as an editor buffer through window/showDocument from Playwright: Show last run output (upstream: Test Results panel). Differences from upstream, recorded: a trailing text label instead of a highlighted line, because Zed has no decoration API for extensions; a buffer instead of a panel. A real terminal remains the zed-only tasks recipe row below (extension LSP adapters cannot schedule Zed tasks; crates/language_extension/src/extension_lsp_adapter.rs has no client_command). Files open before the extension starts are served without a reopen (Zed sends didOpen for every open buffer when a server starts, verified on Zed 1.24.2), except after an update or reinstall in the same session, when Zed keeps the extension’s server stopped until editor: restart language server (Zed limitation, crates/project/src/lsp_store.rs stopped_language_servers, tracked as zed-industries/zed#60405). |
| Watch mode | not-started | none | |
| Show browser | full | lsp, playwright-ui | Feature 009. Same mechanism as upstream: one playwright run-server process per configuration in Playwright’s extension mode (PW_EXTENSION_MODE=1, the workspace’s own Playwright, started in the configuration’s directory by the first run that needs it, kept across runs), every run connected to it through PW_TEST_CONNECT_WS_ENDPOINT with PW_TEST_REUSE_CONTEXT=1, --headed --workers 1 (“one worker”, as upstream’s sublabel says) and --trace off; turning the option on turns “Show trace viewer” off and closes its window, as upstream’s settings model does, and (owner decision 2026-10-29, beyond upstream) turning “Show trace viewer” on turns this option off and closes the kept browsers; a run while both are on (only possible through a settings default) records no trace and says so once per combination (a Zed-side message, upstream is silent). The choice is remembered per user (show-browser.json in the state directory) with a Zed settings default lsp.playwright.settings.reuseBrowser under upstream’s setting name; a remembered choice wins. Differences from upstream, recorded: the toggle is a code action (Playwright: [x] Show browser) because Zed has no settings view; video is not forced off because the playwright test command line has no video switch (a project with video on keeps recording and Playwright then skips context reuse on its own); the server is not stopped when the browser’s last page closes (upstream tracks the page count over its debug-controller protocol), a closed browser is simply replaced at the next run; the server starts with the first run rather than before it (the same moment in practice). Stop is SIGINT with a SIGKILL fallback (verified on 1.64.0: stdin end does nothing and SIGTERM leaves the Node process alive); an unexpected exit is reported once and the next run starts a new server. |
| Close all browsers | full | lsp | Feature 009. Code action Playwright: Close all browsers (upstream: the settings view action), offered while “Show browser” is on or a kept browser is running; stops the workspace’s browser servers without changing the option, refused with a warning while a run is in progress (as upstream), answers “no browsers to close” when nothing runs. |
| Show trace viewer | full | lsp, playwright-ui | Feature 008. Same mechanism as upstream: while the option is on every run passes --trace on, one playwright show-trace --stdin process per configuration (the workspace’s own Playwright, started in the workspace root on the first trace, kept across runs) is fed trace paths over stdin, a single-test run is followed live (predicted .playwright-artifacts-<worker>/traces/<id>.json path on test start, the trace attachment on test end, both from the step reporter), and turning the option off closes the viewer. The choice is remembered per user (trace-viewer.json in the state directory) with a Zed settings default lsp.playwright.settings.showTrace under upstream’s setting name; a remembered choice wins. Differences from upstream, recorded: the toggle is a code action (Playwright: [x] Show trace viewer) because Zed has no settings view; the trace of one test after a multi-test run is chosen with the cursor (Playwright: Show trace, from the JSON report’s attachments) because Zed has no Test Explorer tree; the viewer starts with the first trace to show rather than before the run (spec decision). Playwright gotchas handled: the viewer dies on a path that does not exist and reads each stdin chunk as one path, so .zip paths are stat-checked and writes are spaced (first at once, later ones 3 s after start and 250 ms apart, a newer path replacing a waiting one). The “Show browser” interaction is built in feature 009: turning “Show browser” on turns this option off and closes the viewer, and a run while the browser is shown records no trace (--trace off), as upstream. |
| Pick locator | not-started | none | |
| Breakpoint debugging with locator highlighting | not-started | none | |
| Tune locators while paused | not-started | none | |
| Record new test | not-started | none | |
| Record at cursor | not-started | none | |
| Terminal output via tasks recipe | zed-only | tasks | User-level tasks.json template tagged js-test binds Zed’s bundled TypeScript runnables to playwright test $ZED_FILE:$ZED_ROW; extensions cannot add tasks to bundled languages. The in-editor alternative is Playwright: Show last run output from the “Run tests with a single click” row (feature 006). |
| Discovery consent (Workspace Trust substitute) | partial | lsp | VS Code gates extension code execution with Workspace Trust. Zed 0.218+ has the equivalent, worktree trust (Restricted Mode): it starts language servers only in folders the user trusted and remembers that across restarts, so the server discovers at once in every reported workspace folder (feature 003). For older Zed, other clients and folders that reach the server only as the rootUri fallback, the server asks once per workspace per session before running playwright test --list (which executes the workspace’s config and test files); until “Run discovery” is chosen, or “Playwright: Enable test discovery” is used, nothing runs and nothing is offered. |