@b3os/cli 0.0.0-stage → 0.0.1

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/dist/ctx.js ADDED
@@ -0,0 +1,271 @@
1
+ // Shared CLI plumbing: flags, the SDK client, output in human or --json form, confirmations that never prompt
2
+ // without a TTY, and the stable exit codes.
3
+ import { createInterface } from "node:readline/promises";
4
+ import { parseArgs } from "node:util";
5
+ import { B3OS, B3OSError, DEFAULT_BASE_URL } from "@b3os/sdk";
6
+ import { loadCredentials } from "./config.js";
7
+ /** Exit codes. Stable: scripts may rely on them (documented in packages/cli/README.md). */
8
+ export const EXIT = {
9
+ OK: 0,
10
+ ERROR: 1,
11
+ USAGE: 2,
12
+ AUTH: 3,
13
+ NOT_FOUND: 4,
14
+ INVALID: 5,
15
+ LIMITED: 6,
16
+ SERVER: 7,
17
+ TIMEOUT: 8,
18
+ CONNECTION: 9,
19
+ FAILED: 10,
20
+ INTERRUPTED: 130,
21
+ };
22
+ export class UsageError extends Error {
23
+ constructor(message) {
24
+ super(message);
25
+ this.name = "UsageError";
26
+ }
27
+ }
28
+ /** Options every command takes. */
29
+ export const GLOBAL_OPTIONS = {
30
+ json: { type: "boolean" },
31
+ yes: { type: "boolean", short: "y" },
32
+ quiet: { type: "boolean", short: "q" },
33
+ help: { type: "boolean", short: "h" },
34
+ "api-key": { type: "string" },
35
+ "base-url": { type: "string" },
36
+ timeout: { type: "string" },
37
+ };
38
+ export function parse(argv, options = {}) {
39
+ try {
40
+ const r = parseArgs({
41
+ args: argv,
42
+ options: { ...GLOBAL_OPTIONS, ...options },
43
+ allowPositionals: true,
44
+ strict: true,
45
+ });
46
+ return { values: r.values, positionals: r.positionals };
47
+ }
48
+ catch (e) {
49
+ throw new UsageError(e.message);
50
+ }
51
+ }
52
+ export class Ctx {
53
+ json = false;
54
+ yes = false;
55
+ quiet = false;
56
+ apiKey;
57
+ baseUrl;
58
+ timeoutMs;
59
+ cached;
60
+ io;
61
+ /** Extra client options (tests). */
62
+ clientOptions = {};
63
+ constructor(io) {
64
+ this.io = io;
65
+ }
66
+ applyGlobals(v) {
67
+ if (v.json)
68
+ this.json = true;
69
+ if (v.yes)
70
+ this.yes = true;
71
+ if (v.quiet)
72
+ this.quiet = true;
73
+ if (typeof v["api-key"] === "string")
74
+ this.apiKey = v["api-key"];
75
+ if (typeof v["base-url"] === "string")
76
+ this.baseUrl = v["base-url"];
77
+ if (typeof v.timeout === "string") {
78
+ const ms = Number(v.timeout);
79
+ if (!Number.isFinite(ms) || ms <= 0)
80
+ throw new UsageError("--timeout takes milliseconds");
81
+ this.timeoutMs = ms;
82
+ }
83
+ }
84
+ get isTTY() {
85
+ return !!this.io.stdin.isTTY && !!this.io.stdout.isTTY;
86
+ }
87
+ /** The API key in effect: --api-key, B3OS_API_KEY, then the stored login. */
88
+ credential() {
89
+ const stored = loadCredentials();
90
+ const baseUrl = this.baseUrl ?? process.env.B3OS_BASE_URL ?? stored?.base_url ?? DEFAULT_BASE_URL;
91
+ if (this.apiKey)
92
+ return { key: this.apiKey, source: "--api-key", baseUrl };
93
+ if (process.env.B3OS_API_KEY)
94
+ return { key: process.env.B3OS_API_KEY, source: "B3OS_API_KEY", baseUrl };
95
+ if (stored)
96
+ return { key: stored.token, source: "b3os login", baseUrl };
97
+ return { key: null, source: "none", baseUrl };
98
+ }
99
+ /**
100
+ * The base URL the user chose (--base-url, B3OS_BASE_URL, or a stored login's non-default host), else undefined.
101
+ * Only a chosen one is passed to the SDK: a base URL turns off its default-socket detection on a node.
102
+ */
103
+ configuredBaseUrl() {
104
+ if (this.baseUrl)
105
+ return this.baseUrl;
106
+ if (process.env.B3OS_BASE_URL)
107
+ return process.env.B3OS_BASE_URL;
108
+ const stored = loadCredentials()?.base_url;
109
+ return stored && stored.replace(/\/+$/, "") !== DEFAULT_BASE_URL ? stored : undefined;
110
+ }
111
+ client() {
112
+ if (!this.cached) {
113
+ const c = this.credential();
114
+ const baseUrl = this.configuredBaseUrl();
115
+ this.cached = new B3OS({
116
+ apiKey: c.key,
117
+ ...(baseUrl ? { baseUrl } : {}),
118
+ timeoutMs: this.timeoutMs,
119
+ ...this.clientOptions,
120
+ });
121
+ }
122
+ return this.cached;
123
+ }
124
+ out(s) {
125
+ this.io.stdout.write(s.endsWith("\n") ? s : `${s}\n`);
126
+ }
127
+ /** Progress and notes go to stderr so stdout stays data. Silent with --quiet or --json. */
128
+ info(s) {
129
+ if (!this.quiet && !this.json)
130
+ this.io.stderr.write(s.endsWith("\n") ? s : `${s}\n`);
131
+ }
132
+ warn(s) {
133
+ if (!this.quiet)
134
+ this.io.stderr.write(s.endsWith("\n") ? s : `${s}\n`);
135
+ }
136
+ printJson(v) {
137
+ this.io.stdout.write(`${JSON.stringify(v, null, 2)}\n`);
138
+ }
139
+ /** One JSON document per line (streams with --json). */
140
+ printJsonLine(v) {
141
+ this.io.stdout.write(`${JSON.stringify(v)}\n`);
142
+ }
143
+ /** --json prints `data`; otherwise `human()` decides. */
144
+ result(data, human) {
145
+ if (this.json)
146
+ this.printJson(data);
147
+ else
148
+ human();
149
+ }
150
+ table(rows, columns) {
151
+ if (rows.length === 0) {
152
+ this.info("(none)");
153
+ return;
154
+ }
155
+ const cell = (v) => v === null || v === undefined ? "-" : typeof v === "object" ? JSON.stringify(v) : String(v);
156
+ const widths = columns.map((c) => Math.max(c.length, ...rows.map((r) => cell(r[c]).length)));
157
+ const line = (vals) => vals
158
+ .map((v, i) => (i === vals.length - 1 ? v : v.padEnd(widths[i] ?? 0)))
159
+ .join(" ")
160
+ .trimEnd();
161
+ this.out(line(columns.map((c) => c.toUpperCase())));
162
+ for (const r of rows)
163
+ this.out(line(columns.map((c) => cell(r[c]))));
164
+ }
165
+ /** Asks before a destructive action. Never prompts without a TTY: then --yes is required. */
166
+ async confirm(question) {
167
+ if (this.yes)
168
+ return true;
169
+ if (!this.isTTY)
170
+ throw new UsageError(`${question} Refusing without a terminal; pass --yes to confirm.`);
171
+ const rl = createInterface({ input: this.io.stdin, output: process.stderr });
172
+ try {
173
+ const a = (await rl.question(`${question} [y/N] `)).trim().toLowerCase();
174
+ return a === "y" || a === "yes";
175
+ }
176
+ finally {
177
+ rl.close();
178
+ }
179
+ }
180
+ }
181
+ export function exitCodeFor(e) {
182
+ if (e instanceof UsageError)
183
+ return EXIT.USAGE;
184
+ if (!(e instanceof B3OSError))
185
+ return EXIT.ERROR;
186
+ if (e.name === "B3OSJobError")
187
+ return EXIT.FAILED;
188
+ switch (e.code) {
189
+ case "timeout":
190
+ return EXIT.TIMEOUT;
191
+ case "connection_error":
192
+ return EXIT.CONNECTION;
193
+ case "aborted":
194
+ return EXIT.INTERRUPTED;
195
+ default:
196
+ break;
197
+ }
198
+ const s = e.status ?? 0;
199
+ if (s === 401 || s === 403)
200
+ return EXIT.AUTH;
201
+ if (s === 404)
202
+ return EXIT.NOT_FOUND;
203
+ if (s === 402 || s === 429)
204
+ return EXIT.LIMITED;
205
+ if (s === 504)
206
+ return EXIT.TIMEOUT;
207
+ if (s >= 500)
208
+ return EXIT.SERVER;
209
+ if (s >= 400)
210
+ return EXIT.INVALID;
211
+ return EXIT.ERROR;
212
+ }
213
+ /** The error as printed: one readable line (plus validation items), or a JSON object with --json. */
214
+ export function renderError(e, json) {
215
+ if (e instanceof B3OSError) {
216
+ if (json) {
217
+ return JSON.stringify({
218
+ error: {
219
+ code: e.code,
220
+ status: e.status,
221
+ title: e.title,
222
+ detail: e.detail,
223
+ type: e.type,
224
+ request_id: e.requestId,
225
+ errors: e.errors.length ? e.errors : undefined,
226
+ job: e.job,
227
+ },
228
+ });
229
+ }
230
+ const lines = [`error: ${e.message}`];
231
+ for (const it of e.errors)
232
+ lines.push(` ${it.pointer}: ${it.detail}`);
233
+ return lines.join("\n");
234
+ }
235
+ if (json)
236
+ return JSON.stringify({
237
+ error: { code: e instanceof UsageError ? "usage" : "error", detail: String(e?.message ?? e) },
238
+ });
239
+ return `error: ${e?.message ?? String(e)}`;
240
+ }
241
+ /** Reads `k=v` pairs (`--env A=1`). */
242
+ export function pairs(list, flag) {
243
+ const out = {};
244
+ for (const item of Array.isArray(list) ? list : list === undefined ? [] : [list]) {
245
+ const s = String(item);
246
+ const eq = s.indexOf("=");
247
+ if (eq <= 0)
248
+ throw new UsageError(`${flag} takes KEY=VALUE, got "${s}"`);
249
+ out[s.slice(0, eq)] = s.slice(eq + 1);
250
+ }
251
+ return out;
252
+ }
253
+ export function intFlag(v, flag) {
254
+ if (v === undefined)
255
+ return undefined;
256
+ const n = Number(v);
257
+ if (!Number.isInteger(n))
258
+ throw new UsageError(`${flag} takes an integer, got "${String(v)}"`);
259
+ return n;
260
+ }
261
+ export function jsonFlag(v, flag) {
262
+ if (v === undefined)
263
+ return undefined;
264
+ try {
265
+ return JSON.parse(String(v));
266
+ }
267
+ catch (e) {
268
+ throw new UsageError(`${flag} is not valid JSON: ${e.message}`);
269
+ }
270
+ }
271
+ //# sourceMappingURL=ctx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctx.js","sourceRoot":"","sources":["../src/ctx.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type Streams } from "./ctx.ts";
2
+ export declare const CLI_VERSION = "0.0.1";
3
+ export declare function run(argv: string[], io?: Streams): Promise<number>;
package/dist/main.js ADDED
@@ -0,0 +1,86 @@
1
+ // b3os: the B3OS command line. Every command takes --json (machine-readable stdout), --yes (no confirmations),
2
+ // --quiet, --api-key, --base-url and --timeout MS. Without a TTY it never prompts. Exit codes: ctx.ts EXIT.
3
+ import { SDK_VERSION } from "@b3os/sdk";
4
+ import { api } from "./commands/api.js";
5
+ import { login, logout, whoami } from "./commands/auth.js";
6
+ import { bench } from "./commands/bench.js";
7
+ import { keys } from "./commands/keys.js";
8
+ import { mcp } from "./commands/mcp.js";
9
+ import { action, routine } from "./commands/routine.js";
10
+ import { sandbox } from "./commands/sandbox.js";
11
+ import { scrape, screenshot, video } from "./commands/web.js";
12
+ import { Ctx, EXIT, exitCodeFor, renderError, UsageError } from "./ctx.js";
13
+ export const CLI_VERSION = "0.0.1";
14
+ const COMMANDS = {
15
+ login: { run: login, summary: "Sign in with the device flow and store a CLI token" },
16
+ logout: { run: logout, summary: "Remove the stored CLI token" },
17
+ whoami: { run: whoami, summary: "Show the credential in use, its org, project and scopes" },
18
+ keys: { run: keys, summary: "List, create, update and revoke API keys" },
19
+ scrape: { run: scrape, summary: "Read a page as Markdown (or HTML, text, links, JSON)" },
20
+ screenshot: { run: screenshot, summary: "Take a styled screenshot and save the image" },
21
+ video: { run: video, summary: "Render a scripted product video and save it" },
22
+ sandbox: { run: sandbox, summary: "Create sandboxes, run commands, open a shell, list and delete" },
23
+ routine: { run: routine, summary: "Deploy routines, run them and read their logs" },
24
+ action: { run: action, summary: "Search, describe and run marketplace actions" },
25
+ mcp: { run: mcp, summary: "Install the B3OS MCP server into Claude, Cursor or Codex; or serve it" },
26
+ bench: { run: bench, summary: "Probe client-side latency of a few calls from here" },
27
+ api: { run: api, summary: "Call any API operation by method and path" },
28
+ };
29
+ function help(ctx) {
30
+ const w = Math.max(...Object.keys(COMMANDS).map((c) => c.length));
31
+ ctx.out([
32
+ `b3os ${CLI_VERSION}: browsers, sandboxes, render, routines and actions next to the model.`,
33
+ "",
34
+ "usage: b3os <command> [options]",
35
+ "",
36
+ ...Object.entries(COMMANDS).map(([name, c]) => ` ${name.padEnd(w)} ${c.summary}`),
37
+ "",
38
+ "Options for every command: --json, --yes, --quiet, --api-key KEY, --base-url URL, --timeout MS, --help",
39
+ "Credentials: --api-key, else B3OS_API_KEY, else the token from b3os login. Inside a B3OS sandbox node",
40
+ "operations go to B3OS_API_URL. On a node they use b3osd's Unix socket when B3OS_SOCKET is set, or when",
41
+ "no key and no base URL are configured (the socket acts as your uid's principal, not a key's).",
42
+ "Exit codes: 0 ok, 1 error, 2 usage, 3 auth, 4 not found, 5 invalid or conflict, 6 rate limited or",
43
+ "out of credits, 7 server or unavailable, 8 timeout, 9 connection, 10 job or remote command failed",
44
+ "(sandbox exec --exit-code passes the remote code through), 130 interrupted.",
45
+ ].join("\n"));
46
+ }
47
+ export async function run(argv, io) {
48
+ const ctx = new Ctx(io ?? {
49
+ stdout: process.stdout,
50
+ stderr: process.stderr,
51
+ stdin: process.stdin,
52
+ });
53
+ const json = argv.includes("--json");
54
+ ctx.json = json;
55
+ const [cmd, ...rest] = argv;
56
+ try {
57
+ if (!cmd || cmd === "help" || cmd === "--help" || cmd === "-h") {
58
+ help(ctx);
59
+ return cmd ? EXIT.OK : EXIT.USAGE;
60
+ }
61
+ if (cmd === "version" || cmd === "--version" || cmd === "-v") {
62
+ if (json)
63
+ ctx.printJson({ cli: CLI_VERSION, sdk: SDK_VERSION, node: process.versions.node });
64
+ else
65
+ ctx.out(`b3os ${CLI_VERSION} (sdk ${SDK_VERSION}, node ${process.versions.node})`);
66
+ return EXIT.OK;
67
+ }
68
+ const c = COMMANDS[cmd];
69
+ if (!c)
70
+ throw new UsageError(`unknown command "${cmd}"; run b3os --help`);
71
+ return await c.run(ctx, rest);
72
+ }
73
+ catch (e) {
74
+ ctx.io.stderr.write(`${renderError(e, json)}\n`);
75
+ return exitCodeFor(e);
76
+ }
77
+ }
78
+ // Run when executed directly (`node src/main.ts`), not when imported (tests, the bin launcher).
79
+ const entry = process.argv[1] ?? "";
80
+ if (/[\\/]src[\\/]main\.ts$/.test(entry)) {
81
+ process.on("SIGINT", () => process.exit(EXIT.INTERRUPTED));
82
+ run(process.argv.slice(2)).then((code) => {
83
+ process.exitCode = code;
84
+ });
85
+ }
86
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,+GAA+G;AAC/G,4GAA4G;AAE5G,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAgB,UAAU,EAAE,MAAM,UAAU,CAAC;AAEzF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAInC,MAAM,QAAQ,GAAsD;IAClE,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,oDAAoD,EAAE;IACpF,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B,EAAE;IAC/D,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,yDAAyD,EAAE;IAC3F,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACxE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,sDAAsD,EAAE;IACxF,UAAU,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,6CAA6C,EAAE;IACvF,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE;IAC7E,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,+DAA+D,EAAE;IACnG,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,+CAA+C,EAAE;IACnF,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,8CAA8C,EAAE;IAChF,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,uEAAuE,EAAE;IACnG,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,oDAAoD,EAAE;IACpF,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,2CAA2C,EAAE;CACxE,CAAC;AAEF,SAAS,IAAI,CAAC,GAAQ;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,GAAG,CACL;QACE,QAAQ,WAAW,wEAAwE;QAC3F,EAAE;QACF,iCAAiC;QACjC,EAAE;QACF,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QACnF,EAAE;QACF,wGAAwG;QACxG,uGAAuG;QACvG,wGAAwG;QACxG,+FAA+F;QAC/F,mGAAmG;QACnG,mGAAmG;QACnG,6EAA6E;KAC9E,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,EAAY;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,EAAE,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CACF,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC7D,IAAI,IAAI;gBAAE,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;;gBACxF,GAAG,CAAC,GAAG,CAAC,QAAQ,WAAW,SAAS,WAAW,UAAU,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;YACxF,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,CAAC;QAC1E,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACpC,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3D,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@b3os/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.0.1",
4
+ "description": "The B3OS command line: scrape, screenshots, videos, sandboxes, routines, actions, keys and MCP setup.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=20"
9
+ },
10
+ "bin": {
11
+ "b3os": "./bin/b3os.js"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "exports": {
20
+ ".": {
21
+ "b3os-source": "./src/main.ts",
22
+ "types": "./dist/main.d.ts",
23
+ "default": "./dist/main.js"
24
+ }
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.build.json",
28
+ "typecheck": "tsc -p tsconfig.json --noEmit",
29
+ "test": "vitest run",
30
+ "dev": "node --conditions=b3os-source src/main.ts"
31
+ },
32
+ "dependencies": {
33
+ "@b3os/mcp": "0.0.1",
34
+ "@b3os/sdk": "0.0.1"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "24.19.2"
38
+ },
39
+ "homepage": "https://beta.b3os.org",
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/b3-fun/b3os-beta.git",
46
+ "directory": "packages/cli"
47
+ }
48
+ }