@oxprotocol/cli 0.1.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.
Files changed (104) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +73 -0
  3. package/dist/cli.d.ts +15 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +109 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/create.d.ts +6 -0
  8. package/dist/commands/create.d.ts.map +1 -0
  9. package/dist/commands/create.js +212 -0
  10. package/dist/commands/create.js.map +1 -0
  11. package/dist/commands/dev.d.ts +2 -0
  12. package/dist/commands/dev.d.ts.map +1 -0
  13. package/dist/commands/dev.js +191 -0
  14. package/dist/commands/dev.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +16 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +197 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/install-url.d.ts +20 -0
  20. package/dist/commands/install-url.d.ts.map +1 -0
  21. package/dist/commands/install-url.js +236 -0
  22. package/dist/commands/install-url.js.map +1 -0
  23. package/dist/commands/install.d.ts +13 -0
  24. package/dist/commands/install.d.ts.map +1 -0
  25. package/dist/commands/install.js +411 -0
  26. package/dist/commands/install.js.map +1 -0
  27. package/dist/commands/keygen.d.ts +13 -0
  28. package/dist/commands/keygen.d.ts.map +1 -0
  29. package/dist/commands/keygen.js +40 -0
  30. package/dist/commands/keygen.js.map +1 -0
  31. package/dist/commands/login.d.ts +21 -0
  32. package/dist/commands/login.d.ts.map +1 -0
  33. package/dist/commands/login.js +224 -0
  34. package/dist/commands/login.js.map +1 -0
  35. package/dist/commands/logout.d.ts +17 -0
  36. package/dist/commands/logout.d.ts.map +1 -0
  37. package/dist/commands/logout.js +70 -0
  38. package/dist/commands/logout.js.map +1 -0
  39. package/dist/commands/pack.d.ts +12 -0
  40. package/dist/commands/pack.d.ts.map +1 -0
  41. package/dist/commands/pack.js +94 -0
  42. package/dist/commands/pack.js.map +1 -0
  43. package/dist/commands/protocol-register.d.ts +29 -0
  44. package/dist/commands/protocol-register.d.ts.map +1 -0
  45. package/dist/commands/protocol-register.js +231 -0
  46. package/dist/commands/protocol-register.js.map +1 -0
  47. package/dist/commands/publish.d.ts +17 -0
  48. package/dist/commands/publish.d.ts.map +1 -0
  49. package/dist/commands/publish.js +188 -0
  50. package/dist/commands/publish.js.map +1 -0
  51. package/dist/commands/token.d.ts +17 -0
  52. package/dist/commands/token.d.ts.map +1 -0
  53. package/dist/commands/token.js +110 -0
  54. package/dist/commands/token.js.map +1 -0
  55. package/dist/commands/whoami.d.ts +13 -0
  56. package/dist/commands/whoami.d.ts.map +1 -0
  57. package/dist/commands/whoami.js +77 -0
  58. package/dist/commands/whoami.js.map +1 -0
  59. package/dist/index.d.ts +26 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +22 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/lib/broadcast.d.ts +41 -0
  64. package/dist/lib/broadcast.d.ts.map +1 -0
  65. package/dist/lib/broadcast.js +45 -0
  66. package/dist/lib/broadcast.js.map +1 -0
  67. package/dist/lib/host-adapter.d.ts +72 -0
  68. package/dist/lib/host-adapter.d.ts.map +1 -0
  69. package/dist/lib/host-adapter.js +193 -0
  70. package/dist/lib/host-adapter.js.map +1 -0
  71. package/dist/lib/host-detect.d.ts +60 -0
  72. package/dist/lib/host-detect.d.ts.map +1 -0
  73. package/dist/lib/host-detect.js +479 -0
  74. package/dist/lib/host-detect.js.map +1 -0
  75. package/dist/lib/oxp-url.d.ts +34 -0
  76. package/dist/lib/oxp-url.d.ts.map +1 -0
  77. package/dist/lib/oxp-url.js +74 -0
  78. package/dist/lib/oxp-url.js.map +1 -0
  79. package/dist/lib/vsx-install.d.ts +41 -0
  80. package/dist/lib/vsx-install.d.ts.map +1 -0
  81. package/dist/lib/vsx-install.js +74 -0
  82. package/dist/lib/vsx-install.js.map +1 -0
  83. package/dist/util.d.ts +10 -0
  84. package/dist/util.d.ts.map +1 -0
  85. package/dist/util.js +64 -0
  86. package/dist/util.js.map +1 -0
  87. package/package.json +48 -0
  88. package/templates/hello-code/README.md +39 -0
  89. package/templates/hello-code/oxp.json +14 -0
  90. package/templates/hello-code/package.json +18 -0
  91. package/templates/hello-code/src/extension.ts +17 -0
  92. package/templates/hello-code/tsconfig.json +20 -0
  93. package/templates/hello-html/README.md +18 -0
  94. package/templates/hello-html/oxp.json +14 -0
  95. package/templates/hello-html/ui/index.html +43 -0
  96. package/templates/hello-rust/Cargo.toml +19 -0
  97. package/templates/hello-rust/README.md +50 -0
  98. package/templates/hello-rust/oxp.json +22 -0
  99. package/templates/hello-rust/src/lib.rs +111 -0
  100. package/templates/hello-rust/wit/deps/oxp-host/oxp-host.wit +136 -0
  101. package/templates/hello-rust/wit/extension.wit +71 -0
  102. package/templates/hello-tree/README.md +15 -0
  103. package/templates/hello-tree/oxp.json +14 -0
  104. package/templates/hello-tree/ui/tree.json +27 -0
