From 1c0c1637490be0ea8bfc6e1cb66348dba75304f9 Mon Sep 17 00:00:00 2001 From: Derek Meegan Date: Sun, 29 Mar 2026 14:06:19 -0700 Subject: [PATCH 1/3] Add `browse cookies` commands for cookie management Adds cookies get/set/clear subcommands using Understudy's existing context.cookies(), addCookies(), and clearCookies() methods. Usage: browse cookies get # all cookies browse cookies get https://example.com # filtered by URL browse cookies set '[{"name":"a","value":"b","url":"https://..."}]' browse cookies clear # clear all browse cookies clear --domain example.com # filtered clear Co-Authored-By: Claude Opus 4.6 (1M context) --- .changeset/add-cookies-command.md | 5 ++ packages/cli/src/index.ts | 85 +++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 .changeset/add-cookies-command.md diff --git a/.changeset/add-cookies-command.md b/.changeset/add-cookies-command.md new file mode 100644 index 000000000..a749cd040 --- /dev/null +++ b/.changeset/add-cookies-command.md @@ -0,0 +1,5 @@ +--- +"@browserbasehq/browse-cli": minor +--- + +Add `browse cookies` subcommands for cookie management: `cookies get [urls...]` to inspect cookies (with optional URL filtering), `cookies set ` to add cookies, and `cookies clear` to remove cookies (with optional `--name`, `--domain`, `--path` filters). diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index be6081fb0..517d01908 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1582,6 +1582,27 @@ async function executeCommand( } } + // Cookies + case "cookies_get": { + const [urls] = args as [string[]?]; + const cookies = await context.cookies(urls?.length ? urls : undefined); + return { cookies }; + } + case "cookies_set": { + const [cookieParams] = args as [unknown[]]; + await context.addCookies( + cookieParams as Parameters[0], + ); + return { added: cookieParams.length }; + } + case "cookies_clear": { + const [opts] = args as [ + { name?: string; domain?: string; path?: string }?, + ]; + await context.clearCookies(opts ?? undefined); + return { cleared: true }; + } + // Daemon control case "stop": { process.nextTick(() => { @@ -2756,6 +2777,70 @@ networkCmd } }); +// ==================== COOKIES ==================== + +const cookiesCmd = program + .command("cookies") + .description("Cookie management commands"); + +cookiesCmd + .command("get [urls...]") + .description("Get cookies, optionally filtered by URLs") + .action(async (urls: string[]) => { + const opts = program.opts(); + try { + const result = await runCommand("cookies_get", [ + urls?.length ? urls : undefined, + ]); + output(result, opts.json ?? false); + } catch (e) { + console.error("Error:", e instanceof Error ? e.message : e); + process.exit(1); + } + }); + +cookiesCmd + .command("set ") + .description( + 'Add cookies from JSON array (e.g. \'[{"name":"a","value":"b","url":"https://example.com"}]\')', + ) + .action(async (json: string) => { + const opts = program.opts(); + try { + const cookies = JSON.parse(json); + if (!Array.isArray(cookies)) { + console.error("Error: cookies must be a JSON array"); + process.exit(1); + } + const result = await runCommand("cookies_set", [cookies]); + output(result, opts.json ?? false); + } catch (e) { + console.error("Error:", e instanceof Error ? e.message : e); + process.exit(1); + } + }); + +cookiesCmd + .command("clear") + .description("Clear cookies (all or filtered by name/domain/path)") + .option("--name ", "Filter by cookie name") + .option("--domain ", "Filter by domain") + .option("--path ", "Filter by path") + .action( + async (cmdOpts: { name?: string; domain?: string; path?: string }) => { + const opts = program.opts(); + try { + const filter = + cmdOpts.name || cmdOpts.domain || cmdOpts.path ? cmdOpts : undefined; + const result = await runCommand("cookies_clear", [filter]); + output(result, opts.json ?? false); + } catch (e) { + console.error("Error:", e instanceof Error ? e.message : e); + process.exit(1); + } + }, + ); + // ==================== RUN ==================== program.parse(); From e94f38f3520018f87448b292ff43bf7d1ef8368c Mon Sep 17 00:00:00 2001 From: Derek Meegan Date: Sun, 29 Mar 2026 14:30:41 -0700 Subject: [PATCH 2/3] fix: use !== undefined for cookie filter presence check Prevents empty-string option values from being treated as absent, which would bypass the filter and clear all cookies unexpectedly. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/src/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 517d01908..af46d1013 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -2831,7 +2831,11 @@ cookiesCmd const opts = program.opts(); try { const filter = - cmdOpts.name || cmdOpts.domain || cmdOpts.path ? cmdOpts : undefined; + cmdOpts.name !== undefined || + cmdOpts.domain !== undefined || + cmdOpts.path !== undefined + ? cmdOpts + : undefined; const result = await runCommand("cookies_clear", [filter]); output(result, opts.json ?? false); } catch (e) { From 1ac94ce46a5a28e1fdef83f54746f516cd228561 Mon Sep 17 00:00:00 2001 From: Derek Meegan Date: Sun, 29 Mar 2026 16:10:13 -0700 Subject: [PATCH 3/3] fix: remove no-op nullish coalescing in cookies clear Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cli/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index af46d1013..e4b76b06d 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1599,7 +1599,7 @@ async function executeCommand( const [opts] = args as [ { name?: string; domain?: string; path?: string }?, ]; - await context.clearCookies(opts ?? undefined); + await context.clearCookies(opts); return { cleared: true }; }