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 +18 -5
- package/README.zh-CN.md +18 -5
- package/dist/cli.js +96 -3
- package/dist/cli.js.map +1 -1
- package/dist/openclaw-bridge-P3G4KGYM.js +43 -0
- package/dist/openclaw-bridge-P3G4KGYM.js.map +1 -0
- package/package.json +1 -1
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.
|
|
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)
|
|
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
|
=======================================================
|