@geekmidas/cli 10.0.0-alpha.49 → 10.0.0-alpha.50

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/index.mjs CHANGED
@@ -5,7 +5,7 @@ import { d as parseModuleConfig, f as appKey, l as loadWorkspaceConfig, n as Not
5
5
  import { D as assertDeployedStage, E as TEST_STAGE, O as deployedProblems, T as InvalidStages, a as getAppBuildOrder, b as getDeployTargetError, k as stageProblems, m as stripPublicPrefix, o as getAppGkmConfig, p as getPublicEnvPrefix, t as allConstructGlobs, x as isDeployTargetSupported } from "./workspace-DNzWgM1J.mjs";
6
6
  import { a as withCustomSecret, i as toEmbeddableSecrets, n as maskPassword, t as initStageSecrets } from "./storage-BzaUxmqe.mjs";
7
7
  import { a as getKeyPath, i as FileSecretsStore, n as secretsStoreFor } from "./store-DeGATCS-.mjs";
8
- import { C as loadEnvFiles, S as isPortAvailable, T as prepareEntryCredentials, _ as fakeKey, a as reconcileWorkspace, b as createEntryWrapper, c as LOCAL_CA_PATH, d as postgresDatabaseNames, f as quoteIdentifier, g as describeServices, h as rootSite, i as derivedContainers, l as forgetState, m as resourceName, n as backendsOf$1, p as pgClient, r as constructGlobs, s as COMPOSE_PATH, t as FAKE_ENV, u as applyPostgres, v as primaryPortKey, w as loadSecretsForApp, x as findAvailablePort, y as createCredentialsPreload } from "./workspace-cb6U29EL.mjs";
8
+ import { C as loadEnvFiles, S as isPortAvailable, T as prepareEntryCredentials, _ as fakeKey, a as reconcileWorkspace, b as createEntryWrapper, c as LOCAL_CA_PATH, d as postgresDatabaseNames, f as quoteIdentifier, g as describeServices, h as rootSite, i as derivedContainers, l as forgetState, m as resourceName, n as backendsOf$1, p as pgClient, r as constructGlobs, s as COMPOSE_PATH, t as FAKE_ENV, u as applyPostgres, v as primaryPortKey, w as loadSecretsForApp, x as findAvailablePort, y as createCredentialsPreload } from "./workspace-BsbxbqV-.mjs";
9
9
  import { n as EndpointGenerator, r as runtimeFor } from "./OpenApiTsGenerator-BzIGy8KE.mjs";
10
10
  import { generateOpenApi, openapiCommand, resolveOpenApiConfig } from "./openapi.mjs";
11
11
  import { a as writeTestHarness, c as driversFor, i as TEST_MANIFEST_ENV, n as TEST_READY_FILE, o as SubscriberGenerator, s as cacheBackendsIn, t as TEST_READY_ENV } from "./ready-WfT-eWlm.mjs";
@@ -19,7 +19,7 @@ import { copyFileSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFil
19
19
  import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
20
20
  import { homedir } from "node:os";
21
21
  import { basename, dirname, isAbsolute, join, parse, relative, resolve } from "node:path";
22
- import { execFile, execSync, spawn } from "node:child_process";
22
+ import { execFile, execFileSync, execSync, spawn } from "node:child_process";
23
23
  import { cacheTable, canonicalId, cloudName, cookieDomain, dependentsOf, externalApiUrl, kebabCase, migrationFolder, mobileOrigins, provideKey, provisionOrder, schemeBase, scopedName, serviceKey } from "@geekmidas/manifest";
24
24
  import fg from "fast-glob";
25
25
  import chokidar from "chokidar";
@@ -42,7 +42,7 @@ import { Queue } from "@geekmidas/constructs/queue";
42
42
  import { Topic } from "@geekmidas/constructs/topic";
43
43
  import { lookup } from "node:dns/promises";
44
44
  //#region package.json
45
- var version = "10.0.0-alpha.49";
45
+ var version = "10.0.0-alpha.50";
46
46
  //#endregion
47
47
  //#region src/auth/credentials.ts
48
48
  /**
@@ -551,6 +551,181 @@ var UnsupportedPlatform = class extends Error {
551
551
  }
552
552
  };
553
553
  //#endregion
554
+ //#region src/dev/appPorts.ts
555
+ /**
556
+ * Which local port each app answers on — and what to do when it is taken.
557
+ *
558
+ * An app's port used to be fixed: 3000, 3001, … and `gkm dev` refused to start
559
+ * if anything held one. That is right when the holder is this same app, left
560
+ * running by a previous `gkm dev` — moving would start a second copy beside it.
561
+ * It is wrong when the holder is another project's dev server, which also
562
+ * defaults to 3000: two projects could not run at once, and nothing about the
563
+ * app needs that port. A browser reaches it through the edge, whose URL carries
564
+ * no app port, and every address a phone or a route uses is derived on each
565
+ * start.
566
+ *
567
+ * So the holder is asked who it is. Every app process gkm starts is tagged with
568
+ * {@link APP_TAG_ENV} — the workspace and the app — and children inherit it, so
569
+ * whatever actually binds the port (`next-server`, a Metro worker, the tsx
570
+ * server) carries it. A held port whose holder carries this app's tag is a
571
+ * leftover, and is refused; anything else — untagged, another workspace's,
572
+ * unreadable — is not ours, and the app moves to the next free port.
573
+ *
574
+ * The choice is kept in `.gkm/app-ports.json`, not recomputed: an app that
575
+ * moved stays where it moved, so a bookmark or a phone's saved address does not
576
+ * break the next time the other project happens to be stopped. Local only —
577
+ * `gkm deploy` and `gkm docker` never read it.
578
+ */
579
+ var appPorts_exports = /* @__PURE__ */ __exportAll({
580
+ APP_TAG_ENV: () => APP_TAG_ENV,
581
+ appTag: () => appTag,
582
+ assignAppPorts: () => assignAppPorts,
583
+ describeHolder: () => describeHolder,
584
+ holderOf: () => holderOf,
585
+ savedAppPorts: () => savedAppPorts,
586
+ withAppPorts: () => withAppPorts
587
+ });
588
+ /** Carried by every app process gkm starts: `<workspace root>#<app>`. */
589
+ const APP_TAG_ENV = "GKM_DEV_APP";
590
+ const APP_PORTS_PATH = ".gkm/app-ports.json";
591
+ /** The tag an app's processes carry. The root is encoded, so it has no spaces. */
592
+ function appTag(root, app) {
593
+ return `${encodeURIComponent(resolve(root))}#${app}`;
594
+ }
595
+ /** Says, as `command (pid N)`, what holds a port. */
596
+ function describeHolder(holder) {
597
+ if (!holder) return "another process";
598
+ return `${holder.command ?? "a process"} (pid ${holder.pid})`;
599
+ }
600
+ /**
601
+ * Who is listening on a port, read the way a person would: `lsof` for the
602
+ * pid, then that process's environment for its tag — `/proc/<pid>/environ` on
603
+ * Linux, `ps eww` elsewhere. Both work for the user's own processes, which is
604
+ * every process gkm starts; one that cannot be read has no tag, so is not ours.
605
+ */
606
+ function holderOf(port) {
607
+ let out;
608
+ try {
609
+ out = execFileSync("lsof", [
610
+ "-nP",
611
+ `-iTCP:${port}`,
612
+ "-sTCP:LISTEN",
613
+ "-Fpc"
614
+ ], {
615
+ encoding: "utf8",
616
+ stdio: [
617
+ "ignore",
618
+ "pipe",
619
+ "ignore"
620
+ ]
621
+ });
622
+ } catch {
623
+ return;
624
+ }
625
+ const pid = Number(out.match(/^p(\d+)/m)?.[1]);
626
+ if (!pid) return void 0;
627
+ const command = out.match(/^c(.+)$/m)?.[1];
628
+ const tag = tagOf(pid);
629
+ return {
630
+ pid,
631
+ ...command ? { command } : {},
632
+ ...tag ? { tag } : {}
633
+ };
634
+ }
635
+ function tagOf(pid) {
636
+ const prefix = `${APP_TAG_ENV}=`;
637
+ try {
638
+ return (process.platform === "linux" ? readFileSync(`/proc/${pid}/environ`, "utf8").split("\0") : execFileSync("ps", [
639
+ "eww",
640
+ "-o",
641
+ "command=",
642
+ "-p",
643
+ String(pid)
644
+ ], {
645
+ encoding: "utf8",
646
+ stdio: [
647
+ "ignore",
648
+ "pipe",
649
+ "ignore"
650
+ ]
651
+ }).split(/\s+/)).find((entry) => entry.startsWith(prefix))?.slice(prefix.length);
652
+ } catch {
653
+ return;
654
+ }
655
+ }
656
+ /** The ports apps were given before, by app name. */
657
+ async function savedAppPorts(root) {
658
+ try {
659
+ return JSON.parse(await readFile(join(root, APP_PORTS_PATH), "utf8"));
660
+ } catch {
661
+ return {};
662
+ }
663
+ }
664
+ async function saveAppPorts(root, ports) {
665
+ await mkdir(join(root, ".gkm"), { recursive: true });
666
+ await writeFile(join(root, APP_PORTS_PATH), `${JSON.stringify(ports, null, 2)}\n`);
667
+ }
668
+ /** The workspace, with each app on the port it was given locally. */
669
+ function withAppPorts(workspace, ports) {
670
+ const apps = Object.fromEntries(Object.entries(workspace.apps).map(([name, app]) => [name, ports[name] ? {
671
+ ...app,
672
+ port: ports[name]
673
+ } : app]));
674
+ return {
675
+ ...workspace,
676
+ apps
677
+ };
678
+ }
679
+ /**
680
+ * Give each named app a local port: the one it had, or its usual one, unless
681
+ * another project holds it — then the next free one, which is kept.
682
+ *
683
+ * @returns every app's port, the apps that moved, and the apps this workspace
684
+ * already has running (the caller refuses to start those).
685
+ */
686
+ async function assignAppPorts(workspace, names, deps) {
687
+ const saved = await savedAppPorts(workspace.root);
688
+ const wanted = {};
689
+ for (const name of names) {
690
+ const port = saved[name] ?? workspace.apps[name]?.port;
691
+ if (port) wanted[name] = port;
692
+ }
693
+ const taken = /* @__PURE__ */ new Set([...Object.values(saved), ...Object.values(wanted)]);
694
+ const ports = { ...saved };
695
+ const moved = [];
696
+ const running = [];
697
+ for (const name of Object.keys(wanted).sort()) {
698
+ const want = wanted[name];
699
+ ports[name] = want;
700
+ if (await deps.free(want)) continue;
701
+ const holder = deps.holder(want);
702
+ if (holder?.tag === appTag(workspace.root, name)) {
703
+ running.push({
704
+ app: name,
705
+ port: want,
706
+ holder
707
+ });
708
+ continue;
709
+ }
710
+ let next = want + 1;
711
+ while (taken.has(next) || !await deps.free(next)) next += 1;
712
+ taken.add(next);
713
+ ports[name] = next;
714
+ moved.push({
715
+ app: name,
716
+ from: want,
717
+ to: next,
718
+ holder
719
+ });
720
+ }
721
+ await saveAppPorts(workspace.root, ports);
722
+ return {
723
+ ports,
724
+ moved,
725
+ running
726
+ };
727
+ }
728
+ //#endregion
554
729
  //#region ../../node_modules/.pnpm/@hono+node-server@1.19.5_hono@4.13.8/node_modules/@hono/node-server/dist/index.mjs
555
730
  var RequestError = class extends Error {
556
731
  constructor(message, options) {
@@ -1186,6 +1361,7 @@ async function devCommand(options) {
1186
1361
  throw error;
1187
1362
  });
1188
1363
  if (!appConfig) {
1364
+ logger$9.log("🔎 Reading gkm.config.ts and the constructs");
1189
1365
  const { workspace: everything } = await loadWorkspaceConfig();
1190
1366
  return workspaceDevCommand(everything, options);
1191
1367
  }
@@ -1193,8 +1369,15 @@ async function devCommand(options) {
1193
1369
  const appRoot = appConfig.appRoot;
1194
1370
  const secretsRoot = appConfig.workspaceRoot;
1195
1371
  const workspaceAppName = appConfig.appName;
1196
- const workspaceAppPort = appConfig.app.port;
1197
- const workspace = appConfig.workspace;
1372
+ const assigned = await assignAppPorts(appConfig.workspace, [workspaceAppName], {
1373
+ free: isPortAvailable,
1374
+ holder: holderOf
1375
+ });
1376
+ if (assigned.running.length > 0) throw new WorkspacePortsInUse(assigned.running);
1377
+ for (const { app, from, to, holder } of assigned.moved) logger$9.log(`↪️ ${app}: ${from} is held by ${describeHolder(holder)}, which is not this workspace's — using ${to}`);
1378
+ const workspace = withAppPorts(appConfig.workspace, assigned.ports);
1379
+ const workspaceAppPort = assigned.ports[workspaceAppName] ?? appConfig.app.port;
1380
+ process.env[APP_TAG_ENV] = appTag(appConfig.workspaceRoot, workspaceAppName);
1198
1381
  if (appConfig.app.entry) {
1199
1382
  logger$9.log(`📄 Using entry point: ${appConfig.app.entry}`);
1200
1383
  return entryDevCommand({
@@ -1227,6 +1410,7 @@ async function devCommand(options) {
1227
1410
  bustCache,
1228
1411
  serveEmpty: true
1229
1412
  }));
1413
+ logger$9.log(`🔨 Building ${workspaceAppName ?? "the app"}`);
1230
1414
  const initial = await build();
1231
1415
  const runtime = config.runtime ?? "node";
1232
1416
  let secretsJsonPath;
@@ -1235,7 +1419,8 @@ async function devCommand(options) {
1235
1419
  if (workspace) {
1236
1420
  const reconciled = await reconcileWorkspace(workspace, {
1237
1421
  stage: workspace.stages.local,
1238
- ...options.fake ? { fake: true } : {}
1422
+ ...options.fake ? { fake: true } : {},
1423
+ progress: (message) => logger$9.log(message)
1239
1424
  });
1240
1425
  if (reconciled.services.length > 0) {
1241
1426
  logger$9.log("🐳 Services");
@@ -1494,7 +1679,14 @@ async function loadDevSecrets(workspace) {
1494
1679
  * 3. Generate dependency URLs ({APP_NAME}_URL)
1495
1680
  * 4. Spawn turbo run dev with injected env vars
1496
1681
  */
1497
- async function workspaceDevCommand(workspace, options) {
1682
+ async function workspaceDevCommand(configured, options) {
1683
+ const assigned = await assignAppPorts(configured, options.app ? [options.app] : options.filter ? [] : Object.keys(configured.apps), {
1684
+ free: isPortAvailable,
1685
+ holder: holderOf
1686
+ });
1687
+ if (assigned.running.length > 0) throw new WorkspacePortsInUse(assigned.running);
1688
+ for (const { app, from, to, holder } of assigned.moved) logger$9.log(`↪️ ${app}: ${from} is held by ${describeHolder(holder)}, which is not this workspace's — using ${to}`);
1689
+ const workspace = withAppPorts(configured, assigned.ports);
1498
1690
  const appCount = Object.keys(workspace.apps).length;
1499
1691
  const frontendApps = Object.entries(workspace.apps).filter(([_, app]) => app.type === "web");
1500
1692
  const conflicts = checkPortConflicts(workspace);
@@ -1518,7 +1710,8 @@ async function workspaceDevCommand(workspace, options) {
1518
1710
  const rawSecrets = await loadDevSecrets(workspace);
1519
1711
  const reconciled = await reconcileWorkspace(workspace, {
1520
1712
  stage: workspace.stages.local,
1521
- ...options.fake ? { fake: true } : {}
1713
+ ...options.fake ? { fake: true } : {},
1714
+ progress: (message) => logger$9.log(message)
1522
1715
  });
1523
1716
  if (reconciled.services.length > 0) {
1524
1717
  logger$9.log("🐳 Services");
@@ -1530,10 +1723,11 @@ async function workspaceDevCommand(workspace, options) {
1530
1723
  };
1531
1724
  const fakes = options.fake ? await serveFakes(reconciled.fakes, reconciled.ports) : [];
1532
1725
  for (const { id, port } of fakes) logger$9.log(`🎭 ${id} fake: http://localhost:${port}`);
1726
+ logger$9.log(options.migrate || options.seed ? "🗄️ Migrating the databases" : "🗄️ Checking for pending migrations");
1533
1727
  if (options.migrate || options.seed) {
1534
- const { prepareDevDatabases } = await import("./migrate-DhxTIA0z.mjs");
1728
+ const { prepareDevDatabases } = await import("./migrate-B00XpVaO.mjs");
1535
1729
  await prepareDevDatabases(workspace, reconciled.env, { seed: !!options.seed });
1536
- } else await import("./migrate-DhxTIA0z.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1730
+ } else await import("./migrate-B00XpVaO.mjs").then(({ reportPendingMigrations }) => reportPendingMigrations(workspace, reconciled.env)).catch((error) => {
1537
1731
  logger$9.log(`⚠️ Could not check for pending migrations: ${error instanceof Error ? error.message : String(error)}`);
1538
1732
  });
1539
1733
  const appUrls = {};
@@ -1595,17 +1789,7 @@ async function workspaceDevCommand(workspace, options) {
1595
1789
  ...configPath ? { GKM_CONFIG_PATH: configPath } : {},
1596
1790
  ...options.fake ? { [FAKE_ENV]: "1" } : {}
1597
1791
  };
1598
- const scoped = options.app ? [options.app] : options.filter ? [] : Object.keys(workspace.apps);
1599
- const held = [];
1600
- for (const appName of scoped) {
1601
- const port = workspace.apps[appName]?.port;
1602
- if (port && !await isPortAvailable(port)) held.push({
1603
- app: appName,
1604
- port,
1605
- holder: listenerOn(port)
1606
- });
1607
- }
1608
- if (held.length > 0) throw new WorkspacePortsInUse(held);
1792
+ logger$9.log(`🚀 Starting ${appCount} app(s) — each builds before it answers, and says so when it is ready`);
1609
1793
  const turboProcess = spawn("pnpm", [
1610
1794
  "turbo",
1611
1795
  "run",
@@ -1900,10 +2084,16 @@ var DevPortInUse = class extends Error {
1900
2084
  }
1901
2085
  };
1902
2086
  /** Apps whose provisioned ports are held before the workspace starts. */
2087
+ /**
2088
+ * This workspace's own apps are already running — left by a previous start.
2089
+ *
2090
+ * Only these are refused: a port another project holds is moved off instead
2091
+ * (see `assignAppPorts`), but moving off our own would start a second copy.
2092
+ */
1903
2093
  var WorkspacePortsInUse = class extends Error {
1904
2094
  held;
1905
2095
  constructor(held) {
1906
- super(`Ports this workspace's apps are provisioned on are already in use:\n${held.map(({ app, port, holder }) => ` ${app}: ${port}${holder ? ` — held by ${holder}` : ""}`).join("\n")}\nStop what is holding them (often dev servers a previous run left behind) and start again. Nothing was started.`);
2096
+ super(`This workspace's apps are already running:\n${held.map(({ app, port, holder }) => ` ${app}: ${port} — ${describeHolder(holder)}`).join("\n")}\nA previous \`gkm dev\` left them behind. Stop them (kill the pids above) and start again. Nothing was started.`);
1907
2097
  this.held = held;
1908
2098
  this.name = "WorkspacePortsInUse";
1909
2099
  }
@@ -3999,7 +4189,7 @@ async function createDnsProvider(options) {
3999
4189
  if (isDnsProvider(config.provider)) return config.provider;
4000
4190
  const provider = config.provider;
4001
4191
  if (provider === "hostinger") {
4002
- const { HostingerProvider } = await import("./HostingerProvider-Bh6K7QYz.mjs");
4192
+ const { HostingerProvider } = await import("./HostingerProvider-GF6NAZAK.mjs");
4003
4193
  return new HostingerProvider();
4004
4194
  }
4005
4195
  if (provider === "route53") {
@@ -9126,26 +9316,26 @@ function loadPackageJson() {
9126
9316
  * Run: pnpm --filter @geekmidas/cli sync-versions
9127
9317
  */
9128
9318
  const GEEKMIDAS_VERSIONS = {
9129
- "@geekmidas/audit": "~10.0.0-alpha.49",
9130
- "@geekmidas/auth": "~10.0.0-alpha.49",
9131
- "@geekmidas/cache": "~10.0.0-alpha.49",
9132
- "@geekmidas/client": "~10.0.0-alpha.49",
9133
- "@geekmidas/cloud": "~10.0.0-alpha.49",
9134
- "@geekmidas/constructs": "~10.0.0-alpha.49",
9135
- "@geekmidas/db": "~10.0.0-alpha.49",
9136
- "@geekmidas/emailkit": "~10.0.0-alpha.49",
9137
- "@geekmidas/envkit": "~10.0.0-alpha.49",
9138
- "@geekmidas/errors": "~10.0.0-alpha.49",
9139
- "@geekmidas/events": "~10.0.0-alpha.49",
9140
- "@geekmidas/logger": "~10.0.0-alpha.49",
9141
- "@geekmidas/manifest": "~10.0.0-alpha.49",
9142
- "@geekmidas/rate-limit": "~10.0.0-alpha.49",
9143
- "@geekmidas/schema": "~10.0.0-alpha.49",
9144
- "@geekmidas/services": "~10.0.0-alpha.49",
9145
- "@geekmidas/storage": "~10.0.0-alpha.49",
9146
- "@geekmidas/studio": "~10.0.0-alpha.49",
9147
- "@geekmidas/telescope": "~10.0.0-alpha.49",
9148
- "@geekmidas/testkit": "~10.0.0-alpha.49",
9319
+ "@geekmidas/audit": "~10.0.0-alpha.50",
9320
+ "@geekmidas/auth": "~10.0.0-alpha.50",
9321
+ "@geekmidas/cache": "~10.0.0-alpha.50",
9322
+ "@geekmidas/client": "~10.0.0-alpha.50",
9323
+ "@geekmidas/cloud": "~10.0.0-alpha.50",
9324
+ "@geekmidas/constructs": "~10.0.0-alpha.50",
9325
+ "@geekmidas/db": "~10.0.0-alpha.50",
9326
+ "@geekmidas/emailkit": "~10.0.0-alpha.50",
9327
+ "@geekmidas/envkit": "~10.0.0-alpha.50",
9328
+ "@geekmidas/errors": "~10.0.0-alpha.50",
9329
+ "@geekmidas/events": "~10.0.0-alpha.50",
9330
+ "@geekmidas/logger": "~10.0.0-alpha.50",
9331
+ "@geekmidas/manifest": "~10.0.0-alpha.50",
9332
+ "@geekmidas/rate-limit": "~10.0.0-alpha.50",
9333
+ "@geekmidas/schema": "~10.0.0-alpha.50",
9334
+ "@geekmidas/services": "~10.0.0-alpha.50",
9335
+ "@geekmidas/storage": "~10.0.0-alpha.50",
9336
+ "@geekmidas/studio": "~10.0.0-alpha.50",
9337
+ "@geekmidas/telescope": "~10.0.0-alpha.50",
9338
+ "@geekmidas/testkit": "~10.0.0-alpha.50",
9149
9339
  "@geekmidas/cli": `~${loadPackageJson().version}`
9150
9340
  };
9151
9341
  //#endregion
@@ -15888,7 +16078,7 @@ function testDatabases(reconciled) {
15888
16078
  * starts without the reference data the app needs.
15889
16079
  */
15890
16080
  async function migrateTestStage(workspace, env) {
15891
- const { migrateAndSeed } = await import("./migrate-DhxTIA0z.mjs");
16081
+ const { migrateAndSeed } = await import("./migrate-B00XpVaO.mjs");
15892
16082
  const { discover } = await import("./discover-Cf2jAcgF.mjs").then((n) => n.n);
15893
16083
  const sources = {};
15894
16084
  const manifest = await discover({
@@ -16319,7 +16509,7 @@ program.command("migrate").description("Apply each database construct's migratio
16319
16509
  try {
16320
16510
  const globalOptions = program.opts();
16321
16511
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16322
- const { migrateCommand } = await import("./migrate-DhxTIA0z.mjs");
16512
+ const { migrateCommand } = await import("./migrate-B00XpVaO.mjs");
16323
16513
  await migrateCommand({
16324
16514
  ...options,
16325
16515
  ...construct ? { construct } : {}
@@ -16333,7 +16523,7 @@ program.command("seed").description("Migrate, then run each database construct's
16333
16523
  try {
16334
16524
  const globalOptions = program.opts();
16335
16525
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16336
- const { seedCommand } = await import("./migrate-DhxTIA0z.mjs");
16526
+ const { seedCommand } = await import("./migrate-B00XpVaO.mjs");
16337
16527
  await seedCommand({
16338
16528
  ...options,
16339
16529
  ...construct ? { construct } : {}
@@ -16347,7 +16537,7 @@ program.command("migration").description("Write a construct's next migration: an
16347
16537
  try {
16348
16538
  const globalOptions = program.opts();
16349
16539
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
16350
- const { migrationCommand } = await import("./migrate-DhxTIA0z.mjs");
16540
+ const { migrationCommand } = await import("./migrate-B00XpVaO.mjs");
16351
16541
  await migrationCommand({
16352
16542
  construct,
16353
16543
  ...name ? { name } : {}
@@ -16508,7 +16698,7 @@ program.command("secrets:reconcile").description("Backfill missing custom secret
16508
16698
  console.error(`No secrets found for stage "${stage}". Run "gkm secrets:init --stage ${stage}" first.`);
16509
16699
  process.exit(1);
16510
16700
  }
16511
- const { derivedContainers } = await import("./workspace-cb6U29EL.mjs").then((n) => n.o);
16701
+ const { derivedContainers } = await import("./workspace-BsbxbqV-.mjs").then((n) => n.o);
16512
16702
  const result = reconcileMissingSecrets(secrets, workspace, await derivedContainers(workspace, stage));
16513
16703
  if (!result) {
16514
16704
  console.log(`\n✓ Secrets for stage "${stage}" are up-to-date`);
@@ -16692,6 +16882,6 @@ program.command("upgrade").description("Upgrade @geekmidas/cli (with --all, ever
16692
16882
  });
16693
16883
  program.parse();
16694
16884
  //#endregion
16695
- export { getHostingerToken as a, encryption_exports as i, slug as n, stamp as r, generateFullstackCustomSecrets as t };
16885
+ export { appPorts_exports as a, encryption_exports as i, slug as n, getHostingerToken as o, stamp as r, generateFullstackCustomSecrets as t };
16696
16886
 
16697
16887
  //# sourceMappingURL=index.mjs.map