@@ -0,0 +1,191 @@
1
+ import { createServer, } from "node:http";
2
+ import { resolve } from "node:path";
3
+ import chokidar from "chokidar";
4
+ import { WebSocketServer } from "ws";
5
+ import { packBundle } from "@oxprotocol/bundle";
6
+ import { findProjectRoot, fail, info } from "../util.js";
7
+ export async function dev(args) {
8
+ // Parse args: [--port N] [dir]
9
+ let port = Number(process.env.OXP_DEV_PORT ?? 7373);
10
+ const positional = [];
11
+ for (let i = 0; i < args.length; i++) {
12
+ const a = args[i];
13
+ if (a === "--port" || a === "-p") {
14
+ const v = args[++i];
15
+ if (!v)
16
+ fail("usage: oxp dev --port <n>");
17
+ port = Number(v);
18
+ }
19
+ else if (a.startsWith("--port=")) {
20
+ port = Number(a.slice("--port=".length));
21
+ }
22
+ else {
23
+ positional.push(a);
24
+ }
25
+ }
26
+ if (!Number.isFinite(port) || port < 1 || port > 65535) {
27
+ fail(`invalid port: ${port}`);
28
+ }
29
+ const startDir = resolve(positional[0] ?? process.cwd());
30
+ const maybeRoot = await findProjectRoot(startDir);
31
+ if (!maybeRoot)
32
+ fail(`no oxp.json found at or above ${startDir}`);
33
+ const root = maybeRoot;
34
+ let state = null;
35
+ let building = false;
36
+ let pendingRebuild = false;
37
+ async function rebuild(reason) {
38
+ if (building) {
39
+ pendingRebuild = true;
40
+ return;
41
+ }
42
+ building = true;
43
+ try {
44
+ const t0 = Date.now();
45
+ const r = await packBundle(root, {});
46
+ state = {
47
+ manifest: r.manifest,
48
+ digest: r.bundleSha256,
49
+ bundle: Buffer.from(r.oxp),
50
+ builtAt: Date.now(),
51
+ };
52
+ const ms = Date.now() - t0;
53
+ info(`↻ packed ${state.manifest.id}@${state.manifest.version} ` +
54
+ `(${state.bundle.length} bytes, sha256:${state.digest.slice(0, 12)}…) ` +
55
+ `in ${ms}ms — ${reason}`);
56
+ broadcast({
57
+ kind: "reload",
58
+ manifest: state.manifest,
59
+ digest: state.digest,
60
+ bundle: state.bundle.toString("base64"),
61
+ builtAt: state.builtAt,
62
+ dev: true,
63
+ });
64
+ }
65
+ catch (err) {
66
+ info(`✖ pack failed: ${err.message}`);
67
+ broadcast({ kind: "error", message: err.message });
68
+ }
69
+ finally {
70
+ building = false;
71
+ if (pendingRebuild) {
72
+ pendingRebuild = false;
73
+ await rebuild("debounced");
74
+ }
75
+ }
76
+ }
77
+ // ── HTTP server ──────────────────────────────────────────────────────────
78
+ const http = createServer((req, res) => handleHttp(req, res, () => state));
79
+ // ── WebSocket server piggy-backs on HTTP ─────────────────────────────────
80
+ const wss = new WebSocketServer({ server: http, path: "/dev" });
81
+ const sockets = new Set();
82
+ wss.on("connection", (ws) => {
83
+ sockets.add(ws);
84
+ info(`+ dev client connected (${sockets.size} total)`);
85
+ if (state) {
86
+ ws.send(JSON.stringify({
87
+ kind: "reload",
88
+ manifest: state.manifest,
89
+ digest: state.digest,
90
+ bundle: state.bundle.toString("base64"),
91
+ builtAt: state.builtAt,
92
+ dev: true,
93
+ }));
94
+ }
95
+ ws.on("close", () => {
96
+ sockets.delete(ws);
97
+ info(`- dev client disconnected (${sockets.size} total)`);
98
+ });
99
+ });
100
+ function broadcast(msg) {
101
+ const json = JSON.stringify(msg);
102
+ for (const ws of sockets) {
103
+ if (ws.readyState === ws.OPEN)
104
+ ws.send(json);
105
+ }
106
+ }
107
+ // ── chokidar watch ───────────────────────────────────────────────────────
108
+ const watcher = chokidar.watch(root, {
109
+ ignored: (p) => /(^|[\\/])(\.git|node_modules|dist\/.*\.oxp|\.next|\.oxp-cache)([\\/]|$)/.test(p),
110
+ ignoreInitial: true,
111
+ });
112
+ let debounce = null;
113
+ watcher.on("all", (event, path) => {
114
+ if (debounce)
115
+ clearTimeout(debounce);
116
+ debounce = setTimeout(() => {
117
+ void rebuild(`${event} ${path.replace(root + "/", "")}`);
118
+ }, 100);
119
+ });
120
+ // ── Initial build + start ────────────────────────────────────────────────
121
+ await rebuild("initial");
122
+ await new Promise((r) => http.listen(port, "127.0.0.1", r));
123
+ info("");
124
+ info("╭───────────────────────────────────────────────────────────╮");
125
+ info("│ oxp dev — DEV MODE (signature bypass, do not ship) │");
126
+ info(`│ ws: ws://localhost:${port}/dev`.padEnd(60) + "│");
127
+ info(`│ http: http://localhost:${port}/info`.padEnd(60) + "│");
128
+ info(`│ root: ${root}`.padEnd(60) + "│");
129
+ info("╰───────────────────────────────────────────────────────────╯");
130
+ info("");
131
+ info("Press Ctrl+C to stop.");
132
+ // Keep alive until SIGINT.
133
+ await new Promise((resolveSig) => {
134
+ const stop = async () => {
135
+ info("\noxp dev: shutting down…");
136
+ await watcher.close();
137
+ for (const ws of sockets)
138
+ ws.terminate();
139
+ wss.close();
140
+ http.close();
141
+ resolveSig();
142
+ };
143
+ process.on("SIGINT", stop);
144
+ process.on("SIGTERM", stop);
145
+ });
146
+ return 0;
147
+ }
148
+ // ── HTTP handler ───────────────────────────────────────────────────────────
149
+ function handleHttp(req, res, getState) {
150
+ res.setHeader("access-control-allow-origin", "*");
151
+ const url = new URL(req.url ?? "/", "http://localhost");
152
+ const state = getState();
153
+ switch (url.pathname) {
154
+ case "/info":
155
+ if (!state)
156
+ return send(res, 503, { error: "not built yet" });
157
+ return send(res, 200, {
158
+ dev: true,
159
+ manifest: state.manifest,
160
+ digest: state.digest,
161
+ bundleSize: state.bundle.length,
162
+ builtAt: state.builtAt,
163
+ });
164
+ case "/manifest":
165
+ if (!state)
166
+ return send(res, 503, { error: "not built yet" });
167
+ return send(res, 200, state.manifest);
168
+ case "/bundle":
169
+ if (!state)
170
+ return send(res, 503, { error: "not built yet" });
171
+ res.statusCode = 200;
172
+ res.setHeader("content-type", "application/x-oxp+zstd");
173
+ res.setHeader("x-oxp-digest", `sha256:${state.digest}`);
174
+ res.setHeader("x-oxp-dev", "true");
175
+ res.end(state.bundle);
176
+ return;
177
+ case "/":
178
+ return send(res, 200, {
179
+ service: "oxp dev",
180
+ endpoints: ["/info", "/manifest", "/bundle", "/dev (ws)"],
181
+ });
182
+ default:
183
+ return send(res, 404, { error: "not found" });
184
+ }
185
+ }
186
+ function send(res, status, body) {
187
+ res.statusCode = status;
188
+ res.setHeader("content-type", "application/json");
189
+ res.end(JSON.stringify(body));
190
+ }
191
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `oxp doctor` — print a health summary so users (and support tickets) can
3
+ * answer "what does my setup look like?" in one command.
4
+ *
5
+ * Reports:
6
+ * - CLI version & node version
7
+ * - Registry URL & login state (handle, scopes, expiry)
8
+ * - OXP_HOME location, runtime binary, store layout
9
+ * - Detected IDEs and host-adapter status (read-only — never installs)
10
+ *
11
+ * Always exits 0 on a successful report; non-zero only when the doctor
12
+ * itself crashes. Issues are presented in the report, not via exit code,
13
+ * so pipelines can still capture the JSON output.
14
+ */
15
+ export declare function doctor(args: string[]): Promise<number>;
16
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAuBH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAmJ5D"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * `oxp doctor` — print a health summary so users (and support tickets) can
3
+ * answer "what does my setup look like?" in one command.
4
+ *
5
+ * Reports:
6
+ * - CLI version & node version
7
+ * - Registry URL & login state (handle, scopes, expiry)
8
+ * - OXP_HOME location, runtime binary, store layout
9
+ * - Detected IDEs and host-adapter status (read-only — never installs)
10
+ *
11
+ * Always exits 0 on a successful report; non-zero only when the doctor
12
+ * itself crashes. Issues are presented in the report, not via exit code,
13
+ * so pipelines can still capture the JSON output.
14
+ */
15
+ import { promises as fs } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { homedir, platform, release } from "node:os";
18
+ import { detectHosts } from "../lib/host-detect.js";
19
+ import { ensureAdapters } from "../lib/host-adapter.js";
20
+ import { info, oxpHome, readCredentials, registryUrl } from "../util.js";
21
+ const HELP = `oxp doctor [--json] Inspect this machine and report what OXP can see
22
+
23
+ Flags:
24
+ --json Emit a machine-readable JSON report on a single line.
25
+ `;
26
+ export async function doctor(args) {
27
+ if (args[0] === "-h" || args[0] === "--help") {
28
+ process.stdout.write(HELP);
29
+ return 0;
30
+ }
31
+ const json = args.includes("--json");
32
+ const home = oxpHome();
33
+ const reg = registryUrl();
34
+ const tokenPresent = !!(await readCredentials());
35
+ // Best-effort whoami (registry might be down — fall through silently).
36
+ let who = null;
37
+ if (tokenPresent) {
38
+ try {
39
+ const ctl = new AbortController();
40
+ const timer = setTimeout(() => ctl.abort(), 3_000);
41
+ const tok = await readCredentials();
42
+ const r = await fetch(`${reg}/api/v1/auth/whoami`, {
43
+ headers: { authorization: `Bearer ${tok ?? ""}` },
44
+ signal: ctl.signal,
45
+ }).finally(() => clearTimeout(timer));
46
+ if (r.ok)
47
+ who = (await r.json());
48
+ }
49
+ catch {
50
+ // network/DNS error — leave who as null
51
+ }
52
+ }
53
+ // Filesystem layout — every path is reported with present:true|false so
54
+ // the user knows what's there and what isn't.
55
+ const paths = await reportPaths(home);
56
+ // Detect IDEs (skip running-process probe to keep the doctor cheap).
57
+ const detected = await detectHosts({ skipProcessProbe: false });
58
+ const adapters = await ensureAdapters(detected, { reportOnly: true });
59
+ if (json) {
60
+ process.stdout.write(JSON.stringify({
61
+ ok: true,
62
+ cli: {
63
+ version: "0.1.0",
64
+ node: process.version,
65
+ platform: platform(),
66
+ release: release(),
67
+ },
68
+ registry: {
69
+ url: reg,
70
+ loggedIn: tokenPresent,
71
+ handle: who?.handle ?? null,
72
+ scopes: who?.token?.scopes ?? [],
73
+ expiresAt: who?.token?.expiresAt ?? null,
74
+ },
75
+ oxpHome: home,
76
+ paths,
77
+ hosts: adapters.map((a) => ({
78
+ id: a.host.id,
79
+ name: a.host.displayName,
80
+ family: a.host.family,
81
+ installed: a.host.installed,
82
+ running: a.host.running,
83
+ cliPath: a.host.cliPath ?? null,
84
+ userDataDir: a.host.userDataDir ?? null,
85
+ extensionsDir: a.host.extensionsDir ?? null,
86
+ adapter: a.status,
87
+ adapterReason: a.status === "unavailable"
88
+ ? a.reason
89
+ : a.status === "failed"
90
+ ? a.error
91
+ : undefined,
92
+ })),
93
+ }) + "\n");
94
+ return 0;
95
+ }
96
+ info(`OXP doctor`);
97
+ info(`──────────────────────────────────────────────────────────`);
98
+ info(`CLI: v0.1.0 · node ${process.version} · ${platform()} ${release()}`);
99
+ info(`Registry: ${reg}`);
100
+ if (tokenPresent && who?.handle) {
101
+ info(`Logged in: @${who.handle}` +
102
+ (who.token?.expiresAt ? ` (expires ${who.token.expiresAt})` : ""));
103
+ if (who.token?.scopes?.length)
104
+ info(`Scopes: ${who.token.scopes.join(", ")}`);
105
+ }
106
+ else if (tokenPresent) {
107
+ info(`Logged in: yes (registry unreachable — could not verify)`);
108
+ }
109
+ else {
110
+ info(`Logged in: no (run \`oxp login\` to publish)`);
111
+ }
112
+ info(``);
113
+ info(`Filesystem (OXP_HOME = ${home}):`);
114
+ for (const p of paths) {
115
+ const tag = p.present ? "✓" : "✗";
116
+ info(` ${tag} ${p.label.padEnd(22)} ${p.path}`);
117
+ }
118
+ info(``);
119
+ info(`IDEs detected:`);
120
+ if (adapters.length === 0) {
121
+ info(` (none) — install VS Code, JetBrains, or Neovim to use OXP extensions`);
122
+ }
123
+ else {
124
+ for (const a of adapters) {
125
+ const run = a.host.running ? " · running" : "";
126
+ const part = a.host.partial ? " · partial" : "";
127
+ let adapterTail;
128
+ switch (a.status) {
129
+ case "present":
130
+ adapterTail = "adapter ✓";
131
+ break;
132
+ case "installed":
133
+ adapterTail = "adapter installed";
134
+ break;
135
+ case "unsupported":
136
+ adapterTail = "adapter ✗ (unsupported family)";
137
+ break;
138
+ case "unavailable":
139
+ adapterTail = `adapter ⊘ (${a.reason})`;
140
+ break;
141
+ case "failed":
142
+ adapterTail = `adapter ✗ (${a.error})`;
143
+ break;
144
+ }
145
+ info(` • ${a.host.displayName.padEnd(28)} ${adapterTail}${run}${part}`);
146
+ if (a.host.cliPath)
147
+ info(` cli: ${a.host.cliPath}`);
148
+ if (a.host.userDataDir)
149
+ info(` data: ${a.host.userDataDir}`);
150
+ }
151
+ }
152
+ info(``);
153
+ info(`Next steps:`);
154
+ if (!tokenPresent)
155
+ info(` • run \`oxp login\` to publish extensions`);
156
+ if (adapters.every((a) => a.status !== "present" && a.status !== "installed")) {
157
+ info(` • host adapters will auto-install once they're on the marketplaces`);
158
+ }
159
+ info(` • run \`oxp install <id>\` to install an extension`);
160
+ info(` • run \`oxp create <name>\` to start a new extension`);
161
+ return 0;
162
+ }
163
+ async function reportPaths(home) {
164
+ const items = [
165
+ { label: "credentials", path: join(home, "credentials") },
166
+ { label: "publisher key", path: join(home, "keys", "publisher.json") },
167
+ { label: "host-store", path: join(home, "host-store") },
168
+ { label: " extensions/", path: join(home, "host-store", "extensions") },
169
+ {
170
+ label: " url-installs/",
171
+ path: join(home, "host-store", "url-installs"),
172
+ },
173
+ { label: "cache", path: join(home, "cache") },
174
+ {
175
+ label: "runtime (env)",
176
+ path: process.env.OXP_RUNTIME ?? "(OXP_RUNTIME unset)",
177
+ },
178
+ ];
179
+ const out = [];
180
+ for (const it of items) {
181
+ const present = it.path.startsWith("(") ? false : await pathExists(it.path);
182
+ out.push({ ...it, present });
183
+ }
184
+ return out;
185
+ }
186
+ async function pathExists(p) {
187
+ try {
188
+ await fs.stat(p);
189
+ return true;
190
+ }
191
+ catch {
192
+ return false;
193
+ }
194
+ }
195
+ // Suppress unused-import warning when the helper above isn't used.
196
+ void homedir;
197
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `oxp install-url <url>` — install a raw `.wasm` component from a URL into
3
+ * the shared host store, so any installed IDE host (VS Code, JetBrains)
4
+ * can list and activate it without re-downloading.
5
+ *
6
+ * Source schemes:
7
+ * https://…wasm always allowed
8
+ * file://…wasm always allowed
9
+ * http://…wasm only when --insecure-http (or host is localhost / 127.0.0.1 / ::1)
10
+ *
11
+ * Storage:
12
+ * $OXP_HOME/host-store/url-installs/<sha256>/bundle.wasm
13
+ * $OXP_HOME/host-store/url-installs/<sha256>/meta.json
14
+ *
15
+ * This sidesteps the registry / signature pipeline; the caller is trusting
16
+ * the URL. Hosts still gate activation with the permission prompt before
17
+ * loading the bytes into the runtime.
18
+ */
19
+ export declare function installUrl(args: string[]): Promise<number>;
20
+ //# sourceMappingURL=install-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-url.d.ts","sourceRoot":"","sources":["../../src/commands/install-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqGH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4IhE"}