bb-browser 0.5.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -52,11 +52,6 @@ bb-browser flips this: **instead of forcing websites to provide machine interfac
52
52
  npm install -g bb-browser
53
53
  ```
54
54
 
55
- ### Chrome Extension
56
-
57
- 1. Download from [Releases](https://github.com/epiral/bb-browser/releases/latest)
58
- 2. Unzip → `chrome://extensions/` → Developer Mode → Load unpacked
59
-
60
55
  ### Use
61
56
 
62
57
  ```bash
@@ -65,6 +60,24 @@ bb-browser site recommend # see which adapters match your browsing habits
65
60
  bb-browser site zhihu/hot # go
66
61
  ```
67
62
 
63
+ ### OpenClaw (no extension needed)
64
+
65
+ If you use [OpenClaw](https://openclaw.ai), bb-browser runs directly through OpenClaw's built-in browser — no Chrome extension or daemon required:
66
+
67
+ ```bash
68
+ bb-browser site reddit/hot --openclaw
69
+ bb-browser site xueqiu/hot-stock 5 --openclaw --jq '.items[] | {name, changePercent}'
70
+ ```
71
+
72
+ Skill on ClawHub: [bb-browser-openclaw](https://clawhub.ai/yan5xu/bb-browser)
73
+
74
+ ### Chrome Extension (standalone mode)
75
+
76
+ For use without OpenClaw (Claude Code MCP, standalone CLI):
77
+
78
+ 1. Download from [Releases](https://github.com/epiral/bb-browser/releases/latest)
79
+ 2. Unzip → `chrome://extensions/` → Developer Mode → Load unpacked
80
+
68
81
  ### MCP (Claude Code / Cursor)
69
82
 
70
83
  ```json
package/README.zh-CN.md CHANGED
@@ -52,11 +52,6 @@ bb-browser 翻转了这个逻辑:**不是让网站适配机器,而是让机
52
52
  npm install -g bb-browser
53
53
  ```
54
54
 
55
- ### Chrome 扩展
56
-
57
- 1. 从 [Releases](https://github.com/epiral/bb-browser/releases/latest) 下载 zip
58
- 2. 解压 → `chrome://extensions/` → 开发者模式 → 加载已解压的扩展程序
59
-
60
55
  ### 使用
61
56
 
62
57
  ```bash
@@ -65,6 +60,24 @@ bb-browser site recommend # 看看哪些和你的浏览习惯匹配
65
60
  bb-browser site zhihu/hot # 开搞
66
61
  ```
67
62
 
63
+ ### OpenClaw(无需安装扩展)
64
+
65
+ 如果你使用 [OpenClaw](https://openclaw.ai),bb-browser 可以直接通过 OpenClaw 内置浏览器运行,不需要额外安装 Chrome 扩展或 daemon:
66
+
67
+ ```bash
68
+ bb-browser site reddit/hot --openclaw
69
+ bb-browser site xueqiu/hot-stock 5 --openclaw --jq '.items[] | {name, changePercent}'
70
+ ```
71
+
72
+ ClawHub Skill: [bb-browser-openclaw](https://clawhub.ai/yan5xu/bb-browser)
73
+
74
+ ### Chrome 扩展(独立模式)
75
+
76
+ 不使用 OpenClaw 时(Claude Code MCP、独立 CLI)需要安装扩展:
77
+
78
+ 1. 从 [Releases](https://github.com/epiral/bb-browser/releases/latest) 下载 zip
79
+ 2. 解压 → `chrome://extensions/` → 开发者模式 → 加载已解压的扩展程序
80
+
68
81
  ### MCP 接入(Claude Code / Cursor)
69
82
 
70
83
  ```json
package/dist/cli.js CHANGED
@@ -9,6 +9,9 @@ import {
9
9
  } from "./chunk-AHGAQEFO.js";
10
10
  import "./chunk-D4HDZEJT.js";
11
11
 
12
+ // packages/cli/src/index.ts
13
+ import { fileURLToPath as fileURLToPath2 } from "url";
14
+
12
15
  // packages/cli/src/client.ts
13
16
  var jqExpression;
14
17
  function setJqExpression(expression) {
@@ -201,6 +204,17 @@ var BB_DIR = join(homedir(), ".bb-browser");
201
204
  var LOCAL_SITES_DIR = join(BB_DIR, "sites");
202
205
  var COMMUNITY_SITES_DIR = join(BB_DIR, "bb-sites");
203
206
  var COMMUNITY_REPO = "https://github.com/epiral/bb-sites.git";
207
+ function checkCliUpdate() {
208
+ try {
209
+ const current = execSync("bb-browser --version", { timeout: 3e3, stdio: ["pipe", "pipe", "pipe"] }).toString().trim();
210
+ const latest = execSync("npm view bb-browser version", { timeout: 5e3, stdio: ["pipe", "pipe", "pipe"] }).toString().trim();
211
+ if (latest && current && latest !== current && latest.localeCompare(current, void 0, { numeric: true }) > 0) {
212
+ console.log(`
213
+ \u{1F4E6} bb-browser ${latest} available (current: ${current}). Run: npm install -g bb-browser`);
214
+ }
215
+ } catch {
216
+ }
217
+ }
204
218
  function parseSiteMeta(filePath, source) {
205
219
  let content;
206
220
  try {
@@ -405,6 +419,8 @@ function siteUpdate() {
405
419
  }
406
420
  const sites = scanSites(COMMUNITY_SITES_DIR, "community");
407
421
  console.log(`\u5DF2\u5B89\u88C5 ${sites.length} \u4E2A\u793E\u533A adapter\u3002`);
422
+ console.log(`\u2B50 Like bb-browser? \u2192 bb-browser star`);
423
+ checkCliUpdate();
408
424
  }
409
425
  function findSiteByName(name) {
410
426
  return getAllSites().find((site) => site.name === name);
@@ -581,6 +597,58 @@ async function siteRun(name, args, options) {
581
597
  const jsBody = jsContent.replace(/\/\*\s*@meta[\s\S]*?\*\//, "").trim();
582
598
  const argsJson = JSON.stringify(argMap);
583
599
  const script = `(${jsBody})(${argsJson})`;
600
+ if (options.openclaw) {
601
+ const { ocGetTabs, ocFindTabByDomain, ocOpenTab, ocEvaluate } = await import("./openclaw-bridge-P3G4KGYM.js");
602
+ let targetId;
603
+ if (site.domain) {
604
+ const tabs = ocGetTabs();
605
+ const existing = ocFindTabByDomain(tabs, site.domain);
606
+ if (existing) {
607
+ targetId = existing.targetId;
608
+ } else {
609
+ targetId = ocOpenTab(`https://${site.domain}`);
610
+ await new Promise((resolve2) => setTimeout(resolve2, 3e3));
611
+ }
612
+ } else {
613
+ const tabs = ocGetTabs();
614
+ if (tabs.length === 0) {
615
+ throw new Error("No tabs open in OpenClaw browser");
616
+ }
617
+ targetId = tabs[0].targetId;
618
+ }
619
+ const wrappedFn = `async () => { const __fn = ${jsBody}; return await __fn(${argsJson}); }`;
620
+ const parsed2 = ocEvaluate(targetId, wrappedFn);
621
+ if (typeof parsed2 === "object" && parsed2 !== null && "error" in parsed2) {
622
+ const errObj = parsed2;
623
+ const checkText = `${errObj.error} ${errObj.hint || ""}`;
624
+ const isAuthError = /401|403|unauthorized|forbidden|not.?logged|login.?required|sign.?in|auth/i.test(checkText);
625
+ const loginHint = isAuthError && site.domain ? `Please log in to https://${site.domain} in your OpenClaw browser first, then retry.` : void 0;
626
+ const hint = loginHint || errObj.hint;
627
+ const reportHint = `If this is an adapter bug, report via: gh issue create --repo epiral/bb-sites --title "[${name}] <description>" OR: bb-browser site github/issue-create epiral/bb-sites --title "[${name}] <description>"`;
628
+ if (options.json) {
629
+ console.log(JSON.stringify({ id: "openclaw", success: false, error: errObj.error, hint, reportHint }));
630
+ } else {
631
+ console.error(`[error] site ${name}: ${errObj.error}`);
632
+ if (hint) console.error(` Hint: ${hint}`);
633
+ console.error(` Report: gh issue create --repo epiral/bb-sites --title "[${name}] ..."`);
634
+ console.error(` or: bb-browser site github/issue-create epiral/bb-sites --title "[${name}] ..."`);
635
+ }
636
+ process.exit(1);
637
+ }
638
+ if (options.jq) {
639
+ const { applyJq: applyJq2 } = await import("./jq-HHMLHEPA.js");
640
+ const expr = options.jq.replace(/^\.data\./, ".");
641
+ const results = applyJq2(parsed2, expr);
642
+ for (const r of results) {
643
+ console.log(typeof r === "string" ? r : JSON.stringify(r));
644
+ }
645
+ } else if (options.json) {
646
+ console.log(JSON.stringify({ id: "openclaw", success: true, data: parsed2 }));
647
+ } else {
648
+ console.log(JSON.stringify(parsed2, null, 2));
649
+ }
650
+ return;
651
+ }
584
652
  await ensureDaemonRunning();
585
653
  let targetTabId = options.tabId;
586
654
  if (!targetTabId && site.domain) {
@@ -2247,7 +2315,7 @@ async function historyCommand(subCommand, options = {}) {
2247
2315
  }
2248
2316
 
2249
2317
  // packages/cli/src/index.ts
2250
- var VERSION = "0.3.0";
2318
+ var VERSION = "0.7.0";
2251
2319
  var HELP_TEXT = `
2252
2320
  bb-browser - AI Agent \u6D4F\u89C8\u5668\u81EA\u52A8\u5316\u5DE5\u5177
2253
2321
 
@@ -2266,6 +2334,7 @@ bb-browser - AI Agent \u6D4F\u89C8\u5668\u81EA\u52A8\u5316\u5DE5\u5177
2266
2334
  site <name> [args] \u8FD0\u884C adapter
2267
2335
  site update \u66F4\u65B0\u793E\u533A adapter \u5E93
2268
2336
  guide \u5982\u4F55\u628A\u4EFB\u4F55\u7F51\u7AD9\u53D8\u6210 adapter
2337
+ star \u2B50 Star bb-browser on GitHub
2269
2338
 
2270
2339
  \u6D4F\u89C8\u5668\u64CD\u4F5C\uFF1A
2271
2340
  open <url> [--tab] \u6253\u5F00 URL
@@ -2338,6 +2407,8 @@ function parseArgs(argv) {
2338
2407
  result.flags.jq = args[nextIdx];
2339
2408
  result.flags.json = true;
2340
2409
  }
2410
+ } else if (arg === "--openclaw") {
2411
+ result.flags.openclaw = true;
2341
2412
  } else if (arg === "--help" || arg === "-h") {
2342
2413
  result.flags.help = true;
2343
2414
  } else if (arg === "--version" || arg === "-v") {
@@ -2387,7 +2458,7 @@ async function main() {
2387
2458
  return;
2388
2459
  }
2389
2460
  if (process.argv.includes("--mcp")) {
2390
- const mcpPath = new URL("./mcp.js", import.meta.url).pathname;
2461
+ const mcpPath = fileURLToPath2(new URL("./mcp.js", import.meta.url));
2391
2462
  const { spawn: spawn3 } = await import("child_process");
2392
2463
  const child = spawn3(process.execPath, [mcpPath], { stdio: "inherit" });
2393
2464
  child.on("exit", (code) => process.exit(code ?? 0));
@@ -2741,10 +2812,32 @@ async function main() {
2741
2812
  json: parsed.flags.json,
2742
2813
  jq: parsed.flags.jq,
2743
2814
  days: parsed.flags.days,
2744
- tabId: globalTabId
2815
+ tabId: globalTabId,
2816
+ openclaw: parsed.flags.openclaw
2745
2817
  });
2746
2818
  break;
2747
2819
  }
2820
+ case "star": {
2821
+ const { execSync: execSync2 } = await import("child_process");
2822
+ try {
2823
+ execSync2("gh auth status", { stdio: "pipe" });
2824
+ } catch {
2825
+ console.error("\u9700\u8981\u5148\u5B89\u88C5\u5E76\u767B\u5F55 GitHub CLI: https://cli.github.com");
2826
+ console.error(" brew install gh && gh auth login");
2827
+ process.exit(1);
2828
+ }
2829
+ const repos = ["epiral/bb-browser", "epiral/bb-sites"];
2830
+ for (const repo of repos) {
2831
+ try {
2832
+ execSync2(`gh api user/starred/${repo} -X PUT`, { stdio: "pipe" });
2833
+ console.log(`\u2B50 Starred ${repo}`);
2834
+ } catch {
2835
+ console.log(`Already starred or failed: ${repo}`);
2836
+ }
2837
+ }
2838
+ console.log("\nThanks for your support! \u{1F64F}");
2839
+ break;
2840
+ }
2748
2841
  case "guide": {
2749
2842
  console.log(`How to turn any website into a bb-browser site adapter
2750
2843
  =======================================================