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..e4b76b06d 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); + return { cleared: true }; + } + // Daemon control case "stop": { process.nextTick(() => { @@ -2756,6 +2777,74 @@ 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 !== undefined || + cmdOpts.domain !== undefined || + cmdOpts.path !== undefined + ? 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();