buildwithnexus 0.2.5 → 0.2.6

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/bin.js CHANGED
@@ -16,7 +16,7 @@ var BANNER = `
16
16
  `;
17
17
  function showBanner() {
18
18
  console.log(BANNER);
19
- console.log(chalk.dim(" v0.2.5 \xB7 buildwithnexus.dev\n"));
19
+ console.log(chalk.dim(" v0.2.6 \xB7 buildwithnexus.dev\n"));
20
20
  }
21
21
  function showPhase(phase, total, description) {
22
22
  const progress = chalk.cyan(`[${phase}/${total}]`);
@@ -461,6 +461,8 @@ import fs3 from "fs";
461
461
  import net from "net";
462
462
  import path3 from "path";
463
463
  import { execa } from "execa";
464
+ import { select } from "@inquirer/prompts";
465
+ import chalk5 from "chalk";
464
466
  var VM_DIR = path3.join(NEXUS_HOME2, "vm");
465
467
  var IMAGES_DIR = path3.join(VM_DIR, "images");
466
468
  var PID_FILE = path3.join(VM_DIR, "qemu.pid");
@@ -516,19 +518,79 @@ async function isPortFree(port) {
516
518
  const free1 = await tryBind(port, "127.0.0.1");
517
519
  return free1;
518
520
  }
521
+ async function getPortBlocker(port) {
522
+ try {
523
+ const { stdout } = await execa("lsof", ["-i", `:${port}`, "-t", "-sTCP:LISTEN"], { env: scrubEnv() });
524
+ const pid = parseInt(stdout.trim().split("\n")[0], 10);
525
+ if (!pid) return null;
526
+ try {
527
+ const { stdout: psOut } = await execa("ps", ["-p", String(pid), "-o", "comm="], { env: scrubEnv() });
528
+ return { port, pid, process: psOut.trim() };
529
+ } catch {
530
+ return { port, pid, process: "unknown" };
531
+ }
532
+ } catch {
533
+ return null;
534
+ }
535
+ }
519
536
  async function findFreePort(preferred, max = 20) {
520
537
  for (let offset = 0; offset < max; offset++) {
521
- const port = preferred + offset;
522
- if (await isPortFree(port)) return port;
538
+ if (await isPortFree(preferred + offset)) return preferred + offset;
523
539
  }
524
540
  throw new Error(`No free port found near ${preferred}`);
525
541
  }
542
+ async function resolvePortConflicts(ports) {
543
+ const labels = { ssh: "SSH", http: "HTTP", https: "HTTPS" };
544
+ const resolved2 = { ...ports };
545
+ for (const [key, port] of Object.entries(ports)) {
546
+ if (await isPortFree(port)) continue;
547
+ const blocker = await getPortBlocker(port);
548
+ const desc = blocker ? `${blocker.process} (PID ${blocker.pid})` : "unknown process";
549
+ const altPort = await findFreePort(port + 1).catch(() => null);
550
+ const choices = [];
551
+ if (blocker) {
552
+ choices.push({
553
+ name: `Kill ${desc} and use port ${port}`,
554
+ value: "kill"
555
+ });
556
+ }
557
+ if (altPort) {
558
+ choices.push({
559
+ name: `Use alternate port ${altPort} instead`,
560
+ value: "alt"
561
+ });
562
+ }
563
+ choices.push({ name: "Abort init", value: "abort" });
564
+ console.log("");
565
+ console.log(chalk5.yellow(` \u26A0 Port ${port} (${labels[key]}) is in use by ${desc}`));
566
+ const action = await select({
567
+ message: `How would you like to resolve the ${labels[key]} port conflict?`,
568
+ choices
569
+ });
570
+ if (action === "kill" && blocker) {
571
+ try {
572
+ process.kill(blocker.pid, "SIGTERM");
573
+ await new Promise((r) => setTimeout(r, 1e3));
574
+ if (!await isPortFree(port)) {
575
+ process.kill(blocker.pid, "SIGKILL");
576
+ await new Promise((r) => setTimeout(r, 500));
577
+ }
578
+ console.log(chalk5.green(` \u2713 Killed ${desc}, port ${port} is now free`));
579
+ } catch {
580
+ console.log(chalk5.red(` \u2717 Failed to kill PID ${blocker.pid}. Try: sudo kill ${blocker.pid}`));
581
+ process.exit(1);
582
+ }
583
+ } else if (action === "alt" && altPort) {
584
+ resolved2[key] = altPort;
585
+ console.log(chalk5.green(` \u2713 Using port ${altPort} for ${labels[key]}`));
586
+ } else {
587
+ console.log(chalk5.dim(" Init aborted."));
588
+ process.exit(0);
589
+ }
590
+ }
591
+ return resolved2;
592
+ }
526
593
  async function launchVm(platform, diskPath, initIsoPath, ram, cpus, ports) {
527
- const resolved = {
528
- ssh: await findFreePort(ports.ssh),
529
- http: await findFreePort(ports.http),
530
- https: await findFreePort(ports.https)
531
- };
532
594
  const machineArg = platform.os === "mac" ? "-machine virt,gic-version=3" : "-machine pc";
533
595
  const biosArgs = fs3.existsSync(platform.biosPath) ? ["-bios", platform.biosPath] : [];
534
596
  const args = [
@@ -1007,14 +1069,16 @@ var initCommand = new Command("init").description("Scaffold and launch a new NEX
1007
1069
  const isoPath = await createCloudInitIso(userDataPath);
1008
1070
  succeed(spinner, "Cloud-init ISO created");
1009
1071
  showPhase(6, TOTAL_PHASES, "VM Launch");
1072
+ spinner = createSpinner("Checking port availability...");
1073
+ spinner.start();
1074
+ const requestedPorts = { ssh: config.sshPort, http: config.httpPort, https: config.httpsPort };
1075
+ spinner.stop();
1076
+ spinner.clear();
1077
+ const resolvedPorts = await resolvePortConflicts(requestedPorts);
1010
1078
  spinner = createSpinner("Creating disk and launching VM...");
1011
1079
  spinner.start();
1012
1080
  const diskPath = await createDisk(imagePath, config.vmDisk);
1013
- const resolvedPorts = await launchVm(platform, diskPath, isoPath, config.vmRam, config.vmCpus, {
1014
- ssh: config.sshPort,
1015
- http: config.httpPort,
1016
- https: config.httpsPort
1017
- });
1081
+ await launchVm(platform, diskPath, isoPath, config.vmRam, config.vmCpus, resolvedPorts);
1018
1082
  config.sshPort = resolvedPorts.ssh;
1019
1083
  config.httpPort = resolvedPorts.http;
1020
1084
  config.httpsPort = resolvedPorts.https;
@@ -1191,7 +1255,7 @@ var stopCommand = new Command3("stop").description("Gracefully shut down the NEX
1191
1255
 
1192
1256
  // src/commands/status.ts
1193
1257
  import { Command as Command4 } from "commander";
1194
- import chalk5 from "chalk";
1258
+ import chalk6 from "chalk";
1195
1259
  var statusCommand = new Command4("status").description("Check NEXUS runtime health").option("--json", "Output as JSON").action(async (opts) => {
1196
1260
  const config = loadConfig();
1197
1261
  if (!config) {
@@ -1204,15 +1268,15 @@ var statusCommand = new Command4("status").description("Check NEXUS runtime heal
1204
1268
  console.log(JSON.stringify({ ...health, pid: getVmPid(), ports: { ssh: config.sshPort, http: config.httpPort, https: config.httpsPort } }, null, 2));
1205
1269
  return;
1206
1270
  }
1207
- const check = (ok) => ok ? chalk5.green("\u25CF") : chalk5.red("\u25CB");
1271
+ const check = (ok) => ok ? chalk6.green("\u25CF") : chalk6.red("\u25CB");
1208
1272
  console.log("");
1209
- console.log(chalk5.bold(" NEXUS Runtime Status"));
1273
+ console.log(chalk6.bold(" NEXUS Runtime Status"));
1210
1274
  console.log("");
1211
- console.log(` ${check(health.vmRunning)} VM ${health.vmRunning ? chalk5.green("running") + chalk5.dim(` (PID ${getVmPid()})`) : chalk5.red("stopped")}`);
1212
- console.log(` ${check(health.sshReady)} SSH ${health.sshReady ? chalk5.green("connected") + chalk5.dim(` (port ${config.sshPort})`) : chalk5.red("unreachable")}`);
1213
- console.log(` ${check(health.dockerReady)} Docker ${health.dockerReady ? chalk5.green("ready") : chalk5.red("not ready")}`);
1214
- console.log(` ${check(health.serverHealthy)} Server ${health.serverHealthy ? chalk5.green("healthy") + chalk5.dim(` (port ${config.httpPort})`) : chalk5.red("unhealthy")}`);
1215
- console.log(` ${check(!!health.tunnelUrl)} Tunnel ${health.tunnelUrl ? chalk5.green(health.tunnelUrl) : chalk5.dim("not active")}`);
1275
+ console.log(` ${check(health.vmRunning)} VM ${health.vmRunning ? chalk6.green("running") + chalk6.dim(` (PID ${getVmPid()})`) : chalk6.red("stopped")}`);
1276
+ console.log(` ${check(health.sshReady)} SSH ${health.sshReady ? chalk6.green("connected") + chalk6.dim(` (port ${config.sshPort})`) : chalk6.red("unreachable")}`);
1277
+ console.log(` ${check(health.dockerReady)} Docker ${health.dockerReady ? chalk6.green("ready") : chalk6.red("not ready")}`);
1278
+ console.log(` ${check(health.serverHealthy)} Server ${health.serverHealthy ? chalk6.green("healthy") + chalk6.dim(` (port ${config.httpPort})`) : chalk6.red("unhealthy")}`);
1279
+ console.log(` ${check(!!health.tunnelUrl)} Tunnel ${health.tunnelUrl ? chalk6.green(health.tunnelUrl) : chalk6.dim("not active")}`);
1216
1280
  console.log("");
1217
1281
  if (health.serverHealthy) {
1218
1282
  log.success(`NEXUS CLI ready \u2014 connect via: buildwithnexus ssh`);
@@ -1221,18 +1285,18 @@ var statusCommand = new Command4("status").description("Check NEXUS runtime heal
1221
1285
 
1222
1286
  // src/commands/doctor.ts
1223
1287
  import { Command as Command5 } from "commander";
1224
- import chalk6 from "chalk";
1288
+ import chalk7 from "chalk";
1225
1289
  import fs7 from "fs";
1226
1290
  import path8 from "path";
1227
1291
  import { execa as execa4 } from "execa";
1228
1292
  var doctorCommand = new Command5("doctor").description("Diagnose NEXUS runtime environment").action(async () => {
1229
1293
  const platform = detectPlatform();
1230
- const check = (ok) => ok ? chalk6.green("\u2713") : chalk6.red("\u2717");
1294
+ const check = (ok) => ok ? chalk7.green("\u2713") : chalk7.red("\u2717");
1231
1295
  console.log("");
1232
- console.log(chalk6.bold(" NEXUS Doctor"));
1296
+ console.log(chalk7.bold(" NEXUS Doctor"));
1233
1297
  console.log("");
1234
1298
  const nodeOk = Number(process.versions.node.split(".")[0]) >= 18;
1235
- console.log(` ${check(nodeOk)} Node.js ${process.versions.node} ${nodeOk ? "" : chalk6.red("(need >= 18)")}`);
1299
+ console.log(` ${check(nodeOk)} Node.js ${process.versions.node} ${nodeOk ? "" : chalk7.red("(need >= 18)")}`);
1236
1300
  console.log(` ${check(true)} Platform: ${platform.os} ${platform.arch}`);
1237
1301
  const qemuOk = await isQemuInstalled(platform);
1238
1302
  if (qemuOk) {
@@ -1272,14 +1336,14 @@ var doctorCommand = new Command5("doctor").description("Diagnose NEXUS runtime e
1272
1336
  });
1273
1337
  server.listen(port);
1274
1338
  });
1275
- console.log(` ${check(available)} Port ${port} (${name}) ${available ? "available" : chalk6.red("in use")}`);
1339
+ console.log(` ${check(available)} Port ${port} (${name}) ${available ? "available" : chalk7.red("in use")}`);
1276
1340
  } catch {
1277
1341
  console.log(` ${check(false)} Port ${port} (${name}) \u2014 check failed`);
1278
1342
  }
1279
1343
  }
1280
1344
  }
1281
1345
  const biosOk = fs7.existsSync(platform.biosPath);
1282
- console.log(` ${check(biosOk)} UEFI firmware ${biosOk ? "" : chalk6.dim(platform.biosPath)}`);
1346
+ console.log(` ${check(biosOk)} UEFI firmware ${biosOk ? "" : chalk7.dim(platform.biosPath)}`);
1283
1347
  console.log("");
1284
1348
  if (qemuOk && isoTool && biosOk) {
1285
1349
  log.success("Environment ready for NEXUS");
@@ -1383,7 +1447,7 @@ var updateCommand = new Command7("update").description("Update NEXUS to the late
1383
1447
 
1384
1448
  // src/commands/destroy.ts
1385
1449
  import { Command as Command8 } from "commander";
1386
- import chalk7 from "chalk";
1450
+ import chalk8 from "chalk";
1387
1451
  import fs9 from "fs";
1388
1452
  import { input as input2 } from "@inquirer/prompts";
1389
1453
  import path10 from "path";
@@ -1391,11 +1455,11 @@ var destroyCommand = new Command8("destroy").description("Remove NEXUS VM and al
1391
1455
  const config = loadConfig();
1392
1456
  if (!opts.force) {
1393
1457
  console.log("");
1394
- console.log(chalk7.red.bold(" This will permanently delete:"));
1395
- console.log(chalk7.red(" - NEXUS VM and all data inside it"));
1396
- console.log(chalk7.red(" - VM disk images"));
1397
- console.log(chalk7.red(" - SSH keys"));
1398
- console.log(chalk7.red(" - Configuration and API keys"));
1458
+ console.log(chalk8.red.bold(" This will permanently delete:"));
1459
+ console.log(chalk8.red(" - NEXUS VM and all data inside it"));
1460
+ console.log(chalk8.red(" - VM disk images"));
1461
+ console.log(chalk8.red(" - SSH keys"));
1462
+ console.log(chalk8.red(" - Configuration and API keys"));
1399
1463
  console.log("");
1400
1464
  const confirm2 = await input2({
1401
1465
  message: 'Type "destroy" to confirm:'
@@ -1439,7 +1503,7 @@ var destroyCommand = new Command8("destroy").description("Remove NEXUS VM and al
1439
1503
  // src/commands/keys.ts
1440
1504
  import { Command as Command9 } from "commander";
1441
1505
  import { password as password2 } from "@inquirer/prompts";
1442
- import chalk8 from "chalk";
1506
+ import chalk9 from "chalk";
1443
1507
  var keysCommand = new Command9("keys").description("Manage API keys");
1444
1508
  keysCommand.command("list").description("Show configured API keys (masked)").action(() => {
1445
1509
  const keys = loadKeys();
@@ -1447,10 +1511,10 @@ keysCommand.command("list").description("Show configured API keys (masked)").act
1447
1511
  log.error("No keys configured. Run: buildwithnexus init");
1448
1512
  process.exit(1);
1449
1513
  }
1450
- console.log(chalk8.bold("\n Configured Keys\n"));
1514
+ console.log(chalk9.bold("\n Configured Keys\n"));
1451
1515
  for (const [name, value] of Object.entries(keys)) {
1452
1516
  if (value) {
1453
- console.log(` ${chalk8.cyan(name.padEnd(24))} ${maskKey(value)}`);
1517
+ console.log(` ${chalk9.cyan(name.padEnd(24))} ${maskKey(value)}`);
1454
1518
  }
1455
1519
  }
1456
1520
  console.log("");
@@ -1512,14 +1576,14 @@ var sshCommand = new Command10("ssh").description("Open an SSH session into the
1512
1576
 
1513
1577
  // src/commands/brainstorm.ts
1514
1578
  import { Command as Command11 } from "commander";
1515
- import chalk9 from "chalk";
1579
+ import chalk10 from "chalk";
1516
1580
  import { input as input3 } from "@inquirer/prompts";
1517
- var COS_PREFIX = chalk9.bold.cyan(" Chief of Staff");
1518
- var YOU_PREFIX = chalk9.bold.white(" You");
1519
- var DIVIDER = chalk9.dim(" " + "\u2500".repeat(56));
1581
+ var COS_PREFIX = chalk10.bold.cyan(" Chief of Staff");
1582
+ var YOU_PREFIX = chalk10.bold.white(" You");
1583
+ var DIVIDER = chalk10.dim(" " + "\u2500".repeat(56));
1520
1584
  function formatResponse(text) {
1521
1585
  const lines = text.split("\n");
1522
- return lines.map((line) => chalk9.white(" " + line)).join("\n");
1586
+ return lines.map((line) => chalk10.white(" " + line)).join("\n");
1523
1587
  }
1524
1588
  async function sendMessage(sshPort, message, source) {
1525
1589
  const payload = JSON.stringify({ message, source });
@@ -1562,13 +1626,13 @@ var brainstormCommand = new Command11("brainstorm").description("Brainstorm an i
1562
1626
  }
1563
1627
  succeed(spinner, "Connected to NEXUS");
1564
1628
  console.log("");
1565
- console.log(chalk9.bold(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
1566
- console.log(chalk9.bold(" \u2551 ") + chalk9.bold.cyan("NEXUS Brainstorm Session") + chalk9.bold(" \u2551"));
1567
- console.log(chalk9.bold(" \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563"));
1568
- console.log(chalk9.bold(" \u2551 ") + chalk9.dim("The Chief of Staff will discuss your idea with the".padEnd(55)) + chalk9.bold("\u2551"));
1569
- console.log(chalk9.bold(" \u2551 ") + chalk9.dim("NEXUS team and share their recommendations.".padEnd(55)) + chalk9.bold("\u2551"));
1570
- console.log(chalk9.bold(" \u2551 ") + chalk9.dim("Type 'exit' or 'quit' to end the session.".padEnd(55)) + chalk9.bold("\u2551"));
1571
- console.log(chalk9.bold(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
1629
+ console.log(chalk10.bold(" \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"));
1630
+ console.log(chalk10.bold(" \u2551 ") + chalk10.bold.cyan("NEXUS Brainstorm Session") + chalk10.bold(" \u2551"));
1631
+ console.log(chalk10.bold(" \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563"));
1632
+ console.log(chalk10.bold(" \u2551 ") + chalk10.dim("The Chief of Staff will discuss your idea with the".padEnd(55)) + chalk10.bold("\u2551"));
1633
+ console.log(chalk10.bold(" \u2551 ") + chalk10.dim("NEXUS team and share their recommendations.".padEnd(55)) + chalk10.bold("\u2551"));
1634
+ console.log(chalk10.bold(" \u2551 ") + chalk10.dim("Type 'exit' or 'quit' to end the session.".padEnd(55)) + chalk10.bold("\u2551"));
1635
+ console.log(chalk10.bold(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"));
1572
1636
  console.log("");
1573
1637
  let idea = ideaWords.length > 0 ? ideaWords.join(" ") : "";
1574
1638
  if (!idea) {
@@ -1585,7 +1649,7 @@ var brainstormCommand = new Command11("brainstorm").description("Brainstorm an i
1585
1649
  while (true) {
1586
1650
  turn++;
1587
1651
  if (turn === 1) {
1588
- console.log(`${YOU_PREFIX}: ${chalk9.white(idea)}`);
1652
+ console.log(`${YOU_PREFIX}: ${chalk10.white(idea)}`);
1589
1653
  }
1590
1654
  console.log(DIVIDER);
1591
1655
  const thinking = createSpinner(
@@ -1603,17 +1667,17 @@ var brainstormCommand = new Command11("brainstorm").description("Brainstorm an i
1603
1667
  console.log(formatResponse(redact(response)));
1604
1668
  console.log(DIVIDER);
1605
1669
  const followUp = await input3({
1606
- message: chalk9.bold("You:")
1670
+ message: chalk10.bold("You:")
1607
1671
  });
1608
1672
  const trimmed = followUp.trim().toLowerCase();
1609
1673
  if (!trimmed || trimmed === "exit" || trimmed === "quit" || trimmed === "q") {
1610
1674
  console.log("");
1611
1675
  log.success("Brainstorm session ended");
1612
- console.log(chalk9.dim(" Run again anytime: buildwithnexus brainstorm"));
1676
+ console.log(chalk10.dim(" Run again anytime: buildwithnexus brainstorm"));
1613
1677
  console.log("");
1614
1678
  return;
1615
1679
  }
1616
- console.log(`${YOU_PREFIX}: ${chalk9.white(followUp)}`);
1680
+ console.log(`${YOU_PREFIX}: ${chalk10.white(followUp)}`);
1617
1681
  currentMessage = `[BRAINSTORM FOLLOW-UP] The CEO responds: ${followUp}`;
1618
1682
  }
1619
1683
  } catch (err) {
@@ -1629,7 +1693,7 @@ var brainstormCommand = new Command11("brainstorm").description("Brainstorm an i
1629
1693
  });
1630
1694
 
1631
1695
  // src/cli.ts
1632
- var cli = new Command12().name("buildwithnexus").description("Auto-scaffold and launch a fully autonomous NEXUS runtime").version("0.2.5");
1696
+ var cli = new Command12().name("buildwithnexus").description("Auto-scaffold and launch a fully autonomous NEXUS runtime").version("0.2.6");
1633
1697
  cli.addCommand(initCommand);
1634
1698
  cli.addCommand(startCommand);
1635
1699
  cli.addCommand(stopCommand);
@@ -1650,7 +1714,7 @@ import fs10 from "fs";
1650
1714
  import path11 from "path";
1651
1715
  import os3 from "os";
1652
1716
  import https from "https";
1653
- import chalk10 from "chalk";
1717
+ import chalk11 from "chalk";
1654
1718
  var PACKAGE_NAME = "buildwithnexus";
1655
1719
  var CHECK_INTERVAL_MS = 4 * 60 * 60 * 1e3;
1656
1720
  var STATE_DIR = path11.join(os3.homedir(), ".buildwithnexus");
@@ -1731,8 +1795,8 @@ async function checkForUpdates(currentVersion) {
1731
1795
  function printUpdateBanner(current, latest) {
1732
1796
  const msg = [
1733
1797
  "",
1734
- chalk10.yellow(` Update available: ${current} \u2192 ${latest}`),
1735
- chalk10.cyan(` Run: npm update -g buildwithnexus`),
1798
+ chalk11.yellow(` Update available: ${current} \u2192 ${latest}`),
1799
+ chalk11.cyan(` Run: npm update -g buildwithnexus`),
1736
1800
  ""
1737
1801
  ].join("\n");
1738
1802
  process.stderr.write(msg + "\n");
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "buildwithnexus",
3
- "version": "0.2.5",
3
+ "version": "0.2.6",
4
4
  "description": "Launch an autonomous AI runtime with triple-nested VM isolation in one command",
5
5
  "type": "module",
6
6
  "bin": {