@myop/cli 0.1.46 → 0.1.48

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/myop-cli.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- var St = Object.defineProperty;
3
- var vt = (o, t, e) => t in o ? St(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
4
- var ye = (o, t, e) => vt(o, typeof t != "symbol" ? t + "" : t, e);
2
+ var wt = Object.defineProperty;
3
+ var St = (o, t, e) => t in o ? wt(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
4
+ var ye = (o, t, e) => St(o, typeof t != "symbol" ? t + "" : t, e);
5
5
  import Y from "ora";
6
- import { select as tt, Separator as Fe } from "@inquirer/prompts";
7
- import { Command as xt, Option as me } from "commander";
8
- import { execSync as ee, spawn as $t } from "child_process";
9
- import O, { join as ke } from "path";
10
- import C, { readFileSync as bt } from "fs";
11
- import Ue from "crypto";
12
- import Ct from "http";
13
- import { URL as ot, URLSearchParams as nt } from "url";
14
- import Pt from "open";
15
- import st from "os";
16
- const Mt = `
6
+ import { select as et, Separator as _e } from "@inquirer/prompts";
7
+ import { Command as vt, Option as me } from "commander";
8
+ import { execSync as X, spawn as xt } from "child_process";
9
+ import _, { join as Te } from "path";
10
+ import M, { readFileSync as $t } from "fs";
11
+ import He from "crypto";
12
+ import bt from "http";
13
+ import { URL as tt, URLSearchParams as ot } from "url";
14
+ import Ct from "open";
15
+ import nt from "os";
16
+ const Pt = `
17
17
  Usage: myop [OPTIONS] COMMAND [ARGS]...
18
18
 
19
19
  A powerful command-line interface for managing your Myop projects.
@@ -55,80 +55,80 @@ Examples:
55
55
  verbose: !1
56
56
  },
57
57
  myopConfig: null
58
- }, it = {
58
+ }, st = {
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 = O.join(v.executionPath, "/node_modules/@myop/flow-types/");
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
- }, Et = (o) => {
71
- const t = O.join(v.executionPath, o);
70
+ }, Mt = (o) => {
71
+ const t = _.join(v.executionPath, o);
72
72
  console.info(`reading config file from: ${t}`);
73
- const e = C.readFileSync(t, "utf8"), n = JSON.parse(e);
73
+ const e = M.readFileSync(t, "utf8"), n = JSON.parse(e);
74
74
  return console.info("config file loaded, ", n), n;
75
- }, Be = (o, t) => {
76
- const e = O.join(v.executionPath, o);
75
+ }, Ue = (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
- C.writeFileSync(e, n), console.info(`config file updated ${n}`);
80
+ M.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
- }, rt = {
85
+ }, it = {
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), Be(v.options.configPath, v.myopConfig);
90
+ v.myopConfig.flows.includes(o) || v.myopConfig.flows.push(o), Ue(v.options.configPath, v.myopConfig);
91
91
  },
92
92
  action: async () => {
93
93
  }
94
- }, at = {
94
+ }, rt = {
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), Be(v.options.configPath, v.myopConfig);
99
+ v.myopConfig.flows = v.myopConfig.flows.filter((t) => t !== o), Ue(v.options.configPath, v.myopConfig);
100
100
  },
101
101
  action: () => {
102
102
  }
103
- }, It = {
103
+ }, Et = {
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
- }, Rt = {
110
+ }, It = {
111
111
  name: "🟢 Create new component",
112
112
  value: "-",
113
113
  disabled: "(not available yet)"
114
- }, Tt = {
114
+ }, Ot = {
115
115
  name: "🔵 Create new experience",
116
116
  value: "-",
117
117
  disabled: "(not available yet)"
118
- }, Ot = {
118
+ }, kt = {
119
119
  name: "🟡 Create new skin",
120
120
  value: "-",
121
121
  disabled: "(not available yet)"
122
- }, kt = {
122
+ }, Rt = {
123
123
  name: "🔴 Create new flow",
124
124
  value: "-",
125
125
  disabled: "(not available yet)"
126
- }, jt = {
126
+ }, Tt = {
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
- }, _t = [jt, Rt, Tt, Ot, kt];
131
+ }, jt = [Tt, It, Ot, kt, Rt];
132
132
  function Ft(o, t, e, n) {
133
133
  return `<!DOCTYPE html>
134
134
  <html lang="en">
@@ -219,19 +219,19 @@ ${n}
219
219
  </body>
220
220
  </html>`;
221
221
  }
