feat!: harden raw browser control and packaging
Testing / remote-protocol-compat (0.9.3) (push) Successful in 40s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 38s
Testing / test (push) Failing after 1m3s
Package Extension / package-extension (push) Successful in 29s
Build & Publish Package / publish (push) Successful in 33s

- Add safe-by-default policy gates for raw command surfaces: command, script, and serve-http /command.

- Require explicit opt-ins for page reads, browser control, and high-risk commands such as dom.eval, storage.*, and screenshots.

- Remove all cookies support from CLI, SDK, extension commands, permissions, constants, docs, and tests.

- Add diagnostic, events, watch, workspace, remote, raw command, script, HTTP gateway, tree-view, session import/export, and extension info/capability commands.

- Add Chrome Web Store packaging that strips manifest.key while keeping local packages with a stable native-messaging extension ID.

- Bump browser-cli and extension version to 0.14.1 and cover the new behavior with pytest and extension packaging tests.

BREAKING CHANGE: cookies commands and the b.cookies SDK namespace have been removed; generic raw command execution now blocks non-safe commands unless explicitly allowed.
This commit is contained in:
2026-06-14 14:33:15 +02:00
parent 3e3b8d529c
commit 5cec57e06d
43 changed files with 1184 additions and 375 deletions
+1 -8
View File
@@ -76,7 +76,7 @@ class TestBrowserCLIInit:
def test_namespaces_present_and_bound(self):
b = BrowserCLI()
for name in ("nav", "tabs", "groups", "windows", "dom", "extract",
"page", "storage", "cookies", "session", "perf", "extension", "decorators"):
"page", "storage", "session", "perf", "extension", "decorators"):
ns = getattr(b, name)
assert ns is not None
assert ns._c is b
@@ -792,13 +792,6 @@ class TestPageStorageCookies:
"storage.set", {"key": "k", "value": "v", "type": "session", "tabId": None}, profile=None, remote=None, key=None
)
def test_cookies_list(self, b, mock_send):
mock_send.return_value = [{"name": "c"}]
assert b.cookies.list(domain="example.com") == [{"name": "c"}]
mock_send.assert_called_once_with(
"cookies.list", {"url": None, "domain": "example.com", "name": None}, profile=None, remote=None, key=None
)
class TestPerf:
def test_perf_status(self, b, mock_send):
mock_send.return_value = {"profile": "auto"}