unbrowse 2.10.2 → 2.11.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
@@ -6,18 +6,23 @@ Turn any website into a reusable API interface for agents. Unbrowse captures net
6
6
 
7
7
  One agent learns a site once. Every later agent gets the fast path.
8
8
 
9
+ Unbrowse is a drop-in browser for agents: same browser-shaped job in the stack, but with route learning, reuse, and browser fallback built in.
10
+
9
11
  > Security note: capture and execution stay local by default. Credentials stay on your machine. Learned API contracts are published to the shared marketplace only after capture. See [SKILL.md](./SKILL.md) for the full agent-facing API reference and tool-policy guidance.
10
12
 
11
13
  ## Quick start
12
14
 
13
15
  ```bash
14
- # Fastest full setup
15
- npx unbrowse setup
16
+ # Deterministic setup from a repo clone
17
+ git clone --single-branch --depth 1 https://github.com/unbrowse-ai/unbrowse.git ~/unbrowse
18
+ cd ~/unbrowse && ./setup --host off
16
19
  ```
17
20
 
18
- `npx unbrowse setup` downloads the CLI on demand, verifies the bundled Kuri runtime, lets you register with an email-shaped display identity, registers the Open Code `/unbrowse` command when Open Code is detected, and starts the local server.
21
+ `./setup` installs repo dependencies, prebuilds the packaged CLI runtime, installs a stable `unbrowse` shim, and then runs the real first-time bootstrap: ToS acceptance, agent registration + API-key caching, and lobster.cash wallet detection when present.
22
+
23
+ If a wallet is configured, that wallet address is synced onto your agent profile and becomes the destination for contributor payouts when your routes earn.
19
24
 
20
- For daily use:
25
+ For repeat npm use after a healthy publish:
21
26
 
22
27
  ```bash
23
28
  npm install -g unbrowse
@@ -34,11 +39,12 @@ npx skills add unbrowse-ai/unbrowse
34
39
 
35
40
  Unbrowse no longer self-updates at runtime. If you already have Unbrowse installed, upgrade to the latest version after each release or the new flow may not work on your machine.
36
41
 
37
- If you installed the CLI globally:
42
+ If you installed from a repo clone:
38
43
 
39
44
  ```bash
