@myop/cli 0.1.51 β 0.1.52
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/{index-bsDUYxd0.js β index-DuEoKctW.js} +1311 -1315
- package/dist/myop-cli.js +1032 -935
- package/package.json +1 -1
package/dist/myop-cli.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
import
|
|
6
|
-
import { select as
|
|
7
|
-
import { Command as
|
|
8
|
-
import { execSync as Q, spawn as
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import { URL as
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
const
|
|
2
|
+
var bt = Object.defineProperty;
|
|
3
|
+
var Ct = (o, t, e) => t in o ? bt(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
|
|
4
|
+
var ve = (o, t, e) => Ct(o, typeof t != "symbol" ? t + "" : t, e);
|
|
5
|
+
import z from "ora";
|
|
6
|
+
import { select as st, Separator as Le } from "@inquirer/prompts";
|
|
7
|
+
import { Command as Pt, Option as fe } from "commander";
|
|
8
|
+
import { execSync as Q, spawn as Mt } from "child_process";
|
|
9
|
+
import _, { join as je } from "path";
|
|
10
|
+
import C, { readFileSync as Et } from "fs";
|
|
11
|
+
import ze from "crypto";
|
|
12
|
+
import It from "http";
|
|
13
|
+
import { URL as it, URLSearchParams as rt } from "url";
|
|
14
|
+
import Ot from "open";
|
|
15
|
+
import at from "os";
|
|
16
|
+
const kt = `
|
|
17
17
|
Usage: myop [OPTIONS] COMMAND [ARGS]...
|
|
18
18
|
|
|
19
19
|
A powerful command-line interface for managing your Myop projects.
|
|
@@ -55,81 +55,81 @@ Examples:
|
|
|
55
55
|
verbose: !1
|
|
56
56
|
},
|
|
57
57
|
myopConfig: null
|
|
58
|
-
},
|
|
58
|
+
}, lt = {
|
|
59
59
|
name: "π₯ Install Myop generated dependencies",
|
|
60
60
|
value: "myopInstall",
|
|
61
61
|
description: "Fetch and generates Myop dependencies. flows including components, refs and props.",
|
|
62
62
|
action: async () => {
|
|
63
63
|
console.info("installing... ");
|
|
64
64
|
for (const o of v.myopConfig.flows) {
|
|
65
|
-
const t =
|
|
65
|
+
const t = _.join(v.executionPath, "/node_modules/@myop/flow-types/");
|
|
66
66
|
console.info(`Generate flow at ${t}`), console.info(`Generated flow at ${t}`);
|
|
67
67
|
}
|
|
68
68
|
process.exit();
|
|
69
69
|
}
|
|
70
|
-
},
|
|
71
|
-
const t =
|
|
70
|
+
}, Rt = (o) => {
|
|
71
|
+
const t = _.join(v.executionPath, o);
|
|
72
72
|
console.info(`reading config file from: ${t}`);
|
|
73
|
-
const e =
|
|
73
|
+
const e = C.readFileSync(t, "utf8"), n = JSON.parse(e);
|
|
74
74
|
return console.info("config file loaded, ", n), n;
|
|
75
|
-
},
|
|
76
|
-
const e =
|
|
75
|
+
}, We = (o, t) => {
|
|
76
|
+
const e = _.join(v.executionPath, o);
|
|
77
77
|
console.info(`writing config file to: ${e}`);
|
|
78
78
|
try {
|
|
79
79
|
const n = JSON.stringify(t, null, 2);
|
|
80
|
-
|
|
80
|
+
C.writeFileSync(e, n), console.info(`config file updated ${n}`);
|
|
81
81
|
} catch (n) {
|
|
82
82
|
throw console.info(`error ${n} while writing to ${e}, JSON: ${t}`), console.log(`
|
|
83
83
|
β οΈ Failed write config file to ${e}, for more info use verbose flag`), n;
|
|
84
84
|
}
|
|
85
|
-
},
|
|
85
|
+
}, ct = {
|
|
86
86
|
name: "π Add flow definition to your project",
|
|
87
87
|
value: "addFlow",
|
|
88
88
|
description: "Adds flow to yours myop.config.json",
|
|
89
89
|
_action: (o) => {
|
|
90
|
-
v.myopConfig.flows.includes(o) || v.myopConfig.flows.push(o),
|
|
90
|
+
v.myopConfig.flows.includes(o) || v.myopConfig.flows.push(o), We(v.options.configPath, v.myopConfig);
|
|
91
91
|
},
|
|
92
92
|
action: async () => {
|
|
93
93
|
}
|
|
94
|
-
},
|
|
94
|
+
}, dt = {
|
|
95
95
|
name: "π« Remove flow definition from your project",
|
|
96
96
|
value: "removeFlow",
|
|
97
97
|
description: "Removes flow to yours myop.config.json",
|
|
98
98
|
_action: (o) => {
|
|
99
|
-
v.myopConfig.flows = v.myopConfig.flows.filter((t) => t !== o),
|
|
99
|
+
v.myopConfig.flows = v.myopConfig.flows.filter((t) => t !== o), We(v.options.configPath, v.myopConfig);
|
|
100
100
|
},
|
|
101
101
|
action: () => {
|
|
102
102
|
}
|
|
103
|
-
},
|
|
103
|
+
}, _t = {
|
|
104
104
|
name: "π Quit",
|
|
105
105
|
value: "quit",
|
|
106
106
|
description: "Quit and continue coding.",
|
|
107
107
|
action: () => {
|
|
108
108
|
process.exit();
|
|
109
109
|
}
|
|
110
|
-
},
|
|
110
|
+
}, Nt = {
|
|
111
111
|
name: "π’ Create new component",
|
|
112
112
|
value: "-",
|
|
113
113
|
disabled: "(not available yet)"
|
|
114
|
-
},
|
|
114
|
+
}, Tt = {
|
|
115
115
|
name: "π΅ Create new experience",
|
|
116
116
|
value: "-",
|
|
117
117
|
disabled: "(not available yet)"
|
|
118
|
-
},
|
|
118
|
+
}, Ft = {
|
|
119
119
|
name: "π‘ Create new skin",
|
|
120
120
|
value: "-",
|
|
121
121
|
disabled: "(not available yet)"
|
|
122
|
-
},
|
|
122
|
+
}, jt = {
|
|
123
123
|
name: "π΄ Create new flow",
|
|
124
124
|
value: "-",
|
|
125
125
|
disabled: "(not available yet)"
|
|
126
|
-
},
|
|
126
|
+
}, At = {
|
|
127
127
|
name: "π Define new custom Myop message",
|
|
128
128
|
value: "generateMyopMessage",
|
|
129
129
|
description: "οΈHelp you creates the right structure for a new Myop message, including types and handlers.",
|
|
130
130
|
disabled: "(not available yet)"
|
|
131
|
-
},
|
|
132
|
-
function
|
|
131
|
+
}, Dt = [At, Nt, Tt, Ft, jt];
|
|
132
|
+
function Lt(o, t, e, n) {
|
|
133
133
|
return `<!DOCTYPE html>
|
|
134
134
|
<html lang="en">
|
|
135
135
|
<head>
|
|
@@ -219,19 +219,19 @@ ${n}
|
|
|
219
219
|
</body>
|
|
220
220
|
</html>`;
|
|
221
221
|
}
|
|
222
|
-
function
|
|
222
|
+
function Ut(o) {
|
|
223
223
|
return o.includes("esbuild") && o.includes("another platform");
|
|
224
224
|
}
|
|
225
|
-
function
|
|
225
|
+
function Ht(o) {
|
|
226
226
|
return o.includes("ERR_MODULE_NOT_FOUND") && o.includes("esbuild");
|
|
227
227
|
}
|
|
228
|
-
function
|
|
228
|
+
function Bt() {
|
|
229
229
|
console.error(`
|
|
230
230
|
β esbuild platform mismatch detected!`), console.error(" Your node_modules contains esbuild binaries for a different OS."), console.error(`
|
|
231
231
|
This usually happens when node_modules is copied between different`), console.error(` operating systems (e.g., Windows β Mac, or Mac β Linux).
|
|
232
232
|
`);
|
|
233
233
|
}
|
|
234
|
-
function
|
|
234
|
+
function Jt(o) {
|
|
235
235
|
return new Promise((t) => {
|
|
236
236
|
console.log(`π§ Attempting to fix: removing node_modules and reinstalling...
|
|
237
237
|
`);
|
|
@@ -244,9 +244,9 @@ function Ut(o) {
|
|
|
244
244
|
return;
|
|
245
245
|
}
|
|
246
246
|
console.log(" β Removed node_modules"), console.log(` β³ Running npm install...
|
|
247
|
-
`), o("npm install", { maxBuffer: 10 * 1024 * 1024 }, (i,
|
|
247
|
+
`), o("npm install", { maxBuffer: 10 * 1024 * 1024 }, (i, r, p) => {
|
|
248
248
|
if (i) {
|
|
249
|
-
console.error("β npm install failed:", i.message),
|
|
249
|
+
console.error("β npm install failed:", i.message), p && console.error(p), t(!1);
|
|
250
250
|
return;
|
|
251
251
|
}
|
|
252
252
|
console.log(` β Dependencies reinstalled successfully!
|
|
@@ -255,79 +255,79 @@ function Ut(o) {
|
|
|
255
255
|
});
|
|
256
256
|
});
|
|
257
257
|
}
|
|
258
|
-
async function
|
|
258
|
+
async function pt(o, t, e, n, s = {}) {
|
|
259
259
|
const {
|
|
260
260
|
hasTriedPlatformFix: i = !1,
|
|
261
|
-
hasTriedInstall:
|
|
262
|
-
onRetry:
|
|
263
|
-
} = s,
|
|
264
|
-
return !i &&
|
|
265
|
-
`),
|
|
266
|
-
n("npm install", (
|
|
267
|
-
if (
|
|
268
|
-
console.error("β Failed to install dependencies:",
|
|
261
|
+
hasTriedInstall: r = !1,
|
|
262
|
+
onRetry: p
|
|
263
|
+
} = s, m = ((o == null ? void 0 : o.message) || "") + (t || "") + (e || "");
|
|
264
|
+
return !i && Ut(m) ? (Bt(), await Jt(n) && p ? (console.log(`π Retrying build...
|
|
265
|
+
`), p(), { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: r }) : { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: r }) : !r && Ht(m) ? (console.log("π¦ Missing dependencies detected, running npm install..."), new Promise((c) => {
|
|
266
|
+
n("npm install", (d, y, S) => {
|
|
267
|
+
if (d) {
|
|
268
|
+
console.error("β Failed to install dependencies:", d.message), S && console.error(S), c({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
|
|
269
269
|
return;
|
|
270
270
|
}
|
|
271
|
-
console.log("β
Dependencies installed"),
|
|
271
|
+
console.log("β
Dependencies installed"), p && p(), c({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
|
|
272
272
|
});
|
|
273
|
-
})) : { handled: !1, hasTriedPlatformFix: i, hasTriedInstall:
|
|
273
|
+
})) : { handled: !1, hasTriedPlatformFix: i, hasTriedInstall: r };
|
|
274
274
|
}
|
|
275
|
-
async function
|
|
275
|
+
async function Ce() {
|
|
276
276
|
const o = await import("fs"), t = await import("path"), { exec: e } = await import("child_process"), n = await import("http"), { createHash: s } = await import("node:crypto");
|
|
277
277
|
let i;
|
|
278
278
|
if (import.meta.url.startsWith("file://")) {
|
|
279
|
-
const
|
|
280
|
-
i = t.default.dirname(
|
|
279
|
+
const a = new URL(import.meta.url).pathname, f = process.platform === "win32" && a.startsWith("/") ? a.slice(1) : a;
|
|
280
|
+
i = t.default.dirname(f);
|
|
281
281
|
} else
|
|
282
282
|
i = t.default.dirname(import.meta.url);
|
|
283
|
-
const
|
|
284
|
-
let y = "./dist", S = !1, x = !1,
|
|
283
|
+
const r = t.default.join(i, "commands", "dev", "management-website"), p = o.default.readFileSync(t.default.join(r, "styles.css"), "utf-8"), m = o.default.readFileSync(t.default.join(r, "app.js"), "utf-8"), c = 9292, d = 9293;
|
|
284
|
+
let y = "./dist", S = !1, x = !1, g = !1, u = null;
|
|
285
285
|
const E = () => {
|
|
286
286
|
try {
|
|
287
|
-
const
|
|
288
|
-
if (
|
|
289
|
-
return
|
|
287
|
+
const l = o.default.readdirSync(".").filter((a) => !a.endsWith(".html") || a.startsWith(".") ? !1 : o.default.statSync(a).isFile());
|
|
288
|
+
if (l.length === 1)
|
|
289
|
+
return l[0];
|
|
290
290
|
} catch {
|
|
291
291
|
}
|
|
292
292
|
return null;
|
|
293
|
-
},
|
|
293
|
+
}, O = () => {
|
|
294
294
|
try {
|
|
295
|
-
const
|
|
296
|
-
return !!(
|
|
295
|
+
const l = JSON.parse(o.default.readFileSync("package.json", "utf-8"));
|
|
296
|
+
return !!(l.scripts && l.scripts.build);
|
|
297
297
|
} catch {
|
|
298
298
|
return !1;
|
|
299
299
|
}
|
|
300
|
-
},
|
|
301
|
-
const
|
|
302
|
-
let
|
|
303
|
-
|
|
300
|
+
}, b = (l) => {
|
|
301
|
+
const a = process.platform;
|
|
302
|
+
let f;
|
|
303
|
+
a === "darwin" ? f = `open "${l}"` : a === "win32" ? f = `start "" "${l}"` : f = `xdg-open "${l}"`, e(f, (h) => {
|
|
304
304
|
});
|
|
305
|
-
},
|
|
305
|
+
}, P = /* @__PURE__ */ new Map(), j = v.program.getOptionValue("config") || "./myop.config.json";
|
|
306
306
|
let M, R, k = !1;
|
|
307
|
-
|
|
308
|
-
const L =
|
|
307
|
+
u = E();
|
|
308
|
+
const L = O();
|
|
309
309
|
try {
|
|
310
|
-
const
|
|
311
|
-
M =
|
|
312
|
-
} catch (
|
|
313
|
-
|
|
310
|
+
const l = o.default.readFileSync(j, "utf-8"), a = JSON.parse(l);
|
|
311
|
+
M = a.componentId || "DEV", R = a.componentName || a.name || null, k = a.HMR === !0, u && !L && (g = !0, k = !0, console.log(`π Single HTML file mode: ${u}`)), k && console.log("π₯ HMR enabled");
|
|
312
|
+
} catch (l) {
|
|
313
|
+
u && !L ? (g = !0, M = "DEV", R = t.default.basename(u, ".html"), k = !0, console.log(`π Single HTML file mode: ${u}`), console.log("π₯ HMR enabled")) : (console.error("β Error reading myop.config.json:", l.message), process.exit(1));
|
|
314
314
|
}
|
|
315
|
-
const
|
|
315
|
+
const D = async () => {
|
|
316
316
|
if (M !== "DEV" && M !== "NEW")
|
|
317
317
|
return M;
|
|
318
318
|
try {
|
|
319
|
-
const
|
|
320
|
-
const
|
|
319
|
+
const a = ((await new Promise((w, $) => {
|
|
320
|
+
const I = {
|
|
321
321
|
hostname: "localhost",
|
|
322
|
-
port:
|
|
322
|
+
port: d,
|
|
323
323
|
path: "/_list",
|
|
324
324
|
method: "GET",
|
|
325
325
|
timeout: 1e3
|
|
326
|
-
}, F = n.default.request(
|
|
327
|
-
let
|
|
328
|
-
H.on("data", (ee) =>
|
|
326
|
+
}, F = n.default.request(I, (H) => {
|
|
327
|
+
let Y = "";
|
|
328
|
+
H.on("data", (ee) => Y += ee), H.on("end", () => {
|
|
329
329
|
try {
|
|
330
|
-
w(JSON.parse(
|
|
330
|
+
w(JSON.parse(Y));
|
|
331
331
|
} catch {
|
|
332
332
|
w({ components: [] });
|
|
333
333
|
}
|
|
@@ -337,19 +337,19 @@ async function be() {
|
|
|
337
337
|
F.destroy(), w({ components: [] });
|
|
338
338
|
}), F.end();
|
|
339
339
|
})).components || []).map(([w]) => w).filter((w) => w === "DEV" || w === "NEW" || /^DEV\d+$/.test(w) || /^NEW\d+$/.test(w));
|
|
340
|
-
if (
|
|
340
|
+
if (a.length === 0)
|
|
341
341
|
return "DEV1";
|
|
342
|
-
const
|
|
342
|
+
const f = a.map((w) => {
|
|
343
343
|
if (w === "DEV" || w === "NEW") return 1;
|
|
344
|
-
const
|
|
345
|
-
return
|
|
344
|
+
const $ = w.match(/^DEV(\d+)$/), I = w.match(/^NEW(\d+)$/);
|
|
345
|
+
return $ ? parseInt($[1], 10) : I ? parseInt(I[1], 10) : 0;
|
|
346
346
|
}).filter((w) => w > 0);
|
|
347
|
-
return `DEV${Math.max(...
|
|
347
|
+
return `DEV${Math.max(...f, 0) + 1}`;
|
|
348
348
|
} catch {
|
|
349
349
|
return "DEV1";
|
|
350
350
|
}
|
|
351
|
-
},
|
|
352
|
-
const
|
|
351
|
+
}, T = process.cwd(), W = (l) => {
|
|
352
|
+
const a = t.default.extname(l).toLowerCase();
|
|
353
353
|
return {
|
|
354
354
|
".html": "text/html",
|
|
355
355
|
".js": "text/javascript",
|
|
@@ -360,42 +360,42 @@ async function be() {
|
|
|
360
360
|
".gif": "image/gif",
|
|
361
361
|
".svg": "image/svg+xml",
|
|
362
362
|
".ico": "image/x-icon"
|
|
363
|
-
}[
|
|
364
|
-
},
|
|
365
|
-
if (
|
|
366
|
-
const
|
|
367
|
-
|
|
363
|
+
}[a] || "application/octet-stream";
|
|
364
|
+
}, N = /* @__PURE__ */ new Map(), oe = [], Ie = 50, q = [], se = /* @__PURE__ */ new Map(), X = /* @__PURE__ */ new Map(), wt = (l, a, f) => {
|
|
365
|
+
if (l.url.startsWith("/_hmr/")) {
|
|
366
|
+
const h = l.url.split("/_hmr/")[1], w = l.headers["sec-websocket-key"], $ = s("sha1").update(w + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64");
|
|
367
|
+
a.write(
|
|
368
368
|
`HTTP/1.1 101 Switching Protocols\r
|
|
369
369
|
Upgrade: websocket\r
|
|
370
370
|
Connection: Upgrade\r
|
|
371
|
-
Sec-WebSocket-Accept: ${
|
|
371
|
+
Sec-WebSocket-Accept: ${$}\r
|
|
372
372
|
\r
|
|
373
373
|
`
|
|
374
|
-
),
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
}),
|
|
378
|
-
const
|
|
379
|
-
|
|
374
|
+
), X.has(h) || X.set(h, /* @__PURE__ */ new Set()), X.get(h).add(a), console.log(`π HMR client connected: ${h}`), a.on("close", () => {
|
|
375
|
+
const I = X.get(h);
|
|
376
|
+
I && (I.delete(a), I.size === 0 && X.delete(h)), console.log(`π HMR client disconnected: ${h}`);
|
|
377
|
+
}), a.on("error", () => {
|
|
378
|
+
const I = X.get(h);
|
|
379
|
+
I && I.delete(a);
|
|
380
380
|
});
|
|
381
381
|
}
|
|
382
|
-
},
|
|
383
|
-
if (
|
|
384
|
-
let
|
|
385
|
-
|
|
382
|
+
}, Oe = n.default.createServer((l, a) => {
|
|
383
|
+
if (a.setHeader("Content-Type", "application/json"), l.method === "POST" && l.url === "/_register") {
|
|
384
|
+
let f = "";
|
|
385
|
+
l.on("data", (h) => f += h), l.on("end", () => {
|
|
386
386
|
try {
|
|
387
|
-
const { componentId:
|
|
388
|
-
|
|
389
|
-
const F =
|
|
390
|
-
console.log(`β
Registered: ${
|
|
391
|
-
const H = Array.from(
|
|
392
|
-
id:
|
|
387
|
+
const { componentId: h, distPath: w, componentName: $, htmlFile: I } = JSON.parse(f);
|
|
388
|
+
N.set(h, { path: w, name: $ || null, htmlFile: I || null });
|
|
389
|
+
const F = $ ? ` (${$})` : "";
|
|
390
|
+
console.log(`β
Registered: ${h}${F} -> ${w}${I ? "/" + I : ""}`), a.writeHead(200), a.end(JSON.stringify({ success: !0, registered: Array.from(N.keys()) }));
|
|
391
|
+
const H = Array.from(N.entries()).map(([Y, ee]) => ({
|
|
392
|
+
id: Y,
|
|
393
393
|
path: ee.path,
|
|
394
394
|
name: ee.name
|
|
395
395
|
}));
|
|
396
|
-
|
|
396
|
+
q.forEach((Y) => {
|
|
397
397
|
try {
|
|
398
|
-
|
|
398
|
+
Y.write(`data: ${JSON.stringify({
|
|
399
399
|
type: "components",
|
|
400
400
|
components: H
|
|
401
401
|
})}
|
|
@@ -404,24 +404,24 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
404
404
|
} catch {
|
|
405
405
|
}
|
|
406
406
|
});
|
|
407
|
-
} catch (
|
|
408
|
-
|
|
407
|
+
} catch (h) {
|
|
408
|
+
a.writeHead(400), a.end(JSON.stringify({ error: h.message }));
|
|
409
409
|
}
|
|
410
410
|
});
|
|
411
|
-
} else if (
|
|
412
|
-
let
|
|
413
|
-
|
|
411
|
+
} else if (l.method === "POST" && l.url === "/_unregister") {
|
|
412
|
+
let f = "";
|
|
413
|
+
l.on("data", (h) => f += h), l.on("end", () => {
|
|
414
414
|
try {
|
|
415
|
-
const { componentId:
|
|
416
|
-
|
|
417
|
-
const w = Array.from(
|
|
418
|
-
id:
|
|
419
|
-
path:
|
|
420
|
-
name:
|
|
415
|
+
const { componentId: h } = JSON.parse(f);
|
|
416
|
+
N.delete(h), console.log(`β Unregistered: ${h}`), a.writeHead(200), a.end(JSON.stringify({ success: !0 }));
|
|
417
|
+
const w = Array.from(N.entries()).map(([$, I]) => ({
|
|
418
|
+
id: $,
|
|
419
|
+
path: I.path,
|
|
420
|
+
name: I.name
|
|
421
421
|
}));
|
|
422
|
-
|
|
422
|
+
q.forEach(($) => {
|
|
423
423
|
try {
|
|
424
|
-
|
|
424
|
+
$.write(`data: ${JSON.stringify({
|
|
425
425
|
type: "components",
|
|
426
426
|
components: w
|
|
427
427
|
})}
|
|
@@ -430,74 +430,74 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
430
430
|
} catch {
|
|
431
431
|
}
|
|
432
432
|
});
|
|
433
|
-
} catch (
|
|
434
|
-
|
|
433
|
+
} catch (h) {
|
|
434
|
+
a.writeHead(400), a.end(JSON.stringify({ error: h.message }));
|
|
435
435
|
}
|
|
436
436
|
});
|
|
437
|
-
} else if (
|
|
438
|
-
|
|
439
|
-
else if (
|
|
440
|
-
let
|
|
441
|
-
|
|
437
|
+
} else if (l.method === "GET" && l.url === "/_list")
|
|
438
|
+
a.writeHead(200), a.end(JSON.stringify({ components: Array.from(N.entries()) }));
|
|
439
|
+
else if (l.method === "POST" && l.url === "/_hmr_notify") {
|
|
440
|
+
let f = "";
|
|
441
|
+
l.on("data", (h) => f += h), l.on("end", () => {
|
|
442
442
|
try {
|
|
443
|
-
const { componentId:
|
|
444
|
-
if (
|
|
445
|
-
console.log(`π₯ Notifying ${
|
|
446
|
-
const
|
|
447
|
-
|
|
443
|
+
const { componentId: h, html: w } = JSON.parse(f), $ = X.get(h);
|
|
444
|
+
if ($ && $.size > 0) {
|
|
445
|
+
console.log(`π₯ Notifying ${$.size} HMR client(s) for: ${h}`);
|
|
446
|
+
const I = JSON.stringify({ type: "update", html: w }), F = qe(I);
|
|
447
|
+
$.forEach((H) => {
|
|
448
448
|
try {
|
|
449
449
|
H.write(F);
|
|
450
450
|
} catch {
|
|
451
|
-
|
|
451
|
+
$.delete(H);
|
|
452
452
|
}
|
|
453
|
-
}),
|
|
453
|
+
}), a.writeHead(200), a.end(JSON.stringify({ success: !0, notified: $.size }));
|
|
454
454
|
} else
|
|
455
|
-
|
|
456
|
-
} catch (
|
|
457
|
-
|
|
455
|
+
a.writeHead(200), a.end(JSON.stringify({ success: !0, notified: 0 }));
|
|
456
|
+
} catch (h) {
|
|
457
|
+
a.writeHead(400), a.end(JSON.stringify({ error: h.message }));
|
|
458
458
|
}
|
|
459
459
|
});
|
|
460
460
|
} else
|
|
461
|
-
|
|
462
|
-
}), ge = n.default.createServer((
|
|
463
|
-
if (
|
|
464
|
-
|
|
461
|
+
a.writeHead(404), a.end(JSON.stringify({ error: "Not found" }));
|
|
462
|
+
}), ge = n.default.createServer((l, a) => {
|
|
463
|
+
if (l.url.includes("..")) {
|
|
464
|
+
a.writeHead(403, { "Content-Type": "text/plain" }), a.end("Forbidden");
|
|
465
465
|
return;
|
|
466
466
|
}
|
|
467
|
-
const
|
|
468
|
-
if (
|
|
469
|
-
const J =
|
|
467
|
+
const f = new URL(l.url, `http://localhost:${c}`), h = f.pathname, w = h.split("/").filter((J) => J);
|
|
468
|
+
if (h.startsWith("/consume")) {
|
|
469
|
+
const J = f.searchParams.get("id");
|
|
470
470
|
if (!J) {
|
|
471
|
-
|
|
471
|
+
a.writeHead(400, { "Content-Type": "application/json" }), a.end(JSON.stringify({ error: "Component ID required. Use /consume?id=<componentId>" }));
|
|
472
472
|
return;
|
|
473
473
|
}
|
|
474
|
-
const
|
|
474
|
+
const V = N.get(J), G = V ? V.path : null, de = (te) => {
|
|
475
475
|
let U = "Unknown", K = "Unknown";
|
|
476
|
-
if (
|
|
477
|
-
const B =
|
|
476
|
+
if (l.headers.referer || l.headers.referrer) {
|
|
477
|
+
const B = l.headers.referer || l.headers.referrer;
|
|
478
478
|
try {
|
|
479
479
|
const ie = new URL(B);
|
|
480
480
|
U = ie.origin, K = ie.hostname || ie.origin;
|
|
481
481
|
} catch {
|
|
482
482
|
U = B, K = B;
|
|
483
483
|
}
|
|
484
|
-
} else if (
|
|
484
|
+
} else if (l.headers.origin)
|
|
485
485
|
try {
|
|
486
|
-
const B = new URL(
|
|
486
|
+
const B = new URL(l.headers.origin);
|
|
487
487
|
U = B.origin, K = B.hostname || B.origin;
|
|
488
488
|
} catch {
|
|
489
|
-
U =
|
|
489
|
+
U = l.headers.origin, K = l.headers.origin;
|
|
490
490
|
}
|
|
491
|
-
else if (
|
|
492
|
-
const B =
|
|
491
|
+
else if (l.socket.remoteAddress) {
|
|
492
|
+
const B = l.socket.remoteAddress;
|
|
493
493
|
B === "::1" || B === "::ffff:127.0.0.1" ? (U = "localhost", K = "localhost (direct)") : (U = B, K = B.replace("::ffff:", ""));
|
|
494
494
|
}
|
|
495
|
-
const
|
|
495
|
+
const Te = l.headers.referer || l.headers.referrer || U, we = {
|
|
496
496
|
type: "request",
|
|
497
497
|
componentId: J,
|
|
498
498
|
timestamp: Date.now(),
|
|
499
499
|
servedLocally: te,
|
|
500
|
-
referrer:
|
|
500
|
+
referrer: Te,
|
|
501
501
|
origin: U,
|
|
502
502
|
originLabel: K
|
|
503
503
|
};
|
|
@@ -506,7 +506,7 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
506
506
|
label: K,
|
|
507
507
|
firstSeen: Date.now(),
|
|
508
508
|
requestCount: 0
|
|
509
|
-
}),
|
|
509
|
+
}), q.forEach((B) => {
|
|
510
510
|
try {
|
|
511
511
|
B.write(`data: ${JSON.stringify({
|
|
512
512
|
type: "origins",
|
|
@@ -517,8 +517,8 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
517
517
|
} catch {
|
|
518
518
|
}
|
|
519
519
|
}));
|
|
520
|
-
const
|
|
521
|
-
|
|
520
|
+
const Fe = se.get(U);
|
|
521
|
+
Fe.requestCount++, q.forEach((B) => {
|
|
522
522
|
try {
|
|
523
523
|
B.write(`data: ${JSON.stringify({
|
|
524
524
|
type: "origins",
|
|
@@ -528,168 +528,168 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
528
528
|
`);
|
|
529
529
|
} catch {
|
|
530
530
|
}
|
|
531
|
-
}), oe.push(
|
|
531
|
+
}), oe.push(we), oe.length > Ie && oe.shift(), q.forEach((B) => {
|
|
532
532
|
try {
|
|
533
|
-
B.write(`data: ${JSON.stringify(
|
|
533
|
+
B.write(`data: ${JSON.stringify(we)}
|
|
534
534
|
|
|
535
535
|
`);
|
|
536
536
|
} catch {
|
|
537
537
|
}
|
|
538
538
|
});
|
|
539
539
|
};
|
|
540
|
-
if (
|
|
541
|
-
const te =
|
|
540
|
+
if (G) {
|
|
541
|
+
const te = V.htmlFile ? t.default.join(G, V.htmlFile) : t.default.join(G, "index.html");
|
|
542
542
|
o.default.readFile(te, "utf-8", (U, K) => {
|
|
543
543
|
if (U) {
|
|
544
|
-
console.log(`β File not found: ${te}`),
|
|
544
|
+
console.log(`β File not found: ${te}`), a.writeHead(404, { "Content-Type": "application/json" }), a.end(JSON.stringify({ error: "index.html not found" }));
|
|
545
545
|
return;
|
|
546
546
|
}
|
|
547
|
-
const
|
|
547
|
+
const Te = ke(K, J), we = `dev-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, Fe = {
|
|
548
548
|
item: {
|
|
549
549
|
name: J,
|
|
550
550
|
id: J,
|
|
551
551
|
consume_variant: [
|
|
552
552
|
{
|
|
553
|
-
id:
|
|
553
|
+
id: we,
|
|
554
554
|
name: "dev version",
|
|
555
555
|
loader: {
|
|
556
556
|
type: "HTMLLoader",
|
|
557
557
|
shadowRootMode: "localFrame",
|
|
558
|
-
HTML:
|
|
558
|
+
HTML: Te
|
|
559
559
|
}
|
|
560
560
|
}
|
|
561
561
|
]
|
|
562
562
|
}
|
|
563
563
|
};
|
|
564
|
-
console.log(`β
Serving consume JSON for: ${J}`), de(!0),
|
|
564
|
+
console.log(`β
Serving consume JSON for: ${J}`), de(!0), a.writeHead(200, {
|
|
565
565
|
"Content-Type": "application/json",
|
|
566
566
|
"Access-Control-Allow-Origin": "*"
|
|
567
|
-
}),
|
|
567
|
+
}), a.end(JSON.stringify(Fe, null, 2));
|
|
568
568
|
});
|
|
569
569
|
} else {
|
|
570
570
|
console.log(`π‘ Proxying consume request to cloud.myop.dev for: ${J}`);
|
|
571
|
-
const te = `https://cloud.myop.dev/consume${
|
|
571
|
+
const te = `https://cloud.myop.dev/consume${f.search}`;
|
|
572
572
|
de(!1), fetch(te).then((U) => U.text()).then((U) => {
|
|
573
|
-
|
|
573
|
+
a.writeHead(200, {
|
|
574
574
|
"Content-Type": "application/json",
|
|
575
575
|
"Access-Control-Allow-Origin": "*"
|
|
576
|
-
}),
|
|
576
|
+
}), a.end(U);
|
|
577
577
|
}).catch((U) => {
|
|
578
|
-
console.error(`β Proxy error: ${U.message}`),
|
|
578
|
+
console.error(`β Proxy error: ${U.message}`), a.writeHead(502, { "Content-Type": "application/json" }), a.end(JSON.stringify({ error: "Failed to fetch from cloud.myop.dev" }));
|
|
579
579
|
});
|
|
580
580
|
}
|
|
581
581
|
return;
|
|
582
582
|
}
|
|
583
|
-
if (
|
|
584
|
-
|
|
583
|
+
if (h === "/events") {
|
|
584
|
+
a.writeHead(200, {
|
|
585
585
|
"Content-Type": "text/event-stream",
|
|
586
586
|
"Cache-Control": "no-cache",
|
|
587
587
|
Connection: "keep-alive",
|
|
588
588
|
"Access-Control-Allow-Origin": "*"
|
|
589
|
-
}),
|
|
590
|
-
const J = Array.from(
|
|
591
|
-
id:
|
|
592
|
-
path:
|
|
593
|
-
name:
|
|
589
|
+
}), q.push(a);
|
|
590
|
+
const J = Array.from(N.entries()).map(([V, G]) => ({
|
|
591
|
+
id: V,
|
|
592
|
+
path: G.path,
|
|
593
|
+
name: G.name
|
|
594
594
|
}));
|
|
595
|
-
|
|
595
|
+
a.write(`data: ${JSON.stringify({
|
|
596
596
|
type: "components",
|
|
597
597
|
components: J
|
|
598
598
|
})}
|
|
599
599
|
|
|
600
|
-
`),
|
|
600
|
+
`), a.write(`data: ${JSON.stringify({
|
|
601
601
|
type: "origins",
|
|
602
602
|
origins: Array.from(se.values())
|
|
603
603
|
})}
|
|
604
604
|
|
|
605
|
-
`),
|
|
605
|
+
`), a.write(`data: ${JSON.stringify({
|
|
606
606
|
type: "requestLog",
|
|
607
607
|
log: oe
|
|
608
608
|
})}
|
|
609
609
|
|
|
610
|
-
`),
|
|
611
|
-
const
|
|
612
|
-
|
|
610
|
+
`), l.on("close", () => {
|
|
611
|
+
const V = q.indexOf(a);
|
|
612
|
+
V !== -1 && q.splice(V, 1);
|
|
613
613
|
});
|
|
614
614
|
return;
|
|
615
615
|
}
|
|
616
616
|
if (w.length === 0) {
|
|
617
|
-
|
|
617
|
+
a.writeHead(200, { "Content-Type": "text/html" }), a.end(Lt(c, d, p, m));
|
|
618
618
|
return;
|
|
619
619
|
}
|
|
620
620
|
if (w[0] !== "view") {
|
|
621
|
-
|
|
621
|
+
a.writeHead(404, { "Content-Type": "text/plain" }), a.end("Not found. Use /view/<componentId>/ to access components.");
|
|
622
622
|
return;
|
|
623
623
|
}
|
|
624
624
|
if (w.length < 2) {
|
|
625
|
-
|
|
625
|
+
a.writeHead(400, { "Content-Type": "text/plain" }), a.end("Component ID required. Use /view/<componentId>/");
|
|
626
626
|
return;
|
|
627
627
|
}
|
|
628
|
-
const
|
|
629
|
-
if (!
|
|
630
|
-
|
|
628
|
+
const $ = w[1], I = N.get($);
|
|
629
|
+
if (!I) {
|
|
630
|
+
a.writeHead(404, { "Content-Type": "text/plain" }), a.end(`Component not found: ${$}`);
|
|
631
631
|
return;
|
|
632
632
|
}
|
|
633
|
-
const F =
|
|
634
|
-
console.log(`π₯ Request: ${
|
|
633
|
+
const F = I.path, H = w.slice(2), Y = I.htmlFile || "index.html", ee = H.length === 0 ? Y : H.join("/"), ce = t.default.join(F, ee);
|
|
634
|
+
console.log(`π₯ Request: ${l.url} -> ${ce}`), o.default.readFile(ce, (J, V) => {
|
|
635
635
|
if (J) {
|
|
636
|
-
console.log(`β File not found: ${ce}`),
|
|
636
|
+
console.log(`β File not found: ${ce}`), a.writeHead(404, { "Content-Type": "text/plain" }), a.end("Not Found");
|
|
637
637
|
return;
|
|
638
638
|
}
|
|
639
|
-
const
|
|
640
|
-
console.log(`β
Serving: ${ce} (${
|
|
641
|
-
let de =
|
|
642
|
-
if (
|
|
643
|
-
const te =
|
|
644
|
-
de =
|
|
639
|
+
const G = W(ce);
|
|
640
|
+
console.log(`β
Serving: ${ce} (${G})`);
|
|
641
|
+
let de = V;
|
|
642
|
+
if (G === "text/html" && k) {
|
|
643
|
+
const te = V.toString("utf-8");
|
|
644
|
+
de = ke(te, $);
|
|
645
645
|
}
|
|
646
|
-
|
|
647
|
-
"Content-Type":
|
|
646
|
+
a.writeHead(200, {
|
|
647
|
+
"Content-Type": G,
|
|
648
648
|
"Access-Control-Allow-Origin": "*"
|
|
649
|
-
}),
|
|
649
|
+
}), a.end(de);
|
|
650
650
|
});
|
|
651
|
-
}),
|
|
652
|
-
const
|
|
651
|
+
}), Ze = () => new Promise((l, a) => {
|
|
652
|
+
const f = g ? t.default.resolve(T) : t.default.resolve(T, y), h = JSON.stringify({
|
|
653
653
|
componentId: M,
|
|
654
|
-
distPath:
|
|
654
|
+
distPath: f,
|
|
655
655
|
componentName: R,
|
|
656
|
-
htmlFile:
|
|
656
|
+
htmlFile: g ? u : null
|
|
657
657
|
}), w = {
|
|
658
658
|
hostname: "localhost",
|
|
659
|
-
port:
|
|
659
|
+
port: d,
|
|
660
660
|
path: "/_register",
|
|
661
661
|
method: "POST",
|
|
662
662
|
headers: {
|
|
663
663
|
"Content-Type": "application/json",
|
|
664
|
-
"Content-Length": Buffer.byteLength(
|
|
664
|
+
"Content-Length": Buffer.byteLength(h)
|
|
665
665
|
}
|
|
666
|
-
},
|
|
666
|
+
}, $ = n.default.request(w, (I) => {
|
|
667
667
|
let F = "";
|
|
668
|
-
|
|
669
|
-
|
|
668
|
+
I.on("data", (H) => F += H), I.on("end", () => {
|
|
669
|
+
I.statusCode === 200 ? l(JSON.parse(F)) : a(new Error(`Registration failed: ${I.statusCode}`));
|
|
670
670
|
});
|
|
671
671
|
});
|
|
672
|
-
|
|
673
|
-
}),
|
|
674
|
-
const
|
|
672
|
+
$.on("error", a), $.write(h), $.end();
|
|
673
|
+
}), vt = () => new Promise((l, a) => {
|
|
674
|
+
const f = JSON.stringify({ componentId: M }), h = {
|
|
675
675
|
hostname: "localhost",
|
|
676
|
-
port:
|
|
676
|
+
port: d,
|
|
677
677
|
path: "/_unregister",
|
|
678
678
|
method: "POST",
|
|
679
679
|
headers: {
|
|
680
680
|
"Content-Type": "application/json",
|
|
681
|
-
"Content-Length": Buffer.byteLength(
|
|
681
|
+
"Content-Length": Buffer.byteLength(f)
|
|
682
682
|
}
|
|
683
|
-
}, w = n.default.request(
|
|
684
|
-
|
|
683
|
+
}, w = n.default.request(h, ($) => {
|
|
684
|
+
l();
|
|
685
685
|
});
|
|
686
|
-
w.on("error", () =>
|
|
687
|
-
}),
|
|
686
|
+
w.on("error", () => l()), w.write(f), w.end();
|
|
687
|
+
}), St = (l) => `
|
|
688
688
|
<!-- MYOP HMR -->
|
|
689
689
|
<script>
|
|
690
690
|
(function() {
|
|
691
|
-
const componentId = '${
|
|
692
|
-
const wsUrl = 'ws://localhost:${
|
|
691
|
+
const componentId = '${l}';
|
|
692
|
+
const wsUrl = 'ws://localhost:${d}/_hmr/' + componentId;
|
|
693
693
|
let ws;
|
|
694
694
|
let reconnectAttempts = 0;
|
|
695
695
|
const maxReconnectAttempts = 10;
|
|
@@ -789,76 +789,76 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
789
789
|
connect();
|
|
790
790
|
})();
|
|
791
791
|
<\/script>
|
|
792
|
-
`,
|
|
793
|
-
if (!k) return
|
|
794
|
-
const
|
|
795
|
-
return
|
|
796
|
-
},
|
|
797
|
-
const
|
|
798
|
-
let
|
|
799
|
-
return
|
|
800
|
-
Buffer.from([129,
|
|
792
|
+
`, ke = (l, a) => {
|
|
793
|
+
if (!k) return l;
|
|
794
|
+
const f = St(a);
|
|
795
|
+
return l.includes("</body>") ? l.replace("</body>", `${f}</body>`) : l.includes("</html>") ? l.replace("</html>", `${f}</html>`) : l + f;
|
|
796
|
+
}, qe = (l) => {
|
|
797
|
+
const a = Buffer.from(l), f = a.length;
|
|
798
|
+
let h;
|
|
799
|
+
return f < 126 ? h = Buffer.concat([
|
|
800
|
+
Buffer.from([129, f]),
|
|
801
801
|
// FIN + text frame, length
|
|
802
|
-
|
|
803
|
-
]) :
|
|
802
|
+
a
|
|
803
|
+
]) : f < 65536 ? h = Buffer.concat([
|
|
804
804
|
Buffer.from([129, 126]),
|
|
805
805
|
// FIN + text frame, extended length
|
|
806
|
-
Buffer.from([
|
|
806
|
+
Buffer.from([f >> 8, f & 255]),
|
|
807
807
|
// 16-bit length
|
|
808
|
-
|
|
809
|
-
]) :
|
|
808
|
+
a
|
|
809
|
+
]) : h = Buffer.concat([
|
|
810
810
|
Buffer.from([129, 127]),
|
|
811
811
|
// FIN + text frame, extended length
|
|
812
|
-
Buffer.from([0, 0, 0, 0,
|
|
812
|
+
Buffer.from([0, 0, 0, 0, f >> 24, f >> 16 & 255, f >> 8 & 255, f & 255]),
|
|
813
813
|
// 64-bit length
|
|
814
|
-
|
|
815
|
-
]),
|
|
816
|
-
},
|
|
814
|
+
a
|
|
815
|
+
]), h;
|
|
816
|
+
}, Xe = () => {
|
|
817
817
|
if (!k) return;
|
|
818
|
-
const
|
|
819
|
-
let
|
|
818
|
+
const l = g ? u : t.default.join(y, "index.html");
|
|
819
|
+
let a;
|
|
820
820
|
try {
|
|
821
|
-
const
|
|
822
|
-
|
|
823
|
-
} catch (
|
|
824
|
-
console.error("β Failed to read HTML for HMR:",
|
|
821
|
+
const f = o.default.readFileSync(l, "utf-8");
|
|
822
|
+
a = ke(f, M);
|
|
823
|
+
} catch (f) {
|
|
824
|
+
console.error("β Failed to read HTML for HMR:", f.message);
|
|
825
825
|
return;
|
|
826
826
|
}
|
|
827
|
-
if (
|
|
828
|
-
const
|
|
829
|
-
if (!
|
|
827
|
+
if (Ne) {
|
|
828
|
+
const f = X.get(M);
|
|
829
|
+
if (!f || f.size === 0)
|
|
830
830
|
return;
|
|
831
|
-
console.log(`π₯ Notifying ${
|
|
832
|
-
const
|
|
831
|
+
console.log(`π₯ Notifying ${f.size} HMR client(s)`);
|
|
832
|
+
const h = JSON.stringify({
|
|
833
833
|
type: "update",
|
|
834
|
-
html:
|
|
835
|
-
}), w =
|
|
836
|
-
|
|
834
|
+
html: a
|
|
835
|
+
}), w = qe(h);
|
|
836
|
+
f.forEach(($) => {
|
|
837
837
|
try {
|
|
838
|
-
|
|
838
|
+
$.write(w);
|
|
839
839
|
} catch {
|
|
840
|
-
|
|
840
|
+
f.delete($);
|
|
841
841
|
}
|
|
842
842
|
});
|
|
843
843
|
} else {
|
|
844
|
-
const
|
|
844
|
+
const f = JSON.stringify({
|
|
845
845
|
componentId: M,
|
|
846
|
-
html:
|
|
847
|
-
}),
|
|
846
|
+
html: a
|
|
847
|
+
}), h = {
|
|
848
848
|
hostname: "localhost",
|
|
849
|
-
port:
|
|
849
|
+
port: d,
|
|
850
850
|
path: "/_hmr_notify",
|
|
851
851
|
method: "POST",
|
|
852
852
|
headers: {
|
|
853
853
|
"Content-Type": "application/json",
|
|
854
|
-
"Content-Length": Buffer.byteLength(
|
|
854
|
+
"Content-Length": Buffer.byteLength(f)
|
|
855
855
|
},
|
|
856
856
|
timeout: 5e3
|
|
857
|
-
}, w = n.default.request(
|
|
858
|
-
let
|
|
859
|
-
|
|
857
|
+
}, w = n.default.request(h, ($) => {
|
|
858
|
+
let I = "";
|
|
859
|
+
$.on("data", (F) => I += F), $.on("end", () => {
|
|
860
860
|
try {
|
|
861
|
-
const F = JSON.parse(
|
|
861
|
+
const F = JSON.parse(I);
|
|
862
862
|
F.notified > 0 && console.log(`π₯ Notified ${F.notified} HMR client(s) via server`);
|
|
863
863
|
} catch {
|
|
864
864
|
}
|
|
@@ -867,173 +867,173 @@ Sec-WebSocket-Accept: ${b}\r
|
|
|
867
867
|
w.on("error", () => {
|
|
868
868
|
}), w.on("timeout", () => {
|
|
869
869
|
w.destroy();
|
|
870
|
-
}), w.write(
|
|
870
|
+
}), w.write(f), w.end();
|
|
871
871
|
}
|
|
872
872
|
};
|
|
873
|
-
let
|
|
874
|
-
const
|
|
873
|
+
let Re = { hasTriedPlatformFix: !1, hasTriedInstall: !1 };
|
|
874
|
+
const he = (l) => {
|
|
875
875
|
if (S) {
|
|
876
876
|
x = !0;
|
|
877
877
|
return;
|
|
878
878
|
}
|
|
879
879
|
S = !0, console.log(`
|
|
880
|
-
π¨ Building...`), e("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (
|
|
881
|
-
if (S = !1,
|
|
882
|
-
const w = await
|
|
883
|
-
...
|
|
884
|
-
onRetry: () =>
|
|
880
|
+
π¨ Building...`), e("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (a, f, h) => {
|
|
881
|
+
if (S = !1, a) {
|
|
882
|
+
const w = await pt(a, f, h, e, {
|
|
883
|
+
...Re,
|
|
884
|
+
onRetry: () => he(l)
|
|
885
885
|
});
|
|
886
|
-
|
|
886
|
+
Re = { ...Re, ...w }, w.handled || (console.error("β Build failed:", a.message), h && console.error(h));
|
|
887
887
|
} else
|
|
888
|
-
console.log("β
Build completed"),
|
|
889
|
-
x && (x = !1,
|
|
888
|
+
console.log("β
Build completed"), f && console.log(f), Xe(), l && l();
|
|
889
|
+
x && (x = !1, he());
|
|
890
890
|
});
|
|
891
|
-
},
|
|
892
|
-
o.default.readdir(
|
|
893
|
-
|
|
894
|
-
const w = t.default.join(
|
|
895
|
-
if (
|
|
896
|
-
|
|
897
|
-
else if (
|
|
898
|
-
const
|
|
899
|
-
if (
|
|
891
|
+
}, et = /* @__PURE__ */ new Set(), _e = (l) => {
|
|
892
|
+
o.default.readdir(l, { withFileTypes: !0 }, (a, f) => {
|
|
893
|
+
a || (f.forEach((h) => {
|
|
894
|
+
const w = t.default.join(l, h.name);
|
|
895
|
+
if (h.isDirectory())
|
|
896
|
+
h.name !== "node_modules" && h.name !== "dist" && !h.name.startsWith(".") && _e(w);
|
|
897
|
+
else if (h.isFile()) {
|
|
898
|
+
const $ = t.default.extname(h.name);
|
|
899
|
+
if ($ === ".js" || $ === ".css" || $ === ".html")
|
|
900
900
|
try {
|
|
901
|
-
const
|
|
902
|
-
|
|
901
|
+
const I = o.default.readFileSync(w, "utf-8");
|
|
902
|
+
P.set(w, I);
|
|
903
903
|
} catch {
|
|
904
904
|
}
|
|
905
905
|
}
|
|
906
|
-
}),
|
|
906
|
+
}), et.has(l) || (et.add(l), o.default.watch(l, (h, w) => {
|
|
907
907
|
if (!w) return;
|
|
908
|
-
const
|
|
909
|
-
if (
|
|
910
|
-
const
|
|
908
|
+
const $ = t.default.extname(w);
|
|
909
|
+
if ($ !== ".js" && $ !== ".css" && $ !== ".html") return;
|
|
910
|
+
const I = t.default.join(l, w);
|
|
911
911
|
setTimeout(() => {
|
|
912
912
|
try {
|
|
913
|
-
const F = o.default.readFileSync(
|
|
914
|
-
F !== H && (
|
|
913
|
+
const F = o.default.readFileSync(I, "utf-8"), H = P.get(I);
|
|
914
|
+
F !== H && (P.set(I, F), console.log(`π File changed: ${I}`), g ? Xe() : he());
|
|
915
915
|
} catch {
|
|
916
916
|
}
|
|
917
917
|
}, 50);
|
|
918
918
|
})));
|
|
919
919
|
});
|
|
920
|
-
},
|
|
920
|
+
}, tt = (l) => {
|
|
921
921
|
console.log(`
|
|
922
|
-
π¨ Component: ${M}`),
|
|
923
|
-
`),
|
|
922
|
+
π¨ Component: ${M}`), g ? (console.log("π No build needed (single HTML file mode)"), _e(T), console.log(`π Watching ${u} for changes...`), console.log(`Press Ctrl+C to stop
|
|
923
|
+
`), l && l()) : (he(l), _e(T), console.log("π Watching .js, .css, and .html files for changes..."), console.log(`Press Ctrl+C to stop
|
|
924
924
|
`));
|
|
925
|
-
},
|
|
926
|
-
const
|
|
925
|
+
}, xt = () => new Promise((l) => {
|
|
926
|
+
const a = {
|
|
927
927
|
hostname: "localhost",
|
|
928
|
-
port:
|
|
928
|
+
port: d,
|
|
929
929
|
path: "/_list",
|
|
930
930
|
method: "GET",
|
|
931
931
|
timeout: 1e3
|
|
932
|
-
},
|
|
933
|
-
|
|
932
|
+
}, f = n.default.request(a, (h) => {
|
|
933
|
+
l(!0);
|
|
934
934
|
});
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
}),
|
|
938
|
-
}),
|
|
939
|
-
const
|
|
940
|
-
if (
|
|
935
|
+
f.on("error", () => l(!1)), f.on("timeout", () => {
|
|
936
|
+
f.destroy(), l(!1);
|
|
937
|
+
}), f.end();
|
|
938
|
+
}), $t = () => new Promise((l) => {
|
|
939
|
+
const a = n.default.createServer((f, h) => {
|
|
940
|
+
if (h.setHeader("Content-Type", "application/json"), f.method === "POST" && f.url === "/_register") {
|
|
941
941
|
let w = "";
|
|
942
|
-
|
|
942
|
+
f.on("data", ($) => w += $), f.on("end", () => {
|
|
943
943
|
try {
|
|
944
|
-
const { componentId:
|
|
945
|
-
|
|
946
|
-
const
|
|
947
|
-
console.log(`β
Registered: ${
|
|
948
|
-
} catch (
|
|
949
|
-
|
|
944
|
+
const { componentId: $, distPath: I, componentName: F, htmlFile: H } = JSON.parse(w);
|
|
945
|
+
N.set($, { path: I, name: F || null, htmlFile: H || null });
|
|
946
|
+
const Y = F ? ` (${F})` : "";
|
|
947
|
+
console.log(`β
Registered: ${$}${Y} -> ${I}${H ? "/" + H : ""}`), h.writeHead(200), h.end(JSON.stringify({ success: !0, registered: Array.from(N.keys()) }));
|
|
948
|
+
} catch ($) {
|
|
949
|
+
h.writeHead(400), h.end(JSON.stringify({ error: $.message }));
|
|
950
950
|
}
|
|
951
951
|
});
|
|
952
|
-
} else if (
|
|
952
|
+
} else if (f.method === "POST" && f.url === "/_unregister") {
|
|
953
953
|
let w = "";
|
|
954
|
-
|
|
954
|
+
f.on("data", ($) => w += $), f.on("end", () => {
|
|
955
955
|
try {
|
|
956
|
-
const { componentId:
|
|
957
|
-
|
|
958
|
-
} catch (
|
|
959
|
-
|
|
956
|
+
const { componentId: $ } = JSON.parse(w);
|
|
957
|
+
N.delete($), console.log(`β Unregistered: ${$}`), h.writeHead(200), h.end(JSON.stringify({ success: !0 }));
|
|
958
|
+
} catch ($) {
|
|
959
|
+
h.writeHead(400), h.end(JSON.stringify({ error: $.message }));
|
|
960
960
|
}
|
|
961
961
|
});
|
|
962
|
-
} else
|
|
962
|
+
} else f.method === "GET" && f.url === "/_list" ? (h.writeHead(200), h.end(JSON.stringify({ components: Array.from(N.entries()) }))) : (h.writeHead(404), h.end(JSON.stringify({ error: "Not found" })));
|
|
963
963
|
});
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
}),
|
|
964
|
+
a.on("error", () => {
|
|
965
|
+
l(!1);
|
|
966
|
+
}), a.listen(d, () => {
|
|
967
967
|
console.log(`
|
|
968
|
-
π Taking over as server...`), console.log(`π‘ Management server on port ${
|
|
969
|
-
|
|
970
|
-
}), ge.listen(
|
|
971
|
-
console.log(`π‘ Main server running at http://localhost:${
|
|
972
|
-
const
|
|
973
|
-
|
|
974
|
-
path:
|
|
968
|
+
π Taking over as server...`), console.log(`π‘ Management server on port ${d}`), ge.on("error", () => {
|
|
969
|
+
a.close(), l(!1);
|
|
970
|
+
}), ge.listen(c, () => {
|
|
971
|
+
console.log(`π‘ Main server running at http://localhost:${c}`);
|
|
972
|
+
const f = g ? t.default.resolve(T) : t.default.resolve(T, y);
|
|
973
|
+
N.set(M, {
|
|
974
|
+
path: f,
|
|
975
975
|
name: R,
|
|
976
|
-
htmlFile:
|
|
976
|
+
htmlFile: g ? u : null
|
|
977
977
|
});
|
|
978
|
-
const
|
|
979
|
-
console.log(`β
Registered component: ${M}${
|
|
978
|
+
const h = R ? ` (${R})` : "";
|
|
979
|
+
console.log(`β
Registered component: ${M}${h}`), console.log(`π‘ Access at: http://localhost:${c}/view/${M}/`), l(!0);
|
|
980
980
|
});
|
|
981
981
|
});
|
|
982
982
|
});
|
|
983
|
-
let
|
|
984
|
-
const
|
|
985
|
-
|
|
986
|
-
await
|
|
987
|
-
β οΈ Server appears to be down, attempting to take over...`), await
|
|
983
|
+
let ye;
|
|
984
|
+
const ot = () => {
|
|
985
|
+
ye = setInterval(async () => {
|
|
986
|
+
await xt() || (clearInterval(ye), console.log(`
|
|
987
|
+
β οΈ Server appears to be down, attempting to take over...`), await $t() ? (console.log("β
Successfully took over as server"), Ne = !0) : (console.log("βΉοΈ Another instance took over, re-registering..."), setTimeout(async () => {
|
|
988
988
|
try {
|
|
989
|
-
await
|
|
990
|
-
} catch (
|
|
991
|
-
console.error("β Failed to re-register:",
|
|
989
|
+
await Ze(), console.log(`β
Re-registered component: ${M}`), ot();
|
|
990
|
+
} catch (f) {
|
|
991
|
+
console.error("β Failed to re-register:", f.message);
|
|
992
992
|
}
|
|
993
993
|
}, 2e3)));
|
|
994
994
|
}, 3e3);
|
|
995
|
-
},
|
|
995
|
+
}, nt = async () => {
|
|
996
996
|
console.log(`
|
|
997
997
|
|
|
998
|
-
π Shutting down...`),
|
|
998
|
+
π Shutting down...`), ye && clearInterval(ye), await vt(), process.exit(0);
|
|
999
999
|
};
|
|
1000
|
-
process.on("SIGINT",
|
|
1001
|
-
let
|
|
1002
|
-
|
|
1003
|
-
if (
|
|
1000
|
+
process.on("SIGINT", nt), process.on("SIGTERM", nt);
|
|
1001
|
+
let Ne = !1;
|
|
1002
|
+
Oe.on("error", async (l) => {
|
|
1003
|
+
if (l.code === "EADDRINUSE") {
|
|
1004
1004
|
console.log(`
|
|
1005
1005
|
π Connecting to existing dev server...`);
|
|
1006
1006
|
try {
|
|
1007
|
-
M = await
|
|
1008
|
-
const
|
|
1009
|
-
console.log(`β
Registered component: ${M}`), console.log(`π‘ Access at: http://localhost:${
|
|
1010
|
-
process.env.MYOP_NO_BROWSER ||
|
|
1011
|
-
}),
|
|
1012
|
-
} catch (
|
|
1013
|
-
console.error("β Failed to register component:",
|
|
1007
|
+
M = await D();
|
|
1008
|
+
const a = await Ze();
|
|
1009
|
+
console.log(`β
Registered component: ${M}`), console.log(`π‘ Access at: http://localhost:${c}/view/${M}/`), console.log(`π All registered components: ${a.registered.join(", ")}`), tt(() => {
|
|
1010
|
+
process.env.MYOP_NO_BROWSER || b(`http://localhost:${c}/view/${M}/`);
|
|
1011
|
+
}), ot();
|
|
1012
|
+
} catch (a) {
|
|
1013
|
+
console.error("β Failed to register component:", a.message), process.exit(1);
|
|
1014
1014
|
}
|
|
1015
1015
|
} else
|
|
1016
|
-
console.error("β Management server error:",
|
|
1017
|
-
}),
|
|
1018
|
-
|
|
1019
|
-
π Starting shared dev server...`), console.log(`π‘ Management server on port ${
|
|
1020
|
-
console.error("β Main server error:",
|
|
1021
|
-
}), ge.listen(
|
|
1022
|
-
console.log(`π‘ Main server running at http://localhost:${
|
|
1023
|
-
const
|
|
1024
|
-
|
|
1025
|
-
path:
|
|
1016
|
+
console.error("β Management server error:", l.message), process.exit(1);
|
|
1017
|
+
}), Oe.on("upgrade", wt), Oe.listen(d, async () => {
|
|
1018
|
+
Ne = !0, console.log(`
|
|
1019
|
+
π Starting shared dev server...`), console.log(`π‘ Management server on port ${d}`), ge.on("error", (l) => {
|
|
1020
|
+
console.error("β Main server error:", l.message), process.exit(1);
|
|
1021
|
+
}), ge.listen(c, async () => {
|
|
1022
|
+
console.log(`π‘ Main server running at http://localhost:${c}`), (M === "DEV" || M === "NEW") && (M = "DEV1");
|
|
1023
|
+
const l = g ? t.default.resolve(T) : t.default.resolve(T, y);
|
|
1024
|
+
N.set(M, {
|
|
1025
|
+
path: l,
|
|
1026
1026
|
name: R,
|
|
1027
|
-
htmlFile:
|
|
1027
|
+
htmlFile: g ? u : null
|
|
1028
1028
|
});
|
|
1029
|
-
const
|
|
1030
|
-
console.log(`β
Registered component: ${M}${
|
|
1031
|
-
process.env.MYOP_NO_BROWSER ||
|
|
1029
|
+
const a = R ? ` (${R})` : "";
|
|
1030
|
+
console.log(`β
Registered component: ${M}${a}`), console.log(`π‘ Access at: http://localhost:${c}/view/${M}/`), tt(() => {
|
|
1031
|
+
process.env.MYOP_NO_BROWSER || b(`http://localhost:${c}/view/${M}/`);
|
|
1032
1032
|
});
|
|
1033
1033
|
});
|
|
1034
1034
|
});
|
|
1035
1035
|
}
|
|
1036
|
-
const
|
|
1036
|
+
const A = class A {
|
|
1037
1037
|
constructor(t) {
|
|
1038
1038
|
this.components = t.map(
|
|
1039
1039
|
(e) => typeof e == "string" ? { name: e, path: "", id: "" } : e
|
|
@@ -1042,7 +1042,7 @@ const D = class D {
|
|
|
1042
1042
|
this.logs.set(e.name, []), this.scrollPos.set(e.name, 0), this.statuses.set(e.name, "Initializing..."), this.statusKeys.set(e.name, "initializing");
|
|
1043
1043
|
this.cols = process.stdout.columns || 120, this.rows = process.stdout.rows || 30, process.stdout.on("resize", () => {
|
|
1044
1044
|
this.cols = process.stdout.columns || 120, this.rows = process.stdout.rows || 30, this.needsFullRedraw = !0, this.calculateLayout(), this.render();
|
|
1045
|
-
}), this.setupKeyboardInput(), process.stdout.write(
|
|
1045
|
+
}), this.setupKeyboardInput(), process.stdout.write(A.ESC.hideCursor), this.calculateLayout(), this.render(), this.uptimeInterval = setInterval(() => this.updateHeader(), 1e3);
|
|
1046
1046
|
}
|
|
1047
1047
|
setupKeyboardInput() {
|
|
1048
1048
|
process.stdin.isTTY && (process.stdin.setRawMode(!0), process.stdin.resume(), process.stdin.setEncoding("utf8"), process.stdin.on("data", (t) => {
|
|
@@ -1083,15 +1083,15 @@ const D = class D {
|
|
|
1083
1083
|
const t = this.components.length, e = 38;
|
|
1084
1084
|
let n;
|
|
1085
1085
|
this.cols >= e * 3 + 4 ? n = Math.min(t, 3) : this.cols >= e * 2 + 2 ? n = Math.min(t, 2) : n = 1;
|
|
1086
|
-
const s = Math.ceil(t / n), i = Math.floor(this.cols / n),
|
|
1087
|
-
this.visibleLogLines = Math.max(2,
|
|
1088
|
-
for (let
|
|
1089
|
-
const y = this.components[
|
|
1086
|
+
const s = Math.ceil(t / n), i = Math.floor(this.cols / n), r = 2, m = this.rows - r - 2, c = Math.floor(m / s);
|
|
1087
|
+
this.visibleLogLines = Math.max(2, c - 4), this.layout = { panelsPerRow: n, panelWidth: i, numRows: s, panelHeight: c }, this.panelPositions.clear();
|
|
1088
|
+
for (let d = 0; d < t; d++) {
|
|
1089
|
+
const y = this.components[d], S = Math.floor(d / n), x = d % n;
|
|
1090
1090
|
this.panelPositions.set(y.name, {
|
|
1091
|
-
row:
|
|
1091
|
+
row: r + 1 + S * c,
|
|
1092
1092
|
col: x * i + 1,
|
|
1093
1093
|
width: i,
|
|
1094
|
-
height:
|
|
1094
|
+
height: c
|
|
1095
1095
|
});
|
|
1096
1096
|
}
|
|
1097
1097
|
}
|
|
@@ -1110,8 +1110,8 @@ const D = class D {
|
|
|
1110
1110
|
s.includes("initializing") || s.includes("β³") ? n = "initializing" : s.includes("starting") ? n = "starting" : s.includes("building") || s.includes("π¨") ? n = "building" : s.includes("ready") || s.includes("β
") ? n = "ready" : s.includes("changed") || s.includes("π") ? n = "changed" : s.includes("hmr") ? n = "hmr_update" : s.includes("π₯") ? n = "hmr" : s.includes("error") || s.includes("β") ? n = "error" : s.includes("warning") || s.includes("β ") ? n = "warning" : (s.includes("stopped") || s.includes("exited")) && (n = "stopped"), this.statuses.set(t, e), this.statusKeys.set(t, n), this.queueUpdate(t);
|
|
1111
1111
|
}
|
|
1112
1112
|
scroll(t, e) {
|
|
1113
|
-
const n = this.logs.get(t) || [], s = this.scrollPos.get(t) || 0, i = Math.max(0, n.length - this.visibleLogLines),
|
|
1114
|
-
|
|
1113
|
+
const n = this.logs.get(t) || [], s = this.scrollPos.get(t) || 0, i = Math.max(0, n.length - this.visibleLogLines), r = Math.max(0, Math.min(i, s + e));
|
|
1114
|
+
r !== s && (this.scrollPos.set(t, r), this.queueUpdate(t));
|
|
1115
1115
|
}
|
|
1116
1116
|
queueUpdate(t) {
|
|
1117
1117
|
this.pendingUpdates.add(t), this.renderQueued || (this.renderQueued = !0, setImmediate(() => {
|
|
@@ -1132,44 +1132,44 @@ const D = class D {
|
|
|
1132
1132
|
return `${e}:${n.toString().padStart(2, "0")}`;
|
|
1133
1133
|
}
|
|
1134
1134
|
updateHeader() {
|
|
1135
|
-
const t =
|
|
1135
|
+
const t = A.C, e = Array.from(this.statusKeys.values()).filter((i) => i === "ready").length, n = this.components.length;
|
|
1136
1136
|
let s = `${t.dim}π‘${t.reset} http://localhost:9292 ${t.gray}|${t.reset} `;
|
|
1137
|
-
s += `${t.green}${e}${t.reset}/${n} ready ${t.gray}|${t.reset} `, s += `β± ${this.getUptime()} ${t.gray}|${t.reset} `, s += `Press ${t.yellow}Ctrl+C${t.reset} to stop`, s +=
|
|
1137
|
+
s += `${t.green}${e}${t.reset}/${n} ready ${t.gray}|${t.reset} `, s += `β± ${this.getUptime()} ${t.gray}|${t.reset} `, s += `Press ${t.yellow}Ctrl+C${t.reset} to stop`, s += A.ESC.clearLine.slice(0, -1), process.stdout.write(A.ESC.moveTo(2, 1) + s);
|
|
1138
1138
|
}
|
|
1139
1139
|
renderPanel(t) {
|
|
1140
|
-
const e =
|
|
1140
|
+
const e = A.C, n = A.STATUS, s = this.panelPositions.get(t);
|
|
1141
1141
|
if (!s) return;
|
|
1142
|
-
const i = this.components.findIndex((
|
|
1143
|
-
let
|
|
1144
|
-
|
|
1145
|
-
const
|
|
1146
|
-
|
|
1147
|
-
const
|
|
1148
|
-
let j = `${
|
|
1149
|
-
j += " ".repeat(Math.max(0, x -
|
|
1142
|
+
const i = this.components.findIndex((D) => D.name === t), r = this.components[i], p = i === this.selectedPanel, m = this.statusKeys.get(t) || "initializing", c = n[m], d = e[c.color], y = this.logs.get(t) || [], S = this.scrollPos.get(t) || 0, x = s.width - 1, g = p ? e.cyan : e.gray, u = [], E = r.name.substring(0, x - 20);
|
|
1143
|
+
let O = `${g}ββ${e.reset} ${d}${c.icon}${e.reset} `;
|
|
1144
|
+
O += `${e.bold}${E}${e.reset} ${e.gray}β${e.reset} ${d}${c.label}${e.reset} `;
|
|
1145
|
+
const b = 5 + E.length + c.label.length + 3;
|
|
1146
|
+
O += `${g}${"β".repeat(Math.max(0, x - b))}β${e.reset}`, u.push(A.ESC.moveTo(s.row, s.col) + O);
|
|
1147
|
+
const P = (r.path || "").substring(0, x - 6);
|
|
1148
|
+
let j = `${g}β${e.reset} ${e.dim}${P}${e.reset}`;
|
|
1149
|
+
j += " ".repeat(Math.max(0, x - P.length - 3)), j += `${g}β${e.reset}`, u.push(A.ESC.moveTo(s.row + 1, s.col) + j);
|
|
1150
1150
|
const M = y.length, R = M > this.visibleLogLines ? `${S + 1}-${Math.min(S + this.visibleLogLines, M)}/${M}` : "";
|
|
1151
|
-
let k = `${
|
|
1152
|
-
R && (k += `${e.dim}${R}${e.reset}`), k += `${
|
|
1151
|
+
let k = `${g}β${"β".repeat(x - R.length - 4)}${e.reset}`;
|
|
1152
|
+
R && (k += `${e.dim}${R}${e.reset}`), k += `${g}${"β".repeat(2)}β€${e.reset}`, u.push(A.ESC.moveTo(s.row + 2, s.col) + k);
|
|
1153
1153
|
const L = y.slice(S, S + this.visibleLogLines);
|
|
1154
|
-
for (let
|
|
1155
|
-
const
|
|
1156
|
-
let
|
|
1157
|
-
if (
|
|
1158
|
-
let
|
|
1159
|
-
|
|
1160
|
-
const oe =
|
|
1161
|
-
|
|
1162
|
-
const
|
|
1163
|
-
|
|
1154
|
+
for (let D = 0; D < this.visibleLogLines; D++) {
|
|
1155
|
+
const T = L[D];
|
|
1156
|
+
let W = `${g}β${e.reset}`;
|
|
1157
|
+
if (T) {
|
|
1158
|
+
let N = e.white;
|
|
1159
|
+
T.type === "success" ? N = e.green : T.type === "error" ? N = e.red : T.type === "warning" ? N = e.yellow : T.type === "hmr" ? N = e.magenta : T.type === "change" && (N = e.blue);
|
|
1160
|
+
const oe = T.message.substring(0, x - 12);
|
|
1161
|
+
W += `${e.dim}${T.timestamp}${e.reset} ${N}${oe}${e.reset}`;
|
|
1162
|
+
const Ie = x - T.timestamp.length - oe.length - 2;
|
|
1163
|
+
W += " ".repeat(Math.max(0, Ie));
|
|
1164
1164
|
} else
|
|
1165
|
-
|
|
1166
|
-
|
|
1165
|
+
W += " ".repeat(x - 2);
|
|
1166
|
+
W += `${g}β${e.reset}`, u.push(A.ESC.moveTo(s.row + 3 + D, s.col) + W);
|
|
1167
1167
|
}
|
|
1168
|
-
|
|
1168
|
+
u.push(A.ESC.moveTo(s.row + 3 + this.visibleLogLines, s.col) + `${g}β${"β".repeat(x - 2)}β${e.reset}`), process.stdout.write(u.join(""));
|
|
1169
1169
|
}
|
|
1170
1170
|
fullRender() {
|
|
1171
|
-
const t =
|
|
1172
|
-
process.stdout.write(
|
|
1171
|
+
const t = A.C;
|
|
1172
|
+
process.stdout.write(A.ESC.clearScreen + A.ESC.moveTo(1, 1));
|
|
1173
1173
|
const e = " MYOP MONOREPO DEV ", n = Math.floor((this.cols - e.length) / 2);
|
|
1174
1174
|
process.stdout.write(`${t.cyan}${"β".repeat(n)}${t.bold}${t.bgCyan}${t.black}${e}${t.reset}${t.cyan}${"β".repeat(this.cols - n - e.length)}${t.reset}`), this.updateHeader();
|
|
1175
1175
|
for (const s of this.components)
|
|
@@ -1177,26 +1177,26 @@ const D = class D {
|
|
|
1177
1177
|
this.renderFooter();
|
|
1178
1178
|
}
|
|
1179
1179
|
renderFooter() {
|
|
1180
|
-
const t =
|
|
1180
|
+
const t = A.C, e = this.rows - 1;
|
|
1181
1181
|
let n = `${t.gray}`;
|
|
1182
|
-
n += `${t.green}β${t.gray} Ready `, n += `${t.yellow}β³${t.gray} Building `, n += `${t.magenta}β‘${t.gray} HMR `, n += `${t.red}β${t.gray} Error `, n += `${t.dim}| ββ: select panel ββ: scroll PgUp/PgDn: page g/G: top/bottom${t.reset}`, process.stdout.write(
|
|
1182
|
+
n += `${t.green}β${t.gray} Ready `, n += `${t.yellow}β³${t.gray} Building `, n += `${t.magenta}β‘${t.gray} HMR `, n += `${t.red}β${t.gray} Error `, n += `${t.dim}| ββ: select panel ββ: scroll PgUp/PgDn: page g/G: top/bottom${t.reset}`, process.stdout.write(A.ESC.moveTo(e, 1) + n);
|
|
1183
1183
|
}
|
|
1184
1184
|
render() {
|
|
1185
1185
|
this.needsFullRedraw = !0, this.queueUpdate("__full__");
|
|
1186
1186
|
}
|
|
1187
1187
|
clear() {
|
|
1188
|
-
this.uptimeInterval && clearInterval(this.uptimeInterval), process.stdin.isTTY && process.stdin.setRawMode(!1), process.stdout.write(
|
|
1188
|
+
this.uptimeInterval && clearInterval(this.uptimeInterval), process.stdin.isTTY && process.stdin.setRawMode(!1), process.stdout.write(A.ESC.clearScreen + A.ESC.moveTo(1, 1) + A.ESC.showCursor);
|
|
1189
1189
|
}
|
|
1190
1190
|
};
|
|
1191
1191
|
// ANSI escape codes
|
|
1192
|
-
|
|
1192
|
+
ve(A, "ESC", {
|
|
1193
1193
|
moveTo: (t, e) => `\x1B[${t};${e}H`,
|
|
1194
1194
|
hideCursor: "\x1B[?25l",
|
|
1195
1195
|
showCursor: "\x1B[?25h",
|
|
1196
1196
|
clearScreen: "\x1B[2J",
|
|
1197
1197
|
clearLine: "\x1B[2K"
|
|
1198
1198
|
}), // Colors
|
|
1199
|
-
|
|
1199
|
+
ve(A, "C", {
|
|
1200
1200
|
reset: "\x1B[0m",
|
|
1201
1201
|
bold: "\x1B[1m",
|
|
1202
1202
|
dim: "\x1B[2m",
|
|
@@ -1211,7 +1211,7 @@ we(D, "C", {
|
|
|
1211
1211
|
bgCyan: "\x1B[46m",
|
|
1212
1212
|
black: "\x1B[30m"
|
|
1213
1213
|
}), // Status configs
|
|
1214
|
-
|
|
1214
|
+
ve(A, "STATUS", {
|
|
1215
1215
|
initializing: { icon: "β", color: "yellow", label: "Initializing" },
|
|
1216
1216
|
starting: { icon: "β", color: "yellow", label: "Starting" },
|
|
1217
1217
|
building: { icon: "β³", color: "yellow", label: "Building" },
|
|
@@ -1224,125 +1224,221 @@ we(D, "STATUS", {
|
|
|
1224
1224
|
warning: { icon: "β ", color: "yellow", label: "Warning" },
|
|
1225
1225
|
stopped: { icon: "β ", color: "gray", label: "Stopped" }
|
|
1226
1226
|
});
|
|
1227
|
-
let
|
|
1228
|
-
async function
|
|
1229
|
-
const { spawn: t, exec: e } = await import("child_process"), n = await import("path"), s = o.map((
|
|
1230
|
-
name:
|
|
1231
|
-
path:
|
|
1232
|
-
id:
|
|
1233
|
-
})), i = new
|
|
1227
|
+
let Ue = A;
|
|
1228
|
+
async function zt(o) {
|
|
1229
|
+
const { spawn: t, exec: e } = await import("child_process"), n = await import("path"), s = o.map((d) => ({
|
|
1230
|
+
name: d.name,
|
|
1231
|
+
path: d.path,
|
|
1232
|
+
id: d.componentId || ""
|
|
1233
|
+
})), i = new Ue(s), r = [], p = (d) => {
|
|
1234
1234
|
const y = process.platform;
|
|
1235
1235
|
let S;
|
|
1236
|
-
y === "darwin" ? S = `open "${
|
|
1236
|
+
y === "darwin" ? S = `open "${d}"` : y === "win32" ? S = `start "" "${d}"` : S = `xdg-open "${d}"`, e(S, () => {
|
|
1237
1237
|
});
|
|
1238
|
-
},
|
|
1238
|
+
}, m = () => {
|
|
1239
1239
|
i.clear(), console.log(`
|
|
1240
|
-
π Shutting down all components...`),
|
|
1240
|
+
π Shutting down all components...`), r.forEach((d) => {
|
|
1241
1241
|
try {
|
|
1242
|
-
|
|
1242
|
+
d.kill("SIGTERM");
|
|
1243
1243
|
} catch {
|
|
1244
1244
|
}
|
|
1245
1245
|
}), setTimeout(() => process.exit(0), 500);
|
|
1246
1246
|
};
|
|
1247
|
-
process.on("SIGINT",
|
|
1248
|
-
const
|
|
1249
|
-
for (let
|
|
1250
|
-
const y = o[
|
|
1247
|
+
process.on("SIGINT", m), process.on("SIGTERM", m);
|
|
1248
|
+
const c = process.argv[1];
|
|
1249
|
+
for (let d = 0; d < o.length; d++) {
|
|
1250
|
+
const y = o[d], S = y.name;
|
|
1251
1251
|
i.setStatus(S, "β³ Starting..."), i.log(S, `Starting in ${y.path}`);
|
|
1252
|
-
const x = t("node", [
|
|
1252
|
+
const x = t("node", [c, "dev"], {
|
|
1253
1253
|
cwd: n.default.resolve(y.path),
|
|
1254
1254
|
env: { ...process.env, FORCE_COLOR: "1", MYOP_NO_BROWSER: "1" },
|
|
1255
1255
|
stdio: ["ignore", "pipe", "pipe"]
|
|
1256
1256
|
});
|
|
1257
|
-
|
|
1258
|
-
let
|
|
1259
|
-
x.stdout.on("data", (
|
|
1260
|
-
|
|
1261
|
-
const E =
|
|
1257
|
+
r.push(x);
|
|
1258
|
+
let g = "";
|
|
1259
|
+
x.stdout.on("data", (u) => {
|
|
1260
|
+
g += u.toString();
|
|
1261
|
+
const E = g.split(`
|
|
1262
1262
|
`);
|
|
1263
|
-
|
|
1264
|
-
for (const
|
|
1265
|
-
const
|
|
1266
|
-
|
|
1263
|
+
g = E.pop() || "";
|
|
1264
|
+
for (const O of E) {
|
|
1265
|
+
const b = O.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
|
|
1266
|
+
b && (b.includes("Registered component") || b.includes("Registered:") ? i.setStatus(S, "β
Ready") : b.includes("Building...") || b.includes("Running initial build") ? i.setStatus(S, "π¨ Building...") : b.includes("Build completed") || b.includes("Build succeeded") ? i.setStatus(S, "β
Ready") : b.includes("Build failed") ? i.setStatus(S, "β Build Error") : b.includes("File changed") ? (i.setStatus(S, "π Changed"), setTimeout(() => i.setStatus(S, "β
Ready"), 1500)) : b.includes("Notifying") && b.includes("HMR") ? (i.setStatus(S, "π₯ HMR Update"), setTimeout(() => i.setStatus(S, "β
Ready"), 1e3)) : b.includes("HMR client connected") && (i.setStatus(S, "π₯ HMR Connected"), setTimeout(() => i.setStatus(S, "β
Ready"), 1e3)), !b.includes("Watching") && !b.includes("Press Ctrl+C") && !b.includes("Starting shared") && !b.includes("Management server") && !b.includes("Main server") && !b.includes("Access at:") && !b.includes("No build needed") && i.log(S, b));
|
|
1267
1267
|
}
|
|
1268
|
-
}), x.stderr.on("data", (
|
|
1269
|
-
const E =
|
|
1268
|
+
}), x.stderr.on("data", (u) => {
|
|
1269
|
+
const E = u.toString().split(`
|
|
1270
1270
|
`);
|
|
1271
|
-
for (const
|
|
1272
|
-
const
|
|
1273
|
-
|
|
1271
|
+
for (const O of E) {
|
|
1272
|
+
const b = O.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
|
|
1273
|
+
b && (i.log(S, `β οΈ ${b}`), i.setStatus(S, "β οΈ Warning"));
|
|
1274
1274
|
}
|
|
1275
|
-
}), x.on("exit", (
|
|
1276
|
-
|
|
1277
|
-
}),
|
|
1275
|
+
}), x.on("exit", (u) => {
|
|
1276
|
+
u !== 0 && u !== null && (i.setStatus(S, `β Exited (${u})`), i.log(S, `Process exited with code ${u}`));
|
|
1277
|
+
}), d < o.length - 1 && await new Promise((u) => setTimeout(u, 500));
|
|
1278
1278
|
}
|
|
1279
1279
|
i.render(), setTimeout(() => {
|
|
1280
|
-
|
|
1280
|
+
p("http://localhost:9292");
|
|
1281
1281
|
}, 2e3);
|
|
1282
1282
|
}
|
|
1283
|
-
const
|
|
1283
|
+
const Wt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
1284
1284
|
__proto__: null,
|
|
1285
|
-
devCommand:
|
|
1286
|
-
monorepoDevCommand:
|
|
1287
|
-
}, Symbol.toStringTag, { value: "Module" })),
|
|
1288
|
-
function
|
|
1289
|
-
|
|
1285
|
+
devCommand: Ce,
|
|
1286
|
+
monorepoDevCommand: zt
|
|
1287
|
+
}, Symbol.toStringTag, { value: "Module" })), Vt = "https://cloud.myop.dev";
|
|
1288
|
+
async function mt(o, t) {
|
|
1289
|
+
const e = await fetch(o, {
|
|
1290
|
+
headers: { Authorization: `Bearer ${t}` }
|
|
1291
|
+
});
|
|
1292
|
+
if (!e.ok) {
|
|
1293
|
+
const n = await e.text();
|
|
1294
|
+
throw new Error(`${e.status}: ${n}`);
|
|
1295
|
+
}
|
|
1296
|
+
return e.json();
|
|
1297
|
+
}
|
|
1298
|
+
function pe(o, t, e) {
|
|
1299
|
+
const n = _.join(o, t);
|
|
1300
|
+
C.mkdirSync(_.dirname(n), { recursive: !0 }), C.writeFileSync(n, JSON.stringify(e, null, 2));
|
|
1301
|
+
}
|
|
1302
|
+
async function $e(o, t, e, n) {
|
|
1303
|
+
return mt(
|
|
1304
|
+
`${o}/export?componentId=${encodeURIComponent(e)}&env=${encodeURIComponent(n)}`,
|
|
1305
|
+
t
|
|
1306
|
+
);
|
|
1307
|
+
}
|
|
1308
|
+
async function Yt(o, t, e, n) {
|
|
1309
|
+
let s = 0;
|
|
1310
|
+
for (const i of n) {
|
|
1311
|
+
const { componentId: r, environment: p } = i;
|
|
1312
|
+
if (!(!r || !p)) {
|
|
1313
|
+
try {
|
|
1314
|
+
const m = await $e(o, t, r, p);
|
|
1315
|
+
pe(e, `components/${r}/${p}.json`, m), s++;
|
|
1316
|
+
} catch (m) {
|
|
1317
|
+
console.warn(` Warning: ${r}/${p}: ${m.message}`);
|
|
1318
|
+
}
|
|
1319
|
+
try {
|
|
1320
|
+
const m = await $e(o, t, r, "preview");
|
|
1321
|
+
pe(e, `components/${r}/preview.json`, m), s++;
|
|
1322
|
+
} catch {
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
return s;
|
|
1327
|
+
}
|
|
1328
|
+
async function Gt(o, t, e) {
|
|
1329
|
+
const n = await mt(`${o}/export`, t);
|
|
1330
|
+
pe(e, "manifest.json", n);
|
|
1331
|
+
let s = 0, i = 0;
|
|
1332
|
+
for (const r of n.components || []) {
|
|
1333
|
+
for (const p of r.environments || [])
|
|
1334
|
+
try {
|
|
1335
|
+
const m = await $e(o, t, r.id, p);
|
|
1336
|
+
pe(e, `components/${r.id}/${p}.json`, m), s++;
|
|
1337
|
+
} catch (m) {
|
|
1338
|
+
console.warn(` Warning: ${r.id}/${p}: ${m.message}`), i++;
|
|
1339
|
+
}
|
|
1340
|
+
try {
|
|
1341
|
+
const p = await $e(o, t, r.id, "preview");
|
|
1342
|
+
pe(e, `components/${r.id}/preview.json`, p), s++;
|
|
1343
|
+
} catch {
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
return { manifest: n, fileCount: s, errorCount: i };
|
|
1347
|
+
}
|
|
1348
|
+
function Kt() {
|
|
1349
|
+
v.program.command("export").description("Export components as static JSON for self-hosting").option("-k, --api-key <key>", "Myop API key (or set MYOP_API_KEY env var)").option("-o, --output <dir>", "Output directory", "./myop-static").option("-u, --url <url>", "Myop API URL (or set MYOP_API_URL env var)").option("--releases <json>", "JSON array of releases for incremental sync (from webhook payload)").option("--component <id>", "Single component ID for incremental sync").option("--env <env>", "Environment for single component sync (used with --component)").action(async (o) => {
|
|
1350
|
+
var i;
|
|
1351
|
+
const t = o.apiKey || process.env.MYOP_API_KEY, e = o.url || process.env.MYOP_API_URL || Vt, n = o.output || process.env.OUTPUT_DIR || "./myop-static";
|
|
1352
|
+
t || (console.error("Error: API key required. Use --api-key or set MYOP_API_KEY env var."), console.error("Create one at: Dashboard > Rollout Settings > Self-Hosting > API Keys"), process.exit(1));
|
|
1353
|
+
let s = null;
|
|
1354
|
+
if (o.releases)
|
|
1355
|
+
try {
|
|
1356
|
+
s = JSON.parse(o.releases), Array.isArray(s) || (s = s.releases || [s]);
|
|
1357
|
+
} catch {
|
|
1358
|
+
console.error("Error: --releases must be valid JSON"), process.exit(1);
|
|
1359
|
+
}
|
|
1360
|
+
else o.component && o.env && (s = [{ componentId: o.component, environment: o.env }]);
|
|
1361
|
+
if (s) {
|
|
1362
|
+
const r = z(`Incremental export: ${s.length} component(s)...`).start();
|
|
1363
|
+
try {
|
|
1364
|
+
const p = await Yt(e, t, n, s);
|
|
1365
|
+
r.succeed(`Incremental export done. ${p} file(s) written to ${n}/`);
|
|
1366
|
+
} catch (p) {
|
|
1367
|
+
r.fail(`Export failed: ${p.message}`), process.exit(1);
|
|
1368
|
+
}
|
|
1369
|
+
} else {
|
|
1370
|
+
const r = z(`Full export from ${e}...`).start();
|
|
1371
|
+
try {
|
|
1372
|
+
const { manifest: p, fileCount: m, errorCount: c } = await Gt(e, t, n), d = ((i = p.components) == null ? void 0 : i.length) || 0;
|
|
1373
|
+
r.succeed(
|
|
1374
|
+
`Full export done. ${m} file(s) from ${d} component(s) written to ${n}/`
|
|
1375
|
+
), c > 0 && console.warn(` ${c} file(s) failed.`);
|
|
1376
|
+
} catch (p) {
|
|
1377
|
+
r.fail(`Export failed: ${p.message}`), process.exit(1);
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
process.exit(0);
|
|
1381
|
+
});
|
|
1290
1382
|
}
|
|
1291
|
-
|
|
1383
|
+
const He = _.join(at.homedir(), ".myop"), ue = _.join(He, "credentials.json");
|
|
1384
|
+
function Qt() {
|
|
1385
|
+
C.existsSync(He) || C.mkdirSync(He, { recursive: !0, mode: 448 });
|
|
1386
|
+
}
|
|
1387
|
+
function Ve() {
|
|
1292
1388
|
try {
|
|
1293
|
-
if (!
|
|
1389
|
+
if (!C.existsSync(ue))
|
|
1294
1390
|
return null;
|
|
1295
|
-
const o =
|
|
1391
|
+
const o = C.readFileSync(ue, "utf8");
|
|
1296
1392
|
return JSON.parse(o);
|
|
1297
1393
|
} catch (o) {
|
|
1298
1394
|
return console.info("Failed to read credentials:", o.message), null;
|
|
1299
1395
|
}
|
|
1300
1396
|
}
|
|
1301
|
-
function
|
|
1302
|
-
|
|
1397
|
+
function ut(o) {
|
|
1398
|
+
Qt();
|
|
1303
1399
|
const t = {
|
|
1304
1400
|
...o,
|
|
1305
1401
|
savedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1306
1402
|
};
|
|
1307
|
-
|
|
1403
|
+
C.writeFileSync(ue, JSON.stringify(t, null, 2), {
|
|
1308
1404
|
mode: 384
|
|
1309
1405
|
// Read/write for owner only
|
|
1310
1406
|
});
|
|
1311
1407
|
}
|
|
1312
|
-
function
|
|
1408
|
+
function ft() {
|
|
1313
1409
|
try {
|
|
1314
|
-
return
|
|
1410
|
+
return C.existsSync(ue) && C.unlinkSync(ue), !0;
|
|
1315
1411
|
} catch (o) {
|
|
1316
1412
|
return console.error("Failed to clear credentials:", o.message), !1;
|
|
1317
1413
|
}
|
|
1318
1414
|
}
|
|
1319
|
-
function
|
|
1415
|
+
function Zt(o) {
|
|
1320
1416
|
if (!o || !o.expiresAt)
|
|
1321
1417
|
return !0;
|
|
1322
1418
|
const t = 5 * 60 * 1e3, e = new Date(o.expiresAt).getTime();
|
|
1323
1419
|
return Date.now() > e - t;
|
|
1324
1420
|
}
|
|
1325
|
-
function
|
|
1326
|
-
const o =
|
|
1421
|
+
function Pe() {
|
|
1422
|
+
const o = Ve();
|
|
1327
1423
|
return o ? {
|
|
1328
1424
|
email: o.userEmail,
|
|
1329
1425
|
userId: o.userId
|
|
1330
1426
|
} : null;
|
|
1331
1427
|
}
|
|
1332
|
-
const le = process.env.MYOP_MCP_URL || "https://mcp.myop.dev",
|
|
1333
|
-
function
|
|
1334
|
-
return
|
|
1428
|
+
const le = process.env.MYOP_MCP_URL || "https://mcp.myop.dev", xe = 19284, Ye = `http://localhost:${xe}/callback`, qt = "myop-cli";
|
|
1429
|
+
function Xt() {
|
|
1430
|
+
return ze.randomBytes(32).toString("base64url");
|
|
1335
1431
|
}
|
|
1336
|
-
function
|
|
1337
|
-
return
|
|
1432
|
+
function eo(o) {
|
|
1433
|
+
return ze.createHash("sha256").update(o).digest("base64url");
|
|
1338
1434
|
}
|
|
1339
|
-
async function
|
|
1435
|
+
async function to() {
|
|
1340
1436
|
const o = await fetch(`${le}/oauth/register`, {
|
|
1341
1437
|
method: "POST",
|
|
1342
1438
|
headers: { "Content-Type": "application/json" },
|
|
1343
1439
|
body: JSON.stringify({
|
|
1344
|
-
client_name:
|
|
1345
|
-
redirect_uris: [
|
|
1440
|
+
client_name: qt,
|
|
1441
|
+
redirect_uris: [Ye],
|
|
1346
1442
|
grant_types: ["authorization_code", "refresh_token"],
|
|
1347
1443
|
response_types: ["code"]
|
|
1348
1444
|
})
|
|
@@ -1353,7 +1449,7 @@ async function Yt() {
|
|
|
1353
1449
|
}
|
|
1354
1450
|
return o.json();
|
|
1355
1451
|
}
|
|
1356
|
-
function
|
|
1452
|
+
function Se(o, t, e, n = null) {
|
|
1357
1453
|
const s = {
|
|
1358
1454
|
success: `<svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="#4ade80" stroke-width="2">
|
|
1359
1455
|
<circle cx="12" cy="12" r="10"/>
|
|
@@ -1371,7 +1467,7 @@ function ve(o, t, e, n = null) {
|
|
|
1371
1467
|
success: { accent: "#4ade80", glow: "rgba(74, 222, 128, 0.1)" },
|
|
1372
1468
|
error: { accent: "#f87171", glow: "rgba(248, 113, 113, 0.1)" },
|
|
1373
1469
|
warning: { accent: "#fbbf24", glow: "rgba(251, 191, 36, 0.1)" }
|
|
1374
|
-
}, { accent:
|
|
1470
|
+
}, { accent: r, glow: p } = i[o] || i.error;
|
|
1375
1471
|
return `<!DOCTYPE html>
|
|
1376
1472
|
<html lang="en">
|
|
1377
1473
|
<head>
|
|
@@ -1432,7 +1528,7 @@ function ve(o, t, e, n = null) {
|
|
|
1432
1528
|
h1 {
|
|
1433
1529
|
font-size: 20px;
|
|
1434
1530
|
font-weight: 500;
|
|
1435
|
-
color: ${
|
|
1531
|
+
color: ${r};
|
|
1436
1532
|
margin-bottom: 12px;
|
|
1437
1533
|
letter-spacing: -0.5px;
|
|
1438
1534
|
}
|
|
@@ -1464,8 +1560,8 @@ function ve(o, t, e, n = null) {
|
|
|
1464
1560
|
display: inline-flex;
|
|
1465
1561
|
align-items: center;
|
|
1466
1562
|
gap: 8px;
|
|
1467
|
-
background: ${
|
|
1468
|
-
border: 1px solid ${
|
|
1563
|
+
background: ${p};
|
|
1564
|
+
border: 1px solid ${r}33;
|
|
1469
1565
|
border-radius: 4px;
|
|
1470
1566
|
padding: 10px 16px;
|
|
1471
1567
|
font-size: 12px;
|
|
@@ -1519,23 +1615,23 @@ function ve(o, t, e, n = null) {
|
|
|
1519
1615
|
</body>
|
|
1520
1616
|
</html>`;
|
|
1521
1617
|
}
|
|
1522
|
-
function
|
|
1618
|
+
function oo(o) {
|
|
1523
1619
|
return new Promise((t, e) => {
|
|
1524
|
-
const n =
|
|
1525
|
-
const
|
|
1526
|
-
if (
|
|
1527
|
-
const
|
|
1528
|
-
if (
|
|
1529
|
-
i.writeHead(200, { "Content-Type": "text/html" }), i.end(
|
|
1620
|
+
const n = It.createServer((s, i) => {
|
|
1621
|
+
const r = new it(s.url, `http://localhost:${xe}`);
|
|
1622
|
+
if (r.pathname === "/callback") {
|
|
1623
|
+
const p = r.searchParams.get("code"), m = r.searchParams.get("state"), c = r.searchParams.get("error");
|
|
1624
|
+
if (c) {
|
|
1625
|
+
i.writeHead(200, { "Content-Type": "text/html" }), i.end(Se(
|
|
1530
1626
|
"error",
|
|
1531
1627
|
"Authentication Failed",
|
|
1532
1628
|
"Unable to complete the authentication process.",
|
|
1533
|
-
|
|
1534
|
-
)), n.close(), e(new Error(`OAuth error: ${
|
|
1629
|
+
c
|
|
1630
|
+
)), n.close(), e(new Error(`OAuth error: ${c}`));
|
|
1535
1631
|
return;
|
|
1536
1632
|
}
|
|
1537
|
-
if (
|
|
1538
|
-
i.writeHead(400, { "Content-Type": "text/html" }), i.end(
|
|
1633
|
+
if (m !== o) {
|
|
1634
|
+
i.writeHead(400, { "Content-Type": "text/html" }), i.end(Se(
|
|
1539
1635
|
"warning",
|
|
1540
1636
|
"Security Error",
|
|
1541
1637
|
"State mismatch detected. This could indicate a CSRF attack. Please try authenticating again.",
|
|
@@ -1543,8 +1639,8 @@ function Kt(o) {
|
|
|
1543
1639
|
)), n.close(), e(new Error("State mismatch"));
|
|
1544
1640
|
return;
|
|
1545
1641
|
}
|
|
1546
|
-
if (!
|
|
1547
|
-
i.writeHead(400, { "Content-Type": "text/html" }), i.end(
|
|
1642
|
+
if (!p) {
|
|
1643
|
+
i.writeHead(400, { "Content-Type": "text/html" }), i.end(Se(
|
|
1548
1644
|
"error",
|
|
1549
1645
|
"Missing Authorization Code",
|
|
1550
1646
|
"No authorization code was received from the server.",
|
|
@@ -1552,30 +1648,30 @@ function Kt(o) {
|
|
|
1552
1648
|
)), n.close(), e(new Error("No authorization code"));
|
|
1553
1649
|
return;
|
|
1554
1650
|
}
|
|
1555
|
-
i.writeHead(200, { "Content-Type": "text/html" }), i.end(
|
|
1651
|
+
i.writeHead(200, { "Content-Type": "text/html" }), i.end(Se(
|
|
1556
1652
|
"success",
|
|
1557
1653
|
"Authentication Successful",
|
|
1558
1654
|
"You have been authenticated successfully. Return to the terminal to continue."
|
|
1559
|
-
)), n.close(), t(
|
|
1655
|
+
)), n.close(), t(p);
|
|
1560
1656
|
} else
|
|
1561
1657
|
i.writeHead(404), i.end("Not found");
|
|
1562
1658
|
});
|
|
1563
|
-
n.listen(
|
|
1564
|
-
console.info(`OAuth callback server listening on port ${
|
|
1659
|
+
n.listen(xe, () => {
|
|
1660
|
+
console.info(`OAuth callback server listening on port ${xe}`);
|
|
1565
1661
|
}), setTimeout(() => {
|
|
1566
1662
|
n.close(), e(new Error("Authentication timed out"));
|
|
1567
1663
|
}, 5 * 60 * 1e3);
|
|
1568
1664
|
});
|
|
1569
1665
|
}
|
|
1570
|
-
async function
|
|
1666
|
+
async function no(o, t, e) {
|
|
1571
1667
|
const n = await fetch(`${le}/oauth/token`, {
|
|
1572
1668
|
method: "POST",
|
|
1573
1669
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
1574
|
-
body: new
|
|
1670
|
+
body: new rt({
|
|
1575
1671
|
grant_type: "authorization_code",
|
|
1576
1672
|
code: o,
|
|
1577
1673
|
client_id: t,
|
|
1578
|
-
redirect_uri:
|
|
1674
|
+
redirect_uri: Ye,
|
|
1579
1675
|
code_verifier: e
|
|
1580
1676
|
})
|
|
1581
1677
|
});
|
|
@@ -1585,11 +1681,11 @@ async function Qt(o, t, e) {
|
|
|
1585
1681
|
}
|
|
1586
1682
|
return n.json();
|
|
1587
1683
|
}
|
|
1588
|
-
async function
|
|
1684
|
+
async function so(o, t) {
|
|
1589
1685
|
const e = await fetch(`${le}/oauth/token`, {
|
|
1590
1686
|
method: "POST",
|
|
1591
1687
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
1592
|
-
body: new
|
|
1688
|
+
body: new rt({
|
|
1593
1689
|
grant_type: "refresh_token",
|
|
1594
1690
|
refresh_token: o,
|
|
1595
1691
|
client_id: t
|
|
@@ -1601,8 +1697,8 @@ async function Zt(o, t) {
|
|
|
1601
1697
|
}
|
|
1602
1698
|
return e.json();
|
|
1603
1699
|
}
|
|
1604
|
-
async function
|
|
1605
|
-
var s, i,
|
|
1700
|
+
async function io(o) {
|
|
1701
|
+
var s, i, r;
|
|
1606
1702
|
const t = await fetch(`${le}/mcp`, {
|
|
1607
1703
|
method: "POST",
|
|
1608
1704
|
headers: {
|
|
@@ -1624,62 +1720,62 @@ async function Xt(o) {
|
|
|
1624
1720
|
const e = await t.json();
|
|
1625
1721
|
if (e.error)
|
|
1626
1722
|
throw new Error(e.error.message);
|
|
1627
|
-
const n = (
|
|
1723
|
+
const n = (r = (i = (s = e.result) == null ? void 0 : s.content) == null ? void 0 : i[0]) == null ? void 0 : r.text;
|
|
1628
1724
|
if (n)
|
|
1629
1725
|
return JSON.parse(n);
|
|
1630
1726
|
throw new Error("Invalid response from whoami");
|
|
1631
1727
|
}
|
|
1632
|
-
async function
|
|
1633
|
-
const o =
|
|
1728
|
+
async function me() {
|
|
1729
|
+
const o = z("Starting authentication...").start();
|
|
1634
1730
|
try {
|
|
1635
1731
|
o.text = "Registering OAuth client...";
|
|
1636
|
-
const e = (await
|
|
1732
|
+
const e = (await to()).client_id, n = Xt(), s = eo(n), i = ze.randomBytes(16).toString("hex");
|
|
1637
1733
|
o.text = "Waiting for authorization...";
|
|
1638
|
-
const
|
|
1639
|
-
|
|
1640
|
-
π Opening browser for authentication...`), console.log("If the browser does not open, visit:"), console.log(` ${
|
|
1641
|
-
`), await
|
|
1642
|
-
const
|
|
1734
|
+
const r = oo(i), p = new it(`${le}/oauth/authorize`);
|
|
1735
|
+
p.searchParams.set("response_type", "code"), p.searchParams.set("client_id", e), p.searchParams.set("redirect_uri", Ye), p.searchParams.set("code_challenge", s), p.searchParams.set("code_challenge_method", "S256"), p.searchParams.set("state", i), o.stop(), console.log(`
|
|
1736
|
+
π Opening browser for authentication...`), console.log("If the browser does not open, visit:"), console.log(` ${p.toString()}
|
|
1737
|
+
`), await Ot(p.toString());
|
|
1738
|
+
const m = await r;
|
|
1643
1739
|
o.start("Exchanging authorization code...");
|
|
1644
|
-
const
|
|
1740
|
+
const c = await no(m, e, n);
|
|
1645
1741
|
o.text = "Getting user info...";
|
|
1646
|
-
const
|
|
1647
|
-
accessToken:
|
|
1648
|
-
refreshToken:
|
|
1649
|
-
expiresAt: new Date(Date.now() +
|
|
1742
|
+
const d = await io(c.access_token), y = {
|
|
1743
|
+
accessToken: c.access_token,
|
|
1744
|
+
refreshToken: c.refresh_token,
|
|
1745
|
+
expiresAt: new Date(Date.now() + c.expires_in * 1e3).toISOString(),
|
|
1650
1746
|
clientId: e,
|
|
1651
|
-
userId:
|
|
1652
|
-
userEmail:
|
|
1747
|
+
userId: d.userId,
|
|
1748
|
+
userEmail: d.email
|
|
1653
1749
|
};
|
|
1654
|
-
return
|
|
1750
|
+
return ut(y), o.succeed(`Authenticated as ${d.email}`), y;
|
|
1655
1751
|
} catch (t) {
|
|
1656
1752
|
throw o.fail(`Authentication failed: ${t.message}`), t;
|
|
1657
1753
|
}
|
|
1658
1754
|
}
|
|
1659
|
-
async function
|
|
1660
|
-
const o =
|
|
1755
|
+
async function gt() {
|
|
1756
|
+
const o = Ve();
|
|
1661
1757
|
if (!o) {
|
|
1662
1758
|
console.log("Not currently logged in.");
|
|
1663
1759
|
return;
|
|
1664
1760
|
}
|
|
1665
|
-
|
|
1761
|
+
ft(), console.log(`β
Logged out (was: ${o.userEmail})`);
|
|
1666
1762
|
}
|
|
1667
|
-
function
|
|
1763
|
+
function ro(o) {
|
|
1668
1764
|
var e, n;
|
|
1669
1765
|
const t = (o == null ? void 0 : o.message) || "";
|
|
1670
1766
|
return t.includes("ECONNREFUSED") || t.includes("ENOTFOUND") || t.includes("ETIMEDOUT") || t.includes("fetch failed") || t.includes("network") || (o == null ? void 0 : o.code) === "ECONNREFUSED" || ((e = o == null ? void 0 : o.cause) == null ? void 0 : e.code) === "ECONNREFUSED" || ((n = o == null ? void 0 : o.cause) == null ? void 0 : n.code) === "ENOTFOUND";
|
|
1671
1767
|
}
|
|
1672
|
-
async function
|
|
1673
|
-
let o =
|
|
1768
|
+
async function Ge() {
|
|
1769
|
+
let o = Ve();
|
|
1674
1770
|
if (!o)
|
|
1675
1771
|
return console.log(`Not logged in. Starting authentication...
|
|
1676
|
-
`), await
|
|
1677
|
-
if (!
|
|
1772
|
+
`), await me();
|
|
1773
|
+
if (!Zt(o))
|
|
1678
1774
|
return o;
|
|
1679
1775
|
if (o.refreshToken) {
|
|
1680
|
-
const t =
|
|
1776
|
+
const t = z("Refreshing access token...").start();
|
|
1681
1777
|
try {
|
|
1682
|
-
const e = await
|
|
1778
|
+
const e = await so(
|
|
1683
1779
|
o.refreshToken,
|
|
1684
1780
|
o.clientId
|
|
1685
1781
|
);
|
|
@@ -1688,64 +1784,64 @@ async function Ve() {
|
|
|
1688
1784
|
accessToken: e.access_token,
|
|
1689
1785
|
refreshToken: e.refresh_token,
|
|
1690
1786
|
expiresAt: new Date(Date.now() + e.expires_in * 1e3).toISOString()
|
|
1691
|
-
},
|
|
1787
|
+
}, ut(o), t.succeed("Token refreshed"), o;
|
|
1692
1788
|
} catch (e) {
|
|
1693
|
-
if (
|
|
1789
|
+
if (ro(e))
|
|
1694
1790
|
throw t.fail("Network error during token refresh"), e;
|
|
1695
|
-
return t.warn("Token refresh failed, please log in again"),
|
|
1791
|
+
return t.warn("Token refresh failed, please log in again"), ft(), await me();
|
|
1696
1792
|
}
|
|
1697
1793
|
}
|
|
1698
1794
|
return console.log(`Session expired. Please log in again.
|
|
1699
|
-
`), await
|
|
1795
|
+
`), await me();
|
|
1700
1796
|
}
|
|
1701
|
-
function
|
|
1797
|
+
function Me() {
|
|
1702
1798
|
return le;
|
|
1703
1799
|
}
|
|
1704
|
-
const Z = "@myop/cli",
|
|
1705
|
-
function
|
|
1800
|
+
const Z = "@myop/cli", Ae = process.platform === "win32";
|
|
1801
|
+
function ao() {
|
|
1706
1802
|
try {
|
|
1707
1803
|
return Q("npm config get registry", { encoding: "utf-8" }).trim() || "https://registry.npmjs.org/";
|
|
1708
1804
|
} catch {
|
|
1709
1805
|
return "https://registry.npmjs.org/";
|
|
1710
1806
|
}
|
|
1711
1807
|
}
|
|
1712
|
-
function
|
|
1808
|
+
function lo() {
|
|
1713
1809
|
try {
|
|
1714
1810
|
return Q("npm config get prefix", { encoding: "utf-8" }).trim();
|
|
1715
1811
|
} catch {
|
|
1716
1812
|
return null;
|
|
1717
1813
|
}
|
|
1718
1814
|
}
|
|
1719
|
-
async function
|
|
1815
|
+
async function co() {
|
|
1720
1816
|
try {
|
|
1721
|
-
const o =
|
|
1817
|
+
const o = ao().replace(/\/$/, ""), t = await fetch(`${o}/${Z}/latest`);
|
|
1722
1818
|
return t.ok ? (await t.json()).version : null;
|
|
1723
1819
|
} catch {
|
|
1724
1820
|
return null;
|
|
1725
1821
|
}
|
|
1726
1822
|
}
|
|
1727
|
-
function
|
|
1823
|
+
function po(o, t) {
|
|
1728
1824
|
const e = o.split(".").map(Number), n = t.split(".").map(Number);
|
|
1729
1825
|
for (let s = 0; s < Math.max(e.length, n.length); s++) {
|
|
1730
|
-
const i = e[s] || 0,
|
|
1731
|
-
if (i >
|
|
1732
|
-
if (i <
|
|
1826
|
+
const i = e[s] || 0, r = n[s] || 0;
|
|
1827
|
+
if (i > r) return 1;
|
|
1828
|
+
if (i < r) return -1;
|
|
1733
1829
|
}
|
|
1734
1830
|
return 0;
|
|
1735
1831
|
}
|
|
1736
|
-
async function
|
|
1737
|
-
const t =
|
|
1832
|
+
async function mo(o) {
|
|
1833
|
+
const t = z({
|
|
1738
1834
|
text: "Checking for updates...",
|
|
1739
1835
|
color: "cyan"
|
|
1740
|
-
}).start(), e = await
|
|
1741
|
-
if (t.stop(), !e ||
|
|
1836
|
+
}).start(), e = await co();
|
|
1837
|
+
if (t.stop(), !e || po(e, o) <= 0)
|
|
1742
1838
|
return !1;
|
|
1743
1839
|
console.log(`
|
|
1744
1840
|
π¦ New version available: ${o} β ${e}
|
|
1745
1841
|
`);
|
|
1746
1842
|
let n;
|
|
1747
1843
|
try {
|
|
1748
|
-
n = await
|
|
1844
|
+
n = await st({
|
|
1749
1845
|
message: "Would you like to update now?",
|
|
1750
1846
|
choices: [
|
|
1751
1847
|
{ name: "Yes, update now", value: !0 },
|
|
@@ -1759,10 +1855,10 @@ async function so(o) {
|
|
|
1759
1855
|
`), process.exit(0)), s;
|
|
1760
1856
|
}
|
|
1761
1857
|
if (n) {
|
|
1762
|
-
const s =
|
|
1858
|
+
const s = z({
|
|
1763
1859
|
text: `Updating ${Z} to v${e}...`,
|
|
1764
1860
|
color: "green"
|
|
1765
|
-
}).start(), i = `npm install -g ${Z}@latest`,
|
|
1861
|
+
}).start(), i = `npm install -g ${Z}@latest`, r = lo();
|
|
1766
1862
|
try {
|
|
1767
1863
|
Q(i, { stdio: "pipe" }), s.succeed(`Updated to v${e}`);
|
|
1768
1864
|
} catch {
|
|
@@ -1770,40 +1866,40 @@ async function so(o) {
|
|
|
1770
1866
|
π Elevated permissions required.
|
|
1771
1867
|
`);
|
|
1772
1868
|
try {
|
|
1773
|
-
if (
|
|
1774
|
-
const
|
|
1775
|
-
Q(`powershell -Command "${
|
|
1869
|
+
if (Ae) {
|
|
1870
|
+
const d = `Start-Process -FilePath 'cmd' -ArgumentList '/c npm ${r ? `install -g ${Z}@latest --prefix \\"${r}\\"` : `install -g ${Z}@latest`}' -Verb RunAs -Wait`;
|
|
1871
|
+
Q(`powershell -Command "${d}"`, { stdio: "inherit" });
|
|
1776
1872
|
} else {
|
|
1777
|
-
const
|
|
1778
|
-
Q(
|
|
1873
|
+
const c = r ? `sudo npm install -g ${Z}@latest --prefix "${r}"` : `sudo ${i}`;
|
|
1874
|
+
Q(c, { stdio: "inherit" });
|
|
1779
1875
|
}
|
|
1780
1876
|
console.log(`
|
|
1781
1877
|
β
Updated to v${e}`);
|
|
1782
1878
|
} catch {
|
|
1783
1879
|
console.log(`
|
|
1784
1880
|
β Update failed`);
|
|
1785
|
-
const
|
|
1881
|
+
const d = Ae ? `npm install -g ${Z}@latest (run as Administrator)` : `sudo npm install -g ${Z}@latest`;
|
|
1786
1882
|
console.log(`
|
|
1787
|
-
Please run manually: ${
|
|
1883
|
+
Please run manually: ${d}
|
|
1788
1884
|
`), process.exit(1);
|
|
1789
1885
|
}
|
|
1790
1886
|
}
|
|
1791
|
-
let
|
|
1887
|
+
let p = null;
|
|
1792
1888
|
try {
|
|
1793
|
-
let
|
|
1794
|
-
|
|
1795
|
-
const
|
|
1796
|
-
|
|
1889
|
+
let m;
|
|
1890
|
+
r ? m = Ae ? je(r, "node_modules") : je(r, "lib", "node_modules") : m = Q("npm root -g", { encoding: "utf-8" }).trim();
|
|
1891
|
+
const c = je(m, Z, "package.json"), d = Et(c, "utf-8");
|
|
1892
|
+
p = JSON.parse(d).version;
|
|
1797
1893
|
} catch {
|
|
1798
1894
|
}
|
|
1799
|
-
if (
|
|
1895
|
+
if (p === e)
|
|
1800
1896
|
return console.log(`
|
|
1801
1897
|
π Restarting...
|
|
1802
|
-
`),
|
|
1898
|
+
`), Mt(process.argv[0], process.argv.slice(1), {
|
|
1803
1899
|
stdio: "inherit",
|
|
1804
1900
|
shell: !0
|
|
1805
|
-
}).on("close", (
|
|
1806
|
-
process.exit(
|
|
1901
|
+
}).on("close", (c) => {
|
|
1902
|
+
process.exit(c || 0);
|
|
1807
1903
|
}), !0;
|
|
1808
1904
|
console.log(`
|
|
1809
1905
|
Please run myop again to use the new version.
|
|
@@ -1811,35 +1907,35 @@ Please run myop again to use the new version.
|
|
|
1811
1907
|
}
|
|
1812
1908
|
return !1;
|
|
1813
1909
|
}
|
|
1814
|
-
const
|
|
1815
|
-
function
|
|
1816
|
-
|
|
1910
|
+
const Be = _.join(at.homedir(), ".myop"), Je = _.join(Be, "preferences.json");
|
|
1911
|
+
function uo() {
|
|
1912
|
+
C.existsSync(Be) || C.mkdirSync(Be, { recursive: !0, mode: 448 });
|
|
1817
1913
|
}
|
|
1818
|
-
function
|
|
1914
|
+
function ht() {
|
|
1819
1915
|
try {
|
|
1820
|
-
if (!
|
|
1916
|
+
if (!C.existsSync(Je))
|
|
1821
1917
|
return {};
|
|
1822
|
-
const o =
|
|
1918
|
+
const o = C.readFileSync(Je, "utf8");
|
|
1823
1919
|
return JSON.parse(o);
|
|
1824
1920
|
} catch {
|
|
1825
1921
|
return {};
|
|
1826
1922
|
}
|
|
1827
1923
|
}
|
|
1828
|
-
function
|
|
1829
|
-
|
|
1830
|
-
const e = { ...
|
|
1831
|
-
|
|
1924
|
+
function fo(o) {
|
|
1925
|
+
uo();
|
|
1926
|
+
const e = { ...ht(), ...o };
|
|
1927
|
+
C.writeFileSync(Je, JSON.stringify(e, null, 2), {
|
|
1832
1928
|
mode: 384
|
|
1833
1929
|
});
|
|
1834
1930
|
}
|
|
1835
|
-
function
|
|
1836
|
-
return
|
|
1931
|
+
function go() {
|
|
1932
|
+
return ht().defaultOrganization || null;
|
|
1837
1933
|
}
|
|
1838
|
-
function
|
|
1839
|
-
|
|
1934
|
+
function De({ id: o, name: t }) {
|
|
1935
|
+
fo({ defaultOrganization: { id: o, name: t } });
|
|
1840
1936
|
}
|
|
1841
|
-
async function
|
|
1842
|
-
var
|
|
1937
|
+
async function ho(o, t, e, n = {}) {
|
|
1938
|
+
var p, m, c;
|
|
1843
1939
|
const s = await fetch(`${o}/mcp`, {
|
|
1844
1940
|
method: "POST",
|
|
1845
1941
|
headers: {
|
|
@@ -1861,12 +1957,12 @@ async function lo(o, t, e, n = {}) {
|
|
|
1861
1957
|
const i = await s.json();
|
|
1862
1958
|
if (i.error)
|
|
1863
1959
|
throw new Error(i.error.message || "MCP error");
|
|
1864
|
-
const
|
|
1865
|
-
if (!
|
|
1960
|
+
const r = (c = (m = (p = i.result) == null ? void 0 : p.content) == null ? void 0 : m[0]) == null ? void 0 : c.text;
|
|
1961
|
+
if (!r)
|
|
1866
1962
|
throw new Error(`No content returned from ${e}`);
|
|
1867
|
-
return JSON.parse(
|
|
1963
|
+
return JSON.parse(r);
|
|
1868
1964
|
}
|
|
1869
|
-
const
|
|
1965
|
+
const yo = (o) => new Promise((t) => setTimeout(t, o));
|
|
1870
1966
|
function re(o) {
|
|
1871
1967
|
var e, n;
|
|
1872
1968
|
const t = (o == null ? void 0 : o.message) || "";
|
|
@@ -1877,57 +1973,57 @@ function ae(o) {
|
|
|
1877
1973
|
This usually happens in sandboxed environments (Claude Web, containers)`), console.error(` where outbound HTTP is restricted.
|
|
1878
1974
|
`), console.error(" [MYOP_MCP_FALLBACK] Use Myop MCP tools instead:"), console.error(o === "push" ? " - Use the upload_component MCP tool with htmlContent parameter" : o === "pull" ? " - Use the get_component MCP tool" : " - Use list_organizations + list_components MCP tools"), console.error(" - Do NOT use presigned URL / curl flow β same network restrictions apply"), console.error("");
|
|
1879
1975
|
}
|
|
1880
|
-
const
|
|
1976
|
+
const wo = () => {
|
|
1881
1977
|
let o = new URL(import.meta.url).pathname;
|
|
1882
1978
|
process.platform === "win32" && o.startsWith("/") && (o = o.slice(1));
|
|
1883
|
-
const t =
|
|
1884
|
-
return
|
|
1885
|
-
},
|
|
1979
|
+
const t = _.dirname(o);
|
|
1980
|
+
return _.join(t, "skills");
|
|
1981
|
+
}, vo = (o) => {
|
|
1886
1982
|
try {
|
|
1887
|
-
const t =
|
|
1888
|
-
if (!
|
|
1889
|
-
const e = JSON.parse(
|
|
1983
|
+
const t = _.join(o, "package.json");
|
|
1984
|
+
if (!C.existsSync(t)) return [];
|
|
1985
|
+
const e = JSON.parse(C.readFileSync(t, "utf-8"));
|
|
1890
1986
|
return Object.keys({ ...e.dependencies, ...e.devDependencies });
|
|
1891
1987
|
} catch {
|
|
1892
1988
|
return [];
|
|
1893
1989
|
}
|
|
1894
|
-
},
|
|
1895
|
-
const t =
|
|
1896
|
-
if (!
|
|
1990
|
+
}, Ke = async (o) => {
|
|
1991
|
+
const t = wo();
|
|
1992
|
+
if (!C.existsSync(t))
|
|
1897
1993
|
return console.info("Skills source directory not found, skipping skills installation"), { success: !1 };
|
|
1898
1994
|
try {
|
|
1899
|
-
const e =
|
|
1995
|
+
const e = vo(o), n = ["myop-cli", "myop-component"], s = [
|
|
1900
1996
|
{ deps: ["@myop/react", "react"], skill: "myop-react-host" },
|
|
1901
1997
|
{ deps: ["@myop/vue", "vue"], skill: "myop-vue-host" },
|
|
1902
1998
|
{ deps: ["@myop/angular", "@angular/core"], skill: "myop-angular-host" },
|
|
1903
1999
|
{ deps: ["@myop/react-native", "react-native"], skill: "myop-react-native-host" }
|
|
1904
|
-
], i = s.filter(({ deps:
|
|
1905
|
-
i.length > 0 ? n.push(...i) : n.push(...s.map((
|
|
1906
|
-
const
|
|
1907
|
-
return Q(
|
|
2000
|
+
], i = s.filter(({ deps: c }) => c.some((d) => e.includes(d))).map(({ skill: c }) => c), r = s.flatMap(({ deps: c }) => c.filter((d) => e.includes(d)));
|
|
2001
|
+
i.length > 0 ? n.push(...i) : n.push(...s.map((c) => c.skill));
|
|
2002
|
+
const p = n.map((c) => `--skill ${c}`).join(" "), m = `npx -y skills add "${t}" ${p} --agent '*' --copy -y`;
|
|
2003
|
+
return Q(m, { cwd: o, stdio: "pipe" }), { success: !0, detected: r, skillNames: n };
|
|
1908
2004
|
} catch (e) {
|
|
1909
2005
|
return console.info("Failed to install skills:", e.message), { success: !1 };
|
|
1910
2006
|
}
|
|
1911
|
-
},
|
|
2007
|
+
}, Qe = (o = ".", t = 3, e = 0) => {
|
|
1912
2008
|
const n = [];
|
|
1913
2009
|
if (e > t) return n;
|
|
1914
2010
|
try {
|
|
1915
|
-
const s =
|
|
2011
|
+
const s = C.readdirSync(o, { withFileTypes: !0 });
|
|
1916
2012
|
for (const i of s) {
|
|
1917
|
-
const
|
|
2013
|
+
const r = _.join(o, i.name);
|
|
1918
2014
|
if (i.isDirectory()) {
|
|
1919
2015
|
if (i.name === "node_modules" || i.name === ".git" || i.name === "dist" || i.name.startsWith("."))
|
|
1920
2016
|
continue;
|
|
1921
|
-
n.push(...
|
|
2017
|
+
n.push(...Qe(r, t, e + 1));
|
|
1922
2018
|
} else if (i.name === "myop.config.json")
|
|
1923
2019
|
try {
|
|
1924
|
-
const
|
|
2020
|
+
const p = C.readFileSync(r, "utf-8"), m = JSON.parse(p);
|
|
1925
2021
|
n.push({
|
|
1926
2022
|
path: o,
|
|
1927
|
-
configPath:
|
|
1928
|
-
name:
|
|
1929
|
-
componentId:
|
|
1930
|
-
config:
|
|
2023
|
+
configPath: r,
|
|
2024
|
+
name: m.name || m.componentName || _.basename(o),
|
|
2025
|
+
componentId: m.componentId || null,
|
|
2026
|
+
config: m
|
|
1931
2027
|
});
|
|
1932
2028
|
} catch {
|
|
1933
2029
|
}
|
|
@@ -1937,7 +2033,7 @@ const po = () => {
|
|
|
1937
2033
|
return n;
|
|
1938
2034
|
};
|
|
1939
2035
|
v.executionPath = process.cwd();
|
|
1940
|
-
const
|
|
2036
|
+
const Ee = (o = !1) => {
|
|
1941
2037
|
const t = v.program.getOptionValue("verbose");
|
|
1942
2038
|
t || (console.info = () => {
|
|
1943
2039
|
}), console.info("π verbose mode on"), v.options = {
|
|
@@ -1945,7 +2041,7 @@ const Me = (o = !1) => {
|
|
|
1945
2041
|
verbose: t
|
|
1946
2042
|
};
|
|
1947
2043
|
try {
|
|
1948
|
-
return v.myopConfig =
|
|
2044
|
+
return v.myopConfig = Rt(v.options.configPath), { configFound: !0 };
|
|
1949
2045
|
} catch (e) {
|
|
1950
2046
|
if (o) {
|
|
1951
2047
|
console.info(`
|
|
@@ -1955,7 +2051,7 @@ const Me = (o = !1) => {
|
|
|
1955
2051
|
author: "@myop-cli",
|
|
1956
2052
|
flows: []
|
|
1957
2053
|
};
|
|
1958
|
-
return
|
|
2054
|
+
return We(v.options.configPath, n), v.myopConfig = n, { configFound: !0 };
|
|
1959
2055
|
} catch {
|
|
1960
2056
|
return console.info("Error details :", e), { configFound: !1, error: e };
|
|
1961
2057
|
}
|
|
@@ -1964,39 +2060,39 @@ const Me = (o = !1) => {
|
|
|
1964
2060
|
}
|
|
1965
2061
|
};
|
|
1966
2062
|
[
|
|
1967
|
-
new
|
|
1968
|
-
...
|
|
2063
|
+
new Le(),
|
|
2064
|
+
...Dt
|
|
1969
2065
|
];
|
|
1970
|
-
const
|
|
1971
|
-
v.program = new
|
|
1972
|
-
v.program.name("@myop/cli").description("Myop CLI - Remote UI Made Easy").version(
|
|
1973
|
-
v.program.addOption(new
|
|
1974
|
-
v.program.addOption(new
|
|
1975
|
-
v.program.addOption(new
|
|
1976
|
-
v.program.addOption(new
|
|
1977
|
-
v.program.addOption(new
|
|
2066
|
+
const So = "0.1.52";
|
|
2067
|
+
v.program = new Pt();
|
|
2068
|
+
v.program.name("@myop/cli").description("Myop CLI - Remote UI Made Easy").version(So);
|
|
2069
|
+
v.program.addOption(new fe("-c, --config <value>", "myop.config.json file location").default("./myop.config.json", "./myop.config.json"));
|
|
2070
|
+
v.program.addOption(new fe("-h, --help", "Show helpful information"));
|
|
2071
|
+
v.program.addOption(new fe("-v, --verbose", "Enables verbose output mode for the command-line interface (CLI)."));
|
|
2072
|
+
v.program.addOption(new fe("--ci", "CI mode: print status info (version, config, auth) as JSON and exit without prompts"));
|
|
2073
|
+
v.program.addOption(new fe("-m, --monorepo", "Monorepo mode: scan for all myop.config.json files in nested directories"));
|
|
1978
2074
|
v.program.command("add").description("Install Myop assets").addArgument("type").addArgument("id").action((o, t) => {
|
|
1979
|
-
|
|
2075
|
+
Ee(!0), console.info("adding ", o, t, v.options.configPath), o === "flow" && ct._action(t), process.exit();
|
|
1980
2076
|
});
|
|
1981
2077
|
v.program.command("remove").description("Remove Myop asset").argument("<type>", "Myop asset type").argument("<id>", "Asset id").action((o, t) => {
|
|
1982
|
-
|
|
2078
|
+
Ee(), console.info("removing ", o, t, v.options.configPath), o === "flow" && dt._action(t), process.exit();
|
|
1983
2079
|
});
|
|
1984
2080
|
v.program.command("install").description("Install Myop assets").action(async () => {
|
|
1985
|
-
|
|
2081
|
+
Ee(), await lt.action();
|
|
1986
2082
|
});
|
|
1987
2083
|
v.program.command("login").description("Authenticate with Myop platform").action(async () => {
|
|
1988
2084
|
try {
|
|
1989
|
-
await
|
|
2085
|
+
await me();
|
|
1990
2086
|
} catch (o) {
|
|
1991
2087
|
console.error("Login failed:", o.message), process.exit(1);
|
|
1992
2088
|
}
|
|
1993
2089
|
process.exit(0);
|
|
1994
2090
|
});
|
|
1995
2091
|
v.program.command("logout").description("Clear stored credentials").action(async () => {
|
|
1996
|
-
await
|
|
2092
|
+
await gt(), process.exit(0);
|
|
1997
2093
|
});
|
|
1998
2094
|
v.program.command("whoami").description("Show current authenticated user").action(async () => {
|
|
1999
|
-
const o =
|
|
2095
|
+
const o = Pe();
|
|
2000
2096
|
o && o.email ? console.log(`Logged in as: ${o.email}`) : console.log("Not logged in. Run `myop login` to authenticate."), process.exit(0);
|
|
2001
2097
|
});
|
|
2002
2098
|
v.program.command("sync").description('[deprecated] Use "myop push" instead').option("--skip-build", "Skip the build step").action(async () => {
|
|
@@ -2011,85 +2107,85 @@ v.program.command("sync").description('[deprecated] Use "myop push" instead').op
|
|
|
2011
2107
|
process.exit(0);
|
|
2012
2108
|
});
|
|
2013
2109
|
v.program.command("push").description("Upload component to Myop platform").argument("[componentId]", "Component ID to push to (overrides myop.config.json)").action(async (o) => {
|
|
2014
|
-
var S, x,
|
|
2110
|
+
var S, x, g;
|
|
2015
2111
|
const t = v.program.getOptionValue("config") || "./myop.config.json";
|
|
2016
2112
|
let e = {};
|
|
2017
|
-
if (
|
|
2113
|
+
if (C.existsSync(t))
|
|
2018
2114
|
try {
|
|
2019
|
-
e = JSON.parse(
|
|
2020
|
-
} catch (
|
|
2021
|
-
console.error(`β οΈ Failed to parse ${t}:`,
|
|
2115
|
+
e = JSON.parse(C.readFileSync(t, "utf-8"));
|
|
2116
|
+
} catch (u) {
|
|
2117
|
+
console.error(`β οΈ Failed to parse ${t}:`, u.message);
|
|
2022
2118
|
}
|
|
2023
2119
|
o && (e.componentId = o);
|
|
2024
|
-
const n = e.name || e.componentName ||
|
|
2120
|
+
const n = e.name || e.componentName || _.basename(process.cwd());
|
|
2025
2121
|
console.log(`
|
|
2026
2122
|
π Component: ${n}`);
|
|
2027
2123
|
let s = null, i = !1;
|
|
2028
2124
|
try {
|
|
2029
|
-
const
|
|
2030
|
-
i = !!(
|
|
2125
|
+
const u = JSON.parse(C.readFileSync("package.json", "utf-8"));
|
|
2126
|
+
i = !!(u.scripts && u.scripts.build);
|
|
2031
2127
|
} catch {
|
|
2032
2128
|
}
|
|
2033
2129
|
if (!i) {
|
|
2034
|
-
const
|
|
2035
|
-
(E) => E.endsWith(".html") && !E.startsWith(".") &&
|
|
2130
|
+
const u = C.readdirSync(".").filter(
|
|
2131
|
+
(E) => E.endsWith(".html") && !E.startsWith(".") && C.statSync(E).isFile()
|
|
2036
2132
|
);
|
|
2037
|
-
|
|
2133
|
+
u.length === 1 && (s = u[0]);
|
|
2038
2134
|
}
|
|
2039
2135
|
if (s)
|
|
2040
2136
|
console.log(` Single file: ${s} (skipping build)`);
|
|
2041
2137
|
else if (i) {
|
|
2042
|
-
const { exec:
|
|
2138
|
+
const { exec: u } = await import("child_process");
|
|
2043
2139
|
let E = { hasTriedPlatformFix: !1, hasTriedInstall: !1 };
|
|
2044
|
-
const
|
|
2045
|
-
const M =
|
|
2046
|
-
|
|
2140
|
+
const O = (P = !1) => new Promise((j) => {
|
|
2141
|
+
const M = z(P ? "Retrying build..." : "Building project...").start();
|
|
2142
|
+
u("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (R, k, L) => {
|
|
2047
2143
|
if (!R) {
|
|
2048
2144
|
M.succeed("Build completed"), j(!0);
|
|
2049
2145
|
return;
|
|
2050
2146
|
}
|
|
2051
2147
|
if (M.fail("Build failed"), !E.hasTriedPlatformFix && !E.hasTriedInstall) {
|
|
2052
|
-
const
|
|
2053
|
-
if (E = { ...E, ...
|
|
2054
|
-
const
|
|
2055
|
-
j(
|
|
2148
|
+
const D = await pt(R, k, L, u, E);
|
|
2149
|
+
if (E = { ...E, ...D }, D.handled) {
|
|
2150
|
+
const T = await O(!0);
|
|
2151
|
+
j(T);
|
|
2056
2152
|
return;
|
|
2057
2153
|
}
|
|
2058
2154
|
}
|
|
2059
2155
|
console.error(R.message), j(!1);
|
|
2060
2156
|
});
|
|
2061
2157
|
});
|
|
2062
|
-
await
|
|
2158
|
+
await O() || process.exit(1);
|
|
2063
2159
|
}
|
|
2064
|
-
let
|
|
2160
|
+
let r;
|
|
2065
2161
|
if (s)
|
|
2066
|
-
|
|
2067
|
-
else if (
|
|
2068
|
-
|
|
2162
|
+
r = s;
|
|
2163
|
+
else if (C.existsSync("./dist/index.html"))
|
|
2164
|
+
r = "./dist/index.html";
|
|
2069
2165
|
else {
|
|
2070
|
-
const
|
|
2071
|
-
(E) => E.endsWith(".html") && !E.startsWith(".") &&
|
|
2166
|
+
const u = C.readdirSync(".").filter(
|
|
2167
|
+
(E) => E.endsWith(".html") && !E.startsWith(".") && C.statSync(E).isFile()
|
|
2072
2168
|
);
|
|
2073
|
-
|
|
2169
|
+
u.length === 1 ? r = u[0] : (console.error("β No HTML file found to upload."), console.log(" Expected: a single .html file in root or ./dist/index.html"), process.exit(1));
|
|
2074
2170
|
}
|
|
2075
|
-
const
|
|
2076
|
-
console.log(` File: ${
|
|
2077
|
-
let
|
|
2171
|
+
const p = C.readFileSync(r, "utf-8");
|
|
2172
|
+
console.log(` File: ${r} (${(p.length / 1024).toFixed(1)} KB)`);
|
|
2173
|
+
let m;
|
|
2078
2174
|
try {
|
|
2079
|
-
|
|
2080
|
-
} catch (
|
|
2081
|
-
re(
|
|
2175
|
+
m = await Ge();
|
|
2176
|
+
} catch (u) {
|
|
2177
|
+
re(u) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("push")) : (console.error("β Authentication failed:", u.message), console.error(`
|
|
2082
2178
|
[MYOP_AUTH_REQUIRED] Run 'myop login' to authenticate,`), console.error(` or use the setup_cli_auth MCP tool to set up credentials automatically.
|
|
2083
2179
|
`)), process.exit(1);
|
|
2084
2180
|
}
|
|
2085
|
-
const
|
|
2086
|
-
let
|
|
2181
|
+
const c = Me();
|
|
2182
|
+
let d = z("Uploading...").start(), y;
|
|
2087
2183
|
try {
|
|
2088
|
-
const
|
|
2184
|
+
const u = await fetch(`${c}/mcp`, {
|
|
2089
2185
|
method: "POST",
|
|
2090
2186
|
headers: {
|
|
2091
2187
|
"Content-Type": "application/json",
|
|
2092
|
-
Authorization: `Bearer ${
|
|
2188
|
+
Authorization: `Bearer ${m.accessToken}`
|
|
2093
2189
|
},
|
|
2094
2190
|
body: JSON.stringify({
|
|
2095
2191
|
jsonrpc: "2.0",
|
|
@@ -2101,29 +2197,29 @@ v.program.command("push").description("Upload component to Myop platform").argum
|
|
|
2101
2197
|
name: n,
|
|
2102
2198
|
componentId: e.componentId && e.componentId !== "DEV" ? e.componentId : void 0,
|
|
2103
2199
|
organization: e.organization || void 0,
|
|
2104
|
-
htmlContent:
|
|
2200
|
+
htmlContent: p
|
|
2105
2201
|
}
|
|
2106
2202
|
}
|
|
2107
2203
|
})
|
|
2108
2204
|
});
|
|
2109
|
-
if (!
|
|
2110
|
-
throw new Error(`Server returned ${
|
|
2111
|
-
const E = await
|
|
2205
|
+
if (!u.ok)
|
|
2206
|
+
throw new Error(`Server returned ${u.status}`);
|
|
2207
|
+
const E = await u.json();
|
|
2112
2208
|
if (E.error)
|
|
2113
2209
|
throw new Error(E.error.message);
|
|
2114
|
-
const
|
|
2115
|
-
if (y = JSON.parse(
|
|
2210
|
+
const O = (g = (x = (S = E.result) == null ? void 0 : S.content) == null ? void 0 : x[0]) == null ? void 0 : g.text;
|
|
2211
|
+
if (y = JSON.parse(O), !y.success)
|
|
2116
2212
|
throw new Error(y.error);
|
|
2117
|
-
|
|
2118
|
-
} catch (
|
|
2119
|
-
|
|
2213
|
+
d.succeed("Pushed successfully");
|
|
2214
|
+
} catch (u) {
|
|
2215
|
+
d.fail("Upload failed"), re(u) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("push")) : console.error(" ", u.message), process.exit(1);
|
|
2120
2216
|
}
|
|
2121
2217
|
if (y.isNewComponent || !e.componentId || e.componentId === "DEV") {
|
|
2122
2218
|
e.componentId = y.componentId, e.organization = y.orgId, e.name || (e.name = y.componentName);
|
|
2123
2219
|
try {
|
|
2124
|
-
|
|
2125
|
-
} catch (
|
|
2126
|
-
console.log(`β οΈ Could not update ${t}: ${
|
|
2220
|
+
C.writeFileSync(t, JSON.stringify(e, null, 2));
|
|
2221
|
+
} catch (u) {
|
|
2222
|
+
console.log(`β οΈ Could not update ${t}: ${u.message}`), console.log(` Add componentId: "${y.componentId}" manually`);
|
|
2127
2223
|
}
|
|
2128
2224
|
}
|
|
2129
2225
|
console.log(`
|
|
@@ -2131,12 +2227,12 @@ v.program.command("push").description("Upload component to Myop platform").argum
|
|
|
2131
2227
|
`), process.exit(0);
|
|
2132
2228
|
});
|
|
2133
2229
|
v.program.command("pull").description("Download component HTML from Myop platform").argument("[componentId]", "Component ID to pull (overrides myop.config.json)").option("-o, --output <path>", "Output file path (default: index.html or dist/index.html)").option("-e, --env <environment>", "Pull the variant released to this environment (e.g., staging, production)").action(async (o, t) => {
|
|
2134
|
-
var
|
|
2230
|
+
var u, E, O;
|
|
2135
2231
|
const e = v.program.getOptionValue("config") || "./myop.config.json";
|
|
2136
2232
|
let n = {};
|
|
2137
|
-
if (
|
|
2233
|
+
if (C.existsSync(e))
|
|
2138
2234
|
try {
|
|
2139
|
-
n = JSON.parse(
|
|
2235
|
+
n = JSON.parse(C.readFileSync(e, "utf-8"));
|
|
2140
2236
|
} catch {
|
|
2141
2237
|
}
|
|
2142
2238
|
const s = o || n.componentId;
|
|
@@ -2144,22 +2240,22 @@ v.program.command("pull").description("Download component HTML from Myop platfor
|
|
|
2144
2240
|
const i = n.name || n.componentName || s;
|
|
2145
2241
|
console.log(`
|
|
2146
2242
|
π₯ Pulling: ${i}`), console.log(` ID: ${s}`), t.env && console.log(` Environment: ${t.env}`);
|
|
2147
|
-
let
|
|
2243
|
+
let r;
|
|
2148
2244
|
try {
|
|
2149
|
-
|
|
2150
|
-
} catch (
|
|
2151
|
-
re(
|
|
2245
|
+
r = await Ge();
|
|
2246
|
+
} catch (b) {
|
|
2247
|
+
re(b) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("pull")) : (console.error("β Authentication failed:", b.message), console.error(`
|
|
2152
2248
|
[MYOP_AUTH_REQUIRED] Run 'myop login' to authenticate,`), console.error(` or use the setup_cli_auth MCP tool to set up credentials automatically.
|
|
2153
2249
|
`)), process.exit(1);
|
|
2154
2250
|
}
|
|
2155
|
-
const
|
|
2156
|
-
let
|
|
2251
|
+
const p = Me(), m = z("Fetching component...").start();
|
|
2252
|
+
let c;
|
|
2157
2253
|
try {
|
|
2158
|
-
const
|
|
2254
|
+
const b = await fetch(`${p}/mcp`, {
|
|
2159
2255
|
method: "POST",
|
|
2160
2256
|
headers: {
|
|
2161
2257
|
"Content-Type": "application/json",
|
|
2162
|
-
Authorization: `Bearer ${
|
|
2258
|
+
Authorization: `Bearer ${r.accessToken}`
|
|
2163
2259
|
},
|
|
2164
2260
|
body: JSON.stringify({
|
|
2165
2261
|
jsonrpc: "2.0",
|
|
@@ -2171,33 +2267,33 @@ v.program.command("pull").description("Download component HTML from Myop platfor
|
|
|
2171
2267
|
}
|
|
2172
2268
|
})
|
|
2173
2269
|
});
|
|
2174
|
-
if (
|
|
2175
|
-
throw new Error(`Server returned ${
|
|
2176
|
-
const
|
|
2177
|
-
if (
|
|
2178
|
-
throw new Error(
|
|
2179
|
-
const j = (
|
|
2180
|
-
|
|
2181
|
-
} catch (
|
|
2182
|
-
|
|
2183
|
-
}
|
|
2184
|
-
let
|
|
2185
|
-
|
|
2186
|
-
const y =
|
|
2187
|
-
S && !
|
|
2188
|
-
const x =
|
|
2189
|
-
let
|
|
2190
|
-
if (x ? ((!n.componentId || n.componentId === "DEV") && (n.componentId = s,
|
|
2191
|
-
name:
|
|
2270
|
+
if (!b.ok)
|
|
2271
|
+
throw new Error(`Server returned ${b.status}`);
|
|
2272
|
+
const P = await b.json();
|
|
2273
|
+
if (P.error)
|
|
2274
|
+
throw new Error(P.error.message);
|
|
2275
|
+
const j = (O = (E = (u = P.result) == null ? void 0 : u.content) == null ? void 0 : E[0]) == null ? void 0 : O.text;
|
|
2276
|
+
c = JSON.parse(j), !c.success && !c.html && (m.fail("Failed to fetch component"), console.error(" ", c.error || "No HTML content returned"), c.message && console.error(" ", c.message), process.exit(1)), m.succeed("Component fetched");
|
|
2277
|
+
} catch (b) {
|
|
2278
|
+
m.fail("Failed to fetch component"), re(b) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("pull")) : console.error(" ", b.message), process.exit(1);
|
|
2279
|
+
}
|
|
2280
|
+
let d = t.output;
|
|
2281
|
+
d || (C.existsSync("./dist/index.html") ? d = "./dist/index.html" : d = "./index.html");
|
|
2282
|
+
const y = c.htmlContent || c.html, S = _.dirname(d);
|
|
2283
|
+
S && !C.existsSync(S) && C.mkdirSync(S, { recursive: !0 }), C.writeFileSync(d, y), console.log(` Saved to: ${d} (${(y.length / 1024).toFixed(1)} KB)`);
|
|
2284
|
+
const x = C.existsSync(e);
|
|
2285
|
+
let g = !1;
|
|
2286
|
+
if (x ? ((!n.componentId || n.componentId === "DEV") && (n.componentId = s, g = !0), !n.name && c.name && (n.name = c.name, g = !0)) : (n = {
|
|
2287
|
+
name: c.name || _.basename(process.cwd()),
|
|
2192
2288
|
componentId: s,
|
|
2193
2289
|
type: "html",
|
|
2194
2290
|
author: "@myop-cli",
|
|
2195
2291
|
HMR: !0
|
|
2196
|
-
},
|
|
2292
|
+
}, g = !0), g)
|
|
2197
2293
|
try {
|
|
2198
|
-
|
|
2199
|
-
} catch (
|
|
2200
|
-
console.log(` β οΈ Could not write ${e}: ${
|
|
2294
|
+
C.writeFileSync(e, JSON.stringify(n, null, 2)), console.log(` ${x ? "Updated" : "Created"} ${e}`);
|
|
2295
|
+
} catch (b) {
|
|
2296
|
+
console.log(` β οΈ Could not write ${e}: ${b.message}`);
|
|
2201
2297
|
}
|
|
2202
2298
|
console.log(`
|
|
2203
2299
|
β
Pull completed!
|
|
@@ -2207,95 +2303,95 @@ v.program.command("list").description("Browse and pull/push remote components").
|
|
|
2207
2303
|
const { search: t, select: e } = await import("@inquirer/prompts");
|
|
2208
2304
|
let n;
|
|
2209
2305
|
try {
|
|
2210
|
-
n = await
|
|
2211
|
-
} catch (
|
|
2212
|
-
re(
|
|
2306
|
+
n = await Ge();
|
|
2307
|
+
} catch (g) {
|
|
2308
|
+
re(g) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("list")) : (console.error("β Authentication failed:", g.message), console.error(`
|
|
2213
2309
|
[MYOP_AUTH_REQUIRED] Run 'myop login' to authenticate,`), console.error(` or use the setup_cli_auth MCP tool to set up credentials automatically.
|
|
2214
2310
|
`)), process.exit(1);
|
|
2215
2311
|
}
|
|
2216
|
-
const s =
|
|
2217
|
-
let
|
|
2312
|
+
const s = Me(), i = (g, u) => ho(s, n.accessToken, g, u);
|
|
2313
|
+
let r = z("Loading organizations...").start(), p;
|
|
2218
2314
|
try {
|
|
2219
|
-
const
|
|
2220
|
-
if (
|
|
2315
|
+
const g = await i("list_organizations");
|
|
2316
|
+
if (p = g.organizations || g, !Array.isArray(p))
|
|
2221
2317
|
throw new Error("Unexpected response from list_organizations");
|
|
2222
|
-
} catch (
|
|
2223
|
-
|
|
2318
|
+
} catch (g) {
|
|
2319
|
+
r.fail("Failed to load organizations"), re(g) ? (console.error("β Network error: Unable to reach mcp.myop.dev"), ae("list")) : console.error(" ", g.message), process.exit(1);
|
|
2224
2320
|
}
|
|
2225
|
-
|
|
2226
|
-
let
|
|
2321
|
+
p.length === 0 && (r.fail("No organizations found for this account"), process.exit(1)), r.stop();
|
|
2322
|
+
let m, c;
|
|
2227
2323
|
if (o.org) {
|
|
2228
|
-
const
|
|
2229
|
-
|
|
2324
|
+
const g = p.find((u) => u.id === o.org || u._id === o.org);
|
|
2325
|
+
g || (console.error(`Organization "${o.org}" not found. Available:`), p.forEach((u) => console.log(` ${u.id || u._id} ${u.name}`)), process.exit(1)), m = g.id || g._id, c = g.name, De({ id: m, name: c });
|
|
2230
2326
|
} else {
|
|
2231
|
-
const
|
|
2232
|
-
if (
|
|
2233
|
-
|
|
2234
|
-
else if (
|
|
2235
|
-
|
|
2327
|
+
const g = go();
|
|
2328
|
+
if (g && p.find((u) => (u.id || u._id) === g.id))
|
|
2329
|
+
m = g.id, c = g.name;
|
|
2330
|
+
else if (p.length === 1)
|
|
2331
|
+
m = p[0].id || p[0]._id, c = p[0].name, De({ id: m, name: c });
|
|
2236
2332
|
else
|
|
2237
2333
|
try {
|
|
2238
|
-
const
|
|
2334
|
+
const u = await e({
|
|
2239
2335
|
message: "Select an organization:",
|
|
2240
|
-
choices:
|
|
2336
|
+
choices: p.map((E) => ({
|
|
2241
2337
|
name: E.name,
|
|
2242
2338
|
value: { id: E.id || E._id, name: E.name }
|
|
2243
2339
|
}))
|
|
2244
2340
|
});
|
|
2245
|
-
|
|
2246
|
-
} catch (
|
|
2247
|
-
throw
|
|
2341
|
+
m = u.id, c = u.name, De({ id: m, name: c });
|
|
2342
|
+
} catch (u) {
|
|
2343
|
+
throw u.name === "ExitPromptError" && (console.log(`
|
|
2248
2344
|
|
|
2249
2345
|
π Goodbye!
|
|
2250
|
-
`), process.exit(0)),
|
|
2346
|
+
`), process.exit(0)), u;
|
|
2251
2347
|
}
|
|
2252
2348
|
}
|
|
2253
|
-
console.log(` Using organization: ${
|
|
2254
|
-
let
|
|
2349
|
+
console.log(` Using organization: ${c}`), r = z("Loading components...").start();
|
|
2350
|
+
let d;
|
|
2255
2351
|
try {
|
|
2256
|
-
const
|
|
2257
|
-
if (
|
|
2352
|
+
const g = await i("list_components", { organizationId: m });
|
|
2353
|
+
if (d = g.components || g, !Array.isArray(d))
|
|
2258
2354
|
throw new Error("Unexpected response from list_components");
|
|
2259
|
-
} catch (
|
|
2260
|
-
|
|
2355
|
+
} catch (g) {
|
|
2356
|
+
r.fail("Failed to load components"), console.error(" ", g.message), process.exit(1);
|
|
2261
2357
|
}
|
|
2262
|
-
|
|
2263
|
-
`), process.exit(0)), console.log(` ${
|
|
2358
|
+
r.stop(), d.length === 0 && (console.log(` No components found in this organization.
|
|
2359
|
+
`), process.exit(0)), console.log(` ${c} - ${d.length} component(s)
|
|
2264
2360
|
`);
|
|
2265
2361
|
const y = [];
|
|
2266
2362
|
for (; ; ) {
|
|
2267
|
-
const
|
|
2268
|
-
let
|
|
2363
|
+
const g = `[Done - pull/push ${y.length} selected]`, u = "__done__", E = new Set(y.map((P) => P.id || P._id || P.componentId));
|
|
2364
|
+
let O;
|
|
2269
2365
|
try {
|
|
2270
|
-
|
|
2366
|
+
O = await t({
|
|
2271
2367
|
message: "Search & select components:",
|
|
2272
|
-
source: (
|
|
2273
|
-
const j = (
|
|
2368
|
+
source: (P) => {
|
|
2369
|
+
const j = (P || "").toLowerCase(), M = d.filter((k) => {
|
|
2274
2370
|
const L = k.id || k._id || k.componentId;
|
|
2275
2371
|
return E.has(L) ? !1 : j ? (k.name || "").toLowerCase().includes(j) : !0;
|
|
2276
2372
|
}), R = [
|
|
2277
|
-
{ name:
|
|
2373
|
+
{ name: g, value: u }
|
|
2278
2374
|
];
|
|
2279
2375
|
for (const k of M) {
|
|
2280
|
-
const L = k.id || k._id || k.componentId,
|
|
2376
|
+
const L = k.id || k._id || k.componentId, D = L ? L.substring(0, 8) + "..." : "";
|
|
2281
2377
|
R.push({
|
|
2282
|
-
name: `${k.name} (${
|
|
2378
|
+
name: `${k.name} (${D})`,
|
|
2283
2379
|
value: L
|
|
2284
2380
|
});
|
|
2285
2381
|
}
|
|
2286
2382
|
return R;
|
|
2287
2383
|
}
|
|
2288
2384
|
});
|
|
2289
|
-
} catch (
|
|
2290
|
-
throw
|
|
2385
|
+
} catch (P) {
|
|
2386
|
+
throw P.name === "ExitPromptError" && (console.log(`
|
|
2291
2387
|
|
|
2292
2388
|
π Goodbye!
|
|
2293
|
-
`), process.exit(0)),
|
|
2389
|
+
`), process.exit(0)), P;
|
|
2294
2390
|
}
|
|
2295
|
-
if (
|
|
2391
|
+
if (O === u)
|
|
2296
2392
|
break;
|
|
2297
|
-
const
|
|
2298
|
-
|
|
2393
|
+
const b = d.find((P) => (P.id || P._id || P.componentId) === O);
|
|
2394
|
+
b && (y.push(b), console.log(` + ${b.name}`));
|
|
2299
2395
|
}
|
|
2300
2396
|
y.length === 0 && (console.log(` No components selected.
|
|
2301
2397
|
`), process.exit(0));
|
|
@@ -2309,87 +2405,87 @@ v.program.command("list").description("Browse and pull/push remote components").
|
|
|
2309
2405
|
{ name: "Cancel", value: "cancel" }
|
|
2310
2406
|
]
|
|
2311
2407
|
});
|
|
2312
|
-
} catch (
|
|
2313
|
-
throw
|
|
2408
|
+
} catch (g) {
|
|
2409
|
+
throw g.name === "ExitPromptError" && (console.log(`
|
|
2314
2410
|
|
|
2315
2411
|
π Goodbye!
|
|
2316
|
-
`), process.exit(0)),
|
|
2412
|
+
`), process.exit(0)), g;
|
|
2317
2413
|
}
|
|
2318
2414
|
S === "cancel" && (console.log(` Cancelled.
|
|
2319
2415
|
`), process.exit(0));
|
|
2320
|
-
const x = (
|
|
2416
|
+
const x = (g) => g.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
2321
2417
|
if (S === "pull") {
|
|
2322
2418
|
console.log(`
|
|
2323
2419
|
Pulling ${y.length} components...
|
|
2324
2420
|
`);
|
|
2325
|
-
const
|
|
2326
|
-
const
|
|
2421
|
+
const g = await Promise.all(y.map(async (O) => {
|
|
2422
|
+
const b = O.id || O._id || O.componentId;
|
|
2327
2423
|
try {
|
|
2328
|
-
const
|
|
2329
|
-
|
|
2330
|
-
const M =
|
|
2424
|
+
const P = await i("get_component", { componentId: b }), j = x(O.name);
|
|
2425
|
+
C.mkdirSync(j, { recursive: !0 });
|
|
2426
|
+
const M = P.htmlContent || P.html;
|
|
2331
2427
|
if (!M)
|
|
2332
2428
|
throw new Error("No HTML content returned");
|
|
2333
|
-
return
|
|
2334
|
-
name:
|
|
2335
|
-
componentId:
|
|
2336
|
-
organization:
|
|
2429
|
+
return C.writeFileSync(_.join(j, "index.html"), M), C.writeFileSync(_.join(j, "myop.config.json"), JSON.stringify({
|
|
2430
|
+
name: O.name,
|
|
2431
|
+
componentId: b,
|
|
2432
|
+
organization: m,
|
|
2337
2433
|
type: "html",
|
|
2338
2434
|
author: "@myop-cli",
|
|
2339
2435
|
HMR: !0
|
|
2340
|
-
}, null, 2)), { name:
|
|
2341
|
-
} catch (
|
|
2342
|
-
return { name:
|
|
2436
|
+
}, null, 2)), { name: O.name, status: "ok", dir: j };
|
|
2437
|
+
} catch (P) {
|
|
2438
|
+
return { name: O.name, status: "failed", error: P.message };
|
|
2343
2439
|
}
|
|
2344
2440
|
}));
|
|
2345
|
-
let
|
|
2346
|
-
for (const
|
|
2347
|
-
|
|
2441
|
+
let u = 0, E = 0;
|
|
2442
|
+
for (const O of g)
|
|
2443
|
+
O.status === "ok" ? (console.log(` \x1B[32mβ\x1B[0m ${O.name} -> ./${O.dir}/`), u++) : (console.log(` \x1B[31mβ\x1B[0m ${O.name} - ${O.error}`), E++);
|
|
2348
2444
|
console.log(`
|
|
2349
|
-
Done! Pulled ${
|
|
2445
|
+
Done! Pulled ${u} component${u !== 1 ? "s" : ""}.${E ? ` ${E} failed.` : ""}
|
|
2350
2446
|
`);
|
|
2351
2447
|
} else if (S === "push") {
|
|
2352
2448
|
console.log(`
|
|
2353
2449
|
Pushing ${y.length} components...
|
|
2354
2450
|
`);
|
|
2355
|
-
const
|
|
2356
|
-
const j =
|
|
2451
|
+
const g = Qe(".", 3), u = await Promise.all(y.map(async (P) => {
|
|
2452
|
+
const j = P.id || P._id || P.componentId, M = g.find((R) => R.componentId === j);
|
|
2357
2453
|
if (!M)
|
|
2358
|
-
return { name:
|
|
2454
|
+
return { name: P.name, status: "skipped", reason: "no local match" };
|
|
2359
2455
|
try {
|
|
2360
2456
|
let R;
|
|
2361
2457
|
const k = M.path;
|
|
2362
|
-
if (
|
|
2363
|
-
R =
|
|
2458
|
+
if (C.existsSync(_.join(k, "dist", "index.html")))
|
|
2459
|
+
R = _.join(k, "dist", "index.html");
|
|
2364
2460
|
else {
|
|
2365
|
-
const
|
|
2366
|
-
(
|
|
2461
|
+
const W = C.readdirSync(k).filter(
|
|
2462
|
+
(N) => N.endsWith(".html") && !N.startsWith(".") && C.statSync(_.join(k, N)).isFile()
|
|
2367
2463
|
);
|
|
2368
|
-
if (
|
|
2369
|
-
R =
|
|
2370
|
-
else if (
|
|
2371
|
-
R =
|
|
2464
|
+
if (W.length === 1)
|
|
2465
|
+
R = _.join(k, W[0]);
|
|
2466
|
+
else if (W.includes("index.html"))
|
|
2467
|
+
R = _.join(k, "index.html");
|
|
2372
2468
|
else
|
|
2373
2469
|
throw new Error("No HTML file found");
|
|
2374
2470
|
}
|
|
2375
|
-
const L =
|
|
2376
|
-
name:
|
|
2471
|
+
const L = C.readFileSync(R, "utf-8"), D = M.name || P.name, T = await i("upload_component", {
|
|
2472
|
+
name: D,
|
|
2377
2473
|
componentId: j,
|
|
2378
|
-
organization:
|
|
2474
|
+
organization: m,
|
|
2379
2475
|
htmlContent: L
|
|
2380
2476
|
});
|
|
2381
|
-
if (!
|
|
2382
|
-
throw new Error(
|
|
2383
|
-
return { name:
|
|
2477
|
+
if (!T.success)
|
|
2478
|
+
throw new Error(T.error || "Upload failed");
|
|
2479
|
+
return { name: D, status: "ok" };
|
|
2384
2480
|
} catch (R) {
|
|
2385
|
-
return { name:
|
|
2481
|
+
return { name: P.name, status: "failed", error: R.message };
|
|
2386
2482
|
}
|
|
2387
2483
|
}));
|
|
2388
|
-
let E = 0,
|
|
2389
|
-
for (const
|
|
2390
|
-
|
|
2484
|
+
let E = 0, O = 0, b = 0;
|
|
2485
|
+
for (const P of u)
|
|
2486
|
+
P.status === "ok" ? (console.log(` \x1B[32mβ\x1B[0m ${P.name}`), E++) : P.status === "skipped" ? (console.log(` \x1B[33mβ\x1B[0m ${P.name} (${P.reason})`), O++) : (console.log(` \x1B[31mβ\x1B[0m ${P.name} - ${P.error}`), b++);
|
|
2391
2487
|
console.log(`
|
|
2392
|
-
Done! Pushed ${E}${
|
|
2488
|
+
Done! Pushed ${E}${O ? `, skipped ${O}` : ""}${b ? `, ${b} failed` : ""}.
|
|
2393
2489
|
`);
|
|
2394
2490
|
}
|
|
2395
2491
|
process.exit(0);
|
|
@@ -2402,11 +2498,11 @@ v.program.command("create").description("Create a new Myop HTML component and st
|
|
|
2402
2498
|
message: "Component name:",
|
|
2403
2499
|
default: n
|
|
2404
2500
|
});
|
|
2405
|
-
} catch (
|
|
2406
|
-
throw
|
|
2501
|
+
} catch (m) {
|
|
2502
|
+
throw m.name === "ExitPromptError" && (console.log(`
|
|
2407
2503
|
|
|
2408
2504
|
π Goodbye!
|
|
2409
|
-
`), process.exit(0)),
|
|
2505
|
+
`), process.exit(0)), m;
|
|
2410
2506
|
}
|
|
2411
2507
|
(t.existsSync("index.html") || t.existsSync("myop.config.json")) && (console.log(`
|
|
2412
2508
|
β οΈ index.html or myop.config.json already exists in this directory.`), console.log(" Use `myop dev` to start the dev server for an existing component.\n"), process.exit(1));
|
|
@@ -2418,7 +2514,7 @@ v.program.command("create").description("Create a new Myop HTML component and st
|
|
|
2418
2514
|
HMR: !0
|
|
2419
2515
|
};
|
|
2420
2516
|
t.writeFileSync("myop.config.json", JSON.stringify(i, null, 2));
|
|
2421
|
-
const
|
|
2517
|
+
const r = `<!DOCTYPE html>
|
|
2422
2518
|
<html lang="en">
|
|
2423
2519
|
<head>
|
|
2424
2520
|
<meta charset="UTF-8">
|
|
@@ -2540,24 +2636,25 @@ v.program.command("create").description("Create a new Myop HTML component and st
|
|
|
2540
2636
|
<\/script>
|
|
2541
2637
|
</body>
|
|
2542
2638
|
</html>`;
|
|
2543
|
-
t.writeFileSync("index.html",
|
|
2544
|
-
const
|
|
2639
|
+
t.writeFileSync("index.html", r);
|
|
2640
|
+
const p = await Ke(process.cwd());
|
|
2545
2641
|
console.log(`
|
|
2546
|
-
β
Created ${s}`), console.log(" index.html"), console.log(" myop.config.json"),
|
|
2642
|
+
β
Created ${s}`), console.log(" index.html"), console.log(" myop.config.json"), p.success && console.log(" AI agent skills installed"), console.log(""), await Ce();
|
|
2547
2643
|
});
|
|
2548
|
-
v.program.command("dev").description("Start development server with file watching").action(
|
|
2549
|
-
|
|
2550
|
-
|
|
2644
|
+
v.program.command("dev").description("Start development server with file watching").action(Ce);
|
|
2645
|
+
Kt();
|
|
2646
|
+
const yt = async () => {
|
|
2647
|
+
const o = process.cwd(), t = z("Installing AI agent skills...").start(), e = await Ke(o);
|
|
2551
2648
|
e.success ? (t.succeed("AI agent skills installed"), e.detected.length > 0 && console.log(` Detected: ${e.detected.join(", ")}`), console.log(` Skills: ${e.skillNames.join(", ")}`)) : t.fail("Failed to install skills"), process.exit(e.success ? 0 : 1);
|
|
2552
2649
|
};
|
|
2553
|
-
v.program.command("skill").description("Install or update AI agent skills in the current directory").action(
|
|
2554
|
-
v.program.command("train").description("Install or update AI agent skills in the current directory (alias for skill)").action(
|
|
2650
|
+
v.program.command("skill").description("Install or update AI agent skills in the current directory").action(yt);
|
|
2651
|
+
v.program.command("train").description("Install or update AI agent skills in the current directory (alias for skill)").action(yt);
|
|
2555
2652
|
v.program.command("mcp").description("Configure Myop MCP server for your AI coding assistant").action(async () => {
|
|
2556
|
-
const { select: o, confirm: t } = await import("@inquirer/prompts"), n = (await import("os")).homedir(), s =
|
|
2653
|
+
const { select: o, confirm: t } = await import("@inquirer/prompts"), n = (await import("os")).homedir(), s = Me() + "/mcp", i = [
|
|
2557
2654
|
{
|
|
2558
2655
|
name: "Claude Code",
|
|
2559
2656
|
value: "claude",
|
|
2560
|
-
configPath:
|
|
2657
|
+
configPath: _.join(n, ".claude.json"),
|
|
2561
2658
|
getEntry: () => ({ type: "http", url: s }),
|
|
2562
2659
|
nextSteps: [
|
|
2563
2660
|
"Restart Claude Code to pick up the new MCP config.",
|
|
@@ -2569,7 +2666,7 @@ v.program.command("mcp").description("Configure Myop MCP server for your AI codi
|
|
|
2569
2666
|
{
|
|
2570
2667
|
name: "Cursor",
|
|
2571
2668
|
value: "cursor",
|
|
2572
|
-
configPath:
|
|
2669
|
+
configPath: _.join(n, ".cursor", "mcp.json"),
|
|
2573
2670
|
getEntry: () => ({ url: s }),
|
|
2574
2671
|
nextSteps: [
|
|
2575
2672
|
'Go to Cursor Settings > Tools & MCP to verify "myop" appears.',
|
|
@@ -2582,7 +2679,7 @@ v.program.command("mcp").description("Configure Myop MCP server for your AI codi
|
|
|
2582
2679
|
{
|
|
2583
2680
|
name: "Windsurf",
|
|
2584
2681
|
value: "windsurf",
|
|
2585
|
-
configPath:
|
|
2682
|
+
configPath: _.join(n, ".codeium", "windsurf", "mcp_config.json"),
|
|
2586
2683
|
getEntry: () => ({ url: s }),
|
|
2587
2684
|
nextSteps: [
|
|
2588
2685
|
"Open Cascade and click the hammer icon (top-right) to see MCP servers.",
|
|
@@ -2594,7 +2691,7 @@ v.program.command("mcp").description("Configure Myop MCP server for your AI codi
|
|
|
2594
2691
|
{
|
|
2595
2692
|
name: "VS Code (GitHub Copilot)",
|
|
2596
2693
|
value: "vscode",
|
|
2597
|
-
configPath: process.platform === "darwin" ?
|
|
2694
|
+
configPath: process.platform === "darwin" ? _.join(n, "Library", "Application Support", "Code", "User", "mcp.json") : process.platform === "win32" ? _.join(process.env.APPDATA || _.join(n, "AppData", "Roaming"), "Code", "User", "mcp.json") : _.join(n, ".config", "Code", "User", "mcp.json"),
|
|
2598
2695
|
getEntry: () => ({ type: "http", url: s }),
|
|
2599
2696
|
nextSteps: [
|
|
2600
2697
|
"Requires VS Code 1.99+ and GitHub Copilot extension.",
|
|
@@ -2609,52 +2706,52 @@ v.program.command("mcp").description("Configure Myop MCP server for your AI codi
|
|
|
2609
2706
|
console.log(`
|
|
2610
2707
|
Configure Myop MCP server for your AI coding assistant.
|
|
2611
2708
|
`);
|
|
2612
|
-
let
|
|
2709
|
+
let r;
|
|
2613
2710
|
try {
|
|
2614
|
-
|
|
2711
|
+
r = await o({
|
|
2615
2712
|
message: "Select your AI coding assistant:",
|
|
2616
|
-
choices: i.map((
|
|
2713
|
+
choices: i.map((d) => ({ name: d.name, value: d.value }))
|
|
2617
2714
|
});
|
|
2618
|
-
} catch (
|
|
2619
|
-
throw
|
|
2715
|
+
} catch (d) {
|
|
2716
|
+
throw d.name === "ExitPromptError" && (console.log(`
|
|
2620
2717
|
|
|
2621
2718
|
π Goodbye!
|
|
2622
|
-
`), process.exit(0)),
|
|
2719
|
+
`), process.exit(0)), d;
|
|
2623
2720
|
}
|
|
2624
|
-
const
|
|
2625
|
-
let
|
|
2721
|
+
const p = i.find((d) => d.value === r);
|
|
2722
|
+
let m = {};
|
|
2626
2723
|
try {
|
|
2627
|
-
const
|
|
2628
|
-
|
|
2724
|
+
const d = C.readFileSync(p.configPath, "utf-8");
|
|
2725
|
+
m = JSON.parse(d);
|
|
2629
2726
|
} catch {
|
|
2630
2727
|
}
|
|
2631
|
-
|
|
2632
|
-
const
|
|
2633
|
-
if (
|
|
2728
|
+
m.mcpServers || (m.mcpServers = {});
|
|
2729
|
+
const c = m.mcpServers.myop;
|
|
2730
|
+
if (c && c.url === s) {
|
|
2634
2731
|
console.log(`
|
|
2635
|
-
Myop MCP is already configured for ${
|
|
2732
|
+
Myop MCP is already configured for ${p.name}.`), console.log(` Config: ${p.configPath}`), console.log(`
|
|
2636
2733
|
\x1B[1mNext steps:\x1B[0m`);
|
|
2637
|
-
for (const
|
|
2638
|
-
console.log(` ${
|
|
2734
|
+
for (const d of p.nextSteps)
|
|
2735
|
+
console.log(` ${d}`);
|
|
2639
2736
|
console.log(""), process.exit(0);
|
|
2640
2737
|
}
|
|
2641
|
-
if (
|
|
2738
|
+
if (c) {
|
|
2642
2739
|
console.log(`
|
|
2643
|
-
Myop MCP is already configured (URL: ${
|
|
2740
|
+
Myop MCP is already configured (URL: ${c.url}).`);
|
|
2644
2741
|
try {
|
|
2645
2742
|
await t({ message: "Update to latest URL?", default: !0 }) || process.exit(0);
|
|
2646
|
-
} catch (
|
|
2647
|
-
throw
|
|
2743
|
+
} catch (d) {
|
|
2744
|
+
throw d.name === "ExitPromptError" && process.exit(0), d;
|
|
2648
2745
|
}
|
|
2649
2746
|
}
|
|
2650
|
-
|
|
2651
|
-
\x1B[32mβ\x1B[0m Myop MCP configured for ${
|
|
2747
|
+
m.mcpServers.myop = p.getEntry(), C.mkdirSync(_.dirname(p.configPath), { recursive: !0 }), C.writeFileSync(p.configPath, JSON.stringify(m, null, 2)), console.log(`
|
|
2748
|
+
\x1B[32mβ\x1B[0m Myop MCP configured for ${p.name}`), console.log(` Config: ${p.configPath}`), console.log(` Server: ${s}`), console.log(`
|
|
2652
2749
|
\x1B[1mNext steps:\x1B[0m`);
|
|
2653
|
-
for (const
|
|
2654
|
-
console.log(` ${
|
|
2750
|
+
for (const d of p.nextSteps)
|
|
2751
|
+
console.log(` ${d}`);
|
|
2655
2752
|
console.log(""), process.exit(0);
|
|
2656
2753
|
});
|
|
2657
|
-
const
|
|
2754
|
+
const xo = () => {
|
|
2658
2755
|
try {
|
|
2659
2756
|
Q("git --version", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
2660
2757
|
} catch {
|
|
@@ -2687,12 +2784,12 @@ const go = () => {
|
|
|
2687
2784
|
return null;
|
|
2688
2785
|
}
|
|
2689
2786
|
}, ne = async (o = !1, t = !1) => {
|
|
2690
|
-
var
|
|
2691
|
-
const e =
|
|
2787
|
+
var d, y, S;
|
|
2788
|
+
const e = Pe(), n = !!(e != null && e.email), s = ((d = v.myopConfig) == null ? void 0 : d.name) || ((y = v.myopConfig) == null ? void 0 : y.componentName), i = (S = v.myopConfig) == null ? void 0 : S.componentId, r = xo();
|
|
2692
2789
|
console.log(`
|
|
2693
2790
|
βββββββββββββββββββββββββββββββββββββββββββββββββββ`), console.log("β β"), console.log("β Welcome to Myop CLI - Remote UI Made Easy β"), console.log("β β"), console.log(`βββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2694
|
-
`), o && s ? (console.log(` Component: ${s}`), i ? (console.log(` ID: ${i}`), console.log(` Dashboard: https://dashboard.myop.dev/dashboard/2.0/component/${i}`)) : console.log(" ID: (not yet pushed)")) : console.log(" Component: No myop.config.json found"), console.log(` User: ${n ? e.email : "Not logged in"}`),
|
|
2695
|
-
const
|
|
2791
|
+
`), o && s ? (console.log(` Component: ${s}`), i ? (console.log(` ID: ${i}`), console.log(` Dashboard: https://dashboard.myop.dev/dashboard/2.0/component/${i}`)) : console.log(" ID: (not yet pushed)")) : console.log(" Component: No myop.config.json found"), console.log(` User: ${n ? e.email : "Not logged in"}`), r != null && r.gitNotInstalled ? (console.log(" Changes: Git not installed"), console.log(" Install: https://git-scm.com/downloads"), console.log(" Mac: brew install git | Windows: https://gitforwindows.org")) : r != null && r.notARepo ? console.log(" Changes: Not a git repository") : r && (r.insertions > 0 || r.deletions > 0) ? console.log(` Changes: ${r.files} file${r.files !== 1 ? "s" : ""} | \x1B[32m+${r.insertions}\x1B[0m \x1B[31m-${r.deletions}\x1B[0m`) : r && console.log(" Changes: No uncommitted changes"), console.log("");
|
|
2792
|
+
const m = [
|
|
2696
2793
|
{
|
|
2697
2794
|
emoji: "π",
|
|
2698
2795
|
label: "Initialize new component",
|
|
@@ -2720,8 +2817,8 @@ const go = () => {
|
|
|
2720
2817
|
value: x.value,
|
|
2721
2818
|
disabled: x.disabled
|
|
2722
2819
|
}));
|
|
2723
|
-
|
|
2724
|
-
new
|
|
2820
|
+
m.push(
|
|
2821
|
+
new Le(),
|
|
2725
2822
|
{
|
|
2726
2823
|
name: t && n ? `π Logout (${e.email})
|
|
2727
2824
|
Clears stored credentials from this machine` : t && !n ? `π Login to Myop
|
|
@@ -2732,17 +2829,17 @@ const go = () => {
|
|
|
2732
2829
|
name: t ? "π Hide help" : "π Show help",
|
|
2733
2830
|
value: "help"
|
|
2734
2831
|
},
|
|
2735
|
-
new
|
|
2832
|
+
new Le(),
|
|
2736
2833
|
{
|
|
2737
2834
|
name: "π Exit",
|
|
2738
2835
|
value: "exit"
|
|
2739
2836
|
}
|
|
2740
2837
|
);
|
|
2741
|
-
let
|
|
2838
|
+
let c;
|
|
2742
2839
|
try {
|
|
2743
|
-
|
|
2840
|
+
c = await st({
|
|
2744
2841
|
message: "What would you like to do?",
|
|
2745
|
-
choices:
|
|
2842
|
+
choices: m
|
|
2746
2843
|
});
|
|
2747
2844
|
} catch (x) {
|
|
2748
2845
|
throw x.name === "ExitPromptError" && (console.log(`
|
|
@@ -2750,9 +2847,9 @@ const go = () => {
|
|
|
2750
2847
|
π Goodbye!
|
|
2751
2848
|
`), process.exit(0)), x;
|
|
2752
2849
|
}
|
|
2753
|
-
switch (
|
|
2850
|
+
switch (c) {
|
|
2754
2851
|
case "init":
|
|
2755
|
-
await
|
|
2852
|
+
await Po();
|
|
2756
2853
|
break;
|
|
2757
2854
|
case "sync":
|
|
2758
2855
|
console.log(`
|
|
@@ -2766,18 +2863,18 @@ Pushing component...
|
|
|
2766
2863
|
await ne(!0, t);
|
|
2767
2864
|
break;
|
|
2768
2865
|
case "dev":
|
|
2769
|
-
await
|
|
2866
|
+
await Ce();
|
|
2770
2867
|
break;
|
|
2771
2868
|
case "login":
|
|
2772
2869
|
try {
|
|
2773
|
-
await
|
|
2870
|
+
await me(), console.log(`
|
|
2774
2871
|
`), await ne(o, t);
|
|
2775
|
-
} catch (
|
|
2776
|
-
console.error("Login failed:",
|
|
2872
|
+
} catch (g) {
|
|
2873
|
+
console.error("Login failed:", g.message), await ne(o, t);
|
|
2777
2874
|
}
|
|
2778
2875
|
break;
|
|
2779
2876
|
case "logout":
|
|
2780
|
-
await
|
|
2877
|
+
await gt(), console.log(`
|
|
2781
2878
|
`), await ne(o, t);
|
|
2782
2879
|
break;
|
|
2783
2880
|
case "help":
|
|
@@ -2786,48 +2883,48 @@ Pushing component...
|
|
|
2786
2883
|
case "exit":
|
|
2787
2884
|
process.exit(0);
|
|
2788
2885
|
}
|
|
2789
|
-
},
|
|
2886
|
+
}, be = ".myop-monorepo.json", $o = () => {
|
|
2790
2887
|
try {
|
|
2791
|
-
const o =
|
|
2888
|
+
const o = C.readFileSync(be, "utf-8");
|
|
2792
2889
|
return JSON.parse(o);
|
|
2793
2890
|
} catch {
|
|
2794
2891
|
return null;
|
|
2795
2892
|
}
|
|
2796
|
-
},
|
|
2893
|
+
}, bo = (o) => {
|
|
2797
2894
|
try {
|
|
2798
2895
|
const t = {
|
|
2799
2896
|
selectedComponents: o,
|
|
2800
2897
|
lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
|
|
2801
2898
|
};
|
|
2802
|
-
|
|
2899
|
+
C.writeFileSync(be, JSON.stringify(t, null, 2));
|
|
2803
2900
|
} catch {
|
|
2804
2901
|
}
|
|
2805
|
-
},
|
|
2806
|
-
const o =
|
|
2902
|
+
}, Co = async () => {
|
|
2903
|
+
const o = Pe(), t = !!(o != null && o.email);
|
|
2807
2904
|
console.log(`
|
|
2808
2905
|
βββββββββββββββββββββββββββββββββββββββββββββββββββ`), console.log("β β"), console.log("β Myop CLI - Monorepo Mode β"), console.log("β β"), console.log(`βββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
2809
2906
|
`);
|
|
2810
|
-
const e =
|
|
2907
|
+
const e = z("Scanning for components...").start(), n = Qe(".");
|
|
2811
2908
|
e.stop(), n.length === 0 && (console.log(` β οΈ No myop.config.json files found in this directory or subdirectories.
|
|
2812
2909
|
`), console.log(" Run `myop` without -m flag to initialize a single component.\n"), process.exit(0));
|
|
2813
|
-
const s =
|
|
2910
|
+
const s = $o(), i = (s == null ? void 0 : s.selectedComponents) || [], r = i.length > 0;
|
|
2814
2911
|
console.log(` Found ${n.length} component${n.length > 1 ? "s" : ""}:
|
|
2815
2912
|
`), n.forEach((y, S) => {
|
|
2816
|
-
const x = y.componentId ? "β
" : "βͺ",
|
|
2817
|
-
console.log(` ${x} ${y.name}`), console.log(` Path: ${y.path}`), console.log(` ID: ${
|
|
2818
|
-
}), console.log(` User: ${t ? o.email : "Not logged in"}`),
|
|
2819
|
-
const
|
|
2820
|
-
let
|
|
2821
|
-
if (
|
|
2822
|
-
|
|
2913
|
+
const x = y.componentId ? "β
" : "βͺ", g = y.componentId ? y.componentId.substring(0, 8) + "..." : "(not pushed)";
|
|
2914
|
+
console.log(` ${x} ${y.name}`), console.log(` Path: ${y.path}`), console.log(` ID: ${g}`), console.log("");
|
|
2915
|
+
}), console.log(` User: ${t ? o.email : "Not logged in"}`), r && console.log(` π Using saved selection from ${be}`), console.log("");
|
|
2916
|
+
const p = v.program.getOptionValue("ci");
|
|
2917
|
+
let m;
|
|
2918
|
+
if (p)
|
|
2919
|
+
r ? (m = i, console.log(` π€ CI mode: using saved selection (${m.length} components)`)) : (m = n.map((y) => y.path), console.log(` π€ CI mode: no saved selection, using all ${m.length} components`));
|
|
2823
2920
|
else {
|
|
2824
2921
|
const { checkbox: y } = await import("@inquirer/prompts"), S = n.map((x) => ({
|
|
2825
2922
|
name: `${x.name} (${x.path})`,
|
|
2826
2923
|
value: x.path,
|
|
2827
|
-
checked:
|
|
2924
|
+
checked: r ? i.includes(x.path) : !0
|
|
2828
2925
|
}));
|
|
2829
2926
|
try {
|
|
2830
|
-
|
|
2927
|
+
m = await y({
|
|
2831
2928
|
message: "Select components to start in dev mode:",
|
|
2832
2929
|
choices: S
|
|
2833
2930
|
});
|
|
@@ -2838,23 +2935,23 @@ Pushing component...
|
|
|
2838
2935
|
`), process.exit(0)), x;
|
|
2839
2936
|
}
|
|
2840
2937
|
}
|
|
2841
|
-
|
|
2938
|
+
m.length === 0 && (console.log(`
|
|
2842
2939
|
β οΈ No components selected.
|
|
2843
|
-
`), process.exit(0)),
|
|
2844
|
-
πΎ Selection saved to ${
|
|
2845
|
-
const
|
|
2846
|
-
console.log(`π Starting dev mode for ${
|
|
2940
|
+
`), process.exit(0)), p || (bo(m), console.log(`
|
|
2941
|
+
πΎ Selection saved to ${be}`));
|
|
2942
|
+
const c = n.filter((y) => m.includes(y.path));
|
|
2943
|
+
console.log(`π Starting dev mode for ${c.length} component${c.length > 1 ? "s" : ""}...
|
|
2847
2944
|
`);
|
|
2848
|
-
const { monorepoDevCommand:
|
|
2849
|
-
await c
|
|
2850
|
-
},
|
|
2945
|
+
const { monorepoDevCommand: d } = await Promise.resolve().then(() => Wt);
|
|
2946
|
+
await d(c);
|
|
2947
|
+
}, Po = async () => {
|
|
2851
2948
|
const { input: o, select: t } = await import("@inquirer/prompts"), e = await import("fs"), n = await import("path"), s = n.default.basename(process.cwd());
|
|
2852
|
-
let i,
|
|
2949
|
+
let i, r;
|
|
2853
2950
|
try {
|
|
2854
2951
|
i = await o({
|
|
2855
2952
|
message: "Component name:",
|
|
2856
2953
|
default: s
|
|
2857
|
-
}),
|
|
2954
|
+
}), r = await t({
|
|
2858
2955
|
message: "Component type:",
|
|
2859
2956
|
choices: [
|
|
2860
2957
|
{ name: "π HTML", value: "html", description: "Plain HTML/JS/CSS component" },
|
|
@@ -2863,22 +2960,22 @@ Pushing component...
|
|
|
2863
2960
|
{ name: "π
°οΈ Angular", value: "angular", disabled: "(coming soon)" }
|
|
2864
2961
|
]
|
|
2865
2962
|
});
|
|
2866
|
-
} catch (
|
|
2867
|
-
throw
|
|
2963
|
+
} catch (c) {
|
|
2964
|
+
throw c.name === "ExitPromptError" && (console.log(`
|
|
2868
2965
|
|
|
2869
2966
|
π Goodbye!
|
|
2870
|
-
`), process.exit(0)),
|
|
2967
|
+
`), process.exit(0)), c;
|
|
2871
2968
|
}
|
|
2872
|
-
const
|
|
2969
|
+
const p = {
|
|
2873
2970
|
name: i,
|
|
2874
|
-
type:
|
|
2971
|
+
type: r,
|
|
2875
2972
|
author: "@myop-cli",
|
|
2876
2973
|
HMR: !0
|
|
2877
|
-
},
|
|
2974
|
+
}, m = v.program.getOptionValue("config") || "./myop.config.json";
|
|
2878
2975
|
try {
|
|
2879
|
-
e.writeFileSync(
|
|
2880
|
-
β
Created ${
|
|
2881
|
-
const
|
|
2976
|
+
e.writeFileSync(m, JSON.stringify(p, null, 2)), console.log(`
|
|
2977
|
+
β
Created ${m}`);
|
|
2978
|
+
const c = {
|
|
2882
2979
|
name: i.toLowerCase().replace(/\s+/g, "-"),
|
|
2883
2980
|
version: "1.0.0",
|
|
2884
2981
|
type: "module",
|
|
@@ -2890,7 +2987,7 @@ Pushing component...
|
|
|
2890
2987
|
esbuild: "^0.24.0"
|
|
2891
2988
|
}
|
|
2892
2989
|
};
|
|
2893
|
-
e.writeFileSync("package.json", JSON.stringify(
|
|
2990
|
+
e.writeFileSync("package.json", JSON.stringify(c, null, 2)), console.log("β
Created package.json"), e.mkdirSync("src/modules", { recursive: !0 }), e.mkdirSync("src/styles", { recursive: !0 }), e.writeFileSync("build.js", `import * as esbuild from 'esbuild';
|
|
2894
2991
|
import fs from 'fs';
|
|
2895
2992
|
import path from 'path';
|
|
2896
2993
|
|
|
@@ -3022,11 +3119,11 @@ export function setupMyopInterface() {
|
|
|
3022
3119
|
};
|
|
3023
3120
|
}
|
|
3024
3121
|
`), console.log("β
Created src/modules/myop.js");
|
|
3025
|
-
const
|
|
3122
|
+
const u = `/* ${i} - Styles Entry Point */
|
|
3026
3123
|
/* Add your CSS imports here - they will be auto-bundled */
|
|
3027
3124
|
@import './main.css';
|
|
3028
3125
|
`;
|
|
3029
|
-
e.writeFileSync("src/styles/index.css",
|
|
3126
|
+
e.writeFileSync("src/styles/index.css", u), console.log("β
Created src/styles/index.css");
|
|
3030
3127
|
const E = `/* ${i} - Main Styles */
|
|
3031
3128
|
|
|
3032
3129
|
* {
|
|
@@ -3062,11 +3159,11 @@ dist/
|
|
|
3062
3159
|
.temp-styles.css
|
|
3063
3160
|
.DS_Store
|
|
3064
3161
|
`), console.log("β
Created .gitignore");
|
|
3065
|
-
const
|
|
3066
|
-
|
|
3067
|
-
const
|
|
3162
|
+
const b = await Ke(process.cwd());
|
|
3163
|
+
b.success && console.log("β
Installed AI agent skills");
|
|
3164
|
+
const P = await import("./index-DuEoKctW.js").then((M) => M.i), j = process.cwd();
|
|
3068
3165
|
try {
|
|
3069
|
-
await
|
|
3166
|
+
await P.init({ fs: e, dir: j });
|
|
3070
3167
|
const M = [
|
|
3071
3168
|
"myop.config.json",
|
|
3072
3169
|
"package.json",
|
|
@@ -3079,13 +3176,13 @@ dist/
|
|
|
3079
3176
|
"src/styles/index.css",
|
|
3080
3177
|
"src/styles/main.css"
|
|
3081
3178
|
];
|
|
3082
|
-
if (
|
|
3179
|
+
if (b.success) {
|
|
3083
3180
|
const R = (k, L) => {
|
|
3084
3181
|
try {
|
|
3085
|
-
const
|
|
3086
|
-
for (const
|
|
3087
|
-
const
|
|
3088
|
-
|
|
3182
|
+
const D = e.readdirSync(k, { withFileTypes: !0 });
|
|
3183
|
+
for (const T of D) {
|
|
3184
|
+
const W = n.join(k, T.name), N = n.join(L, T.name);
|
|
3185
|
+
T.isDirectory() ? R(W, N) : M.push(N);
|
|
3089
3186
|
}
|
|
3090
3187
|
} catch {
|
|
3091
3188
|
}
|
|
@@ -3094,15 +3191,15 @@ dist/
|
|
|
3094
3191
|
const k = e.readdirSync(".", { withFileTypes: !0 });
|
|
3095
3192
|
for (const L of k)
|
|
3096
3193
|
if (L.isDirectory() && L.name.startsWith(".")) {
|
|
3097
|
-
const
|
|
3098
|
-
e.existsSync(
|
|
3194
|
+
const D = n.join(L.name, "skills");
|
|
3195
|
+
e.existsSync(D) && R(D, D);
|
|
3099
3196
|
}
|
|
3100
3197
|
} catch {
|
|
3101
3198
|
}
|
|
3102
3199
|
}
|
|
3103
3200
|
for (const R of M)
|
|
3104
|
-
await
|
|
3105
|
-
await
|
|
3201
|
+
await P.add({ fs: e, dir: j, filepath: R });
|
|
3202
|
+
await P.commit({
|
|
3106
3203
|
fs: e,
|
|
3107
3204
|
dir: j,
|
|
3108
3205
|
message: "init",
|
|
@@ -3113,51 +3210,51 @@ dist/
|
|
|
3113
3210
|
}
|
|
3114
3211
|
console.log(`
|
|
3115
3212
|
π¦ Next steps:`), console.log(" 1. npm install"), console.log(" 2. npm run build"), console.log(` 3. myop sync
|
|
3116
|
-
`), v.myopConfig =
|
|
3117
|
-
} catch (
|
|
3118
|
-
console.error(`Failed to initialize component: ${
|
|
3213
|
+
`), v.myopConfig = p, await ne(!0);
|
|
3214
|
+
} catch (c) {
|
|
3215
|
+
console.error(`Failed to initialize component: ${c.message}`), process.exit(1);
|
|
3119
3216
|
}
|
|
3120
3217
|
};
|
|
3121
3218
|
v.program.command("default", { isDefault: !0 }).action(async () => {
|
|
3122
|
-
if (v.program.getOptionValue("help") && (console.log(
|
|
3123
|
-
await
|
|
3219
|
+
if (v.program.getOptionValue("help") && (console.log(kt), process.exit()), v.program.getOptionValue("monorepo")) {
|
|
3220
|
+
await Co();
|
|
3124
3221
|
return;
|
|
3125
3222
|
}
|
|
3126
3223
|
if (v.program.getOptionValue("ci")) {
|
|
3127
|
-
const
|
|
3224
|
+
const p = await import("fs"), m = v.program.getOptionValue("config") || "./myop.config.json", c = v.program.version(), d = Pe();
|
|
3128
3225
|
let y = { found: !1 };
|
|
3129
3226
|
try {
|
|
3130
|
-
if (
|
|
3131
|
-
const x =
|
|
3227
|
+
if (p.existsSync(m)) {
|
|
3228
|
+
const x = p.readFileSync(m, "utf-8"), g = JSON.parse(x);
|
|
3132
3229
|
y = {
|
|
3133
3230
|
found: !0,
|
|
3134
|
-
path:
|
|
3135
|
-
name:
|
|
3136
|
-
componentId:
|
|
3137
|
-
organization:
|
|
3231
|
+
path: m,
|
|
3232
|
+
name: g.name || g.componentName || null,
|
|
3233
|
+
componentId: g.componentId || null,
|
|
3234
|
+
organization: g.organization || null
|
|
3138
3235
|
};
|
|
3139
3236
|
}
|
|
3140
3237
|
} catch (x) {
|
|
3141
3238
|
y = { found: !1, error: x.message };
|
|
3142
3239
|
}
|
|
3143
3240
|
const S = {
|
|
3144
|
-
version:
|
|
3241
|
+
version: c,
|
|
3145
3242
|
config: y,
|
|
3146
3243
|
auth: {
|
|
3147
|
-
loggedIn: !!(
|
|
3148
|
-
email: (
|
|
3244
|
+
loggedIn: !!(d != null && d.email),
|
|
3245
|
+
email: (d == null ? void 0 : d.email) || null
|
|
3149
3246
|
}
|
|
3150
3247
|
};
|
|
3151
3248
|
console.log(JSON.stringify(S, null, 2)), process.exit(0);
|
|
3152
3249
|
}
|
|
3153
|
-
let n =
|
|
3250
|
+
let n = z({
|
|
3154
3251
|
text: "Loading Myop CLI...",
|
|
3155
3252
|
color: "green"
|
|
3156
3253
|
}).start();
|
|
3157
|
-
const s =
|
|
3158
|
-
await
|
|
3254
|
+
const s = Ee();
|
|
3255
|
+
await yo(500), n.stop();
|
|
3159
3256
|
const i = v.program.version();
|
|
3160
|
-
await
|
|
3257
|
+
await mo(i) || await ne(s.configFound);
|
|
3161
3258
|
});
|
|
3162
3259
|
v.program.parse(process.argv);
|
|
3163
3260
|
v.program.opts();
|