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,560 @@
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.init = init;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const yaml = __importStar(require("yaml"));
40
+ const log_1 = require("../lib/log");
41
+ const config_1 = require("../lib/config");
42
+ /**
43
+ * `boot init` — auto-detect project structure and create boot.yaml.
44
+ */
45
+ async function init() {
46
+ const cwd = process.cwd();
47
+ if ((0, config_1.findConfig)(cwd)) {
48
+ log_1.log.warn("boot.yaml already exists in this directory");
49
+ return;
50
+ }
51
+ log_1.log.header("boot init");
52
+ const projectName = path.basename(cwd);
53
+ const pm = (0, config_1.detectPackageManager)(cwd);
54
+ log_1.log.info(`Project: ${projectName}`);
55
+ log_1.log.info(`Package manager: ${pm}`);
56
+ const config = {
57
+ name: projectName,
58
+ setup: [],
59
+ apps: [],
60
+ };
61
+ // --- Detect Docker Compose ---
62
+ const composeFiles = [
63
+ "docker-compose.yml",
64
+ "docker-compose.yaml",
65
+ "compose.yml",
66
+ "compose.yaml",
67
+ ];
68
+ const composeFile = composeFiles.find((f) => fs.existsSync(path.join(cwd, f)));
69
+ if (composeFile) {
70
+ log_1.log.success(`Found ${composeFile}`);
71
+ config.docker = {
72
+ composeFile,
73
+ services: detectDockerServices(cwd, composeFile),
74
+ };
75
+ }
76
+ // --- Detect raw Docker containers (no compose file) ---
77
+ if (!composeFile) {
78
+ const containers = detectRawContainers(cwd);
79
+ if (containers.length > 0) {
80
+ if (!config.docker)
81
+ config.docker = {};
82
+ config.docker.containers = containers;
83
+ for (const ct of containers) {
84
+ log_1.log.success(`Found Docker container: ${ct.name} (${ct.image})`);
85
+ }
86
+ }
87
+ }
88
+ // --- Detect .env requirements ---
89
+ const envConfig = detectEnvRequirements(cwd);
90
+ if (envConfig) {
91
+ config.env = envConfig;
92
+ log_1.log.success(`Found ${envConfig.file || ".env"} with ${envConfig.required?.length || 0} required vars`);
93
+ }
94
+ // --- Detect setup steps ---
95
+ config.setup.push(`${pm} install`);
96
+ // Check for Prisma
97
+ const prismaLocations = [
98
+ "prisma",
99
+ "apps/api/prisma",
100
+ "apps/server/prisma",
101
+ "apps/backend/prisma",
102
+ ];
103
+ const prismaDir = prismaLocations.find((d) => fs.existsSync(path.join(cwd, d)));
104
+ if (prismaDir) {
105
+ log_1.log.success(`Found Prisma at ${prismaDir}`);
106
+ config.setup.push(`${pm} db:generate`);
107
+ config.setup.push(`${pm} db:push`);
108
+ }
109
+ // Check for TypeORM migrations
110
+ if (fs.existsSync(path.join(cwd, "migrations"))) {
111
+ log_1.log.success("Found migrations/");
112
+ }
113
+ // --- Detect apps (monorepo under apps/) ---
114
+ const appsDir = path.join(cwd, "apps");
115
+ if (fs.existsSync(appsDir) && fs.statSync(appsDir).isDirectory()) {
116
+ const dirs = fs.readdirSync(appsDir).filter((d) => {
117
+ const fullPath = path.join(appsDir, d);
118
+ return (fs.statSync(fullPath).isDirectory() &&
119
+ fs.existsSync(path.join(fullPath, "package.json")));
120
+ });
121
+ for (const dir of dirs) {
122
+ const pkgPath = path.join(appsDir, dir, "package.json");
123
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
124
+ const hasDevScript = !!pkg.scripts?.dev;
125
+ const app = {
126
+ name: dir,
127
+ path: `apps/${dir}`,
128
+ command: devCommand(pm, hasDevScript),
129
+ };
130
+ const port = guessPort(dir);
131
+ if (port)
132
+ app.port = port;
133
+ config.apps.push(app);
134
+ log_1.log.success(`Found app: ${dir}`);
135
+ }
136
+ }
137
+ // --- Detect apps in common sub-directories (dashboard/, frontend/, server/, etc.) ---
138
+ const subDirs = [
139
+ "dashboard",
140
+ "frontend",
141
+ "backend",
142
+ "server",
143
+ "client",
144
+ "admin",
145
+ "docs",
146
+ ];
147
+ for (const dir of subDirs) {
148
+ const fullPath = path.join(cwd, dir);
149
+ const pkgPath = path.join(fullPath, "package.json");
150
+ // Skip if already detected under apps/
151
+ const alreadyFound = config.apps.some((a) => a.name === dir);
152
+ if (!alreadyFound &&
153
+ fs.existsSync(pkgPath) &&
154
+ fs.statSync(fullPath).isDirectory()) {
155
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
156
+ const hasDevScript = !!pkg.scripts?.dev;
157
+ if (hasDevScript || pkg.scripts?.start) {
158
+ const app = {
159
+ name: dir,
160
+ path: dir,
161
+ command: devCommand(pm, hasDevScript),
162
+ };
163
+ const port = guessPort(dir);
164
+ if (port)
165
+ app.port = port;
166
+ config.apps.push(app);
167
+ log_1.log.success(`Found app: ${dir}`);
168
+ }
169
+ }
170
+ }
171
+ // --- Detect root app (if root package.json has dev/start and it's not a monorepo launcher) ---
172
+ if (fs.existsSync(path.join(cwd, "package.json"))) {
173
+ const pkg = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf-8"));
174
+ const hasDevScript = !!pkg.scripts?.dev;
175
+ const hasStartScript = !!pkg.scripts?.start;
176
+ // Check if this is a real app (has its own src/ or main entry) vs just a monorepo root
177
+ const isRealApp = fs.existsSync(path.join(cwd, "src")) ||
178
+ fs.existsSync(path.join(cwd, "index.ts")) ||
179
+ fs.existsSync(path.join(cwd, "index.js")) ||
180
+ pkg.main;
181
+ if ((hasDevScript || hasStartScript) && isRealApp) {
182
+ // Read PORT from .env if available — that's what the app actually uses
183
+ let rootPort = readPortFromEnv(cwd) || 3000;
184
+ // If a sub-app already claimed this port, bump the sub-app instead
185
+ const conflictApp = config.apps.find((a) => a.port === rootPort);
186
+ if (conflictApp) {
187
+ let altPort = rootPort + 1;
188
+ while (config.apps.some((a) => a.port === altPort)) {
189
+ altPort++;
190
+ }
191
+ conflictApp.port = altPort;
192
+ }
193
+ config.apps.unshift({
194
+ name: projectName,
195
+ command: devCommand(pm, hasDevScript),
196
+ port: rootPort,
197
+ });
198
+ log_1.log.success(`Found root app: ${projectName}`);
199
+ }
200
+ else if (config.apps.length === 0 && (hasDevScript || hasStartScript)) {
201
+ // Fallback: no sub-apps and no src/, but has scripts — still treat as single app
202
+ const rootPort = readPortFromEnv(cwd) || 3000;
203
+ config.apps.push({
204
+ name: projectName,
205
+ command: devCommand(pm, hasDevScript),
206
+ port: rootPort,
207
+ });
208
+ log_1.log.success("Detected single-app project");
209
+ }
210
+ }
211
+ // --- Write config ---
212
+ const yamlStr = yaml.stringify(config, {
213
+ indent: 2,
214
+ lineWidth: 0,
215
+ });
216
+ fs.writeFileSync(path.join(cwd, "boot.yaml"), yamlStr);
217
+ log_1.log.blank();
218
+ log_1.log.success("Created boot.yaml");
219
+ log_1.log.blank();
220
+ log_1.log.step("Next steps:");
221
+ log_1.log.step(" 1. Review and edit boot.yaml");
222
+ log_1.log.step(" 2. Run: boot setup");
223
+ log_1.log.step(" 3. Run: boot up");
224
+ log_1.log.blank();
225
+ }
226
+ /**
227
+ * Try to detect Docker services from a compose file.
228
+ */
229
+ function detectDockerServices(cwd, composeFile) {
230
+ const services = [];
231
+ const projectName = path.basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, "");
232
+ try {
233
+ const raw = fs.readFileSync(path.join(cwd, composeFile), "utf-8");
234
+ const compose = yaml.parse(raw);
235
+ if (compose?.services) {
236
+ for (const [name, svc] of Object.entries(compose.services)) {
237
+ const image = svc?.image || "";
238
+ // Docker Compose auto-generates container names as {project}-{service}-1
239
+ // if no container_name is set
240
+ const containerName = svc?.container_name || `${projectName}-${name}-1`;
241
+ // Extract env vars (object or array form)
242
+ const envObj = getServiceEnvObject(svc);
243
+ // Detect Postgres
244
+ if (image.includes("postgres")) {
245
+ const pgUser = envObj.POSTGRES_USER || "postgres";
246
+ services.push({
247
+ name,
248
+ container: containerName,
249
+ readyCheck: `pg_isready -U ${pgUser}`,
250
+ timeout: 30,
251
+ });
252
+ }
253
+ // Detect MySQL
254
+ if (image.includes("mysql") || image.includes("mariadb")) {
255
+ services.push({
256
+ name,
257
+ container: containerName,
258
+ readyCheck: "mysqladmin ping -h localhost",
259
+ timeout: 30,
260
+ });
261
+ }
262
+ // Detect Redis
263
+ if (image.includes("redis")) {
264
+ services.push({
265
+ name,
266
+ container: containerName,
267
+ readyCheck: "redis-cli ping",
268
+ timeout: 10,
269
+ });
270
+ }
271
+ }
272
+ }
273
+ }
274
+ catch {
275
+ // Can't parse compose file — that's fine
276
+ }
277
+ return services;
278
+ }
279
+ /**
280
+ * Extract environment variables from a compose service definition as a key-value object.
281
+ * Handles both array form ["KEY=val"] and object form { KEY: "val" }.
282
+ */
283
+ function getServiceEnvObject(svc) {
284
+ const env = {};
285
+ if (!svc?.environment)
286
+ return env;
287
+ if (Array.isArray(svc.environment)) {
288
+ for (const item of svc.environment) {
289
+ const str = String(item);
290
+ const eq = str.indexOf("=");
291
+ if (eq > 0) {
292
+ env[str.substring(0, eq)] = str.substring(eq + 1);
293
+ }
294
+ }
295
+ }
296
+ else if (typeof svc.environment === "object") {
297
+ for (const [k, v] of Object.entries(svc.environment)) {
298
+ env[k] = String(v);
299
+ }
300
+ }
301
+ return env;
302
+ }
303
+ /**
304
+ * Build the dev/start command for a given package manager.
305
+ * npm requires "run" for custom scripts (npm run dev), pnpm/yarn don't.
306
+ */
307
+ function devCommand(pm, hasDev) {
308
+ if (pm === "npm") {
309
+ return hasDev ? "npm run dev" : "npm start";
310
+ }
311
+ return hasDev ? `${pm} dev` : `${pm} start`;
312
+ }
313
+ /**
314
+ * Guess the port for common app names.
315
+ */
316
+ function guessPort(name) {
317
+ const lower = name.toLowerCase();
318
+ if (["web", "frontend", "dashboard", "client", "ui"].includes(lower))
319
+ return 3000;
320
+ if (["api", "server", "backend"].includes(lower))
321
+ return 3001;
322
+ if (["admin"].includes(lower))
323
+ return 3002;
324
+ if (["docs"].includes(lower))
325
+ return 3003;
326
+ return undefined;
327
+ }
328
+ /**
329
+ * Detect raw Docker containers from scripts/ or Dockerfile.
330
+ * Scans shell scripts for `docker start <name>` and `docker run --name <name>` patterns.
331
+ */
332
+ function detectRawContainers(cwd) {
333
+ const containers = [];
334
+ const seen = new Set();
335
+ const scriptsDir = path.join(cwd, "scripts");
336
+ if (!fs.existsSync(scriptsDir))
337
+ return containers;
338
+ // Collect all script contents
339
+ const scripts = fs.readdirSync(scriptsDir).filter((f) => f.endsWith(".sh"));
340
+ const allContent = scripts
341
+ .map((f) => fs.readFileSync(path.join(scriptsDir, f), "utf-8"))
342
+ .join("\n");
343
+ // 1. Find container names from `docker start <name>` or `docker ps | grep <name>`
344
+ const namePatterns = [
345
+ /docker\s+start\s+([\w-]+)/g,
346
+ /docker\s+ps\s*\|[^]*?grep\s+-?q?\s*([\w-]+)/g,
347
+ ];
348
+ for (const pattern of namePatterns) {
349
+ for (const m of allContent.matchAll(pattern)) {
350
+ const name = m[1];
351
+ if (seen.has(name) || name.startsWith("$") || name.startsWith("-"))
352
+ continue;
353
+ seen.add(name);
354
+ // Search all content for image, port, and env associated with this container
355
+ const ct = {
356
+ name,
357
+ image: findImageForContainer(allContent, name),
358
+ };
359
+ const port = findPortForContainer(allContent, name);
360
+ if (port)
361
+ ct.ports = [port];
362
+ const env = findEnvForContainer(allContent, name);
363
+ if (Object.keys(env).length > 0)
364
+ ct.env = env;
365
+ // Detect readyCheck and ensure required env vars based on image
366
+ if (ct.image.includes("postgres")) {
367
+ ct.readyCheck = "pg_isready -U postgres";
368
+ ct.timeout = 30;
369
+ // Postgres requires POSTGRES_PASSWORD to start
370
+ if (!ct.env)
371
+ ct.env = {};
372
+ if (!ct.env.POSTGRES_PASSWORD) {
373
+ ct.env.POSTGRES_PASSWORD = "boot_dev_password";
374
+ }
375
+ if (!ct.env.POSTGRES_DB) {
376
+ // Derive DB name from container name (e.g. "ai-proxy-db" → "ai_proxy")
377
+ ct.env.POSTGRES_DB = ct.name
378
+ .replace(/-db$/, "")
379
+ .replace(/-postgres$/, "")
380
+ .replace(/-/g, "_");
381
+ }
382
+ }
383
+ else if (ct.image.includes("mysql") || ct.image.includes("mariadb")) {
384
+ ct.readyCheck = "mysqladmin ping -h localhost";
385
+ ct.timeout = 30;
386
+ if (!ct.env)
387
+ ct.env = {};
388
+ if (!ct.env.MYSQL_ROOT_PASSWORD) {
389
+ ct.env.MYSQL_ROOT_PASSWORD = "boot_dev_password";
390
+ }
391
+ }
392
+ else if (ct.image.includes("redis")) {
393
+ ct.readyCheck = "redis-cli ping";
394
+ ct.timeout = 10;
395
+ }
396
+ containers.push(ct);
397
+ }
398
+ }
399
+ return containers;
400
+ }
401
+ /**
402
+ * Find the Docker image for a container name from script content.
403
+ */
404
+ function findImageForContainer(content, name) {
405
+ // Look for "docker run ... --name <name> ... <image>"
406
+ // Image is typically the last non-flag argument, like postgres:15
407
+ const imagePatterns = [
408
+ // "docker run ... --name ai-proxy-db ... postgres:15"
409
+ new RegExp(`docker\\s+run\\s+[^\\n]*--name\\s+${escapeRegex(name)}[^\\n]*((?:postgres|mysql|mariadb|redis|mongo|alpine|ubuntu|node|nginx)[\\w/.:-]*)`, "i"),
410
+ // Also search for the image near the container name in any context
411
+ new RegExp(`${escapeRegex(name)}[^\\n]*((?:postgres|mysql|mariadb|redis|mongo):[\\w.-]+)`, "i"),
412
+ ];
413
+ for (const pattern of imagePatterns) {
414
+ const m = content.match(pattern);
415
+ if (m && m[1])
416
+ return m[1];
417
+ }
418
+ // Fallback: if the container name hints at the DB type
419
+ if (name.includes("postgres") || name.includes("pg"))
420
+ return "postgres:15";
421
+ if (name.includes("mysql"))
422
+ return "mysql:8";
423
+ if (name.includes("redis"))
424
+ return "redis:7";
425
+ if (name.includes("mongo"))
426
+ return "mongo:7";
427
+ return "postgres:15";
428
+ }
429
+ /**
430
+ * Find port mapping for a container from script content.
431
+ */
432
+ function findPortForContainer(content, name) {
433
+ // Look for "-p <port>:<port>" near the container name
434
+ const pattern = new RegExp(`(?:${escapeRegex(name)}[^]*?|[^]*?${escapeRegex(name)}[^]*?)-p\\s+(\\d+:\\d+)`, "i");
435
+ const m = content.match(pattern);
436
+ if (m)
437
+ return m[1];
438
+ // Simpler: just find any -p near the name on nearby lines
439
+ const lines = content.split("\n");
440
+ for (let i = 0; i < lines.length; i++) {
441
+ if (lines[i].includes(name)) {
442
+ // Search nearby lines (within 5 lines)
443
+ for (let j = Math.max(0, i - 5); j < Math.min(lines.length, i + 5); j++) {
444
+ const portMatch = lines[j].match(/-p\s+(\d+:\d+)/);
445
+ if (portMatch)
446
+ return portMatch[1];
447
+ }
448
+ }
449
+ }
450
+ return null;
451
+ }
452
+ /**
453
+ * Find environment variables for a container from script content.
454
+ */
455
+ function findEnvForContainer(content, name) {
456
+ const env = {};
457
+ // Find lines near the container name with -e KEY=VALUE
458
+ const lines = content.split("\n");
459
+ for (let i = 0; i < lines.length; i++) {
460
+ if (lines[i].includes(name)) {
461
+ for (let j = Math.max(0, i - 5); j < Math.min(lines.length, i + 10); j++) {
462
+ const envMatches = lines[j].matchAll(/-e\s+(\w+)=(\S+)/g);
463
+ for (const em of envMatches) {
464
+ const val = em[2].replace(/[\\'"]/g, "");
465
+ // Skip shell variable references
466
+ if (!val.startsWith("$")) {
467
+ env[em[1]] = val;
468
+ }
469
+ }
470
+ }
471
+ }
472
+ }
473
+ return env;
474
+ }
475
+ function escapeRegex(str) {
476
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
477
+ }
478
+ /**
479
+ * Read the PORT value from the project's .env file.
480
+ */
481
+ function readPortFromEnv(cwd) {
482
+ const envPath = path.join(cwd, ".env");
483
+ if (!fs.existsSync(envPath))
484
+ return null;
485
+ const content = fs.readFileSync(envPath, "utf-8");
486
+ for (const line of content.split("\n")) {
487
+ const trimmed = line.trim();
488
+ if (trimmed.startsWith("#"))
489
+ continue;
490
+ const match = trimmed.match(/^PORT\s*=\s*(\d+)/);
491
+ if (match)
492
+ return parseInt(match[1], 10);
493
+ }
494
+ return null;
495
+ }
496
+ /**
497
+ * Detect .env requirements from env.example / .env.example files.
498
+ */
499
+ function detectEnvRequirements(cwd) {
500
+ const envExamples = ["env.example", ".env.example", ".env.sample"];
501
+ const exampleFile = envExamples.find((f) => fs.existsSync(path.join(cwd, f)));
502
+ // Also check if .env itself exists
503
+ const hasEnv = fs.existsSync(path.join(cwd, ".env"));
504
+ if (!exampleFile && !hasEnv)
505
+ return null;
506
+ const result = { file: ".env" };
507
+ // Parse example file for required vars
508
+ if (exampleFile) {
509
+ const content = fs.readFileSync(path.join(cwd, exampleFile), "utf-8");
510
+ const lines = content.split("\n");
511
+ const required = [];
512
+ const reject = {};
513
+ for (let i = 0; i < lines.length; i++) {
514
+ const trimmed = lines[i].trim();
515
+ if (!trimmed || trimmed.startsWith("#"))
516
+ continue;
517
+ const eq = trimmed.indexOf("=");
518
+ if (eq === -1)
519
+ continue;
520
+ const key = trimmed.substring(0, eq).trim();
521
+ const val = trimmed.substring(eq + 1).trim();
522
+ // Skip vars with empty values — they're optional
523
+ if (!val)
524
+ continue;
525
+ // Check the comment above this line for "optional" / "if not set" hints
526
+ const prevLine = i > 0 ? lines[i - 1].toLowerCase() : "";
527
+ const prevPrevLine = i > 1 ? lines[i - 2].toLowerCase() : "";
528
+ const contextAbove = prevLine + " " + prevPrevLine;
529
+ if (contextAbove.includes("optional") ||
530
+ contextAbove.includes("if not set") ||
531
+ contextAbove.includes("uncomment")) {
532
+ continue;
533
+ }
534
+ // Only mark truly essential vars as required:
535
+ // DATABASE_URL and JWT_SECRET are almost always needed
536
+ const essentialVars = ["DATABASE_URL", "JWT_SECRET"];
537
+ if (essentialVars.includes(key)) {
538
+ required.push(key);
539
+ // If the example value looks like a placeholder, add it to reject list
540
+ if (val.includes("change") ||
541
+ val.includes("your-") ||
542
+ val.includes("xxx") ||
543
+ val.includes("replace")) {
544
+ let cleanVal = val;
545
+ if ((cleanVal.startsWith('"') && cleanVal.endsWith('"')) ||
546
+ (cleanVal.startsWith("'") && cleanVal.endsWith("'"))) {
547
+ cleanVal = cleanVal.slice(1, -1);
548
+ }
549
+ reject[key] = [cleanVal];
550
+ }
551
+ }
552
+ }
553
+ if (required.length > 0)
554
+ result.required = required;
555
+ if (Object.keys(reject).length > 0)
556
+ result.reject = reject;
557
+ }
558
+ return result;
559
+ }
560
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `boot logs` — view logs for services.
3
+ *
4
+ * boot logs → show recent logs for all services
5
+ * boot logs api → show logs for "api" service
6
+ * boot logs api -f → follow (tail -f) logs for "api"
7
+ * boot logs api -n 50 → last 50 lines of "api" logs
8
+ * boot logs --all → show all docker + app logs
9
+ */
10
+ export declare function logs(service?: string, options?: {
11
+ follow?: boolean;
12
+ lines?: string;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAQA;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,OAAO,CAAC,IAAI,CAAC,CAgFf"}