40
- npm install -g unbrowse@latest
41
- unbrowse setup
45
+ cd ~/unbrowse
46
+ git pull --ff-only
47
+ ./setup --host off
42
48
  ```
43
49
 
44
50
  If your agent host uses skills, rerun its skill install/update command too:
@@ -49,6 +55,9 @@ npx skills add unbrowse-ai/unbrowse
49
55
 
50
56
  Need help or want release updates? Join the Discord: [discord.gg/VWugEeFNsG](https://discord.gg/VWugEeFNsG)
51
57
 
58
+ Every CLI command auto-starts the local server on `http://localhost:6969` by default. Override with `UNBROWSE_URL`, `PORT`, or `HOST`. On first startup it auto-registers as an agent with the marketplace and caches credentials in `~/.unbrowse/config.json`. `unbrowse setup` prompts for an email-shaped identity first; headless setups can provide `UNBROWSE_AGENT_EMAIL`.
59
+ Canonical docs: [docs.unbrowse.ai](https://docs.unbrowse.ai)
60
+
52
61
  Every CLI command auto-starts the local server on `http://localhost:6969` by default. Override with `UNBROWSE_URL`, `PORT`, or `HOST`. On first startup it auto-registers as an agent with the marketplace and caches credentials in `~/.unbrowse/config.json`. `unbrowse setup` now prompts for an email-shaped identity first; headless setups can provide `UNBROWSE_AGENT_EMAIL`.
53
62
 
54
63
  Works with Claude Code, Open Code, Cursor, Codex, Windsurf, and any agent host that can call a local CLI or skill.
@@ -80,6 +89,15 @@ unbrowse search --intent "get stock prices"
80
89
 
81
90
  If you tried Unbrowse on a site or API and could not get it to work, add it to [Discussion #53](https://github.com/unbrowse-ai/unbrowse/discussions/53). We use that thread to collect missing or broken targets so we can turn them into requirements for the next eval pass.
82
91
 
92
+ ## Docs
93
+
94
+ The synced skill repo also carries the longer-form docs set:
95
+
96
+ - [Whitepaper companion index](./docs/whitepaper/README.md)
97
+ - [For Technical Readers](./docs/whitepaper/for-technical-readers.md)
98
+ - [For Investors](./docs/whitepaper/for-investors.md)
99
+ - [Analytics API](./docs/analytics-api.md)
100
+
83
101
  ## How it works
84
102
 
85
103
  When an agent asks for something, Unbrowse first searches the marketplace for an existing skill. If one exists with enough confidence, it executes immediately. If not, Unbrowse captures the site, learns the APIs behind it, publishes a reusable skill, and executes that instead.
@@ -157,6 +175,16 @@ See [SKILL.md](./SKILL.md) for the full API reference including all endpoints, s
157
175
  | GET | `/v1/stats/summary` | Platform stats |
158
176
  | GET | `/health` | Health check |
159
177
 
178
+ ## Docs
179
+
180
+ The standalone skill repo also carries the core repo docs:
181
+
182
+ - [Quickstart guide](./docs/guides/quickstart.md)
183
+ - [API notes](./docs/api.md)
184
+ - [Codex eval harness](./docs/codex-eval-harness.md)
185
+ - [Deployment notes](./docs/deployment.md)
186
+ - [Release checklist](./docs/RELEASING.md)
187
+
160
188
  ## Configuration
161
189
 
162
190
  ### Runtime directories
@@ -2,13 +2,13 @@
2
2
 
3
3
  /**
4
4
  * Thin wrapper — execs the compiled binary if available,
5
- * falls back to source mode (bun/tsx) if not.
5
+ * falls back to the package-managed Node launcher if not.
6
6
  */
7
7
 
8
8
  import { existsSync } from "node:fs";
9
9
  import { join, dirname } from "node:path";
10
10
  import { fileURLToPath } from "node:url";
11
- import { execFileSync, spawn } from "node:child_process";
11
+ import { spawn } from "node:child_process";
12
12
 
13
13
  const __dirname = dirname(fileURLToPath(import.meta.url));
14
14
  const binaryPath = join(__dirname, "unbrowse");
@@ -24,32 +24,16 @@ if (existsSync(binaryPath)) {
24
24
  process.exit(code ?? 1);
25
25
  });
26
26
  } else {
27
- // Fallback: source mode via bun or tsx
28
- const packageRoot = join(__dirname, "..");
29
- const entry = join(packageRoot, "runtime-src", "cli.ts");
30
-
31
- // Try bun first, then node+tsx
32
- try {
33
- execFileSync("which", ["bun"], { stdio: "ignore" });
34
- const child = spawn("bun", [entry, ...process.argv.slice(2)], {
35
- stdio: "inherit",
36
- cwd: process.cwd(),
37
- });
38
- child.on("exit", (code, signal) => {
39
- if (signal) { process.kill(process.pid, signal); return; }
40
- process.exit(code ?? 1);
41
- });
42
- } catch {
43
- // No bun — use node+tsx
44
- const tsxPath = join(packageRoot, "node_modules", "tsx", "dist", "loader.mjs");
45
- const child = spawn(process.execPath, ["--import", tsxPath, entry, ...process.argv.slice(2)], {
46
- stdio: "inherit",
47
- cwd: process.cwd(),
48
- env: { ...process.env, UNBROWSE_PACKAGE_ROOT: packageRoot },
49
- });
50
- child.on("exit", (code, signal) => {
51
- if (signal) { process.kill(process.pid, signal); return; }
52
- process.exit(code ?? 1);
53
- });
54
- }
27
+ // Fallback: delegate to the stable package launcher so
28
+ // npm installs and npx use the same dependency resolution path.
29
+ const launcherPath = join(__dirname, "unbrowse.js");
30
+ const child = spawn(process.execPath, [launcherPath, ...process.argv.slice(2)], {
31
+ stdio: "inherit",
32
+ cwd: process.cwd(),
33
+ env: process.env,
34
+ });
35
+ child.on("exit", (code, signal) => {
36
+ if (signal) { process.kill(process.pid, signal); return; }
37
+ process.exit(code ?? 1);
38
+ });
55
39
  }