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 +120 -56
- package/dist/nexus-release.tar.gz +0 -0
- package/package.json +1 -1
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 ?
|
|
1271
|
+
const check = (ok) => ok ? chalk6.green("\u25CF") : chalk6.red("\u25CB");
|
|
1208
1272
|
console.log("");
|
|
1209
|
-
console.log(
|
|
1273
|
+
console.log(chalk6.bold(" NEXUS Runtime Status"));
|
|
1210
1274
|
console.log("");
|
|
1211
|
-
console.log(` ${check(health.vmRunning)} VM ${health.vmRunning ?
|
|
1212
|
-
console.log(` ${check(health.sshReady)} SSH ${health.sshReady ?
|
|
1213
|
-
console.log(` ${check(health.dockerReady)} Docker ${health.dockerReady ?
|
|
1214
|
-
console.log(` ${check(health.serverHealthy)} Server ${health.serverHealthy ?
|
|
1215
|
-
console.log(` ${check(!!health.tunnelUrl)} Tunnel ${health.tunnelUrl ?
|
|
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
|
|
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 ?
|
|
1294
|
+
const check = (ok) => ok ? chalk7.green("\u2713") : chalk7.red("\u2717");
|
|
1231
1295
|
console.log("");
|
|
1232
|
-
console.log(
|
|
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 ? "" :
|
|
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" :
|
|
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 ? "" :
|
|
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
|
|
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(
|
|
1395
|
-
console.log(
|
|
1396
|
-
console.log(
|
|
1397
|
-
console.log(
|
|
1398
|
-
console.log(
|
|
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
|
|
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(
|
|
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(` ${
|
|
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
|
|
1579
|
+
import chalk10 from "chalk";
|
|
1516
1580
|
import { input as input3 } from "@inquirer/prompts";
|
|
1517
|
-
var COS_PREFIX =
|
|
1518
|
-
var YOU_PREFIX =
|
|
1519
|
-
var DIVIDER =
|
|
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) =>
|
|
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(
|
|
1566
|
-
console.log(
|
|
1567
|
-
console.log(
|
|
1568
|
-
console.log(
|
|
1569
|
-
console.log(
|
|
1570
|
-
console.log(
|
|
1571
|
-
console.log(
|
|
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}: ${
|
|
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:
|
|
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(
|
|
1676
|
+
console.log(chalk10.dim(" Run again anytime: buildwithnexus brainstorm"));
|
|
1613
1677
|
console.log("");
|
|
1614
1678
|
return;
|
|
1615
1679
|
}
|
|
1616
|
-
console.log(`${YOU_PREFIX}: ${
|
|
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.
|
|
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
|
|
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
|
-
|
|
1735
|
-
|
|
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
|