@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,479 @@
1
+ /**
2
+ * Host detection — discover IDEs installed on the user's machine.
3
+ *
4
+ * The OXP install flow needs to know which editors are present so it can
5
+ * (a) ensure the OXP host adapter is installed for each one, and
6
+ * (b) report which environments the freshly-installed extension is now
7
+ * available in.
8
+ *
9
+ * Detection is **silent** and **best-effort**: a missing IDE is not an
10
+ * error, and we never spawn a long-running probe. We look for the
11
+ * canonical CLI binary on PATH and the canonical user-data / extensions
12
+ * directories for each platform. If both exist we consider the IDE
13
+ * installed; if only one is present the host is reported with
14
+ * `partial: true` so the caller can decide whether to skip it.
15
+ *
16
+ * Supported families today:
17
+ * - VS Code, Cursor, Windsurf, VSCodium, VS Code Insiders
18
+ * (all share the same extension format → adapter VSIX is reusable)
19
+ *
20
+ * JetBrains, Zed, Theia, Gitpod, Coder are placeholders — detection is
21
+ * stubbed so the surface stays stable as we add real probes.
22
+ */
23
+ import { promises as fs } from "node:fs";
24
+ import { homedir, platform } from "node:os";
25
+ import { join } from "node:path";
26
+ import { execFile } from "node:child_process";
27
+ import { promisify } from "node:util";
28
+ const exec = promisify(execFile);
29
+ const VSCODE_FAMILY = [
30
+ {
31
+ id: "vscode",
32
+ displayName: "VS Code",
33
+ bin: ["code"],
34
+ macApps: ["Visual Studio Code.app"],
35
+ userDataSubdir: "Code",
36
+ extensionsSubdir: ".vscode/extensions",
37
+ processFragment: "Visual Studio Code",
38
+ },
39
+ {
40
+ id: "vscode",
41
+ displayName: "VS Code Insiders",
42
+ bin: ["code-insiders"],
43
+ macApps: ["Visual Studio Code - Insiders.app"],
44
+ userDataSubdir: "Code - Insiders",
45
+ extensionsSubdir: ".vscode-insiders/extensions",
46
+ processFragment: "Visual Studio Code - Insiders",
47
+ },
48
+ {
49
+ id: "cursor",
50
+ displayName: "Cursor",
51
+ bin: ["cursor"],
52
+ macApps: ["Cursor.app"],
53
+ userDataSubdir: "Cursor",
54
+ extensionsSubdir: ".cursor/extensions",
55
+ processFragment: "Cursor",
56
+ },
57
+ {
58
+ id: "windsurf",
59
+ displayName: "Windsurf",
60
+ bin: ["windsurf"],
61
+ macApps: ["Windsurf.app"],
62
+ userDataSubdir: "Windsurf",
63
+ extensionsSubdir: ".windsurf/extensions",
64
+ processFragment: "Windsurf",
65
+ },
66
+ {
67
+ id: "vscodium",
68
+ displayName: "VSCodium",
69
+ bin: ["codium"],
70
+ macApps: ["VSCodium.app"],
71
+ userDataSubdir: "VSCodium",
72
+ extensionsSubdir: ".vscode-oss/extensions",
73
+ processFragment: "VSCodium",
74
+ },
75
+ ];
76
+ /**
77
+ * Discover every supported IDE on the current machine. Returns only
78
+ * hosts where we found *some* evidence of installation; absent IDEs are
79
+ * silently omitted. Order is stable: VS Code family first (in the
80
+ * declaration order above), then everything else.
81
+ */
82
+ export async function detectHosts(opts = {}) {
83
+ const found = [];
84
+ // Capture process list once so we can tag every host without paying the
85
+ // exec cost N times.
86
+ const procList = opts.skipProcessProbe ? "" : await snapshotProcesses();
87
+ for (const entry of VSCODE_FAMILY) {
88
+ const host = await detectVSCodeFamily(entry, procList);
89
+ if (host)
90
+ found.push(host);
91
+ }
92
+ // JetBrains family — installs are per-product per-year (IntelliJIdea2025.2,
93
+ // WebStorm2024.3, etc.). We collapse them into a single `jetbrains` entry
94
+ // keyed on the newest installation found.
95
+ const jb = await detectJetBrains(procList);
96
+ if (jb)
97
+ found.push(jb);
98
+ // Neovim — `nvim` on PATH plus a config dir.
99
+ const nv = await detectNeovim(procList);
100
+ if (nv)
101
+ found.push(nv);
102
+ return found;
103
+ }
104
+ /**
105
+ * Look up a single host by id. Convenience for `oxp install --host vscode`.
106
+ * Returns undefined when not installed.
107
+ */
108
+ export async function detectHost(id) {
109
+ const all = await detectHosts();
110
+ return all.find((h) => h.id === id);
111
+ }
112
+ /* -------------------------------------------------------------------------- */
113
+ /* VS Code family probes */
114
+ /* -------------------------------------------------------------------------- */
115
+ async function detectVSCodeFamily(entry, procList) {
116
+ const cliPath = await findCli(entry);
117
+ const userDataDir = vscodeUserDataDir(entry.userDataSubdir);
118
+ const extensionsDir = vscodeExtensionsDir(entry.extensionsSubdir);
119
+ const userDataExists = await pathExists(userDataDir);
120
+ const extDirExists = await pathExists(extensionsDir);
121
+ const haveCli = !!cliPath;
122
+ const haveData = userDataExists || extDirExists;
123
+ if (!haveCli && !haveData)
124
+ return undefined;
125
+ const running = procList.length > 0 && procList.includes(entry.processFragment);
126
+ return {
127
+ id: entry.id,
128
+ displayName: entry.displayName,
129
+ family: "vscode",
130
+ cliPath,
131
+ extensionsDir: extDirExists ? extensionsDir : undefined,
132
+ userDataDir: userDataExists ? userDataDir : undefined,
133
+ installed: haveCli && haveData,
134
+ partial: !(haveCli && haveData),
135
+ running,
136
+ };
137
+ }
138
+ /* -------------------------------------------------------------------------- */
139
+ /* Path helpers */
140
+ /* -------------------------------------------------------------------------- */
141
+ function vscodeUserDataDir(subdir) {
142
+ switch (platform()) {
143
+ case "darwin":
144
+ return join(homedir(), "Library", "Application Support", subdir);
145
+ case "win32":
146
+ return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), subdir);
147
+ default:
148
+ return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), subdir);
149
+ }
150
+ }
151
+ function vscodeExtensionsDir(subdir) {
152
+ return join(homedir(), subdir);
153
+ }
154
+ /* -------------------------------------------------------------------------- */
155
+ /* CLI discovery */
156
+ /* -------------------------------------------------------------------------- */
157
+ async function findCli(entry) {
158
+ // 1) macOS app bundles ship the CLI inside Contents/Resources/app/bin
159
+ if (platform() === "darwin") {
160
+ for (const app of entry.macApps) {
161
+ for (const root of ["/Applications", join(homedir(), "Applications")]) {
162
+ for (const bin of entry.bin) {
163
+ const p = join(root, app, "Contents", "Resources", "app", "bin", bin);
164
+ if (await pathExists(p))
165
+ return p;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ // 2) Anything on PATH wins next.
171
+ for (const bin of entry.bin) {
172
+ const p = await whichBinary(bin);
173
+ if (p)
174
+ return p;
175
+ }
176
+ // 3) Common Linux/Windows install locations as a final fallback.
177
+ const candidates = platformFallbackBins(entry);
178
+ for (const p of candidates) {
179
+ if (await pathExists(p))
180
+ return p;
181
+ }
182
+ return undefined;
183
+ }
184
+ function platformFallbackBins(entry) {
185
+ if (platform() === "win32") {
186
+ const local = process.env.LOCALAPPDATA ?? join(homedir(), "AppData", "Local");
187
+ const programs = process.env.ProgramFiles ?? "C:\\Program Files";
188
+ return entry.bin.flatMap((b) => [
189
+ join(local, "Programs", entry.displayName, "bin", `${b}.cmd`),
190
+ join(programs, entry.displayName, "bin", `${b}.cmd`),
191
+ ]);
192
+ }
193
+ // Linux / other unix
194
+ return entry.bin.flatMap((b) => [
195
+ `/usr/bin/${b}`,
196
+ `/usr/local/bin/${b}`,
197
+ `/snap/bin/${b}`,
198
+ `/var/lib/flatpak/exports/bin/${b}`,
199
+ ]);
200
+ }
201
+ async function whichBinary(bin) {
202
+ // Prefer `command -v` over `which` — it's a POSIX builtin and works in
203
+ // restricted PATHs. On Windows we fall back to `where`.
204
+ const cmd = platform() === "win32" ? "where" : "command";
205
+ const args = platform() === "win32" ? [bin] : ["-v", bin];
206
+ try {
207
+ const { stdout } = await exec(cmd, args, {
208
+ shell: platform() !== "win32", // `command` is a builtin
209
+ timeout: 1500,
210
+ });
211
+ const first = stdout.split(/\r?\n/).find((s) => s.trim().length > 0);
212
+ return first?.trim() || undefined;
213
+ }
214
+ catch {
215
+ return undefined;
216
+ }
217
+ }
218
+ /* -------------------------------------------------------------------------- */
219
+ /* Process probe */
220
+ /* -------------------------------------------------------------------------- */
221
+ async function snapshotProcesses() {
222
+ try {
223
+ if (platform() === "win32") {
224
+ const { stdout } = await exec("tasklist", [], { timeout: 2000 });
225
+ return stdout;
226
+ }
227
+ const { stdout } = await exec("ps", ["-Aco", "command"], { timeout: 2000 });
228
+ return stdout;
229
+ }
230
+ catch {
231
+ return "";
232
+ }
233
+ }
234
+ /* -------------------------------------------------------------------------- */
235
+ /* fs helpers */
236
+ /* -------------------------------------------------------------------------- */
237
+ async function pathExists(p) {
238
+ try {
239
+ await fs.stat(p);
240
+ return true;
241
+ }
242
+ catch {
243
+ return false;
244
+ }
245
+ }
246
+ const JETBRAINS_PRODUCTS = [
247
+ {
248
+ configPrefix: "IntelliJIdea",
249
+ macApp: "IntelliJ IDEA.app",
250
+ bin: ["idea"],
251
+ displayName: "IntelliJ IDEA",
252
+ processFragment: "idea",
253
+ },
254
+ {
255
+ configPrefix: "IntelliJIdea",
256
+ macApp: "IntelliJ IDEA Ultimate.app",
257
+ bin: ["idea"],
258
+ displayName: "IntelliJ IDEA",
259
+ processFragment: "idea",
260
+ },
261
+ {
262
+ configPrefix: "IdeaIC",
263
+ macApp: "IntelliJ IDEA CE.app",
264
+ bin: ["idea"],
265
+ displayName: "IntelliJ IDEA CE",
266
+ processFragment: "idea",
267
+ },
268
+ {
269
+ configPrefix: "WebStorm",
270
+ macApp: "WebStorm.app",
271
+ bin: ["webstorm"],
272
+ displayName: "WebStorm",
273
+ processFragment: "webstorm",
274
+ },
275
+ {
276
+ configPrefix: "PyCharm",
277
+ macApp: "PyCharm.app",
278
+ bin: ["pycharm"],
279
+ displayName: "PyCharm",
280
+ processFragment: "pycharm",
281
+ },
282
+ {
283
+ configPrefix: "PyCharmCE",
284
+ macApp: "PyCharm CE.app",
285
+ bin: ["pycharm"],
286
+ displayName: "PyCharm CE",
287
+ processFragment: "pycharm",
288
+ },
289
+ {
290
+ configPrefix: "GoLand",
291
+ macApp: "GoLand.app",
292
+ bin: ["goland"],
293
+ displayName: "GoLand",
294
+ processFragment: "goland",
295
+ },
296
+ {
297
+ configPrefix: "RustRover",
298
+ macApp: "RustRover.app",
299
+ bin: ["rustrover"],
300
+ displayName: "RustRover",
301
+ processFragment: "rustrover",
302
+ },
303
+ {
304
+ configPrefix: "CLion",
305
+ macApp: "CLion.app",
306
+ bin: ["clion"],
307
+ displayName: "CLion",
308
+ processFragment: "clion",
309
+ },
310
+ {
311
+ configPrefix: "RubyMine",
312
+ macApp: "RubyMine.app",
313
+ bin: ["mine"],
314
+ displayName: "RubyMine",
315
+ processFragment: "rubymine",
316
+ },
317
+ {
318
+ configPrefix: "PhpStorm",
319
+ macApp: "PhpStorm.app",
320
+ bin: ["pstorm"],
321
+ displayName: "PhpStorm",
322
+ processFragment: "phpstorm",
323
+ },
324
+ {
325
+ configPrefix: "DataGrip",
326
+ macApp: "DataGrip.app",
327
+ bin: ["datagrip"],
328
+ displayName: "DataGrip",
329
+ processFragment: "datagrip",
330
+ },
331
+ {
332
+ configPrefix: "Rider",
333
+ macApp: "Rider.app",
334
+ bin: ["rider"],
335
+ displayName: "Rider",
336
+ processFragment: "rider",
337
+ },
338
+ ];
339
+ async function detectJetBrains(procList) {
340
+ const configRoot = jetBrainsConfigRoot();
341
+ let configDirs = [];
342
+ try {
343
+ const entries = await fs.readdir(configRoot, { withFileTypes: true });
344
+ configDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
345
+ }
346
+ catch {
347
+ // No JetBrains configs at all → no JetBrains products installed.
348
+ }
349
+ // Find the newest config dir matching any known product prefix. The
350
+ // dir name format is `<Prefix><Year>.<Minor>` (e.g. IntelliJIdea2025.2).
351
+ let bestProduct;
352
+ let bestConfig;
353
+ let bestVersion = "";
354
+ for (const dir of configDirs) {
355
+ for (const p of JETBRAINS_PRODUCTS) {
356
+ if (!dir.startsWith(p.configPrefix))
357
+ continue;
358
+ const ver = dir.slice(p.configPrefix.length);
359
+ if (!/^\d{4}\.\d+$/.test(ver))
360
+ continue;
361
+ if (compareJbVersion(ver, bestVersion) > 0) {
362
+ bestProduct = p;
363
+ bestConfig = dir;
364
+ bestVersion = ver;
365
+ }
366
+ }
367
+ }
368
+ // Also probe for an .app bundle on macOS even if no config dir exists yet.
369
+ let cliPath;
370
+ let macAppFound;
371
+ if (platform() === "darwin") {
372
+ for (const p of JETBRAINS_PRODUCTS) {
373
+ for (const root of ["/Applications", join(homedir(), "Applications")]) {
374
+ const app = join(root, p.macApp);
375
+ if (await pathExists(app)) {
376
+ macAppFound ??= p;
377
+ // JetBrains ships a tiny launcher script under MacOS/<bin>
378
+ for (const bin of p.bin) {
379
+ const candidate = join(app, "Contents", "MacOS", bin);
380
+ if (await pathExists(candidate)) {
381
+ cliPath ??= candidate;
382
+ break;
383
+ }
384
+ }
385
+ break;
386
+ }
387
+ }
388
+ }
389
+ }
390
+ // PATH lookup last (Toolbox often installs `idea`, `webstorm` shims).
391
+ if (!cliPath) {
392
+ const product = bestProduct ?? macAppFound;
393
+ if (product) {
394
+ for (const bin of product.bin) {
395
+ const p = await whichBinary(bin);
396
+ if (p) {
397
+ cliPath = p;
398
+ break;
399
+ }
400
+ }
401
+ }
402
+ }
403
+ const product = bestProduct ?? macAppFound;
404
+ if (!product && !cliPath && !bestConfig)
405
+ return undefined;
406
+ const userDataDir = bestConfig ? join(configRoot, bestConfig) : undefined;
407
+ const extensionsDir = userDataDir ? join(userDataDir, "plugins") : undefined;
408
+ const haveData = !!userDataDir && (await pathExists(userDataDir));
409
+ const haveCli = !!cliPath;
410
+ const running = procList.length > 0 &&
411
+ !!product &&
412
+ procList.toLowerCase().includes(product.processFragment);
413
+ return {
414
+ id: "jetbrains",
415
+ displayName: product
416
+ ? bestVersion
417
+ ? `${product.displayName} ${bestVersion}`
418
+ : product.displayName
419
+ : "JetBrains IDE",
420
+ family: "jetbrains",
421
+ cliPath,
422
+ extensionsDir,
423
+ userDataDir,
424
+ installed: haveCli && haveData,
425
+ partial: !(haveCli && haveData),
426
+ running,
427
+ };
428
+ }
429
+ function jetBrainsConfigRoot() {
430
+ switch (platform()) {
431
+ case "darwin":
432
+ return join(homedir(), "Library", "Application Support", "JetBrains");
433
+ case "win32":
434
+ return join(process.env.APPDATA ?? join(homedir(), "AppData", "Roaming"), "JetBrains");
435
+ default:
436
+ return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "JetBrains");
437
+ }
438
+ }
439
+ /** Compare "2025.2" vs "2024.3" — newer wins. Empty string sorts lowest. */
440
+ function compareJbVersion(a, b) {
441
+ if (!a)
442
+ return -1;
443
+ if (!b)
444
+ return 1;
445
+ const [ay, am] = a.split(".").map(Number);
446
+ const [by, bm] = b.split(".").map(Number);
447
+ if ((ay ?? 0) !== (by ?? 0))
448
+ return (ay ?? 0) - (by ?? 0);
449
+ return (am ?? 0) - (bm ?? 0);
450
+ }
451
+ /* -------------------------------------------------------------------------- */
452
+ /* Neovim probe */
453
+ /* -------------------------------------------------------------------------- */
454
+ async function detectNeovim(procList) {
455
+ const cliPath = await whichBinary("nvim");
456
+ const configDir = platform() === "win32"
457
+ ? join(process.env.LOCALAPPDATA ?? join(homedir(), "AppData", "Local"), "nvim")
458
+ : join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "nvim");
459
+ const dataDir = platform() === "win32"
460
+ ? join(process.env.LOCALAPPDATA ?? join(homedir(), "AppData", "Local"), "nvim-data")
461
+ : join(process.env.XDG_DATA_HOME ?? join(homedir(), ".local", "share"), "nvim");
462
+ const haveConfig = await pathExists(configDir);
463
+ const haveData = await pathExists(dataDir);
464
+ if (!cliPath && !haveConfig && !haveData)
465
+ return undefined;
466
+ const running = procList.length > 0 && /\bnvim\b/.test(procList);
467
+ return {
468
+ id: "neovim",
469
+ displayName: "Neovim",
470
+ family: "other",
471
+ cliPath,
472
+ extensionsDir: haveData ? dataDir : undefined,
473
+ userDataDir: haveConfig ? configDir : undefined,
474
+ installed: !!cliPath && haveConfig,
475
+ partial: !(cliPath && haveConfig),
476
+ running,
477
+ };
478
+ }
479
+ //# sourceMappingURL=host-detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-detect.js","sourceRoot":"","sources":["../../src/lib/host-detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `oxp://` deep-link parser.
3
+ *
4
+ * Supported forms:
5
+ *
6
+ * oxp://install/@publisher/slug
7
+ * oxp://install/@publisher/slug?version=1.2.3
8
+ * oxp://install/@publisher/slug?version=1.2.3&host=vscode&host=cursor
9
+ *
10
+ * The web side (`apps/web`) emits these as the target of "Install"
11
+ * buttons. The OS routes the URL to whichever app has registered the
12
+ * `oxp` scheme — for us, the helper produced by `oxp protocol-register`,
13
+ * which simply re-invokes `oxp install --from <url>`.
14
+ *
15
+ * Strict parsing on purpose: a bad URL fails fast rather than letting a
16
+ * malformed click mutate the install store.
17
+ */
18
+ export interface InstallUrl {
19
+ kind: "install";
20
+ id: string;
21
+ version?: string;
22
+ hosts?: string[];
23
+ }
24
+ export type ParsedOxpUrl = InstallUrl;
25
+ export declare class OxpUrlError extends Error {
26
+ constructor(message: string);
27
+ }
28
+ export declare function parseOxpUrl(input: string): ParsedOxpUrl;
29
+ /** Build a canonical install URL — used by the web button helper. */
30
+ export declare function buildInstallUrl(id: string, opts?: {
31
+ version?: string;
32
+ hosts?: string[];
33
+ }): string;
34
+ //# sourceMappingURL=oxp-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxp-url.d.ts","sourceRoot":"","sources":["../../src/lib/oxp-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC;AAEtC,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CA2CvD;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GAChD,MAAM,CAMR"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * `oxp://` deep-link parser.
3
+ *
4
+ * Supported forms:
5
+ *
6
+ * oxp://install/@publisher/slug
7
+ * oxp://install/@publisher/slug?version=1.2.3
8
+ * oxp://install/@publisher/slug?version=1.2.3&host=vscode&host=cursor
9
+ *
10
+ * The web side (`apps/web`) emits these as the target of "Install"
11
+ * buttons. The OS routes the URL to whichever app has registered the
12
+ * `oxp` scheme — for us, the helper produced by `oxp protocol-register`,
13
+ * which simply re-invokes `oxp install --from <url>`.
14
+ *
15
+ * Strict parsing on purpose: a bad URL fails fast rather than letting a
16
+ * malformed click mutate the install store.
17
+ */
18
+ export class OxpUrlError extends Error {
19
+ constructor(message) {
20
+ super(message);
21
+ this.name = "OxpUrlError";
22
+ }
23
+ }
24
+ const ID_RE = /^@[^/\s]+\/[^/\s?#]+$/;
25
+ export function parseOxpUrl(input) {
26
+ let url;
27
+ try {
28
+ url = new URL(input);
29
+ }
30
+ catch {
31
+ throw new OxpUrlError(`not a valid URL: ${input}`);
32
+ }
33
+ if (url.protocol !== "oxp:") {
34
+ throw new OxpUrlError(`expected oxp:// scheme, got ${url.protocol}`);
35
+ }
36
+ // `new URL("oxp://install/@p/s")` parses host="install" and pathname="/@p/s".
37
+ const action = url.host || url.hostname;
38
+ if (action !== "install") {
39
+ throw new OxpUrlError(`unknown action '${action}' (expected 'install')`);
40
+ }
41
+ // Strip leading slash; everything after is `@publisher/slug`.
42
+ const id = decodeURIComponent(url.pathname.replace(/^\/+/, ""));
43
+ if (!ID_RE.test(id)) {
44
+ throw new OxpUrlError(`bad extension id '${id}' — expected @publisher/slug`);
45
+ }
46
+ const version = url.searchParams.get("version") ?? undefined;
47
+ if (version && !/^[A-Za-z0-9.\-+]+$/.test(version)) {
48
+ throw new OxpUrlError(`bad version '${version}'`);
49
+ }
50
+ const hosts = url.searchParams.getAll("host");
51
+ for (const h of hosts) {
52
+ if (!/^[a-z0-9-]+$/.test(h)) {
53
+ throw new OxpUrlError(`bad host filter '${h}'`);
54
+ }
55
+ }
56
+ return {
57
+ kind: "install",
58
+ id,
59
+ version,
60
+ hosts: hosts.length ? hosts : undefined,
61
+ };
62
+ }
63
+ /** Build a canonical install URL — used by the web button helper. */
64
+ export function buildInstallUrl(id, opts = {}) {
65
+ if (!ID_RE.test(id))
66
+ throw new OxpUrlError(`bad id ${id}`);
67
+ const url = new URL(`oxp://install/${id}`);
68
+ if (opts.version)
69
+ url.searchParams.set("version", opts.version);
70
+ for (const h of opts.hosts ?? [])
71
+ url.searchParams.append("host", h);
72
+ return url.toString();
73
+ }
74
+ //# sourceMappingURL=oxp-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oxp-url.js","sourceRoot":"","sources":["../../src/lib/oxp-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,WAAW,CAAC,+BAA+B,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CAAC,mBAAmB,MAAM,wBAAwB,CAAC,CAAC;IAC3E,CAAC;IAED,8DAA8D;IAC9D,MAAM,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CACnB,qBAAqB,EAAE,8BAA8B,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC;IAC7D,IAAI,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,WAAW,CAAC,gBAAgB,OAAO,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,SAAS;QACf,EAAE;QACF,OAAO;QACP,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACxC,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,OAA+C,EAAE;IAEjD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAO;QAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;QAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * VSX install adapter — handles `oxp install @publisher/slug` for entries
3
+ * that are mirrored from Open VSX rather than published natively to OXP.
4
+ *
5
+ * Strategy:
6
+ * 1. Caller pre-fetched `/api/v1/extensions/<publisher>/<slug>` and
7
+ * saw a `vsx` block in the response → call `installVsx()`.
8
+ * 2. We detect the user's VS Code-family IDEs (already done by the
9
+ * install command) and run `<cli> --install-extension <ns>.<name>`
10
+ * against each one. The IDE's own install path handles VSIX fetch,
11
+ * signature checks (or lack thereof), and registration.
12
+ * 3. We DO NOT touch the OXP shared host-store — VSX extensions are
13
+ * not OXP wasm components and have no oxp.json runtime contract.
14
+ *
15
+ * This keeps the CLI honest: VSX entries are explicitly delegated to
16
+ * the IDE, and we surface that in CLI output so the user knows what
17
+ * happened.
18
+ */
19
+ import type { DetectedHost } from "./host-detect.js";
20
+ export interface VsxInstallTarget {
21
+ namespace: string;
22
+ name: string;
23
+ /** Optional; informational only. */
24
+ version?: string;
25
+ }
26
+ export interface VsxInstallReport {
27
+ host: DetectedHost;
28
+ /** ok | skipped | failed */
29
+ status: "ok" | "skipped" | "failed";
30
+ /** Filled when status !== ok. */
31
+ reason?: string;
32
+ /** Captured stdout/stderr tail (truncated to 400 chars). */
33
+ output?: string;
34
+ }
35
+ /**
36
+ * Run `<cliPath> --install-extension <namespace>.<name>` against every
37
+ * detected vscode-family host. JetBrains/Zed/Piye are reported as
38
+ * skipped since they have no compatible install command for VSIX.
39
+ */
40
+ export declare function installVsx(target: VsxInstallTarget, hosts: DetectedHost[]): VsxInstallReport[];
41
+ //# sourceMappingURL=vsx-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vsx-install.d.ts","sourceRoot":"","sources":["../../src/lib/vsx-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,4BAA4B;IAC5B,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpC,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,YAAY,EAAE,GACpB,gBAAgB,EAAE,CAgDpB"}