222
- function Nt(o) {
222
+ function _t(o) {
223
223
  return o.includes("esbuild") && o.includes("another platform");
224
224
  }
225
- function Lt(o) {
225
+ function Nt(o) {
226
226
  return o.includes("ERR_MODULE_NOT_FOUND") && o.includes("esbuild");
227
227
  }
228
- function Dt() {
228
+ function At() {
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 At(o) {
234
+ function Lt(o) {
235
235
  return new Promise((t) => {
236
236
  console.log(`🔧 Attempting to fix: removing node_modules and reinstalling...
237
237
  `);
@@ -244,7 +244,7 @@ function At(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, c, u) => {
247
+ `), o("npm install", { maxBuffer: 10 * 1024 * 1024 }, (i, d, u) => {
248
248
  if (i) {
249
249
  console.error("❌ npm install failed:", i.message), u && console.error(u), t(!1);
250
250
  return;
@@ -255,22 +255,22 @@ function At(o) {
255
255
  });
256
256
  });
257
257
  }
258
- async function lt(o, t, e, n, s = {}) {
258
+ async function at(o, t, e, n, s = {}) {
259
259
  const {
260
260
  hasTriedPlatformFix: i = !1,
261
- hasTriedInstall: c = !1,
261
+ hasTriedInstall: d = !1,
262
262
  onRetry: u
263
- } = s, y = ((o == null ? void 0 : o.message) || "") + (t || "") + (e || "");
264
- return !i && Nt(y) ? (Dt(), await At(n) && u ? (console.log(`🔄 Retrying build...
265
- `), u(), { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: c }) : { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: c }) : !c && Lt(y) ? (console.log("📦 Missing dependencies detected, running npm install..."), new Promise((d) => {
266
- n("npm install", (l, P, g) => {
263
+ } = s, h = ((o == null ? void 0 : o.message) || "") + (t || "") + (e || "");
264
+ return !i && _t(h) ? (At(), await Lt(n) && u ? (console.log(`🔄 Retrying build...
265
+ `), u(), { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: d }) : { handled: !0, hasTriedPlatformFix: !0, hasTriedInstall: d }) : !d && Nt(h) ? (console.log("📦 Missing dependencies detected, running npm install..."), new Promise((c) => {
266
+ n("npm install", (l, x, y) => {
267
267
  if (l) {
268
- console.error("❌ Failed to install dependencies:", l.message), g && console.error(g), d({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
268
+ console.error("❌ Failed to install dependencies:", l.message), y && console.error(y), c({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
269
269
  return;
270
270
  }
271
- console.log("✅ Dependencies installed"), u && u(), d({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
271
+ console.log("✅ Dependencies installed"), u && u(), c({ handled: !0, hasTriedPlatformFix: i, hasTriedInstall: !0 });
272
272
  });
273
- })) : { handled: !1, hasTriedPlatformFix: i, hasTriedInstall: c };
273
+ })) : { handled: !1, hasTriedPlatformFix: i, hasTriedInstall: d };
274
274
  }
275
275
  async function xe() {
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");
@@ -280,9 +280,9 @@ async function xe() {
280
280
  i = t.default.dirname(m);
281
281
  } else
282
282
  i = t.default.dirname(import.meta.url);
283
- const c = t.default.join(i, "commands", "dev", "management-website"), u = o.default.readFileSync(t.default.join(c, "styles.css"), "utf-8"), y = o.default.readFileSync(t.default.join(c, "app.js"), "utf-8"), d = 9292, l = 9293;
284
- let P = "./dist", g = !1, M = !1, f = !1, w = null;
285
- const _ = () => {
283
+ const d = t.default.join(i, "commands", "dev", "management-website"), u = o.default.readFileSync(t.default.join(d, "styles.css"), "utf-8"), h = o.default.readFileSync(t.default.join(d, "app.js"), "utf-8"), c = 9292, l = 9293;
284
+ let x = "./dist", y = !1, $ = !1, g = !1, w = null;
285
+ const j = () => {
286
286
  try {
287
287
  const a = o.default.readdirSync(".").filter((r) => !r.endsWith(".html") || r.startsWith(".") ? !1 : o.default.statSync(r).isFile());
288
288
  if (a.length === 1)
@@ -290,33 +290,33 @@ async function xe() {
290
290
  } catch {
291
291
  }
292
292
  return null;
293
- }, R = () => {
293
+ }, O = () => {
294
294
  try {
295
295
  const a = JSON.parse(o.default.readFileSync("package.json", "utf-8"));
296
296
  return !!(a.scripts && a.scripts.build);
297
297
  } catch {
298
298
  return !1;
299
299
  }
300
- }, b = (a) => {
300
+ }, P = (a) => {
301
301
  const r = process.platform;
302
302
  let m;
303
- r === "darwin" ? m = `open "${a}"` : r === "win32" ? m = `start "" "${a}"` : m = `xdg-open "${a}"`, e(m, (h) => {
303
+ r === "darwin" ? m = `open "${a}"` : r === "win32" ? m = `start "" "${a}"` : m = `xdg-open "${a}"`, e(m, (f) => {
304
304
  });
305
305
  }, p = /* @__PURE__ */ new Map(), E = v.program.getOptionValue("config") || "./myop.config.json";
306
- let x, T, k = !1;
307
- w = _();
308
- const H = R();
306
+ let b, k, R = !1;
307
+ w = j();
308
+ const D = O();
309
309
  try {
310
310
  const a = o.default.readFileSync(E, "utf-8"), r = JSON.parse(a);
311
- x = r.componentId || "DEV", T = r.componentName || r.name || null, k = r.HMR === !0, w && !H && (f = !0, k = !0, console.log(`📄 Single HTML file mode: ${w}`)), k && console.log("🔥 HMR enabled");
311
+ b = r.componentId || "DEV", k = r.componentName || r.name || null, R = r.HMR === !0, w && !D && (g = !0, R = !0, console.log(`📄 Single HTML file mode: ${w}`)), R && console.log("🔥 HMR enabled");
312
312
  } catch (a) {
313
- w && !H ? (f = !0, x = "DEV", T = t.default.basename(w, ".html"), k = !0, console.log(`📄 Single HTML file mode: ${w}`), console.log("🔥 HMR enabled")) : (console.error("❌ Error reading myop.config.json:", a.message), process.exit(1));
313
+ w && !D ? (g = !0, b = "DEV", k = t.default.basename(w, ".html"), R = !0, console.log(`📄 Single HTML file mode: ${w}`), console.log("🔥 HMR enabled")) : (console.error("❌ Error reading myop.config.json:", a.message), process.exit(1));
314
314
  }
315
- const A = async () => {
316
- if (x !== "DEV" && x !== "NEW")
317
- return x;
315
+ const L = async () => {
316
+ if (b !== "DEV" && b !== "NEW")
317
+ return b;
318
318
  try {
319
- const r = ((await new Promise((S, $) => {
319
+ const r = ((await new Promise((S, C) => {
320
320
  const I = {
321
321
  hostname: "localhost",
322
322
  port: l,
@@ -341,14 +341,14 @@ async function xe() {
341
341
  return "DEV1";
342
342
  const m = r.map((S) => {
343
343
  if (S === "DEV" || S === "NEW") return 1;
344
- const $ = S.match(/^DEV(\d+)$/), I = S.match(/^NEW(\d+)$/);
345
- return $ ? parseInt($[1], 10) : I ? parseInt(I[1], 10) : 0;
344
+ const C = S.match(/^DEV(\d+)$/), I = S.match(/^NEW(\d+)$/);
345
+ return C ? parseInt(C[1], 10) : I ? parseInt(I[1], 10) : 0;
346
346
  }).filter((S) => S > 0);
347
347
  return `DEV${Math.max(...m, 0) + 1}`;
348
348
  } catch {
349
349
  return "DEV1";
350
350
  }
351
- }, j = process.cwd(), J = (a) => {
351
+ }, T = process.cwd(), J = (a) => {
352
352
  const r = t.default.extname(a).toLowerCase();
353
353
  return {
354
354
  ".html": "text/html",
@@ -361,33 +361,33 @@ async function xe() {
361
361
  ".svg": "image/svg+xml",
362
362
  ".ico": "image/x-icon"
363
363
  }[r] || "application/octet-stream";
364
- }, F = /* @__PURE__ */ new Map(), V = [], te = 50, z = [], Q = /* @__PURE__ */ new Map(), oe = /* @__PURE__ */ new Map(), gt = (a, r, m) => {
364
+ }, F = /* @__PURE__ */ new Map(), V = [], te = 50, z = [], Q = /* @__PURE__ */ new Map(), oe = /* @__PURE__ */ new Map(), ut = (a, r, m) => {
365
365
  if (a.url.startsWith("/_hmr/")) {
366
- const h = a.url.split("/_hmr/")[1], S = a.headers["sec-websocket-key"], $ = s("sha1").update(S + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64");
366
+ const f = a.url.split("/_hmr/")[1], S = a.headers["sec-websocket-key"], C = s("sha1").update(S + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64");
367
367
  r.write(
368
368
  `HTTP/1.1 101 Switching Protocols\r
369
369
  Upgrade: websocket\r
370
370
  Connection: Upgrade\r
371
- Sec-WebSocket-Accept: ${$}\r
371
+ Sec-WebSocket-Accept: ${C}\r
372
372
  \r
373
373
  `
374
- ), oe.has(h) || oe.set(h, /* @__PURE__ */ new Set()), oe.get(h).add(r), console.log(`🔌 HMR client connected: ${h}`), r.on("close", () => {
375
- const I = oe.get(h);
376
- I && (I.delete(r), I.size === 0 && oe.delete(h)), console.log(`🔌 HMR client disconnected: ${h}`);
374
+ ), oe.has(f) || oe.set(f, /* @__PURE__ */ new Set()), oe.get(f).add(r), console.log(`🔌 HMR client connected: ${f}`), r.on("close", () => {
375
+ const I = oe.get(f);
376
+ I && (I.delete(r), I.size === 0 && oe.delete(f)), console.log(`🔌 HMR client disconnected: ${f}`);
377
377
  }), r.on("error", () => {
378
- const I = oe.get(h);
378
+ const I = oe.get(f);
379
379
  I && I.delete(r);
380
380
  });
381
381
  }
382
382
  }, Pe = n.default.createServer((a, r) => {
383
383
  if (r.setHeader("Content-Type", "application/json"), a.method === "POST" && a.url === "/_register") {
384
384
  let m = "";
385
- a.on("data", (h) => m += h), a.on("end", () => {
385
+ a.on("data", (f) => m += f), a.on("end", () => {
386
386
  try {
387
- const { componentId: h, distPath: S, componentName: $, htmlFile: I } = JSON.parse(m);
388
- F.set(h, { path: S, name: $ || null, htmlFile: I || null });
389
- const N = $ ? ` (${$})` : "";
390
- console.log(`✅ Registered: ${h}${N} -> ${S}${I ? "/" + I : ""}`), r.writeHead(200), r.end(JSON.stringify({ success: !0, registered: Array.from(F.keys()) }));
387
+ const { componentId: f, distPath: S, componentName: C, htmlFile: I } = JSON.parse(m);
388
+ F.set(f, { path: S, name: C || null, htmlFile: I || null });
389
+ const N = C ? ` (${C})` : "";
390
+ console.log(`✅ Registered: ${f}${N} -> ${S}${I ? "/" + I : ""}`), r.writeHead(200), r.end(JSON.stringify({ success: !0, registered: Array.from(F.keys()) }));
391
391
  const U = Array.from(F.entries()).map(([K, ne]) => ({
392
392
  id: K,
393
393
  path: ne.path,
@@ -404,24 +404,24 @@ Sec-WebSocket-Accept: ${$}\r
404
404
  } catch {
405
405
  }
406
406
  });
407
- } catch (h) {
408
- r.writeHead(400), r.end(JSON.stringify({ error: h.message }));
407
+ } catch (f) {
408
+ r.writeHead(400), r.end(JSON.stringify({ error: f.message }));
409
409
  }
410
410
  });
411
411
  } else if (a.method === "POST" && a.url === "/_unregister") {
412
412
  let m = "";
413
- a.on("data", (h) => m += h), a.on("end", () => {
413
+ a.on("data", (f) => m += f), a.on("end", () => {
414
414
  try {
415
- const { componentId: h } = JSON.parse(m);
416
- F.delete(h), console.log(`❌ Unregistered: ${h}`), r.writeHead(200), r.end(JSON.stringify({ success: !0 }));
417
- const S = Array.from(F.entries()).map(([$, I]) => ({
418
- id: $,
415
+ const { componentId: f } = JSON.parse(m);
416
+ F.delete(f), console.log(`❌ Unregistered: ${f}`), r.writeHead(200), r.end(JSON.stringify({ success: !0 }));
417
+ const S = Array.from(F.entries()).map(([C, I]) => ({
418
+ id: C,
419
419
  path: I.path,
420
420
  name: I.name
421
421
  }));
422
- z.forEach(($) => {
422
+ z.forEach((C) => {
423
423
  try {
424
- $.write(`data: ${JSON.stringify({
424
+ C.write(`data: ${JSON.stringify({
425
425
  type: "components",
426
426
  components: S
427
427
  })}
@@ -430,31 +430,31 @@ Sec-WebSocket-Accept: ${$}\r
430
430
  } catch {
431
431
  }
432
432
  });
433
- } catch (h) {
434
- r.writeHead(400), r.end(JSON.stringify({ error: h.message }));
433
+ } catch (f) {
434
+ r.writeHead(400), r.end(JSON.stringify({ error: f.message }));
435
435
  }
436
436
  });
437
437
  } else if (a.method === "GET" && a.url === "/_list")
438
438
  r.writeHead(200), r.end(JSON.stringify({ components: Array.from(F.entries()) }));
439
439
  else if (a.method === "POST" && a.url === "/_hmr_notify") {
440
440
  let m = "";
441
- a.on("data", (h) => m += h), a.on("end", () => {
441
+ a.on("data", (f) => m += f), a.on("end", () => {
442
442
  try {
443
- const { componentId: h, html: S } = JSON.parse(m), $ = oe.get(h);
444
- if ($ && $.size > 0) {
445
- console.log(`🔥 Notifying ${$.size} HMR client(s) for: ${h}`);
446
- const I = JSON.stringify({ type: "update", html: S }), N = Ke(I);
447
- $.forEach((U) => {
443
+ const { componentId: f, html: S } = JSON.parse(m), C = oe.get(f);
444
+ if (C && C.size > 0) {
445
+ console.log(`🔥 Notifying ${C.size} HMR client(s) for: ${f}`);
446
+ const I = JSON.stringify({ type: "update", html: S }), N = Ye(I);
447
+ C.forEach((U) => {
448
448
  try {
449
449
  U.write(N);
450
450
  } catch {
451
- $.delete(U);
451
+ C.delete(U);
452
452
  }
453
- }), r.writeHead(200), r.end(JSON.stringify({ success: !0, notified: $.size }));
453
+ }), r.writeHead(200), r.end(JSON.stringify({ success: !0, notified: C.size }));
454
454
  } else
455
455
  r.writeHead(200), r.end(JSON.stringify({ success: !0, notified: 0 }));
456
- } catch (h) {
457
- r.writeHead(400), r.end(JSON.stringify({ error: h.message }));
456
+ } catch (f) {
457
+ r.writeHead(400), r.end(JSON.stringify({ error: f.message }));
458
458
  }
459
459
  });
460
460
  } else
@@ -464,45 +464,45 @@ Sec-WebSocket-Accept: ${$}\r
464
464
  r.writeHead(403, { "Content-Type": "text/plain" }), r.end("Forbidden");
465
465
  return;
466
466
  }
467
- const m = new URL(a.url, `http://localhost:${d}`), h = m.pathname, S = h.split("/").filter((W) => W);
468
- if (h.startsWith("/consume")) {
467
+ const m = new URL(a.url, `http://localhost:${c}`), f = m.pathname, S = f.split("/").filter((W) => W);
468
+ if (f.startsWith("/consume")) {
469
469
  const W = m.searchParams.get("id");
470
470
  if (!W) {
471
471
  r.writeHead(400, { "Content-Type": "application/json" }), r.end(JSON.stringify({ error: "Component ID required. Use /consume?id=<componentId>" }));
472
472
  return;
473
473
  }
474
474
  const G = F.get(W), Z = G ? G.path : null, ce = (se) => {
475
- let D = "Unknown", q = "Unknown";
475
+ let H = "Unknown", q = "Unknown";
476
476
  if (a.headers.referer || a.headers.referrer) {
477
477
  const B = a.headers.referer || a.headers.referrer;
478
478
  try {
479
479
  const re = new URL(B);
480
- D = re.origin, q = re.hostname || re.origin;
480
+ H = re.origin, q = re.hostname || re.origin;
481
481
  } catch {
482
- D = B, q = B;
482
+ H = B, q = B;
483
483
  }
484
484
  } else if (a.headers.origin)
485
485
  try {
486
486
  const B = new URL(a.headers.origin);
487
- D = B.origin, q = B.hostname || B.origin;
487
+ H = B.origin, q = B.hostname || B.origin;
488
488
  } catch {
489
- D = a.headers.origin, q = a.headers.origin;
489
+ H = a.headers.origin, q = a.headers.origin;
490
490
  }
491
491
  else if (a.socket.remoteAddress) {
492
492
  const B = a.socket.remoteAddress;
493
- B === "::1" || B === "::ffff:127.0.0.1" ? (D = "localhost", q = "localhost (direct)") : (D = B, q = B.replace("::ffff:", ""));
493
+ B === "::1" || B === "::ffff:127.0.0.1" ? (H = "localhost", q = "localhost (direct)") : (H = B, q = B.replace("::ffff:", ""));
494
494
  }
495
- const Te = a.headers.referer || a.headers.referrer || D, he = {
495
+ const ke = a.headers.referer || a.headers.referrer || H, he = {
496
496
  type: "request",
497
497
  componentId: W,
498
498
  timestamp: Date.now(),
499
499
  servedLocally: se,
500
- referrer: Te,
501
- origin: D,
500
+ referrer: ke,
501
+ origin: H,
502
502
  originLabel: q
503
503
  };
504
- Q.has(D) || (Q.set(D, {
505
- url: D,
504
+ Q.has(H) || (Q.set(H, {
505
+ url: H,
506
506
  label: q,
507
507
  firstSeen: Date.now(),
508
508
  requestCount: 0
@@ -517,8 +517,8 @@ Sec-WebSocket-Accept: ${$}\r
517
517
  } catch {
518
518
  }
519
519
  }));
520
- const Oe = Q.get(D);
521
- Oe.requestCount++, z.forEach((B) => {
520
+ const Re = Q.get(H);
521
+ Re.requestCount++, z.forEach((B) => {
522
522
  try {
523
523
  B.write(`data: ${JSON.stringify({
524
524
  type: "origins",
@@ -539,12 +539,12 @@ Sec-WebSocket-Accept: ${$}\r
539
539
  };
540
540
  if (Z) {
541
541
  const se = G.htmlFile ? t.default.join(Z, G.htmlFile) : t.default.join(Z, "index.html");
542
- o.default.readFile(se, "utf-8", (D, q) => {
543
- if (D) {
542
+ o.default.readFile(se, "utf-8", (H, q) => {
543
+ if (H) {
544
544
  console.log(`❌ File not found: ${se}`), r.writeHead(404, { "Content-Type": "application/json" }), r.end(JSON.stringify({ error: "index.html not found" }));
545
545
  return;
546
546
  }
547
- const Te = Me(q, W), he = `dev-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, Oe = {
547
+ const ke = Me(q, W), he = `dev-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, Re = {
548
548
  item: {
549
549
  name: W,
550
550
  id: W,
@@ -555,7 +555,7 @@ Sec-WebSocket-Accept: ${$}\r
555
555
  loader: {
556
556
  type: "HTMLLoader",
557
557
  shadowRootMode: "localFrame",
558
- HTML: Te
558
+ HTML: ke
559
559
  }
560
560
  }
561
561
  ]
@@ -564,23 +564,23 @@ Sec-WebSocket-Accept: ${$}\r
564
564
  console.log(`✅ Serving consume JSON for: ${W}`), ce(!0), r.writeHead(200, {
565
565
  "Content-Type": "application/json",
566
566
  "Access-Control-Allow-Origin": "*"
567
- }), r.end(JSON.stringify(Oe, null, 2));
567
+ }), r.end(JSON.stringify(Re, null, 2));
568
568
  });
569
569
  } else {
570
570
  console.log(`📡 Proxying consume request to cloud.myop.dev for: ${W}`);
571
571
  const se = `https://cloud.myop.dev/consume${m.search}`;
572
- ce(!1), fetch(se).then((D) => D.text()).then((D) => {
572
+ ce(!1), fetch(se).then((H) => H.text()).then((H) => {
573
573
  r.writeHead(200, {
574
574
  "Content-Type": "application/json",
575
575
  "Access-Control-Allow-Origin": "*"
576
- }), r.end(D);
577
- }).catch((D) => {
578
- console.error(`❌ Proxy error: ${D.message}`), r.writeHead(502, { "Content-Type": "application/json" }), r.end(JSON.stringify({ error: "Failed to fetch from cloud.myop.dev" }));
576
+ }), r.end(H);
577
+ }).catch((H) => {
578
+ console.error(`❌ Proxy error: ${H.message}`), r.writeHead(502, { "Content-Type": "application/json" }), r.end(JSON.stringify({ error: "Failed to fetch from cloud.myop.dev" }));
579
579
  });
580
580
  }
581
581
  return;
582
582
  }
583
- if (h === "/events") {
583
+ if (f === "/events") {
584
584
  r.writeHead(200, {
585
585
  "Content-Type": "text/event-stream",
586
586
  "Cache-Control": "no-cache",
@@ -614,7 +614,7 @@ Sec-WebSocket-Accept: ${$}\r
614
614
  return;
615
615
  }
616
616
  if (S.length === 0) {
617
- r.writeHead(200, { "Content-Type": "text/html" }), r.end(Ft(d, l, u, y));
617
+ r.writeHead(200, { "Content-Type": "text/html" }), r.end(Ft(c, l, u, h));
618
618
  return;
619
619
  }
620
620
  if (S[0] !== "view") {
@@ -625,9 +625,9 @@ Sec-WebSocket-Accept: ${$}\r
625
625
  r.writeHead(400, { "Content-Type": "text/plain" }), r.end("Component ID required. Use /view/<componentId>/");
626
626
  return;
627
627
  }
628
- const $ = S[1], I = F.get($);
628
+ const C = S[1], I = F.get(C);
629
629
  if (!I) {
630
- r.writeHead(404, { "Content-Type": "text/plain" }), r.end(`Component not found: ${$}`);
630
+ r.writeHead(404, { "Content-Type": "text/plain" }), r.end(`Component not found: ${C}`);
631
631
  return;
632
632
  }
633
633
  const N = I.path, U = S.slice(2), K = I.htmlFile || "index.html", ne = U.length === 0 ? K : U.join("/"), le = t.default.join(N, ne);
@@ -639,21 +639,21 @@ Sec-WebSocket-Accept: ${$}\r
639
639
  const Z = J(le);
640
640
  console.log(`✅ Serving: ${le} (${Z})`);
641
641
  let ce = G;
642
- if (Z === "text/html" && k) {
642
+ if (Z === "text/html" && R) {
643
643
  const se = G.toString("utf-8");
644
- ce = Me(se, $);
644
+ ce = Me(se, C);
645
645
  }
646
646
  r.writeHead(200, {
647
647
  "Content-Type": Z,
648
648
  "Access-Control-Allow-Origin": "*"
649
649
  }), r.end(ce);
650
650
  });
651
- }), Ye = () => new Promise((a, r) => {
652
- const m = f ? t.default.resolve(j) : t.default.resolve(j, P), h = JSON.stringify({
653
- componentId: x,
651
+ }), Ge = () => new Promise((a, r) => {
652
+ const m = g ? t.default.resolve(T) : t.default.resolve(T, x), f = JSON.stringify({
653
+ componentId: b,
654
654
  distPath: m,
655
- componentName: T,
656
- htmlFile: f ? w : null
655
+ componentName: k,
656
+ htmlFile: g ? w : null
657
657
  }), S = {
658
658
  hostname: "localhost",
659
659
  port: l,
@@ -661,17 +661,17 @@ Sec-WebSocket-Accept: ${$}\r
661
661
  method: "POST",
662
662
  headers: {
663
663
  "Content-Type": "application/json",
664
- "Content-Length": Buffer.byteLength(h)
664
+ "Content-Length": Buffer.byteLength(f)
665
665
  }
666
- }, $ = n.default.request(S, (I) => {
666
+ }, C = n.default.request(S, (I) => {
667
667
  let N = "";
668
668
  I.on("data", (U) => N += U), I.on("end", () => {
669
669
  I.statusCode === 200 ? a(JSON.parse(N)) : r(new Error(`Registration failed: ${I.statusCode}`));
670
670
  });
671
671
  });
672
- $.on("error", r), $.write(h), $.end();
673
- }), ft = () => new Promise((a, r) => {
674
- const m = JSON.stringify({ componentId: x }), h = {
672
+ C.on("error", r), C.write(f), C.end();
673
+ }), gt = () => new Promise((a, r) => {
674
+ const m = JSON.stringify({ componentId: b }), f = {
675
675
  hostname: "localhost",
676
676
  port: l,
677
677
  path: "/_unregister",
@@ -680,11 +680,11 @@ Sec-WebSocket-Accept: ${$}\r
680
680
  "Content-Type": "application/json",
681
681
  "Content-Length": Buffer.byteLength(m)
682
682
  }
683
- }, S = n.default.request(h, ($) => {
683
+ }, S = n.default.request(f, (C) => {
684
684
  a();
685
685
  });
686
686
  S.on("error", () => a()), S.write(m), S.end();
687
- }), ht = (a) => `
687
+ }), ft = (a) => `
688
688
  <!-- MYOP HMR -->
689
689
  <script>
690
690
  (function() {
@@ -790,61 +790,61 @@ Sec-WebSocket-Accept: ${$}\r
790
790
  })();
791
791
  <\/script>
792
792
  `, Me = (a, r) => {
793
- if (!k) return a;
794
- const m = ht(r);
793
+ if (!R) return a;
794
+ const m = ft(r);
795
795
  return a.includes("</body>") ? a.replace("</body>", `${m}</body>`) : a.includes("</html>") ? a.replace("</html>", `${m}</html>`) : a + m;
796
- }, Ke = (a) => {
796
+ }, Ye = (a) => {
797
797
  const r = Buffer.from(a), m = r.length;
798
- let h;
799
- return m < 126 ? h = Buffer.concat([
798
+ let f;
799
+ return m < 126 ? f = Buffer.concat([
800
800
  Buffer.from([129, m]),
801
801
  // FIN + text frame, length
802
802
  r
803
- ]) : m < 65536 ? h = Buffer.concat([
803
+ ]) : m < 65536 ? f = Buffer.concat([
804
804
  Buffer.from([129, 126]),
805
805
  // FIN + text frame, extended length
806
806
  Buffer.from([m >> 8, m & 255]),
807
807
  // 16-bit length
808
808
  r
809
- ]) : h = Buffer.concat([
809
+ ]) : f = Buffer.concat([
810
810
  Buffer.from([129, 127]),
811
811
  // FIN + text frame, extended length
812
812
  Buffer.from([0, 0, 0, 0, m >> 24, m >> 16 & 255, m >> 8 & 255, m & 255]),
813
813
  // 64-bit length
814
814
  r
815
- ]), h;
816
- }, Qe = () => {
817
- if (!k) return;
818
- const a = f ? w : t.default.join(P, "index.html");
815
+ ]), f;
816
+ }, Ke = () => {
817
+ if (!R) return;
818
+ const a = g ? w : t.default.join(x, "index.html");
819
819
  let r;
820
820
  try {
821
821
  const m = o.default.readFileSync(a, "utf-8");
822
- r = Me(m, x);
822
+ r = Me(m, b);
823
823
  } catch (m) {
824
824
  console.error("❌ Failed to read HTML for HMR:", m.message);
825
825
  return;
826
826
  }
827
- if (Re) {
828
- const m = oe.get(x);
827
+ if (Oe) {
828
+ const m = oe.get(b);
829
829
  if (!m || m.size === 0)
830
830
  return;
831
831
  console.log(`🔥 Notifying ${m.size} HMR client(s)`);
832
- const h = JSON.stringify({
832
+ const f = JSON.stringify({
833
833
  type: "update",
834
834
  html: r
835
- }), S = Ke(h);
836
- m.forEach(($) => {
835
+ }), S = Ye(f);
836
+ m.forEach((C) => {
837
837
  try {
838
- $.write(S);
838
+ C.write(S);
839
839
  } catch {
840
- m.delete($);
840
+ m.delete(C);
841
841
  }
842
842
  });
843
843
  } else {
844
844
  const m = JSON.stringify({
845
- componentId: x,
845
+ componentId: b,
846
846
  html: r
847
- }), h = {
847
+ }), f = {
848
848
  hostname: "localhost",
849
849
  port: l,
850
850
  path: "/_hmr_notify",
@@ -854,9 +854,9 @@ Sec-WebSocket-Accept: ${$}\r
854
854
  "Content-Length": Buffer.byteLength(m)
855
855
  },
856
856
  timeout: 5e3
857
- }, S = n.default.request(h, ($) => {
857
+ }, S = n.default.request(f, (C) => {
858
858
  let I = "";
859
- $.on("data", (N) => I += N), $.on("end", () => {
859
+ C.on("data", (N) => I += N), C.on("end", () => {
860
860
  try {
861
861
  const N = JSON.parse(I);
862
862
  N.notified > 0 && console.log(`🔥 Notified ${N.notified} HMR client(s) via server`);
@@ -872,94 +872,94 @@ Sec-WebSocket-Accept: ${$}\r
872
872
  };
873
873
  let Ee = { hasTriedPlatformFix: !1, hasTriedInstall: !1 };
874
874
  const ge = (a) => {
875
- if (g) {
876
- M = !0;
875
+ if (y) {
876
+ $ = !0;
877
877
  return;
878
878
  }
879
- g = !0, console.log(`
880
- 🔨 Building...`), e("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (r, m, h) => {
881
- if (g = !1, r) {
882
- const S = await lt(r, m, h, e, {
879
+ y = !0, console.log(`
880
+ 🔨 Building...`), e("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (r, m, f) => {
881
+ if (y = !1, r) {
882
+ const S = await at(r, m, f, e, {
883
883
  ...Ee,
884
884
  onRetry: () => ge(a)
885
885
  });
886
- Ee = { ...Ee, ...S }, S.handled || (console.error("❌ Build failed:", r.message), h && console.error(h));
886
+ Ee = { ...Ee, ...S }, S.handled || (console.error("❌ Build failed:", r.message), f && console.error(f));
887
887
  } else
888
- console.log("✅ Build completed"), m && console.log(m), Qe(), a && a();
889
- M && (M = !1, ge());
888
+ console.log("✅ Build completed"), m && console.log(m), Ke(), a && a();
889
+ $ && ($ = !1, ge());
890
890
  });
891
- }, Ze = /* @__PURE__ */ new Set(), Ie = (a) => {
891
+ }, Qe = /* @__PURE__ */ new Set(), Ie = (a) => {
892
892
  o.default.readdir(a, { withFileTypes: !0 }, (r, m) => {
893
- r || (m.forEach((h) => {
894
- const S = t.default.join(a, h.name);
895
- if (h.isDirectory())
896
- h.name !== "node_modules" && h.name !== "dist" && !h.name.startsWith(".") && Ie(S);
897
- else if (h.isFile()) {
898
- const $ = t.default.extname(h.name);
899
- if ($ === ".js" || $ === ".css" || $ === ".html")
893
+ r || (m.forEach((f) => {
894
+ const S = t.default.join(a, f.name);
895
+ if (f.isDirectory())
896
+ f.name !== "node_modules" && f.name !== "dist" && !f.name.startsWith(".") && Ie(S);
897
+ else if (f.isFile()) {
898
+ const C = t.default.extname(f.name);
899
+ if (C === ".js" || C === ".css" || C === ".html")
900
900
  try {
901
901
  const I = o.default.readFileSync(S, "utf-8");
902
902
  p.set(S, I);
903
903
  } catch {
904
904
  }
905
905
  }
906
- }), Ze.has(a) || (Ze.add(a), o.default.watch(a, (h, S) => {
906
+ }), Qe.has(a) || (Qe.add(a), o.default.watch(a, (f, S) => {
907
907
  if (!S) return;
908
- const $ = t.default.extname(S);
909
- if ($ !== ".js" && $ !== ".css" && $ !== ".html") return;
908
+ const C = t.default.extname(S);
909
+ if (C !== ".js" && C !== ".css" && C !== ".html") return;
910
910
  const I = t.default.join(a, S);
911
911
  setTimeout(() => {
912
912
  try {
913
913
  const N = o.default.readFileSync(I, "utf-8"), U = p.get(I);
914
- N !== U && (p.set(I, N), console.log(`📝 File changed: ${I}`), f ? Qe() : ge());
914
+ N !== U && (p.set(I, N), console.log(`📝 File changed: ${I}`), g ? Ke() : ge());
915
915
  } catch {
916
916
  }
917
917
  }, 50);
918
918
  })));
919
919
  });
920
- }, qe = (a) => {
920
+ }, Ze = (a) => {
921
921
  console.log(`
922
- 🔨 Component: ${x}`), f ? (console.log("📄 No build needed (single HTML file mode)"), Ie(j), console.log(`👀 Watching ${w} for changes...`), console.log(`Press Ctrl+C to stop
923
- `), a && a()) : (ge(a), Ie(j), console.log("👀 Watching .js, .css, and .html files for changes..."), console.log(`Press Ctrl+C to stop
922
+ 🔨 Component: ${b}`), g ? (console.log("📄 No build needed (single HTML file mode)"), Ie(T), console.log(`👀 Watching ${w} for changes...`), console.log(`Press Ctrl+C to stop
923
+ `), a && a()) : (ge(a), Ie(T), console.log("👀 Watching .js, .css, and .html files for changes..."), console.log(`Press Ctrl+C to stop
924
924
  `));
925
- }, yt = () => new Promise((a) => {
925
+ }, ht = () => new Promise((a) => {
926
926
  const r = {
927
927
  hostname: "localhost",
928
928
  port: l,
929
929
  path: "/_list",
930
930
  method: "GET",
931
931
  timeout: 1e3
932
- }, m = n.default.request(r, (h) => {
932
+ }, m = n.default.request(r, (f) => {
933
933
  a(!0);
934
934
  });
935
935
  m.on("error", () => a(!1)), m.on("timeout", () => {
936
936
  m.destroy(), a(!1);
937
937
  }), m.end();
938
- }), wt = () => new Promise((a) => {
939
- const r = n.default.createServer((m, h) => {
940
- if (h.setHeader("Content-Type", "application/json"), m.method === "POST" && m.url === "/_register") {
938
+ }), yt = () => new Promise((a) => {
939
+ const r = n.default.createServer((m, f) => {
940
+ if (f.setHeader("Content-Type", "application/json"), m.method === "POST" && m.url === "/_register") {
941
941
  let S = "";
942
- m.on("data", ($) => S += $), m.on("end", () => {
942
+ m.on("data", (C) => S += C), m.on("end", () => {
943
943
  try {
944
- const { componentId: $, distPath: I, componentName: N, htmlFile: U } = JSON.parse(S);
945
- F.set($, { path: I, name: N || null, htmlFile: U || null });
944
+ const { componentId: C, distPath: I, componentName: N, htmlFile: U } = JSON.parse(S);
945
+ F.set(C, { path: I, name: N || null, htmlFile: U || null });
946
946
  const K = N ? ` (${N})` : "";
947
- console.log(`✅ Registered: ${$}${K} -> ${I}${U ? "/" + U : ""}`), h.writeHead(200), h.end(JSON.stringify({ success: !0, registered: Array.from(F.keys()) }));
948
- } catch ($) {
949
- h.writeHead(400), h.end(JSON.stringify({ error: $.message }));
947
+ console.log(`✅ Registered: ${C}${K} -> ${I}${U ? "/" + U : ""}`), f.writeHead(200), f.end(JSON.stringify({ success: !0, registered: Array.from(F.keys()) }));
948
+ } catch (C) {
949
+ f.writeHead(400), f.end(JSON.stringify({ error: C.message }));
950
950
  }
951
951
  });
952
952
  } else if (m.method === "POST" && m.url === "/_unregister") {
953
953
  let S = "";
954
- m.on("data", ($) => S += $), m.on("end", () => {
954
+ m.on("data", (C) => S += C), m.on("end", () => {
955
955
  try {
956
- const { componentId: $ } = JSON.parse(S);
957
- F.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 }));
956
+ const { componentId: C } = JSON.parse(S);
957
+ F.delete(C), console.log(`❌ Unregistered: ${C}`), f.writeHead(200), f.end(JSON.stringify({ success: !0 }));
958
+ } catch (C) {
959
+ f.writeHead(400), f.end(JSON.stringify({ error: C.message }));
960
960
  }
961
961
  });
962
- } else m.method === "GET" && m.url === "/_list" ? (h.writeHead(200), h.end(JSON.stringify({ components: Array.from(F.entries()) }))) : (h.writeHead(404), h.end(JSON.stringify({ error: "Not found" })));
962
+ } else m.method === "GET" && m.url === "/_list" ? (f.writeHead(200), f.end(JSON.stringify({ components: Array.from(F.entries()) }))) : (f.writeHead(404), f.end(JSON.stringify({ error: "Not found" })));
963
963
  });
964
964
  r.on("error", () => {
965
965
  a(!1);
@@ -967,73 +967,73 @@ Sec-WebSocket-Accept: ${$}\r
967
967
  console.log(`
968
968
  🔄 Taking over as server...`), console.log(`📡 Management server on port ${l}`), ue.on("error", () => {
969
969
  r.close(), a(!1);
970
- }), ue.listen(d, () => {
971
- console.log(`📡 Main server running at http://localhost:${d}`);
972
- const m = f ? t.default.resolve(j) : t.default.resolve(j, P);
973
- F.set(x, {
970
+ }), ue.listen(c, () => {
971
+ console.log(`📡 Main server running at http://localhost:${c}`);
972
+ const m = g ? t.default.resolve(T) : t.default.resolve(T, x);
973
+ F.set(b, {
974
974
  path: m,
975
- name: T,
976
- htmlFile: f ? w : null
975
+ name: k,
976
+ htmlFile: g ? w : null
977
977
  });
978
- const h = T ? ` (${T})` : "";
979
- console.log(`✅ Registered component: ${x}${h}`), console.log(`📡 Access at: http://localhost:${d}/view/${x}/`), a(!0);
978
+ const f = k ? ` (${k})` : "";
979
+ console.log(`✅ Registered component: ${b}${f}`), console.log(`📡 Access at: http://localhost:${c}/view/${b}/`), a(!0);
980
980
  });
981
981
  });
982
982
  });
983
983
  let fe;
984
- const Xe = () => {
984
+ const qe = () => {
985
985
  fe = setInterval(async () => {
986
- await yt() || (clearInterval(fe), console.log(`
987
- ⚠️ Server appears to be down, attempting to take over...`), await wt() ? (console.log("✅ Successfully took over as server"), Re = !0) : (console.log("ℹ️ Another instance took over, re-registering..."), setTimeout(async () => {
986
+ await ht() || (clearInterval(fe), console.log(`
987
+ ⚠️ Server appears to be down, attempting to take over...`), await yt() ? (console.log("✅ Successfully took over as server"), Oe = !0) : (console.log("ℹ️ Another instance took over, re-registering..."), setTimeout(async () => {
988
988
  try {
989
- await Ye(), console.log(`✅ Re-registered component: ${x}`), Xe();
989
+ await Ge(), console.log(`✅ Re-registered component: ${b}`), qe();
990
990
  } catch (m) {
991
991
  console.error("❌ Failed to re-register:", m.message);
992
992
  }
993
993
  }, 2e3)));
994
994
  }, 3e3);
995
- }, et = async () => {
995
+ }, Xe = async () => {
996
996
  console.log(`
997
997
 
998
- 🛑 Shutting down...`), fe && clearInterval(fe), await ft(), process.exit(0);
998
+ 🛑 Shutting down...`), fe && clearInterval(fe), await gt(), process.exit(0);
999
999
  };
1000
- process.on("SIGINT", et), process.on("SIGTERM", et);
1001
- let Re = !1;
1000
+ process.on("SIGINT", Xe), process.on("SIGTERM", Xe);
1001
+ let Oe = !1;
1002
1002
  Pe.on("error", async (a) => {
1003
1003
  if (a.code === "EADDRINUSE") {
1004
1004
  console.log(`
1005
1005
  🔗 Connecting to existing dev server...`);
1006
1006
  try {
1007
- x = await A();
1008
- const r = await Ye();
1009
- console.log(`✅ Registered component: ${x}`), console.log(`📡 Access at: http://localhost:${d}/view/${x}/`), console.log(`📋 All registered components: ${r.registered.join(", ")}`), qe(() => {
1010
- process.env.MYOP_NO_BROWSER || b(`http://localhost:${d}/view/${x}/`);
1011
- }), Xe();
1007
+ b = await L();
1008
+ const r = await Ge();
1009
+ console.log(`✅ Registered component: ${b}`), console.log(`📡 Access at: http://localhost:${c}/view/${b}/`), console.log(`📋 All registered components: ${r.registered.join(", ")}`), Ze(() => {
1010
+ process.env.MYOP_NO_BROWSER || P(`http://localhost:${c}/view/${b}/`);
1011
+ }), qe();
1012
1012
  } catch (r) {
1013
1013
  console.error("❌ Failed to register component:", r.message), process.exit(1);
1014
1014
  }
1015
1015
  } else
1016
1016
  console.error("❌ Management server error:", a.message), process.exit(1);
1017
- }), Pe.on("upgrade", gt), Pe.listen(l, async () => {
1018
- Re = !0, console.log(`
1017
+ }), Pe.on("upgrade", ut), Pe.listen(l, async () => {
1018
+ Oe = !0, console.log(`
1019
1019
  🚀 Starting shared dev server...`), console.log(`📡 Management server on port ${l}`), ue.on("error", (a) => {
1020
1020
  console.error("❌ Main server error:", a.message), process.exit(1);
1021
- }), ue.listen(d, async () => {
1022
- console.log(`📡 Main server running at http://localhost:${d}`), (x === "DEV" || x === "NEW") && (x = "DEV1");
1023
- const a = f ? t.default.resolve(j) : t.default.resolve(j, P);
1024
- F.set(x, {
1021
+ }), ue.listen(c, async () => {
1022
+ console.log(`📡 Main server running at http://localhost:${c}`), (b === "DEV" || b === "NEW") && (b = "DEV1");
1023
+ const a = g ? t.default.resolve(T) : t.default.resolve(T, x);
1024
+ F.set(b, {
1025
1025
  path: a,
1026
- name: T,
1027
- htmlFile: f ? w : null
1026
+ name: k,
1027
+ htmlFile: g ? w : null
1028
1028
  });
1029
- const r = T ? ` (${T})` : "";
1030
- console.log(`✅ Registered component: ${x}${r}`), console.log(`📡 Access at: http://localhost:${d}/view/${x}/`), qe(() => {
1031
- process.env.MYOP_NO_BROWSER || b(`http://localhost:${d}/view/${x}/`);
1029
+ const r = k ? ` (${k})` : "";
1030
+ console.log(`✅ Registered component: ${b}${r}`), console.log(`📡 Access at: http://localhost:${c}/view/${b}/`), Ze(() => {
1031
+ process.env.MYOP_NO_BROWSER || P(`http://localhost:${c}/view/${b}/`);
1032
1032
  });
1033
1033
  });
1034
1034
  });
1035
1035
  }
1036
- const L = class L {
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 L = class L {
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(L.ESC.hideCursor), this.calculateLayout(), this.render(), this.uptimeInterval = setInterval(() => this.updateHeader(), 1e3);
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 L = class L {
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), c = 2, y = this.rows - c - 2, d = Math.floor(y / s);
1087
- this.visibleLogLines = Math.max(2, d - 4), this.layout = { panelsPerRow: n, panelWidth: i, numRows: s, panelHeight: d }, this.panelPositions.clear();
1086
+ const s = Math.ceil(t / n), i = Math.floor(this.cols / n), d = 2, h = this.rows - d - 2, c = Math.floor(h / s);
1087
+ this.visibleLogLines = Math.max(2, c - 4), this.layout = { panelsPerRow: n, panelWidth: i, numRows: s, panelHeight: c }, this.panelPositions.clear();
1088
1088
  for (let l = 0; l < t; l++) {
1089
- const P = this.components[l], g = Math.floor(l / n), M = l % n;
1090
- this.panelPositions.set(P.name, {
1091
- row: c + 1 + g * d,
1092
- col: M * i + 1,
1089
+ const x = this.components[l], y = Math.floor(l / n), $ = l % n;
1090
+ this.panelPositions.set(x.name, {
1091
+ row: d + 1 + y * c,
1092
+ col: $ * i + 1,
1093
1093
  width: i,
1094
- height: d
1094
+ height: c
1095
1095
  });
1096
1096
  }
1097
1097
  }
@@ -1110,8 +1110,8 @@ const L = class L {
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), c = Math.max(0, Math.min(i, s + e));
1114
- c !== s && (this.scrollPos.set(t, c), this.queueUpdate(t));
1113
+ const n = this.logs.get(t) || [], s = this.scrollPos.get(t) || 0, i = Math.max(0, n.length - this.visibleLogLines), d = Math.max(0, Math.min(i, s + e));
1114
+ d !== s && (this.scrollPos.set(t, d), 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 L = class L {
1132
1132
  return `${e}:${n.toString().padStart(2, "0")}`;
1133
1133
  }
1134
1134
  updateHeader() {
1135
- const t = L.C, e = Array.from(this.statusKeys.values()).filter((i) => i === "ready").length, n = this.components.length;
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 += L.ESC.clearLine.slice(0, -1), process.stdout.write(L.ESC.moveTo(2, 1) + 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 = L.C, n = L.STATUS, s = this.panelPositions.get(t);
1140
+ const e = A.C, n = A.STATUS, s = this.panelPositions.get(t);
1141
1141
  if (!s) return;
1142
- const i = this.components.findIndex((A) => A.name === t), c = this.components[i], u = i === this.selectedPanel, y = this.statusKeys.get(t) || "initializing", d = n[y], l = e[d.color], P = this.logs.get(t) || [], g = this.scrollPos.get(t) || 0, M = s.width - 1, f = u ? e.cyan : e.gray, w = [], _ = c.name.substring(0, M - 20);
1143
- let R = `${f}┌─${e.reset} ${l}${d.icon}${e.reset} `;
1144
- R += `${e.bold}${_}${e.reset} ${e.gray}─${e.reset} ${l}${d.label}${e.reset} `;
1145
- const b = 5 + _.length + d.label.length + 3;
1146
- R += `${f}${"─".repeat(Math.max(0, M - b))}┐${e.reset}`, w.push(L.ESC.moveTo(s.row, s.col) + R);
1147
- const p = (c.path || "").substring(0, M - 6);
1148
- let E = `${f}│${e.reset} ${e.dim}${p}${e.reset}`;
1149
- E += " ".repeat(Math.max(0, M - p.length - 3)), E += `${f}│${e.reset}`, w.push(L.ESC.moveTo(s.row + 1, s.col) + E);
1150
- const x = P.length, T = x > this.visibleLogLines ? `${g + 1}-${Math.min(g + this.visibleLogLines, x)}/${x}` : "";
1151
- let k = `${f}├${"─".repeat(M - T.length - 4)}${e.reset}`;
1152
- T && (k += `${e.dim}${T}${e.reset}`), k += `${f}${"─".repeat(2)}┤${e.reset}`, w.push(L.ESC.moveTo(s.row + 2, s.col) + k);
1153
- const H = P.slice(g, g + this.visibleLogLines);
1154
- for (let A = 0; A < this.visibleLogLines; A++) {
1155
- const j = H[A];
1156
- let J = `${f}│${e.reset}`;
1157
- if (j) {
1142
+ const i = this.components.findIndex((L) => L.name === t), d = this.components[i], u = i === this.selectedPanel, h = this.statusKeys.get(t) || "initializing", c = n[h], l = e[c.color], x = this.logs.get(t) || [], y = this.scrollPos.get(t) || 0, $ = s.width - 1, g = u ? e.cyan : e.gray, w = [], j = d.name.substring(0, $ - 20);
1143
+ let O = `${g}┌─${e.reset} ${l}${c.icon}${e.reset} `;
1144
+ O += `${e.bold}${j}${e.reset} ${e.gray}─${e.reset} ${l}${c.label}${e.reset} `;
1145
+ const P = 5 + j.length + c.label.length + 3;
1146
+ O += `${g}${"─".repeat(Math.max(0, $ - P))}┐${e.reset}`, w.push(A.ESC.moveTo(s.row, s.col) + O);
1147
+ const p = (d.path || "").substring(0, $ - 6);
1148
+ let E = `${g}│${e.reset} ${e.dim}${p}${e.reset}`;
1149
+ E += " ".repeat(Math.max(0, $ - p.length - 3)), E += `${g}│${e.reset}`, w.push(A.ESC.moveTo(s.row + 1, s.col) + E);
1150
+ const b = x.length, k = b > this.visibleLogLines ? `${y + 1}-${Math.min(y + this.visibleLogLines, b)}/${b}` : "";
1151
+ let R = `${g}├${"─".repeat($ - k.length - 4)}${e.reset}`;
1152
+ k && (R += `${e.dim}${k}${e.reset}`), R += `${g}${"─".repeat(2)}┤${e.reset}`, w.push(A.ESC.moveTo(s.row + 2, s.col) + R);
1153
+ const D = x.slice(y, y + this.visibleLogLines);
1154
+ for (let L = 0; L < this.visibleLogLines; L++) {
1155
+ const T = D[L];
1156
+ let J = `${g}│${e.reset}`;
1157
+ if (T) {
1158
1158
  let F = e.white;
1159
- j.type === "success" ? F = e.green : j.type === "error" ? F = e.red : j.type === "warning" ? F = e.yellow : j.type === "hmr" ? F = e.magenta : j.type === "change" && (F = e.blue);
1160
- const V = j.message.substring(0, M - 12);
1161
- J += `${e.dim}${j.timestamp}${e.reset} ${F}${V}${e.reset}`;
1162
- const te = M - j.timestamp.length - V.length - 2;
1159
+ T.type === "success" ? F = e.green : T.type === "error" ? F = e.red : T.type === "warning" ? F = e.yellow : T.type === "hmr" ? F = e.magenta : T.type === "change" && (F = e.blue);
1160
+ const V = T.message.substring(0, $ - 12);
1161
+ J += `${e.dim}${T.timestamp}${e.reset} ${F}${V}${e.reset}`;
1162
+ const te = $ - T.timestamp.length - V.length - 2;
1163
1163
  J += " ".repeat(Math.max(0, te));
1164
1164
  } else
1165
- J += " ".repeat(M - 2);
1166
- J += `${f}│${e.reset}`, w.push(L.ESC.moveTo(s.row + 3 + A, s.col) + J);
1165
+ J += " ".repeat($ - 2);
1166
+ J += `${g}│${e.reset}`, w.push(A.ESC.moveTo(s.row + 3 + L, s.col) + J);
1167
1167
  }
1168
- w.push(L.ESC.moveTo(s.row + 3 + this.visibleLogLines, s.col) + `${f}└${"─".repeat(M - 2)}┘${e.reset}`), process.stdout.write(w.join(""));
1168
+ w.push(A.ESC.moveTo(s.row + 3 + this.visibleLogLines, s.col) + `${g}└${"─".repeat($ - 2)}┘${e.reset}`), process.stdout.write(w.join(""));
1169
1169
  }
1170
1170
  fullRender() {
1171
- const t = L.C;
1172
- process.stdout.write(L.ESC.clearScreen + L.ESC.moveTo(1, 1));
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 L = class L {
1177
1177
  this.renderFooter();
1178
1178
  }
1179
1179
  renderFooter() {
1180
- const t = L.C, e = this.rows - 1;
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(L.ESC.moveTo(e, 1) + n);
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(L.ESC.clearScreen + L.ESC.moveTo(1, 1) + L.ESC.showCursor);
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
- ye(L, "ESC", {
1192
+ ye(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
- ye(L, "C", {
1199
+ ye(A, "C", {
1200
1200
  reset: "\x1B[0m",
1201
1201
  bold: "\x1B[1m",
1202
1202
  dim: "\x1B[2m",
@@ -1211,7 +1211,7 @@ ye(L, "C", {
1211
1211
  bgCyan: "\x1B[46m",
1212
1212
  black: "\x1B[30m"
1213
1213
  }), // Status configs
1214
- ye(L, "STATUS", {
1214
+ ye(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,125 @@ ye(L, "STATUS", {
1224
1224
  warning: { icon: "⚠", color: "yellow", label: "Warning" },
1225
1225
  stopped: { icon: "■", color: "gray", label: "Stopped" }
1226
1226
  });
1227
- let Ne = L;
1228
- async function Ht(o) {
1227
+ let Ne = A;
1228
+ async function Dt(o) {
1229
1229
  const { spawn: t, exec: e } = await import("child_process"), n = await import("path"), s = o.map((l) => ({
1230
1230
  name: l.name,
1231
1231
  path: l.path,
1232
1232
  id: l.componentId || ""
1233
- })), i = new Ne(s), c = [], u = (l) => {
1234
- const P = process.platform;
1235
- let g;
1236
- P === "darwin" ? g = `open "${l}"` : P === "win32" ? g = `start "" "${l}"` : g = `xdg-open "${l}"`, e(g, () => {
1233
+ })), i = new Ne(s), d = [], u = (l) => {
1234
+ const x = process.platform;
1235
+ let y;
1236
+ x === "darwin" ? y = `open "${l}"` : x === "win32" ? y = `start "" "${l}"` : y = `xdg-open "${l}"`, e(y, () => {
1237
1237
  });
1238
- }, y = () => {
1238
+ }, h = () => {
1239
1239
  i.clear(), console.log(`
1240
- 🛑 Shutting down all components...`), c.forEach((l) => {
1240
+ 🛑 Shutting down all components...`), d.forEach((l) => {
1241
1241
  try {
1242
1242
  l.kill("SIGTERM");
1243
1243
  } catch {
1244
1244
  }
1245
1245
  }), setTimeout(() => process.exit(0), 500);
1246
1246
  };
1247
- process.on("SIGINT", y), process.on("SIGTERM", y);
1248
- const d = process.argv[1];
1247
+ process.on("SIGINT", h), process.on("SIGTERM", h);
1248
+ const c = process.argv[1];
1249
1249
  for (let l = 0; l < o.length; l++) {
1250
- const P = o[l], g = P.name;
1251
- i.setStatus(g, "⏳ Starting..."), i.log(g, `Starting in ${P.path}`);
1252
- const M = t("node", [d, "dev"], {
1253
- cwd: n.default.resolve(P.path),
1250
+ const x = o[l], y = x.name;
1251
+ i.setStatus(y, "⏳ Starting..."), i.log(y, `Starting in ${x.path}`);
1252
+ const $ = t("node", [c, "dev"], {
1253
+ cwd: n.default.resolve(x.path),
1254
1254
  env: { ...process.env, FORCE_COLOR: "1", MYOP_NO_BROWSER: "1" },
1255
1255
  stdio: ["ignore", "pipe", "pipe"]
1256
1256
  });
1257
- c.push(M);
1258
- let f = "";
1259
- M.stdout.on("data", (w) => {
1260
- f += w.toString();
1261
- const _ = f.split(`
1257
+ d.push($);
1258
+ let g = "";
1259
+ $.stdout.on("data", (w) => {
1260
+ g += w.toString();
1261
+ const j = g.split(`
1262
1262
  `);
1263
- f = _.pop() || "";
1264
- for (const R of _) {
1265
- const b = R.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
1266
- b && (b.includes("Registered component") || b.includes("Registered:") ? i.setStatus(g, "✅ Ready") : b.includes("Building...") || b.includes("Running initial build") ? i.setStatus(g, "🔨 Building...") : b.includes("Build completed") || b.includes("Build succeeded") ? i.setStatus(g, "✅ Ready") : b.includes("Build failed") ? i.setStatus(g, "❌ Build Error") : b.includes("File changed") ? (i.setStatus(g, "📝 Changed"), setTimeout(() => i.setStatus(g, "✅ Ready"), 1500)) : b.includes("Notifying") && b.includes("HMR") ? (i.setStatus(g, "🔥 HMR Update"), setTimeout(() => i.setStatus(g, "✅ Ready"), 1e3)) : b.includes("HMR client connected") && (i.setStatus(g, "🔥 HMR Connected"), setTimeout(() => i.setStatus(g, "✅ 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(g, b));
1263
+ g = j.pop() || "";
1264
+ for (const O of j) {
1265
+ const P = O.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
1266
+ P && (P.includes("Registered component") || P.includes("Registered:") ? i.setStatus(y, "✅ Ready") : P.includes("Building...") || P.includes("Running initial build") ? i.setStatus(y, "🔨 Building...") : P.includes("Build completed") || P.includes("Build succeeded") ? i.setStatus(y, "✅ Ready") : P.includes("Build failed") ? i.setStatus(y, "❌ Build Error") : P.includes("File changed") ? (i.setStatus(y, "📝 Changed"), setTimeout(() => i.setStatus(y, "✅ Ready"), 1500)) : P.includes("Notifying") && P.includes("HMR") ? (i.setStatus(y, "🔥 HMR Update"), setTimeout(() => i.setStatus(y, "✅ Ready"), 1e3)) : P.includes("HMR client connected") && (i.setStatus(y, "🔥 HMR Connected"), setTimeout(() => i.setStatus(y, "✅ Ready"), 1e3)), !P.includes("Watching") && !P.includes("Press Ctrl+C") && !P.includes("Starting shared") && !P.includes("Management server") && !P.includes("Main server") && !P.includes("Access at:") && !P.includes("No build needed") && i.log(y, P));
1267
1267
  }
1268
- }), M.stderr.on("data", (w) => {
1269
- const _ = w.toString().split(`
1268
+ }), $.stderr.on("data", (w) => {
1269
+ const j = w.toString().split(`
1270
1270
  `);
1271
- for (const R of _) {
1272
- const b = R.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
1273
- b && (i.log(g, `⚠️ ${b}`), i.setStatus(g, "⚠️ Warning"));
1271
+ for (const O of j) {
1272
+ const P = O.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim();
1273
+ P && (i.log(y, `⚠️ ${P}`), i.setStatus(y, "⚠️ Warning"));
1274
1274
  }
1275
- }), M.on("exit", (w) => {
1276
- w !== 0 && w !== null && (i.setStatus(g, `❌ Exited (${w})`), i.log(g, `Process exited with code ${w}`));
1275
+ }), $.on("exit", (w) => {
1276
+ w !== 0 && w !== null && (i.setStatus(y, `❌ Exited (${w})`), i.log(y, `Process exited with code ${w}`));
1277
1277
  }), l < o.length - 1 && await new Promise((w) => setTimeout(w, 500));
1278
1278
  }
1279
1279
  i.render(), setTimeout(() => {
1280
1280
  u("http://localhost:9292");
1281
1281
  }, 2e3);
1282
1282
  }
1283
- const Ut = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1283
+ const Ht = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
1284
1284
  __proto__: null,
1285
1285
  devCommand: xe,
1286
- monorepoDevCommand: Ht
1287
- }, Symbol.toStringTag, { value: "Module" })), Le = O.join(st.homedir(), ".myop"), pe = O.join(Le, "credentials.json");
1288
- function Bt() {
1289
- C.existsSync(Le) || C.mkdirSync(Le, { recursive: !0, mode: 448 });
1286
+ monorepoDevCommand: Dt
1287
+ }, Symbol.toStringTag, { value: "Module" })), Ae = _.join(nt.homedir(), ".myop"), pe = _.join(Ae, "credentials.json");
1288
+ function Ut() {
1289
+ M.existsSync(Ae) || M.mkdirSync(Ae, { recursive: !0, mode: 448 });
1290
1290
  }
1291
- function Je() {
1291
+ function Be() {
1292
1292
  try {
1293
- if (!C.existsSync(pe))
1293
+ if (!M.existsSync(pe))
1294
1294
  return null;
1295
- const o = C.readFileSync(pe, "utf8");
1295
+ const o = M.readFileSync(pe, "utf8");
1296
1296
  return JSON.parse(o);
1297
1297
  } catch (o) {
1298
1298
  return console.info("Failed to read credentials:", o.message), null;
1299
1299
  }
1300
1300
  }
1301
- function ct(o) {
1302
- Bt();
1301
+ function lt(o) {
1302
+ Ut();
1303
1303
  const t = {
1304
1304
  ...o,
1305
1305
  savedAt: (/* @__PURE__ */ new Date()).toISOString()
1306
1306
  };
1307
- C.writeFileSync(pe, JSON.stringify(t, null, 2), {
1307
+ M.writeFileSync(pe, JSON.stringify(t, null, 2), {
1308
1308
  mode: 384
1309
1309
  // Read/write for owner only
1310
1310
  });
1311
1311
  }
1312
- function dt() {
1312
+ function ct() {
1313
1313
  try {
1314
- return C.existsSync(pe) && C.unlinkSync(pe), !0;
1314
+ return M.existsSync(pe) && M.unlinkSync(pe), !0;
1315
1315
  } catch (o) {
1316
1316
  return console.error("Failed to clear credentials:", o.message), !1;
1317
1317
  }
1318
1318
  }
1319
- function Jt(o) {
1319
+ function Bt(o) {
1320
1320
  if (!o || !o.expiresAt)
1321
1321
  return !0;
1322
1322
  const t = 5 * 60 * 1e3, e = new Date(o.expiresAt).getTime();
1323
1323
  return Date.now() > e - t;
1324
1324
  }
1325
1325
  function $e() {
1326
- const o = Je();
1326
+ const o = Be();
1327
1327
  return o ? {
1328
1328
  email: o.userEmail,
1329
1329
  userId: o.userId
1330
1330
  } : null;
1331
1331
  }
1332
- const ae = process.env.MYOP_MCP_URL || "https://mcp.myop.dev", Se = 19284, ze = `http://localhost:${Se}/callback`, zt = "myop-cli";
1333
- function Wt() {
1334
- return Ue.randomBytes(32).toString("base64url");
1332
+ const ae = process.env.MYOP_MCP_URL || "https://mcp.myop.dev", Se = 19284, Je = `http://localhost:${Se}/callback`, Jt = "myop-cli";
1333
+ function zt() {
1334
+ return He.randomBytes(32).toString("base64url");
1335
1335
  }
1336
- function Vt(o) {
1337
- return Ue.createHash("sha256").update(o).digest("base64url");
1336
+ function Wt(o) {
1337
+ return He.createHash("sha256").update(o).digest("base64url");
1338
1338
  }
1339
- async function Gt() {
1339
+ async function Vt() {
1340
1340
  const o = await fetch(`${ae}/oauth/register`, {
1341
1341
  method: "POST",
1342
1342
  headers: { "Content-Type": "application/json" },
1343
1343
  body: JSON.stringify({
1344
- client_name: zt,
1345
- redirect_uris: [ze],
1344
+ client_name: Jt,
1345
+ redirect_uris: [Je],
1346
1346
  grant_types: ["authorization_code", "refresh_token"],
1347
1347
  response_types: ["code"]
1348
1348
  })
@@ -1371,7 +1371,7 @@ function we(o, t, e, n = null) {
1371
1371
  success: { accent: "#4ade80", glow: "rgba(74, 222, 128, 0.1)" },
1372
1372
  error: { accent: "#f87171", glow: "rgba(248, 113, 113, 0.1)" },
1373
1373
  warning: { accent: "#fbbf24", glow: "rgba(251, 191, 36, 0.1)" }
1374
- }, { accent: c, glow: u } = i[o] || i.error;
1374
+ }, { accent: d, glow: u } = i[o] || i.error;
1375
1375
  return `<!DOCTYPE html>
1376
1376
  <html lang="en">
1377
1377
  <head>
@@ -1432,7 +1432,7 @@ function we(o, t, e, n = null) {
1432
1432
  h1 {
1433
1433
  font-size: 20px;
1434
1434
  font-weight: 500;
1435
- color: ${c};
1435
+ color: ${d};
1436
1436
  margin-bottom: 12px;
1437
1437
  letter-spacing: -0.5px;
1438
1438
  }
@@ -1465,7 +1465,7 @@ function we(o, t, e, n = null) {
1465
1465
  align-items: center;
1466
1466
  gap: 8px;
1467
1467
  background: ${u};
1468
- border: 1px solid ${c}33;
1468
+ border: 1px solid ${d}33;
1469
1469
  border-radius: 4px;
1470
1470
  padding: 10px 16px;
1471
1471
  font-size: 12px;
@@ -1519,22 +1519,22 @@ function we(o, t, e, n = null) {
1519
1519
  </body>
1520
1520
  </html>`;
1521
1521
  }
1522
- function Yt(o) {
1522
+ function Gt(o) {
1523
1523
  return new Promise((t, e) => {
1524
- const n = Ct.createServer((s, i) => {
1525
- const c = new ot(s.url, `http://localhost:${Se}`);
1526
- if (c.pathname === "/callback") {
1527
- const u = c.searchParams.get("code"), y = c.searchParams.get("state"), d = c.searchParams.get("error");
1528
- if (d) {
1524
+ const n = bt.createServer((s, i) => {
1525
+ const d = new tt(s.url, `http://localhost:${Se}`);
1526
+ if (d.pathname === "/callback") {
1527
+ const u = d.searchParams.get("code"), h = d.searchParams.get("state"), c = d.searchParams.get("error");
1528
+ if (c) {
1529
1529
  i.writeHead(200, { "Content-Type": "text/html" }), i.end(we(
1530
1530
  "error",
1531
1531
  "Authentication Failed",
1532
1532
  "Unable to complete the authentication process.",
1533
- d
1534
- )), n.close(), e(new Error(`OAuth error: ${d}`));
1533
+ c
1534
+ )), n.close(), e(new Error(`OAuth error: ${c}`));
1535
1535
  return;
1536
1536
  }
1537
- if (y !== o) {
1537
+ if (h !== o) {
1538
1538
  i.writeHead(400, { "Content-Type": "text/html" }), i.end(we(
1539
1539
  "warning",
1540
1540
  "Security Error",
@@ -1567,15 +1567,15 @@ function Yt(o) {
1567
1567
  }, 5 * 60 * 1e3);
1568
1568
  });
1569
1569
  }
1570
- async function Kt(o, t, e) {
1570
+ async function Yt(o, t, e) {
1571
1571
  const n = await fetch(`${ae}/oauth/token`, {
1572
1572
  method: "POST",
1573
1573
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
1574
- body: new nt({
1574
+ body: new ot({
1575
1575
  grant_type: "authorization_code",
1576
1576
  code: o,
1577
1577
  client_id: t,
1578
- redirect_uri: ze,
1578
+ redirect_uri: Je,
1579
1579
  code_verifier: e
1580
1580
  })
1581
1581
  });
@@ -1585,11 +1585,11 @@ async function Kt(o, t, e) {
1585
1585
  }
1586
1586
  return n.json();
1587
1587
  }
1588
- async function Qt(o, t) {
1588
+ async function Kt(o, t) {
1589
1589
  const e = await fetch(`${ae}/oauth/token`, {
1590
1590
  method: "POST",
1591
1591
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
1592
- body: new nt({
1592
+ body: new ot({
1593
1593
  grant_type: "refresh_token",
1594
1594
  refresh_token: o,
1595
1595
  client_id: t
@@ -1601,8 +1601,8 @@ async function Qt(o, t) {
1601
1601
  }
1602
1602
  return e.json();
1603
1603
  }
1604
- async function Zt(o) {
1605
- var s, i, c;
1604
+ async function Qt(o) {
1605
+ var s, i, d;
1606
1606
  const t = await fetch(`${ae}/mcp`, {
1607
1607
  method: "POST",
1608
1608
  headers: {
@@ -1624,7 +1624,7 @@ async function Zt(o) {
1624
1624
  const e = await t.json();
1625
1625
  if (e.error)
1626
1626
  throw new Error(e.error.message);
1627
- const n = (c = (i = (s = e.result) == null ? void 0 : s.content) == null ? void 0 : i[0]) == null ? void 0 : c.text;
1627
+ const n = (d = (i = (s = e.result) == null ? void 0 : s.content) == null ? void 0 : i[0]) == null ? void 0 : d.text;
1628
1628
  if (n)
1629
1629
  return JSON.parse(n);
1630
1630
  throw new Error("Invalid response from whoami");
@@ -1633,48 +1633,48 @@ async function de() {
1633
1633
  const o = Y("Starting authentication...").start();
1634
1634
  try {
1635
1635
  o.text = "Registering OAuth client...";
1636
- const e = (await Gt()).client_id, n = Wt(), s = Vt(n), i = Ue.randomBytes(16).toString("hex");
1636
+ const e = (await Vt()).client_id, n = zt(), s = Wt(n), i = He.randomBytes(16).toString("hex");
1637
1637
  o.text = "Waiting for authorization...";
1638
- const c = Yt(i), u = new ot(`${ae}/oauth/authorize`);
1639
- u.searchParams.set("response_type", "code"), u.searchParams.set("client_id", e), u.searchParams.set("redirect_uri", ze), u.searchParams.set("code_challenge", s), u.searchParams.set("code_challenge_method", "S256"), u.searchParams.set("state", i), o.stop(), console.log(`
1638
+ const d = Gt(i), u = new tt(`${ae}/oauth/authorize`);
1639
+ u.searchParams.set("response_type", "code"), u.searchParams.set("client_id", e), u.searchParams.set("redirect_uri", Je), u.searchParams.set("code_challenge", s), u.searchParams.set("code_challenge_method", "S256"), u.searchParams.set("state", i), o.stop(), console.log(`
1640
1640
  🌐 Opening browser for authentication...`), console.log("If the browser does not open, visit:"), console.log(` ${u.toString()}
1641
- `), await Pt(u.toString());
1642
- const y = await c;
1641
+ `), await Ct(u.toString());
1642
+ const h = await d;
1643
1643
  o.start("Exchanging authorization code...");
1644
- const d = await Kt(y, e, n);
1644
+ const c = await Yt(h, e, n);
1645
1645
  o.text = "Getting user info...";
1646
- const l = await Zt(d.access_token), P = {
1647
- accessToken: d.access_token,
1648
- refreshToken: d.refresh_token,
1649
- expiresAt: new Date(Date.now() + d.expires_in * 1e3).toISOString(),
1646
+ const l = await Qt(c.access_token), x = {
1647
+ accessToken: c.access_token,
1648
+ refreshToken: c.refresh_token,
1649
+ expiresAt: new Date(Date.now() + c.expires_in * 1e3).toISOString(),
1650
1650
  clientId: e,
1651
1651
  userId: l.userId,
1652
1652
  userEmail: l.email
1653
1653
  };
1654
- return ct(P), o.succeed(`Authenticated as ${l.email}`), P;
1654
+ return lt(x), o.succeed(`Authenticated as ${l.email}`), x;
1655
1655
  } catch (t) {
1656
1656
  throw o.fail(`Authentication failed: ${t.message}`), t;
1657
1657
  }
1658
1658
  }
1659
- async function pt() {
1660
- const o = Je();
1659
+ async function dt() {
1660
+ const o = Be();
1661
1661
  if (!o) {
1662
1662
  console.log("Not currently logged in.");
1663
1663
  return;
1664
1664
  }
1665
- dt(), console.log(`✅ Logged out (was: ${o.userEmail})`);
1665
+ ct(), console.log(`✅ Logged out (was: ${o.userEmail})`);
1666
1666
  }
1667
- async function We() {
1668
- let o = Je();
1667
+ async function ze() {
1668
+ let o = Be();
1669
1669
  if (!o)
1670
1670
  return console.log(`Not logged in. Starting authentication...
1671
1671
  `), await de();
1672
- if (!Jt(o))
1672
+ if (!Bt(o))
1673
1673
  return o;
1674
1674
  if (o.refreshToken) {
1675
1675
  const t = Y("Refreshing access token...").start();
1676
1676
  try {
1677
- const e = await Qt(
1677
+ const e = await Kt(
1678
1678
  o.refreshToken,
1679
1679
  o.clientId
1680
1680
  );
@@ -1683,9 +1683,9 @@ async function We() {
1683
1683
  accessToken: e.access_token,
1684
1684
  refreshToken: e.refresh_token,
1685
1685
  expiresAt: new Date(Date.now() + e.expires_in * 1e3).toISOString()
1686
- }, ct(o), t.succeed("Token refreshed"), o;
1686
+ }, lt(o), t.succeed("Token refreshed"), o;
1687
1687
  } catch {
1688
- return t.warn("Token refresh failed, please log in again"), dt(), await de();
1688
+ return t.warn("Token refresh failed, please log in again"), ct(), await de();
1689
1689
  }
1690
1690
  }
1691
1691
  return console.log(`Session expired. Please log in again.
@@ -1694,51 +1694,51 @@ async function We() {
1694
1694
  function be() {
1695
1695
  return ae;
1696
1696
  }
1697
- const X = "@myop/cli", je = process.platform === "win32";
1698
- function qt() {
1697
+ const ee = "@myop/cli", je = process.platform === "win32";
1698
+ function Zt() {
1699
1699
  try {
1700
- return ee("npm config get registry", { encoding: "utf-8" }).trim() || "https://registry.npmjs.org/";
1700
+ return X("npm config get registry", { encoding: "utf-8" }).trim() || "https://registry.npmjs.org/";
1701
1701
  } catch {
1702
1702
  return "https://registry.npmjs.org/";
1703
1703
  }
1704
1704
  }
1705
- function Xt() {
1705
+ function qt() {
1706
1706
  try {
1707
- return ee("npm config get prefix", { encoding: "utf-8" }).trim();
1707
+ return X("npm config get prefix", { encoding: "utf-8" }).trim();
1708
1708
  } catch {
1709
1709
  return null;
1710
1710
  }
1711
1711
  }
1712
- async function eo() {
1712
+ async function Xt() {
1713
1713
  try {
1714
- const o = qt().replace(/\/$/, ""), t = await fetch(`${o}/${X}/latest`);
1714
+ const o = Zt().replace(/\/$/, ""), t = await fetch(`${o}/${ee}/latest`);
1715
1715
  return t.ok ? (await t.json()).version : null;
1716
1716
  } catch {
1717
1717
  return null;
1718
1718
  }
1719
1719
  }
1720
- function to(o, t) {
1720
+ function eo(o, t) {
1721
1721
  const e = o.split(".").map(Number), n = t.split(".").map(Number);
1722
1722
  for (let s = 0; s < Math.max(e.length, n.length); s++) {
1723
- const i = e[s] || 0, c = n[s] || 0;
1724
- if (i > c) return 1;
1725
- if (i < c) return -1;
1723
+ const i = e[s] || 0, d = n[s] || 0;
1724
+ if (i > d) return 1;
1725
+ if (i < d) return -1;
1726
1726
  }
1727
1727
  return 0;
1728
1728
  }
1729
- async function oo(o) {
1729
+ async function to(o) {
1730
1730
  const t = Y({
1731
1731
  text: "Checking for updates...",
1732
1732
  color: "cyan"
1733
- }).start(), e = await eo();
1734
- if (t.stop(), !e || to(e, o) <= 0)
1733
+ }).start(), e = await Xt();
1734
+ if (t.stop(), !e || eo(e, o) <= 0)
1735
1735
  return !1;
1736
1736
  console.log(`
1737
1737
  📦 New version available: ${o} → ${e}
1738
1738
  `);
1739
1739
  let n;
1740
1740
  try {
1741
- n = await tt({
1741
+ n = await et({
1742
1742
  message: "Would you like to update now?",
1743
1743
  choices: [
1744
1744
  { name: "Yes, update now", value: !0 },
@@ -1753,29 +1753,29 @@ async function oo(o) {
1753
1753
  }
1754
1754
  if (n) {
1755
1755
  const s = Y({
1756
- text: `Updating ${X} to v${e}...`,
1756
+ text: `Updating ${ee} to v${e}...`,
1757
1757
  color: "green"
1758
- }).start(), i = `npm install -g ${X}@latest`, c = Xt();
1758
+ }).start(), i = `npm install -g ${ee}@latest`, d = qt();
1759
1759
  try {
1760
- ee(i, { stdio: "pipe" }), s.succeed(`Updated to v${e}`);
1760
+ X(i, { stdio: "pipe" }), s.succeed(`Updated to v${e}`);
1761
1761
  } catch {
1762
1762
  s.stop(), console.log(`
1763
1763
  🔐 Elevated permissions required.
1764
1764
  `);
1765
1765
  try {
1766
1766
  if (je) {
1767
- const l = `Start-Process -FilePath 'cmd' -ArgumentList '/c npm ${c ? `install -g ${X}@latest --prefix \\"${c}\\"` : `install -g ${X}@latest`}' -Verb RunAs -Wait`;
1768
- ee(`powershell -Command "${l}"`, { stdio: "inherit" });
1767
+ const l = `Start-Process -FilePath 'cmd' -ArgumentList '/c npm ${d ? `install -g ${ee}@latest --prefix \\"${d}\\"` : `install -g ${ee}@latest`}' -Verb RunAs -Wait`;
1768
+ X(`powershell -Command "${l}"`, { stdio: "inherit" });
1769
1769
  } else {
1770
- const d = c ? `sudo npm install -g ${X}@latest --prefix "${c}"` : `sudo ${i}`;
1771
- ee(d, { stdio: "inherit" });
1770
+ const c = d ? `sudo npm install -g ${ee}@latest --prefix "${d}"` : `sudo ${i}`;
1771
+ X(c, { stdio: "inherit" });
1772
1772
  }
1773
1773
  console.log(`
1774
1774
  ✅ Updated to v${e}`);
1775
1775
  } catch {
1776
1776
  console.log(`
1777
1777
  ❌ Update failed`);
1778
- const l = je ? `npm install -g ${X}@latest (run as Administrator)` : `sudo npm install -g ${X}@latest`;
1778
+ const l = je ? `npm install -g ${ee}@latest (run as Administrator)` : `sudo npm install -g ${ee}@latest`;
1779
1779
  console.log(`
1780
1780
  Please run manually: ${l}
1781
1781
  `), process.exit(1);
@@ -1783,20 +1783,20 @@ Please run manually: ${l}
1783
1783
  }
1784
1784
  let u = null;
1785
1785
  try {
1786
- let y;
1787
- c ? y = je ? ke(c, "node_modules") : ke(c, "lib", "node_modules") : y = ee("npm root -g", { encoding: "utf-8" }).trim();
1788
- const d = ke(y, X, "package.json"), l = bt(d, "utf-8");
1786
+ let h;
1787
+ d ? h = je ? Te(d, "node_modules") : Te(d, "lib", "node_modules") : h = X("npm root -g", { encoding: "utf-8" }).trim();
1788
+ const c = Te(h, ee, "package.json"), l = $t(c, "utf-8");
1789
1789
  u = JSON.parse(l).version;
1790
1790
  } catch {
1791
1791
  }
1792
1792
  if (u === e)
1793
1793
  return console.log(`
1794
1794
  🔄 Restarting...
1795
- `), $t(process.argv[0], process.argv.slice(1), {
1795
+ `), xt(process.argv[0], process.argv.slice(1), {
1796
1796
  stdio: "inherit",
1797
1797
  shell: !0
1798
- }).on("close", (d) => {
1799
- process.exit(d || 0);
1798
+ }).on("close", (c) => {
1799
+ process.exit(c || 0);
1800
1800
  }), !0;
1801
1801
  console.log(`
1802
1802
  Please run myop again to use the new version.
@@ -1804,35 +1804,35 @@ Please run myop again to use the new version.
1804
1804
  }
1805
1805
  return !1;
1806
1806
  }
1807
- const De = O.join(st.homedir(), ".myop"), Ae = O.join(De, "preferences.json");
1808
- function no() {
1809
- C.existsSync(De) || C.mkdirSync(De, { recursive: !0, mode: 448 });
1807
+ const Le = _.join(nt.homedir(), ".myop"), De = _.join(Le, "preferences.json");
1808
+ function oo() {
1809
+ M.existsSync(Le) || M.mkdirSync(Le, { recursive: !0, mode: 448 });
1810
1810
  }
1811
- function mt() {
1811
+ function pt() {
1812
1812
  try {
1813
- if (!C.existsSync(Ae))
1813
+ if (!M.existsSync(De))
1814
1814
  return {};
1815
- const o = C.readFileSync(Ae, "utf8");
1815
+ const o = M.readFileSync(De, "utf8");
1816
1816
  return JSON.parse(o);
1817
1817
  } catch {
1818
1818
  return {};
1819
1819
  }
1820
1820
  }
1821
- function so(o) {
1822
- no();
1823
- const e = { ...mt(), ...o };
1824
- C.writeFileSync(Ae, JSON.stringify(e, null, 2), {
1821
+ function no(o) {
1822
+ oo();
1823
+ const e = { ...pt(), ...o };
1824
+ M.writeFileSync(De, JSON.stringify(e, null, 2), {
1825
1825
  mode: 384
1826
1826
  });
1827
1827
  }
1828
- function io() {
1829
- return mt().defaultOrganization || null;
1828
+ function so() {
1829
+ return pt().defaultOrganization || null;
1830
1830
  }
1831
- function _e({ id: o, name: t }) {
1832
- so({ defaultOrganization: { id: o, name: t } });
1831
+ function Fe({ id: o, name: t }) {
1832
+ no({ defaultOrganization: { id: o, name: t } });
1833
1833
  }
1834
- async function ro(o, t, e, n = {}) {
1835
- var u, y, d;
1834
+ async function io(o, t, e, n = {}) {
1835
+ var u, h, c;
1836
1836
  const s = await fetch(`${o}/mcp`, {
1837
1837
  method: "POST",
1838
1838
  headers: {
@@ -1854,74 +1854,62 @@ async function ro(o, t, e, n = {}) {
1854
1854
  const i = await s.json();
1855
1855
  if (i.error)
1856
1856
  throw new Error(i.error.message || "MCP error");
1857
- const c = (d = (y = (u = i.result) == null ? void 0 : u.content) == null ? void 0 : y[0]) == null ? void 0 : d.text;
1858
- if (!c)
1857
+ const d = (c = (h = (u = i.result) == null ? void 0 : u.content) == null ? void 0 : h[0]) == null ? void 0 : c.text;
1858
+ if (!d)
1859
1859
  throw new Error(`No content returned from ${e}`);
1860
- return JSON.parse(c);
1860
+ return JSON.parse(d);
1861
1861
  }
1862
- const ao = (o) => new Promise((t) => setTimeout(t, o)), lo = () => {
1862
+ const ro = (o) => new Promise((t) => setTimeout(t, o)), ao = () => {
1863
1863
  let o = new URL(import.meta.url).pathname;
1864
1864
  process.platform === "win32" && o.startsWith("/") && (o = o.slice(1));
1865
- const t = O.dirname(o);
1866
- return O.join(t, "skills");
1867
- }, He = (o, t) => {
1868
- C.mkdirSync(t, { recursive: !0 });
1869
- const e = C.readdirSync(o, { withFileTypes: !0 });
1870
- for (const n of e) {
1871
- const s = O.join(o, n.name), i = O.join(t, n.name);
1872
- n.isDirectory() ? He(s, i) : C.copyFileSync(s, i);
1873
- }
1874
- }, Ve = (o) => {
1875
- const t = lo();
1876
- if (!C.existsSync(t))
1877
- return console.info("Skills source directory not found, skipping skills installation"), !1;
1865
+ const t = _.dirname(o);
1866
+ return _.join(t, "skills");
1867
+ }, lo = (o) => {
1878
1868
  try {
1879
- const e = O.join(o, ".agents", "skills");
1880
- He(t, e);
1881
- const n = [".claude", ".cursor", ".gemini", ".junie", ".agent"], s = C.readdirSync(t, { withFileTypes: !0 }).filter((i) => i.isDirectory()).map((i) => i.name);
1882
- for (const i of n) {
1883
- const c = O.join(o, i, "skills");
1884
- C.mkdirSync(c, { recursive: !0 });
1885
- for (const u of s) {
1886
- const y = O.join(c, u), d = O.join("..", "..", ".agents", "skills", u);
1887
- try {
1888
- C.rmSync(y, { recursive: !0, force: !0 });
1889
- } catch {
1890
- }
1891
- try {
1892
- C.symlinkSync(d, y, "dir");
1893
- } catch {
1894
- He(
1895
- O.join(e, u),
1896
- y
1897
- );
1898
- }
1899
- }
1900
- }
1901
- return !0;
1869
+ const t = _.join(o, "package.json");
1870
+ if (!M.existsSync(t)) return [];
1871
+ const e = JSON.parse(M.readFileSync(t, "utf-8"));
1872
+ return Object.keys({ ...e.dependencies, ...e.devDependencies });
1873
+ } catch {
1874
+ return [];
1875
+ }
1876
+ }, We = async (o) => {
1877
+ const t = ao();
1878
+ if (!M.existsSync(t))
1879
+ return console.info("Skills source directory not found, skipping skills installation"), { success: !1 };
1880
+ try {
1881
+ const e = lo(o), n = ["myop-cli", "myop-component"], s = [
1882
+ { deps: ["@myop/react", "react"], skill: "myop-react-host" },
1883
+ { deps: ["@myop/vue", "vue"], skill: "myop-vue-host" },
1884
+ { deps: ["@myop/angular", "@angular/core"], skill: "myop-angular-host" },
1885
+ { deps: ["@myop/react-native", "react-native"], skill: "myop-react-native-host" }
1886
+ ], i = s.filter(({ deps: c }) => c.some((l) => e.includes(l))).map(({ skill: c }) => c), d = s.flatMap(({ deps: c }) => c.filter((l) => e.includes(l)));
1887
+ i.length > 0 ? n.push(...i) : n.push(...s.map((c) => c.skill));
1888
+ const u = n.map((c) => `--skill ${c}`).join(" "), h = `npx -y skills add "${t}" ${u} --agent '*' --copy -y`;
1889
+ return X(h, { cwd: o, stdio: "pipe" }), { success: !0, detected: d, skillNames: n };
1902
1890
  } catch (e) {
1903
- return console.info("Failed to install skills:", e.message), !1;
1891
+ return console.info("Failed to install skills:", e.message), { success: !1 };
1904
1892
  }
1905
- }, Ge = (o = ".", t = 3, e = 0) => {
1893
+ }, Ve = (o = ".", t = 3, e = 0) => {
1906
1894
  const n = [];
1907
1895
  if (e > t) return n;
1908
1896
  try {
1909
- const s = C.readdirSync(o, { withFileTypes: !0 });
1897
+ const s = M.readdirSync(o, { withFileTypes: !0 });
1910
1898
  for (const i of s) {
1911
- const c = O.join(o, i.name);
1899
+ const d = _.join(o, i.name);
1912
1900
  if (i.isDirectory()) {
1913
1901
  if (i.name === "node_modules" || i.name === ".git" || i.name === "dist" || i.name.startsWith("."))
1914
1902
  continue;
1915
- n.push(...Ge(c, t, e + 1));
1903
+ n.push(...Ve(d, t, e + 1));
1916
1904
  } else if (i.name === "myop.config.json")
1917
1905
  try {
1918
- const u = C.readFileSync(c, "utf-8"), y = JSON.parse(u);
1906
+ const u = M.readFileSync(d, "utf-8"), h = JSON.parse(u);
1919
1907
  n.push({
1920
1908
  path: o,
1921
- configPath: c,
1922
- name: y.name || y.componentName || O.basename(o),
1923
- componentId: y.componentId || null,
1924
- config: y
1909
+ configPath: d,
1910
+ name: h.name || h.componentName || _.basename(o),
1911
+ componentId: h.componentId || null,
1912
+ config: h
1925
1913
  });
1926
1914
  } catch {
1927
1915
  }
@@ -1939,7 +1927,7 @@ const Ce = (o = !1) => {
1939
1927
  verbose: t
1940
1928
  };
1941
1929
  try {
1942
- return v.myopConfig = Et(v.options.configPath), { configFound: !0 };
1930
+ return v.myopConfig = Mt(v.options.configPath), { configFound: !0 };
1943
1931
  } catch (e) {
1944
1932
  if (o) {
1945
1933
  console.info(`
@@ -1949,7 +1937,7 @@ const Ce = (o = !1) => {
1949
1937
  author: "@myop-cli",
1950
1938
  flows: []
1951
1939
  };
1952
- return Be(v.options.configPath, n), v.myopConfig = n, { configFound: !0 };
1940
+ return Ue(v.options.configPath, n), v.myopConfig = n, { configFound: !0 };
1953
1941
  } catch {
1954
1942
  return console.info("Error details :", e), { configFound: !1, error: e };
1955
1943
  }
@@ -1958,11 +1946,11 @@ const Ce = (o = !1) => {
1958
1946
  }
1959
1947
  };
1960
1948
  [
1961
- new Fe(),
1962
- ..._t
1949
+ new _e(),
1950
+ ...jt
1963
1951
  ];
1964
- const co = "0.1.46";
1965
- v.program = new xt();
1952
+ const co = "0.1.48";
1953
+ v.program = new vt();
1966
1954
  v.program.name("@myop/cli").description("Myop CLI - Remote UI Made Easy").version(co);
1967
1955
  v.program.addOption(new me("-c, --config <value>", "myop.config.json file location").default("./myop.config.json", "./myop.config.json"));
1968
1956
  v.program.addOption(new me("-h, --help", "Show helpful information"));
@@ -1970,13 +1958,13 @@ v.program.addOption(new me("-v, --verbose", "Enables verbose output mode for the
1970
1958
  v.program.addOption(new me("--ci", "CI mode: print status info (version, config, auth) as JSON and exit without prompts"));
1971
1959
  v.program.addOption(new me("-m, --monorepo", "Monorepo mode: scan for all myop.config.json files in nested directories"));
1972
1960
  v.program.command("add").description("Install Myop assets").addArgument("type").addArgument("id").action((o, t) => {
1973
- Ce(!0), console.info("adding ", o, t, v.options.configPath), o === "flow" && rt._action(t), process.exit();
1961
+ Ce(!0), console.info("adding ", o, t, v.options.configPath), o === "flow" && it._action(t), process.exit();
1974
1962
  });
1975
1963
  v.program.command("remove").description("Remove Myop asset").argument("<type>", "Myop asset type").argument("<id>", "Asset id").action((o, t) => {
1976
- Ce(), console.info("removing ", o, t, v.options.configPath), o === "flow" && at._action(t), process.exit();
1964
+ Ce(), console.info("removing ", o, t, v.options.configPath), o === "flow" && rt._action(t), process.exit();
1977
1965
  });
1978
1966
  v.program.command("install").description("Install Myop assets").action(async () => {
1979
- Ce(), await it.action();
1967
+ Ce(), await st.action();
1980
1968
  });
1981
1969
  v.program.command("login").description("Authenticate with Myop platform").action(async () => {
1982
1970
  try {
@@ -1987,7 +1975,7 @@ v.program.command("login").description("Authenticate with Myop platform").action
1987
1975
  process.exit(0);
1988
1976
  });
1989
1977
  v.program.command("logout").description("Clear stored credentials").action(async () => {
1990
- await pt(), process.exit(0);
1978
+ await dt(), process.exit(0);
1991
1979
  });
1992
1980
  v.program.command("whoami").description("Show current authenticated user").action(async () => {
1993
1981
  const o = $e();
@@ -2005,28 +1993,28 @@ v.program.command("sync").description('[deprecated] Use "myop push" instead').op
2005
1993
  process.exit(0);
2006
1994
  });
2007
1995
  v.program.command("push").description("Upload component to Myop platform").argument("[componentId]", "Component ID to push to (overrides myop.config.json)").action(async (o) => {
2008
- var M, f, w, _, R, b;
1996
+ var $, g, w, j, O, P;
2009
1997
  const t = v.program.getOptionValue("config") || "./myop.config.json";
2010
1998
  let e = {};
2011
- if (C.existsSync(t))
1999
+ if (M.existsSync(t))
2012
2000
  try {
2013
- e = JSON.parse(C.readFileSync(t, "utf-8"));
2001
+ e = JSON.parse(M.readFileSync(t, "utf-8"));
2014
2002
  } catch (p) {
2015
2003
  console.error(`⚠️ Failed to parse ${t}:`, p.message);
2016
2004
  }
2017
2005
  o && (e.componentId = o);
2018
- const n = e.name || e.componentName || O.basename(process.cwd());
2006
+ const n = e.name || e.componentName || _.basename(process.cwd());
2019
2007
  console.log(`
2020
2008
  📋 Component: ${n}`);
2021
2009
  let s = null, i = !1;
2022
2010
  try {
2023
- const p = JSON.parse(C.readFileSync("package.json", "utf-8"));
2011
+ const p = JSON.parse(M.readFileSync("package.json", "utf-8"));
2024
2012
  i = !!(p.scripts && p.scripts.build);
2025
2013
  } catch {
2026
2014
  }
2027
2015
  if (!i) {
2028
- const p = C.readdirSync(".").filter(
2029
- (E) => E.endsWith(".html") && !E.startsWith(".") && C.statSync(E).isFile()
2016
+ const p = M.readdirSync(".").filter(
2017
+ (E) => E.endsWith(".html") && !E.startsWith(".") && M.statSync(E).isFile()
2030
2018
  );
2031
2019
  p.length === 1 && (s = p[0]);
2032
2020
  }
@@ -2035,53 +2023,53 @@ v.program.command("push").description("Upload component to Myop platform").argum
2035
2023
  else if (i) {
2036
2024
  const { exec: p } = await import("child_process");
2037
2025
  let E = { hasTriedPlatformFix: !1, hasTriedInstall: !1 };
2038
- const x = (k = !1) => new Promise((H) => {
2039
- const A = Y(k ? "Retrying build..." : "Building project...").start();
2040
- p("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (j, J, F) => {
2041
- if (!j) {
2042
- A.succeed("Build completed"), H(!0);
2026
+ const b = (R = !1) => new Promise((D) => {
2027
+ const L = Y(R ? "Retrying build..." : "Building project...").start();
2028
+ p("npm run build", { maxBuffer: 10 * 1024 * 1024 }, async (T, J, F) => {
2029
+ if (!T) {
2030
+ L.succeed("Build completed"), D(!0);
2043
2031
  return;
2044
2032
  }
2045
- if (A.fail("Build failed"), !E.hasTriedPlatformFix && !E.hasTriedInstall) {
2046
- const V = await lt(j, J, F, p, E);
2033
+ if (L.fail("Build failed"), !E.hasTriedPlatformFix && !E.hasTriedInstall) {
2034
+ const V = await at(T, J, F, p, E);
2047
2035
  if (E = { ...E, ...V }, V.handled) {
2048
- const te = await x(!0);
2049
- H(te);
2036
+ const te = await b(!0);
2037
+ D(te);
2050
2038
  return;
2051
2039
  }
2052
2040
  }
2053
- console.error(j.message), H(!1);
2041
+ console.error(T.message), D(!1);
2054
2042
  });
2055
2043
  });
2056
- await x() || process.exit(1);
2044
+ await b() || process.exit(1);
2057
2045
  }
2058
- let c;
2046
+ let d;
2059
2047
  if (s)
2060
- c = s;
2061
- else if (C.existsSync("./dist/index.html"))
2062
- c = "./dist/index.html";
2048
+ d = s;
2049
+ else if (M.existsSync("./dist/index.html"))
2050
+ d = "./dist/index.html";
2063
2051
  else {
2064
- const p = C.readdirSync(".").filter(
2065
- (E) => E.endsWith(".html") && !E.startsWith(".") && C.statSync(E).isFile()
2052
+ const p = M.readdirSync(".").filter(
2053
+ (E) => E.endsWith(".html") && !E.startsWith(".") && M.statSync(E).isFile()
2066
2054
  );
2067
- p.length === 1 ? c = p[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));
2055
+ p.length === 1 ? d = p[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));
2068
2056
  }
2069
- const u = C.readFileSync(c, "utf-8");
2070
- console.log(` File: ${c} (${(u.length / 1024).toFixed(1)} KB)`);
2071
- let y;
2057
+ const u = M.readFileSync(d, "utf-8");
2058
+ console.log(` File: ${d} (${(u.length / 1024).toFixed(1)} KB)`);
2059
+ let h;
2072
2060
  try {
2073
- y = await We();
2061
+ h = await ze();
2074
2062
  } catch (p) {
2075
2063
  console.error("❌ Authentication failed:", p.message), process.exit(1);
2076
2064
  }
2077
- const d = be();
2078
- let l = Y("Uploading...").start(), P;
2065
+ const c = be();
2066
+ let l = Y("Uploading...").start(), x;
2079
2067
  try {
2080
- const p = await fetch(`${d}/mcp`, {
2068
+ const p = await fetch(`${c}/mcp`, {
2081
2069
  method: "POST",
2082
2070
  headers: {
2083
2071
  "Content-Type": "application/json",
2084
- Authorization: `Bearer ${y.accessToken}`
2072
+ Authorization: `Bearer ${h.accessToken}`
2085
2073
  },
2086
2074
  body: JSON.stringify({
2087
2075
  jsonrpc: "2.0",
@@ -2102,43 +2090,43 @@ v.program.command("push").description("Upload component to Myop platform").argum
2102
2090
  const E = await p.json();
2103
2091
  if (E.error)
2104
2092
  throw new Error(E.error.message);
2105
- const x = (w = (f = (M = E.result) == null ? void 0 : M.content) == null ? void 0 : f[0]) == null ? void 0 : w.text;
2106
- if (P = JSON.parse(x), !P.success)
2107
- throw new Error(P.error);
2093
+ const b = (w = (g = ($ = E.result) == null ? void 0 : $.content) == null ? void 0 : g[0]) == null ? void 0 : w.text;
2094
+ if (x = JSON.parse(b), !x.success)
2095
+ throw new Error(x.error);
2108
2096
  } catch (p) {
2109
2097
  l.fail("Failed to get upload URL"), console.error(" ", p.message), process.exit(1);
2110
2098
  }
2111
2099
  try {
2112
2100
  let p;
2113
- const E = P.curlCommand.match(/(?:"|\\")([^"\\]+(?:\\.[^"\\]*)*)(?:"|\\")$/);
2101
+ const E = x.curlCommand.match(/(?:"|\\")([^"\\]+(?:\\.[^"\\]*)*)(?:"|\\")$/);
2114
2102
  if (E)
2115
2103
  p = E[1];
2116
2104
  else {
2117
- const T = P.curlCommand.match(/(https:\/\/[^\s"\\]+)/);
2118
- if (T)
2119
- p = T[1];
2105
+ const k = x.curlCommand.match(/(https:\/\/[^\s"\\]+)/);
2106
+ if (k)
2107
+ p = k[1];
2120
2108
  else
2121
2109
  throw new Error("Could not parse presigned URL");
2122
2110
  }
2123
- const x = await fetch(p, {
2111
+ const b = await fetch(p, {
2124
2112
  method: "PUT",
2125
2113
  headers: { "Content-Type": "text/html" },
2126
2114
  body: u
2127
2115
  });
2128
- if (!x.ok) {
2129
- const T = await x.text();
2130
- throw new Error(`Upload failed: ${x.status} ${T}`);
2116
+ if (!b.ok) {
2117
+ const k = await b.text();
2118
+ throw new Error(`Upload failed: ${b.status} ${k}`);
2131
2119
  }
2132
2120
  } catch (p) {
2133
2121
  l.fail("Upload failed"), console.error(" ", p.message), process.exit(1);
2134
2122
  }
2135
- let g;
2123
+ let y;
2136
2124
  try {
2137
- const p = await fetch(`${d}/mcp`, {
2125
+ const p = await fetch(`${c}/mcp`, {
2138
2126
  method: "POST",
2139
2127
  headers: {
2140
2128
  "Content-Type": "application/json",
2141
- Authorization: `Bearer ${y.accessToken}`
2129
+ Authorization: `Bearer ${h.accessToken}`
2142
2130
  },
2143
2131
  body: JSON.stringify({
2144
2132
  jsonrpc: "2.0",
@@ -2147,7 +2135,7 @@ v.program.command("push").description("Upload component to Myop platform").argum
2147
2135
  params: {
2148
2136
  name: "confirm_upload",
2149
2137
  arguments: {
2150
- uploadId: P.uploadId
2138
+ uploadId: x.uploadId
2151
2139
  }
2152
2140
  }
2153
2141
  })
@@ -2157,32 +2145,32 @@ v.program.command("push").description("Upload component to Myop platform").argum
2157
2145
  const E = await p.json();
2158
2146
  if (E.error)
2159
2147
  throw new Error(E.error.message);
2160
- const x = (b = (R = (_ = E.result) == null ? void 0 : _.content) == null ? void 0 : R[0]) == null ? void 0 : b.text;
2161
- if (g = JSON.parse(x), !g.success)
2162
- throw new Error(g.error);
2148
+ const b = (P = (O = (j = E.result) == null ? void 0 : j.content) == null ? void 0 : O[0]) == null ? void 0 : P.text;
2149
+ if (y = JSON.parse(b), !y.success)
2150
+ throw new Error(y.error);
2163
2151
  l.succeed("Pushed successfully");
2164
2152
  } catch (p) {
2165
2153
  l.fail("Confirmation failed"), console.error(" ", p.message), process.exit(1);
2166
2154
  }
2167
- if (g.isNewComponent || !e.componentId || e.componentId === "DEV") {
2168
- e.componentId = g.componentId, e.organization = g.orgId, e.name || (e.name = g.componentName);
2155
+ if (y.isNewComponent || !e.componentId || e.componentId === "DEV") {
2156
+ e.componentId = y.componentId, e.organization = y.orgId, e.name || (e.name = y.componentName);
2169
2157
  try {
2170
- C.writeFileSync(t, JSON.stringify(e, null, 2));
2158
+ M.writeFileSync(t, JSON.stringify(e, null, 2));
2171
2159
  } catch (p) {
2172
- console.log(`⚠️ Could not update ${t}: ${p.message}`), console.log(` Add componentId: "${g.componentId}" manually`);
2160
+ console.log(`⚠️ Could not update ${t}: ${p.message}`), console.log(` Add componentId: "${y.componentId}" manually`);
2173
2161
  }
2174
2162
  }
2175
2163
  console.log(`
2176
- ${g.componentName}`), console.log(` ${g.dashboardUrl}
2164
+ ${y.componentName}`), console.log(` ${y.dashboardUrl}
2177
2165
  `), process.exit(0);
2178
2166
  });
2179
2167
  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)").action(async (o, t) => {
2180
- var w, _, R;
2168
+ var w, j, O;
2181
2169
  const e = v.program.getOptionValue("config") || "./myop.config.json";
2182
2170
  let n = {};
2183
- if (C.existsSync(e))
2171
+ if (M.existsSync(e))
2184
2172
  try {
2185
- n = JSON.parse(C.readFileSync(e, "utf-8"));
2173
+ n = JSON.parse(M.readFileSync(e, "utf-8"));
2186
2174
  } catch {
2187
2175
  }
2188
2176
  const s = o || n.componentId;
@@ -2190,20 +2178,20 @@ v.program.command("pull").description("Download component HTML from Myop platfor
2190
2178
  const i = n.name || n.componentName || s;
2191
2179
  console.log(`
2192
2180
  📥 Pulling: ${i}`), console.log(` ID: ${s}`);
2193
- let c;
2181
+ let d;
2194
2182
  try {
2195
- c = await We();
2196
- } catch (b) {
2197
- console.error("❌ Authentication failed:", b.message), process.exit(1);
2183
+ d = await ze();
2184
+ } catch (P) {
2185
+ console.error("❌ Authentication failed:", P.message), process.exit(1);
2198
2186
  }
2199
- const u = be(), y = Y("Fetching component...").start();
2200
- let d;
2187
+ const u = be(), h = Y("Fetching component...").start();
2188
+ let c;
2201
2189
  try {
2202
- const b = await fetch(`${u}/mcp`, {
2190
+ const P = await fetch(`${u}/mcp`, {
2203
2191
  method: "POST",
2204
2192
  headers: {
2205
2193
  "Content-Type": "application/json",
2206
- Authorization: `Bearer ${c.accessToken}`
2194
+ Authorization: `Bearer ${d.accessToken}`
2207
2195
  },
2208
2196
  body: JSON.stringify({
2209
2197
  jsonrpc: "2.0",
@@ -2215,35 +2203,35 @@ v.program.command("pull").description("Download component HTML from Myop platfor
2215
2203
  }
2216
2204
  })
2217
2205
  });
2218
- if (!b.ok)
2219
- throw new Error(`Server returned ${b.status}`);
2220
- const p = await b.json();
2206
+ if (!P.ok)
2207
+ throw new Error(`Server returned ${P.status}`);
2208
+ const p = await P.json();
2221
2209
  if (p.error)
2222
2210
  throw new Error(p.error.message);
2223
- const E = (R = (_ = (w = p.result) == null ? void 0 : w.content) == null ? void 0 : _[0]) == null ? void 0 : R.text;
2224
- if (d = JSON.parse(E), !d.success && !d.html)
2225
- throw new Error(d.error || "No HTML content returned");
2226
- y.succeed("Component fetched");
2227
- } catch (b) {
2228
- y.fail("Failed to fetch component"), console.error(" ", b.message), process.exit(1);
2211
+ const E = (O = (j = (w = p.result) == null ? void 0 : w.content) == null ? void 0 : j[0]) == null ? void 0 : O.text;
2212
+ if (c = JSON.parse(E), !c.success && !c.html)
2213
+ throw new Error(c.error || "No HTML content returned");
2214
+ h.succeed("Component fetched");
2215
+ } catch (P) {
2216
+ h.fail("Failed to fetch component"), console.error(" ", P.message), process.exit(1);
2229
2217
  }
2230
2218
  let l = t.output;
2231
- l || (C.existsSync("./dist/index.html") ? l = "./dist/index.html" : l = "./index.html");
2232
- const P = d.htmlContent || d.html, g = O.dirname(l);
2233
- g && !C.existsSync(g) && C.mkdirSync(g, { recursive: !0 }), C.writeFileSync(l, P), console.log(` Saved to: ${l} (${(P.length / 1024).toFixed(1)} KB)`);
2234
- const M = C.existsSync(e);
2235
- let f = !1;
2236
- if (M ? ((!n.componentId || n.componentId === "DEV") && (n.componentId = s, f = !0), !n.name && d.name && (n.name = d.name, f = !0)) : (n = {
2237
- name: d.name || O.basename(process.cwd()),
2219
+ l || (M.existsSync("./dist/index.html") ? l = "./dist/index.html" : l = "./index.html");
2220
+ const x = c.htmlContent || c.html, y = _.dirname(l);
2221
+ y && !M.existsSync(y) && M.mkdirSync(y, { recursive: !0 }), M.writeFileSync(l, x), console.log(` Saved to: ${l} (${(x.length / 1024).toFixed(1)} KB)`);
2222
+ const $ = M.existsSync(e);
2223
+ let g = !1;
2224
+ if ($ ? ((!n.componentId || n.componentId === "DEV") && (n.componentId = s, g = !0), !n.name && c.name && (n.name = c.name, g = !0)) : (n = {
2225
+ name: c.name || _.basename(process.cwd()),
2238
2226
  componentId: s,
2239
2227
  type: "html",
2240
2228
  author: "@myop-cli",
2241
2229
  HMR: !0
2242
- }, f = !0), f)
2230
+ }, g = !0), g)
2243
2231
  try {
2244
- C.writeFileSync(e, JSON.stringify(n, null, 2)), console.log(` ${M ? "Updated" : "Created"} ${e}`);
2245
- } catch (b) {
2246
- console.log(` ⚠️ Could not write ${e}: ${b.message}`);
2232
+ M.writeFileSync(e, JSON.stringify(n, null, 2)), console.log(` ${$ ? "Updated" : "Created"} ${e}`);
2233
+ } catch (P) {
2234
+ console.log(` ⚠️ Could not write ${e}: ${P.message}`);
2247
2235
  }
2248
2236
  console.log(`
2249
2237
  ✅ Pull completed!
@@ -2253,40 +2241,40 @@ v.program.command("list").description("Browse and pull/push remote components").
2253
2241
  const { search: t, select: e } = await import("@inquirer/prompts");
2254
2242
  let n;
2255
2243
  try {
2256
- n = await We();
2257
- } catch (f) {
2258
- console.error("Authentication failed:", f.message), process.exit(1);
2244
+ n = await ze();
2245
+ } catch (g) {
2246
+ console.error("Authentication failed:", g.message), process.exit(1);
2259
2247
  }
2260
- const s = be(), i = (f, w) => ro(s, n.accessToken, f, w);
2261
- let c = Y("Loading organizations...").start(), u;
2248
+ const s = be(), i = (g, w) => io(s, n.accessToken, g, w);
2249
+ let d = Y("Loading organizations...").start(), u;
2262
2250
  try {
2263
- const f = await i("list_organizations");
2264
- if (u = f.organizations || f, !Array.isArray(u))
2251
+ const g = await i("list_organizations");
2252
+ if (u = g.organizations || g, !Array.isArray(u))
2265
2253
  throw new Error("Unexpected response from list_organizations");
2266
- } catch (f) {
2267
- c.fail("Failed to load organizations"), console.error(" ", f.message), process.exit(1);
2254
+ } catch (g) {
2255
+ d.fail("Failed to load organizations"), console.error(" ", g.message), process.exit(1);
2268
2256
  }
2269
- u.length === 0 && (c.fail("No organizations found for this account"), process.exit(1)), c.stop();
2270
- let y, d;
2257
+ u.length === 0 && (d.fail("No organizations found for this account"), process.exit(1)), d.stop();
2258
+ let h, c;
2271
2259
  if (o.org) {
2272
- const f = u.find((w) => w.id === o.org || w._id === o.org);
2273
- f || (console.error(`Organization "${o.org}" not found. Available:`), u.forEach((w) => console.log(` ${w.id || w._id} ${w.name}`)), process.exit(1)), y = f.id || f._id, d = f.name, _e({ id: y, name: d });
2260
+ const g = u.find((w) => w.id === o.org || w._id === o.org);
2261
+ g || (console.error(`Organization "${o.org}" not found. Available:`), u.forEach((w) => console.log(` ${w.id || w._id} ${w.name}`)), process.exit(1)), h = g.id || g._id, c = g.name, Fe({ id: h, name: c });
2274
2262
  } else {
2275
- const f = io();
2276
- if (f && u.find((w) => (w.id || w._id) === f.id))
2277
- y = f.id, d = f.name;
2263
+ const g = so();
2264
+ if (g && u.find((w) => (w.id || w._id) === g.id))
2265
+ h = g.id, c = g.name;
2278
2266
  else if (u.length === 1)
2279
- y = u[0].id || u[0]._id, d = u[0].name, _e({ id: y, name: d });
2267
+ h = u[0].id || u[0]._id, c = u[0].name, Fe({ id: h, name: c });
2280
2268
  else
2281
2269
  try {
2282
2270
  const w = await e({
2283
2271
  message: "Select an organization:",
2284
- choices: u.map((_) => ({
2285
- name: _.name,
2286
- value: { id: _.id || _._id, name: _.name }
2272
+ choices: u.map((j) => ({
2273
+ name: j.name,
2274
+ value: { id: j.id || j._id, name: j.name }
2287
2275
  }))
2288
2276
  });
2289
- y = w.id, d = w.name, _e({ id: y, name: d });
2277
+ h = w.id, c = w.name, Fe({ id: h, name: c });
2290
2278
  } catch (w) {
2291
2279
  throw w.name === "ExitPromptError" && (console.log(`
2292
2280
 
@@ -2294,40 +2282,40 @@ v.program.command("list").description("Browse and pull/push remote components").
2294
2282
  `), process.exit(0)), w;
2295
2283
  }
2296
2284
  }
2297
- console.log(` Using organization: ${d}`), c = Y("Loading components...").start();
2285
+ console.log(` Using organization: ${c}`), d = Y("Loading components...").start();
2298
2286
  let l;
2299
2287
  try {
2300
- const f = await i("list_components", { organizationId: y });
2301
- if (l = f.components || f, !Array.isArray(l))
2288
+ const g = await i("list_components", { organizationId: h });
2289
+ if (l = g.components || g, !Array.isArray(l))
2302
2290
  throw new Error("Unexpected response from list_components");
2303
- } catch (f) {
2304
- c.fail("Failed to load components"), console.error(" ", f.message), process.exit(1);
2291
+ } catch (g) {
2292
+ d.fail("Failed to load components"), console.error(" ", g.message), process.exit(1);
2305
2293
  }
2306
- c.stop(), l.length === 0 && (console.log(` No components found in this organization.
2307
- `), process.exit(0)), console.log(` ${d} - ${l.length} component(s)
2294
+ d.stop(), l.length === 0 && (console.log(` No components found in this organization.
2295
+ `), process.exit(0)), console.log(` ${c} - ${l.length} component(s)
2308
2296
  `);
2309
- const P = [];
2297
+ const x = [];
2310
2298
  for (; ; ) {
2311
- const f = `[Done - pull/push ${P.length} selected]`, w = "__done__", _ = new Set(P.map((p) => p.id || p._id || p.componentId));
2312
- let R;
2299
+ const g = `[Done - pull/push ${x.length} selected]`, w = "__done__", j = new Set(x.map((p) => p.id || p._id || p.componentId));
2300
+ let O;
2313
2301
  try {
2314
- R = await t({
2302
+ O = await t({
2315
2303
  message: "Search & select components:",
2316
2304
  source: (p) => {
2317
- const E = (p || "").toLowerCase(), x = l.filter((k) => {
2318
- const H = k.id || k._id || k.componentId;
2319
- return _.has(H) ? !1 : E ? (k.name || "").toLowerCase().includes(E) : !0;
2320
- }), T = [
2321
- { name: f, value: w }
2305
+ const E = (p || "").toLowerCase(), b = l.filter((R) => {
2306
+ const D = R.id || R._id || R.componentId;
2307
+ return j.has(D) ? !1 : E ? (R.name || "").toLowerCase().includes(E) : !0;
2308
+ }), k = [
2309
+ { name: g, value: w }
2322
2310
  ];
2323
- for (const k of x) {
2324
- const H = k.id || k._id || k.componentId, A = H ? H.substring(0, 8) + "..." : "";
2325
- T.push({
2326
- name: `${k.name} (${A})`,
2327
- value: H
2311
+ for (const R of b) {
2312
+ const D = R.id || R._id || R.componentId, L = D ? D.substring(0, 8) + "..." : "";
2313
+ k.push({
2314
+ name: `${R.name} (${L})`,
2315
+ value: D
2328
2316
  });
2329
2317
  }
2330
- return T;
2318
+ return k;
2331
2319
  }
2332
2320
  });
2333
2321
  } catch (p) {
@@ -2336,99 +2324,99 @@ v.program.command("list").description("Browse and pull/push remote components").
2336
2324
  👋 Goodbye!
2337
2325
  `), process.exit(0)), p;
2338
2326
  }
2339
- if (R === w)
2327
+ if (O === w)
2340
2328
  break;
2341
- const b = l.find((p) => (p.id || p._id || p.componentId) === R);
2342
- b && (P.push(b), console.log(` + ${b.name}`));
2329
+ const P = l.find((p) => (p.id || p._id || p.componentId) === O);
2330
+ P && (x.push(P), console.log(` + ${P.name}`));
2343
2331
  }
2344
- P.length === 0 && (console.log(` No components selected.
2332
+ x.length === 0 && (console.log(` No components selected.
2345
2333
  `), process.exit(0));
2346
- let g;
2334
+ let y;
2347
2335
  try {
2348
- g = await e({
2349
- message: `${P.length} component(s) selected:`,
2336
+ y = await e({
2337
+ message: `${x.length} component(s) selected:`,
2350
2338
  choices: [
2351
2339
  { name: "Pull selected", value: "pull" },
2352
2340
  { name: "Push selected", value: "push" },
2353
2341
  { name: "Cancel", value: "cancel" }
2354
2342
  ]
2355
2343
  });
2356
- } catch (f) {
2357
- throw f.name === "ExitPromptError" && (console.log(`
2344
+ } catch (g) {
2345
+ throw g.name === "ExitPromptError" && (console.log(`
2358
2346
 
2359
2347
  👋 Goodbye!
2360
- `), process.exit(0)), f;
2348
+ `), process.exit(0)), g;
2361
2349
  }
2362
- g === "cancel" && (console.log(` Cancelled.
2350
+ y === "cancel" && (console.log(` Cancelled.
2363
2351
  `), process.exit(0));
2364
- const M = (f) => f.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
2365
- if (g === "pull") {
2352
+ const $ = (g) => g.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
2353
+ if (y === "pull") {
2366
2354
  console.log(`
2367
- Pulling ${P.length} components...
2355
+ Pulling ${x.length} components...
2368
2356
  `);
2369
- const f = await Promise.all(P.map(async (R) => {
2370
- const b = R.id || R._id || R.componentId;
2357
+ const g = await Promise.all(x.map(async (O) => {
2358
+ const P = O.id || O._id || O.componentId;
2371
2359
  try {
2372
- const p = await i("get_component", { componentId: b }), E = M(R.name);
2373
- C.mkdirSync(E, { recursive: !0 });
2374
- const x = p.htmlContent || p.html;
2375
- if (!x)
2360
+ const p = await i("get_component", { componentId: P }), E = $(O.name);
2361
+ M.mkdirSync(E, { recursive: !0 });
2362
+ const b = p.htmlContent || p.html;
2363
+ if (!b)
2376
2364
  throw new Error("No HTML content returned");
2377
- return C.writeFileSync(O.join(E, "index.html"), x), C.writeFileSync(O.join(E, "myop.config.json"), JSON.stringify({
2378
- name: R.name,
2379
- componentId: b,
2380
- organization: y,
2365
+ return M.writeFileSync(_.join(E, "index.html"), b), M.writeFileSync(_.join(E, "myop.config.json"), JSON.stringify({
2366
+ name: O.name,
2367
+ componentId: P,
2368
+ organization: h,
2381
2369
  type: "html",
2382
2370
  author: "@myop-cli",
2383
2371
  HMR: !0
2384
- }, null, 2)), { name: R.name, status: "ok", dir: E };
2372
+ }, null, 2)), { name: O.name, status: "ok", dir: E };
2385
2373
  } catch (p) {
2386
- return { name: R.name, status: "failed", error: p.message };
2374
+ return { name: O.name, status: "failed", error: p.message };
2387
2375
  }
2388
2376
  }));
2389
- let w = 0, _ = 0;
2390
- for (const R of f)
2391
- R.status === "ok" ? (console.log(` \x1B[32m✔\x1B[0m ${R.name} -> ./${R.dir}/`), w++) : (console.log(` \x1B[31m✖\x1B[0m ${R.name} - ${R.error}`), _++);
2377
+ let w = 0, j = 0;
2378
+ for (const O of g)
2379
+ O.status === "ok" ? (console.log(` \x1B[32m✔\x1B[0m ${O.name} -> ./${O.dir}/`), w++) : (console.log(` \x1B[31m✖\x1B[0m ${O.name} - ${O.error}`), j++);
2392
2380
  console.log(`
2393
- Done! Pulled ${w} component${w !== 1 ? "s" : ""}.${_ ? ` ${_} failed.` : ""}
2381
+ Done! Pulled ${w} component${w !== 1 ? "s" : ""}.${j ? ` ${j} failed.` : ""}
2394
2382
  `);
2395
- } else if (g === "push") {
2383
+ } else if (y === "push") {
2396
2384
  console.log(`
2397
- Pushing ${P.length} components...
2385
+ Pushing ${x.length} components...
2398
2386
  `);
2399
- const f = Ge(".", 3), w = await Promise.all(P.map(async (p) => {
2400
- const E = p.id || p._id || p.componentId, x = f.find((T) => T.componentId === E);
2401
- if (!x)
2387
+ const g = Ve(".", 3), w = await Promise.all(x.map(async (p) => {
2388
+ const E = p.id || p._id || p.componentId, b = g.find((k) => k.componentId === E);
2389
+ if (!b)
2402
2390
  return { name: p.name, status: "skipped", reason: "no local match" };
2403
2391
  try {
2404
- let T;
2405
- const k = x.path;
2406
- if (C.existsSync(O.join(k, "dist", "index.html")))
2407
- T = O.join(k, "dist", "index.html");
2392
+ let k;
2393
+ const R = b.path;
2394
+ if (M.existsSync(_.join(R, "dist", "index.html")))
2395
+ k = _.join(R, "dist", "index.html");
2408
2396
  else {
2409
- const z = C.readdirSync(k).filter(
2410
- (Q) => Q.endsWith(".html") && !Q.startsWith(".") && C.statSync(O.join(k, Q)).isFile()
2397
+ const z = M.readdirSync(R).filter(
2398
+ (Q) => Q.endsWith(".html") && !Q.startsWith(".") && M.statSync(_.join(R, Q)).isFile()
2411
2399
  );
2412
2400
  if (z.length === 1)
2413
- T = O.join(k, z[0]);
2401
+ k = _.join(R, z[0]);
2414
2402
  else if (z.includes("index.html"))
2415
- T = O.join(k, "index.html");
2403
+ k = _.join(R, "index.html");
2416
2404
  else
2417
2405
  throw new Error("No HTML file found");
2418
2406
  }
2419
- const H = C.readFileSync(T, "utf-8"), A = x.name || p.name, j = await i("upload_component", {
2420
- name: A,
2407
+ const D = M.readFileSync(k, "utf-8"), L = b.name || p.name, T = await i("upload_component", {
2408
+ name: L,
2421
2409
  componentId: E,
2422
- organization: y
2410
+ organization: h
2423
2411
  });
2424
- if (!j.success)
2425
- throw new Error(j.error || "Upload request failed");
2412
+ if (!T.success)
2413
+ throw new Error(T.error || "Upload request failed");
2426
2414
  let J;
2427
- const F = j.curlCommand.match(/(?:"|\\")([^"\\]+(?:\\.[^"\\]*)*)(?:"|\\")$/);
2415
+ const F = T.curlCommand.match(/(?:"|\\")([^"\\]+(?:\\.[^"\\]*)*)(?:"|\\")$/);
2428
2416
  if (F)
2429
2417
  J = F[1];
2430
2418
  else {
2431
- const z = j.curlCommand.match(/(https:\/\/[^\s"\\]+)/);
2419
+ const z = T.curlCommand.match(/(https:\/\/[^\s"\\]+)/);
2432
2420
  if (z)
2433
2421
  J = z[1];
2434
2422
  else
@@ -2437,25 +2425,25 @@ v.program.command("list").description("Browse and pull/push remote components").
2437
2425
  const V = await fetch(J, {
2438
2426
  method: "PUT",
2439
2427
  headers: { "Content-Type": "text/html" },
2440
- body: H
2428
+ body: D
2441
2429
  });
2442
2430
  if (!V.ok)
2443
2431
  throw new Error(`Upload failed: ${V.status}`);
2444
2432
  const te = await i("confirm_upload", {
2445
- uploadId: j.uploadId
2433
+ uploadId: T.uploadId
2446
2434
  });
2447
2435
  if (!te.success)
2448
2436
  throw new Error(te.error || "Confirmation failed");
2449
- return { name: A, status: "ok" };
2450
- } catch (T) {
2451
- return { name: p.name, status: "failed", error: T.message };
2437
+ return { name: L, status: "ok" };
2438
+ } catch (k) {
2439
+ return { name: p.name, status: "failed", error: k.message };
2452
2440
  }
2453
2441
  }));
2454
- let _ = 0, R = 0, b = 0;
2442
+ let j = 0, O = 0, P = 0;
2455
2443
  for (const p of w)
2456
- p.status === "ok" ? (console.log(` \x1B[32m✔\x1B[0m ${p.name}`), _++) : p.status === "skipped" ? (console.log(` \x1B[33m⊘\x1B[0m ${p.name} (${p.reason})`), R++) : (console.log(` \x1B[31m✖\x1B[0m ${p.name} - ${p.error}`), b++);
2444
+ p.status === "ok" ? (console.log(` \x1B[32m✔\x1B[0m ${p.name}`), j++) : p.status === "skipped" ? (console.log(` \x1B[33m⊘\x1B[0m ${p.name} (${p.reason})`), O++) : (console.log(` \x1B[31m✖\x1B[0m ${p.name} - ${p.error}`), P++);
2457
2445
  console.log(`
2458
- Done! Pushed ${_}${R ? `, skipped ${R}` : ""}${b ? `, ${b} failed` : ""}.
2446
+ Done! Pushed ${j}${O ? `, skipped ${O}` : ""}${P ? `, ${P} failed` : ""}.
2459
2447
  `);
2460
2448
  }
2461
2449
  process.exit(0);
@@ -2468,11 +2456,11 @@ v.program.command("create").description("Create a new Myop HTML component and st
2468
2456
  message: "Component name:",
2469
2457
  default: n
2470
2458
  });
2471
- } catch (y) {
2472
- throw y.name === "ExitPromptError" && (console.log(`
2459
+ } catch (h) {
2460
+ throw h.name === "ExitPromptError" && (console.log(`
2473
2461
 
2474
2462
  👋 Goodbye!
2475
- `), process.exit(0)), y;
2463
+ `), process.exit(0)), h;
2476
2464
  }
2477
2465
  (t.existsSync("index.html") || t.existsSync("myop.config.json")) && (console.log(`
2478
2466
  ⚠️ 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));
@@ -2484,7 +2472,7 @@ v.program.command("create").description("Create a new Myop HTML component and st
2484
2472
  HMR: !0
2485
2473
  };
2486
2474
  t.writeFileSync("myop.config.json", JSON.stringify(i, null, 2));
2487
- const c = `<!DOCTYPE html>
2475
+ const d = `<!DOCTYPE html>
2488
2476
  <html lang="en">
2489
2477
  <head>
2490
2478
  <meta charset="UTF-8">
@@ -2606,55 +2594,78 @@ v.program.command("create").description("Create a new Myop HTML component and st
2606
2594
  <\/script>
2607
2595
  </body>
2608
2596
  </html>`;
2609
- t.writeFileSync("index.html", c);
2610
- const u = Ve(process.cwd());
2597
+ t.writeFileSync("index.html", d);
2598
+ const u = await We(process.cwd());
2611
2599
  console.log(`
2612
- ✅ Created ${s}`), console.log(" index.html"), console.log(" myop.config.json"), u && console.log(" .agents/skills/ (AI agent skills)"), console.log(""), await xe();
2600
+ ✅ Created ${s}`), console.log(" index.html"), console.log(" myop.config.json"), u.success && console.log(" AI agent skills installed"), console.log(""), await xe();
2613
2601
  });
2614
2602
  v.program.command("dev").description("Start development server with file watching").action(xe);
2615
- const ut = async () => {
2616
- const o = process.cwd(), t = Y("Installing AI agent skills...").start(), e = Ve(o);
2617
- e ? (t.succeed("AI agent skills installed"), console.log(" .agents/skills/ (master copy)"), console.log(" Symlinked to: .claude/, .cursor/, .gemini/, .junie/, .agent/")) : t.fail("Failed to install skills"), process.exit(e ? 0 : 1);
2603
+ const mt = async () => {
2604
+ const o = process.cwd(), t = Y("Installing AI agent skills...").start(), e = await We(o);
2605
+ 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);
2618
2606
  };
2619
- v.program.command("skill").description("Install or update AI agent skills in the current directory").action(ut);
2620
- v.program.command("train").description("Install or update AI agent skills in the current directory (alias for skill)").action(ut);
2607
+ v.program.command("skill").description("Install or update AI agent skills in the current directory").action(mt);
2608
+ v.program.command("train").description("Install or update AI agent skills in the current directory (alias for skill)").action(mt);
2621
2609
  v.program.command("mcp").description("Configure Myop MCP server for your AI coding assistant").action(async () => {
2622
2610
  const { select: o, confirm: t } = await import("@inquirer/prompts"), n = (await import("os")).homedir(), s = be() + "/mcp", i = [
2623
2611
  {
2624
2612
  name: "Claude Code",
2625
2613
  value: "claude",
2626
- configPath: O.join(n, ".claude.json"),
2614
+ configPath: _.join(n, ".claude.json"),
2627
2615
  getEntry: () => ({ type: "http", url: s }),
2628
- restart: "Run /mcp in Claude Code to reload, or restart Claude Code."
2616
+ nextSteps: [
2617
+ "Restart Claude Code to pick up the new MCP config.",
2618
+ 'Type /mcp to see all MCP servers and verify "myop" is listed.',
2619
+ 'Select "Authenticate" next to myop — your browser will open',
2620
+ "to sign in with your Myop account (OAuth)."
2621
+ ]
2629
2622
  },
2630
2623
  {
2631
2624
  name: "Cursor",
2632
2625
  value: "cursor",
2633
- configPath: O.join(n, ".cursor", "mcp.json"),
2626
+ configPath: _.join(n, ".cursor", "mcp.json"),
2634
2627
  getEntry: () => ({ url: s }),
2635
- restart: "Restart Cursor or reload the window to activate."
2628
+ nextSteps: [
2629
+ 'Go to Cursor Settings > Tools & MCP to verify "myop" appears.',
2630
+ "A green dot means connected. Yellow means auth is needed —",
2631
+ 'click "Connect" and your browser will open to sign in',
2632
+ "with your Myop account (OAuth).",
2633
+ "You can also click the refresh icon to reconnect after changes."
2634
+ ]
2636
2635
  },
2637
2636
  {
2638
2637
  name: "Windsurf",
2639
2638
  value: "windsurf",
2640
- configPath: O.join(n, ".codeium", "windsurf", "mcp_config.json"),
2639
+ configPath: _.join(n, ".codeium", "windsurf", "mcp_config.json"),
2641
2640
  getEntry: () => ({ url: s }),
2642
- restart: "Restart Windsurf to activate."
2641
+ nextSteps: [
2642
+ "Open Cascade and click the hammer icon (top-right) to see MCP servers.",
2643
+ 'Verify "myop" shows a green dot (connected).',
2644
+ 'Click "Refresh" if needed. On first use, your browser will open',
2645
+ "to sign in with your Myop account (OAuth)."
2646
+ ]
2643
2647
  },
2644
2648
  {
2645
2649
  name: "VS Code (GitHub Copilot)",
2646
2650
  value: "vscode",
2647
- configPath: process.platform === "darwin" ? O.join(n, "Library", "Application Support", "Code", "User", "mcp.json") : process.platform === "win32" ? O.join(process.env.APPDATA || O.join(n, "AppData", "Roaming"), "Code", "User", "mcp.json") : O.join(n, ".config", "Code", "User", "mcp.json"),
2651
+ 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"),
2648
2652
  getEntry: () => ({ type: "http", url: s }),
2649
- restart: "Restart VS Code to activate. Requires GitHub Copilot."
2653
+ nextSteps: [
2654
+ "Requires VS Code 1.99+ and GitHub Copilot extension.",
2655
+ 'Press Cmd+Shift+P / Ctrl+Shift+P > "MCP: List Servers"',
2656
+ 'to verify "myop" is running. You can also see MCP tools',
2657
+ "via the Tools button in Copilot Chat (Agent mode).",
2658
+ "On first use, your browser will open to sign in",
2659
+ "with your Myop account (OAuth)."
2660
+ ]
2650
2661
  }
2651
2662
  ];
2652
2663
  console.log(`
2653
2664
  Configure Myop MCP server for your AI coding assistant.
2654
2665
  `);
2655
- let c;
2666
+ let d;
2656
2667
  try {
2657
- c = await o({
2668
+ d = await o({
2658
2669
  message: "Select your AI coding assistant:",
2659
2670
  choices: i.map((l) => ({ name: l.name, value: l.value }))
2660
2671
  });
@@ -2664,44 +2675,52 @@ v.program.command("mcp").description("Configure Myop MCP server for your AI codi
2664
2675
  👋 Goodbye!
2665
2676
  `), process.exit(0)), l;
2666
2677
  }
2667
- const u = i.find((l) => l.value === c);
2668
- let y = {};
2678
+ const u = i.find((l) => l.value === d);
2679
+ let h = {};
2669
2680
  try {
2670
- const l = C.readFileSync(u.configPath, "utf-8");
2671
- y = JSON.parse(l);
2681
+ const l = M.readFileSync(u.configPath, "utf-8");
2682
+ h = JSON.parse(l);
2672
2683
  } catch {
2673
2684
  }
2674
- y.mcpServers || (y.mcpServers = {});
2675
- const d = y.mcpServers.myop;
2676
- if (d && d.url === s && (console.log(`
2677
- Myop MCP is already configured for ${u.name}.`), console.log(` Config: ${u.configPath}
2678
- `), process.exit(0)), d) {
2685
+ h.mcpServers || (h.mcpServers = {});
2686
+ const c = h.mcpServers.myop;
2687
+ if (c && c.url === s) {
2688
+ console.log(`
2689
+ Myop MCP is already configured for ${u.name}.`), console.log(` Config: ${u.configPath}`), console.log(`
2690
+ \x1B[1mNext steps:\x1B[0m`);
2691
+ for (const l of u.nextSteps)
2692
+ console.log(` ${l}`);
2693
+ console.log(""), process.exit(0);
2694
+ }
2695
+ if (c) {
2679
2696
  console.log(`
2680
- Myop MCP is already configured (URL: ${d.url}).`);
2697
+ Myop MCP is already configured (URL: ${c.url}).`);
2681
2698
  try {
2682
2699
  await t({ message: "Update to latest URL?", default: !0 }) || process.exit(0);
2683
2700
  } catch (l) {
2684
2701
  throw l.name === "ExitPromptError" && process.exit(0), l;
2685
2702
  }
2686
2703
  }
2687
- y.mcpServers.myop = u.getEntry(), C.mkdirSync(O.dirname(u.configPath), { recursive: !0 }), C.writeFileSync(u.configPath, JSON.stringify(y, null, 2)), console.log(`
2704
+ h.mcpServers.myop = u.getEntry(), M.mkdirSync(_.dirname(u.configPath), { recursive: !0 }), M.writeFileSync(u.configPath, JSON.stringify(h, null, 2)), console.log(`
2688
2705
  \x1B[32m✔\x1B[0m Myop MCP configured for ${u.name}`), console.log(` Config: ${u.configPath}`), console.log(` Server: ${s}`), console.log(`
2689
- ${u.restart}
2690
- `), process.exit(0);
2706
+ \x1B[1mNext steps:\x1B[0m`);
2707
+ for (const l of u.nextSteps)
2708
+ console.log(` ${l}`);
2709
+ console.log(""), process.exit(0);
2691
2710
  });
2692
2711
  const po = () => {
2693
2712
  try {
2694
- ee("git --version", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
2713
+ X("git --version", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
2695
2714
  } catch {
2696
2715
  return { gitNotInstalled: !0 };
2697
2716
  }
2698
2717
  try {
2699
- ee("git rev-parse --git-dir", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
2718
+ X("git rev-parse --git-dir", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
2700
2719
  } catch {
2701
2720
  return { notARepo: !0 };
2702
2721
  }
2703
2722
  try {
2704
- const o = ee("git diff --stat HEAD -- . 2>/dev/null || git diff --stat -- . 2>/dev/null", {
2723
+ const o = X("git diff --stat HEAD -- . 2>/dev/null || git diff --stat -- . 2>/dev/null", {
2705
2724
  encoding: "utf-8",
2706
2725
  stdio: ["pipe", "pipe", "pipe"]
2707
2726
  }).trim();
@@ -2722,12 +2741,12 @@ const po = () => {
2722
2741
  return null;
2723
2742
  }
2724
2743
  }, ie = async (o = !1, t = !1) => {
2725
- var l, P, g;
2726
- const e = $e(), n = !!(e != null && e.email), s = ((l = v.myopConfig) == null ? void 0 : l.name) || ((P = v.myopConfig) == null ? void 0 : P.componentName), i = (g = v.myopConfig) == null ? void 0 : g.componentId, c = po();
2744
+ var l, x, y;
2745
+ const e = $e(), n = !!(e != null && e.email), s = ((l = v.myopConfig) == null ? void 0 : l.name) || ((x = v.myopConfig) == null ? void 0 : x.componentName), i = (y = v.myopConfig) == null ? void 0 : y.componentId, d = po();
2727
2746
  console.log(`
2728
2747
  ┌─────────────────────────────────────────────────┐`), console.log("│ │"), console.log("│ Welcome to Myop CLI - Remote UI Made Easy │"), console.log("│ │"), console.log(`└─────────────────────────────────────────────────┘
2729
- `), 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"}`), c != null && c.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")) : c != null && c.notARepo ? console.log(" Changes: Not a git repository") : c && (c.insertions > 0 || c.deletions > 0) ? console.log(` Changes: ${c.files} file${c.files !== 1 ? "s" : ""} | \x1B[32m+${c.insertions}\x1B[0m \x1B[31m-${c.deletions}\x1B[0m`) : c && console.log(" Changes: No uncommitted changes"), console.log("");
2730
- const y = [
2748
+ `), 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"}`), d != null && d.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")) : d != null && d.notARepo ? console.log(" Changes: Not a git repository") : d && (d.insertions > 0 || d.deletions > 0) ? console.log(` Changes: ${d.files} file${d.files !== 1 ? "s" : ""} | \x1B[32m+${d.insertions}\x1B[0m \x1B[31m-${d.deletions}\x1B[0m`) : d && console.log(" Changes: No uncommitted changes"), console.log("");
2749
+ const h = [
2731
2750
  {
2732
2751
  emoji: "🚀",
2733
2752
  label: "Initialize new component",
@@ -2749,14 +2768,14 @@ const po = () => {
2749
2768
  help: "Builds project & uploads dist/index.html to Myop",
2750
2769
  disabled: o ? n ? !1 : "(login required)" : "(no config file)"
2751
2770
  }
2752
- ].map((M) => ({
2753
- name: t && !M.disabled ? `${M.emoji} ${M.label}
2754
- ${M.help}` : `${M.emoji} ${M.label}`,
2755
- value: M.value,
2756
- disabled: M.disabled
2771
+ ].map(($) => ({
2772
+ name: t && !$.disabled ? `${$.emoji} ${$.label}
2773
+ ${$.help}` : `${$.emoji} ${$.label}`,
2774
+ value: $.value,
2775
+ disabled: $.disabled
2757
2776
  }));
2758
- y.push(
2759
- new Fe(),
2777
+ h.push(
2778
+ new _e(),
2760
2779
  {
2761
2780
  name: t && n ? `🔓 Logout (${e.email})
2762
2781
  Clears stored credentials from this machine` : t && !n ? `🔐 Login to Myop
@@ -2767,25 +2786,25 @@ const po = () => {
2767
2786
  name: t ? "📖 Hide help" : "📖 Show help",
2768
2787
  value: "help"
2769
2788
  },
2770
- new Fe(),
2789
+ new _e(),
2771
2790
  {
2772
2791
  name: "👋 Exit",
2773
2792
  value: "exit"
2774
2793
  }
2775
2794
  );
2776
- let d;
2795
+ let c;
2777
2796
  try {
2778
- d = await tt({
2797
+ c = await et({
2779
2798
  message: "What would you like to do?",
2780
- choices: y
2799
+ choices: h
2781
2800
  });
2782
- } catch (M) {
2783
- throw M.name === "ExitPromptError" && (console.log(`
2801
+ } catch ($) {
2802
+ throw $.name === "ExitPromptError" && (console.log(`
2784
2803
 
2785
2804
  👋 Goodbye!
2786
- `), process.exit(0)), M;
2805
+ `), process.exit(0)), $;
2787
2806
  }
2788
- switch (d) {
2807
+ switch (c) {
2789
2808
  case "init":
2790
2809
  await fo();
2791
2810
  break;
@@ -2793,9 +2812,9 @@ const po = () => {
2793
2812
  console.log(`
2794
2813
  Pushing component...
2795
2814
  `);
2796
- const { execSync: M } = await import("child_process");
2815
+ const { execSync: $ } = await import("child_process");
2797
2816
  try {
2798
- M("node " + process.argv[1] + " push", { stdio: "inherit" });
2817
+ $("node " + process.argv[1] + " push", { stdio: "inherit" });
2799
2818
  } catch {
2800
2819
  }
2801
2820
  await ie(!0, t);
@@ -2807,12 +2826,12 @@ Pushing component...
2807
2826
  try {
2808
2827
  await de(), console.log(`
2809
2828
  `), await ie(o, t);
2810
- } catch (f) {
2811
- console.error("Login failed:", f.message), await ie(o, t);
2829
+ } catch (g) {
2830
+ console.error("Login failed:", g.message), await ie(o, t);
2812
2831
  }
2813
2832
  break;
2814
2833
  case "logout":
2815
- await pt(), console.log(`
2834
+ await dt(), console.log(`
2816
2835
  `), await ie(o, t);
2817
2836
  break;
2818
2837
  case "help":
@@ -2823,7 +2842,7 @@ Pushing component...
2823
2842
  }
2824
2843
  }, ve = ".myop-monorepo.json", mo = () => {
2825
2844
  try {
2826
- const o = C.readFileSync(ve, "utf-8");
2845
+ const o = M.readFileSync(ve, "utf-8");
2827
2846
  return JSON.parse(o);
2828
2847
  } catch {
2829
2848
  return null;
@@ -2834,7 +2853,7 @@ Pushing component...
2834
2853
  selectedComponents: o,
2835
2854
  lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
2836
2855
  };
2837
- C.writeFileSync(ve, JSON.stringify(t, null, 2));
2856
+ M.writeFileSync(ve, JSON.stringify(t, null, 2));
2838
2857
  } catch {
2839
2858
  }
2840
2859
  }, go = async () => {
@@ -2842,49 +2861,54 @@ Pushing component...
2842
2861
  console.log(`
2843
2862
  ┌─────────────────────────────────────────────────┐`), console.log("│ │"), console.log("│ Myop CLI - Monorepo Mode │"), console.log("│ │"), console.log(`└─────────────────────────────────────────────────┘
2844
2863
  `);
2845
- const e = Y("Scanning for components...").start(), n = Ge(".");
2864
+ const e = Y("Scanning for components...").start(), n = Ve(".");
2846
2865
  e.stop(), n.length === 0 && (console.log(` ⚠️ No myop.config.json files found in this directory or subdirectories.
2847
2866
  `), console.log(" Run `myop` without -m flag to initialize a single component.\n"), process.exit(0));
2848
- const s = mo(), i = (s == null ? void 0 : s.selectedComponents) || [], c = i.length > 0;
2867
+ const s = mo(), i = (s == null ? void 0 : s.selectedComponents) || [], d = i.length > 0;
2849
2868
  console.log(` Found ${n.length} component${n.length > 1 ? "s" : ""}:
2850
- `), n.forEach((g, M) => {
2851
- const f = g.componentId ? "✅" : "⚪", w = g.componentId ? g.componentId.substring(0, 8) + "..." : "(not pushed)";
2852
- console.log(` ${f} ${g.name}`), console.log(` Path: ${g.path}`), console.log(` ID: ${w}`), console.log("");
2853
- }), console.log(` User: ${t ? o.email : "Not logged in"}`), c && console.log(` 📋 Using saved selection from ${ve}`), console.log("");
2854
- const { checkbox: u } = await import("@inquirer/prompts"), y = n.map((g) => ({
2855
- name: `${g.name} (${g.path})`,
2856
- value: g.path,
2857
- checked: c ? i.includes(g.path) : !0
2858
- }));
2859
- let d;
2860
- try {
2861
- d = await u({
2862
- message: "Select components to start in dev mode:",
2863
- choices: y
2864
- });
2865
- } catch (g) {
2866
- throw g.name === "ExitPromptError" && (console.log(`
2869
+ `), n.forEach((x, y) => {
2870
+ const $ = x.componentId ? "✅" : "⚪", g = x.componentId ? x.componentId.substring(0, 8) + "..." : "(not pushed)";
2871
+ console.log(` ${$} ${x.name}`), console.log(` Path: ${x.path}`), console.log(` ID: ${g}`), console.log("");
2872
+ }), console.log(` User: ${t ? o.email : "Not logged in"}`), d && console.log(` 📋 Using saved selection from ${ve}`), console.log("");
2873
+ const u = v.program.getOptionValue("ci");
2874
+ let h;
2875
+ if (u)
2876
+ d ? (h = i, console.log(` 🤖 CI mode: using saved selection (${h.length} components)`)) : (h = n.map((x) => x.path), console.log(` 🤖 CI mode: no saved selection, using all ${h.length} components`));
2877
+ else {
2878
+ const { checkbox: x } = await import("@inquirer/prompts"), y = n.map(($) => ({
2879
+ name: `${$.name} (${$.path})`,
2880
+ value: $.path,
2881
+ checked: d ? i.includes($.path) : !0
2882
+ }));
2883
+ try {
2884
+ h = await x({
2885
+ message: "Select components to start in dev mode:",
2886
+ choices: y
2887
+ });
2888
+ } catch ($) {
2889
+ throw $.name === "ExitPromptError" && (console.log(`
2867
2890
 
2868
2891
  👋 Goodbye!
2869
- `), process.exit(0)), g;
2892
+ `), process.exit(0)), $;
2893
+ }
2870
2894
  }
2871
- d.length === 0 && (console.log(`
2895
+ h.length === 0 && (console.log(`
2872
2896
  ⚠️ No components selected.
2873
- `), process.exit(0)), uo(d), console.log(`
2874
- 💾 Selection saved to ${ve}`);
2875
- const l = n.filter((g) => d.includes(g.path));
2876
- console.log(`🚀 Starting dev mode for ${l.length} component${l.length > 1 ? "s" : ""}...
2897
+ `), process.exit(0)), u || (uo(h), console.log(`
2898
+ 💾 Selection saved to ${ve}`));
2899
+ const c = n.filter((x) => h.includes(x.path));
2900
+ console.log(`🚀 Starting dev mode for ${c.length} component${c.length > 1 ? "s" : ""}...
2877
2901
  `);
2878
- const { monorepoDevCommand: P } = await Promise.resolve().then(() => Ut);
2879
- await P(l);
2902
+ const { monorepoDevCommand: l } = await Promise.resolve().then(() => Ht);
2903
+ await l(c);
2880
2904
  }, fo = async () => {
2881
2905
  const { input: o, select: t } = await import("@inquirer/prompts"), e = await import("fs"), n = await import("path"), s = n.default.basename(process.cwd());
2882
- let i, c;
2906
+ let i, d;
2883
2907
  try {
2884
2908
  i = await o({
2885
2909
  message: "Component name:",
2886
2910
  default: s
2887
- }), c = await t({
2911
+ }), d = await t({
2888
2912
  message: "Component type:",
2889
2913
  choices: [
2890
2914
  { name: "📄 HTML", value: "html", description: "Plain HTML/JS/CSS component" },
@@ -2893,22 +2917,22 @@ Pushing component...
2893
2917
  { name: "🅰️ Angular", value: "angular", disabled: "(coming soon)" }
2894
2918
  ]
2895
2919
  });
2896
- } catch (d) {
2897
- throw d.name === "ExitPromptError" && (console.log(`
2920
+ } catch (c) {
2921
+ throw c.name === "ExitPromptError" && (console.log(`
2898
2922
 
2899
2923
  👋 Goodbye!
2900
- `), process.exit(0)), d;
2924
+ `), process.exit(0)), c;
2901
2925
  }
2902
2926
  const u = {
2903
2927
  name: i,
2904
- type: c,
2928
+ type: d,
2905
2929
  author: "@myop-cli",
2906
2930
  HMR: !0
2907
- }, y = v.program.getOptionValue("config") || "./myop.config.json";
2931
+ }, h = v.program.getOptionValue("config") || "./myop.config.json";
2908
2932
  try {
2909
- e.writeFileSync(y, JSON.stringify(u, null, 2)), console.log(`
2910
- ✅ Created ${y}`);
2911
- const d = {
2933
+ e.writeFileSync(h, JSON.stringify(u, null, 2)), console.log(`
2934
+ ✅ Created ${h}`);
2935
+ const c = {
2912
2936
  name: i.toLowerCase().replace(/\s+/g, "-"),
2913
2937
  version: "1.0.0",
2914
2938
  type: "module",
@@ -2920,7 +2944,7 @@ Pushing component...
2920
2944
  esbuild: "^0.24.0"
2921
2945
  }
2922
2946
  };
2923
- e.writeFileSync("package.json", JSON.stringify(d, 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';
2947
+ 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';
2924
2948
  import fs from 'fs';
2925
2949
  import path from 'path';
2926
2950
 
@@ -3000,7 +3024,7 @@ fs.writeFileSync('dist/index.html', html);
3000
3024
  console.log('✅ Built dist/index.html');
3001
3025
  console.log(\` Bundled \${jsFiles.length} JS modules, \${cssFiles.length} CSS files\`);
3002
3026
  `), console.log("✅ Created build.js");
3003
- const P = `<!DOCTYPE html>
3027
+ const x = `<!DOCTYPE html>
3004
3028
  <html lang="en">
3005
3029
  <head>
3006
3030
  <meta charset="UTF-8">
@@ -3017,8 +3041,8 @@ console.log(\` Bundled \${jsFiles.length} JS modules, \${cssFiles.length} CSS
3017
3041
  </body>
3018
3042
  </html>
3019
3043
  `;
3020
- e.writeFileSync("index.html", P), console.log("✅ Created index.html");
3021
- const g = `// ${i} - Entry Point
3044
+ e.writeFileSync("index.html", x), console.log("✅ Created index.html");
3045
+ const y = `// ${i} - Entry Point
3022
3046
  import { init } from './modules/app.js';
3023
3047
  import { setupMyopInterface } from './modules/myop.js';
3024
3048
 
@@ -3027,8 +3051,8 @@ document.addEventListener('DOMContentLoaded', () => {
3027
3051
  setupMyopInterface();
3028
3052
  });
3029
3053
  `;
3030
- e.writeFileSync("src/index.js", g), console.log("✅ Created src/index.js");
3031
- const M = `// ${i} - Main Application Logic
3054
+ e.writeFileSync("src/index.js", y), console.log("✅ Created src/index.js");
3055
+ const $ = `// ${i} - Main Application Logic
3032
3056
 
3033
3057
  export function init() {
3034
3058
  console.log('${i} loaded');
@@ -3036,7 +3060,7 @@ export function init() {
3036
3060
  // Your component logic here
3037
3061
  }
3038
3062
  `;
3039
- e.writeFileSync("src/modules/app.js", M), console.log("✅ Created src/modules/app.js"), e.writeFileSync("src/modules/myop.js", `// Myop Interface - Communication with host app
3063
+ e.writeFileSync("src/modules/app.js", $), console.log("✅ Created src/modules/app.js"), e.writeFileSync("src/modules/myop.js", `// Myop Interface - Communication with host app
3040
3064
 
3041
3065
  export function setupMyopInterface() {
3042
3066
  // Called when host app sends data to this component
@@ -3057,7 +3081,7 @@ export function setupMyopInterface() {
3057
3081
  @import './main.css';
3058
3082
  `;
3059
3083
  e.writeFileSync("src/styles/index.css", w), console.log("✅ Created src/styles/index.css");
3060
- const _ = `/* ${i} - Main Styles */
3084
+ const j = `/* ${i} - Main Styles */
3061
3085
 
3062
3086
  * {
3063
3087
  box-sizing: border-box;
@@ -3086,18 +3110,18 @@ p {
3086
3110
  line-height: 1.5;
3087
3111
  }
3088
3112
  `;
3089
- e.writeFileSync("src/styles/main.css", _), console.log("✅ Created src/styles/main.css"), e.writeFileSync(".gitignore", `node_modules/
3113
+ e.writeFileSync("src/styles/main.css", j), console.log("✅ Created src/styles/main.css"), e.writeFileSync(".gitignore", `node_modules/
3090
3114
  dist/
3091
3115
  .temp-entry.js
3092
3116
  .temp-styles.css
3093
3117
  .DS_Store
3094
3118
  `), console.log("✅ Created .gitignore");
3095
- const b = Ve(process.cwd());
3096
- b && console.log("✅ Installed AI agent skills");
3097
- const p = await import("./index-DuEoKctW.js").then((x) => x.i), E = process.cwd();
3119
+ const P = await We(process.cwd());
3120
+ P.success && console.log("✅ Installed AI agent skills");
3121
+ const p = await import("./index-DuEoKctW.js").then((b) => b.i), E = process.cwd();
3098
3122
  try {
3099
3123
  await p.init({ fs: e, dir: E });
3100
- const x = [
3124
+ const b = [
3101
3125
  "myop.config.json",
3102
3126
  "package.json",
3103
3127
  "build.js",
@@ -3109,77 +3133,85 @@ dist/
3109
3133
  "src/styles/index.css",
3110
3134
  "src/styles/main.css"
3111
3135
  ];
3112
- if (b) {
3113
- const T = (k, H) => {
3136
+ if (P.success) {
3137
+ const k = (R, D) => {
3114
3138
  try {
3115
- const A = e.readdirSync(k, { withFileTypes: !0 });
3116
- for (const j of A) {
3117
- const J = n.join(k, j.name), F = n.join(H, j.name);
3118
- j.isDirectory() ? T(J, F) : x.push(F);
3139
+ const L = e.readdirSync(R, { withFileTypes: !0 });
3140
+ for (const T of L) {
3141
+ const J = n.join(R, T.name), F = n.join(D, T.name);
3142
+ T.isDirectory() ? k(J, F) : b.push(F);
3119
3143
  }
3120
3144
  } catch {
3121
3145
  }
3122
3146
  };
3123
- T(".agents/skills", ".agents/skills");
3147
+ try {
3148
+ const R = e.readdirSync(".", { withFileTypes: !0 });
3149
+ for (const D of R)
3150
+ if (D.isDirectory() && D.name.startsWith(".")) {
3151
+ const L = n.join(D.name, "skills");
3152
+ e.existsSync(L) && k(L, L);
3153
+ }
3154
+ } catch {
3155
+ }
3124
3156
  }
3125
- for (const T of x)
3126
- await p.add({ fs: e, dir: E, filepath: T });
3157
+ for (const k of b)
3158
+ await p.add({ fs: e, dir: E, filepath: k });
3127
3159
  await p.commit({
3128
3160
  fs: e,
3129
3161
  dir: E,
3130
3162
  message: "init",
3131
3163
  author: { name: "myop-cli", email: "cli@myop.dev" }
3132
3164
  }), console.log("✅ Initialized git repository");
3133
- } catch (x) {
3134
- console.log("⚠️ Failed to initialize git repository:", x.message);
3165
+ } catch (b) {
3166
+ console.log("⚠️ Failed to initialize git repository:", b.message);
3135
3167
  }
3136
3168
  console.log(`
3137
3169
  📦 Next steps:`), console.log(" 1. npm install"), console.log(" 2. npm run build"), console.log(` 3. myop sync
3138
3170
  `), v.myopConfig = u, await ie(!0);
3139
- } catch (d) {
3140
- console.error(`Failed to initialize component: ${d.message}`), process.exit(1);
3171
+ } catch (c) {
3172
+ console.error(`Failed to initialize component: ${c.message}`), process.exit(1);
3141
3173
  }
3142
3174
  };
3143
3175
  v.program.command("default", { isDefault: !0 }).action(async () => {
3144
- if (v.program.getOptionValue("help") && (console.log(Mt), process.exit()), v.program.getOptionValue("monorepo")) {
3176
+ if (v.program.getOptionValue("help") && (console.log(Pt), process.exit()), v.program.getOptionValue("monorepo")) {
3145
3177
  await go();
3146
3178
  return;
3147
3179
  }
3148
3180
  if (v.program.getOptionValue("ci")) {
3149
- const u = await import("fs"), y = v.program.getOptionValue("config") || "./myop.config.json", d = v.program.version(), l = $e();
3150
- let P = { found: !1 };
3181
+ const u = await import("fs"), h = v.program.getOptionValue("config") || "./myop.config.json", c = v.program.version(), l = $e();
3182
+ let x = { found: !1 };
3151
3183
  try {
3152
- if (u.existsSync(y)) {
3153
- const M = u.readFileSync(y, "utf-8"), f = JSON.parse(M);
3154
- P = {
3184
+ if (u.existsSync(h)) {
3185
+ const $ = u.readFileSync(h, "utf-8"), g = JSON.parse($);
3186
+ x = {
3155
3187
  found: !0,
3156
- path: y,
3157
- name: f.name || f.componentName || null,
3158
- componentId: f.componentId || null,
3159
- organization: f.organization || null
3188
+ path: h,
3189
+ name: g.name || g.componentName || null,
3190
+ componentId: g.componentId || null,
3191
+ organization: g.organization || null
3160
3192
  };
3161
3193
  }
3162
- } catch (M) {
3163
- P = { found: !1, error: M.message };
3194
+ } catch ($) {
3195
+ x = { found: !1, error: $.message };
3164
3196
  }
3165
- const g = {
3166
- version: d,
3167
- config: P,
3197
+ const y = {
3198
+ version: c,
3199
+ config: x,
3168
3200
  auth: {
3169
3201
  loggedIn: !!(l != null && l.email),
3170
3202
  email: (l == null ? void 0 : l.email) || null
3171
3203
  }
3172
3204
  };
3173
- console.log(JSON.stringify(g, null, 2)), process.exit(0);
3205
+ console.log(JSON.stringify(y, null, 2)), process.exit(0);
3174
3206
  }
3175
3207
  let n = Y({
3176
3208
  text: "Loading Myop CLI...",
3177
3209
  color: "green"
3178
3210
  }).start();
3179
3211
  const s = Ce();
3180
- await ao(500), n.stop();
3212
+ await ro(500), n.stop();
3181
3213
  const i = v.program.version();
3182
- await oo(i) || await ie(s.configFound);
3214
+ await to(i) || await ie(s.configFound);
3183
3215
  });
3184
3216
  v.program.parse(process.argv);
3185
3217
  v.program.opts();