From 7fb3c69e94a22cb8ef18a8e608a2295cbc74944e Mon Sep 17 00:00:00 2001 From: Justine Mach Date: Mon, 15 Jun 2026 17:31:23 -0700 Subject: [PATCH] Add multi-marketplace plugin catalog for browse CLI Mirror the stripe/link-cli plugin layout so browse can be distributed through Claude Code, Cursor, Codex/OpenAI, generic agents, and (best-effort) Grok marketplaces. Skill-only plugin (no MCP server); shared skill + assets symlinked into plugins/browse. Adds sync-plugin-version script and pins all manifests to the CLI package version. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/cli/.agents/plugins/marketplace.json | 20 +++++ packages/cli/.claude-plugin/marketplace.json | 42 +++++++++++ packages/cli/.codex-plugin/plugin.json | 38 ++++++++++ packages/cli/.cursor-plugin/marketplace.json | 17 +++++ packages/cli/.grok-plugin/plugin.json | 30 ++++++++ packages/cli/assets/browse.svg | 5 ++ packages/cli/package.json | 1 + packages/cli/plugins/README.md | 75 +++++++++++++++++++ .../plugins/browse/.claude-plugin/plugin.json | 9 +++ .../plugins/browse/.codex-plugin/plugin.json | 39 ++++++++++ .../plugins/browse/.cursor-plugin/plugin.json | 16 ++++ .../plugins/browse/.grok-plugin/plugin.json | 31 ++++++++ packages/cli/plugins/browse/assets | 1 + packages/cli/plugins/browse/skills | 1 + packages/cli/scripts/sync-plugin-version.js | 49 ++++++++++++ packages/cli/skills/browse/SKILL.md | 1 + 16 files changed, 375 insertions(+) create mode 100644 packages/cli/.agents/plugins/marketplace.json create mode 100644 packages/cli/.claude-plugin/marketplace.json create mode 100644 packages/cli/.codex-plugin/plugin.json create mode 100644 packages/cli/.cursor-plugin/marketplace.json create mode 100644 packages/cli/.grok-plugin/plugin.json create mode 100644 packages/cli/assets/browse.svg create mode 100644 packages/cli/plugins/README.md create mode 100644 packages/cli/plugins/browse/.claude-plugin/plugin.json create mode 100644 packages/cli/plugins/browse/.codex-plugin/plugin.json create mode 100644 packages/cli/plugins/browse/.cursor-plugin/plugin.json create mode 100644 packages/cli/plugins/browse/.grok-plugin/plugin.json create mode 120000 packages/cli/plugins/browse/assets create mode 120000 packages/cli/plugins/browse/skills create mode 100644 packages/cli/scripts/sync-plugin-version.js diff --git a/packages/cli/.agents/plugins/marketplace.json b/packages/cli/.agents/plugins/marketplace.json new file mode 100644 index 000000000..6deb1033d --- /dev/null +++ b/packages/cli/.agents/plugins/marketplace.json @@ -0,0 +1,20 @@ +{ + "name": "browse-plugins", + "interface": { + "displayName": "Browse" + }, + "plugins": [ + { + "name": "browse", + "source": { + "source": "local", + "path": "./plugins/browse" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "OPTIONAL" + }, + "category": "Automation" + } + ] +} diff --git a/packages/cli/.claude-plugin/marketplace.json b/packages/cli/.claude-plugin/marketplace.json new file mode 100644 index 000000000..975e04ff0 --- /dev/null +++ b/packages/cli/.claude-plugin/marketplace.json @@ -0,0 +1,42 @@ +{ + "name": "browse-cli", + "owner": { + "name": "Browserbase", + "email": "support@browserbase.com" + }, + "metadata": { + "description": "Unified Browserbase CLI for browser automation, cloud APIs, Functions, and Browse.sh skill discovery." + }, + "plugins": [ + { + "name": "browse", + "source": "./plugins/browse", + "description": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "author": { + "name": "Browserbase" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "category": "automation", + "tags": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ], + "keywords": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ] + } + ] +} diff --git a/packages/cli/.codex-plugin/plugin.json b/packages/cli/.codex-plugin/plugin.json new file mode 100644 index 000000000..8e3280289 --- /dev/null +++ b/packages/cli/.codex-plugin/plugin.json @@ -0,0 +1,38 @@ +{ + "name": "browse", + "description": "Unified Browserbase CLI for browser automation and cloud APIs", + "author": { + "name": "Browserbase", + "url": "https://browserbase.com" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "keywords": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ], + "skills": "./skills/", + "interface": { + "displayName": "Browse", + "shortDescription": "Browser automation for agents", + "longDescription": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "developerName": "Browserbase", + "category": "Automation", + "capabilities": [], + "websiteURL": "https://browserbase.com", + "privacyPolicyURL": "https://www.browserbase.com/privacy", + "termsOfServiceURL": "https://www.browserbase.com/terms", + "defaultPrompt": [ + "Use browse to open a page and take a snapshot" + ], + "screenshots": [], + "composerIcon": "./assets/browse.svg", + "logo": "./assets/browse.svg" + } +} diff --git a/packages/cli/.cursor-plugin/marketplace.json b/packages/cli/.cursor-plugin/marketplace.json new file mode 100644 index 000000000..464bd7c3b --- /dev/null +++ b/packages/cli/.cursor-plugin/marketplace.json @@ -0,0 +1,17 @@ +{ + "name": "browse-cli", + "owner": { + "name": "Browserbase", + "email": "support@browserbase.com" + }, + "metadata": { + "description": "Browserbase Browse CLI — lets agents drive local or hosted browsers, inspect and interact with pages, and call Browserbase cloud APIs." + }, + "plugins": [ + { + "name": "browse", + "source": "plugins/browse", + "description": "Drive a local or Browserbase-hosted browser, inspect pages with accessibility snapshots and screenshots, and manage Browserbase cloud resources, Functions, and templates." + } + ] +} diff --git a/packages/cli/.grok-plugin/plugin.json b/packages/cli/.grok-plugin/plugin.json new file mode 100644 index 000000000..7bd53a8e8 --- /dev/null +++ b/packages/cli/.grok-plugin/plugin.json @@ -0,0 +1,30 @@ +{ + "_comment": "Best-effort manifest for xAI Grok. Grok has no published plugin-marketplace spec yet; this mirrors the Codex/OpenAI plugin schema as a forward-compatible placeholder. Revisit when an official format ships.", + "name": "browse", + "description": "Unified Browserbase CLI for browser automation and cloud APIs", + "author": { + "name": "Browserbase", + "url": "https://browserbase.com" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "keywords": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ], + "skills": "./skills/", + "interface": { + "displayName": "Browse", + "shortDescription": "Browser automation for agents", + "longDescription": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "developerName": "Browserbase", + "category": "Automation", + "websiteURL": "https://browserbase.com" + } +} diff --git a/packages/cli/assets/browse.svg b/packages/cli/assets/browse.svg new file mode 100644 index 000000000..afbfb9096 --- /dev/null +++ b/packages/cli/assets/browse.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/cli/package.json b/packages/cli/package.json index b7fcc0cda..d5fc70e3e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -97,6 +97,7 @@ "manifest": "oclif manifest .", "test": "pnpm build && vitest run", "test:cli": "vitest run", + "sync-plugin-version": "node scripts/sync-plugin-version.js", "prepublishOnly": "pnpm build" }, "dependencies": { diff --git a/packages/cli/plugins/README.md b/packages/cli/plugins/README.md new file mode 100644 index 000000000..d63bd0916 --- /dev/null +++ b/packages/cli/plugins/README.md @@ -0,0 +1,75 @@ +# browse plugin + +This directory holds the **browse** plugin and its per-marketplace metadata, so `browse` can be distributed through every major agent plugin marketplace. The plugin exposes the bundled `browse` skill (`../skills/browse/SKILL.md`); all browser and cloud actions run through the `browse` binary the skill calls. + +> `browse` is a CLI-plus-skill plugin — it does **not** run an MCP server. + +## Layout + +The catalog mirrors the [Stripe link-cli](https://github.com/stripe/link-cli) plugin structure. Catalog manifests live at the package root; the plugin itself lives in `plugins/browse/`: + +``` +packages/cli/ +├── .claude-plugin/marketplace.json # Claude Code marketplace catalog → ./plugins/browse +├── .cursor-plugin/marketplace.json # Cursor marketplace catalog +├── .codex-plugin/plugin.json # Codex / OpenAI manifest (rich "interface" block) +├── .grok-plugin/plugin.json # Grok (best-effort; no published spec yet) +├── .agents/plugins/marketplace.json # Generic agents catalog ("policy" block) +├── assets/browse.svg # Shared icon +├── skills/browse/SKILL.md # Shared skill (single source of truth) +└── plugins/browse/ + ├── .claude-plugin/plugin.json # Per-marketplace plugin manifests + ├── .codex-plugin/plugin.json + ├── .cursor-plugin/plugin.json + ├── .grok-plugin/plugin.json + ├── skills -> ../../skills # symlink to the shared skill + └── assets -> ../../assets # symlink to the shared assets +``` + +The skill and assets are **symlinked** into `plugins/browse/` so every marketplace ships the same files without duplication — the approach recommended by the [Claude Code plugin docs](https://code.claude.com/docs/en/plugins-reference#plugin-caching-and-file-resolution). + +## Marketplaces + +| Marketplace | Catalog manifest | Plugin manifest | +|-------------|------------------|-----------------| +| Claude Code | `.claude-plugin/marketplace.json` | `plugins/browse/.claude-plugin/plugin.json` | +| Cursor | `.cursor-plugin/marketplace.json` | `plugins/browse/.cursor-plugin/plugin.json` | +| Codex / OpenAI | `.codex-plugin/plugin.json` | `plugins/browse/.codex-plugin/plugin.json` | +| Generic agents | `.agents/plugins/marketplace.json` | — | +| Grok _(best-effort)_ | `.grok-plugin/plugin.json` | `plugins/browse/.grok-plugin/plugin.json` | + +> **Grok:** xAI has no published plugin-marketplace spec yet. The `.grok-plugin` manifests mirror the Codex/OpenAI schema as a forward-compatible placeholder and carry a `_comment` saying so. Revisit when an official format ships. + +## Install + +**Claude Code** — add the catalog and install: + +```bash +/plugin marketplace add ./path/to/packages/cli +/plugin install browse@browse-cli +``` + +**Any agent** — install the bundled skill directly (installs globally for every supported agent): + +```bash +browse skills install +# or +npx skills add browse +``` + +## Versioning + +All manifests and the skill are pinned to the `browse` CLI version in `packages/cli/package.json`. After a version bump, sync them: + +```bash +pnpm --filter browse sync-plugin-version +``` + +This reads the version from `package.json` and updates `skills/browse/SKILL.md` plus each `plugins/browse/.*-plugin/plugin.json`. + +## Validate + +```bash +claude plugin validate . # marketplace manifest +claude plugin validate ./plugins/browse # plugin manifest + skill frontmatter +``` diff --git a/packages/cli/plugins/browse/.claude-plugin/plugin.json b/packages/cli/plugins/browse/.claude-plugin/plugin.json new file mode 100644 index 000000000..4321dce4c --- /dev/null +++ b/packages/cli/plugins/browse/.claude-plugin/plugin.json @@ -0,0 +1,9 @@ +{ + "name": "browse", + "version": "0.8.4", + "description": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "author": { + "name": "Browserbase" + }, + "skills": "./skills/" +} diff --git a/packages/cli/plugins/browse/.codex-plugin/plugin.json b/packages/cli/plugins/browse/.codex-plugin/plugin.json new file mode 100644 index 000000000..59a0546ea --- /dev/null +++ b/packages/cli/plugins/browse/.codex-plugin/plugin.json @@ -0,0 +1,39 @@ +{ + "name": "browse", + "version": "0.8.4", + "description": "Unified Browserbase CLI for browser automation and cloud APIs", + "author": { + "name": "Browserbase", + "url": "https://browserbase.com" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "keywords": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ], + "skills": "./skills/", + "interface": { + "displayName": "Browse", + "shortDescription": "Browser automation for agents", + "longDescription": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "developerName": "Browserbase", + "category": "Automation", + "capabilities": [], + "websiteURL": "https://browserbase.com", + "privacyPolicyURL": "https://www.browserbase.com/privacy", + "termsOfServiceURL": "https://www.browserbase.com/terms", + "defaultPrompt": [ + "Use browse to open a page and take a snapshot" + ], + "screenshots": [], + "composerIcon": "./assets/browse.svg", + "logo": "./assets/browse.svg" + } +} diff --git a/packages/cli/plugins/browse/.cursor-plugin/plugin.json b/packages/cli/plugins/browse/.cursor-plugin/plugin.json new file mode 100644 index 000000000..095038cad --- /dev/null +++ b/packages/cli/plugins/browse/.cursor-plugin/plugin.json @@ -0,0 +1,16 @@ +{ + "name": "browse", + "displayName": "Browserbase Browse", + "version": "0.8.4", + "description": "Drive a local or Browserbase-hosted browser, inspect pages with accessibility snapshots and screenshots, and manage Browserbase cloud resources, Functions, and templates.", + "author": { + "name": "Browserbase" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "keywords": ["browser-automation", "browserbase", "stagehand", "scraping", "agents"], + "category": "automation", + "tags": ["browser", "automation", "browserbase", "stagehand", "agents"], + "skills": "./skills/" +} diff --git a/packages/cli/plugins/browse/.grok-plugin/plugin.json b/packages/cli/plugins/browse/.grok-plugin/plugin.json new file mode 100644 index 000000000..45a5cd195 --- /dev/null +++ b/packages/cli/plugins/browse/.grok-plugin/plugin.json @@ -0,0 +1,31 @@ +{ + "_comment": "Best-effort manifest for xAI Grok. Grok has no published plugin-marketplace spec yet; this mirrors the Codex/OpenAI plugin schema as a forward-compatible placeholder. Revisit when an official format ships.", + "name": "browse", + "version": "0.8.4", + "description": "Unified Browserbase CLI for browser automation and cloud APIs", + "author": { + "name": "Browserbase", + "url": "https://browserbase.com" + }, + "homepage": "https://github.com/browserbase/stagehand/tree/main/packages/cli", + "repository": "https://github.com/browserbase/stagehand", + "license": "MIT", + "keywords": [ + "browser-automation", + "browserbase", + "stagehand", + "scraping", + "web", + "agents", + "cli" + ], + "skills": "./skills/", + "interface": { + "displayName": "Browse", + "shortDescription": "Browser automation for agents", + "longDescription": "Drive a local or Browserbase-hosted browser, inspect and interact with pages, manage Browserbase cloud resources and Functions, scaffold templates, and discover Browse.sh skills.", + "developerName": "Browserbase", + "category": "Automation", + "websiteURL": "https://browserbase.com" + } +} diff --git a/packages/cli/plugins/browse/assets b/packages/cli/plugins/browse/assets new file mode 120000 index 000000000..41aef43f1 --- /dev/null +++ b/packages/cli/plugins/browse/assets @@ -0,0 +1 @@ +../../assets \ No newline at end of file diff --git a/packages/cli/plugins/browse/skills b/packages/cli/plugins/browse/skills new file mode 120000 index 000000000..5dcab58e1 --- /dev/null +++ b/packages/cli/plugins/browse/skills @@ -0,0 +1 @@ +../../skills \ No newline at end of file diff --git a/packages/cli/scripts/sync-plugin-version.js b/packages/cli/scripts/sync-plugin-version.js new file mode 100644 index 000000000..7cb3b4e37 --- /dev/null +++ b/packages/cli/scripts/sync-plugin-version.js @@ -0,0 +1,49 @@ +#!/usr/bin/env node + +// Keeps every plugin manifest and the bundled skill pinned to the browse CLI's +// package.json version. Run from packages/cli (e.g. via `pnpm sync-plugin-version`). + +import { readFileSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const cliRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const { version } = JSON.parse( + readFileSync(resolve(cliRoot, "package.json"), "utf8"), +); + +function syncSkillVersion(label, path) { + const content = readFileSync(path, "utf8"); + const updated = content.replace(/^version:\s*.+$/m, `version: ${version}`); + if (updated !== content) { + writeFileSync(path, updated); + console.log(`Updated ${label} version to ${version}`); + } else { + console.log(`${label} version already at ${version}`); + } +} + +function syncPluginJsonVersion(label, path) { + const json = JSON.parse(readFileSync(path, "utf8")); + if (json.version !== version) { + json.version = version; + writeFileSync(path, `${JSON.stringify(json, null, 2)}\n`); + console.log(`Updated ${label} version to ${version}`); + } else { + console.log(`${label} version already at ${version}`); + } +} + +syncSkillVersion("skills/browse/SKILL.md", resolve(cliRoot, "skills/browse/SKILL.md")); + +for (const marketplace of [ + ".claude-plugin", + ".codex-plugin", + ".cursor-plugin", + ".grok-plugin", +]) { + syncPluginJsonVersion( + `plugins/browse/${marketplace}/plugin.json`, + resolve(cliRoot, "plugins/browse", marketplace, "plugin.json"), + ); +} diff --git a/packages/cli/skills/browse/SKILL.md b/packages/cli/skills/browse/SKILL.md index 46ee14c17..b07d493c2 100644 --- a/packages/cli/skills/browse/SKILL.md +++ b/packages/cli/skills/browse/SKILL.md @@ -1,4 +1,5 @@ --- +version: 0.8.4 name: browse description: Use the browse CLI for Browserbase browser automation, Browserbase cloud APIs, Browserbase Functions, templates, web fetch/search, diagnostics, and Browse.sh skill discovery/installation. Use when the user asks to navigate pages, inspect browser state, run local or remote browser sessions, manage Browserbase resources, call Browserbase Functions, browse or scaffold Browserbase templates, fetch or search web content, diagnose browse setup, find or install a skill for a website task, discover site-specific Browse.sh skills, or install/refresh this browse skill. compatibility: "Requires the browse CLI (`npm install -g browse`). Remote Browserbase sessions and cloud API commands require `BROWSERBASE_API_KEY`. Local mode uses Chrome/Chromium on the machine."