Browser extension: detect and subscribe to standard.site publications on ATProto

refactor(scripts): share the CDP plumbing between the release checks master

rc-load carried its own copy of launching Chrome, loading the extension over Extensions.loadUnpacked and attaching to the service worker, including the non-obvious wait for the extension APIs to be bound. A second consumer is about to need the same thing. Moved to scripts/cdp.mjs, with one behaviour added: withChrome now waits for Chrome to actually exit before returning, because a caller that deletes the profile directory the instant kill() returns races Chrome's own shutdown writes and fails with ENOTEMPTY. capture-status-docs.mjs still has its own copy. It is the oldest and most intricate of the three, and folding it in is a change of its own.


+182 -120
2 changed files