diff --git a/.changeset/add-open-command.md b/.changeset/add-open-command.md new file mode 100644 index 0000000..75992af --- /dev/null +++ b/.changeset/add-open-command.md @@ -0,0 +1,5 @@ +--- +"@bunny.net/cli": minor +--- + +Add `bunny open` command to open the bunny.net dashboard in the default browser. Use `--print` to print the URL instead. diff --git a/AGENTS.md b/AGENTS.md index 275278a..d0a6025 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -235,6 +235,7 @@ bunny-cli/ │ │ │ ├── add.ts # Add registry with credentials │ │ │ └── remove.ts # Remove registry │ │ ├── docs.ts # Open bunny.net documentation in browser (top-level: bunny docs) +│ │ ├── open.ts # Open bunny.net dashboard in browser (top-level: bunny open) │ │ └── scripts/ │ │ ├── index.ts # defineNamespace("scripts", ...) — registers all script commands │ │ ├── constants.ts # SCRIPT_MANIFEST, SCRIPT_TYPE_LABELS @@ -773,6 +774,7 @@ bunny │ ├── list (alias: ls) List all Edge Scripts │ └── show [id] Show Edge Script details (uses linked script if omitted) ├── docs Open bunny.net documentation in browser +├── open [--print] Open bunny.net dashboard in browser (or print URL) ├── --profile, -p Profile to use (default: "default") ├── --verbose, -v Enable verbose output ├── --output, -o Output format (default: "text") diff --git a/packages/cli/README.md b/packages/cli/README.md index db39e65..391be68 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -67,6 +67,20 @@ bunny whoami --output json bunny whoami --profile staging ``` +### `bunny open` + +Open the bunny.net dashboard in your default browser. Uses `BUNNYNET_DASHBOARD_URL` if set, otherwise `https://dash.bunny.net`. + +```bash +bunny open + +# Print the URL instead of opening it +bunny open --print + +# Print as JSON +bunny open --print --output json +``` + ### `bunny config` Manage CLI configuration and profiles. diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 5905874..16c6cff 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -9,6 +9,7 @@ import { authLogoutCommand } from "./commands/auth/logout.ts"; import { configNamespace } from "./commands/config/index.ts"; import { dbNamespace } from "./commands/db/index.ts"; import { docsCommand } from "./commands/docs.ts"; +import { openCommand } from "./commands/open.ts"; import { registriesNamespace } from "./commands/registries/index.ts"; import { scriptsNamespace } from "./commands/scripts/index.ts"; import { whoamiCommand } from "./commands/whoami.ts"; @@ -24,6 +25,7 @@ const commands: CommandModule[] = [ scriptsNamespace, configNamespace, docsCommand, + openCommand, apiCommand, ]; diff --git a/packages/cli/src/commands/open.ts b/packages/cli/src/commands/open.ts new file mode 100644 index 0000000..c994472 --- /dev/null +++ b/packages/cli/src/commands/open.ts @@ -0,0 +1,48 @@ +import { defineCommand } from "../core/define-command.ts"; +import { logger } from "../core/logger.ts"; +import { openBrowser } from "../core/ui.ts"; + +const DASHBOARD_URL = + process.env.BUNNYNET_DASHBOARD_URL ?? "https://dash.bunny.net"; + +const COMMAND = "open"; +const DESCRIPTION = "Open the bunny.net dashboard in the browser."; + +/** + * Open the bunny.net dashboard in the default browser. + * + * @example + * ```bash + * bunny open + * bunny open --print + * ``` + */ +export const openCommand = defineCommand<{ print: boolean }>({ + command: COMMAND, + describe: DESCRIPTION, + examples: [ + ["$0 open", "Open the bunny.net dashboard"], + ["$0 open --print", "Print the dashboard URL instead of opening it"], + ], + + builder: (yargs) => + yargs.option("print", { + type: "boolean", + default: false, + describe: "Print the URL instead of opening it in the browser", + }), + + handler: async ({ print, output }) => { + if (print) { + if (output === "json") { + console.log(JSON.stringify({ url: DASHBOARD_URL })); + } else { + console.log(DASHBOARD_URL); + } + return; + } + + logger.info(`Opening ${DASHBOARD_URL}`); + openBrowser(DASHBOARD_URL); + }, +});