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,200 @@
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.status = status;
37
+ const fs = __importStar(require("fs"));
38
+ const child_process_1 = require("child_process");
39
+ const config_1 = require("../lib/config");
40
+ const docker_1 = require("../lib/docker");
41
+ const process_1 = require("../lib/process");
42
+ const ports_1 = require("../lib/ports");
43
+ const log_1 = require("../lib/log");
44
+ const GREEN = "\x1b[32m";
45
+ const RED = "\x1b[31m";
46
+ const YELLOW = "\x1b[33m";
47
+ const RESET = "\x1b[0m";
48
+ /**
49
+ * `boot status` — show what's running, with health checks and PID mismatch warnings.
50
+ */
51
+ async function status() {
52
+ const config = (0, config_1.loadConfig)();
53
+ log_1.log.header(`${config.name} — status`);
54
+ const rows = [];
55
+ rows.push(["SERVICE", "STATUS", "PORT", "PID", "PROCESS", "HEALTH", "LOG"]);
56
+ // Docker services / containers
57
+ if (config.docker) {
58
+ const dockerStatuses = (0, docker_1.getDockerStatus)(config);
59
+ // Collect readyCheck info for DB connection testing
60
+ const readyChecks = new Map();
61
+ if (config.docker.services) {
62
+ for (const svc of config.docker.services) {
63
+ if (svc.readyCheck) {
64
+ readyChecks.set(svc.name, `${svc.container || svc.name}|${svc.readyCheck}`);
65
+ }
66
+ }
67
+ }
68
+ if (config.docker.containers) {
69
+ for (const ct of config.docker.containers) {
70
+ if (ct.readyCheck) {
71
+ readyChecks.set(ct.name, `${ct.name}|${ct.readyCheck}`);
72
+ }
73
+ }
74
+ }
75
+ for (const svc of dockerStatuses) {
76
+ const statusColor = svc.status === "running"
77
+ ? `${GREEN}running${RESET}`
78
+ : svc.status === "not found"
79
+ ? `${RED}not found${RESET}`
80
+ : `${YELLOW}${svc.status}${RESET}`;
81
+ // DB connection test for running containers with readyCheck
82
+ let healthStr = "—";
83
+ if (svc.status === "running") {
84
+ const checkInfo = readyChecks.get(svc.name);
85
+ if (checkInfo) {
86
+ const [container, check] = checkInfo.split("|");
87
+ healthStr = testContainerHealth(container, check)
88
+ ? `${GREEN}connected${RESET}`
89
+ : `${RED}failing${RESET}`;
90
+ }
91
+ else {
92
+ healthStr = `${GREEN}ok${RESET}`;
93
+ }
94
+ }
95
+ rows.push([svc.name, statusColor, svc.ports || "—", "—", "docker", healthStr, "—"]);
96
+ }
97
+ if (dockerStatuses.length === 0 && config.docker.services) {
98
+ for (const svc of config.docker.services) {
99
+ rows.push([svc.name, `${YELLOW}unknown${RESET}`, "—", "—", "—", "—", "—"]);
100
+ }
101
+ }
102
+ }
103
+ // App processes
104
+ if (config.apps) {
105
+ for (const app of config.apps) {
106
+ const { running, pid, portPid } = (0, process_1.getAppStatus)(app);
107
+ const portStr = app.port ? String(app.port) : "—";
108
+ const lf = (0, process_1.logFile)(app.name);
109
+ const hasLog = fs.existsSync(lf);
110
+ // Status
111
+ let statusStr;
112
+ if (running) {
113
+ statusStr = `${GREEN}running${RESET}`;
114
+ }
115
+ else if (app.port && (0, ports_1.isPortInUse)(app.port)) {
116
+ statusStr = `${YELLOW}port in use${RESET}`;
117
+ }
118
+ else {
119
+ statusStr = `${RED}stopped${RESET}`;
120
+ }
121
+ // PID display + mismatch warning
122
+ let pidStr = pid ? String(pid) : "—";
123
+ if (pid && portPid && pid !== portPid) {
124
+ pidStr += ` ${YELLOW}(port PID: ${portPid})${RESET}`;
125
+ }
126
+ // Health check (curl the health URL if app is running)
127
+ let healthStr = "—";
128
+ if (running && app.health) {
129
+ healthStr = checkHealth(app.health)
130
+ ? `${GREEN}ok${RESET}`
131
+ : `${RED}failing${RESET}`;
132
+ }
133
+ else if (running && app.port) {
134
+ // No explicit health URL — just check if port responds
135
+ healthStr = checkHealth(`http://localhost:${app.port}`)
136
+ ? `${GREEN}ok${RESET}`
137
+ : `${YELLOW}no response${RESET}`;
138
+ }
139
+ // Process name (what binary is actually running)
140
+ const activePid = portPid || pid;
141
+ const processName = activePid ? getProcessName(activePid) : "—";
142
+ rows.push([
143
+ app.name,
144
+ statusStr,
145
+ portStr,
146
+ pidStr,
147
+ processName,
148
+ healthStr,
149
+ hasLog ? lf : "—",
150
+ ]);
151
+ }
152
+ }
153
+ log_1.log.table(rows);
154
+ log_1.log.blank();
155
+ }
156
+ /**
157
+ * Test if a Docker container passes its health/ready check.
158
+ */
159
+ function testContainerHealth(container, check) {
160
+ try {
161
+ (0, child_process_1.execSync)(`docker exec ${container} ${check}`, { stdio: "pipe" });
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Get the process name for a PID (e.g. "node", "nest", "nuxt").
170
+ */
171
+ function getProcessName(pid) {
172
+ try {
173
+ const name = (0, child_process_1.execSync)(`ps -p ${pid} -o comm= 2>/dev/null`, {
174
+ stdio: "pipe",
175
+ })
176
+ .toString()
177
+ .trim();
178
+ // Return just the binary name (strip path)
179
+ return name.split("/").pop() || name || "—";
180
+ }
181
+ catch {
182
+ return "—";
183
+ }
184
+ }
185
+ /**
186
+ * Quick curl-like health check — returns true if URL responds with non-5xx.
187
+ */
188
+ function checkHealth(url) {
189
+ try {
190
+ const result = (0, child_process_1.execSync)(`curl -sf -o /dev/null -w '%{http_code}' --connect-timeout 2 --max-time 3 "${url}"`, { stdio: "pipe" })
191
+ .toString()
192
+ .trim();
193
+ const code = parseInt(result, 10);
194
+ return code > 0 && code < 500;
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
200
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `boot up` — start all services.
3
+ */
4
+ export declare function up(options?: {
5
+ attach?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,wBAAsB,EAAE,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgI1E"}
@@ -0,0 +1,325 @@
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.up = up;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const config_1 = require("../lib/config");
41
+ const docker_1 = require("../lib/docker");
42
+ const process_1 = require("../lib/process");
43
+ const health_1 = require("../lib/health");
44
+ const log_1 = require("../lib/log");
45
+ const prereqs_1 = require("../lib/prereqs");
46
+ const tail_1 = require("../lib/tail");
47
+ /**
48
+ * `boot up` — start all services.
49
+ */
50
+ async function up(options = {}) {
51
+ const config = (0, config_1.loadConfig)();
52
+ const projectRoot = process.cwd();
53
+ log_1.log.header(`Starting ${config.name}`);
54
+ // Check prerequisites
55
+ const needsDocker = !!(config.docker?.composeFile ||
56
+ config.docker?.services?.length ||
57
+ config.docker?.containers?.length);
58
+ if (!(0, prereqs_1.checkPrerequisites)({ needsDocker })) {
59
+ process.exit(1);
60
+ }
61
+ // Validate .env if configured
62
+ if (config.env) {
63
+ if (!validateEnv(config)) {
64
+ process.exit(1);
65
+ }
66
+ }
67
+ const pm = (0, config_1.getPackageManager)(config);
68
+ // Ensure package manager is available (corepack auto-setup)
69
+ ensurePackageManager(pm);
70
+ // Auto-install root deps if node_modules is missing
71
+ if (!fs.existsSync("node_modules") && fs.existsSync("package.json")) {
72
+ log_1.log.info("Dependencies not installed — running install...");
73
+ try {
74
+ (0, child_process_1.execSync)(`${pm} install`, { stdio: "inherit" });
75
+ log_1.log.success("Dependencies installed");
76
+ }
77
+ catch {
78
+ log_1.log.error("Failed to install dependencies");
79
+ process.exit(1);
80
+ }
81
+ }
82
+ // Auto-install per-app deps if missing (monorepo sub-apps)
83
+ if (config.apps) {
84
+ for (const app of config.apps) {
85
+ if (app.path) {
86
+ const appDir = path.resolve(projectRoot, app.path);
87
+ const appNodeModules = path.join(appDir, "node_modules");
88
+ const appPkgJson = path.join(appDir, "package.json");
89
+ if (fs.existsSync(appPkgJson) &&
90
+ !fs.existsSync(appNodeModules)) {
91
+ log_1.log.info(`Installing dependencies for ${app.name}...`);
92
+ try {
93
+ (0, child_process_1.execSync)(`${pm} install`, { cwd: appDir, stdio: "inherit" });
94
+ log_1.log.success(`${app.name} dependencies installed`);
95
+ }
96
+ catch {
97
+ log_1.log.warn(`Failed to install deps for ${app.name} — continuing`);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ // Smart Prisma check — generate client if .prisma is missing
104
+ smartPrismaCheck(config, pm, projectRoot);
105
+ // Start Docker services
106
+ if (config.docker) {
107
+ (0, docker_1.startDocker)(config);
108
+ }
109
+ // Start app processes
110
+ if (config.apps && config.apps.length > 0) {
111
+ for (const app of config.apps) {
112
+ (0, process_1.startApp)(app, projectRoot);
113
+ // Health check
114
+ if (app.health) {
115
+ log_1.log.info(`Waiting for ${app.name} to be healthy...`);
116
+ const healthy = await (0, health_1.waitForHealth)(app.health, 45);
117
+ if (healthy) {
118
+ log_1.log.success(`${app.name} is ready`);
119
+ }
120
+ else {
121
+ log_1.log.warn(`${app.name} may not be ready (timed out)`);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ // Summary
127
+ log_1.log.blank();
128
+ log_1.log.header(`${config.name} is running`);
129
+ if (config.apps) {
130
+ for (const app of config.apps) {
131
+ if (app.port) {
132
+ log_1.log.step(`${app.name}: http://localhost:${app.port}`);
133
+ }
134
+ else {
135
+ log_1.log.step(`${app.name}: started`);
136
+ }
137
+ }
138
+ }
139
+ log_1.log.blank();
140
+ if (options.attach) {
141
+ log_1.log.step("Streaming logs... (Ctrl+C to detach, services keep running)");
142
+ }
143
+ else {
144
+ log_1.log.step("Logs: boot logs -f");
145
+ log_1.log.step("Stop: boot down");
146
+ log_1.log.step("Restart: boot reboot");
147
+ log_1.log.step("Status: boot status");
148
+ }
149
+ log_1.log.blank();
150
+ // Attach mode: stream all logs in foreground
151
+ if (options.attach) {
152
+ const handle = (0, tail_1.tailAllLogs)(config);
153
+ await new Promise((resolve) => {
154
+ process.on("SIGINT", () => {
155
+ handle.stop();
156
+ log_1.log.blank();
157
+ log_1.log.success("Detached from logs. Services are still running.");
158
+ log_1.log.step("Stop with: boot down");
159
+ log_1.log.blank();
160
+ resolve();
161
+ });
162
+ });
163
+ }
164
+ }
165
+ /**
166
+ * Validate environment variables from .env file.
167
+ * Returns true if validation passes, false if it fails.
168
+ */
169
+ function validateEnv(config) {
170
+ const envConfig = config.env;
171
+ if (!envConfig)
172
+ return true;
173
+ const envFile = envConfig.file || ".env";
174
+ const envPath = path.resolve(envFile);
175
+ // Check if .env file exists — auto-create from template if possible
176
+ if (!fs.existsSync(envPath)) {
177
+ const templates = [
178
+ "env.example",
179
+ ".env.example",
180
+ ".env.sample",
181
+ "env.template",
182
+ ];
183
+ const template = templates.find((t) => fs.existsSync(path.resolve(t)));
184
+ if (template) {
185
+ log_1.log.info(`No ${envFile} found — creating from ${template}...`);
186
+ fs.copyFileSync(path.resolve(template), envPath);
187
+ log_1.log.success(`Created ${envFile} from ${template}`);
188
+ log_1.log.warn("Review and update the values in .env before continuing");
189
+ }
190
+ else {
191
+ log_1.log.error(`Missing ${envFile} file`);
192
+ log_1.log.step(`Create ${envFile} with the required variables`);
193
+ return false;
194
+ }
195
+ }
196
+ // Source the .env file into process.env for checks
197
+ const raw = fs.readFileSync(envPath, "utf-8");
198
+ const envVars = {};
199
+ for (const line of raw.split("\n")) {
200
+ const trimmed = line.trim();
201
+ if (!trimmed || trimmed.startsWith("#"))
202
+ continue;
203
+ const eq = trimmed.indexOf("=");
204
+ if (eq === -1)
205
+ continue;
206
+ const key = trimmed.substring(0, eq).trim();
207
+ let val = trimmed.substring(eq + 1).trim();
208
+ // Strip surrounding quotes
209
+ if ((val.startsWith('"') && val.endsWith('"')) ||
210
+ (val.startsWith("'") && val.endsWith("'"))) {
211
+ val = val.slice(1, -1);
212
+ }
213
+ envVars[key] = val;
214
+ // Also set in process.env so apps inherit them
215
+ process.env[key] = val;
216
+ }
217
+ let valid = true;
218
+ // Check required vars
219
+ if (envConfig.required) {
220
+ for (const key of envConfig.required) {
221
+ if (!envVars[key] && !process.env[key]) {
222
+ log_1.log.error(`Missing required env var: ${key}`);
223
+ valid = false;
224
+ }
225
+ }
226
+ }
227
+ // Check rejected values (e.g. default secrets)
228
+ if (envConfig.reject) {
229
+ for (const [key, badValues] of Object.entries(envConfig.reject)) {
230
+ const val = envVars[key] || process.env[key] || "";
231
+ if (badValues.includes(val)) {
232
+ log_1.log.error(`${key} is set to a default/example value — please change it`);
233
+ log_1.log.step(`Generate a real one: openssl rand -hex 32`);
234
+ valid = false;
235
+ }
236
+ }
237
+ }
238
+ if (valid) {
239
+ log_1.log.success("Environment validated");
240
+ }
241
+ return valid;
242
+ }
243
+ /**
244
+ * Ensure the detected package manager is actually available.
245
+ * If pnpm is needed but not installed, try corepack or global install.
246
+ */
247
+ function ensurePackageManager(pm) {
248
+ try {
249
+ (0, child_process_1.execSync)(`${pm} --version`, { stdio: "pipe" });
250
+ return; // Already available
251
+ }
252
+ catch {
253
+ // Not found
254
+ }
255
+ if (pm === "pnpm") {
256
+ log_1.log.info("pnpm not found — enabling via corepack...");
257
+ try {
258
+ (0, child_process_1.execSync)("corepack enable pnpm", { stdio: "pipe" });
259
+ log_1.log.success("pnpm enabled via corepack");
260
+ return;
261
+ }
262
+ catch {
263
+ // corepack failed
264
+ }
265
+ log_1.log.info("Trying global install...");
266
+ try {
267
+ (0, child_process_1.execSync)("npm install -g pnpm", { stdio: "inherit" });
268
+ log_1.log.success("pnpm installed globally");
269
+ return;
270
+ }
271
+ catch {
272
+ log_1.log.error("Failed to install pnpm. Please install it manually.");
273
+ process.exit(1);
274
+ }
275
+ }
276
+ if (pm === "yarn") {
277
+ log_1.log.info("yarn not found — enabling via corepack...");
278
+ try {
279
+ (0, child_process_1.execSync)("corepack enable yarn", { stdio: "pipe" });
280
+ log_1.log.success("yarn enabled via corepack");
281
+ return;
282
+ }
283
+ catch {
284
+ log_1.log.error("Failed to enable yarn. Please install it manually.");
285
+ process.exit(1);
286
+ }
287
+ }
288
+ log_1.log.error(`${pm} is not installed. Please install it first.`);
289
+ process.exit(1);
290
+ }
291
+ /**
292
+ * Check if Prisma client needs to be generated.
293
+ * Scans known locations for prisma/ directories and checks if .prisma exists.
294
+ */
295
+ function smartPrismaCheck(config, pm, projectRoot) {
296
+ const prismaLocations = [
297
+ "prisma",
298
+ "apps/api/prisma",
299
+ "apps/server/prisma",
300
+ "apps/backend/prisma",
301
+ ];
302
+ for (const loc of prismaLocations) {
303
+ const prismaDir = path.resolve(projectRoot, loc);
304
+ if (!fs.existsSync(prismaDir))
305
+ continue;
306
+ // Determine the app directory (parent of prisma/)
307
+ const appDir = path.dirname(prismaDir);
308
+ const prismaClient = path.join(appDir, "node_modules", ".prisma");
309
+ if (!fs.existsSync(prismaClient)) {
310
+ log_1.log.info(`Generating Prisma client (${loc})...`);
311
+ const runCmd = pm === "npm" ? "npx" : pm;
312
+ try {
313
+ (0, child_process_1.execSync)(`${runCmd} prisma generate`, {
314
+ cwd: appDir,
315
+ stdio: "inherit",
316
+ });
317
+ log_1.log.success("Prisma client generated");
318
+ }
319
+ catch {
320
+ log_1.log.warn("Failed to generate Prisma client — continuing");
321
+ }
322
+ }
323
+ }
324
+ }
325
+ //# sourceMappingURL=up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.js","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BootConfig } from "../types";
2
+ /**
3
+ * Find the boot config file in a directory.
4
+ */
5
+ export declare function findConfig(dir?: string): string | null;
6
+ /**
7
+ * Load and parse the boot config.
8
+ */
9
+ export declare function loadConfig(dir?: string): BootConfig;
10
+ /**
11
+ * Detect the package manager from lockfiles.
12
+ */
13
+ export declare function detectPackageManager(dir?: string): "pnpm" | "npm" | "yarn";
14
+ /**
15
+ * Get the resolved package manager for a config (or detect from lockfiles).
16
+ */
17
+ export declare function getPackageManager(config?: BootConfig): string;
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAItC;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAMrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,UAAU,CAoBlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,MAAsB,GAC1B,MAAM,GAAG,KAAK,GAAG,MAAM,CAWzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAE7D"}