openboot 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +273 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +132 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/clean.d.ts +7 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +173 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/dev.d.ts +7 -0
  12. package/dist/commands/dev.d.ts.map +1 -0
  13. package/dist/commands/dev.js +92 -0
  14. package/dist/commands/dev.js.map +1 -0
  15. package/dist/commands/down.d.ts +5 -0
  16. package/dist/commands/down.d.ts.map +1 -0
  17. package/dist/commands/down.js +33 -0
  18. package/dist/commands/down.js.map +1 -0
  19. package/dist/commands/init.d.ts +5 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +560 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/logs.d.ts +14 -0
  24. package/dist/commands/logs.d.ts.map +1 -0
  25. package/dist/commands/logs.js +243 -0
  26. package/dist/commands/logs.js.map +1 -0
  27. package/dist/commands/reboot.d.ts +5 -0
  28. package/dist/commands/reboot.d.ts.map +1 -0
  29. package/dist/commands/reboot.js +15 -0
  30. package/dist/commands/reboot.js.map +1 -0
  31. package/dist/commands/setup.d.ts +5 -0
  32. package/dist/commands/setup.d.ts.map +1 -0
  33. package/dist/commands/setup.js +200 -0
  34. package/dist/commands/setup.js.map +1 -0
  35. package/dist/commands/status.d.ts +5 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +200 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/up.d.ts +7 -0
  40. package/dist/commands/up.d.ts.map +1 -0
  41. package/dist/commands/up.js +325 -0
  42. package/dist/commands/up.js.map +1 -0
  43. package/dist/lib/config.d.ts +18 -0
  44. package/dist/lib/config.d.ts.map +1 -0
  45. package/dist/lib/config.js +95 -0
  46. package/dist/lib/config.js.map +1 -0
  47. package/dist/lib/docker.d.ts +19 -0
  48. package/dist/lib/docker.d.ts.map +1 -0
  49. package/dist/lib/docker.js +511 -0
  50. package/dist/lib/docker.js.map +1 -0
  51. package/dist/lib/health.d.ts +5 -0
  52. package/dist/lib/health.d.ts.map +1 -0
  53. package/dist/lib/health.js +80 -0
  54. package/dist/lib/health.js.map +1 -0
  55. package/dist/lib/log.d.ts +11 -0
  56. package/dist/lib/log.d.ts.map +1 -0
  57. package/dist/lib/log.js +51 -0
  58. package/dist/lib/log.js.map +1 -0
  59. package/dist/lib/ports.d.ts +13 -0
  60. package/dist/lib/ports.d.ts.map +1 -0
  61. package/dist/lib/ports.js +45 -0
  62. package/dist/lib/ports.js.map +1 -0
  63. package/dist/lib/prereqs.d.ts +8 -0
  64. package/dist/lib/prereqs.d.ts.map +1 -0
  65. package/dist/lib/prereqs.js +78 -0
  66. package/dist/lib/prereqs.js.map +1 -0
  67. package/dist/lib/process.d.ts +38 -0
  68. package/dist/lib/process.d.ts.map +1 -0
  69. package/dist/lib/process.js +285 -0
  70. package/dist/lib/process.js.map +1 -0
  71. package/dist/lib/tail.d.ts +12 -0
  72. package/dist/lib/tail.d.ts.map +1 -0
  73. package/dist/lib/tail.js +136 -0
  74. package/dist/lib/tail.js.map +1 -0
  75. package/dist/types.d.ts +71 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +3 -0
  78. package/dist/types.js.map +1 -0
  79. package/package.json +29 -0
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.waitForHealth = waitForHealth;
37
+ const http = __importStar(require("http"));
38
+ const https = __importStar(require("https"));
39
+ /**
40
+ * Wait for a URL to return a non-5xx response.
41
+ */
42
+ async function waitForHealth(url, timeout = 30) {
43
+ const start = Date.now();
44
+ while (Date.now() - start < timeout * 1000) {
45
+ try {
46
+ await checkUrl(url);
47
+ return true;
48
+ }
49
+ catch {
50
+ await sleep(1000);
51
+ }
52
+ }
53
+ return false;
54
+ }
55
+ /**
56
+ * Check a URL — resolves if response is not 5xx, rejects otherwise.
57
+ */
58
+ function checkUrl(url) {
59
+ return new Promise((resolve, reject) => {
60
+ const mod = url.startsWith("https") ? https : http;
61
+ const req = mod.get(url, (res) => {
62
+ if (res.statusCode && res.statusCode < 500) {
63
+ resolve();
64
+ }
65
+ else {
66
+ reject(new Error(`HTTP ${res.statusCode}`));
67
+ }
68
+ res.resume();
69
+ });
70
+ req.on("error", reject);
71
+ req.setTimeout(3000, () => {
72
+ req.destroy();
73
+ reject(new Error("timeout"));
74
+ });
75
+ });
76
+ }
77
+ function sleep(ms) {
78
+ return new Promise((resolve) => setTimeout(resolve, ms));
79
+ }
80
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/lib/health.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,sCAgBC;AAtBD,2CAA6B;AAC7B,6CAA+B;AAE/B;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,GAAW,EACX,UAAkB,EAAE;IAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/B,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBAC3C,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;YACxB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const log: {
2
+ info(msg: string): void;
3
+ success(msg: string): void;
4
+ warn(msg: string): void;
5
+ error(msg: string): void;
6
+ header(title: string): void;
7
+ step(msg: string): void;
8
+ blank(): void;
9
+ table(rows: string[][]): void;
10
+ };
11
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,GAAG;cACJ,MAAM;iBAIH,MAAM;cAIT,MAAM;eAIL,MAAM;kBAIH,MAAM;cAYV,MAAM;;gBAQJ,MAAM,EAAE,EAAE;CAevB,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.log = void 0;
4
+ const RESET = "\x1b[0m";
5
+ const RED = "\x1b[31m";
6
+ const GREEN = "\x1b[32m";
7
+ const YELLOW = "\x1b[33m";
8
+ const BLUE = "\x1b[34m";
9
+ const CYAN = "\x1b[36m";
10
+ const BOLD = "\x1b[1m";
11
+ const DIM = "\x1b[2m";
12
+ exports.log = {
13
+ info(msg) {
14
+ console.log(`${BLUE}▶${RESET} ${msg}`);
15
+ },
16
+ success(msg) {
17
+ console.log(`${GREEN}✓${RESET} ${msg}`);
18
+ },
19
+ warn(msg) {
20
+ console.log(`${YELLOW}⚠${RESET} ${msg}`);
21
+ },
22
+ error(msg) {
23
+ console.error(`${RED}✗${RESET} ${msg}`);
24
+ },
25
+ header(title) {
26
+ console.log("");
27
+ console.log(`${CYAN}╔${"═".repeat(title.length + 4)}╗${RESET}`);
28
+ console.log(`${CYAN}║${RESET} ${BOLD}${title}${RESET} ${CYAN}║${RESET}`);
29
+ console.log(`${CYAN}╚${"═".repeat(title.length + 4)}╝${RESET}`);
30
+ console.log("");
31
+ },
32
+ step(msg) {
33
+ console.log(` ${DIM}${msg}${RESET}`);
34
+ },
35
+ blank() {
36
+ console.log("");
37
+ },
38
+ table(rows) {
39
+ if (rows.length === 0)
40
+ return;
41
+ // Calculate column widths
42
+ const colWidths = rows[0].map((_, i) => Math.max(...rows.map((r) => (r[i] || "").length)));
43
+ for (const row of rows) {
44
+ const line = row
45
+ .map((cell, i) => cell.padEnd(colWidths[i]))
46
+ .join(" ");
47
+ console.log(` ${line}`);
48
+ }
49
+ },
50
+ };
51
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":";;;AAAA,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,GAAG,GAAG,SAAS,CAAC;AAET,QAAA,GAAG,GAAG;IACjB,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,GAAG,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,CACnD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CACT,GAAG,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,CACnD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,IAAgB;QACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,0BAA0B;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAClD,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,GAAG;iBACb,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3C,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Check if a port is currently in use.
3
+ */
4
+ export declare function isPortInUse(port: number): boolean;
5
+ /**
6
+ * Kill whatever process is using a port.
7
+ */
8
+ export declare function killPort(port: number): void;
9
+ /**
10
+ * Get info about what's using a port.
11
+ */
12
+ export declare function getPortProcess(port: number): string | null;
13
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/lib/ports.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM3C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU1D"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPortInUse = isPortInUse;
4
+ exports.killPort = killPort;
5
+ exports.getPortProcess = getPortProcess;
6
+ const child_process_1 = require("child_process");
7
+ /**
8
+ * Check if a port is currently in use.
9
+ */
10
+ function isPortInUse(port) {
11
+ try {
12
+ (0, child_process_1.execSync)(`lsof -ti:${port}`, { stdio: "pipe" });
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * Kill whatever process is using a port.
21
+ */
22
+ function killPort(port) {
23
+ try {
24
+ (0, child_process_1.execSync)(`lsof -ti:${port} | xargs kill -9`, { stdio: "pipe" });
25
+ }
26
+ catch {
27
+ // nothing on that port, or already dead
28
+ }
29
+ }
30
+ /**
31
+ * Get info about what's using a port.
32
+ */
33
+ function getPortProcess(port) {
34
+ try {
35
+ const result = (0, child_process_1.execSync)(`lsof -i:${port}`, { stdio: "pipe" })
36
+ .toString()
37
+ .trim();
38
+ const lines = result.split("\n");
39
+ return lines.length > 1 ? lines.slice(1).join("\n") : null;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/lib/ports.ts"],"names":[],"mappings":";;AAKA,kCAOC;AAKD,4BAMC;AAKD,wCAUC;AAtCD,iDAAyC;AAEzC;;GAEG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,YAAY,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,IAAY;IACnC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,YAAY,IAAI,kBAAkB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,WAAW,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC1D,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Check that required tools and versions are available.
3
+ * Returns true if all checks pass.
4
+ */
5
+ export declare function checkPrerequisites(options: {
6
+ needsDocker?: boolean;
7
+ }): boolean;
8
+ //# sourceMappingURL=prereqs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prereqs.d.ts","sourceRoot":"","sources":["../../src/lib/prereqs.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAqCV"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkPrerequisites = checkPrerequisites;
4
+ const child_process_1 = require("child_process");
5
+ const log_1 = require("./log");
6
+ /**
7
+ * Check that required tools and versions are available.
8
+ * Returns true if all checks pass.
9
+ */
10
+ function checkPrerequisites(options) {
11
+ let ok = true;
12
+ // Node.js — required, version >= 18
13
+ const nodeVersion = getNodeVersion();
14
+ if (!nodeVersion) {
15
+ log_1.log.error("Node.js is not installed. Please install Node.js 18+");
16
+ ok = false;
17
+ }
18
+ else if (nodeVersion < 18) {
19
+ log_1.log.error(`Node.js ${nodeVersion} is too old. Please upgrade to Node.js 18+`);
20
+ ok = false;
21
+ }
22
+ // Docker — only required if config uses it
23
+ if (options.needsDocker) {
24
+ if (!isCommandAvailable("docker")) {
25
+ log_1.log.error("Docker is not installed. Please install Docker to use container services");
26
+ ok = false;
27
+ }
28
+ else if (!isDockerRunning()) {
29
+ log_1.log.error("Docker daemon is not running. Please start Docker Desktop or the Docker service");
30
+ ok = false;
31
+ }
32
+ }
33
+ if (ok) {
34
+ log_1.log.success(`Prerequisites ok (Node ${nodeVersion}${options.needsDocker ? ", Docker" : ""})`);
35
+ }
36
+ return ok;
37
+ }
38
+ /**
39
+ * Get the major version of Node.js, or null if not available.
40
+ */
41
+ function getNodeVersion() {
42
+ try {
43
+ const version = (0, child_process_1.execSync)("node --version", { stdio: "pipe" })
44
+ .toString()
45
+ .trim();
46
+ // "v20.11.0" → 20
47
+ const match = version.match(/v?(\d+)/);
48
+ return match ? parseInt(match[1], 10) : null;
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * Check if a command exists.
56
+ */
57
+ function isCommandAvailable(cmd) {
58
+ try {
59
+ (0, child_process_1.execSync)(`which ${cmd}`, { stdio: "pipe" });
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
64
+ }
65
+ }
66
+ /**
67
+ * Check if the Docker daemon is running.
68
+ */
69
+ function isDockerRunning() {
70
+ try {
71
+ (0, child_process_1.execSync)("docker info", { stdio: "pipe" });
72
+ return true;
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ //# sourceMappingURL=prereqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prereqs.js","sourceRoot":"","sources":["../../src/lib/prereqs.ts"],"names":[],"mappings":";;AAOA,gDAuCC;AA9CD,iDAAyC;AACzC,+BAA4B;AAE5B;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,OAElC;IACC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,oCAAoC;IACpC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,SAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAClE,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;SAAM,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QAC5B,SAAG,CAAC,KAAK,CACP,WAAW,WAAW,4CAA4C,CACnE,CAAC;QACF,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,2CAA2C;IAC3C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,SAAG,CAAC,KAAK,CACP,0EAA0E,CAC3E,CAAC;YACF,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC9B,SAAG,CAAC,KAAK,CACP,iFAAiF,CAClF,CAAC;YACF,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,EAAE,EAAE,CAAC;QACP,SAAG,CAAC,OAAO,CACT,0BAA0B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CACjF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aAC1D,QAAQ,EAAE;aACV,IAAI,EAAE,CAAC;QACV,kBAAkB;QAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,SAAS,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { AppConfig } from "../types";
2
+ /**
3
+ * Check if a process is still running.
4
+ */
5
+ export declare function isProcessRunning(pid: number): boolean;
6
+ /**
7
+ * Get the log file path for an app.
8
+ */
9
+ export declare function logFile(appName: string): string;
10
+ /**
11
+ * Read the stored PID for an app (or null if not found / stale).
12
+ */
13
+ export declare function getAppPid(appName: string): number | null;
14
+ /**
15
+ * Get the PID actually using a given port (for mismatch detection).
16
+ */
17
+ export declare function getPortPid(port: number): number | null;
18
+ /**
19
+ * Start an app process in the background.
20
+ */
21
+ export declare function startApp(app: AppConfig, projectRoot: string): void;
22
+ /**
23
+ * Stop an app by killing its process tree, with pkill fallback.
24
+ */
25
+ export declare function stopApp(app: AppConfig | string): void;
26
+ /**
27
+ * Stop all apps. Accepts optional app configs for smarter stopping.
28
+ */
29
+ export declare function stopAllApps(apps?: AppConfig[]): void;
30
+ /**
31
+ * Get status info for an app.
32
+ */
33
+ export declare function getAppStatus(app: AppConfig): {
34
+ running: boolean;
35
+ pid: number | null;
36
+ portPid: number | null;
37
+ };
38
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD;AASD;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAcxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CA6ClE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAmFrD;AAkBD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,CAiBpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,SAAS,GACb;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAIlE"}
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isProcessRunning = isProcessRunning;
37
+ exports.logFile = logFile;
38
+ exports.getAppPid = getAppPid;
39
+ exports.getPortPid = getPortPid;
40
+ exports.startApp = startApp;
41
+ exports.stopApp = stopApp;
42
+ exports.stopAllApps = stopAllApps;
43
+ exports.getAppStatus = getAppStatus;
44
+ const child_process_1 = require("child_process");
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ const log_1 = require("./log");
48
+ const ports_1 = require("./ports");
49
+ const BOOT_DIR = ".boot";
50
+ const PIDS_DIR = path.join(BOOT_DIR, "pids");
51
+ const LOGS_DIR = path.join(BOOT_DIR, "logs");
52
+ function ensureDirs() {
53
+ fs.mkdirSync(PIDS_DIR, { recursive: true });
54
+ fs.mkdirSync(LOGS_DIR, { recursive: true });
55
+ }
56
+ /**
57
+ * Check if a process is still running.
58
+ */
59
+ function isProcessRunning(pid) {
60
+ try {
61
+ process.kill(pid, 0);
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Get the PID file path for an app.
70
+ */
71
+ function pidFile(appName) {
72
+ return path.join(PIDS_DIR, `${appName}.pid`);
73
+ }
74
+ /**
75
+ * Get the log file path for an app.
76
+ */
77
+ function logFile(appName) {
78
+ return path.join(LOGS_DIR, `${appName}.log`);
79
+ }
80
+ /**
81
+ * Read the stored PID for an app (or null if not found / stale).
82
+ */
83
+ function getAppPid(appName) {
84
+ const pf = pidFile(appName);
85
+ if (!fs.existsSync(pf))
86
+ return null;
87
+ const pid = parseInt(fs.readFileSync(pf, "utf-8").trim(), 10);
88
+ if (isNaN(pid))
89
+ return null;
90
+ if (!isProcessRunning(pid)) {
91
+ // Stale PID file
92
+ fs.unlinkSync(pf);
93
+ return null;
94
+ }
95
+ return pid;
96
+ }
97
+ /**
98
+ * Get the PID actually using a given port (for mismatch detection).
99
+ */
100
+ function getPortPid(port) {
101
+ try {
102
+ const result = (0, child_process_1.execSync)(`lsof -ti:${port}`, { stdio: "pipe" })
103
+ .toString()
104
+ .trim();
105
+ const pid = parseInt(result.split("\n")[0], 10);
106
+ return isNaN(pid) ? null : pid;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ /**
113
+ * Start an app process in the background.
114
+ */
115
+ function startApp(app, projectRoot) {
116
+ ensureDirs();
117
+ const cwd = app.path ? path.resolve(projectRoot, app.path) : projectRoot;
118
+ const pf = pidFile(app.name);
119
+ const lf = logFile(app.name);
120
+ // Already running?
121
+ const existingPid = getAppPid(app.name);
122
+ if (existingPid !== null) {
123
+ log_1.log.warn(`${app.name} is already running (PID: ${existingPid})`);
124
+ return;
125
+ }
126
+ // Free port if occupied
127
+ if (app.port && (0, ports_1.isPortInUse)(app.port)) {
128
+ log_1.log.warn(`Port ${app.port} in use, freeing...`);
129
+ (0, ports_1.killPort)(app.port);
130
+ const end = Date.now() + 1000;
131
+ while (Date.now() < end) {
132
+ /* wait */
133
+ }
134
+ }
135
+ // Open log file
136
+ const logFd = fs.openSync(lf, "a");
137
+ // Spawn detached process
138
+ const child = (0, child_process_1.spawn)(app.command, [], {
139
+ cwd,
140
+ env: { ...process.env, ...(app.env || {}) },
141
+ stdio: ["ignore", logFd, logFd],
142
+ detached: true,
143
+ shell: true,
144
+ });
145
+ child.unref();
146
+ fs.closeSync(logFd);
147
+ if (child.pid) {
148
+ fs.writeFileSync(pf, String(child.pid));
149
+ log_1.log.success(`${app.name} started (PID: ${child.pid})`);
150
+ }
151
+ else {
152
+ log_1.log.error(`Failed to start ${app.name}`);
153
+ }
154
+ }
155
+ /**
156
+ * Stop an app by killing its process tree, with pkill fallback.
157
+ */
158
+ function stopApp(app) {
159
+ const appName = typeof app === "string" ? app : app.name;
160
+ const appCommand = typeof app === "string" ? null : app.command;
161
+ const appPort = typeof app === "string" ? null : app.port;
162
+ const pf = pidFile(appName);
163
+ let stopped = false;
164
+ // 1. Try PID file
165
+ if (fs.existsSync(pf)) {
166
+ const pid = parseInt(fs.readFileSync(pf, "utf-8").trim(), 10);
167
+ if (!isNaN(pid) && isProcessRunning(pid)) {
168
+ // Kill the process group (negative PID)
169
+ try {
170
+ process.kill(-pid, "SIGTERM");
171
+ }
172
+ catch {
173
+ try {
174
+ process.kill(pid, "SIGTERM");
175
+ }
176
+ catch {
177
+ // already dead
178
+ }
179
+ }
180
+ // Wait up to 3s for graceful shutdown
181
+ const deadline = Date.now() + 3000;
182
+ while (Date.now() < deadline && isProcessRunning(pid)) {
183
+ const end = Date.now() + 200;
184
+ while (Date.now() < end) {
185
+ /* wait */
186
+ }
187
+ }
188
+ // SIGKILL if still alive
189
+ if (isProcessRunning(pid)) {
190
+ try {
191
+ process.kill(-pid, "SIGKILL");
192
+ }
193
+ catch {
194
+ try {
195
+ process.kill(pid, "SIGKILL");
196
+ }
197
+ catch {
198
+ // ignore
199
+ }
200
+ }
201
+ }
202
+ stopped = true;
203
+ }
204
+ // Clean up PID file
205
+ try {
206
+ fs.unlinkSync(pf);
207
+ }
208
+ catch {
209
+ // ignore
210
+ }
211
+ }
212
+ // 2. Fallback: pkill by command pattern (like airatelimit's pkill -f "nest start")
213
+ if (!stopped && appCommand) {
214
+ // Extract the main command for pkill (e.g. "nest start" from "npm run dev")
215
+ const patterns = extractPkillPatterns(appCommand);
216
+ for (const pattern of patterns) {
217
+ try {
218
+ (0, child_process_1.execSync)(`pkill -f "${pattern}" 2>/dev/null`, { stdio: "pipe" });
219
+ stopped = true;
220
+ }
221
+ catch {
222
+ // no matching process
223
+ }
224
+ }
225
+ }
226
+ // 3. Last resort: force kill by port
227
+ if (appPort && (0, ports_1.isPortInUse)(appPort)) {
228
+ log_1.log.step(`Force-killing process on port ${appPort}...`);
229
+ (0, ports_1.killPort)(appPort);
230
+ stopped = true;
231
+ }
232
+ if (stopped) {
233
+ log_1.log.success(`${appName} stopped`);
234
+ }
235
+ else {
236
+ log_1.log.step(`${appName} is not running`);
237
+ }
238
+ }
239
+ /**
240
+ * Extract process name patterns for pkill from a command string.
241
+ */
242
+ function extractPkillPatterns(command) {
243
+ const patterns = [];
244
+ // "npm run dev" / "pnpm dev" → look for common dev server patterns
245
+ if (command.includes("nest"))
246
+ patterns.push("nest start");
247
+ if (command.includes("nuxt"))
248
+ patterns.push("nuxt dev");
249
+ if (command.includes("next"))
250
+ patterns.push("next dev");
251
+ if (command.includes("vite"))
252
+ patterns.push("vite");
253
+ if (command.includes("tsx"))
254
+ patterns.push("tsx watch");
255
+ return patterns;
256
+ }
257
+ /**
258
+ * Stop all apps. Accepts optional app configs for smarter stopping.
259
+ */
260
+ function stopAllApps(apps) {
261
+ // If we have app configs, use them (enables pkill + port fallback)
262
+ if (apps) {
263
+ for (const app of apps) {
264
+ stopApp(app);
265
+ }
266
+ return;
267
+ }
268
+ // Fallback: just use PID files
269
+ if (!fs.existsSync(PIDS_DIR))
270
+ return;
271
+ const files = fs.readdirSync(PIDS_DIR).filter((f) => f.endsWith(".pid"));
272
+ for (const f of files) {
273
+ const name = f.replace(".pid", "");
274
+ stopApp(name);
275
+ }
276
+ }
277
+ /**
278
+ * Get status info for an app.
279
+ */
280
+ function getAppStatus(app) {
281
+ const pid = getAppPid(app.name);
282
+ const portPid = app.port ? getPortPid(app.port) : null;
283
+ return { running: pid !== null, pid, portPid };
284
+ }
285
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/lib/process.ts"],"names":[],"mappings":"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"}